diff --git a/.gitattributes b/.gitattributes
index 2bffe04..3ed717f 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -5,4 +5,9 @@
# Ignore binary files >:(
*.png binary
-*.jpg binary
\ No newline at end of file
+*.jpg binary
+*.ogg binary
+*.efkefc binary
+*.efkmodel binary
+*.woff binary
+*.wasm binary
\ No newline at end of file
diff --git a/audio/bgm/Battle1.ogg b/audio/bgm/Battle1.ogg
new file mode 100644
index 0000000..8adfbb5
Binary files /dev/null and b/audio/bgm/Battle1.ogg differ
diff --git a/audio/bgm/Battle2.ogg b/audio/bgm/Battle2.ogg
new file mode 100644
index 0000000..da888bf
Binary files /dev/null and b/audio/bgm/Battle2.ogg differ
diff --git a/audio/bgm/Battle3.ogg b/audio/bgm/Battle3.ogg
new file mode 100644
index 0000000..873c391
Binary files /dev/null and b/audio/bgm/Battle3.ogg differ
diff --git a/audio/bgm/Battle4.ogg b/audio/bgm/Battle4.ogg
new file mode 100644
index 0000000..b13ada0
Binary files /dev/null and b/audio/bgm/Battle4.ogg differ
diff --git a/audio/bgm/Battle5.ogg b/audio/bgm/Battle5.ogg
new file mode 100644
index 0000000..4926acf
Binary files /dev/null and b/audio/bgm/Battle5.ogg differ
diff --git a/audio/bgm/Battle6.ogg b/audio/bgm/Battle6.ogg
new file mode 100644
index 0000000..9d50c44
Binary files /dev/null and b/audio/bgm/Battle6.ogg differ
diff --git a/audio/bgm/Battle7.ogg b/audio/bgm/Battle7.ogg
new file mode 100644
index 0000000..ec40877
Binary files /dev/null and b/audio/bgm/Battle7.ogg differ
diff --git a/audio/bgm/Battle8.ogg b/audio/bgm/Battle8.ogg
new file mode 100644
index 0000000..39b81b4
Binary files /dev/null and b/audio/bgm/Battle8.ogg differ
diff --git a/audio/bgm/Castle1.ogg b/audio/bgm/Castle1.ogg
new file mode 100644
index 0000000..d62b0f2
Binary files /dev/null and b/audio/bgm/Castle1.ogg differ
diff --git a/audio/bgm/Castle2.ogg b/audio/bgm/Castle2.ogg
new file mode 100644
index 0000000..59e8eb4
Binary files /dev/null and b/audio/bgm/Castle2.ogg differ
diff --git a/audio/bgm/Castle3.ogg b/audio/bgm/Castle3.ogg
new file mode 100644
index 0000000..6c75658
Binary files /dev/null and b/audio/bgm/Castle3.ogg differ
diff --git a/audio/bgm/Dungeon1.ogg b/audio/bgm/Dungeon1.ogg
new file mode 100644
index 0000000..3f43916
Binary files /dev/null and b/audio/bgm/Dungeon1.ogg differ
diff --git a/audio/bgm/Dungeon2.ogg b/audio/bgm/Dungeon2.ogg
new file mode 100644
index 0000000..f80b09c
Binary files /dev/null and b/audio/bgm/Dungeon2.ogg differ
diff --git a/audio/bgm/Dungeon3.ogg b/audio/bgm/Dungeon3.ogg
new file mode 100644
index 0000000..fdfec7d
Binary files /dev/null and b/audio/bgm/Dungeon3.ogg differ
diff --git a/audio/bgm/Dungeon4.ogg b/audio/bgm/Dungeon4.ogg
new file mode 100644
index 0000000..9f8bc7e
Binary files /dev/null and b/audio/bgm/Dungeon4.ogg differ
diff --git a/audio/bgm/Dungeon5.ogg b/audio/bgm/Dungeon5.ogg
new file mode 100644
index 0000000..c0a42fa
Binary files /dev/null and b/audio/bgm/Dungeon5.ogg differ
diff --git a/audio/bgm/Dungeon6.ogg b/audio/bgm/Dungeon6.ogg
new file mode 100644
index 0000000..9c82c1a
Binary files /dev/null and b/audio/bgm/Dungeon6.ogg differ
diff --git a/audio/bgm/Dungeon7.ogg b/audio/bgm/Dungeon7.ogg
new file mode 100644
index 0000000..c801fc0
Binary files /dev/null and b/audio/bgm/Dungeon7.ogg differ
diff --git a/audio/bgm/Field1.ogg b/audio/bgm/Field1.ogg
new file mode 100644
index 0000000..841b192
Binary files /dev/null and b/audio/bgm/Field1.ogg differ
diff --git a/audio/bgm/Field2.ogg b/audio/bgm/Field2.ogg
new file mode 100644
index 0000000..f67b124
Binary files /dev/null and b/audio/bgm/Field2.ogg differ
diff --git a/audio/bgm/Field3.ogg b/audio/bgm/Field3.ogg
new file mode 100644
index 0000000..b0a6ec3
Binary files /dev/null and b/audio/bgm/Field3.ogg differ
diff --git a/audio/bgm/Field4.ogg b/audio/bgm/Field4.ogg
new file mode 100644
index 0000000..dd21009
Binary files /dev/null and b/audio/bgm/Field4.ogg differ
diff --git a/audio/bgm/Scene1.ogg b/audio/bgm/Scene1.ogg
new file mode 100644
index 0000000..fab61fc
Binary files /dev/null and b/audio/bgm/Scene1.ogg differ
diff --git a/audio/bgm/Scene2.ogg b/audio/bgm/Scene2.ogg
new file mode 100644
index 0000000..97f1cc7
Binary files /dev/null and b/audio/bgm/Scene2.ogg differ
diff --git a/audio/bgm/Scene3.ogg b/audio/bgm/Scene3.ogg
new file mode 100644
index 0000000..a6dc386
Binary files /dev/null and b/audio/bgm/Scene3.ogg differ
diff --git a/audio/bgm/Scene4.ogg b/audio/bgm/Scene4.ogg
new file mode 100644
index 0000000..49890aa
Binary files /dev/null and b/audio/bgm/Scene4.ogg differ
diff --git a/audio/bgm/Scene5.ogg b/audio/bgm/Scene5.ogg
new file mode 100644
index 0000000..396620f
Binary files /dev/null and b/audio/bgm/Scene5.ogg differ
diff --git a/audio/bgm/Scene6.ogg b/audio/bgm/Scene6.ogg
new file mode 100644
index 0000000..c45643e
Binary files /dev/null and b/audio/bgm/Scene6.ogg differ
diff --git a/audio/bgm/Scene7.ogg b/audio/bgm/Scene7.ogg
new file mode 100644
index 0000000..77cd4dc
Binary files /dev/null and b/audio/bgm/Scene7.ogg differ
diff --git a/audio/bgm/Scene8.ogg b/audio/bgm/Scene8.ogg
new file mode 100644
index 0000000..182c64d
Binary files /dev/null and b/audio/bgm/Scene8.ogg differ
diff --git a/audio/bgm/Scene9.ogg b/audio/bgm/Scene9.ogg
new file mode 100644
index 0000000..30ac29b
Binary files /dev/null and b/audio/bgm/Scene9.ogg differ
diff --git a/audio/bgm/Ship1.ogg b/audio/bgm/Ship1.ogg
new file mode 100644
index 0000000..a828169
Binary files /dev/null and b/audio/bgm/Ship1.ogg differ
diff --git a/audio/bgm/Ship2.ogg b/audio/bgm/Ship2.ogg
new file mode 100644
index 0000000..d36f21f
Binary files /dev/null and b/audio/bgm/Ship2.ogg differ
diff --git a/audio/bgm/Ship3.ogg b/audio/bgm/Ship3.ogg
new file mode 100644
index 0000000..a0c511b
Binary files /dev/null and b/audio/bgm/Ship3.ogg differ
diff --git a/audio/bgm/Theme1.ogg b/audio/bgm/Theme1.ogg
new file mode 100644
index 0000000..afc4a45
Binary files /dev/null and b/audio/bgm/Theme1.ogg differ
diff --git a/audio/bgm/Theme2.ogg b/audio/bgm/Theme2.ogg
new file mode 100644
index 0000000..c73de25
Binary files /dev/null and b/audio/bgm/Theme2.ogg differ
diff --git a/audio/bgm/Theme3.ogg b/audio/bgm/Theme3.ogg
new file mode 100644
index 0000000..3d68df4
Binary files /dev/null and b/audio/bgm/Theme3.ogg differ
diff --git a/audio/bgm/Theme4.ogg b/audio/bgm/Theme4.ogg
new file mode 100644
index 0000000..ce0d986
Binary files /dev/null and b/audio/bgm/Theme4.ogg differ
diff --git a/audio/bgm/Theme5.ogg b/audio/bgm/Theme5.ogg
new file mode 100644
index 0000000..740ccdf
Binary files /dev/null and b/audio/bgm/Theme5.ogg differ
diff --git a/audio/bgm/Theme6.ogg b/audio/bgm/Theme6.ogg
new file mode 100644
index 0000000..78e6303
Binary files /dev/null and b/audio/bgm/Theme6.ogg differ
diff --git a/audio/bgm/Town1.ogg b/audio/bgm/Town1.ogg
new file mode 100644
index 0000000..92993cd
Binary files /dev/null and b/audio/bgm/Town1.ogg differ
diff --git a/audio/bgm/Town2.ogg b/audio/bgm/Town2.ogg
new file mode 100644
index 0000000..1e2eddf
Binary files /dev/null and b/audio/bgm/Town2.ogg differ
diff --git a/audio/bgm/Town3.ogg b/audio/bgm/Town3.ogg
new file mode 100644
index 0000000..93afff6
Binary files /dev/null and b/audio/bgm/Town3.ogg differ
diff --git a/audio/bgm/Town4.ogg b/audio/bgm/Town4.ogg
new file mode 100644
index 0000000..f01ba4a
Binary files /dev/null and b/audio/bgm/Town4.ogg differ
diff --git a/audio/bgm/Town5.ogg b/audio/bgm/Town5.ogg
new file mode 100644
index 0000000..18a55a4
Binary files /dev/null and b/audio/bgm/Town5.ogg differ
diff --git a/audio/bgm/Town6.ogg b/audio/bgm/Town6.ogg
new file mode 100644
index 0000000..94f106b
Binary files /dev/null and b/audio/bgm/Town6.ogg differ
diff --git a/audio/bgm/Town7.ogg b/audio/bgm/Town7.ogg
new file mode 100644
index 0000000..ad6b5cb
Binary files /dev/null and b/audio/bgm/Town7.ogg differ
diff --git a/audio/bgm/Town8.ogg b/audio/bgm/Town8.ogg
new file mode 100644
index 0000000..7b99d07
Binary files /dev/null and b/audio/bgm/Town8.ogg differ
diff --git a/audio/bgs/City.ogg b/audio/bgs/City.ogg
new file mode 100644
index 0000000..2e83f03
Binary files /dev/null and b/audio/bgs/City.ogg differ
diff --git a/audio/bgs/Clock.ogg b/audio/bgs/Clock.ogg
new file mode 100644
index 0000000..ec5bf9c
Binary files /dev/null and b/audio/bgs/Clock.ogg differ
diff --git a/audio/bgs/Darkness.ogg b/audio/bgs/Darkness.ogg
new file mode 100644
index 0000000..484b578
Binary files /dev/null and b/audio/bgs/Darkness.ogg differ
diff --git a/audio/bgs/Drips.ogg b/audio/bgs/Drips.ogg
new file mode 100644
index 0000000..aeed3e6
Binary files /dev/null and b/audio/bgs/Drips.ogg differ
diff --git a/audio/bgs/Fire1.ogg b/audio/bgs/Fire1.ogg
new file mode 100644
index 0000000..5831cba
Binary files /dev/null and b/audio/bgs/Fire1.ogg differ
diff --git a/audio/bgs/Fire2.ogg b/audio/bgs/Fire2.ogg
new file mode 100644
index 0000000..cebeb6e
Binary files /dev/null and b/audio/bgs/Fire2.ogg differ
diff --git a/audio/bgs/Fire3.ogg b/audio/bgs/Fire3.ogg
new file mode 100644
index 0000000..f087047
Binary files /dev/null and b/audio/bgs/Fire3.ogg differ
diff --git a/audio/bgs/Night.ogg b/audio/bgs/Night.ogg
new file mode 100644
index 0000000..08323b8
Binary files /dev/null and b/audio/bgs/Night.ogg differ
diff --git a/audio/bgs/People1.ogg b/audio/bgs/People1.ogg
new file mode 100644
index 0000000..866d1dc
Binary files /dev/null and b/audio/bgs/People1.ogg differ
diff --git a/audio/bgs/People2.ogg b/audio/bgs/People2.ogg
new file mode 100644
index 0000000..44cfc76
Binary files /dev/null and b/audio/bgs/People2.ogg differ
diff --git a/audio/bgs/Quake1.ogg b/audio/bgs/Quake1.ogg
new file mode 100644
index 0000000..7d540ba
Binary files /dev/null and b/audio/bgs/Quake1.ogg differ
diff --git a/audio/bgs/Quake2.ogg b/audio/bgs/Quake2.ogg
new file mode 100644
index 0000000..5c4b37b
Binary files /dev/null and b/audio/bgs/Quake2.ogg differ
diff --git a/audio/bgs/Rain1.ogg b/audio/bgs/Rain1.ogg
new file mode 100644
index 0000000..e25050a
Binary files /dev/null and b/audio/bgs/Rain1.ogg differ
diff --git a/audio/bgs/Rain2.ogg b/audio/bgs/Rain2.ogg
new file mode 100644
index 0000000..93ec6c6
Binary files /dev/null and b/audio/bgs/Rain2.ogg differ
diff --git a/audio/bgs/Rain3.ogg b/audio/bgs/Rain3.ogg
new file mode 100644
index 0000000..806f3c5
Binary files /dev/null and b/audio/bgs/Rain3.ogg differ
diff --git a/audio/bgs/Rain4.ogg b/audio/bgs/Rain4.ogg
new file mode 100644
index 0000000..8a1fa24
Binary files /dev/null and b/audio/bgs/Rain4.ogg differ
diff --git a/audio/bgs/River.ogg b/audio/bgs/River.ogg
new file mode 100644
index 0000000..6933ee6
Binary files /dev/null and b/audio/bgs/River.ogg differ
diff --git a/audio/bgs/Sea.ogg b/audio/bgs/Sea.ogg
new file mode 100644
index 0000000..c22c77d
Binary files /dev/null and b/audio/bgs/Sea.ogg differ
diff --git a/audio/bgs/Storm1.ogg b/audio/bgs/Storm1.ogg
new file mode 100644
index 0000000..e170733
Binary files /dev/null and b/audio/bgs/Storm1.ogg differ
diff --git a/audio/bgs/Storm2.ogg b/audio/bgs/Storm2.ogg
new file mode 100644
index 0000000..b2ea879
Binary files /dev/null and b/audio/bgs/Storm2.ogg differ
diff --git a/audio/bgs/Waterfall1.ogg b/audio/bgs/Waterfall1.ogg
new file mode 100644
index 0000000..ad543f4
Binary files /dev/null and b/audio/bgs/Waterfall1.ogg differ
diff --git a/audio/bgs/Waterfall2.ogg b/audio/bgs/Waterfall2.ogg
new file mode 100644
index 0000000..29dafd2
Binary files /dev/null and b/audio/bgs/Waterfall2.ogg differ
diff --git a/audio/bgs/Wave1.ogg b/audio/bgs/Wave1.ogg
new file mode 100644
index 0000000..352e72b
Binary files /dev/null and b/audio/bgs/Wave1.ogg differ
diff --git a/audio/bgs/Wave2.ogg b/audio/bgs/Wave2.ogg
new file mode 100644
index 0000000..2d1a987
Binary files /dev/null and b/audio/bgs/Wave2.ogg differ
diff --git a/audio/bgs/Wind1.ogg b/audio/bgs/Wind1.ogg
new file mode 100644
index 0000000..6af2914
Binary files /dev/null and b/audio/bgs/Wind1.ogg differ
diff --git a/audio/bgs/Wind2.ogg b/audio/bgs/Wind2.ogg
new file mode 100644
index 0000000..b2e6365
Binary files /dev/null and b/audio/bgs/Wind2.ogg differ
diff --git a/audio/bgs/Wind3.ogg b/audio/bgs/Wind3.ogg
new file mode 100644
index 0000000..8b0f658
Binary files /dev/null and b/audio/bgs/Wind3.ogg differ
diff --git a/audio/bgs/Wind4.ogg b/audio/bgs/Wind4.ogg
new file mode 100644
index 0000000..5a97e67
Binary files /dev/null and b/audio/bgs/Wind4.ogg differ
diff --git a/audio/bgs/Wind5.ogg b/audio/bgs/Wind5.ogg
new file mode 100644
index 0000000..a3dba76
Binary files /dev/null and b/audio/bgs/Wind5.ogg differ
diff --git a/audio/me/Curse1.ogg b/audio/me/Curse1.ogg
new file mode 100644
index 0000000..434a9b0
Binary files /dev/null and b/audio/me/Curse1.ogg differ
diff --git a/audio/me/Curse2.ogg b/audio/me/Curse2.ogg
new file mode 100644
index 0000000..75f4abe
Binary files /dev/null and b/audio/me/Curse2.ogg differ
diff --git a/audio/me/Defeat1.ogg b/audio/me/Defeat1.ogg
new file mode 100644
index 0000000..de834c3
Binary files /dev/null and b/audio/me/Defeat1.ogg differ
diff --git a/audio/me/Defeat2.ogg b/audio/me/Defeat2.ogg
new file mode 100644
index 0000000..4ae4465
Binary files /dev/null and b/audio/me/Defeat2.ogg differ
diff --git a/audio/me/Fanfare1.ogg b/audio/me/Fanfare1.ogg
new file mode 100644
index 0000000..243b42f
Binary files /dev/null and b/audio/me/Fanfare1.ogg differ
diff --git a/audio/me/Fanfare2.ogg b/audio/me/Fanfare2.ogg
new file mode 100644
index 0000000..e364227
Binary files /dev/null and b/audio/me/Fanfare2.ogg differ
diff --git a/audio/me/Fanfare3.ogg b/audio/me/Fanfare3.ogg
new file mode 100644
index 0000000..0955f36
Binary files /dev/null and b/audio/me/Fanfare3.ogg differ
diff --git a/audio/me/Gag.ogg b/audio/me/Gag.ogg
new file mode 100644
index 0000000..554bfab
Binary files /dev/null and b/audio/me/Gag.ogg differ
diff --git a/audio/me/Gameover1.ogg b/audio/me/Gameover1.ogg
new file mode 100644
index 0000000..cac6ad8
Binary files /dev/null and b/audio/me/Gameover1.ogg differ
diff --git a/audio/me/Gameover2.ogg b/audio/me/Gameover2.ogg
new file mode 100644
index 0000000..a934bff
Binary files /dev/null and b/audio/me/Gameover2.ogg differ
diff --git a/audio/me/Horror.ogg b/audio/me/Horror.ogg
new file mode 100644
index 0000000..d898cba
Binary files /dev/null and b/audio/me/Horror.ogg differ
diff --git a/audio/me/Inn1.ogg b/audio/me/Inn1.ogg
new file mode 100644
index 0000000..ae66385
Binary files /dev/null and b/audio/me/Inn1.ogg differ
diff --git a/audio/me/Inn2.ogg b/audio/me/Inn2.ogg
new file mode 100644
index 0000000..2254497
Binary files /dev/null and b/audio/me/Inn2.ogg differ
diff --git a/audio/me/Item.ogg b/audio/me/Item.ogg
new file mode 100644
index 0000000..0e69546
Binary files /dev/null and b/audio/me/Item.ogg differ
diff --git a/audio/me/Like.ogg b/audio/me/Like.ogg
new file mode 100644
index 0000000..054dafd
Binary files /dev/null and b/audio/me/Like.ogg differ
diff --git a/audio/me/Musical1.ogg b/audio/me/Musical1.ogg
new file mode 100644
index 0000000..5b9d8a9
Binary files /dev/null and b/audio/me/Musical1.ogg differ
diff --git a/audio/me/Musical2.ogg b/audio/me/Musical2.ogg
new file mode 100644
index 0000000..c140f25
Binary files /dev/null and b/audio/me/Musical2.ogg differ
diff --git a/audio/me/Musical3.ogg b/audio/me/Musical3.ogg
new file mode 100644
index 0000000..bce13b8
Binary files /dev/null and b/audio/me/Musical3.ogg differ
diff --git a/audio/me/Mystery.ogg b/audio/me/Mystery.ogg
new file mode 100644
index 0000000..8b31f69
Binary files /dev/null and b/audio/me/Mystery.ogg differ
diff --git a/audio/me/Organ.ogg b/audio/me/Organ.ogg
new file mode 100644
index 0000000..a2018d2
Binary files /dev/null and b/audio/me/Organ.ogg differ
diff --git a/audio/me/Refresh.ogg b/audio/me/Refresh.ogg
new file mode 100644
index 0000000..84c054d
Binary files /dev/null and b/audio/me/Refresh.ogg differ
diff --git a/audio/me/Shock1.ogg b/audio/me/Shock1.ogg
new file mode 100644
index 0000000..dd0d670
Binary files /dev/null and b/audio/me/Shock1.ogg differ
diff --git a/audio/me/Shock2.ogg b/audio/me/Shock2.ogg
new file mode 100644
index 0000000..c422d0d
Binary files /dev/null and b/audio/me/Shock2.ogg differ
diff --git a/audio/me/Shock3.ogg b/audio/me/Shock3.ogg
new file mode 100644
index 0000000..2f66c22
Binary files /dev/null and b/audio/me/Shock3.ogg differ
diff --git a/audio/me/Victory1.ogg b/audio/me/Victory1.ogg
new file mode 100644
index 0000000..16a9028
Binary files /dev/null and b/audio/me/Victory1.ogg differ
diff --git a/audio/me/Victory2.ogg b/audio/me/Victory2.ogg
new file mode 100644
index 0000000..9077b32
Binary files /dev/null and b/audio/me/Victory2.ogg differ
diff --git a/audio/me/Victory3.ogg b/audio/me/Victory3.ogg
new file mode 100644
index 0000000..0d87221
Binary files /dev/null and b/audio/me/Victory3.ogg differ
diff --git a/audio/se/Absorb1.ogg b/audio/se/Absorb1.ogg
new file mode 100644
index 0000000..7ab46a1
Binary files /dev/null and b/audio/se/Absorb1.ogg differ
diff --git a/audio/se/Absorb2.ogg b/audio/se/Absorb2.ogg
new file mode 100644
index 0000000..8693424
Binary files /dev/null and b/audio/se/Absorb2.ogg differ
diff --git a/audio/se/Applause1.ogg b/audio/se/Applause1.ogg
new file mode 100644
index 0000000..9c64c63
Binary files /dev/null and b/audio/se/Applause1.ogg differ
diff --git a/audio/se/Applause2.ogg b/audio/se/Applause2.ogg
new file mode 100644
index 0000000..dcee506
Binary files /dev/null and b/audio/se/Applause2.ogg differ
diff --git a/audio/se/Attack1.ogg b/audio/se/Attack1.ogg
new file mode 100644
index 0000000..db69c32
Binary files /dev/null and b/audio/se/Attack1.ogg differ
diff --git a/audio/se/Attack2.ogg b/audio/se/Attack2.ogg
new file mode 100644
index 0000000..171c2d3
Binary files /dev/null and b/audio/se/Attack2.ogg differ
diff --git a/audio/se/Attack3.ogg b/audio/se/Attack3.ogg
new file mode 100644
index 0000000..6e73fa1
Binary files /dev/null and b/audio/se/Attack3.ogg differ
diff --git a/audio/se/Autodoor.ogg b/audio/se/Autodoor.ogg
new file mode 100644
index 0000000..7178181
Binary files /dev/null and b/audio/se/Autodoor.ogg differ
diff --git a/audio/se/Barrier.ogg b/audio/se/Barrier.ogg
new file mode 100644
index 0000000..b6be142
Binary files /dev/null and b/audio/se/Barrier.ogg differ
diff --git a/audio/se/Battle1.ogg b/audio/se/Battle1.ogg
new file mode 100644
index 0000000..0de9187
Binary files /dev/null and b/audio/se/Battle1.ogg differ
diff --git a/audio/se/Battle2.ogg b/audio/se/Battle2.ogg
new file mode 100644
index 0000000..d747f8a
Binary files /dev/null and b/audio/se/Battle2.ogg differ
diff --git a/audio/se/Battle3.ogg b/audio/se/Battle3.ogg
new file mode 100644
index 0000000..0285876
Binary files /dev/null and b/audio/se/Battle3.ogg differ
diff --git a/audio/se/Battle4.ogg b/audio/se/Battle4.ogg
new file mode 100644
index 0000000..bdd4b00
Binary files /dev/null and b/audio/se/Battle4.ogg differ
diff --git a/audio/se/Battle5.ogg b/audio/se/Battle5.ogg
new file mode 100644
index 0000000..c05b121
Binary files /dev/null and b/audio/se/Battle5.ogg differ
diff --git a/audio/se/Battle6.ogg b/audio/se/Battle6.ogg
new file mode 100644
index 0000000..283187f
Binary files /dev/null and b/audio/se/Battle6.ogg differ
diff --git a/audio/se/Bell1.ogg b/audio/se/Bell1.ogg
new file mode 100644
index 0000000..5f71690
Binary files /dev/null and b/audio/se/Bell1.ogg differ
diff --git a/audio/se/Bell2.ogg b/audio/se/Bell2.ogg
new file mode 100644
index 0000000..fbaadce
Binary files /dev/null and b/audio/se/Bell2.ogg differ
diff --git a/audio/se/Bell3.ogg b/audio/se/Bell3.ogg
new file mode 100644
index 0000000..9170b09
Binary files /dev/null and b/audio/se/Bell3.ogg differ
diff --git a/audio/se/Bite.ogg b/audio/se/Bite.ogg
new file mode 100644
index 0000000..b80dfd8
Binary files /dev/null and b/audio/se/Bite.ogg differ
diff --git a/audio/se/Blind.ogg b/audio/se/Blind.ogg
new file mode 100644
index 0000000..3da49b3
Binary files /dev/null and b/audio/se/Blind.ogg differ
diff --git a/audio/se/Blow1.ogg b/audio/se/Blow1.ogg
new file mode 100644
index 0000000..666ea86
Binary files /dev/null and b/audio/se/Blow1.ogg differ
diff --git a/audio/se/Blow10.ogg b/audio/se/Blow10.ogg
new file mode 100644
index 0000000..c26cfe3
Binary files /dev/null and b/audio/se/Blow10.ogg differ
diff --git a/audio/se/Blow2.ogg b/audio/se/Blow2.ogg
new file mode 100644
index 0000000..afa64b0
Binary files /dev/null and b/audio/se/Blow2.ogg differ
diff --git a/audio/se/Blow3.ogg b/audio/se/Blow3.ogg
new file mode 100644
index 0000000..d21a827
Binary files /dev/null and b/audio/se/Blow3.ogg differ
diff --git a/audio/se/Blow4.ogg b/audio/se/Blow4.ogg
new file mode 100644
index 0000000..c8d3fa4
Binary files /dev/null and b/audio/se/Blow4.ogg differ
diff --git a/audio/se/Blow5.ogg b/audio/se/Blow5.ogg
new file mode 100644
index 0000000..da94663
Binary files /dev/null and b/audio/se/Blow5.ogg differ
diff --git a/audio/se/Blow6.ogg b/audio/se/Blow6.ogg
new file mode 100644
index 0000000..a1db190
Binary files /dev/null and b/audio/se/Blow6.ogg differ
diff --git a/audio/se/Blow7.ogg b/audio/se/Blow7.ogg
new file mode 100644
index 0000000..c78688a
Binary files /dev/null and b/audio/se/Blow7.ogg differ
diff --git a/audio/se/Blow8.ogg b/audio/se/Blow8.ogg
new file mode 100644
index 0000000..93dd29a
Binary files /dev/null and b/audio/se/Blow8.ogg differ
diff --git a/audio/se/Blow9.ogg b/audio/se/Blow9.ogg
new file mode 100644
index 0000000..48ace89
Binary files /dev/null and b/audio/se/Blow9.ogg differ
diff --git a/audio/se/Book1.ogg b/audio/se/Book1.ogg
new file mode 100644
index 0000000..eb7f41d
Binary files /dev/null and b/audio/se/Book1.ogg differ
diff --git a/audio/se/Book2.ogg b/audio/se/Book2.ogg
new file mode 100644
index 0000000..251458f
Binary files /dev/null and b/audio/se/Book2.ogg differ
diff --git a/audio/se/Bow1.ogg b/audio/se/Bow1.ogg
new file mode 100644
index 0000000..272f47d
Binary files /dev/null and b/audio/se/Bow1.ogg differ
diff --git a/audio/se/Bow2.ogg b/audio/se/Bow2.ogg
new file mode 100644
index 0000000..a78906e
Binary files /dev/null and b/audio/se/Bow2.ogg differ
diff --git a/audio/se/Bow3.ogg b/audio/se/Bow3.ogg
new file mode 100644
index 0000000..925d480
Binary files /dev/null and b/audio/se/Bow3.ogg differ
diff --git a/audio/se/Bow4.ogg b/audio/se/Bow4.ogg
new file mode 100644
index 0000000..2054004
Binary files /dev/null and b/audio/se/Bow4.ogg differ
diff --git a/audio/se/Bow5.ogg b/audio/se/Bow5.ogg
new file mode 100644
index 0000000..99b330d
Binary files /dev/null and b/audio/se/Bow5.ogg differ
diff --git a/audio/se/Break.ogg b/audio/se/Break.ogg
new file mode 100644
index 0000000..8197c1a
Binary files /dev/null and b/audio/se/Break.ogg differ
diff --git a/audio/se/Breath.ogg b/audio/se/Breath.ogg
new file mode 100644
index 0000000..579a826
Binary files /dev/null and b/audio/se/Breath.ogg differ
diff --git a/audio/se/Buzzer1.ogg b/audio/se/Buzzer1.ogg
new file mode 100644
index 0000000..a37fa73
Binary files /dev/null and b/audio/se/Buzzer1.ogg differ
diff --git a/audio/se/Buzzer2.ogg b/audio/se/Buzzer2.ogg
new file mode 100644
index 0000000..bf72abd
Binary files /dev/null and b/audio/se/Buzzer2.ogg differ
diff --git a/audio/se/Buzzer3.ogg b/audio/se/Buzzer3.ogg
new file mode 100644
index 0000000..1ae40bd
Binary files /dev/null and b/audio/se/Buzzer3.ogg differ
diff --git a/audio/se/Cancel1.ogg b/audio/se/Cancel1.ogg
new file mode 100644
index 0000000..e901475
Binary files /dev/null and b/audio/se/Cancel1.ogg differ
diff --git a/audio/se/Cancel2.ogg b/audio/se/Cancel2.ogg
new file mode 100644
index 0000000..1b4f295
Binary files /dev/null and b/audio/se/Cancel2.ogg differ
diff --git a/audio/se/Cancel3.ogg b/audio/se/Cancel3.ogg
new file mode 100644
index 0000000..a875b44
Binary files /dev/null and b/audio/se/Cancel3.ogg differ
diff --git a/audio/se/Cat.ogg b/audio/se/Cat.ogg
new file mode 100644
index 0000000..47be13a
Binary files /dev/null and b/audio/se/Cat.ogg differ
diff --git a/audio/se/Chain.ogg b/audio/se/Chain.ogg
new file mode 100644
index 0000000..366b558
Binary files /dev/null and b/audio/se/Chain.ogg differ
diff --git a/audio/se/Chest1.ogg b/audio/se/Chest1.ogg
new file mode 100644
index 0000000..ddc95b2
Binary files /dev/null and b/audio/se/Chest1.ogg differ
diff --git a/audio/se/Chest2.ogg b/audio/se/Chest2.ogg
new file mode 100644
index 0000000..5a320f9
Binary files /dev/null and b/audio/se/Chest2.ogg differ
diff --git a/audio/se/Chicken.ogg b/audio/se/Chicken.ogg
new file mode 100644
index 0000000..55b361d
Binary files /dev/null and b/audio/se/Chicken.ogg differ
diff --git a/audio/se/Chime1.ogg b/audio/se/Chime1.ogg
new file mode 100644
index 0000000..c12b813
Binary files /dev/null and b/audio/se/Chime1.ogg differ
diff --git a/audio/se/Chime2.ogg b/audio/se/Chime2.ogg
new file mode 100644
index 0000000..3846564
Binary files /dev/null and b/audio/se/Chime2.ogg differ
diff --git a/audio/se/Close1.ogg b/audio/se/Close1.ogg
new file mode 100644
index 0000000..6534d78
Binary files /dev/null and b/audio/se/Close1.ogg differ
diff --git a/audio/se/Close2.ogg b/audio/se/Close2.ogg
new file mode 100644
index 0000000..36ae426
Binary files /dev/null and b/audio/se/Close2.ogg differ
diff --git a/audio/se/Close3.ogg b/audio/se/Close3.ogg
new file mode 100644
index 0000000..ba70d91
Binary files /dev/null and b/audio/se/Close3.ogg differ
diff --git a/audio/se/Coin.ogg b/audio/se/Coin.ogg
new file mode 100644
index 0000000..67f1add
Binary files /dev/null and b/audio/se/Coin.ogg differ
diff --git a/audio/se/Collapse1.ogg b/audio/se/Collapse1.ogg
new file mode 100644
index 0000000..e55101c
Binary files /dev/null and b/audio/se/Collapse1.ogg differ
diff --git a/audio/se/Collapse2.ogg b/audio/se/Collapse2.ogg
new file mode 100644
index 0000000..ccb1e5c
Binary files /dev/null and b/audio/se/Collapse2.ogg differ
diff --git a/audio/se/Collapse3.ogg b/audio/se/Collapse3.ogg
new file mode 100644
index 0000000..3a81c44
Binary files /dev/null and b/audio/se/Collapse3.ogg differ
diff --git a/audio/se/Collapse4.ogg b/audio/se/Collapse4.ogg
new file mode 100644
index 0000000..3330621
Binary files /dev/null and b/audio/se/Collapse4.ogg differ
diff --git a/audio/se/Computer.ogg b/audio/se/Computer.ogg
new file mode 100644
index 0000000..8ca6b7d
Binary files /dev/null and b/audio/se/Computer.ogg differ
diff --git a/audio/se/Confuse.ogg b/audio/se/Confuse.ogg
new file mode 100644
index 0000000..d45c72f
Binary files /dev/null and b/audio/se/Confuse.ogg differ
diff --git a/audio/se/Cow.ogg b/audio/se/Cow.ogg
new file mode 100644
index 0000000..a7f6d62
Binary files /dev/null and b/audio/se/Cow.ogg differ
diff --git a/audio/se/Crash.ogg b/audio/se/Crash.ogg
new file mode 100644
index 0000000..3f1b245
Binary files /dev/null and b/audio/se/Crash.ogg differ
diff --git a/audio/se/Crossbow.ogg b/audio/se/Crossbow.ogg
new file mode 100644
index 0000000..0a0946f
Binary files /dev/null and b/audio/se/Crossbow.ogg differ
diff --git a/audio/se/Crow.ogg b/audio/se/Crow.ogg
new file mode 100644
index 0000000..9f8259f
Binary files /dev/null and b/audio/se/Crow.ogg differ
diff --git a/audio/se/Cry1.ogg b/audio/se/Cry1.ogg
new file mode 100644
index 0000000..cc1b641
Binary files /dev/null and b/audio/se/Cry1.ogg differ
diff --git a/audio/se/Cry2.ogg b/audio/se/Cry2.ogg
new file mode 100644
index 0000000..c8a9fb7
Binary files /dev/null and b/audio/se/Cry2.ogg differ
diff --git a/audio/se/Cursor1.ogg b/audio/se/Cursor1.ogg
new file mode 100644
index 0000000..7e7d3e9
Binary files /dev/null and b/audio/se/Cursor1.ogg differ
diff --git a/audio/se/Cursor2.ogg b/audio/se/Cursor2.ogg
new file mode 100644
index 0000000..aab2233
Binary files /dev/null and b/audio/se/Cursor2.ogg differ
diff --git a/audio/se/Cursor3.ogg b/audio/se/Cursor3.ogg
new file mode 100644
index 0000000..22a6736
Binary files /dev/null and b/audio/se/Cursor3.ogg differ
diff --git a/audio/se/Cursor4.ogg b/audio/se/Cursor4.ogg
new file mode 100644
index 0000000..af476f0
Binary files /dev/null and b/audio/se/Cursor4.ogg differ
diff --git a/audio/se/Damage1.ogg b/audio/se/Damage1.ogg
new file mode 100644
index 0000000..7f90caf
Binary files /dev/null and b/audio/se/Damage1.ogg differ
diff --git a/audio/se/Damage2.ogg b/audio/se/Damage2.ogg
new file mode 100644
index 0000000..783a90c
Binary files /dev/null and b/audio/se/Damage2.ogg differ
diff --git a/audio/se/Damage3.ogg b/audio/se/Damage3.ogg
new file mode 100644
index 0000000..d2c91e3
Binary files /dev/null and b/audio/se/Damage3.ogg differ
diff --git a/audio/se/Damage4.ogg b/audio/se/Damage4.ogg
new file mode 100644
index 0000000..38979de
Binary files /dev/null and b/audio/se/Damage4.ogg differ
diff --git a/audio/se/Damage5.ogg b/audio/se/Damage5.ogg
new file mode 100644
index 0000000..414f376
Binary files /dev/null and b/audio/se/Damage5.ogg differ
diff --git a/audio/se/Darkness1.ogg b/audio/se/Darkness1.ogg
new file mode 100644
index 0000000..3b19fae
Binary files /dev/null and b/audio/se/Darkness1.ogg differ
diff --git a/audio/se/Darkness2.ogg b/audio/se/Darkness2.ogg
new file mode 100644
index 0000000..b70813d
Binary files /dev/null and b/audio/se/Darkness2.ogg differ
diff --git a/audio/se/Darkness3.ogg b/audio/se/Darkness3.ogg
new file mode 100644
index 0000000..0de106c
Binary files /dev/null and b/audio/se/Darkness3.ogg differ
diff --git a/audio/se/Darkness4.ogg b/audio/se/Darkness4.ogg
new file mode 100644
index 0000000..4fded2d
Binary files /dev/null and b/audio/se/Darkness4.ogg differ
diff --git a/audio/se/Darkness5.ogg b/audio/se/Darkness5.ogg
new file mode 100644
index 0000000..c48a304
Binary files /dev/null and b/audio/se/Darkness5.ogg differ
diff --git a/audio/se/Darkness6.ogg b/audio/se/Darkness6.ogg
new file mode 100644
index 0000000..c2277af
Binary files /dev/null and b/audio/se/Darkness6.ogg differ
diff --git a/audio/se/Darkness7.ogg b/audio/se/Darkness7.ogg
new file mode 100644
index 0000000..28052d2
Binary files /dev/null and b/audio/se/Darkness7.ogg differ
diff --git a/audio/se/Darkness8.ogg b/audio/se/Darkness8.ogg
new file mode 100644
index 0000000..a9ddd96
Binary files /dev/null and b/audio/se/Darkness8.ogg differ
diff --git a/audio/se/Decision1.ogg b/audio/se/Decision1.ogg
new file mode 100644
index 0000000..f7a1b6d
Binary files /dev/null and b/audio/se/Decision1.ogg differ
diff --git a/audio/se/Decision2.ogg b/audio/se/Decision2.ogg
new file mode 100644
index 0000000..5a3567a
Binary files /dev/null and b/audio/se/Decision2.ogg differ
diff --git a/audio/se/Decision3.ogg b/audio/se/Decision3.ogg
new file mode 100644
index 0000000..36b75e3
Binary files /dev/null and b/audio/se/Decision3.ogg differ
diff --git a/audio/se/Decision4.ogg b/audio/se/Decision4.ogg
new file mode 100644
index 0000000..9202910
Binary files /dev/null and b/audio/se/Decision4.ogg differ
diff --git a/audio/se/Decision5.ogg b/audio/se/Decision5.ogg
new file mode 100644
index 0000000..4711677
Binary files /dev/null and b/audio/se/Decision5.ogg differ
diff --git a/audio/se/Devil1.ogg b/audio/se/Devil1.ogg
new file mode 100644
index 0000000..9d7b29b
Binary files /dev/null and b/audio/se/Devil1.ogg differ
diff --git a/audio/se/Devil2.ogg b/audio/se/Devil2.ogg
new file mode 100644
index 0000000..504715c
Binary files /dev/null and b/audio/se/Devil2.ogg differ
diff --git a/audio/se/Devil3.ogg b/audio/se/Devil3.ogg
new file mode 100644
index 0000000..99d18c5
Binary files /dev/null and b/audio/se/Devil3.ogg differ
diff --git a/audio/se/Disappointment.ogg b/audio/se/Disappointment.ogg
new file mode 100644
index 0000000..aa16371
Binary files /dev/null and b/audio/se/Disappointment.ogg differ
diff --git a/audio/se/Dive.ogg b/audio/se/Dive.ogg
new file mode 100644
index 0000000..4c4949c
Binary files /dev/null and b/audio/se/Dive.ogg differ
diff --git a/audio/se/Dog.ogg b/audio/se/Dog.ogg
new file mode 100644
index 0000000..6567f7d
Binary files /dev/null and b/audio/se/Dog.ogg differ
diff --git a/audio/se/Door1.ogg b/audio/se/Door1.ogg
new file mode 100644
index 0000000..7d29e62
Binary files /dev/null and b/audio/se/Door1.ogg differ
diff --git a/audio/se/Door2.ogg b/audio/se/Door2.ogg
new file mode 100644
index 0000000..9818041
Binary files /dev/null and b/audio/se/Door2.ogg differ
diff --git a/audio/se/Door3.ogg b/audio/se/Door3.ogg
new file mode 100644
index 0000000..35676a6
Binary files /dev/null and b/audio/se/Door3.ogg differ
diff --git a/audio/se/Door4.ogg b/audio/se/Door4.ogg
new file mode 100644
index 0000000..62fbcff
Binary files /dev/null and b/audio/se/Door4.ogg differ
diff --git a/audio/se/Door5.ogg b/audio/se/Door5.ogg
new file mode 100644
index 0000000..b292931
Binary files /dev/null and b/audio/se/Door5.ogg differ
diff --git a/audio/se/Door6.ogg b/audio/se/Door6.ogg
new file mode 100644
index 0000000..3f0dec4
Binary files /dev/null and b/audio/se/Door6.ogg differ
diff --git a/audio/se/Door7.ogg b/audio/se/Door7.ogg
new file mode 100644
index 0000000..e64034a
Binary files /dev/null and b/audio/se/Door7.ogg differ
diff --git a/audio/se/Door8.ogg b/audio/se/Door8.ogg
new file mode 100644
index 0000000..5976bb6
Binary files /dev/null and b/audio/se/Door8.ogg differ
diff --git a/audio/se/Down1.ogg b/audio/se/Down1.ogg
new file mode 100644
index 0000000..414ebe7
Binary files /dev/null and b/audio/se/Down1.ogg differ
diff --git a/audio/se/Down2.ogg b/audio/se/Down2.ogg
new file mode 100644
index 0000000..e0839b6
Binary files /dev/null and b/audio/se/Down2.ogg differ
diff --git a/audio/se/Down3.ogg b/audio/se/Down3.ogg
new file mode 100644
index 0000000..be12cdb
Binary files /dev/null and b/audio/se/Down3.ogg differ
diff --git a/audio/se/Down4.ogg b/audio/se/Down4.ogg
new file mode 100644
index 0000000..094c018
Binary files /dev/null and b/audio/se/Down4.ogg differ
diff --git a/audio/se/Down5.ogg b/audio/se/Down5.ogg
new file mode 100644
index 0000000..61c176f
Binary files /dev/null and b/audio/se/Down5.ogg differ
diff --git a/audio/se/Down6.ogg b/audio/se/Down6.ogg
new file mode 100644
index 0000000..b8572d7
Binary files /dev/null and b/audio/se/Down6.ogg differ
diff --git a/audio/se/Down7.ogg b/audio/se/Down7.ogg
new file mode 100644
index 0000000..f52f345
Binary files /dev/null and b/audio/se/Down7.ogg differ
diff --git a/audio/se/Earth1.ogg b/audio/se/Earth1.ogg
new file mode 100644
index 0000000..1863008
Binary files /dev/null and b/audio/se/Earth1.ogg differ
diff --git a/audio/se/Earth2.ogg b/audio/se/Earth2.ogg
new file mode 100644
index 0000000..a4d6f0d
Binary files /dev/null and b/audio/se/Earth2.ogg differ
diff --git a/audio/se/Earth3.ogg b/audio/se/Earth3.ogg
new file mode 100644
index 0000000..d8bf971
Binary files /dev/null and b/audio/se/Earth3.ogg differ
diff --git a/audio/se/Earth4.ogg b/audio/se/Earth4.ogg
new file mode 100644
index 0000000..8698e9f
Binary files /dev/null and b/audio/se/Earth4.ogg differ
diff --git a/audio/se/Earth5.ogg b/audio/se/Earth5.ogg
new file mode 100644
index 0000000..c816d22
Binary files /dev/null and b/audio/se/Earth5.ogg differ
diff --git a/audio/se/Electrocardiogram.ogg b/audio/se/Electrocardiogram.ogg
new file mode 100644
index 0000000..bd2a8a7
Binary files /dev/null and b/audio/se/Electrocardiogram.ogg differ
diff --git a/audio/se/Equip1.ogg b/audio/se/Equip1.ogg
new file mode 100644
index 0000000..fd0612f
Binary files /dev/null and b/audio/se/Equip1.ogg differ
diff --git a/audio/se/Equip2.ogg b/audio/se/Equip2.ogg
new file mode 100644
index 0000000..3d39797
Binary files /dev/null and b/audio/se/Equip2.ogg differ
diff --git a/audio/se/Equip3.ogg b/audio/se/Equip3.ogg
new file mode 100644
index 0000000..c9b6fcc
Binary files /dev/null and b/audio/se/Equip3.ogg differ
diff --git a/audio/se/Evasion1.ogg b/audio/se/Evasion1.ogg
new file mode 100644
index 0000000..5a13d99
Binary files /dev/null and b/audio/se/Evasion1.ogg differ
diff --git a/audio/se/Evasion2.ogg b/audio/se/Evasion2.ogg
new file mode 100644
index 0000000..14f6e50
Binary files /dev/null and b/audio/se/Evasion2.ogg differ
diff --git a/audio/se/Explosion1.ogg b/audio/se/Explosion1.ogg
new file mode 100644
index 0000000..ffaec41
Binary files /dev/null and b/audio/se/Explosion1.ogg differ
diff --git a/audio/se/Explosion2.ogg b/audio/se/Explosion2.ogg
new file mode 100644
index 0000000..13aaae0
Binary files /dev/null and b/audio/se/Explosion2.ogg differ
diff --git a/audio/se/Explosion3.ogg b/audio/se/Explosion3.ogg
new file mode 100644
index 0000000..629539f
Binary files /dev/null and b/audio/se/Explosion3.ogg differ
diff --git a/audio/se/Explosion4.ogg b/audio/se/Explosion4.ogg
new file mode 100644
index 0000000..501acdb
Binary files /dev/null and b/audio/se/Explosion4.ogg differ
diff --git a/audio/se/Fall.ogg b/audio/se/Fall.ogg
new file mode 100644
index 0000000..46f7100
Binary files /dev/null and b/audio/se/Fall.ogg differ
diff --git a/audio/se/Fire1.ogg b/audio/se/Fire1.ogg
new file mode 100644
index 0000000..f4ada0d
Binary files /dev/null and b/audio/se/Fire1.ogg differ
diff --git a/audio/se/Fire2.ogg b/audio/se/Fire2.ogg
new file mode 100644
index 0000000..203cb57
Binary files /dev/null and b/audio/se/Fire2.ogg differ
diff --git a/audio/se/Fire3.ogg b/audio/se/Fire3.ogg
new file mode 100644
index 0000000..bc86d61
Binary files /dev/null and b/audio/se/Fire3.ogg differ
diff --git a/audio/se/Fire4.ogg b/audio/se/Fire4.ogg
new file mode 100644
index 0000000..27f1e8e
Binary files /dev/null and b/audio/se/Fire4.ogg differ
diff --git a/audio/se/Fire5.ogg b/audio/se/Fire5.ogg
new file mode 100644
index 0000000..81870bb
Binary files /dev/null and b/audio/se/Fire5.ogg differ
diff --git a/audio/se/Fire6.ogg b/audio/se/Fire6.ogg
new file mode 100644
index 0000000..43ca813
Binary files /dev/null and b/audio/se/Fire6.ogg differ
diff --git a/audio/se/Fire7.ogg b/audio/se/Fire7.ogg
new file mode 100644
index 0000000..5903670
Binary files /dev/null and b/audio/se/Fire7.ogg differ
diff --git a/audio/se/Fire8.ogg b/audio/se/Fire8.ogg
new file mode 100644
index 0000000..16d8a0f
Binary files /dev/null and b/audio/se/Fire8.ogg differ
diff --git a/audio/se/Fire9.ogg b/audio/se/Fire9.ogg
new file mode 100644
index 0000000..824e221
Binary files /dev/null and b/audio/se/Fire9.ogg differ
diff --git a/audio/se/Flash1.ogg b/audio/se/Flash1.ogg
new file mode 100644
index 0000000..8671496
Binary files /dev/null and b/audio/se/Flash1.ogg differ
diff --git a/audio/se/Flash2.ogg b/audio/se/Flash2.ogg
new file mode 100644
index 0000000..568e2a4
Binary files /dev/null and b/audio/se/Flash2.ogg differ
diff --git a/audio/se/Flash3.ogg b/audio/se/Flash3.ogg
new file mode 100644
index 0000000..4c80357
Binary files /dev/null and b/audio/se/Flash3.ogg differ
diff --git a/audio/se/Float1.ogg b/audio/se/Float1.ogg
new file mode 100644
index 0000000..cb0bcba
Binary files /dev/null and b/audio/se/Float1.ogg differ
diff --git a/audio/se/Float2.ogg b/audio/se/Float2.ogg
new file mode 100644
index 0000000..4795031
Binary files /dev/null and b/audio/se/Float2.ogg differ
diff --git a/audio/se/Fog1.ogg b/audio/se/Fog1.ogg
new file mode 100644
index 0000000..42a054b
Binary files /dev/null and b/audio/se/Fog1.ogg differ
diff --git a/audio/se/Fog2.ogg b/audio/se/Fog2.ogg
new file mode 100644
index 0000000..df19c12
Binary files /dev/null and b/audio/se/Fog2.ogg differ
diff --git a/audio/se/Frog.ogg b/audio/se/Frog.ogg
new file mode 100644
index 0000000..1ed847a
Binary files /dev/null and b/audio/se/Frog.ogg differ
diff --git a/audio/se/Gate1.ogg b/audio/se/Gate1.ogg
new file mode 100644
index 0000000..c01913d
Binary files /dev/null and b/audio/se/Gate1.ogg differ
diff --git a/audio/se/Gate2.ogg b/audio/se/Gate2.ogg
new file mode 100644
index 0000000..0b06060
Binary files /dev/null and b/audio/se/Gate2.ogg differ
diff --git a/audio/se/Growl.ogg b/audio/se/Growl.ogg
new file mode 100644
index 0000000..6ba190c
Binary files /dev/null and b/audio/se/Growl.ogg differ
diff --git a/audio/se/Gun1.ogg b/audio/se/Gun1.ogg
new file mode 100644
index 0000000..fe92091
Binary files /dev/null and b/audio/se/Gun1.ogg differ
diff --git a/audio/se/Gun2.ogg b/audio/se/Gun2.ogg
new file mode 100644
index 0000000..2685d31
Binary files /dev/null and b/audio/se/Gun2.ogg differ
diff --git a/audio/se/Gun3.ogg b/audio/se/Gun3.ogg
new file mode 100644
index 0000000..77920da
Binary files /dev/null and b/audio/se/Gun3.ogg differ
diff --git a/audio/se/Hammer.ogg b/audio/se/Hammer.ogg
new file mode 100644
index 0000000..335bc25
Binary files /dev/null and b/audio/se/Hammer.ogg differ
diff --git a/audio/se/Heal1.ogg b/audio/se/Heal1.ogg
new file mode 100644
index 0000000..a076c80
Binary files /dev/null and b/audio/se/Heal1.ogg differ
diff --git a/audio/se/Heal2.ogg b/audio/se/Heal2.ogg
new file mode 100644
index 0000000..656f451
Binary files /dev/null and b/audio/se/Heal2.ogg differ
diff --git a/audio/se/Heal3.ogg b/audio/se/Heal3.ogg
new file mode 100644
index 0000000..84a7931
Binary files /dev/null and b/audio/se/Heal3.ogg differ
diff --git a/audio/se/Heal4.ogg b/audio/se/Heal4.ogg
new file mode 100644
index 0000000..b1e2065
Binary files /dev/null and b/audio/se/Heal4.ogg differ
diff --git a/audio/se/Heal5.ogg b/audio/se/Heal5.ogg
new file mode 100644
index 0000000..233ed74
Binary files /dev/null and b/audio/se/Heal5.ogg differ
diff --git a/audio/se/Heal6.ogg b/audio/se/Heal6.ogg
new file mode 100644
index 0000000..3017d65
Binary files /dev/null and b/audio/se/Heal6.ogg differ
diff --git a/audio/se/Heal7.ogg b/audio/se/Heal7.ogg
new file mode 100644
index 0000000..de95cea
Binary files /dev/null and b/audio/se/Heal7.ogg differ
diff --git a/audio/se/Horn.ogg b/audio/se/Horn.ogg
new file mode 100644
index 0000000..36351b9
Binary files /dev/null and b/audio/se/Horn.ogg differ
diff --git a/audio/se/Horse.ogg b/audio/se/Horse.ogg
new file mode 100644
index 0000000..42a0abe
Binary files /dev/null and b/audio/se/Horse.ogg differ
diff --git a/audio/se/Ice1.ogg b/audio/se/Ice1.ogg
new file mode 100644
index 0000000..67169e1
Binary files /dev/null and b/audio/se/Ice1.ogg differ
diff --git a/audio/se/Ice10.ogg b/audio/se/Ice10.ogg
new file mode 100644
index 0000000..c8bc391
Binary files /dev/null and b/audio/se/Ice10.ogg differ
diff --git a/audio/se/Ice11.ogg b/audio/se/Ice11.ogg
new file mode 100644
index 0000000..140de2e
Binary files /dev/null and b/audio/se/Ice11.ogg differ
diff --git a/audio/se/Ice2.ogg b/audio/se/Ice2.ogg
new file mode 100644
index 0000000..c514716
Binary files /dev/null and b/audio/se/Ice2.ogg differ
diff --git a/audio/se/Ice3.ogg b/audio/se/Ice3.ogg
new file mode 100644
index 0000000..6d05994
Binary files /dev/null and b/audio/se/Ice3.ogg differ
diff --git a/audio/se/Ice4.ogg b/audio/se/Ice4.ogg
new file mode 100644
index 0000000..64fe083
Binary files /dev/null and b/audio/se/Ice4.ogg differ
diff --git a/audio/se/Ice5.ogg b/audio/se/Ice5.ogg
new file mode 100644
index 0000000..0ef1cf7
Binary files /dev/null and b/audio/se/Ice5.ogg differ
diff --git a/audio/se/Ice6.ogg b/audio/se/Ice6.ogg
new file mode 100644
index 0000000..4f6610c
Binary files /dev/null and b/audio/se/Ice6.ogg differ
diff --git a/audio/se/Ice7.ogg b/audio/se/Ice7.ogg
new file mode 100644
index 0000000..67db920
Binary files /dev/null and b/audio/se/Ice7.ogg differ
diff --git a/audio/se/Ice8.ogg b/audio/se/Ice8.ogg
new file mode 100644
index 0000000..6f8f8d2
Binary files /dev/null and b/audio/se/Ice8.ogg differ
diff --git a/audio/se/Ice9.ogg b/audio/se/Ice9.ogg
new file mode 100644
index 0000000..3c26a40
Binary files /dev/null and b/audio/se/Ice9.ogg differ
diff --git a/audio/se/Item1.ogg b/audio/se/Item1.ogg
new file mode 100644
index 0000000..a677969
Binary files /dev/null and b/audio/se/Item1.ogg differ
diff --git a/audio/se/Item2.ogg b/audio/se/Item2.ogg
new file mode 100644
index 0000000..2f6028f
Binary files /dev/null and b/audio/se/Item2.ogg differ
diff --git a/audio/se/Item3.ogg b/audio/se/Item3.ogg
new file mode 100644
index 0000000..fddd663
Binary files /dev/null and b/audio/se/Item3.ogg differ
diff --git a/audio/se/Jump1.ogg b/audio/se/Jump1.ogg
new file mode 100644
index 0000000..e629380
Binary files /dev/null and b/audio/se/Jump1.ogg differ
diff --git a/audio/se/Jump2.ogg b/audio/se/Jump2.ogg
new file mode 100644
index 0000000..1cd80f2
Binary files /dev/null and b/audio/se/Jump2.ogg differ
diff --git a/audio/se/Key.ogg b/audio/se/Key.ogg
new file mode 100644
index 0000000..54d9cef
Binary files /dev/null and b/audio/se/Key.ogg differ
diff --git a/audio/se/Knock.ogg b/audio/se/Knock.ogg
new file mode 100644
index 0000000..511c132
Binary files /dev/null and b/audio/se/Knock.ogg differ
diff --git a/audio/se/Laser1.ogg b/audio/se/Laser1.ogg
new file mode 100644
index 0000000..e68fe41
Binary files /dev/null and b/audio/se/Laser1.ogg differ
diff --git a/audio/se/Laser2.ogg b/audio/se/Laser2.ogg
new file mode 100644
index 0000000..ce3f6f2
Binary files /dev/null and b/audio/se/Laser2.ogg differ
diff --git a/audio/se/Laugh.ogg b/audio/se/Laugh.ogg
new file mode 100644
index 0000000..46b8206
Binary files /dev/null and b/audio/se/Laugh.ogg differ
diff --git a/audio/se/Launch.ogg b/audio/se/Launch.ogg
new file mode 100644
index 0000000..4527bf4
Binary files /dev/null and b/audio/se/Launch.ogg differ
diff --git a/audio/se/Leakage.ogg b/audio/se/Leakage.ogg
new file mode 100644
index 0000000..a6d1c8f
Binary files /dev/null and b/audio/se/Leakage.ogg differ
diff --git a/audio/se/Liquid.ogg b/audio/se/Liquid.ogg
new file mode 100644
index 0000000..4fb7cc6
Binary files /dev/null and b/audio/se/Liquid.ogg differ
diff --git a/audio/se/Load1.ogg b/audio/se/Load1.ogg
new file mode 100644
index 0000000..81a632f
Binary files /dev/null and b/audio/se/Load1.ogg differ
diff --git a/audio/se/Load2.ogg b/audio/se/Load2.ogg
new file mode 100644
index 0000000..61a84e6
Binary files /dev/null and b/audio/se/Load2.ogg differ
diff --git a/audio/se/Machine.ogg b/audio/se/Machine.ogg
new file mode 100644
index 0000000..e615d43
Binary files /dev/null and b/audio/se/Machine.ogg differ
diff --git a/audio/se/Magic1.ogg b/audio/se/Magic1.ogg
new file mode 100644
index 0000000..e9a5dd2
Binary files /dev/null and b/audio/se/Magic1.ogg differ
diff --git a/audio/se/Magic10.ogg b/audio/se/Magic10.ogg
new file mode 100644
index 0000000..0689420
Binary files /dev/null and b/audio/se/Magic10.ogg differ
diff --git a/audio/se/Magic11.ogg b/audio/se/Magic11.ogg
new file mode 100644
index 0000000..fac536f
Binary files /dev/null and b/audio/se/Magic11.ogg differ
diff --git a/audio/se/Magic12.ogg b/audio/se/Magic12.ogg
new file mode 100644
index 0000000..6328794
Binary files /dev/null and b/audio/se/Magic12.ogg differ
diff --git a/audio/se/Magic2.ogg b/audio/se/Magic2.ogg
new file mode 100644
index 0000000..403b186
Binary files /dev/null and b/audio/se/Magic2.ogg differ
diff --git a/audio/se/Magic3.ogg b/audio/se/Magic3.ogg
new file mode 100644
index 0000000..b650891
Binary files /dev/null and b/audio/se/Magic3.ogg differ
diff --git a/audio/se/Magic4.ogg b/audio/se/Magic4.ogg
new file mode 100644
index 0000000..ed28619
Binary files /dev/null and b/audio/se/Magic4.ogg differ
diff --git a/audio/se/Magic5.ogg b/audio/se/Magic5.ogg
new file mode 100644
index 0000000..bbaa56f
Binary files /dev/null and b/audio/se/Magic5.ogg differ
diff --git a/audio/se/Magic6.ogg b/audio/se/Magic6.ogg
new file mode 100644
index 0000000..a2f5ec7
Binary files /dev/null and b/audio/se/Magic6.ogg differ
diff --git a/audio/se/Magic7.ogg b/audio/se/Magic7.ogg
new file mode 100644
index 0000000..a6a8075
Binary files /dev/null and b/audio/se/Magic7.ogg differ
diff --git a/audio/se/Magic8.ogg b/audio/se/Magic8.ogg
new file mode 100644
index 0000000..9660f96
Binary files /dev/null and b/audio/se/Magic8.ogg differ
diff --git a/audio/se/Magic9.ogg b/audio/se/Magic9.ogg
new file mode 100644
index 0000000..32cb51b
Binary files /dev/null and b/audio/se/Magic9.ogg differ
diff --git a/audio/se/Miss.ogg b/audio/se/Miss.ogg
new file mode 100644
index 0000000..5ac784b
Binary files /dev/null and b/audio/se/Miss.ogg differ
diff --git a/audio/se/Monster1.ogg b/audio/se/Monster1.ogg
new file mode 100644
index 0000000..fe1855f
Binary files /dev/null and b/audio/se/Monster1.ogg differ
diff --git a/audio/se/Monster10.ogg b/audio/se/Monster10.ogg
new file mode 100644
index 0000000..a0d7ca7
Binary files /dev/null and b/audio/se/Monster10.ogg differ
diff --git a/audio/se/Monster2.ogg b/audio/se/Monster2.ogg
new file mode 100644
index 0000000..09add24
Binary files /dev/null and b/audio/se/Monster2.ogg differ
diff --git a/audio/se/Monster3.ogg b/audio/se/Monster3.ogg
new file mode 100644
index 0000000..06794d0
Binary files /dev/null and b/audio/se/Monster3.ogg differ
diff --git a/audio/se/Monster4.ogg b/audio/se/Monster4.ogg
new file mode 100644
index 0000000..fd3dfeb
Binary files /dev/null and b/audio/se/Monster4.ogg differ
diff --git a/audio/se/Monster5.ogg b/audio/se/Monster5.ogg
new file mode 100644
index 0000000..f844a54
Binary files /dev/null and b/audio/se/Monster5.ogg differ
diff --git a/audio/se/Monster6.ogg b/audio/se/Monster6.ogg
new file mode 100644
index 0000000..2548934
Binary files /dev/null and b/audio/se/Monster6.ogg differ
diff --git a/audio/se/Monster7.ogg b/audio/se/Monster7.ogg
new file mode 100644
index 0000000..e4f996b
Binary files /dev/null and b/audio/se/Monster7.ogg differ
diff --git a/audio/se/Monster8.ogg b/audio/se/Monster8.ogg
new file mode 100644
index 0000000..53864fa
Binary files /dev/null and b/audio/se/Monster8.ogg differ
diff --git a/audio/se/Monster9.ogg b/audio/se/Monster9.ogg
new file mode 100644
index 0000000..ebc836c
Binary files /dev/null and b/audio/se/Monster9.ogg differ
diff --git a/audio/se/Move1.ogg b/audio/se/Move1.ogg
new file mode 100644
index 0000000..210f5a3
Binary files /dev/null and b/audio/se/Move1.ogg differ
diff --git a/audio/se/Move10.ogg b/audio/se/Move10.ogg
new file mode 100644
index 0000000..c837af3
Binary files /dev/null and b/audio/se/Move10.ogg differ
diff --git a/audio/se/Move2.ogg b/audio/se/Move2.ogg
new file mode 100644
index 0000000..57854a9
Binary files /dev/null and b/audio/se/Move2.ogg differ
diff --git a/audio/se/Move3.ogg b/audio/se/Move3.ogg
new file mode 100644
index 0000000..a95ffa5
Binary files /dev/null and b/audio/se/Move3.ogg differ
diff --git a/audio/se/Move4.ogg b/audio/se/Move4.ogg
new file mode 100644
index 0000000..8536f2b
Binary files /dev/null and b/audio/se/Move4.ogg differ
diff --git a/audio/se/Move5.ogg b/audio/se/Move5.ogg
new file mode 100644
index 0000000..db4dde3
Binary files /dev/null and b/audio/se/Move5.ogg differ
diff --git a/audio/se/Move6.ogg b/audio/se/Move6.ogg
new file mode 100644
index 0000000..de597b8
Binary files /dev/null and b/audio/se/Move6.ogg differ
diff --git a/audio/se/Move7.ogg b/audio/se/Move7.ogg
new file mode 100644
index 0000000..7b78f5d
Binary files /dev/null and b/audio/se/Move7.ogg differ
diff --git a/audio/se/Move8.ogg b/audio/se/Move8.ogg
new file mode 100644
index 0000000..ffe0885
Binary files /dev/null and b/audio/se/Move8.ogg differ
diff --git a/audio/se/Move9.ogg b/audio/se/Move9.ogg
new file mode 100644
index 0000000..5aeb51d
Binary files /dev/null and b/audio/se/Move9.ogg differ
diff --git a/audio/se/Neon.ogg b/audio/se/Neon.ogg
new file mode 100644
index 0000000..f0dc969
Binary files /dev/null and b/audio/se/Neon.ogg differ
diff --git a/audio/se/Noise.ogg b/audio/se/Noise.ogg
new file mode 100644
index 0000000..74150f6
Binary files /dev/null and b/audio/se/Noise.ogg differ
diff --git a/audio/se/Open1.ogg b/audio/se/Open1.ogg
new file mode 100644
index 0000000..6abc71c
Binary files /dev/null and b/audio/se/Open1.ogg differ
diff --git a/audio/se/Open2.ogg b/audio/se/Open2.ogg
new file mode 100644
index 0000000..e7ea907
Binary files /dev/null and b/audio/se/Open2.ogg differ
diff --git a/audio/se/Open3.ogg b/audio/se/Open3.ogg
new file mode 100644
index 0000000..a815c8f
Binary files /dev/null and b/audio/se/Open3.ogg differ
diff --git a/audio/se/Open4.ogg b/audio/se/Open4.ogg
new file mode 100644
index 0000000..a544746
Binary files /dev/null and b/audio/se/Open4.ogg differ
diff --git a/audio/se/Open5.ogg b/audio/se/Open5.ogg
new file mode 100644
index 0000000..e46c4f9
Binary files /dev/null and b/audio/se/Open5.ogg differ
diff --git a/audio/se/Open6.ogg b/audio/se/Open6.ogg
new file mode 100644
index 0000000..cd5a4de
Binary files /dev/null and b/audio/se/Open6.ogg differ
diff --git a/audio/se/Open7.ogg b/audio/se/Open7.ogg
new file mode 100644
index 0000000..8f1cecb
Binary files /dev/null and b/audio/se/Open7.ogg differ
diff --git a/audio/se/Open8.ogg b/audio/se/Open8.ogg
new file mode 100644
index 0000000..314c156
Binary files /dev/null and b/audio/se/Open8.ogg differ
diff --git a/audio/se/Open9.ogg b/audio/se/Open9.ogg
new file mode 100644
index 0000000..0830955
Binary files /dev/null and b/audio/se/Open9.ogg differ
diff --git a/audio/se/Paralyze1.ogg b/audio/se/Paralyze1.ogg
new file mode 100644
index 0000000..4f86c28
Binary files /dev/null and b/audio/se/Paralyze1.ogg differ
diff --git a/audio/se/Paralyze2.ogg b/audio/se/Paralyze2.ogg
new file mode 100644
index 0000000..65b9e32
Binary files /dev/null and b/audio/se/Paralyze2.ogg differ
diff --git a/audio/se/Paralyze3.ogg b/audio/se/Paralyze3.ogg
new file mode 100644
index 0000000..9b54482
Binary files /dev/null and b/audio/se/Paralyze3.ogg differ
diff --git a/audio/se/Parry.ogg b/audio/se/Parry.ogg
new file mode 100644
index 0000000..2fa3161
Binary files /dev/null and b/audio/se/Parry.ogg differ
diff --git a/audio/se/Particles1.ogg b/audio/se/Particles1.ogg
new file mode 100644
index 0000000..33b3530
Binary files /dev/null and b/audio/se/Particles1.ogg differ
diff --git a/audio/se/Particles2.ogg b/audio/se/Particles2.ogg
new file mode 100644
index 0000000..34b763f
Binary files /dev/null and b/audio/se/Particles2.ogg differ
diff --git a/audio/se/Particles3.ogg b/audio/se/Particles3.ogg
new file mode 100644
index 0000000..78bac8c
Binary files /dev/null and b/audio/se/Particles3.ogg differ
diff --git a/audio/se/Particles4.ogg b/audio/se/Particles4.ogg
new file mode 100644
index 0000000..0dc762c
Binary files /dev/null and b/audio/se/Particles4.ogg differ
diff --git a/audio/se/Phone.ogg b/audio/se/Phone.ogg
new file mode 100644
index 0000000..358ca8e
Binary files /dev/null and b/audio/se/Phone.ogg differ
diff --git a/audio/se/Poison.ogg b/audio/se/Poison.ogg
new file mode 100644
index 0000000..01f13ec
Binary files /dev/null and b/audio/se/Poison.ogg differ
diff --git a/audio/se/Pollen.ogg b/audio/se/Pollen.ogg
new file mode 100644
index 0000000..7489760
Binary files /dev/null and b/audio/se/Pollen.ogg differ
diff --git a/audio/se/Powerup.ogg b/audio/se/Powerup.ogg
new file mode 100644
index 0000000..d998b13
Binary files /dev/null and b/audio/se/Powerup.ogg differ
diff --git a/audio/se/Push.ogg b/audio/se/Push.ogg
new file mode 100644
index 0000000..459d090
Binary files /dev/null and b/audio/se/Push.ogg differ
diff --git a/audio/se/Raise1.ogg b/audio/se/Raise1.ogg
new file mode 100644
index 0000000..b12b9fb
Binary files /dev/null and b/audio/se/Raise1.ogg differ
diff --git a/audio/se/Raise2.ogg b/audio/se/Raise2.ogg
new file mode 100644
index 0000000..946ca3e
Binary files /dev/null and b/audio/se/Raise2.ogg differ
diff --git a/audio/se/Raise3.ogg b/audio/se/Raise3.ogg
new file mode 100644
index 0000000..4b63c52
Binary files /dev/null and b/audio/se/Raise3.ogg differ
diff --git a/audio/se/Recovery.ogg b/audio/se/Recovery.ogg
new file mode 100644
index 0000000..27f1a92
Binary files /dev/null and b/audio/se/Recovery.ogg differ
diff --git a/audio/se/Reflection.ogg b/audio/se/Reflection.ogg
new file mode 100644
index 0000000..206add9
Binary files /dev/null and b/audio/se/Reflection.ogg differ
diff --git a/audio/se/Resonance.ogg b/audio/se/Resonance.ogg
new file mode 100644
index 0000000..3587fed
Binary files /dev/null and b/audio/se/Resonance.ogg differ
diff --git a/audio/se/Run.ogg b/audio/se/Run.ogg
new file mode 100644
index 0000000..f443d46
Binary files /dev/null and b/audio/se/Run.ogg differ
diff --git a/audio/se/Saint1.ogg b/audio/se/Saint1.ogg
new file mode 100644
index 0000000..213cc04
Binary files /dev/null and b/audio/se/Saint1.ogg differ
diff --git a/audio/se/Saint2.ogg b/audio/se/Saint2.ogg
new file mode 100644
index 0000000..a8b9010
Binary files /dev/null and b/audio/se/Saint2.ogg differ
diff --git a/audio/se/Saint3.ogg b/audio/se/Saint3.ogg
new file mode 100644
index 0000000..6b98be5
Binary files /dev/null and b/audio/se/Saint3.ogg differ
diff --git a/audio/se/Saint4.ogg b/audio/se/Saint4.ogg
new file mode 100644
index 0000000..a708de3
Binary files /dev/null and b/audio/se/Saint4.ogg differ
diff --git a/audio/se/Saint5.ogg b/audio/se/Saint5.ogg
new file mode 100644
index 0000000..19c2244
Binary files /dev/null and b/audio/se/Saint5.ogg differ
diff --git a/audio/se/Saint6.ogg b/audio/se/Saint6.ogg
new file mode 100644
index 0000000..9a4276a
Binary files /dev/null and b/audio/se/Saint6.ogg differ
diff --git a/audio/se/Saint7.ogg b/audio/se/Saint7.ogg
new file mode 100644
index 0000000..0ff55de
Binary files /dev/null and b/audio/se/Saint7.ogg differ
diff --git a/audio/se/Saint8.ogg b/audio/se/Saint8.ogg
new file mode 100644
index 0000000..2344e2b
Binary files /dev/null and b/audio/se/Saint8.ogg differ
diff --git a/audio/se/Saint9.ogg b/audio/se/Saint9.ogg
new file mode 100644
index 0000000..74b5703
Binary files /dev/null and b/audio/se/Saint9.ogg differ
diff --git a/audio/se/Sand.ogg b/audio/se/Sand.ogg
new file mode 100644
index 0000000..9e000dc
Binary files /dev/null and b/audio/se/Sand.ogg differ
diff --git a/audio/se/Save1.ogg b/audio/se/Save1.ogg
new file mode 100644
index 0000000..1a396c5
Binary files /dev/null and b/audio/se/Save1.ogg differ
diff --git a/audio/se/Save2.ogg b/audio/se/Save2.ogg
new file mode 100644
index 0000000..ec5e121
Binary files /dev/null and b/audio/se/Save2.ogg differ
diff --git a/audio/se/Scream.ogg b/audio/se/Scream.ogg
new file mode 100644
index 0000000..2d7f6e3
Binary files /dev/null and b/audio/se/Scream.ogg differ
diff --git a/audio/se/Sheep.ogg b/audio/se/Sheep.ogg
new file mode 100644
index 0000000..2f4482e
Binary files /dev/null and b/audio/se/Sheep.ogg differ
diff --git a/audio/se/Shop1.ogg b/audio/se/Shop1.ogg
new file mode 100644
index 0000000..3237dd4
Binary files /dev/null and b/audio/se/Shop1.ogg differ
diff --git a/audio/se/Shop2.ogg b/audio/se/Shop2.ogg
new file mode 100644
index 0000000..f28285d
Binary files /dev/null and b/audio/se/Shop2.ogg differ
diff --git a/audio/se/Shot1.ogg b/audio/se/Shot1.ogg
new file mode 100644
index 0000000..2f00387
Binary files /dev/null and b/audio/se/Shot1.ogg differ
diff --git a/audio/se/Shot2.ogg b/audio/se/Shot2.ogg
new file mode 100644
index 0000000..87b9ffa
Binary files /dev/null and b/audio/se/Shot2.ogg differ
diff --git a/audio/se/Shot3.ogg b/audio/se/Shot3.ogg
new file mode 100644
index 0000000..adbcad4
Binary files /dev/null and b/audio/se/Shot3.ogg differ
diff --git a/audio/se/Silence.ogg b/audio/se/Silence.ogg
new file mode 100644
index 0000000..ee9595b
Binary files /dev/null and b/audio/se/Silence.ogg differ
diff --git a/audio/se/Siren.ogg b/audio/se/Siren.ogg
new file mode 100644
index 0000000..f63257c
Binary files /dev/null and b/audio/se/Siren.ogg differ
diff --git a/audio/se/Skill1.ogg b/audio/se/Skill1.ogg
new file mode 100644
index 0000000..dbeb64e
Binary files /dev/null and b/audio/se/Skill1.ogg differ
diff --git a/audio/se/Skill2.ogg b/audio/se/Skill2.ogg
new file mode 100644
index 0000000..5ce9fb1
Binary files /dev/null and b/audio/se/Skill2.ogg differ
diff --git a/audio/se/Skill3.ogg b/audio/se/Skill3.ogg
new file mode 100644
index 0000000..103a7b9
Binary files /dev/null and b/audio/se/Skill3.ogg differ
diff --git a/audio/se/Slash1.ogg b/audio/se/Slash1.ogg
new file mode 100644
index 0000000..6e434a2
Binary files /dev/null and b/audio/se/Slash1.ogg differ
diff --git a/audio/se/Slash10.ogg b/audio/se/Slash10.ogg
new file mode 100644
index 0000000..dfed51a
Binary files /dev/null and b/audio/se/Slash10.ogg differ
diff --git a/audio/se/Slash2.ogg b/audio/se/Slash2.ogg
new file mode 100644
index 0000000..580397a
Binary files /dev/null and b/audio/se/Slash2.ogg differ
diff --git a/audio/se/Slash3.ogg b/audio/se/Slash3.ogg
new file mode 100644
index 0000000..2c8295c
Binary files /dev/null and b/audio/se/Slash3.ogg differ
diff --git a/audio/se/Slash4.ogg b/audio/se/Slash4.ogg
new file mode 100644
index 0000000..2ce79db
Binary files /dev/null and b/audio/se/Slash4.ogg differ
diff --git a/audio/se/Slash5.ogg b/audio/se/Slash5.ogg
new file mode 100644
index 0000000..a875b2e
Binary files /dev/null and b/audio/se/Slash5.ogg differ
diff --git a/audio/se/Slash6.ogg b/audio/se/Slash6.ogg
new file mode 100644
index 0000000..cfdeb2b
Binary files /dev/null and b/audio/se/Slash6.ogg differ
diff --git a/audio/se/Slash7.ogg b/audio/se/Slash7.ogg
new file mode 100644
index 0000000..3a09bfb
Binary files /dev/null and b/audio/se/Slash7.ogg differ
diff --git a/audio/se/Slash8.ogg b/audio/se/Slash8.ogg
new file mode 100644
index 0000000..cce6881
Binary files /dev/null and b/audio/se/Slash8.ogg differ
diff --git a/audio/se/Slash9.ogg b/audio/se/Slash9.ogg
new file mode 100644
index 0000000..cd9ed18
Binary files /dev/null and b/audio/se/Slash9.ogg differ
diff --git a/audio/se/Sleep.ogg b/audio/se/Sleep.ogg
new file mode 100644
index 0000000..8c022ec
Binary files /dev/null and b/audio/se/Sleep.ogg differ
diff --git a/audio/se/Sound1.ogg b/audio/se/Sound1.ogg
new file mode 100644
index 0000000..a512fd3
Binary files /dev/null and b/audio/se/Sound1.ogg differ
diff --git a/audio/se/Sound2.ogg b/audio/se/Sound2.ogg
new file mode 100644
index 0000000..5d607f6
Binary files /dev/null and b/audio/se/Sound2.ogg differ
diff --git a/audio/se/Sound3.ogg b/audio/se/Sound3.ogg
new file mode 100644
index 0000000..046ac13
Binary files /dev/null and b/audio/se/Sound3.ogg differ
diff --git a/audio/se/Splash.ogg b/audio/se/Splash.ogg
new file mode 100644
index 0000000..4b34c67
Binary files /dev/null and b/audio/se/Splash.ogg differ
diff --git a/audio/se/Stare.ogg b/audio/se/Stare.ogg
new file mode 100644
index 0000000..942285f
Binary files /dev/null and b/audio/se/Stare.ogg differ
diff --git a/audio/se/Starlight.ogg b/audio/se/Starlight.ogg
new file mode 100644
index 0000000..2d817b7
Binary files /dev/null and b/audio/se/Starlight.ogg differ
diff --git a/audio/se/Summon.ogg b/audio/se/Summon.ogg
new file mode 100644
index 0000000..451cf08
Binary files /dev/null and b/audio/se/Summon.ogg differ
diff --git a/audio/se/Switch1.ogg b/audio/se/Switch1.ogg
new file mode 100644
index 0000000..38d89ef
Binary files /dev/null and b/audio/se/Switch1.ogg differ
diff --git a/audio/se/Switch2.ogg b/audio/se/Switch2.ogg
new file mode 100644
index 0000000..0efc55f
Binary files /dev/null and b/audio/se/Switch2.ogg differ
diff --git a/audio/se/Switch3.ogg b/audio/se/Switch3.ogg
new file mode 100644
index 0000000..5ea1f2d
Binary files /dev/null and b/audio/se/Switch3.ogg differ
diff --git a/audio/se/Sword1.ogg b/audio/se/Sword1.ogg
new file mode 100644
index 0000000..19f88ac
Binary files /dev/null and b/audio/se/Sword1.ogg differ
diff --git a/audio/se/Sword2.ogg b/audio/se/Sword2.ogg
new file mode 100644
index 0000000..1b0ac8d
Binary files /dev/null and b/audio/se/Sword2.ogg differ
diff --git a/audio/se/Sword3.ogg b/audio/se/Sword3.ogg
new file mode 100644
index 0000000..8ff7524
Binary files /dev/null and b/audio/se/Sword3.ogg differ
diff --git a/audio/se/Sword4.ogg b/audio/se/Sword4.ogg
new file mode 100644
index 0000000..5ccc956
Binary files /dev/null and b/audio/se/Sword4.ogg differ
diff --git a/audio/se/Sword5.ogg b/audio/se/Sword5.ogg
new file mode 100644
index 0000000..b2ac437
Binary files /dev/null and b/audio/se/Sword5.ogg differ
diff --git a/audio/se/Sword6.ogg b/audio/se/Sword6.ogg
new file mode 100644
index 0000000..437fd9f
Binary files /dev/null and b/audio/se/Sword6.ogg differ
diff --git a/audio/se/Sword7.ogg b/audio/se/Sword7.ogg
new file mode 100644
index 0000000..b102307
Binary files /dev/null and b/audio/se/Sword7.ogg differ
diff --git a/audio/se/Teleport.ogg b/audio/se/Teleport.ogg
new file mode 100644
index 0000000..0761d88
Binary files /dev/null and b/audio/se/Teleport.ogg differ
diff --git a/audio/se/Thunder1.ogg b/audio/se/Thunder1.ogg
new file mode 100644
index 0000000..a75e683
Binary files /dev/null and b/audio/se/Thunder1.ogg differ
diff --git a/audio/se/Thunder10.ogg b/audio/se/Thunder10.ogg
new file mode 100644
index 0000000..7eb440b
Binary files /dev/null and b/audio/se/Thunder10.ogg differ
diff --git a/audio/se/Thunder11.ogg b/audio/se/Thunder11.ogg
new file mode 100644
index 0000000..2affb2e
Binary files /dev/null and b/audio/se/Thunder11.ogg differ
diff --git a/audio/se/Thunder12.ogg b/audio/se/Thunder12.ogg
new file mode 100644
index 0000000..0df94ea
Binary files /dev/null and b/audio/se/Thunder12.ogg differ
diff --git a/audio/se/Thunder13.ogg b/audio/se/Thunder13.ogg
new file mode 100644
index 0000000..4f4a2ac
Binary files /dev/null and b/audio/se/Thunder13.ogg differ
diff --git a/audio/se/Thunder14.ogg b/audio/se/Thunder14.ogg
new file mode 100644
index 0000000..77118d4
Binary files /dev/null and b/audio/se/Thunder14.ogg differ
diff --git a/audio/se/Thunder2.ogg b/audio/se/Thunder2.ogg
new file mode 100644
index 0000000..2fca432
Binary files /dev/null and b/audio/se/Thunder2.ogg differ
diff --git a/audio/se/Thunder3.ogg b/audio/se/Thunder3.ogg
new file mode 100644
index 0000000..c991e73
Binary files /dev/null and b/audio/se/Thunder3.ogg differ
diff --git a/audio/se/Thunder4.ogg b/audio/se/Thunder4.ogg
new file mode 100644
index 0000000..049b95d
Binary files /dev/null and b/audio/se/Thunder4.ogg differ
diff --git a/audio/se/Thunder5.ogg b/audio/se/Thunder5.ogg
new file mode 100644
index 0000000..b4eefc8
Binary files /dev/null and b/audio/se/Thunder5.ogg differ
diff --git a/audio/se/Thunder6.ogg b/audio/se/Thunder6.ogg
new file mode 100644
index 0000000..18ff9c0
Binary files /dev/null and b/audio/se/Thunder6.ogg differ
diff --git a/audio/se/Thunder7.ogg b/audio/se/Thunder7.ogg
new file mode 100644
index 0000000..6837774
Binary files /dev/null and b/audio/se/Thunder7.ogg differ
diff --git a/audio/se/Thunder8.ogg b/audio/se/Thunder8.ogg
new file mode 100644
index 0000000..9592cf8
Binary files /dev/null and b/audio/se/Thunder8.ogg differ
diff --git a/audio/se/Thunder9.ogg b/audio/se/Thunder9.ogg
new file mode 100644
index 0000000..d59e552
Binary files /dev/null and b/audio/se/Thunder9.ogg differ
diff --git a/audio/se/Transceiver.ogg b/audio/se/Transceiver.ogg
new file mode 100644
index 0000000..11601d5
Binary files /dev/null and b/audio/se/Transceiver.ogg differ
diff --git a/audio/se/Twine.ogg b/audio/se/Twine.ogg
new file mode 100644
index 0000000..3a2d08d
Binary files /dev/null and b/audio/se/Twine.ogg differ
diff --git a/audio/se/Up1.ogg b/audio/se/Up1.ogg
new file mode 100644
index 0000000..6adb685
Binary files /dev/null and b/audio/se/Up1.ogg differ
diff --git a/audio/se/Up2.ogg b/audio/se/Up2.ogg
new file mode 100644
index 0000000..e052742
Binary files /dev/null and b/audio/se/Up2.ogg differ
diff --git a/audio/se/Up3.ogg b/audio/se/Up3.ogg
new file mode 100644
index 0000000..038d2a6
Binary files /dev/null and b/audio/se/Up3.ogg differ
diff --git a/audio/se/Up4.ogg b/audio/se/Up4.ogg
new file mode 100644
index 0000000..ebe0e5d
Binary files /dev/null and b/audio/se/Up4.ogg differ
diff --git a/audio/se/Up5.ogg b/audio/se/Up5.ogg
new file mode 100644
index 0000000..71be3ff
Binary files /dev/null and b/audio/se/Up5.ogg differ
diff --git a/audio/se/Up6.ogg b/audio/se/Up6.ogg
new file mode 100644
index 0000000..58b9090
Binary files /dev/null and b/audio/se/Up6.ogg differ
diff --git a/audio/se/Up7.ogg b/audio/se/Up7.ogg
new file mode 100644
index 0000000..ea593e2
Binary files /dev/null and b/audio/se/Up7.ogg differ
diff --git a/audio/se/Up8.ogg b/audio/se/Up8.ogg
new file mode 100644
index 0000000..7c999ad
Binary files /dev/null and b/audio/se/Up8.ogg differ
diff --git a/audio/se/Water1.ogg b/audio/se/Water1.ogg
new file mode 100644
index 0000000..bb7e316
Binary files /dev/null and b/audio/se/Water1.ogg differ
diff --git a/audio/se/Water2.ogg b/audio/se/Water2.ogg
new file mode 100644
index 0000000..a842fda
Binary files /dev/null and b/audio/se/Water2.ogg differ
diff --git a/audio/se/Water3.ogg b/audio/se/Water3.ogg
new file mode 100644
index 0000000..1b29708
Binary files /dev/null and b/audio/se/Water3.ogg differ
diff --git a/audio/se/Water4.ogg b/audio/se/Water4.ogg
new file mode 100644
index 0000000..ccb96fb
Binary files /dev/null and b/audio/se/Water4.ogg differ
diff --git a/audio/se/Water5.ogg b/audio/se/Water5.ogg
new file mode 100644
index 0000000..28bd3cc
Binary files /dev/null and b/audio/se/Water5.ogg differ
diff --git a/audio/se/Wind1.ogg b/audio/se/Wind1.ogg
new file mode 100644
index 0000000..b024c43
Binary files /dev/null and b/audio/se/Wind1.ogg differ
diff --git a/audio/se/Wind10.ogg b/audio/se/Wind10.ogg
new file mode 100644
index 0000000..16ff744
Binary files /dev/null and b/audio/se/Wind10.ogg differ
diff --git a/audio/se/Wind11.ogg b/audio/se/Wind11.ogg
new file mode 100644
index 0000000..364b34f
Binary files /dev/null and b/audio/se/Wind11.ogg differ
diff --git a/audio/se/Wind2.ogg b/audio/se/Wind2.ogg
new file mode 100644
index 0000000..a42f9ef
Binary files /dev/null and b/audio/se/Wind2.ogg differ
diff --git a/audio/se/Wind3.ogg b/audio/se/Wind3.ogg
new file mode 100644
index 0000000..aa967a8
Binary files /dev/null and b/audio/se/Wind3.ogg differ
diff --git a/audio/se/Wind4.ogg b/audio/se/Wind4.ogg
new file mode 100644
index 0000000..dc1cc4b
Binary files /dev/null and b/audio/se/Wind4.ogg differ
diff --git a/audio/se/Wind5.ogg b/audio/se/Wind5.ogg
new file mode 100644
index 0000000..5c49d3d
Binary files /dev/null and b/audio/se/Wind5.ogg differ
diff --git a/audio/se/Wind6.ogg b/audio/se/Wind6.ogg
new file mode 100644
index 0000000..23840ff
Binary files /dev/null and b/audio/se/Wind6.ogg differ
diff --git a/audio/se/Wind7.ogg b/audio/se/Wind7.ogg
new file mode 100644
index 0000000..b8bf210
Binary files /dev/null and b/audio/se/Wind7.ogg differ
diff --git a/audio/se/Wind8.ogg b/audio/se/Wind8.ogg
new file mode 100644
index 0000000..8d29729
Binary files /dev/null and b/audio/se/Wind8.ogg differ
diff --git a/audio/se/Wind9.ogg b/audio/se/Wind9.ogg
new file mode 100644
index 0000000..0524135
Binary files /dev/null and b/audio/se/Wind9.ogg differ
diff --git a/audio/se/Wolf.ogg b/audio/se/Wolf.ogg
new file mode 100644
index 0000000..b4d2338
Binary files /dev/null and b/audio/se/Wolf.ogg differ
diff --git a/css/game.css b/css/game.css
new file mode 100644
index 0000000..f114975
--- /dev/null
+++ b/css/game.css
@@ -0,0 +1,116 @@
+body {
+ -moz-user-select: none;
+ -webkit-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+#errorPrinter {
+ position: absolute;
+ left: 50%;
+ top: 50%;
+ width: 640px;
+ height: 100px;
+ transform: translate(-50%, -50%);
+ text-align: center;
+ text-shadow: 1px 1px 3px #000;
+ font-size: 20px;
+ color: #fff;
+ z-index: 9;
+}
+#errorName {
+ color: #ff0;
+ font-weight: bold;
+ -moz-user-select: text;
+ -webkit-user-select: text;
+ -ms-user-select: text;
+ user-select: text;
+}
+#errorMessage {
+ color: #fff;
+ -moz-user-select: text;
+ -webkit-user-select: text;
+ -ms-user-select: text;
+ user-select: text;
+}
+#retryButton {
+ font-size: 20px;
+ color: #fff;
+ background-color: #000;
+ border-radius: 8px;
+ margin: 20px;
+ padding: 10px;
+}
+#fpsCounterBox {
+ position: absolute;
+ left: 5px;
+ top: 5px;
+ width: 90px;
+ height: 40px;
+ background: #222;
+ opacity: 0.8;
+ z-index: 8;
+}
+#fpsCounterLabel {
+ position: absolute;
+ top: 0px;
+ left: 0px;
+ padding: 5px 10px;
+ height: 30px;
+ line-height: 32px;
+ font-size: 12px;
+ font-family: rmmz-numberfont, sans-serif;
+ color: #fff;
+ text-align: left;
+}
+#fpsCounterNumber {
+ position: absolute;
+ top: 0px;
+ right: 0px;
+ padding: 5px 10px;
+ height: 30px;
+ line-height: 30px;
+ font-size: 24px;
+ font-family: rmmz-numberfont, monospace;
+ color: #fff;
+ text-align: right;
+}
+#loadingSpinner {
+ margin: auto;
+ position: absolute;
+ top: 0px;
+ left: 0px;
+ right: 0px;
+ bottom: 0px;
+ width: 120px;
+ height: 120px;
+ z-index: 10;
+}
+#loadingSpinnerImage {
+ margin: 0px;
+ padding: 0px;
+ border-radius: 50%;
+ width: 96px;
+ height: 96px;
+ border: 12px solid rgba(255, 255, 255, 0.25);
+ border-top: 12px solid rgba(255, 255, 255, 1);
+ animation: fadein 2s ease, spin 1.5s linear infinite;
+}
+@keyframes fadein {
+ 0% {
+ opacity: 0;
+ }
+ 20% {
+ opacity: 0;
+ }
+ 100% {
+ opacity: 1;
+ }
+}
+@keyframes spin {
+ 0% {
+ transform: rotate(0deg);
+ }
+ 100% {
+ transform: rotate(360deg);
+ }
+}
diff --git a/data/Actors.json b/data/Actors.json
new file mode 100644
index 0000000..73b2fe2
--- /dev/null
+++ b/data/Actors.json
@@ -0,0 +1,11 @@
+[
+null,
+{"id":1,"battlerName":"Actor1_1","characterIndex":0,"characterName":"Actor1","classId":1,"equips":[2,0,0,3,0],"faceIndex":0,"faceName":"Actor1","traits":[],"initialLevel":1,"maxLevel":99,"name":"Reid","nickname":"","note":"","profile":""},
+{"id":2,"battlerName":"Actor1_2","characterIndex":1,"characterName":"Actor1","classId":1,"equips":[1,0,0,9,0],"faceIndex":1,"faceName":"Actor1","traits":[],"initialLevel":1,"maxLevel":99,"name":"Priscilla","nickname":"","note":"","profile":""},
+{"id":3,"battlerName":"Actor1_3","characterIndex":2,"characterName":"Actor1","classId":5,"equips":[31,0,65,5,0],"faceIndex":2,"faceName":"Actor1","traits":[],"initialLevel":1,"maxLevel":99,"name":"Gale","nickname":"","note":"","profile":""},
+{"id":4,"battlerName":"Actor1_4","characterIndex":3,"characterName":"Actor1","classId":5,"equips":[31,0,0,5,0],"faceIndex":3,"faceName":"Actor1","traits":[],"initialLevel":1,"maxLevel":99,"name":"Michelle","nickname":"","note":"","profile":""},
+{"id":5,"battlerName":"Actor1_5","characterIndex":4,"characterName":"Actor1","classId":2,"equips":[7,0,0,20,0],"faceIndex":4,"faceName":"Actor1","traits":[],"initialLevel":1,"maxLevel":99,"name":"Albert","nickname":"","note":"","profile":""},
+{"id":6,"battlerName":"Actor1_6","characterIndex":5,"characterName":"Actor1","classId":2,"equips":[7,0,65,21,0],"faceIndex":5,"faceName":"Actor1","traits":[],"initialLevel":1,"maxLevel":99,"name":"Kasey","nickname":"","note":"","profile":""},
+{"id":7,"battlerName":"Actor1_7","characterIndex":6,"characterName":"Actor1","classId":3,"equips":[7,0,0,20,0],"faceIndex":6,"faceName":"Actor1","traits":[],"initialLevel":1,"maxLevel":99,"name":"Eliot","nickname":"","note":"","profile":""},
+{"id":8,"battlerName":"Actor1_8","characterIndex":7,"characterName":"Actor1","classId":3,"equips":[7,0,0,20,0],"faceIndex":7,"faceName":"Actor1","traits":[],"initialLevel":1,"maxLevel":99,"name":"Roza","nickname":"","note":"","profile":""}
+]
\ No newline at end of file
diff --git a/data/Animations.json b/data/Animations.json
new file mode 100644
index 0000000..7db9f65
--- /dev/null
+++ b/data/Animations.json
@@ -0,0 +1,123 @@
+[
+null,
+{"id":1,"displayType":0,"effectName":"HitPhysical","flashTimings":[{"frame":0,"duration":30,"color":[255,255,255,255]}],"name":"Hit Physical","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":50,"soundTimings":[{"frame":0,"se":{"name":"Blow1","pan":0,"pitch":100,"volume":90}}],"speed":100},
+{"id":2,"displayType":0,"effectName":"HitEffect","flashTimings":[{"frame":1,"duration":30,"color":[255,255,255,255]}],"name":"Hit Effect","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":60,"soundTimings":[{"frame":0,"se":{"name":"Evasion2","pan":0,"pitch":150,"volume":80}},{"frame":1,"se":{"name":"Damage4","pan":0,"pitch":120,"volume":90}},{"frame":2,"se":{"name":"Powerup","pan":0,"pitch":150,"volume":90}}],"speed":100},
+{"id":3,"displayType":0,"effectName":"HitFire","flashTimings":[{"frame":0,"duration":30,"color":[255,119,102,221]},{"frame":2,"duration":30,"color":[255,136,51,153]}],"name":"Hit Fire","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Blow1","pan":0,"pitch":100,"volume":90}},{"frame":0,"se":{"name":"Fire1","pan":0,"pitch":100,"volume":100}}],"speed":100},
+{"id":4,"displayType":0,"effectName":"HitIce","flashTimings":[{"frame":0,"duration":30,"color":[119,187,255,221]},{"frame":2,"duration":30,"color":[187,221,221,153]}],"name":"Hit Ice","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Blow1","pan":0,"pitch":100,"volume":100}},{"frame":0,"se":{"name":"Ice3","pan":0,"pitch":75,"volume":90}}],"speed":100},
+{"id":5,"displayType":0,"effectName":"HitThunder","flashTimings":[{"frame":0,"duration":30,"color":[255,255,102,221]},{"frame":2,"duration":30,"color":[255,255,119,153]}],"name":"Hit Thunder","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Thunder8","pan":0,"pitch":80,"volume":100}},{"frame":0,"se":{"name":"Blow3","pan":0,"pitch":100,"volume":100}}],"speed":100},
+{"id":6,"displayType":0,"effectName":"SlashPhysical","flashTimings":[{"frame":0,"duration":30,"color":[255,255,255,187]}],"name":"Slash Physical","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Slash1","pan":0,"pitch":140,"volume":80}}],"speed":100},
+{"id":7,"displayType":0,"effectName":"SlashEffect","flashTimings":[{"frame":1,"duration":30,"color":[255,255,255,255]}],"name":"Slash Effect","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Evasion2","pan":0,"pitch":150,"volume":80}},{"frame":0,"se":{"name":"Slash1","pan":0,"pitch":140,"volume":80}},{"frame":2,"se":{"name":"Powerup","pan":0,"pitch":150,"volume":90}}],"speed":100},
+{"id":8,"displayType":0,"effectName":"SlashFire","flashTimings":[{"frame":0,"duration":30,"color":[255,119,102,221]},{"frame":1,"duration":30,"color":[255,136,51,153]}],"name":"Slash Fire","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Thunder1","pan":0,"pitch":120,"volume":90}},{"frame":2,"se":{"name":"Sword5","pan":0,"pitch":100,"volume":100}},{"frame":4,"se":{"name":"Fire1","pan":0,"pitch":100,"volume":100}}],"speed":100},
+{"id":9,"displayType":0,"effectName":"SlashIce","flashTimings":[{"frame":0,"duration":30,"color":[119,187,255,221]},{"frame":1,"duration":30,"color":[187,221,221,153]}],"name":"Slash Ice","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Slash1","pan":0,"pitch":140,"volume":80}},{"frame":0,"se":{"name":"Ice3","pan":0,"pitch":100,"volume":100}}],"speed":100},
+{"id":10,"displayType":0,"effectName":"SlashThunder","flashTimings":[{"frame":0,"duration":30,"color":[255,255,102,221]},{"frame":1,"duration":30,"color":[255,255,119,153]}],"name":"Slash Thunder","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Slash1","pan":0,"pitch":140,"volume":80}},{"frame":0,"se":{"name":"Thunder8","pan":0,"pitch":100,"volume":100}}],"speed":100},
+{"id":11,"displayType":0,"effectName":"PiercePhysical","flashTimings":[{"frame":0,"duration":30,"color":[255,255,255,255]}],"name":"Pierce Physical","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":60,"soundTimings":[{"frame":0,"se":{"name":"Thunder1","pan":0,"pitch":120,"volume":90}},{"frame":4,"se":{"name":"Sword5","pan":0,"pitch":120,"volume":90}}],"speed":100},
+{"id":12,"displayType":0,"effectName":"PierceEffect","flashTimings":[{"frame":0,"duration":30,"color":[255,255,255,255]}],"name":"Pierce Effect","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":80,"soundTimings":[{"frame":0,"se":{"name":"Evasion2","pan":0,"pitch":150,"volume":80}},{"frame":1,"se":{"name":"Thunder4","pan":0,"pitch":120,"volume":90}},{"frame":8,"se":{"name":"Powerup","pan":0,"pitch":150,"volume":90}}],"speed":100},
+{"id":13,"displayType":0,"effectName":"PierceFire","flashTimings":[{"frame":0,"duration":30,"color":[255,119,102,221]},{"frame":3,"duration":30,"color":[255,136,51,153]}],"name":"Pierce Fire","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":80,"soundTimings":[{"frame":0,"se":{"name":"Thunder1","pan":0,"pitch":120,"volume":90}},{"frame":2,"se":{"name":"Sword5","pan":0,"pitch":100,"volume":100}},{"frame":3,"se":{"name":"Fire1","pan":0,"pitch":100,"volume":100}}],"speed":100},
+{"id":14,"displayType":0,"effectName":"PierceIce","flashTimings":[{"frame":0,"duration":30,"color":[119,187,255,221]},{"frame":3,"duration":30,"color":[187,221,221,153]}],"name":"Pierce Ice","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":80,"soundTimings":[{"frame":0,"se":{"name":"Thunder1","pan":0,"pitch":120,"volume":90}},{"frame":2,"se":{"name":"Sword5","pan":0,"pitch":100,"volume":100}},{"frame":3,"se":{"name":"Ice3","pan":0,"pitch":75,"volume":100}}],"speed":100},
+{"id":15,"displayType":0,"effectName":"PierceThunder","flashTimings":[{"frame":0,"duration":60,"color":[255,255,102,221]},{"frame":3,"duration":60,"color":[255,255,85,153]}],"name":"Pierce Thunder","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":80,"soundTimings":[{"frame":0,"se":{"name":"Thunder1","pan":0,"pitch":120,"volume":90}},{"frame":2,"se":{"name":"Sword5","pan":0,"pitch":100,"volume":100}},{"frame":3,"se":{"name":"Thunder8","pan":0,"pitch":80,"volume":100}}],"speed":100},
+{"id":16,"displayType":0,"effectName":"ClawPhysical","flashTimings":[{"frame":0,"duration":30,"color":[255,255,255,255]}],"name":"Claw Physical","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Attack2","pan":0,"pitch":150,"volume":90}},{"frame":1,"se":{"name":"Slash2","pan":0,"pitch":100,"volume":90}}],"speed":100},
+{"id":17,"displayType":0,"effectName":"ClawEffect","flashTimings":[{"frame":0,"duration":30,"color":[255,255,255,255]}],"name":"Claw Effect","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Evasion2","pan":0,"pitch":150,"volume":80}},{"frame":1,"se":{"name":"Attack2","pan":0,"pitch":150,"volume":90}},{"frame":2,"se":{"name":"Powerup","pan":0,"pitch":150,"volume":90}}],"speed":100},
+{"id":18,"displayType":0,"effectName":"ClawFire","flashTimings":[{"frame":0,"duration":30,"color":[255,119,102,221]}],"name":"Claw Fire","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Attack2","pan":0,"pitch":100,"volume":90}},{"frame":1,"se":{"name":"Slash2","pan":0,"pitch":100,"volume":90}},{"frame":3,"se":{"name":"Fire1","pan":0,"pitch":100,"volume":100}}],"speed":100},
+{"id":19,"displayType":0,"effectName":"ClawIce","flashTimings":[{"frame":0,"duration":30,"color":[119,187,255,221]}],"name":"Claw Ice","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Attack2","pan":0,"pitch":150,"volume":90}},{"frame":1,"se":{"name":"Slash2","pan":0,"pitch":100,"volume":90}},{"frame":3,"se":{"name":"Ice3","pan":0,"pitch":75,"volume":100}}],"speed":100},
+{"id":20,"displayType":0,"effectName":"ClawThunder","flashTimings":[{"frame":0,"duration":30,"color":[255,255,102,221]}],"name":"Claw Thunder","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Attack2","pan":0,"pitch":150,"volume":90}},{"frame":1,"se":{"name":"Slash2","pan":0,"pitch":100,"volume":90}},{"frame":3,"se":{"name":"Thunder8","pan":0,"pitch":80,"volume":100}}],"speed":100},
+{"id":21,"displayType":0,"effectName":"HitSpecial1","flashTimings":[{"frame":0,"duration":30,"color":[255,255,255,255]},{"frame":29,"duration":30,"color":[255,255,255,255]},{"frame":59,"duration":70,"color":[255,255,255,255]},{"frame":99,"duration":70,"color":[255,255,255,255]}],"name":"Hit Special 1","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":120,"soundTimings":[{"frame":2,"se":{"name":"Blow1","pan":0,"pitch":120,"volume":90}},{"frame":5,"se":{"name":"Blow3","pan":0,"pitch":100,"volume":90}},{"frame":9,"se":{"name":"Blow1","pan":0,"pitch":120,"volume":90}},{"frame":27,"se":{"name":"Thunder5","pan":0,"pitch":120,"volume":90}},{"frame":34,"se":{"name":"Blow3","pan":0,"pitch":100,"volume":90}},{"frame":44,"se":{"name":"Thunder5","pan":0,"pitch":120,"volume":90}},{"frame":44,"se":{"name":"Blow3","pan":0,"pitch":100,"volume":90}},{"frame":51,"se":{"name":"Blow3","pan":0,"pitch":100,"volume":90}},{"frame":69,"se":{"name":"Thunder5","pan":0,"pitch":120,"volume":90}},{"frame":84,"se":{"name":"Blow3","pan":0,"pitch":100,"volume":90}},{"frame":91,"se":{"name":"Blow3","pan":0,"pitch":100,"volume":90}},{"frame":99,"se":{"name":"Thunder5","pan":0,"pitch":120,"volume":90}}],"speed":100},
+{"id":22,"displayType":1,"effectName":"HitSpecial2","flashTimings":[{"frame":9,"duration":27,"color":[255,255,255,255]},{"frame":27,"duration":27,"color":[255,255,255,255]},{"frame":54,"duration":35,"color":[255,255,255,255]},{"frame":89,"duration":30,"color":[255,255,255,255]}],"name":"Hit Special 2","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":200,"soundTimings":[{"frame":0,"se":{"name":"Blow1","pan":0,"pitch":100,"volume":90}},{"frame":2,"se":{"name":"Blow1","pan":0,"pitch":100,"volume":90}},{"frame":3,"se":{"name":"Blow3","pan":0,"pitch":100,"volume":90}},{"frame":5,"se":{"name":"Blow1","pan":0,"pitch":100,"volume":100}},{"frame":7,"se":{"name":"Blow2","pan":0,"pitch":100,"volume":100}},{"frame":9,"se":{"name":"Blow1","pan":0,"pitch":100,"volume":100}},{"frame":12,"se":{"name":"Blow3","pan":0,"pitch":100,"volume":90}},{"frame":14,"se":{"name":"Blow3","pan":0,"pitch":100,"volume":100}},{"frame":17,"se":{"name":"Blow2","pan":0,"pitch":100,"volume":100}},{"frame":18,"se":{"name":"Blow3","pan":0,"pitch":70,"volume":90}},{"frame":22,"se":{"name":"Blow3","pan":0,"pitch":100,"volume":100}},{"frame":24,"se":{"name":"Blow2","pan":0,"pitch":100,"volume":100}},{"frame":27,"se":{"name":"Blow3","pan":0,"pitch":70,"volume":90}},{"frame":34,"se":{"name":"Blow3","pan":0,"pitch":100,"volume":100}},{"frame":44,"se":{"name":"Blow2","pan":0,"pitch":100,"volume":100}},{"frame":54,"se":{"name":"Blow3","pan":0,"pitch":70,"volume":90}},{"frame":59,"se":{"name":"Damage2","pan":0,"pitch":120,"volume":100}},{"frame":79,"se":{"name":"Damage2","pan":0,"pitch":120,"volume":100}}],"speed":100},
+{"id":23,"displayType":0,"effectName":"SlashSpecial1","flashTimings":[{"frame":0,"duration":27,"color":[255,255,255,255]},{"frame":27,"duration":28,"color":[255,255,255,255]},{"frame":55,"duration":30,"color":[255,255,255,255]}],"name":"Slash Special 1","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":120,"soundTimings":[{"frame":1,"se":{"name":"Slash1","pan":0,"pitch":100,"volume":90}},{"frame":3,"se":{"name":"Slash3","pan":0,"pitch":120,"volume":90}},{"frame":5,"se":{"name":"Slash3","pan":0,"pitch":120,"volume":90}},{"frame":7,"se":{"name":"Slash1","pan":0,"pitch":120,"volume":90}},{"frame":9,"se":{"name":"Slash3","pan":0,"pitch":120,"volume":90}},{"frame":11,"se":{"name":"Slash4","pan":0,"pitch":120,"volume":90}},{"frame":15,"se":{"name":"Slash1","pan":0,"pitch":100,"volume":90}},{"frame":17,"se":{"name":"Slash3","pan":0,"pitch":120,"volume":90}},{"frame":19,"se":{"name":"Slash3","pan":0,"pitch":120,"volume":90}},{"frame":23,"se":{"name":"Slash1","pan":0,"pitch":120,"volume":90}},{"frame":27,"se":{"name":"Slash3","pan":0,"pitch":120,"volume":90}},{"frame":47,"se":{"name":"Evasion2","pan":0,"pitch":120,"volume":90}}],"speed":100},
+{"id":24,"displayType":1,"effectName":"SlashSpecial2","flashTimings":[{"frame":0,"duration":17,"color":[255,255,255,255]},{"frame":29,"duration":40,"color":[255,68,0,102]}],"name":"Slash Special 2","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":120,"soundTimings":[{"frame":0,"se":{"name":"Sword4","pan":0,"pitch":100,"volume":90}},{"frame":1,"se":{"name":"Slash2","pan":0,"pitch":110,"volume":90}},{"frame":3,"se":{"name":"Wind4","pan":0,"pitch":100,"volume":80}},{"frame":7,"se":{"name":"Slash8","pan":0,"pitch":100,"volume":90}},{"frame":7,"se":{"name":"Wind4","pan":0,"pitch":100,"volume":100}},{"frame":9,"se":{"name":"Slash1","pan":0,"pitch":90,"volume":90}},{"frame":16,"se":{"name":"Ice3","pan":0,"pitch":90,"volume":90}}],"speed":100},
+{"id":25,"displayType":2,"effectName":"SlashSpecial3","flashTimings":[{"frame":0,"duration":22,"color":[255,255,255,255]},{"frame":22,"duration":37,"color":[255,255,255,255]},{"frame":59,"duration":40,"color":[255,255,255,255]},{"frame":99,"duration":15,"color":[255,255,255,255]}],"name":"Slash Special 3","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":120,"soundTimings":[{"frame":1,"se":{"name":"Slash2","pan":0,"pitch":100,"volume":100}},{"frame":8,"se":{"name":"Slash3","pan":0,"pitch":120,"volume":100}},{"frame":11,"se":{"name":"Slash2","pan":0,"pitch":100,"volume":100}},{"frame":22,"se":{"name":"Slash3","pan":0,"pitch":100,"volume":100}},{"frame":28,"se":{"name":"Slash2","pan":0,"pitch":100,"volume":100}},{"frame":33,"se":{"name":"Slash3","pan":0,"pitch":120,"volume":100}},{"frame":37,"se":{"name":"Slash2","pan":0,"pitch":100,"volume":100}},{"frame":43,"se":{"name":"Slash3","pan":0,"pitch":100,"volume":100}},{"frame":59,"se":{"name":"Slash1","pan":0,"pitch":100,"volume":100}},{"frame":59,"se":{"name":"Evasion1","pan":0,"pitch":150,"volume":70}},{"frame":79,"se":{"name":"Slash2","pan":0,"pitch":100,"volume":100}},{"frame":79,"se":{"name":"Evasion1","pan":0,"pitch":150,"volume":70}},{"frame":95,"se":{"name":"Slash1","pan":0,"pitch":100,"volume":100}},{"frame":99,"se":{"name":"Slash3","pan":0,"pitch":120,"volume":90}}],"speed":100},
+{"id":26,"displayType":0,"effectName":"PierceSpecial1","flashTimings":[{"frame":0,"duration":30,"color":[255,255,255,255]},{"frame":31,"duration":32,"color":[255,255,255,255]},{"frame":62,"duration":31,"color":[255,255,255,255]},{"frame":99,"duration":27,"color":[255,255,255,255]}],"name":"Pierce Special 1","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Wind6","pan":0,"pitch":130,"volume":90}},{"frame":2,"se":{"name":"Sword5","pan":0,"pitch":130,"volume":90}},{"frame":3,"se":{"name":"Slash1","pan":0,"pitch":150,"volume":90}},{"frame":4,"se":{"name":"Sword5","pan":0,"pitch":130,"volume":90}},{"frame":5,"se":{"name":"Slash1","pan":0,"pitch":150,"volume":90}},{"frame":6,"se":{"name":"Sword5","pan":0,"pitch":130,"volume":90}},{"frame":11,"se":{"name":"Wind6","pan":0,"pitch":130,"volume":90}},{"frame":15,"se":{"name":"Sword5","pan":0,"pitch":130,"volume":90}},{"frame":19,"se":{"name":"Slash1","pan":0,"pitch":150,"volume":90}},{"frame":21,"se":{"name":"Sword5","pan":0,"pitch":130,"volume":90}},{"frame":26,"se":{"name":"Slash1","pan":0,"pitch":150,"volume":90}},{"frame":31,"se":{"name":"Sword5","pan":0,"pitch":130,"volume":90}},{"frame":35,"se":{"name":"Sword5","pan":0,"pitch":130,"volume":90}},{"frame":38,"se":{"name":"Slash1","pan":0,"pitch":150,"volume":90}},{"frame":41,"se":{"name":"Sword5","pan":0,"pitch":130,"volume":90}},{"frame":46,"se":{"name":"Slash1","pan":0,"pitch":150,"volume":90}},{"frame":52,"se":{"name":"Slash1","pan":0,"pitch":150,"volume":90}},{"frame":56,"se":{"name":"Sword5","pan":0,"pitch":130,"volume":90}},{"frame":62,"se":{"name":"Slash1","pan":0,"pitch":150,"volume":90}},{"frame":66,"se":{"name":"Slash1","pan":0,"pitch":150,"volume":90}},{"frame":69,"se":{"name":"Sword5","pan":0,"pitch":130,"volume":90}},{"frame":74,"se":{"name":"Slash1","pan":0,"pitch":150,"volume":90}},{"frame":89,"se":{"name":"Sword4","pan":0,"pitch":130,"volume":90}},{"frame":89,"se":{"name":"Slash2","pan":0,"pitch":130,"volume":90}}],"speed":100},
+{"id":27,"displayType":0,"effectName":"PierceSpecial2","flashTimings":[{"frame":0,"duration":31,"color":[255,255,255,255]},{"frame":31,"duration":8,"color":[255,255,255,255]},{"frame":39,"duration":30,"color":[255,255,255,255]},{"frame":69,"duration":30,"color":[255,255,255,255]},{"frame":99,"duration":30,"color":[255,255,255,255]}],"name":"Pierce Special 2","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":120,"soundTimings":[{"frame":0,"se":{"name":"Wind5","pan":0,"pitch":80,"volume":80}},{"frame":2,"se":{"name":"Sword4","pan":0,"pitch":150,"volume":100}},{"frame":4,"se":{"name":"Sword5","pan":0,"pitch":150,"volume":100}},{"frame":6,"se":{"name":"Slash2","pan":0,"pitch":150,"volume":100}},{"frame":7,"se":{"name":"Sword4","pan":0,"pitch":150,"volume":100}},{"frame":9,"se":{"name":"Sword5","pan":0,"pitch":150,"volume":80}},{"frame":10,"se":{"name":"Slash2","pan":0,"pitch":150,"volume":100}},{"frame":13,"se":{"name":"Sword4","pan":0,"pitch":150,"volume":100}},{"frame":16,"se":{"name":"Sword5","pan":0,"pitch":150,"volume":100}},{"frame":17,"se":{"name":"Slash2","pan":0,"pitch":150,"volume":100}},{"frame":19,"se":{"name":"Sword4","pan":0,"pitch":150,"volume":80}},{"frame":23,"se":{"name":"Sword4","pan":0,"pitch":150,"volume":100}},{"frame":27,"se":{"name":"Sword5","pan":0,"pitch":150,"volume":100}},{"frame":31,"se":{"name":"Slash2","pan":0,"pitch":150,"volume":100}},{"frame":39,"se":{"name":"Sword5","pan":0,"pitch":150,"volume":100}},{"frame":43,"se":{"name":"Sword4","pan":0,"pitch":150,"volume":100}}],"speed":100},
+{"id":28,"displayType":0,"effectName":"ClawSpecial","flashTimings":[{"frame":0,"duration":30,"color":[255,119,153,187]},{"frame":30,"duration":30,"color":[255,119,153,187]},{"frame":74,"duration":30,"color":[255,119,153,187]}],"name":"Claw Special","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":120,"soundTimings":[{"frame":0,"se":{"name":"Attack3","pan":0,"pitch":100,"volume":80}},{"frame":1,"se":{"name":"Slash2","pan":0,"pitch":100,"volume":80}},{"frame":3,"se":{"name":"Attack2","pan":0,"pitch":150,"volume":90}},{"frame":4,"se":{"name":"Slash3","pan":0,"pitch":100,"volume":80}},{"frame":6,"se":{"name":"Attack2","pan":0,"pitch":150,"volume":90}},{"frame":7,"se":{"name":"Slash2","pan":0,"pitch":100,"volume":80}},{"frame":9,"se":{"name":"Attack2","pan":0,"pitch":150,"volume":90}},{"frame":10,"se":{"name":"Slash3","pan":0,"pitch":100,"volume":80}},{"frame":16,"se":{"name":"Attack2","pan":0,"pitch":150,"volume":90}},{"frame":17,"se":{"name":"Slash1","pan":0,"pitch":80,"volume":90}},{"frame":21,"se":{"name":"Attack2","pan":0,"pitch":150,"volume":90}},{"frame":25,"se":{"name":"Slash3","pan":0,"pitch":100,"volume":80}},{"frame":29,"se":{"name":"Attack2","pan":0,"pitch":150,"volume":90}},{"frame":30,"se":{"name":"Slash1","pan":0,"pitch":80,"volume":90}},{"frame":41,"se":{"name":"Attack2","pan":0,"pitch":150,"volume":90}},{"frame":41,"se":{"name":"Slash1","pan":0,"pitch":80,"volume":90}},{"frame":74,"se":{"name":"Attack2","pan":0,"pitch":150,"volume":90}},{"frame":74,"se":{"name":"Slash1","pan":0,"pitch":80,"volume":90}}],"speed":100},
+{"id":29,"displayType":0,"effectName":"ArrowSpecial","flashTimings":[{"frame":2,"duration":3,"color":[255,255,204,204]},{"frame":5,"duration":3,"color":[255,255,204,204]},{"frame":8,"duration":3,"color":[255,255,204,204]},{"frame":13,"duration":3,"color":[255,255,204,204]},{"frame":24,"duration":10,"color":[255,255,204,204]},{"frame":49,"duration":20,"color":[255,255,204,204]}],"name":"Arrow Special","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Crossbow","pan":0,"pitch":100,"volume":100}},{"frame":2,"se":{"name":"Attack3","pan":0,"pitch":150,"volume":90}},{"frame":5,"se":{"name":"Attack3","pan":0,"pitch":150,"volume":90}},{"frame":8,"se":{"name":"Battle3","pan":0,"pitch":150,"volume":90}},{"frame":13,"se":{"name":"Battle3","pan":0,"pitch":150,"volume":90}},{"frame":13,"se":{"name":"Wind6","pan":0,"pitch":150,"volume":90}}],"speed":100},
+{"id":30,"displayType":0,"effectName":"GeneralSpecial1","flashTimings":[{"frame":1,"duration":30,"color":[255,170,119,204]},{"frame":5,"duration":30,"color":[255,255,255,204]},{"frame":8,"duration":30,"color":[255,170,119,204]},{"frame":12,"duration":30,"color":[255,255,255,187]},{"frame":15,"duration":30,"color":[255,255,187,221]},{"frame":17,"duration":30,"color":[255,255,187,221]},{"frame":22,"duration":30,"color":[255,255,255,187]},{"frame":25,"duration":30,"color":[255,170,119,204]},{"frame":31,"duration":30,"color":[255,255,187,221]},{"frame":35,"duration":30,"color":[255,255,255,187]},{"frame":39,"duration":50,"color":[255,170,119,204]},{"frame":49,"duration":30,"color":[255,255,187,221]},{"frame":54,"duration":30,"color":[255,255,255,187]},{"frame":64,"duration":50,"color":[255,170,119,204]},{"frame":99,"duration":50,"color":[255,170,119,204]}],"name":"General Special 1","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":120,"soundTimings":[{"frame":1,"se":{"name":"Slash1","pan":0,"pitch":110,"volume":100}},{"frame":5,"se":{"name":"Slash4","pan":0,"pitch":90,"volume":100}},{"frame":8,"se":{"name":"Slash5","pan":0,"pitch":90,"volume":100}},{"frame":12,"se":{"name":"Slash2","pan":0,"pitch":110,"volume":100}},{"frame":15,"se":{"name":"Slash1","pan":0,"pitch":120,"volume":100}},{"frame":17,"se":{"name":"Damage2","pan":0,"pitch":110,"volume":100}},{"frame":22,"se":{"name":"Slash2","pan":0,"pitch":110,"volume":100}},{"frame":25,"se":{"name":"Slash1","pan":0,"pitch":120,"volume":100}},{"frame":35,"se":{"name":"Damage2","pan":0,"pitch":110,"volume":100}},{"frame":41,"se":{"name":"Slash2","pan":0,"pitch":110,"volume":100}},{"frame":49,"se":{"name":"Slash1","pan":0,"pitch":120,"volume":100}},{"frame":89,"se":{"name":"Damage2","pan":0,"pitch":110,"volume":100}},{"frame":95,"se":{"name":"Slash2","pan":0,"pitch":110,"volume":100}},{"frame":104,"se":{"name":"Slash1","pan":0,"pitch":120,"volume":100}}],"speed":100},
+{"id":31,"displayType":0,"effectName":"GeneralSpecial2","flashTimings":[{"frame":0,"duration":10,"color":[255,255,255,255]},{"frame":1,"duration":10,"color":[255,255,255,255]},{"frame":5,"duration":10,"color":[255,255,255,255]},{"frame":8,"duration":10,"color":[255,255,255,255]},{"frame":11,"duration":10,"color":[255,255,255,255]},{"frame":15,"duration":10,"color":[255,255,255,255]},{"frame":19,"duration":10,"color":[255,255,255,255]},{"frame":25,"duration":30,"color":[255,255,255,255]},{"frame":34,"duration":10,"color":[255,255,255,255]},{"frame":39,"duration":10,"color":[255,255,255,255]},{"frame":44,"duration":30,"color":[255,255,255,255]}],"name":"General Special 2","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Thunder3","pan":0,"pitch":90,"volume":90}},{"frame":1,"se":{"name":"Slash1","pan":0,"pitch":110,"volume":100}},{"frame":5,"se":{"name":"Slash1","pan":0,"pitch":110,"volume":100}},{"frame":8,"se":{"name":"Thunder3","pan":0,"pitch":90,"volume":90}},{"frame":11,"se":{"name":"Slash1","pan":0,"pitch":110,"volume":100}},{"frame":15,"se":{"name":"Slash1","pan":0,"pitch":110,"volume":100}},{"frame":19,"se":{"name":"Thunder3","pan":0,"pitch":90,"volume":90}},{"frame":25,"se":{"name":"Slash3","pan":0,"pitch":100,"volume":100}}],"speed":100},
+{"id":32,"displayType":2,"effectName":"Breath","flashTimings":[{"frame":4,"duration":15,"color":[255,102,0,204]},{"frame":14,"duration":15,"color":[255,102,0,204]},{"frame":24,"duration":15,"color":[255,102,0,204]},{"frame":34,"duration":15,"color":[255,102,0,204]},{"frame":44,"duration":15,"color":[255,102,0,204]},{"frame":54,"duration":15,"color":[255,102,0,204]},{"frame":64,"duration":15,"color":[255,102,0,204]},{"frame":74,"duration":15,"color":[255,102,0,204]}],"name":"Breath","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":200,"soundTimings":[{"frame":0,"se":{"name":"Fire3","pan":0,"pitch":70,"volume":90}},{"frame":1,"se":{"name":"Thunder1","pan":0,"pitch":50,"volume":90}}],"speed":100},
+{"id":33,"displayType":2,"effectName":"Pollen","flashTimings":[{"frame":3,"duration":30,"color":[255,85,238,204]},{"frame":5,"duration":30,"color":[255,85,238,204]},{"frame":7,"duration":30,"color":[255,85,238,187]},{"frame":9,"duration":30,"color":[255,85,238,170]},{"frame":29,"duration":50,"color":[255,85,238,153]},{"frame":59,"duration":50,"color":[255,85,238,120]}],"name":"Pollen","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":200,"soundTimings":[{"frame":0,"se":{"name":"Darkness4","pan":0,"pitch":60,"volume":90}},{"frame":0,"se":{"name":"Darkness3","pan":0,"pitch":50,"volume":90}}],"speed":100},
+{"id":34,"displayType":2,"effectName":"SonicWave","flashTimings":[{"frame":2,"duration":25,"color":[255,221,170,170]},{"frame":29,"duration":25,"color":[255,221,170,170]},{"frame":59,"duration":25,"color":[255,221,170,170]},{"frame":89,"duration":25,"color":[255,221,170,100]}],"name":"SonicWave","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Sound3","pan":0,"pitch":100,"volume":90}}],"speed":100},
+{"id":35,"displayType":2,"effectName":"Fog","flashTimings":[{"frame":29,"duration":90,"color":[136,153,170,150]}],"name":"Fog","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Blind","pan":0,"pitch":70,"volume":90}},{"frame":0,"se":{"name":"Sand","pan":0,"pitch":110,"volume":90}}],"speed":100},
+{"id":36,"displayType":2,"effectName":"Song","flashTimings":[{"frame":19,"duration":30,"color":[221,221,255,136]},{"frame":24,"duration":30,"color":[255,255,255,170]},{"frame":34,"duration":30,"color":[255,170,255,170]},{"frame":54,"duration":50,"color":[255,170,255,170]}],"name":"Song","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Ice4","pan":0,"pitch":110,"volume":90}}],"speed":100},
+{"id":37,"displayType":2,"effectName":"Shout","flashTimings":[{"frame":0,"duration":10,"color":[255,255,0,153]},{"frame":9,"duration":10,"color":[255,255,0,136]},{"frame":19,"duration":10,"color":[255,255,0,136]},{"frame":29,"duration":10,"color":[255,255,0,136]},{"frame":39,"duration":30,"color":[255,255,0,136]}],"name":"Shout","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Monster1","pan":0,"pitch":100,"volume":100}}],"speed":100},
+{"id":38,"displayType":0,"effectName":"Sweep","flashTimings":[{"frame":2,"duration":30,"color":[255,255,255,255]}],"name":"Sweep","offsetX":0,"offsetY":30,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Wind7","pan":0,"pitch":50,"volume":90}},{"frame":2,"se":{"name":"Blow2","pan":0,"pitch":70,"volume":100}}],"speed":100},
+{"id":39,"displayType":0,"effectName":"Bodyslam","flashTimings":[{"frame":2,"duration":30,"color":[255,255,255,255]}],"name":"Bodyslam","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Thunder2","pan":0,"pitch":80,"volume":90}},{"frame":2,"se":{"name":"Thunder8","pan":0,"pitch":100,"volume":90}},{"frame":2,"se":{"name":"Blow3","pan":0,"pitch":50,"volume":100}}],"speed":100},
+{"id":40,"displayType":2,"effectName":"Flash","flashTimings":[{"frame":2,"duration":30,"color":[255,255,255,255]},{"frame":19,"duration":10,"color":[255,255,255,255]},{"frame":24,"duration":10,"color":[255,255,255,255]}],"name":"Flash","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":150,"soundTimings":[{"frame":0,"se":{"name":"Flash2","pan":0,"pitch":130,"volume":90}},{"frame":1,"se":{"name":"Sword1","pan":0,"pitch":50,"volume":90}}],"speed":100},
+{"id":41,"displayType":0,"effectName":"HealOne1","flashTimings":[{"frame":0,"duration":10,"color":[0,255,0,102]},{"frame":9,"duration":30,"color":[102,255,0,102]},{"frame":19,"duration":30,"color":[136,255,0,102]},{"frame":29,"duration":30,"color":[136,255,0,102]}],"name":"Heal One 1","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Heal3","pan":0,"pitch":100,"volume":90}},{"frame":0,"se":{"name":"Saint2","pan":0,"pitch":100,"volume":90}}],"speed":100},
+{"id":42,"displayType":0,"effectName":"HealOne2","flashTimings":[{"frame":0,"duration":10,"color":[0,255,0,102]},{"frame":9,"duration":30,"color":[0,255,0,102]},{"frame":29,"duration":30,"color":[136,255,0,102]},{"frame":49,"duration":30,"color":[136,255,0,102]},{"frame":69,"duration":30,"color":[136,255,0,102]},{"frame":89,"duration":30,"color":[136,255,0,102]}],"name":"Heal One 2","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Starlight","pan":0,"pitch":150,"volume":80}},{"frame":0,"se":{"name":"Saint2","pan":0,"pitch":100,"volume":100}}],"speed":100},
+{"id":43,"displayType":2,"effectName":"HealAll1","flashTimings":[{"frame":0,"duration":10,"color":[0,255,0,170]},{"frame":19,"duration":5,"color":[0,255,0,102]},{"frame":29,"duration":30,"color":[0,255,0,102]}],"name":"Heal All 1","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Saint4","pan":0,"pitch":150,"volume":90}},{"frame":1,"se":{"name":"Ice4","pan":0,"pitch":150,"volume":90}},{"frame":3,"se":{"name":"Heal1","pan":0,"pitch":150,"volume":90}},{"frame":4,"se":{"name":"Ice5","pan":0,"pitch":100,"volume":90}}],"speed":100},
+{"id":44,"displayType":2,"effectName":"HealAll2","flashTimings":[{"frame":0,"duration":10,"color":[255,255,0,170]},{"frame":19,"duration":5,"color":[255,255,0,102]},{"frame":29,"duration":30,"color":[255,255,0,102]}],"name":"Heal All 2","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Ice1","pan":0,"pitch":100,"volume":90}},{"frame":8,"se":{"name":"Evasion2","pan":0,"pitch":50,"volume":90}},{"frame":9,"se":{"name":"Flash2","pan":0,"pitch":50,"volume":50}},{"frame":9,"se":{"name":"Ice4","pan":0,"pitch":100,"volume":80}}],"speed":100},
+{"id":45,"displayType":0,"effectName":"CureOne1","flashTimings":[{"frame":0,"duration":10,"color":[0,255,0,102]},{"frame":9,"duration":30,"color":[102,255,0,102]},{"frame":19,"duration":30,"color":[136,255,0,102]},{"frame":29,"duration":30,"color":[136,255,0,102]}],"name":"Cure One 1","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":1,"se":{"name":"Ice1","pan":0,"pitch":100,"volume":90}},{"frame":2,"se":{"name":"Recovery","pan":0,"pitch":70,"volume":90}},{"frame":6,"se":{"name":"Ice4","pan":0,"pitch":100,"volume":90}}],"speed":100},
+{"id":46,"displayType":0,"effectName":"CureOne2","flashTimings":[{"frame":0,"duration":10,"color":[0,255,0,102]},{"frame":9,"duration":30,"color":[102,255,0,102]},{"frame":29,"duration":30,"color":[136,255,0,102]},{"frame":49,"duration":30,"color":[136,255,0,102]}],"name":"Cure One 2","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Ice1","pan":0,"pitch":90,"volume":90}},{"frame":2,"se":{"name":"Ice4","pan":0,"pitch":100,"volume":90}}],"speed":100},
+{"id":47,"displayType":2,"effectName":"CureAll1","flashTimings":[{"frame":0,"duration":10,"color":[255,255,255,170]},{"frame":19,"duration":5,"color":[153,255,255,102]},{"frame":24,"duration":30,"color":[255,255,255,102]}],"name":"Cure All 1","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Starlight","pan":0,"pitch":150,"volume":80}},{"frame":1,"se":{"name":"Ice4","pan":0,"pitch":120,"volume":90}},{"frame":6,"se":{"name":"Ice1","pan":0,"pitch":100,"volume":90}},{"frame":9,"se":{"name":"Heal3","pan":0,"pitch":120,"volume":90}}],"speed":100},
+{"id":48,"displayType":2,"effectName":"CureAll2","flashTimings":[{"frame":0,"duration":10,"color":[255,255,255,170]},{"frame":19,"duration":5,"color":[153,255,255,170]},{"frame":24,"duration":10,"color":[255,255,255,102]},{"frame":49,"duration":20,"color":[255,255,255,102]}],"name":"Cure All 2","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":150,"soundTimings":[{"frame":0,"se":{"name":"Ice4","pan":0,"pitch":100,"volume":90}},{"frame":0,"se":{"name":"Saint4","pan":0,"pitch":150,"volume":80}}],"speed":100},
+{"id":49,"displayType":0,"effectName":"Revive1","flashTimings":[{"frame":0,"duration":10,"color":[0,255,0,102]},{"frame":9,"duration":30,"color":[102,255,0,102]},{"frame":29,"duration":30,"color":[136,255,0,102]},{"frame":49,"duration":30,"color":[255,255,255,102]}],"name":"Revive 1","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Magic1","pan":0,"pitch":100,"volume":90}},{"frame":3,"se":{"name":"Starlight","pan":0,"pitch":130,"volume":90}},{"frame":4,"se":{"name":"Skill1","pan":0,"pitch":70,"volume":90}}],"speed":100},
+{"id":50,"displayType":0,"effectName":"Revive2","flashTimings":[{"frame":0,"duration":10,"color":[0,255,0,102]},{"frame":9,"duration":30,"color":[102,255,0,102]},{"frame":29,"duration":30,"color":[255,255,255,102]},{"frame":49,"duration":30,"color":[255,255,255,102]}],"name":"Revive 2","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Magic2","pan":0,"pitch":100,"volume":90}},{"frame":9,"se":{"name":"Ice4","pan":0,"pitch":150,"volume":100}},{"frame":13,"se":{"name":"Up3","pan":0,"pitch":130,"volume":80}}],"speed":100},
+{"id":51,"displayType":0,"effectName":"Powerup1","flashTimings":[{"frame":5,"duration":15,"color":[255,187,0,136]},{"frame":19,"duration":30,"color":[255,204,102,102]}],"name":"Power up 1","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Up4","pan":0,"pitch":100,"volume":90}},{"frame":2,"se":{"name":"Magic1","pan":0,"pitch":100,"volume":90}}],"speed":100},
+{"id":52,"displayType":0,"effectName":"Powerup2","flashTimings":[{"frame":5,"duration":20,"color":[255,255,0,119]},{"frame":19,"duration":15,"color":[255,255,0,102]},{"frame":34,"duration":15,"color":[255,255,255,102]}],"name":"Power up 2","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Powerup","pan":0,"pitch":100,"volume":90}},{"frame":4,"se":{"name":"Magic4","pan":0,"pitch":120,"volume":80}}],"speed":100},
+{"id":53,"displayType":0,"effectName":"Powerup3","flashTimings":[{"frame":0,"duration":10,"color":[255,255,255,255]},{"frame":19,"duration":50,"color":[255,153,0,119]}],"name":"Power up 3","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":70,"soundTimings":[{"frame":0,"se":{"name":"Up1","pan":0,"pitch":80,"volume":80}},{"frame":9,"se":{"name":"Ice4","pan":0,"pitch":90,"volume":80}}],"speed":100},
+{"id":54,"displayType":0,"effectName":"Powerdown1","flashTimings":[{"frame":5,"duration":15,"color":[85,0,255,102]},{"frame":19,"duration":30,"color":[85,0,255,68]}],"name":"Power down 1","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Down2","pan":0,"pitch":100,"volume":90}},{"frame":2,"se":{"name":"Magic2","pan":0,"pitch":100,"volume":90}}],"speed":100},
+{"id":55,"displayType":0,"effectName":"Powerdown2","flashTimings":[{"frame":0,"duration":30,"color":[0,0,0,170]},{"frame":29,"duration":30,"color":[85,0,136,170]}],"name":"Power down 2","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Stare","pan":0,"pitch":110,"volume":70}},{"frame":6,"se":{"name":"Earth2","pan":0,"pitch":70,"volume":80}}],"speed":100},
+{"id":56,"displayType":0,"effectName":"Powerdown3","flashTimings":[{"frame":9,"duration":20,"color":[255,255,255,170]},{"frame":39,"duration":30,"color":[170,255,0,170]},{"frame":49,"duration":30,"color":[255,255,119,170]}],"name":"Power down 3","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Blind","pan":0,"pitch":120,"volume":80}},{"frame":59,"se":{"name":"Darkness7","pan":0,"pitch":100,"volume":80}},{"frame":69,"se":{"name":"Darkness8","pan":0,"pitch":100,"volume":80}}],"speed":100},
+{"id":57,"displayType":0,"effectName":"Bind","flashTimings":[{"frame":9,"duration":20,"color":[255,255,255,170]},{"frame":39,"duration":30,"color":[170,255,0,170]},{"frame":49,"duration":30,"color":[255,255,119,170]}],"name":"Bind","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":70,"soundTimings":[{"frame":0,"se":{"name":"Wind5","pan":0,"pitch":80,"volume":90}},{"frame":2,"se":{"name":"Darkness4","pan":0,"pitch":60,"volume":100}},{"frame":5,"se":{"name":"Darkness1","pan":0,"pitch":100,"volume":100}}],"speed":100},
+{"id":58,"displayType":0,"effectName":"Absorb","flashTimings":[{"frame":29,"duration":60,"color":[170,0,136,136]}],"name":"Absorb","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Darkness1","pan":0,"pitch":150,"volume":90}},{"frame":1,"se":{"name":"Twine","pan":0,"pitch":150,"volume":70}},{"frame":1,"se":{"name":"Particles1","pan":0,"pitch":150,"volume":70}}],"speed":100},
+{"id":59,"displayType":0,"effectName":"Poison","flashTimings":[{"frame":29,"duration":60,"color":[68,0,187,170]}],"name":"Poison","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Poison","pan":0,"pitch":100,"volume":90}}],"speed":100},
+{"id":60,"displayType":0,"effectName":"Blind","flashTimings":[{"frame":9,"duration":20,"color":[0,0,0,119]},{"frame":59,"duration":30,"color":[0,0,0,119]},{"frame":89,"duration":50,"color":[0,0,0,119]}],"name":"Blind","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":2,"se":{"name":"Blind","pan":0,"pitch":100,"volume":90}},{"frame":3,"se":{"name":"Darkness2","pan":0,"pitch":80,"volume":50}}],"speed":100},
+{"id":61,"displayType":0,"effectName":"Silence","flashTimings":[{"frame":39,"duration":50,"color":[170,255,255,170]}],"name":"Silence","offsetX":0,"offsetY":0,"rotation":{"x":90,"y":0,"z":0},"scale":80,"soundTimings":[{"frame":0,"se":{"name":"Silence","pan":0,"pitch":100,"volume":90}},{"frame":5,"se":{"name":"Sound2","pan":0,"pitch":80,"volume":70}},{"frame":59,"se":{"name":"Flash1","pan":0,"pitch":70,"volume":70}}],"speed":100},
+{"id":62,"displayType":0,"effectName":"Sleep","flashTimings":[{"frame":9,"duration":10,"color":[255,255,255,102]},{"frame":39,"duration":30,"color":[170,170,238,170]}],"name":"Sleep","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":1,"se":{"name":"Up1","pan":0,"pitch":50,"volume":70}},{"frame":5,"se":{"name":"Sleep","pan":0,"pitch":100,"volume":90}}],"speed":100},
+{"id":63,"displayType":0,"effectName":"Confusion","flashTimings":[{"frame":9,"duration":10,"color":[255,255,255,68]},{"frame":39,"duration":30,"color":[255,136,255,170]}],"name":"Confusion","offsetX":15,"offsetY":-30,"rotation":{"x":0,"y":0,"z":0},"scale":50,"soundTimings":[{"frame":0,"se":{"name":"Absorb2","pan":0,"pitch":50,"volume":80}},{"frame":4,"se":{"name":"Raise2","pan":0,"pitch":70,"volume":80}}],"speed":100},
+{"id":64,"displayType":0,"effectName":"Paralyze","flashTimings":[{"frame":9,"duration":20,"color":[255,255,255,170]},{"frame":39,"duration":30,"color":[170,255,0,170]},{"frame":49,"duration":30,"color":[255,255,119,170]}],"name":"Paralyze","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Darkness1","pan":0,"pitch":150,"volume":90}},{"frame":3,"se":{"name":"Paralyze3","pan":0,"pitch":100,"volume":90}}],"speed":100},
+{"id":65,"displayType":0,"effectName":"Death","flashTimings":[{"frame":14,"duration":30,"color":[255,0,0,187]},{"frame":79,"duration":50,"color":[255,0,0,187]}],"name":"Death","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":1,"se":{"name":"Stare","pan":0,"pitch":120,"volume":90}},{"frame":44,"se":{"name":"Darkness5","pan":0,"pitch":90,"volume":80}}],"speed":100},
+{"id":66,"displayType":0,"effectName":"FireOne1","flashTimings":[{"frame":9,"duration":30,"color":[255,170,51,204]},{"frame":39,"duration":30,"color":[255,170,51,204]}],"name":"Fire One 1","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Fire8","pan":0,"pitch":90,"volume":80}}],"speed":100},
+{"id":67,"displayType":0,"effectName":"FireOne2","flashTimings":[{"frame":9,"duration":30,"color":[255,170,51,204]}],"name":"Fire One 2","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Fire9","pan":0,"pitch":150,"volume":80}}],"speed":100},
+{"id":68,"displayType":1,"effectName":"FireAll1","flashTimings":[{"frame":9,"duration":30,"color":[255,221,51,204]},{"frame":29,"duration":30,"color":[187,102,102,68]},{"frame":49,"duration":30,"color":[255,221,51,204]},{"frame":79,"duration":50,"color":[187,102,102,68]}],"name":"Fire All 1","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Fire8","pan":0,"pitch":70,"volume":80}}],"speed":100},
+{"id":69,"displayType":2,"effectName":"FireAll2","flashTimings":[{"frame":9,"duration":50,"color":[255,221,51,204]},{"frame":29,"duration":30,"color":[255,102,102,136]}],"name":"Fire All 2","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Fire8","pan":0,"pitch":70,"volume":80}}],"speed":100},
+{"id":70,"displayType":2,"effectName":"FireAll3","flashTimings":[{"frame":29,"duration":50,"color":[255,221,51,204]},{"frame":49,"duration":30,"color":[255,102,102,136]}],"name":"Fire All 3","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Fire8","pan":0,"pitch":70,"volume":80}}],"speed":100},
+{"id":71,"displayType":0,"effectName":"IceOne1","flashTimings":[{"frame":19,"duration":80,"color":[119,204,255,153]}],"name":"Ice One 1","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Starlight","pan":0,"pitch":150,"volume":80}},{"frame":1,"se":{"name":"Wind1","pan":0,"pitch":80,"volume":70}},{"frame":3,"se":{"name":"Crash","pan":0,"pitch":150,"volume":90}},{"frame":9,"se":{"name":"Ice11","pan":0,"pitch":100,"volume":90}},{"frame":13,"se":{"name":"Sword2","pan":0,"pitch":150,"volume":90}}],"speed":100},
+{"id":72,"displayType":0,"effectName":"IceOne2","flashTimings":[{"frame":19,"duration":50,"color":[119,204,255,153]}],"name":"Ice One 2","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Ice4","pan":0,"pitch":100,"volume":90}},{"frame":0,"se":{"name":"Thunder1","pan":0,"pitch":150,"volume":90}}],"speed":100},
+{"id":73,"displayType":1,"effectName":"IceAll1","flashTimings":[{"frame":29,"duration":25,"color":[119,204,153,204]},{"frame":99,"duration":50,"color":[119,204,255,204]}],"name":"Ice All 1","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Thunder4","pan":0,"pitch":150,"volume":90}},{"frame":5,"se":{"name":"Flash2","pan":0,"pitch":150,"volume":90}},{"frame":16,"se":{"name":"Earth1","pan":0,"pitch":130,"volume":70}},{"frame":17,"se":{"name":"Ice5","pan":0,"pitch":100,"volume":90}},{"frame":89,"se":{"name":"Ice11","pan":0,"pitch":100,"volume":90}}],"speed":100},
+{"id":74,"displayType":2,"effectName":"IceAll2","flashTimings":[{"frame":29,"duration":80,"color":[170,204,255,153]}],"name":"Ice All 2","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Wind6","pan":0,"pitch":80,"volume":90}},{"frame":2,"se":{"name":"Thunder6","pan":0,"pitch":90,"volume":80}},{"frame":0,"se":{"name":"Ice10","pan":0,"pitch":90,"volume":80}}],"speed":100},
+{"id":75,"displayType":2,"effectName":"IceAll3","flashTimings":[{"frame":29,"duration":25,"color":[170,204,255,204]},{"frame":59,"duration":50,"color":[170,204,255,204]}],"name":"Ice All 3","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Wind2","pan":0,"pitch":70,"volume":65}},{"frame":0,"se":{"name":"Magic1","pan":0,"pitch":100,"volume":80}},{"frame":9,"se":{"name":"Ice10","pan":0,"pitch":100,"volume":80}},{"frame":19,"se":{"name":"Crash","pan":0,"pitch":150,"volume":70}},{"frame":23,"se":{"name":"Ice5","pan":0,"pitch":100,"volume":90}}],"speed":100},
+{"id":76,"displayType":0,"effectName":"ThunderOne1","flashTimings":[{"frame":9,"duration":50,"color":[255,255,255,204]}],"name":"Thunder One 1","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Thunder6","pan":0,"pitch":100,"volume":90}}],"speed":100},
+{"id":77,"displayType":0,"effectName":"ThunderOne2","flashTimings":[{"frame":9,"duration":30,"color":[119,255,170,204]},{"frame":29,"duration":30,"color":[255,255,255,204]}],"name":"Thunder One 2","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Thunder3","pan":0,"pitch":100,"volume":90}},{"frame":0,"se":{"name":"Thunder8","pan":0,"pitch":100,"volume":90}}],"speed":100},
+{"id":78,"displayType":1,"effectName":"ThunderAll1","flashTimings":[{"frame":0,"duration":50,"color":[255,255,119,153]},{"frame":29,"duration":20,"color":[255,255,136,204]},{"frame":59,"duration":20,"color":[255,255,255,204]}],"name":"Thunder All 1","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":120,"soundTimings":[{"frame":0,"se":{"name":"Thunder1","pan":0,"pitch":150,"volume":90}},{"frame":1,"se":{"name":"Paralyze1","pan":0,"pitch":150,"volume":90}},{"frame":49,"se":{"name":"Thunder1","pan":0,"pitch":150,"volume":90}},{"frame":50,"se":{"name":"Paralyze1","pan":0,"pitch":150,"volume":90}}],"speed":100},
+{"id":79,"displayType":2,"effectName":"ThunderAll2","flashTimings":[{"frame":0,"duration":50,"color":[255,255,119,153]},{"frame":29,"duration":20,"color":[255,255,136,204]}],"name":"Thunder All 2","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":150,"soundTimings":[{"frame":0,"se":{"name":"Thunder10","pan":0,"pitch":120,"volume":100}},{"frame":1,"se":{"name":"Thunder9","pan":0,"pitch":100,"volume":100}}],"speed":100},
+{"id":80,"displayType":2,"effectName":"ThunderAll3","flashTimings":[{"frame":29,"duration":50,"color":[255,255,119,153]},{"frame":49,"duration":10,"color":[255,255,136,204]},{"frame":79,"duration":20,"color":[255,255,255,204]}],"name":"Thunder All 3","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Wind2","pan":0,"pitch":75,"volume":65}},{"frame":0,"se":{"name":"Magic1","pan":0,"pitch":100,"volume":80}},{"frame":59,"se":{"name":"Thunder9","pan":0,"pitch":100,"volume":90}},{"frame":59,"se":{"name":"Paralyze1","pan":0,"pitch":100,"volume":75}},{"frame":79,"se":{"name":"Paralyze1","pan":0,"pitch":100,"volume":75}}],"speed":100},
+{"id":81,"displayType":0,"effectName":"WaterOne1","flashTimings":[{"frame":19,"duration":60,"color":[170,204,255,204]}],"name":"Water One 1","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Water5","pan":0,"pitch":100,"volume":90}},{"frame":19,"se":{"name":"Water2","pan":0,"pitch":130,"volume":90}}],"speed":100},
+{"id":82,"displayType":0,"effectName":"WaterOne2","flashTimings":[{"frame":19,"duration":60,"color":[170,204,255,204]}],"name":"Water One 2","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Dive","pan":0,"pitch":135,"volume":90}},{"frame":6,"se":{"name":"Water1","pan":0,"pitch":100,"volume":100}}],"speed":100},
+{"id":83,"displayType":1,"effectName":"WaterAll1","flashTimings":[{"frame":19,"duration":30,"color":[170,204,255,204]},{"frame":59,"duration":80,"color":[170,204,255,204]}],"name":"Water All 1","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Water5","pan":0,"pitch":100,"volume":90}},{"frame":11,"se":{"name":"Water4","pan":0,"pitch":90,"volume":90}},{"frame":13,"se":{"name":"Water1","pan":0,"pitch":90,"volume":90}},{"frame":59,"se":{"name":"Water1","pan":0,"pitch":90,"volume":90}},{"frame":59,"se":{"name":"Water4","pan":0,"pitch":90,"volume":90}}],"speed":100},
+{"id":84,"displayType":2,"effectName":"WaterAll2","flashTimings":[{"frame":19,"duration":20,"color":[170,204,255,204]},{"frame":49,"duration":20,"color":[170,204,255,204]},{"frame":79,"duration":20,"color":[170,204,255,204]}],"name":"Water All 2","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Water1","pan":0,"pitch":50,"volume":90}}],"speed":100},
+{"id":85,"displayType":2,"effectName":"WaterAll3","flashTimings":[{"frame":29,"duration":50,"color":[170,204,255,204]},{"frame":59,"duration":20,"color":[170,204,255,204]},{"frame":89,"duration":20,"color":[170,204,255,204]},{"frame":119,"duration":50,"color":[170,204,255,204]}],"name":"Water All 3","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Wind2","pan":0,"pitch":70,"volume":65}},{"frame":0,"se":{"name":"Magic1","pan":0,"pitch":100,"volume":80}},{"frame":9,"se":{"name":"Wind1","pan":0,"pitch":120,"volume":75}},{"frame":23,"se":{"name":"Water1","pan":0,"pitch":50,"volume":90}},{"frame":59,"se":{"name":"Water2","pan":0,"pitch":50,"volume":90}},{"frame":59,"se":{"name":"Water1","pan":0,"pitch":50,"volume":90}}],"speed":100},
+{"id":86,"displayType":0,"effectName":"EarthOne1","flashTimings":[{"frame":0,"duration":30,"color":[255,221,170,170]},{"frame":9,"duration":30,"color":[255,221,170,170]}],"name":"Earth One 1","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Earth1","pan":0,"pitch":150,"volume":90}},{"frame":5,"se":{"name":"Break","pan":0,"pitch":100,"volume":90}}],"speed":100},
+{"id":87,"displayType":0,"effectName":"EarthOne2","flashTimings":[{"frame":19,"duration":30,"color":[255,221,170,170]}],"name":"Earth One 2","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Thunder2","pan":0,"pitch":50,"volume":90}},{"frame":0,"se":{"name":"Earth5","pan":0,"pitch":100,"volume":100}},{"frame":29,"se":{"name":"Fire3","pan":0,"pitch":150,"volume":90}}],"speed":100},
+{"id":88,"displayType":1,"effectName":"EarthAll1","flashTimings":[{"frame":0,"duration":10,"color":[255,221,170,170]},{"frame":14,"duration":30,"color":[255,221,170,170]}],"name":"Earth All 1","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":5,"se":{"name":"Earth1","pan":0,"pitch":150,"volume":90}},{"frame":5,"se":{"name":"Fire3","pan":0,"pitch":150,"volume":90}},{"frame":79,"se":{"name":"Earth3","pan":0,"pitch":140,"volume":90}},{"frame":79,"se":{"name":"Fire1","pan":0,"pitch":150,"volume":90}},{"frame":79,"se":{"name":"Sand","pan":0,"pitch":100,"volume":100}}],"speed":100},
+{"id":89,"displayType":2,"effectName":"EarthAll2","flashTimings":[{"frame":0,"duration":20,"color":[255,221,170,170]},{"frame":29,"duration":50,"color":[255,221,170,170]}],"name":"Earth All 2","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Earth4","pan":0,"pitch":100,"volume":100}},{"frame":1,"se":{"name":"Earth1","pan":0,"pitch":100,"volume":100}},{"frame":3,"se":{"name":"Earth5","pan":0,"pitch":100,"volume":100}},{"frame":89,"se":{"name":"Sand","pan":0,"pitch":100,"volume":100}}],"speed":100},
+{"id":90,"displayType":2,"effectName":"EarthAll3","flashTimings":[{"frame":29,"duration":50,"color":[255,221,170,170]},{"frame":59,"duration":20,"color":[255,221,170,170]},{"frame":89,"duration":20,"color":[255,221,170,170]},{"frame":119,"duration":50,"color":[255,221,170,170]}],"name":"Earth All 3","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Wind2","pan":0,"pitch":70,"volume":65}},{"frame":0,"se":{"name":"Magic1","pan":0,"pitch":100,"volume":80}},{"frame":44,"se":{"name":"Earth2","pan":0,"pitch":125,"volume":75}},{"frame":69,"se":{"name":"Earth4","pan":0,"pitch":125,"volume":75}},{"frame":69,"se":{"name":"Earth1","pan":0,"pitch":125,"volume":75}}],"speed":100},
+{"id":91,"displayType":0,"effectName":"WindOne1","flashTimings":[{"frame":9,"duration":30,"color":[255,255,255,170]}],"name":"Wind One 1","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Wind5","pan":0,"pitch":80,"volume":90}}],"speed":100},
+{"id":92,"displayType":0,"effectName":"WindOne2","flashTimings":[{"frame":9,"duration":40,"color":[255,255,255,170]},{"frame":39,"duration":30,"color":[255,255,255,204]},{"frame":79,"duration":30,"color":[119,255,0,85]}],"name":"Wind One 2","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":150,"soundTimings":[{"frame":0,"se":{"name":"Wind3","pan":0,"pitch":140,"volume":90}},{"frame":4,"se":{"name":"Wind5","pan":0,"pitch":140,"volume":90}},{"frame":14,"se":{"name":"Wind3","pan":0,"pitch":140,"volume":90}},{"frame":19,"se":{"name":"Wind5","pan":0,"pitch":140,"volume":90}}],"speed":100},
+{"id":93,"displayType":1,"effectName":"WindAll1","flashTimings":[{"frame":0,"duration":30,"color":[255,255,255,170]},{"frame":39,"duration":30,"color":[170,255,0,170]}],"name":"Wind All 1","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Wind5","pan":0,"pitch":120,"volume":90}},{"frame":2,"se":{"name":"Wind2","pan":0,"pitch":150,"volume":90}},{"frame":5,"se":{"name":"Wind2","pan":0,"pitch":150,"volume":90}},{"frame":8,"se":{"name":"Wind2","pan":0,"pitch":150,"volume":90}},{"frame":29,"se":{"name":"Sand","pan":0,"pitch":150,"volume":90}}],"speed":100},
+{"id":94,"displayType":2,"effectName":"WindAll2","flashTimings":[{"frame":19,"duration":20,"color":[170,255,0,170]},{"frame":49,"duration":20,"color":[255,255,255,170]},{"frame":79,"duration":20,"color":[170,255,0,170]}],"name":"Wind All 2","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Wind5","pan":0,"pitch":80,"volume":100}},{"frame":1,"se":{"name":"Sand","pan":0,"pitch":70,"volume":100}}],"speed":100},
+{"id":95,"displayType":2,"effectName":"WindAll3","flashTimings":[{"frame":29,"duration":50,"color":[170,255,0,170]},{"frame":59,"duration":20,"color":[170,255,0,102]},{"frame":89,"duration":20,"color":[255,255,255,170]},{"frame":139,"duration":50,"color":[170,255,0,136]}],"name":"Wind All 3","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Wind2","pan":0,"pitch":75,"volume":65}},{"frame":0,"se":{"name":"Magic1","pan":0,"pitch":100,"volume":80}},{"frame":29,"se":{"name":"Wind2","pan":0,"pitch":125,"volume":75}},{"frame":49,"se":{"name":"Skill2","pan":0,"pitch":100,"volume":90}},{"frame":79,"se":{"name":"Wind3","pan":0,"pitch":140,"volume":65}},{"frame":79,"se":{"name":"Skill1","pan":0,"pitch":100,"volume":90}},{"frame":109,"se":{"name":"Wind3","pan":0,"pitch":140,"volume":65}},{"frame":129,"se":{"name":"Wind3","pan":0,"pitch":140,"volume":65}}],"speed":100},
+{"id":96,"displayType":0,"effectName":"LightOne1","flashTimings":[{"frame":0,"duration":30,"color":[255,255,255,136]},{"frame":39,"duration":50,"color":[255,255,255,170]}],"name":"Light One 1","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Up3","pan":0,"pitch":100,"volume":90}},{"frame":14,"se":{"name":"Reflection","pan":0,"pitch":150,"volume":90}},{"frame":14,"se":{"name":"Sword4","pan":0,"pitch":150,"volume":90}},{"frame":19,"se":{"name":"Reflection","pan":0,"pitch":150,"volume":90}}],"speed":100},
+{"id":97,"displayType":0,"effectName":"LightOne2","flashTimings":[{"frame":0,"duration":10,"color":[255,255,0,136]},{"frame":9,"duration":20,"color":[255,255,255,136]},{"frame":39,"duration":50,"color":[255,255,255,170]}],"name":"Light One 2","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Ice3","pan":0,"pitch":70,"volume":90}},{"frame":3,"se":{"name":"Saint4","pan":0,"pitch":115,"volume":90}}],"speed":100},
+{"id":98,"displayType":1,"effectName":"LightAll1","flashTimings":[{"frame":29,"duration":10,"color":[255,255,0,136]},{"frame":39,"duration":20,"color":[255,255,255,136]},{"frame":69,"duration":50,"color":[255,255,255,170]}],"name":"Light All 1","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Starlight","pan":0,"pitch":150,"volume":90}},{"frame":1,"se":{"name":"Ice5","pan":0,"pitch":100,"volume":90}},{"frame":2,"se":{"name":"Up1","pan":0,"pitch":80,"volume":90}},{"frame":64,"se":{"name":"Sword2","pan":0,"pitch":150,"volume":90}},{"frame":74,"se":{"name":"Sword2","pan":0,"pitch":150,"volume":90}},{"frame":84,"se":{"name":"Sword2","pan":0,"pitch":150,"volume":90}}],"speed":100},
+{"id":99,"displayType":2,"effectName":"LightAll2","flashTimings":[{"frame":0,"duration":20,"color":[255,255,255,204]},{"frame":29,"duration":30,"color":[255,255,255,136]},{"frame":69,"duration":50,"color":[255,255,255,170]}],"name":"Light All 2","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Skill1","pan":0,"pitch":100,"volume":100}},{"frame":8,"se":{"name":"Explosion1","pan":0,"pitch":150,"volume":100}},{"frame":8,"se":{"name":"Saint4","pan":0,"pitch":120,"volume":100}},{"frame":59,"se":{"name":"Explosion4","pan":0,"pitch":150,"volume":100}}],"speed":100},
+{"id":100,"displayType":2,"effectName":"LightAll3","flashTimings":[{"frame":29,"duration":50,"color":[255,255,255,204]},{"frame":79,"duration":30,"color":[255,255,255,136]},{"frame":139,"duration":50,"color":[255,255,255,170]}],"name":"Light All 3","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Wind2","pan":0,"pitch":70,"volume":65}},{"frame":0,"se":{"name":"Magic1","pan":0,"pitch":100,"volume":80}},{"frame":9,"se":{"name":"Skill3","pan":0,"pitch":110,"volume":75}},{"frame":19,"se":{"name":"Ice4","pan":0,"pitch":100,"volume":90}},{"frame":27,"se":{"name":"Ice3","pan":0,"pitch":100,"volume":90}},{"frame":59,"se":{"name":"Wind2","pan":0,"pitch":150,"volume":90}},{"frame":79,"se":{"name":"Wind2","pan":0,"pitch":150,"volume":90}},{"frame":89,"se":{"name":"Wind2","pan":0,"pitch":150,"volume":90}},{"frame":119,"se":{"name":"Magic12","pan":0,"pitch":100,"volume":90}}],"speed":100},
+{"id":101,"displayType":0,"effectName":"DarknessOne1","flashTimings":[{"frame":0,"duration":20,"color":[0,0,0,204]},{"frame":29,"duration":20,"color":[0,0,0,204]},{"frame":49,"duration":20,"color":[0,0,0,170]}],"name":"Darkness One 1","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Darkness1","pan":0,"pitch":150,"volume":90}}],"speed":100},
+{"id":102,"displayType":0,"effectName":"DarknessOne2","flashTimings":[{"frame":0,"duration":20,"color":[0,0,0,204]},{"frame":29,"duration":20,"color":[0,0,0,204]},{"frame":49,"duration":20,"color":[0,0,0,170]},{"frame":99,"duration":50,"color":[0,0,0,136]}],"name":"Darkness One 2","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":80,"soundTimings":[{"frame":0,"se":{"name":"Darkness3","pan":0,"pitch":100,"volume":90}},{"frame":59,"se":{"name":"Darkness1","pan":0,"pitch":130,"volume":90}}],"speed":100},
+{"id":103,"displayType":1,"effectName":"DarknessAll1","flashTimings":[{"frame":0,"duration":20,"color":[0,0,0,136]},{"frame":89,"duration":20,"color":[0,0,0,170]},{"frame":129,"duration":50,"color":[0,0,0,204]}],"name":"Darkness All 1","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Darkness4","pan":0,"pitch":100,"volume":90}},{"frame":9,"se":{"name":"Thunder3","pan":0,"pitch":50,"volume":90}},{"frame":69,"se":{"name":"Fire9","pan":0,"pitch":50,"volume":90}},{"frame":79,"se":{"name":"Fire9","pan":0,"pitch":150,"volume":90}},{"frame":89,"se":{"name":"Fire9","pan":0,"pitch":150,"volume":90}},{"frame":99,"se":{"name":"Fire9","pan":0,"pitch":150,"volume":90}}],"speed":100},
+{"id":104,"displayType":2,"effectName":"DarknessAll2","flashTimings":[{"frame":0,"duration":20,"color":[0,0,0,204]},{"frame":29,"duration":20,"color":[0,0,0,204]},{"frame":49,"duration":20,"color":[0,0,0,170]},{"frame":99,"duration":50,"color":[0,0,0,136]}],"name":"Darkness All 2","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":150,"soundTimings":[{"frame":0,"se":{"name":"Teleport","pan":0,"pitch":100,"volume":90}},{"frame":29,"se":{"name":"Blind","pan":0,"pitch":100,"volume":80}},{"frame":29,"se":{"name":"Float2","pan":0,"pitch":140,"volume":80}}],"speed":100},
+{"id":105,"displayType":2,"effectName":"DarknessAll3","flashTimings":[{"frame":29,"duration":50,"color":[0,0,0,204]},{"frame":79,"duration":30,"color":[0,0,0,136]},{"frame":139,"duration":40,"color":[0,0,0,170]}],"name":"Darkness All 3","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Wind2","pan":0,"pitch":70,"volume":65}},{"frame":0,"se":{"name":"Magic1","pan":0,"pitch":100,"volume":80}},{"frame":9,"se":{"name":"Darkness4","pan":0,"pitch":90,"volume":75}},{"frame":64,"se":{"name":"Magic10","pan":0,"pitch":120,"volume":75}},{"frame":64,"se":{"name":"Blind","pan":0,"pitch":120,"volume":75}}],"speed":100},
+{"id":106,"displayType":0,"effectName":"NeutralOne1","flashTimings":[{"frame":0,"duration":30,"color":[255,255,0,204]},{"frame":49,"duration":30,"color":[85,255,0,119]}],"name":"Neutral One 1","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Darkness1","pan":0,"pitch":150,"volume":90}},{"frame":0,"se":{"name":"Magic5","pan":0,"pitch":150,"volume":90}},{"frame":44,"se":{"name":"Particles1","pan":0,"pitch":150,"volume":90}}],"speed":100},
+{"id":107,"displayType":0,"effectName":"NeutralOne2","flashTimings":[{"frame":0,"duration":30,"color":[255,102,0,204]},{"frame":49,"duration":30,"color":[255,102,0,204]}],"name":"Neutral One 2","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":70,"soundTimings":[{"frame":0,"se":{"name":"Explosion2","pan":0,"pitch":150,"volume":90}},{"frame":0,"se":{"name":"Particles1","pan":0,"pitch":150,"volume":90}}],"speed":100},
+{"id":108,"displayType":1,"effectName":"NeutralAll1","flashTimings":[{"frame":0,"duration":30,"color":[255,255,0,204]},{"frame":69,"duration":15,"color":[255,102,0,204]},{"frame":89,"duration":30,"color":[255,102,0,204]}],"name":"Neutral All 1","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Particles4","pan":0,"pitch":100,"volume":90}}],"speed":100},
+{"id":109,"displayType":2,"effectName":"NeutralAll2","flashTimings":[{"frame":0,"duration":30,"color":[255,102,0,204]},{"frame":49,"duration":30,"color":[255,102,0,204]}],"name":"Neutral All 2","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Fire9","pan":0,"pitch":140,"volume":90}}],"speed":100},
+{"id":110,"displayType":2,"effectName":"NeutralAll3","flashTimings":[{"frame":79,"duration":30,"color":[255,102,0,204]},{"frame":109,"duration":30,"color":[255,102,0,204]},{"frame":129,"duration":50,"color":[255,102,0,204]}],"name":"Neutral All 3","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Particles4","pan":0,"pitch":140,"volume":90}},{"frame":59,"se":{"name":"Fire8","pan":0,"pitch":140,"volume":90}},{"frame":69,"se":{"name":"Fire7","pan":0,"pitch":140,"volume":90}},{"frame":79,"se":{"name":"Fire8","pan":0,"pitch":140,"volume":90}},{"frame":89,"se":{"name":"Fire7","pan":0,"pitch":140,"volume":50}},{"frame":99,"se":{"name":"Fire8","pan":0,"pitch":140,"volume":90}}],"speed":100},
+{"id":111,"displayType":0,"effectName":"ShootNormal","flashTimings":[{"frame":0,"duration":5,"color":[255,0,0,119]},{"frame":9,"duration":5,"color":[255,0,0,119]},{"frame":19,"duration":10,"color":[255,0,0,119]}],"name":"Shoot Normal","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Gun1","pan":0,"pitch":100,"volume":90}}],"speed":100},
+{"id":112,"displayType":0,"effectName":"ShootBarrage","flashTimings":[{"frame":0,"duration":5,"color":[255,255,0,119]},{"frame":9,"duration":5,"color":[255,255,0,119]},{"frame":19,"duration":5,"color":[255,0,0,119]}],"name":"Shoot Barrage","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Gun2","pan":0,"pitch":150,"volume":90}}],"speed":100},
+{"id":113,"displayType":1,"effectName":"ShootAll","flashTimings":[{"frame":0,"duration":5,"color":[255,0,0,119]},{"frame":9,"duration":5,"color":[255,0,0,119]},{"frame":19,"duration":10,"color":[255,0,0,119]}],"name":"Shoot All","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Gun1","pan":0,"pitch":150,"volume":90}},{"frame":0,"se":{"name":"Crash","pan":0,"pitch":150,"volume":40}},{"frame":9,"se":{"name":"Gun1","pan":0,"pitch":150,"volume":90}},{"frame":19,"se":{"name":"Gun3","pan":0,"pitch":150,"volume":90}}],"speed":100},
+{"id":114,"displayType":2,"effectName":"ShootSpecial","flashTimings":[{"frame":69,"duration":10,"color":[255,136,0,153]},{"frame":119,"duration":10,"color":[255,136,0,153]},{"frame":139,"duration":10,"color":[255,0,0,170]},{"frame":154,"duration":30,"color":[255,0,0,204]},{"frame":199,"duration":30,"color":[255,255,0,136]}],"name":"Shoot Special","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Phone","pan":0,"pitch":150,"volume":40}},{"frame":24,"se":{"name":"Skill1","pan":0,"pitch":150,"volume":70}},{"frame":69,"se":{"name":"Skill2","pan":0,"pitch":150,"volume":70}},{"frame":109,"se":{"name":"Wind6","pan":0,"pitch":150,"volume":70}},{"frame":124,"se":{"name":"Wind6","pan":0,"pitch":150,"volume":70}},{"frame":149,"se":{"name":"Explosion2","pan":0,"pitch":100,"volume":70}},{"frame":169,"se":{"name":"Fire2","pan":0,"pitch":150,"volume":70}}],"speed":100},
+{"id":115,"displayType":0,"effectName":"LaserOne","flashTimings":[{"frame":5,"duration":30,"color":[255,136,0,170]},{"frame":39,"duration":30,"color":[255,136,0,153]},{"frame":59,"duration":30,"color":[255,136,0,153]}],"name":"Laser One","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Laser1","pan":0,"pitch":50,"volume":90}},{"frame":0,"se":{"name":"Paralyze2","pan":0,"pitch":50,"volume":90}},{"frame":0,"se":{"name":"Evasion2","pan":0,"pitch":150,"volume":90}}],"speed":100},
+{"id":116,"displayType":2,"effectName":"LaserAll","flashTimings":[{"frame":5,"duration":30,"color":[255,136,0,119]},{"frame":39,"duration":30,"color":[255,136,0,119]}],"name":"Laser All","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Powerup","pan":0,"pitch":150,"volume":90}},{"frame":29,"se":{"name":"Fire6","pan":0,"pitch":150,"volume":90}},{"frame":64,"se":{"name":"Fire3","pan":0,"pitch":150,"volume":90}}],"speed":100},
+{"id":117,"displayType":0,"effectName":"LightPillar1","flashTimings":[{"frame":5,"duration":30,"color":[255,255,255,102]},{"frame":39,"duration":30,"color":[102,170,0,102]}],"name":"Light Pillar 1","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Magic2","pan":0,"pitch":150,"volume":75}},{"frame":0,"se":{"name":"Up3","pan":0,"pitch":150,"volume":90}},{"frame":39,"se":{"name":"Magic4","pan":0,"pitch":150,"volume":90}},{"frame":39,"se":{"name":"Darkness4","pan":0,"pitch":150,"volume":90}}],"speed":100},
+{"id":118,"displayType":0,"effectName":"LightPillar2","flashTimings":[{"frame":5,"duration":30,"color":[255,255,255,102]},{"frame":39,"duration":30,"color":[255,255,255,255]}],"name":"Light Pillar 2","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":0,"se":{"name":"Magic2","pan":0,"pitch":150,"volume":75}},{"frame":0,"se":{"name":"Up3","pan":0,"pitch":150,"volume":90}},{"frame":39,"se":{"name":"Float1","pan":0,"pitch":150,"volume":90}},{"frame":39,"se":{"name":"Darkness4","pan":0,"pitch":150,"volume":90}}],"speed":100},
+{"id":119,"displayType":0,"effectName":"BallsOfLight","flashTimings":[{"frame":5,"duration":30,"color":[255,255,255,119]},{"frame":39,"duration":30,"color":[255,255,255,255]}],"name":"Balls of Light","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":120,"soundTimings":[{"frame":0,"se":{"name":"Particles1","pan":0,"pitch":110,"volume":60}},{"frame":0,"se":{"name":"Teleport","pan":0,"pitch":110,"volume":90}}],"speed":100},
+{"id":120,"displayType":0,"effectName":"Radiation","flashTimings":[{"frame":5,"duration":30,"color":[255,255,255,255]},{"frame":39,"duration":30,"color":[255,255,255,255]}],"name":"Radiation","offsetX":0,"offsetY":0,"rotation":{"x":0,"y":0,"z":0},"scale":100,"soundTimings":[{"frame":5,"se":{"name":"Flash2","pan":0,"pitch":100,"volume":90}}],"speed":100}
+]
\ No newline at end of file
diff --git a/data/Armors.json b/data/Armors.json
new file mode 100644
index 0000000..cbe9619
--- /dev/null
+++ b/data/Armors.json
@@ -0,0 +1,103 @@
+[
+null,
+{"id":1,"atypeId":1,"description":"","etypeId":4,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":135,"name":"-----Armors","note":"","params":[0,0,0,1,0,0,0,0],"price":100},
+{"id":2,"atypeId":1,"description":"[General Equipment] Linen clothing with high\nbreathability.","etypeId":4,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":135,"name":"Linen Clothing","note":"","params":[0,0,0,1,0,0,0,0],"price":100},
+{"id":3,"atypeId":1,"description":"[General Equipment] A vest made of tanned hide.","etypeId":4,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":135,"name":"Leather Vest","note":"","params":[0,0,0,3,0,0,0,0],"price":200},
+{"id":4,"atypeId":1,"description":"[General Equipment] Durable clothing that can\nwithstand rough travels.","etypeId":4,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":135,"name":"Adventurer’s Clothing","note":"","params":[0,0,0,7,0,0,0,0],"price":550},
+{"id":5,"atypeId":1,"description":"[General Equipment] A vest made of leather\nhardened with glue.","etypeId":4,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":135,"name":"Hard Leather","note":"","params":[0,0,0,15,0,0,0,0],"price":980},
+{"id":6,"atypeId":1,"description":"[General Equipment] Tanned hide clothing reinforced\nwith steel plates.","etypeId":4,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":135,"name":"Brigandine","note":"","params":[0,0,0,20,0,0,0,0],"price":1560},
+{"id":7,"atypeId":0,"description":"","etypeId":2,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":0,"name":"","note":"","params":[0,0,0,0,0,0,0,0],"price":0},
+{"id":8,"atypeId":3,"description":"[Light Equipment] Armor made of tough cloth.","etypeId":4,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":136,"name":"Cloth Armor","note":"","params":[0,0,0,4,0,0,0,0],"price":260},
+{"id":9,"atypeId":3,"description":"[Light Equipment] Armor made of layered hide.","etypeId":4,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":136,"name":"Leather Armor","note":"","params":[0,0,0,8,0,0,0,0],"price":550},
+{"id":10,"atypeId":3,"description":"[Light Equipment] A breastplate made of bronze.","etypeId":4,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":136,"name":"Bronze Breastplate","note":"","params":[0,0,0,13,0,0,0,0],"price":840},
+{"id":11,"atypeId":3,"description":"[Light Equipment] A breastplate made of iron steel.","etypeId":4,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":136,"name":"Iron Breastplate","note":"","params":[0,0,0,20,0,0,0,0],"price":1280},
+{"id":12,"atypeId":3,"description":"[Light Equipment] A breastplate made of mithril.","etypeId":4,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":136,"name":"Mithril Breastplate","note":"","params":[0,0,0,27,0,0,0,0],"price":2800},
+{"id":13,"atypeId":3,"description":"[Light Equipment] A breastplate made of dragon scales.","etypeId":4,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":136,"name":"Dragon Breastplate","note":"","params":[0,0,0,35,0,0,0,0],"price":4680},
+{"id":14,"atypeId":0,"description":"","etypeId":2,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":0,"name":"","note":"","params":[0,0,0,0,0,0,0,0],"price":0},
+{"id":15,"atypeId":4,"description":"[Heavy Equipment] Armor made of bronze.","etypeId":4,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":137,"name":"Bronze Armor","note":"","params":[0,0,0,15,0,0,0,0],"price":680},
+{"id":16,"atypeId":4,"description":"[Heavy Equipment] Armor made of iron steel.","etypeId":4,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":137,"name":"Iron Armor","note":"","params":[0,0,0,24,0,0,0,0],"price":1480},
+{"id":17,"atypeId":4,"description":"[Heavy Equipment] Armor made of mithril.","etypeId":4,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":137,"name":"Mithril Armor","note":"","params":[0,0,0,37,0,0,0,0],"price":3250},
+{"id":18,"atypeId":4,"description":"[Heavy Equipment] Armor made of dragon scales.","etypeId":4,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":137,"name":"Dragon Armor","note":"","params":[0,0,0,50,0,0,0,0],"price":5260},
+{"id":19,"atypeId":0,"description":"","etypeId":2,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":0,"name":"","note":"","params":[0,0,0,0,0,0,0,0],"price":0},
+{"id":20,"atypeId":2,"description":"[Magic Equipment] A basic, widely prevalent robe.","etypeId":4,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":139,"name":"Cotton Robe","note":"","params":[0,0,0,4,2,3,0,0],"price":150},
+{"id":21,"atypeId":2,"description":"[Magic Equipment] A high-quality cloak made of silk.","etypeId":4,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":139,"name":"Silk Cloak","note":"","params":[0,0,0,9,4,6,0,0],"price":560},
+{"id":22,"atypeId":2,"description":"[Magic Equipment] A robe inscribed with runic letters.","etypeId":4,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":139,"name":"Tactician’s Robe","note":"","params":[0,0,0,15,7,11,0,0],"price":1220},
+{"id":23,"atypeId":2,"description":"[Magic Equipment] A robe interwoven with magical\npowers.","etypeId":4,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":139,"name":"Sage’s Robe","note":"","params":[0,0,0,21,15,18,0,0],"price":2980},
+{"id":24,"atypeId":2,"description":"[Magic Equipment] A cloak that houses the power of\nspirits.","etypeId":4,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":139,"name":"Elemental Cloak","note":"","params":[0,0,0,28,20,32,0,0],"price":5760},
+{"id":25,"atypeId":0,"description":"","etypeId":2,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":0,"name":"","note":"","params":[0,0,0,0,0,0,0,0],"price":0},
+{"id":26,"atypeId":1,"description":"","etypeId":4,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":135,"name":"-----Shields","note":"","params":[0,0,0,1,0,0,0,0],"price":100},
+{"id":27,"atypeId":5,"description":"[Small Shield] A small shield for deflecting attacks.","etypeId":2,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":129,"name":"Buckler","note":"","params":[0,0,0,5,0,0,0,0],"price":300},
+{"id":28,"atypeId":5,"description":"[Small Shield] A round, wooden shield reinforced\nwith an iron frame.","etypeId":2,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":129,"name":"Round Buckler","note":"","params":[0,0,0,10,0,0,0,0],"price":670},
+{"id":29,"atypeId":5,"description":"[Small Shield] A round shield with attack spikes\nattached.","etypeId":2,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":129,"name":"Spiked Buckler","note":"","params":[0,0,0,15,0,0,0,0],"price":1320},
+{"id":30,"atypeId":5,"description":"[Small Shield] A small shield made of mithril.","etypeId":2,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":129,"name":"Mithril Buckler","note":"","params":[0,0,0,21,0,0,0,0],"price":2750},
+{"id":31,"atypeId":5,"description":"[Small Shield] A small shield made of dragon scales.","etypeId":2,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":129,"name":"Dragon Buckler","note":"","params":[0,0,0,28,0,0,0,0],"price":5280},
+{"id":32,"atypeId":0,"description":"","etypeId":2,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":0,"name":"","note":"","params":[0,0,0,0,0,0,0,0],"price":0},
+{"id":33,"atypeId":6,"description":"[Large Shield] A large, average wooden shield.","etypeId":2,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":128,"name":"Wooden Shield","note":"","params":[0,0,0,7,0,0,0,0],"price":550},
+{"id":34,"atypeId":6,"description":"[Large Shield] A large shield made of bronze plates.","etypeId":2,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":128,"name":"Bronze Shield","note":"","params":[0,0,0,12,0,0,0,0],"price":960},
+{"id":35,"atypeId":6,"description":"[Large Shield] A large shield made of iron steel.","etypeId":2,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":128,"name":"Iron Shield","note":"","params":[0,0,0,17,0,0,0,0],"price":1480},
+{"id":36,"atypeId":6,"description":"[Large Shield] A large shield made of mithril.","etypeId":2,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":128,"name":"Mithril Shield","note":"","params":[0,0,0,25,0,0,0,0],"price":2980},
+{"id":37,"atypeId":6,"description":"[Large Shield] A large shield made of dragon scales.","etypeId":2,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":128,"name":"Dragon Shield","note":"","params":[0,0,0,38,0,0,0,0],"price":6120},
+{"id":38,"atypeId":0,"description":"","etypeId":2,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":0,"name":"","note":"","params":[0,0,0,0,0,0,0,0],"price":0},
+{"id":39,"atypeId":2,"description":"[Magic Equipment] A bangle enchanted with protective\nmagic.","etypeId":2,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":144,"name":"Wooden Bangle","note":"","params":[0,0,0,2,0,3,0,0],"price":300},
+{"id":40,"atypeId":2,"description":"[Magic Equipment] A bangle enchanted with protective\nmagic.","etypeId":2,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":144,"name":"Bronze Bangle","note":"","params":[0,0,0,5,0,6,0,0],"price":650},
+{"id":41,"atypeId":2,"description":"[Magic Equipment] A bangle enchanted with protective\nmagic.","etypeId":2,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":144,"name":"Iron Bangle","note":"","params":[0,0,0,10,0,9,0,0],"price":1280},
+{"id":42,"atypeId":2,"description":"[Magic Equipment] A bangle enchanted with protective\nmagic.","etypeId":2,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":144,"name":"Mithril Bangle","note":"","params":[0,0,0,16,0,12,0,0],"price":2680},
+{"id":43,"atypeId":2,"description":"[Magic Equipment] A bangle enchanted with protective\nmagic.","etypeId":2,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":144,"name":"Dragon Bangle","note":"","params":[0,0,0,23,0,15,0,0],"price":4860},
+{"id":44,"atypeId":0,"description":"","etypeId":2,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":0,"name":"","note":"","params":[0,0,0,0,0,0,0,0],"price":0},
+{"id":45,"atypeId":1,"description":"","etypeId":4,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":135,"name":"-----Helmets","note":"","params":[0,0,0,1,0,0,0,0],"price":100},
+{"id":46,"atypeId":1,"description":"[General Equipment] A cloth headband for protecting\nthe forehead.","etypeId":3,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":150,"name":"Bandana","note":"","params":[0,0,0,1,0,0,0,0],"price":50},
+{"id":47,"atypeId":1,"description":"[General Equipment] A leather headband for protecting\nthe forehead.","etypeId":3,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":150,"name":"Leather Bandana","note":"","params":[0,0,0,4,0,0,0,0],"price":120},
+{"id":48,"atypeId":1,"description":"[General Equipment] A hat made of leather.","etypeId":3,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":130,"name":"Leather Hat","note":"","params":[0,0,0,8,0,0,0,0],"price":480},
+{"id":49,"atypeId":1,"description":"[General Equipment] A thick cloth layered and wrapped\naround the head for protection.","etypeId":3,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":130,"name":"Turban","note":"","params":[0,0,0,12,0,0,0,0],"price":980},
+{"id":50,"atypeId":1,"description":"[General Equipment] A fancy hat with bird feathers\nattached.","etypeId":3,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":130,"name":"Feathered Hat","note":"","params":[0,0,0,16,0,0,0,0],"price":1890},
+{"id":51,"atypeId":0,"description":"","etypeId":2,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":0,"name":"","note":"","params":[0,0,0,0,0,0,0,0],"price":0},
+{"id":52,"atypeId":3,"description":"[Light Equipment] A hat made of tanned hide.","etypeId":3,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":130,"name":"Leather Cap","note":"","params":[0,0,0,3,0,0,0,0],"price":100},
+{"id":53,"atypeId":3,"description":"[Light Equipment] A light helmet made of wood.","etypeId":3,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":130,"name":"Wooden Cap","note":"","params":[0,0,0,7,0,0,0,0],"price":300},
+{"id":54,"atypeId":3,"description":"[Light Equipment] A light helmet reinforced with\nbronze plates.","etypeId":3,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":130,"name":"Bronze Cap","note":"","params":[0,0,0,12,0,0,0,0],"price":720},
+{"id":55,"atypeId":3,"description":"[Light Equipment] A light helmet reinforced with\niron plates.","etypeId":3,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":130,"name":"Iron Cap","note":"","params":[0,0,0,18,0,0,0,0],"price":1680},
+{"id":56,"atypeId":3,"description":"[Light Equipment] A light helmet reinforced with\nmithril.","etypeId":3,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":130,"name":"Mithril Cap","note":"","params":[0,0,0,24,0,0,0,0],"price":3250},
+{"id":57,"atypeId":3,"description":"[Light Equipment] A light helmet reinforced with\ndragon scales.","etypeId":3,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":130,"name":"Dragon Cap","note":"","params":[0,0,0,30,0,0,0,0],"price":5480},
+{"id":58,"atypeId":0,"description":"","etypeId":2,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":0,"name":"","note":"","params":[0,0,0,0,0,0,0,0],"price":0},
+{"id":59,"atypeId":4,"description":"[Heavy Equipment] A hood made with fine, woven chains.","etypeId":3,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":132,"name":"Chainmail Coif","note":"","params":[0,0,0,5,0,0,0,0],"price":250},
+{"id":60,"atypeId":4,"description":"[Heavy Equipment] A helmet made with thick bronze\nplates.","etypeId":3,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":132,"name":"Bronze Helm","note":"","params":[0,0,0,12,0,0,0,0],"price":750},
+{"id":61,"atypeId":4,"description":"[Heavy Equipment] A helmet made with thick iron\nplates.","etypeId":3,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":132,"name":"Iron Helm","note":"","params":[0,0,0,20,0,0,0,0],"price":1580},
+{"id":62,"atypeId":4,"description":"[Heavy Equipment] A helmet made of mithril.","etypeId":3,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":132,"name":"Mithril Helm","note":"","params":[0,0,0,28,0,0,0,0],"price":3480},
+{"id":63,"atypeId":4,"description":"[Heavy Equipment] A helmet made with dragon scales.","etypeId":3,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":132,"name":"Dragon Helm","note":"","params":[0,0,0,34,0,0,0,0],"price":6780},
+{"id":64,"atypeId":0,"description":"","etypeId":2,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":0,"name":"","note":"","params":[0,0,0,0,0,0,0,0],"price":0},
+{"id":65,"atypeId":2,"description":"[Magic Equipment] A triangular, tanned hide hat with\na wide brim.","etypeId":3,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":133,"name":"Pointed Hat","note":"","params":[0,0,0,2,0,5,0,0],"price":100},
+{"id":66,"atypeId":2,"description":"[Magic Equipment] A simple crown enchanted with\nprotective magic.","etypeId":3,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":133,"name":"Circlet","note":"","params":[0,0,0,5,0,10,0,0],"price":360},
+{"id":67,"atypeId":2,"description":"[Magic Equipment] A silver crown enchanted with\nprotective magic.","etypeId":3,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":133,"name":"Silver Circlet","note":"","params":[0,0,0,8,0,15,0,0],"price":980},
+{"id":68,"atypeId":2,"description":"[Magic Equipment] A pure gold crown enchanted with\nprotective magic.","etypeId":3,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":133,"name":"Gold Circlet","note":"","params":[0,0,0,16,0,25,0,0],"price":1980},
+{"id":69,"atypeId":2,"description":"[Magic Equipment] A mithril crown enchanted with\nprotective magic.","etypeId":3,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":133,"name":"Mithril Circlet","note":"","params":[0,0,0,20,0,30,0,0],"price":3680},
+{"id":70,"atypeId":2,"description":"[Magic Equipment] A sage’s crown enchanted with\nprotective magic.","etypeId":3,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":133,"name":"Master Circlet","note":"","params":[0,0,0,25,0,36,0,0],"price":5860},
+{"id":71,"atypeId":0,"description":"","etypeId":2,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":0,"name":"","note":"","params":[0,0,0,0,0,0,0,0],"price":0},
+{"id":72,"atypeId":1,"description":"","etypeId":4,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":135,"name":"-----Accessories","note":"","params":[0,0,0,1,0,0,0,0],"price":100},
+{"id":73,"atypeId":1,"description":"[Accessory] A charm that increases Defense.","etypeId":5,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":147,"name":"Guard Stone","note":"","params":[0,0,0,5,0,5,0,0],"price":500},
+{"id":74,"atypeId":1,"description":"[Accessory] A ring that increases Defense.","etypeId":5,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":145,"name":"Guard Ring","note":"","params":[0,0,0,10,0,10,0,0],"price":1000},
+{"id":75,"atypeId":1,"description":"[Accessory] A charm that increases Attack.","etypeId":5,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":147,"name":"Power Stone","note":"","params":[0,0,5,0,5,0,0,0],"price":500},
+{"id":76,"atypeId":1,"description":"[Accessory] A ring that increases Attack.","etypeId":5,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":145,"name":"Power Ring","note":"","params":[0,0,5,0,10,0,0,0],"price":1000},
+{"id":77,"atypeId":1,"description":"[Accessory] A charm that increases Agility.","etypeId":5,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":147,"name":"Speed Stone","note":"","params":[0,0,0,0,0,0,5,0],"price":500},
+{"id":78,"atypeId":1,"description":"[Accessory] A ring that increases Agility.","etypeId":5,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":145,"name":"Speed Ring","note":"","params":[0,0,0,0,0,0,5,0],"price":1000},
+{"id":79,"atypeId":1,"description":"[Accessory] A charm that increases Luck.","etypeId":5,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":147,"name":"Lucky Stone","note":"","params":[0,0,0,0,0,0,0,5],"price":500},
+{"id":80,"atypeId":1,"description":"[Accessory] A ring that increases Luck.","etypeId":5,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":145,"name":"Lucky Ring","note":"","params":[0,0,0,0,0,0,0,10],"price":1000},
+{"id":81,"atypeId":1,"description":"[Accessory] A charm that increases M.Attack.","etypeId":5,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":147,"name":"Magical Stone","note":"","params":[0,0,0,0,5,5,0,0],"price":500},
+{"id":82,"atypeId":1,"description":"[Accessory] A ring that increases M.Attack.","etypeId":5,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":145,"name":"Magical Ring","note":"","params":[0,0,0,0,10,10,0,0],"price":1000},
+{"id":83,"atypeId":1,"description":"[Accessory] A charm that increases the Hit Rate of\nattacks.","etypeId":5,"traits":[{"code":22,"dataId":1,"value":0},{"code":22,"dataId":0,"value":1.5}],"iconIndex":147,"name":"Shooter Stone","note":"","params":[0,0,0,0,0,0,0,0],"price":500},
+{"id":84,"atypeId":1,"description":"[Accessory] A ring that increases the Hit Rate of\nattacks.","etypeId":5,"traits":[{"code":22,"dataId":1,"value":0},{"code":22,"dataId":0,"value":2}],"iconIndex":145,"name":"Shooter Ring","note":"","params":[0,0,0,0,0,0,0,0],"price":100},
+{"id":85,"atypeId":1,"description":"[Accessory] A charm that reduces MP Cost by 20%.","etypeId":5,"traits":[{"code":22,"dataId":1,"value":0},{"code":23,"dataId":4,"value":0.8}],"iconIndex":147,"name":"Master Stone","note":"","params":[0,0,0,0,0,0,0,0],"price":500},
+{"id":86,"atypeId":1,"description":"[Accessory] A ring that reduces MP Cost by 50%.","etypeId":5,"traits":[{"code":22,"dataId":1,"value":0},{"code":23,"dataId":4,"value":0.5}],"iconIndex":145,"name":"Master Ring","note":"","params":[0,0,0,0,0,0,0,0],"price":1000},
+{"id":87,"atypeId":0,"description":"","etypeId":2,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":0,"name":"","note":"","params":[0,0,0,0,0,0,0,0],"price":0},
+{"id":88,"atypeId":1,"description":"[Accessory] A ring that helps prevent Poison and\nParalysis states.","etypeId":5,"traits":[{"code":22,"dataId":1,"value":0},{"code":13,"dataId":4,"value":0.6},{"code":13,"dataId":12,"value":0.6},{"code":13,"dataId":17,"value":0.6}],"iconIndex":145,"name":"Poison Guard","note":"","params":[0,0,0,1,0,0,0,0],"price":300},
+{"id":89,"atypeId":1,"description":"[Accessory] A ring that entirely prevents Poison\nand Paralysis states.","etypeId":5,"traits":[{"code":22,"dataId":1,"value":0},{"code":14,"dataId":4,"value":1},{"code":14,"dataId":12,"value":1},{"code":14,"dataId":17,"value":1}],"iconIndex":145,"name":"Super Poison Guard","note":"","params":[0,0,0,5,0,0,0,0],"price":3000},
+{"id":90,"atypeId":0,"description":"","etypeId":2,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":0,"name":"","note":"","params":[0,0,0,0,0,0,0,0],"price":0},
+{"id":91,"atypeId":1,"description":"[Accessory] A ring that helps prevent Sleep,\nSilence, Confusion, Charm, and Rage states.","etypeId":5,"traits":[{"code":22,"dataId":1,"value":0},{"code":13,"dataId":6,"value":0.6},{"code":13,"dataId":7,"value":0.6},{"code":13,"dataId":9,"value":0.6},{"code":13,"dataId":10,"value":0.6},{"code":13,"dataId":8,"value":0.6}],"iconIndex":145,"name":"Mental Guard","note":"","params":[0,0,0,1,0,0,0,0],"price":500},
+{"id":92,"atypeId":1,"description":"[Accessory] A ring that entirely prevents Sleep,\nSilence, Confusion, Charm, and Rage states.","etypeId":5,"traits":[{"code":22,"dataId":1,"value":0},{"code":14,"dataId":6,"value":1},{"code":14,"dataId":8,"value":1},{"code":14,"dataId":7,"value":1},{"code":14,"dataId":9,"value":1},{"code":14,"dataId":10,"value":1}],"iconIndex":145,"name":"Super Mental Guard","note":"","params":[0,0,0,1,0,0,0,0],"price":5000},
+{"id":93,"atypeId":0,"description":"","etypeId":2,"traits":[{"code":22,"dataId":1,"value":0}],"iconIndex":0,"name":"","note":"","params":[0,0,0,0,0,0,0,0],"price":0},
+{"id":94,"atypeId":1,"description":"[Accessory] Raises the chance of performing a\npreemptive attack.","etypeId":5,"traits":[{"code":22,"dataId":1,"value":0},{"code":64,"dataId":3,"value":1}],"iconIndex":147,"name":"Enemy Radar","note":"","params":[0,0,0,0,0,0,0,0],"price":1000},
+{"id":95,"atypeId":1,"description":"[Accessory] Prevents surprise attacks.","etypeId":5,"traits":[{"code":22,"dataId":1,"value":0},{"code":64,"dataId":2,"value":1}],"iconIndex":205,"name":"Warning Bell","note":"","params":[0,0,0,0,0,0,0,0],"price":1000},
+{"id":96,"atypeId":1,"description":"[Accessory] Allows you to carryover TP over into the\nnext battle.","etypeId":5,"traits":[{"code":22,"dataId":1,"value":0},{"code":62,"dataId":3,"value":1}],"iconIndex":144,"name":"Stocker","note":"","params":[0,0,0,0,0,0,0,0],"price":1000},
+{"id":97,"atypeId":1,"description":"[Accessory] Increases TP Charge Rate.","etypeId":5,"traits":[{"code":22,"dataId":1,"value":0},{"code":23,"dataId":5,"value":2}],"iconIndex":145,"name":"Ring of Guts","note":"","params":[0,0,0,0,0,0,0,0],"price":1000},
+{"id":98,"atypeId":1,"description":"[Accessory] Decreases MP Cost Rate.","etypeId":5,"traits":[{"code":22,"dataId":1,"value":0},{"code":23,"dataId":4,"value":0.5}],"iconIndex":144,"name":"MP Keeper","note":"","params":[0,0,0,0,0,0,0,0],"price":1000},
+{"id":99,"atypeId":1,"description":"[Accessory] Damage inflicted by Fire, Water, Wind,\nand Earth attacks is halved.","etypeId":5,"traits":[{"code":22,"dataId":1,"value":0},{"code":11,"dataId":2,"value":0.5},{"code":11,"dataId":5,"value":0.5},{"code":11,"dataId":6,"value":0.5},{"code":11,"dataId":7,"value":0.5}],"iconIndex":145,"name":"Elemental Guard","note":"","params":[0,0,0,0,0,0,0,0],"price":1000},
+{"id":100,"atypeId":1,"description":"[Accessory] Sharpens eyesight and increases hit rate.","etypeId":5,"traits":[{"code":22,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0.5}],"iconIndex":151,"name":"Spectacles","note":"","params":[0,0,0,0,0,0,0,0],"price":500}
+]
\ No newline at end of file
diff --git a/data/Classes.json b/data/Classes.json
new file mode 100644
index 0000000..ec9a13b
--- /dev/null
+++ b/data/Classes.json
@@ -0,0 +1,11 @@
+[
+null,
+{"id":1,"expParams":[30,20,30,30],"traits":[{"code":23,"dataId":0,"value":1},{"code":22,"dataId":0,"value":1},{"code":22,"dataId":1,"value":0.05},{"code":22,"dataId":2,"value":0.1},{"code":41,"dataId":2,"value":1},{"code":51,"dataId":2,"value":0},{"code":51,"dataId":1,"value":1},{"code":52,"dataId":1,"value":0},{"code":52,"dataId":3,"value":0},{"code":52,"dataId":5,"value":0}],"learnings":[{"level":2,"note":"","skillId":172},{"level":5,"note":"","skillId":173},{"level":8,"note":"","skillId":175},{"level":12,"note":"","skillId":176},{"level":15,"note":"","skillId":174},{"level":20,"note":"","skillId":178}],"name":"Swordsman","note":"","params":[[1,544,618,691,764,838,911,984,1058,1131,1204,1278,1351,1424,1497,1571,1644,1717,1791,1864,1937,2011,2084,2157,2231,2304,2377,2450,2524,2597,2670,2744,2817,2890,2964,3037,3110,3184,3257,3330,3403,3477,3550,3623,3697,3770,3843,3917,3990,4063,4136,4210,4283,4356,4430,4503,4576,4650,4723,4796,4870,4943,5016,5089,5163,5236,5309,5383,5456,5529,5603,5676,5749,5823,5896,5969,6042,6116,6189,6262,6336,6409,6482,6556,6629,6702,6776,6849,6922,6995,7069,7142,7215,7289,7362,7435,7509,7582,7655,7728],[0,41,50,59,68,76,85,94,102,111,120,129,137,146,155,163,172,181,190,198,207,216,224,233,242,251,259,268,277,285,294,303,312,320,329,338,346,355,364,373,381,390,399,407,416,425,434,442,451,460,468,477,486,495,503,512,521,529,538,547,556,564,573,582,590,599,608,617,625,634,643,651,660,669,678,686,695,704,712,721,730,739,747,756,765,773,782,791,800,808,817,826,834,843,852,861,869,878,887,895],[1,19,21,23,25,27,29,30,32,34,36,38,39,41,43,45,47,48,50,52,54,56,57,59,61,63,65,66,68,70,72,74,75,77,79,81,83,85,86,88,90,92,94,95,97,99,101,103,104,106,108,110,112,113,115,117,119,121,122,124,126,128,130,131,133,135,137,139,141,142,144,146,148,150,151,153,155,157,159,160,162,164,166,168,169,171,173,175,177,178,180,182,184,186,187,189,191,193,195,196],[1,17,19,21,22,24,25,27,29,30,32,33,35,36,38,40,41,43,44,46,48,49,51,52,54,55,57,59,60,62,63,65,67,68,70,71,73,74,76,78,79,81,82,84,86,87,89,90,92,93,95,97,98,100,101,103,104,106,108,109,111,112,114,116,117,119,120,122,123,125,127,128,130,131,133,135,136,138,139,141,142,144,146,147,149,150,152,154,155,157,158,160,161,163,165,166,168,169,171,172],[1,15,17,18,19,20,22,23,24,25,26,28,29,30,31,32,34,35,36,37,38,40,41,42,43,44,46,47,48,49,50,52,53,54,55,56,58,59,60,61,62,64,65,66,67,68,70,71,72,73,74,76,77,78,79,81,82,83,84,85,87,88,89,90,91,93,94,95,96,97,99,100,101,102,103,105,106,107,108,109,111,112,113,114,115,117,118,119,120,121,123,124,125,126,127,129,130,131,132,133],[1,17,19,20,22,23,25,26,28,29,31,32,33,35,36,38,39,41,42,44,45,46,48,49,51,52,54,55,57,58,60,61,62,64,65,67,68,70,71,73,74,75,77,78,80,81,83,84,86,87,88,90,91,93,94,96,97,99,100,102,103,104,106,107,109,110,112,113,115,116,117,119,120,122,123,125,126,128,129,131,132,133,135,136,138,139,141,142,144,145,146,148,149,151,152,154,155,157,158,159],[1,29,33,36,39,42,45,48,51,54,57,60,63,66,69,72,75,78,81,84,87,90,93,96,99,102,106,109,112,115,118,121,124,127,130,133,136,139,142,145,148,151,154,157,160,163,166,169,172,175,178,182,185,188,191,194,197,200,203,206,209,212,215,218,221,224,227,230,233,236,239,242,245,248,251,255,258,261,264,267,270,273,276,279,282,285,288,291,294,297,300,303,306,309,312,315,318,321,324,327],[1,27,31,34,37,40,43,46,49,52,56,59,62,65,68,71,74,77,80,84,87,90,93,96,99,102,105,108,112,115,118,121,124,127,130,133,136,140,143,146,149,152,155,158,161,164,168,171,174,177,180,183,186,189,192,196,199,202,205,208,211,214,217,220,224,227,230,233,236,239,242,245,248,252,255,258,261,264,267,270,273,276,280,283,286,289,292,295,298,301,304,308,311,314,317,320,323,326,329,332]]},
+{"id":2,"expParams":[20,20,30,30],"traits":[{"code":23,"dataId":0,"value":1},{"code":22,"dataId":0,"value":1},{"code":22,"dataId":1,"value":0.05},{"code":22,"dataId":2,"value":0.04},{"code":41,"dataId":1,"value":0},{"code":51,"dataId":6,"value":0},{"code":52,"dataId":1,"value":0},{"code":52,"dataId":2,"value":0}],"learnings":[{"level":1,"note":"","skillId":99},{"level":3,"note":"","skillId":75},{"level":5,"note":"","skillId":103},{"level":5,"note":"","skillId":187},{"level":8,"note":"","skillId":100},{"level":11,"note":"","skillId":74},{"level":15,"note":"","skillId":193},{"level":15,"note":"","skillId":92},{"level":18,"note":"","skillId":76},{"level":18,"note":"","skillId":104},{"level":21,"note":"","skillId":101},{"level":21,"note":"","skillId":132},{"level":25,"note":"","skillId":189}],"name":"Sorcerer","note":"","params":[[1,297,343,389,435,480,526,572,618,663,709,755,801,846,892,938,984,1029,1075,1121,1166,1212,1258,1304,1349,1395,1441,1487,1532,1578,1624,1670,1715,1761,1807,1852,1898,1944,1990,2035,2081,2127,2173,2218,2264,2310,2356,2401,2447,2493,2538,2584,2630,2676,2721,2767,2813,2859,2904,2950,2996,3042,3087,3133,3179,3225,3270,3316,3362,3407,3453,3499,3545,3590,3636,3682,3728,3773,3819,3865,3911,3956,4002,4048,4093,4139,4185,4231,4276,4322,4368,4414,4459,4505,4551,4597,4642,4688,4734,4779],[0,131,147,162,177,192,208,223,238,253,268,284,299,314,329,344,360,375,390,405,421,436,451,466,481,497,512,527,542,557,573,588,603,618,634,649,664,679,694,710,725,740,755,770,786,801,816,831,847,862,877,892,907,923,938,953,968,983,999,1014,1029,1044,1060,1075,1090,1105,1120,1136,1151,1166,1181,1196,1212,1227,1242,1257,1273,1288,1303,1318,1333,1349,1364,1379,1394,1409,1425,1440,1455,1470,1486,1501,1516,1531,1546,1562,1577,1592,1607,1622],[1,12,14,15,16,17,18,19,20,21,23,24,25,26,27,28,29,30,31,33,34,35,36,37,38,39,40,41,43,44,45,46,47,48,49,50,51,53,54,55,56,57,58,59,60,61,63,64,65,66,67,68,69,70,71,73,74,75,76,77,78,79,80,81,83,84,85,86,87,88,89,90,91,93,94,95,96,97,98,99,100,101,103,104,105,106,107,108,109,110,111,113,114,115,116,117,118,119,120,121],[1,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,104],[1,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,59,61,63,65,67,69,71,73,75,77,79,81,83,85,87,89,91,93,95,97,99,101,103,105,107,109,111,113,115,117,119,121,123,125,127,129,131,133,135,137,139,141,143,145,147,149,151,153,155,157,159,161,163,165,167,169,171,173,175,177,179,181,183,185,187,189,191,193,195,197,199,201,203,205,207,209,211,213,215,217],[1,20,23,25,27,29,31,33,35,37,39,41,44,46,48,50,52,54,56,58,60,62,64,67,69,71,73,75,77,79,81,83,85,87,90,92,94,96,98,100,102,104,106,108,110,113,115,117,119,121,123,125,127,129,131,133,136,138,140,142,144,146,148,150,152,154,156,159,161,163,165,167,169,171,173,175,177,179,182,184,186,188,190,192,194,196,198,200,202,205,207,209,211,213,215,217,219,221,223,225],[1,22,25,28,30,33,35,38,41,43,46,48,51,53,56,59,61,64,66,69,72,74,77,79,82,84,87,90,92,95,97,100,103,105,108,110,113,115,118,121,123,126,128,131,134,136,139,141,144,146,149,152,154,157,159,162,164,167,170,172,175,177,180,183,185,188,190,193,195,198,201,203,206,208,211,214,216,219,221,224,226,229,232,234,237,239,242,245,247,250,252,255,257,260,263,265,268,270,273,275],[1,18,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,101,103,105,107,109,111,113,115,117,119,121,123,125,127,129,131,133,135,137,140,142,144,146,148,150,152,154,156,158,160,162,164,166,168,170,172,174,176,178,181,183,185,187,189,191,193,195,197,199,201,203,205,207,209,211,213,215,217,219]]},
+{"id":3,"expParams":[25,20,30,30],"traits":[{"code":23,"dataId":0,"value":1},{"code":22,"dataId":0,"value":1},{"code":22,"dataId":1,"value":0.05},{"code":22,"dataId":2,"value":0.04},{"code":41,"dataId":1,"value":0},{"code":51,"dataId":6,"value":0},{"code":51,"dataId":3,"value":0},{"code":52,"dataId":1,"value":0},{"code":52,"dataId":2,"value":0}],"learnings":[{"level":1,"note":"","skillId":52},{"level":1,"note":"","skillId":60},{"level":1,"note":"","skillId":83},{"level":1,"note":"","skillId":81},{"level":3,"note":"","skillId":141},{"level":3,"note":"","skillId":85},{"level":3,"note":"","skillId":87},{"level":5,"note":"","skillId":56},{"level":5,"note":"","skillId":186},{"level":5,"note":"","skillId":89},{"level":8,"note":"","skillId":53},{"level":8,"note":"","skillId":61},{"level":10,"note":"","skillId":144},{"level":13,"note":"","skillId":57},{"level":15,"note":"","skillId":188},{"level":15,"note":"","skillId":54},{"level":18,"note":"","skillId":62},{"level":18,"note":"","skillId":142},{"level":25,"note":"","skillId":145}],"name":"Priest","note":"","params":[[1,308,366,423,481,538,596,653,711,768,825,883,940,998,1055,1113,1170,1228,1285,1342,1400,1457,1515,1572,1630,1687,1744,1802,1859,1917,1974,2032,2089,2147,2204,2261,2319,2376,2434,2491,2549,2606,2663,2721,2778,2836,2893,2951,3008,3066,3123,3180,3238,3295,3353,3410,3468,3525,3583,3640,3697,3755,3812,3870,3927,3985,4042,4099,4157,4214,4272,4329,4387,4444,4502,4559,4616,4674,4731,4789,4846,4904,4961,5018,5076,5133,5191,5248,5306,5363,5421,5478,5535,5593,5650,5708,5765,5823,5880,5937],[0,133,150,167,183,200,216,233,249,266,282,299,316,332,349,365,382,398,415,431,448,465,481,498,514,531,547,564,580,597,613,630,647,663,680,696,713,729,746,762,779,796,812,829,845,862,878,895,911,928,944,961,978,994,1011,1027,1044,1060,1077,1093,1110,1127,1143,1160,1176,1193,1209,1226,1242,1259,1276,1292,1309,1325,1342,1358,1375,1391,1408,1424,1441,1458,1474,1491,1507,1524,1540,1557,1573,1590,1607,1623,1640,1656,1673,1689,1706,1722,1739,1755],[1,13,15,16,17,18,19,21,22,23,24,25,27,28,29,30,31,33,34,35,36,37,39,40,41,42,43,45,46,47,48,49,51,52,53,54,55,56,58,59,60,61,62,64,65,66,67,68,70,71,72,73,74,76,77,78,79,80,82,83,84,85,86,88,89,90,91,92,93,95,96,97,98,99,101,102,103,104,105,107,108,109,110,111,113,114,115,116,117,119,120,121,122,123,125,126,127,128,129,130],[0,14,16,17,18,19,20,21,23,24,25,26,27,28,29,31,32,33,34,35,36,38,39,40,41,42,43,44,46,47,48,49,50,51,53,54,55,56,57,58,59,61,62,63,64,65,66,68,69,70,71,72,73,74,76,77,78,79,80,81,83,84,85,86,87,88,89,91,92,93,94,95,96,98,99,100,101,102,103,104,106,107,108,109,110,111,113,114,115,116,117,118,119,121,122,123,124,125,126,127],[0,14,16,17,18,19,20,21,22,24,25,26,27,28,29,30,31,33,34,35,36,37,38,39,41,42,43,44,45,46,47,48,50,51,52,53,54,55,56,58,59,60,61,62,63,64,65,67,68,69,70,71,72,73,75,76,77,78,79,80,81,82,84,85,86,87,88,89,90,92,93,94,95,96,97,98,99,101,102,103,104,105,106,107,109,110,111,112,113,114,115,116,118,119,120,121,122,123,124,125],[0,15,17,18,19,21,22,23,25,26,27,29,30,31,33,34,35,37,38,39,41,42,43,45,46,47,49,50,51,53,54,55,57,58,59,61,62,63,65,66,67,69,70,71,73,74,75,77,78,79,80,82,83,84,86,87,88,90,91,92,94,95,96,98,99,100,102,103,104,106,107,108,110,111,112,114,115,116,118,119,120,122,123,124,126,127,128,130,131,132,134,135,136,138,139,140,142,143,144,145],[0,24,27,30,32,35,38,40,43,45,48,51,53,56,59,61,64,66,69,72,74,77,80,82,85,87,90,93,95,98,101,103,106,108,111,114,116,119,122,124,127,129,132,135,137,140,143,145,148,150,153,156,158,161,163,166,169,171,174,177,179,182,184,187,190,192,195,198,200,203,205,208,211,213,216,219,221,224,226,229,232,234,237,240,242,245,247,250,253,255,258,261,263,266,268,271,274,276,279,281],[0,32,36,40,43,47,51,54,58,62,65,69,73,76,80,84,87,91,95,98,102,106,109,113,117,120,124,128,131,135,139,142,146,150,153,157,161,164,168,172,175,179,183,186,190,194,197,201,205,208,212,216,219,223,227,230,234,238,241,245,249,252,256,260,263,267,271,274,278,282,285,289,293,296,300,304,307,311,315,318,322,326,329,333,337,340,344,348,351,355,359,362,366,370,373,377,381,384,388,391]]},
+{"id":4,"expParams":[30,20,30,30],"traits":[{"code":23,"dataId":0,"value":1},{"code":22,"dataId":0,"value":1},{"code":22,"dataId":1,"value":0.05},{"code":22,"dataId":2,"value":0.04},{"code":41,"dataId":2,"value":0},{"code":51,"dataId":2,"value":0},{"code":51,"dataId":12,"value":0},{"code":51,"dataId":4,"value":0},{"code":52,"dataId":1,"value":0},{"code":52,"dataId":3,"value":0},{"code":52,"dataId":4,"value":0},{"code":52,"dataId":5,"value":0},{"code":52,"dataId":6,"value":0}],"learnings":[{"level":1,"note":"","skillId":196},{"level":3,"note":"","skillId":197},{"level":3,"note":"","skillId":200},{"level":5,"note":"","skillId":198},{"level":8,"note":"","skillId":201},{"level":13,"note":"","skillId":202},{"level":16,"note":"","skillId":199},{"level":20,"note":"","skillId":203}],"name":"Knight","note":"","params":[[1,592,666,739,813,886,960,1033,1106,1180,1253,1327,1400,1474,1547,1620,1694,1767,1841,1914,1988,2061,2134,2208,2281,2355,2428,2502,2575,2648,2722,2795,2869,2942,3016,3089,3162,3236,3309,3383,3456,3530,3603,3676,3750,3823,3897,3970,4044,4117,4190,4264,4337,4411,4484,4558,4631,4704,4778,4851,4925,4998,5072,5145,5218,5292,5365,5439,5512,5586,5659,5732,5806,5879,5953,6026,6100,6173,6246,6320,6393,6467,6540,6614,6687,6760,6834,6907,6981,7054,7128,7201,7274,7348,7421,7495,7568,7642,7715,7788],[0,50,60,69,78,87,97,106,115,124,134,143,152,161,171,180,189,198,207,217,226,235,244,254,263,272,281,291,300,309,318,328,337,346,355,364,374,383,392,401,411,420,429,438,448,457,466,475,485,494,503,512,521,531,540,549,558,568,577,586,595,605,614,623,632,642,651,660,669,678,688,697,706,715,725,734,743,752,762,771,780,789,799,808,817,826,835,845,854,863,872,882,891,900,909,919,928,937,946,955],[1,18,20,22,24,25,27,29,30,32,34,35,37,39,41,42,44,46,47,49,51,52,54,56,57,59,61,63,64,66,68,69,71,73,74,76,78,79,81,83,85,86,88,90,91,93,95,96,98,100,101,103,105,107,108,110,112,113,115,117,118,120,122,124,125,127,129,130,132,134,135,137,139,140,142,144,146,147,149,151,152,154,156,157,159,161,162,164,166,168,169,171,173,174,176,178,179,181,183,184],[0,18,20,22,24,25,27,29,30,32,34,35,37,39,40,42,44,45,47,49,50,52,54,56,57,59,61,62,64,66,67,69,71,72,74,76,77,79,81,82,84,86,88,89,91,93,94,96,98,99,101,103,104,106,108,109,111,113,114,116,118,120,121,123,125,126,128,130,131,133,135,136,138,140,141,143,145,146,148,150,152,153,155,157,158,160,162,163,165,167,168,170,172,173,175,177,178,180,182,183],[1,15,17,18,20,21,23,24,26,27,29,30,32,33,35,36,38,39,40,42,43,45,46,48,49,51,52,54,55,57,58,60,61,63,64,65,67,68,70,71,73,74,76,77,79,80,82,83,85,86,87,89,90,92,93,95,96,98,99,101,102,104,105,107,108,110,111,112,114,115,117,118,120,121,123,124,126,127,129,130,132,133,135,136,137,139,140,142,143,145,146,148,149,151,152,154,155,157,158,159],[1,20,22,24,26,28,29,31,33,35,36,38,40,42,43,45,47,49,51,52,54,56,58,59,61,63,65,66,68,70,72,73,75,77,79,81,82,84,86,88,89,91,93,95,96,98,100,102,103,105,107,109,111,112,114,116,118,119,121,123,125,126,128,130,132,133,135,137,139,141,142,144,146,148,149,151,153,155,156,158,160,162,163,165,167,169,171,172,174,176,178,179,181,183,185,186,188,190,192,193],[0,25,28,31,34,37,40,43,46,49,52,54,57,60,63,66,69,72,75,78,81,83,86,89,92,95,98,101,104,107,110,112,115,118,121,124,127,130,133,136,139,141,144,147,150,153,156,159,162,165,167,170,173,176,179,182,185,188,191,194,196,199,202,205,208,211,214,217,220,223,225,228,231,234,237,240,243,246,249,252,254,257,260,263,266,269,272,275,278,281,283,286,289,292,295,298,301,304,307,309],[0,21,24,27,29,32,35,37,40,43,45,48,51,53,56,59,61,64,67,69,72,75,77,80,83,85,88,91,93,96,99,101,104,107,109,112,115,117,120,123,125,128,131,133,136,139,141,144,147,149,152,155,157,160,163,165,168,171,173,176,179,181,184,187,189,192,195,197,200,203,205,208,211,213,216,219,221,224,227,229,232,235,237,240,243,245,248,251,253,256,259,261,264,267,269,272,275,277,280,282]]},
+{"id":5,"expParams":[30,20,30,30],"traits":[{"code":23,"dataId":0,"value":1},{"code":22,"dataId":0,"value":0.95},{"code":22,"dataId":1,"value":0.05},{"code":22,"dataId":2,"value":0.04},{"code":41,"dataId":2,"value":0},{"code":51,"dataId":3,"value":0},{"code":51,"dataId":11,"value":0},{"code":51,"dataId":10,"value":0},{"code":52,"dataId":1,"value":0},{"code":52,"dataId":3,"value":0},{"code":52,"dataId":5,"value":1}],"learnings":[{"level":1,"note":"","skillId":175},{"level":2,"note":"","skillId":172},{"level":5,"note":"","skillId":216},{"level":8,"note":"","skillId":217},{"level":12,"note":"","skillId":218},{"level":15,"note":"","skillId":174},{"level":20,"note":"","skillId":219}],"name":"Martial Artist","note":"","params":[[1,639,717,794,872,949,1027,1104,1182,1259,1337,1414,1492,1569,1647,1724,1802,1879,1957,2034,2112,2189,2267,2344,2422,2499,2577,2654,2732,2809,2887,2964,3042,3119,3197,3274,3352,3429,3507,3584,3662,3739,3817,3894,3972,4049,4127,4204,4282,4359,4436,4514,4591,4669,4746,4824,4901,4979,5056,5134,5211,5289,5366,5444,5521,5599,5676,5754,5831,5909,5986,6064,6141,6219,6296,6374,6451,6529,6606,6684,6761,6839,6916,6994,7071,7149,7226,7304,7381,7459,7536,7614,7691,7769,7846,7924,8001,8079,8156,8233],[0,44,54,63,72,81,91,100,109,118,127,137,146,155,164,173,183,192,201,210,219,229,238,247,256,265,275,284,293,302,311,321,330,339,348,357,367,376,385,394,403,413,422,431,440,449,459,468,477,486,495,505,514,523,532,542,551,560,569,578,588,597,606,615,624,634,643,652,661,670,680,689,698,707,716,726,735,744,753,762,772,781,790,799,808,818,827,836,845,854,864,873,882,891,900,910,919,928,937,946],[1,18,20,22,24,26,28,29,31,33,35,37,38,40,42,44,46,48,49,51,53,55,57,58,60,62,64,66,68,69,71,73,75,77,78,80,82,84,86,88,89,91,93,95,97,98,100,102,104,106,107,109,111,113,115,117,118,120,122,124,126,127,129,131,133,135,137,138,140,142,144,146,147,149,151,153,155,157,158,160,162,164,166,167,169,171,173,175,177,178,180,182,184,186,187,189,191,193,195,196],[1,20,22,24,25,27,29,30,32,34,35,37,39,40,42,44,45,47,49,50,52,54,55,57,59,60,62,64,65,67,69,70,72,74,75,77,79,80,82,84,85,87,89,90,92,94,95,97,99,100,102,104,105,107,109,110,112,114,115,117,119,120,122,124,125,127,129,130,132,134,135,137,139,140,142,144,145,147,149,150,152,154,155,157,159,160,162,164,165,167,169,170,172,174,175,177,179,180,182,183],[1,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,104],[1,11,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110],[1,34,38,41,44,47,51,54,57,60,64,67,70,73,77,80,83,86,89,93,96,99,102,106,109,112,115,119,122,125,128,132,135,138,141,144,148,151,154,157,161,164,167,170,174,177,180,183,187,190,193,196,199,203,206,209,212,216,219,222,225,229,232,235,238,242,245,248,251,254,258,261,264,267,271,274,277,280,284,287,290,293,297,300,303,306,309,313,316,319,322,326,329,332,335,339,342,345,348,351],[1,26,30,33,36,39,42,46,49,52,55,58,62,65,68,71,74,78,81,84,87,90,94,97,100,103,106,110,113,116,119,122,126,129,132,135,138,141,145,148,151,154,157,161,164,167,170,173,177,180,183,186,189,193,196,199,202,205,209,212,215,218,221,225,228,231,234,237,240,244,247,250,253,256,260,263,266,269,272,276,279,282,285,288,292,295,298,301,304,308,311,314,317,320,324,327,330,333,336,339]]},
+{"id":6,"expParams":[30,20,30,30],"traits":[{"code":23,"dataId":0,"value":1},{"code":22,"dataId":0,"value":1},{"code":22,"dataId":1,"value":0.05},{"code":22,"dataId":2,"value":0.1},{"code":41,"dataId":1,"value":1},{"code":41,"dataId":2,"value":1},{"code":51,"dataId":2,"value":0},{"code":51,"dataId":6,"value":0},{"code":52,"dataId":1,"value":0},{"code":52,"dataId":3,"value":0},{"code":52,"dataId":5,"value":0},{"code":52,"dataId":2,"value":1}],"learnings":[{"level":2,"note":"","skillId":172},{"level":5,"note":"","skillId":173},{"level":8,"note":"","skillId":175},{"level":12,"note":"","skillId":176},{"level":15,"note":"","skillId":174},{"level":20,"note":"","skillId":177},{"level":1,"note":"","skillId":107},{"level":5,"note":"","skillId":190},{"level":5,"note":"","skillId":187},{"level":8,"note":"","skillId":108},{"level":8,"note":"","skillId":191},{"level":12,"note":"","skillId":111},{"level":15,"note":"","skillId":192},{"level":20,"note":"","skillId":109}],"name":"Magic Swordsman","note":"","params":[[1,544,618,691,764,838,911,984,1058,1131,1204,1278,1351,1424,1497,1571,1644,1717,1791,1864,1937,2011,2084,2157,2231,2304,2377,2450,2524,2597,2670,2744,2817,2890,2964,3037,3110,3184,3257,3330,3403,3477,3550,3623,3697,3770,3843,3917,3990,4063,4136,4210,4283,4356,4430,4503,4576,4650,4723,4796,4870,4943,5016,5089,5163,5236,5309,5383,5456,5529,5603,5676,5749,5823,5896,5969,6042,6116,6189,6262,6336,6409,6482,6556,6629,6702,6776,6849,6922,6995,7069,7142,7215,7289,7362,7435,7509,7582,7655,7728],[0,117,131,145,159,172,186,200,213,227,241,254,268,282,295,309,323,336,350,364,377,391,405,418,432,446,459,473,487,500,514,528,541,555,569,582,596,610,623,637,651,664,678,692,705,719,733,746,760,774,787,801,815,829,842,856,870,883,897,911,924,938,952,965,979,993,1006,1020,1034,1047,1061,1075,1088,1102,1116,1129,1143,1157,1170,1184,1198,1211,1225,1239,1252,1266,1280,1293,1307,1321,1334,1348,1362,1375,1389,1403,1416,1430,1444,1457],[1,19,21,23,24,26,28,29,31,33,34,36,38,39,41,42,44,46,47,49,51,52,54,56,57,59,61,62,64,65,67,69,70,72,74,75,77,79,80,82,84,85,87,88,90,92,93,95,97,98,100,102,103,105,107,108,110,111,113,115,116,118,120,121,123,125,126,128,130,131,133,134,136,138,139,141,143,144,146,148,149,151,153,154,156,157,159,161,162,164,166,167,169,171,172,174,176,177,179,180],[1,19,21,23,25,26,28,30,31,33,35,36,38,40,41,43,45,46,48,50,51,53,55,56,58,60,61,63,65,66,68,70,71,73,75,76,78,80,81,83,85,86,88,90,91,93,95,96,98,100,101,103,105,107,108,110,112,113,115,117,118,120,122,123,125,127,128,130,132,133,135,137,138,140,142,143,145,147,148,150,152,153,155,157,158,160,162,163,165,167,168,170,172,173,175,177,178,180,182,183],[1,19,21,23,25,26,28,30,32,33,35,37,39,40,42,44,46,47,49,51,52,54,56,58,59,61,63,65,66,68,70,72,73,75,77,78,80,82,84,85,87,89,91,92,94,96,98,99,101,103,104,106,108,110,111,113,115,117,118,120,122,124,125,127,129,131,132,134,136,137,139,141,143,144,146,148,150,151,153,155,157,158,160,162,163,165,167,169,170,172,174,176,177,179,181,183,184,186,188,189],[1,19,21,23,25,26,28,30,31,33,35,37,38,40,42,43,45,47,49,50,52,54,55,57,59,61,62,64,66,67,69,71,73,74,76,78,79,81,83,85,86,88,90,91,93,95,97,98,100,102,103,105,107,109,110,112,114,115,117,119,121,122,124,126,127,129,131,133,134,136,138,139,141,143,145,146,148,150,151,153,155,157,158,160,162,163,165,167,169,170,172,174,175,177,179,181,182,184,186,187],[1,21,24,27,29,32,34,37,39,42,45,47,50,52,55,57,60,62,65,68,70,73,75,78,80,83,86,88,91,93,96,98,101,103,106,109,111,114,116,119,121,124,127,129,132,134,137,139,142,144,147,150,152,155,157,160,162,165,167,170,173,175,178,180,183,185,188,191,193,196,198,201,203,206,208,211,214,216,219,221,224,226,229,232,234,237,239,242,244,247,249,252,255,257,260,262,265,267,270,272],[1,24,27,30,33,35,38,41,43,46,49,52,54,57,60,62,65,68,70,73,76,79,81,84,87,89,92,95,98,100,103,106,108,111,114,116,119,122,125,127,130,133,135,138,141,143,146,149,152,154,157,160,162,165,168,171,173,176,179,181,184,187,189,192,195,198,200,203,206,208,211,214,216,219,222,225,227,230,233,235,238,241,244,246,249,252,254,257,260,262,265,268,271,273,276,279,281,284,287,289]]},
+{"id":7,"expParams":[30,20,30,30],"traits":[{"code":23,"dataId":0,"value":1},{"code":22,"dataId":0,"value":0.95},{"code":22,"dataId":1,"value":0.05},{"code":22,"dataId":2,"value":0.04},{"code":41,"dataId":2,"value":0},{"code":51,"dataId":7,"value":0},{"code":51,"dataId":8,"value":0},{"code":52,"dataId":1,"value":0},{"code":52,"dataId":3,"value":0}],"learnings":[{"level":2,"note":"","skillId":226},{"level":5,"note":"","skillId":197},{"level":8,"note":"","skillId":208},{"level":12,"note":"","skillId":227},{"level":15,"note":"","skillId":228},{"level":20,"note":"","skillId":229}],"name":"Hunter","note":"","params":[[1,335,384,433,481,530,578,627,676,724,773,821,870,919,967,1016,1064,1113,1162,1210,1259,1307,1356,1405,1453,1502,1550,1599,1647,1696,1745,1793,1842,1890,1939,1988,2036,2085,2133,2182,2231,2279,2328,2376,2425,2474,2522,2571,2619,2668,2716,2765,2814,2862,2911,2959,3008,3057,3105,3154,3202,3251,3300,3348,3397,3445,3494,3543,3591,3640,3688,3737,3786,3834,3883,3931,3980,4028,4077,4126,4174,4223,4271,4320,4369,4417,4466,4514,4563,4612,4660,4709,4757,4806,4855,4903,4952,5000,5049,5097],[0,70,80,90,100,109,119,129,139,148,158,168,177,187,197,207,216,226,236,246,255,265,275,284,294,304,314,323,333,343,353,362,372,382,391,401,411,421,430,440,450,459,469,479,489,498,508,518,528,537,547,557,566,576,586,596,605,615,625,635,644,654,664,673,683,693,703,712,722,732,741,751,761,771,780,790,800,810,819,829,839,848,858,868,878,887,897,907,917,926,936,946,955,965,975,985,994,1004,1014,1023],[1,17,19,20,22,23,24,26,27,29,30,31,33,34,36,37,38,40,41,43,44,45,47,48,50,51,52,54,55,57,58,59,61,62,64,65,66,68,69,71,72,73,75,76,78,79,80,82,83,85,86,87,89,90,92,93,94,96,97,99,100,101,103,104,106,107,108,110,111,113,114,115,117,118,120,121,122,124,125,127,128,129,131,132,134,135,136,138,139,141,142,143,145,146,148,149,150,152,153,154],[1,14,16,17,18,20,21,22,23,25,26,27,29,30,31,32,34,35,36,37,39,40,41,43,44,45,46,48,49,50,51,53,54,55,57,58,59,60,62,63,64,66,67,68,69,71,72,73,74,76,77,78,80,81,82,83,85,86,87,88,90,91,92,94,95,96,97,99,100,101,103,104,105,106,108,109,110,111,113,114,115,117,118,119,120,122,123,124,125,127,128,129,131,132,133,134,136,137,138,139],[1,15,17,18,20,21,23,24,26,27,29,30,32,33,35,36,38,39,40,42,43,45,46,48,49,51,52,54,55,57,58,60,61,63,64,65,67,68,70,71,73,74,76,77,79,80,82,83,85,86,87,89,90,92,93,95,96,98,99,101,102,104,105,107,108,110,111,112,114,115,117,118,120,121,123,124,126,127,129,130,132,133,135,136,137,139,140,142,143,145,146,148,149,151,152,154,155,157,158,159],[1,16,18,19,21,22,24,25,26,28,29,31,32,34,35,36,38,39,41,42,44,45,46,48,49,51,52,54,55,56,58,59,61,62,64,65,66,68,69,71,72,74,75,76,78,79,81,82,84,85,86,88,89,91,92,94,95,96,98,99,101,102,104,105,106,108,109,111,112,114,115,116,118,119,121,122,124,125,126,128,129,131,132,134,135,136,138,139,141,142,144,145,146,148,149,151,152,154,155,156],[1,33,37,40,44,47,50,54,57,61,64,67,71,74,78,81,84,88,91,94,98,101,105,108,111,115,118,122,125,128,132,135,139,142,145,149,152,155,159,162,166,169,172,176,179,183,186,189,193,196,199,203,206,210,213,216,220,223,227,230,233,237,240,244,247,250,254,257,260,264,267,271,274,277,281,284,288,291,294,298,301,305,308,311,315,318,321,325,328,332,335,338,342,345,349,352,355,359,362,365],[1,31,35,39,43,46,50,54,58,61,65,69,73,76,80,84,88,91,95,99,103,106,110,114,118,121,125,129,133,136,140,144,148,151,155,159,163,166,170,174,178,181,185,189,193,196,200,204,208,211,215,219,222,226,230,234,237,241,245,249,252,256,260,264,267,271,275,279,282,286,290,294,297,301,305,309,312,316,320,324,327,331,335,339,342,346,350,354,357,361,365,369,372,376,380,384,387,391,395,398]]},
+{"id":8,"expParams":[30,20,30,30],"traits":[{"code":23,"dataId":0,"value":1},{"code":22,"dataId":0,"value":0.95},{"code":22,"dataId":1,"value":0.05},{"code":22,"dataId":2,"value":0.04},{"code":41,"dataId":2,"value":0},{"code":51,"dataId":1,"value":0},{"code":52,"dataId":1,"value":0},{"code":52,"dataId":3,"value":0},{"code":55,"dataId":1,"value":1}],"learnings":[{"level":1,"note":"","skillId":206},{"level":3,"note":"","skillId":207},{"level":3,"note":"","skillId":208},{"level":5,"note":"","skillId":174},{"level":8,"note":"","skillId":209},{"level":10,"note":"","skillId":211},{"level":15,"note":"","skillId":210}],"name":"Bandit","note":"","params":[[1,379,428,476,524,572,620,668,716,764,812,860,909,957,1005,1053,1101,1149,1197,1245,1293,1341,1389,1438,1486,1534,1582,1630,1678,1726,1774,1822,1870,1918,1967,2015,2063,2111,2159,2207,2255,2303,2351,2399,2447,2496,2544,2592,2640,2688,2736,2784,2832,2880,2928,2976,3025,3073,3121,3169,3217,3265,3313,3361,3409,3457,3505,3554,3602,3650,3698,3746,3794,3842,3890,3938,3986,4034,4083,4131,4179,4227,4275,4323,4371,4419,4467,4515,4563,4612,4660,4708,4756,4804,4852,4900,4948,4996,5044,5092],[0,61,72,83,94,105,115,126,137,148,158,169,180,191,202,212,223,234,245,255,266,277,288,299,309,320,331,342,352,363,374,385,396,406,417,428,439,449,460,471,482,493,503,514,525,536,546,557,568,579,589,600,611,622,633,643,654,665,676,686,697,708,719,730,740,751,762,773,783,794,805,816,827,837,848,859,870,880,891,902,913,924,934,945,956,967,977,988,999,1010,1021,1031,1042,1053,1064,1074,1085,1096,1107,1117],[1,14,16,17,19,20,21,23,24,25,27,28,30,31,32,34,35,36,38,39,40,42,43,45,46,47,49,50,51,53,54,56,57,58,60,61,62,64,65,66,68,69,71,72,73,75,76,77,79,80,81,83,84,86,87,88,90,91,92,94,95,97,98,99,101,102,103,105,106,107,109,110,112,113,114,116,117,118,120,121,123,124,125,127,128,129,131,132,133,135,136,138,139,140,142,143,144,146,147,148],[1,15,17,18,19,20,21,22,24,25,26,27,28,29,30,32,33,34,35,36,37,39,40,41,42,43,44,45,47,48,49,50,51,52,54,55,56,57,58,59,60,62,63,64,65,66,67,69,70,71,72,73,74,75,77,78,79,80,81,82,84,85,86,87,88,89,90,92,93,94,95,96,97,99,100,101,102,103,104,105,107,108,109,110,111,112,114,115,116,117,118,119,120,122,123,124,125,126,127,128],[1,13,15,16,18,19,20,22,23,24,26,27,28,30,31,32,34,35,36,38,39,40,42,43,44,46,47,49,50,51,53,54,55,57,58,59,61,62,63,65,66,67,69,70,71,73,74,75,77,78,79,81,82,84,85,86,88,89,90,92,93,94,96,97,98,100,101,102,104,105,106,108,109,110,112,113,115,116,117,119,120,121,123,124,125,127,128,129,131,132,133,135,136,137,139,140,141,143,144,145],[1,16,18,19,21,22,24,25,27,28,30,31,33,34,36,37,39,40,42,43,45,46,48,49,51,52,54,55,57,58,60,61,63,64,66,67,69,70,72,73,75,76,78,79,81,82,84,85,87,88,90,91,93,94,96,97,99,100,102,103,105,106,108,109,111,112,114,115,117,118,120,121,123,124,126,127,129,130,132,133,135,136,138,139,141,142,144,145,147,148,150,151,153,154,156,157,159,160,162,163],[1,37,42,46,50,54,58,63,67,71,75,79,84,88,92,96,100,105,109,113,117,121,126,130,134,138,142,147,151,155,159,163,168,172,176,180,184,188,193,197,201,205,209,214,218,222,226,230,235,239,243,247,251,256,260,264,268,272,277,281,285,289,293,298,302,306,310,314,318,323,327,331,335,339,344,348,352,356,360,365,369,373,377,381,386,390,394,398,402,407,411,415,419,423,428,432,436,440,444,448],[1,39,43,47,51,55,59,63,67,71,75,79,83,87,91,95,99,103,107,111,115,119,123,127,131,135,138,142,146,150,154,158,162,166,170,174,178,182,186,190,194,198,202,206,210,214,218,222,226,230,233,237,241,245,249,253,257,261,265,269,273,277,281,285,289,293,297,301,305,309,313,317,321,325,329,332,336,340,344,348,352,356,360,364,368,372,376,380,384,388,392,396,400,404,408,412,416,420,424,427]]}
+]
\ No newline at end of file
diff --git a/data/CommonEvents.json b/data/CommonEvents.json
new file mode 100644
index 0000000..2bc9c27
--- /dev/null
+++ b/data/CommonEvents.json
@@ -0,0 +1,7 @@
+[
+null,
+{"id":1,"list":[{"code":0,"indent":0,"parameters":[]}],"name":"","switchId":1,"trigger":0},
+{"id":2,"list":[{"code":0,"indent":0,"parameters":[]}],"name":"","switchId":1,"trigger":0},
+{"id":3,"list":[{"code":0,"indent":0,"parameters":[]}],"name":"","switchId":1,"trigger":0},
+{"id":4,"list":[{"code":0,"indent":0,"parameters":[]}],"name":"","switchId":1,"trigger":0}
+]
\ No newline at end of file
diff --git a/data/Enemies.json b/data/Enemies.json
new file mode 100644
index 0000000..4a0e1c6
--- /dev/null
+++ b/data/Enemies.json
@@ -0,0 +1,8 @@
+[
+null,
+{"id":1,"actions":[{"conditionParam1":0,"conditionParam2":0,"conditionType":0,"rating":5,"skillId":1},{"skillId":20,"rating":5,"conditionType":0,"conditionParam1":0,"conditionParam2":0}],"battlerHue":0,"battlerName":"Goblin","dropItems":[{"dataId":1,"denominator":1,"kind":0},{"dataId":1,"denominator":1,"kind":0},{"dataId":1,"denominator":1,"kind":0}],"exp":10,"traits":[{"code":22,"dataId":0,"value":0.95},{"code":22,"dataId":1,"value":0.05},{"code":31,"dataId":1,"value":0}],"gold":5,"name":"Goblin","note":"","params":[200,0,25,20,20,20,20,20]},
+{"id":2,"actions":[{"conditionParam1":0,"conditionParam2":0,"conditionType":0,"rating":5,"skillId":1},{"skillId":23,"rating":3,"conditionType":1,"conditionParam1":0,"conditionParam2":2}],"battlerHue":0,"battlerName":"Gnome","dropItems":[{"dataId":1,"denominator":1,"kind":0},{"dataId":1,"denominator":1,"kind":0},{"dataId":1,"denominator":1,"kind":0}],"exp":10,"traits":[{"code":22,"dataId":0,"value":0.95},{"code":22,"dataId":1,"value":0.05},{"code":31,"dataId":1,"value":0}],"gold":8,"name":"Gnome","note":"","params":[250,0,20,25,20,20,20,20]},
+{"id":3,"actions":[{"conditionParam1":0,"conditionParam2":0,"conditionType":0,"rating":5,"skillId":1}],"battlerHue":0,"battlerName":"Crow","dropItems":[{"dataId":1,"denominator":1,"kind":0},{"dataId":1,"denominator":1,"kind":0},{"dataId":1,"denominator":1,"kind":0}],"exp":15,"traits":[{"code":22,"dataId":0,"value":0.95},{"code":22,"dataId":1,"value":0.1},{"code":31,"dataId":1,"value":0}],"gold":8,"name":"Crow","note":"","params":[250,50,25,20,20,20,25,20]},
+{"id":4,"actions":[{"conditionParam1":0,"conditionParam2":0,"conditionType":0,"rating":5,"skillId":1},{"skillId":52,"rating":4,"conditionType":2,"conditionParam1":0,"conditionParam2":0.3}],"battlerHue":0,"battlerName":"Treant","dropItems":[{"dataId":1,"denominator":1,"kind":0},{"dataId":1,"denominator":1,"kind":0},{"dataId":1,"denominator":1,"kind":0}],"exp":30,"traits":[{"code":22,"dataId":0,"value":0.95},{"code":22,"dataId":1,"value":0.05},{"code":31,"dataId":1,"value":0},{"code":11,"dataId":2,"value":2}],"gold":15,"name":"Treant","note":"","params":[500,50,30,20,30,30,30,30]},
+{"id":5,"actions":[{"conditionParam1":0,"conditionParam2":0,"conditionType":0,"rating":5,"skillId":1},{"skillId":99,"rating":4,"conditionType":1,"conditionParam1":0,"conditionParam2":2},{"skillId":13,"rating":6,"conditionType":2,"conditionParam1":0,"conditionParam2":0.3}],"battlerHue":0,"battlerName":"Hi_monster","dropItems":[{"dataId":1,"denominator":1,"kind":0},{"dataId":1,"denominator":1,"kind":0},{"dataId":1,"denominator":1,"kind":0}],"exp":100,"traits":[{"code":22,"dataId":0,"value":0.95},{"code":22,"dataId":1,"value":0.05},{"code":31,"dataId":1,"value":0},{"code":63,"dataId":1,"value":1}],"gold":50,"name":"Hi_monster","note":"","params":[1000,50,40,20,40,40,40,40]}
+]
\ No newline at end of file
diff --git a/data/Items.json b/data/Items.json
new file mode 100644
index 0000000..05cd004
--- /dev/null
+++ b/data/Items.json
@@ -0,0 +1,33 @@
+[
+null,
+{"id":1,"animationId":0,"consumable":true,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Below are spaces for when you would like to display\nitems above the recovery items.","effects":[],"hitType":0,"iconIndex":0,"itypeId":1,"name":"-----Reserved","note":"","occasion":3,"price":0,"repeats":1,"scope":7,"speed":0,"successRate":100,"tpGain":0},
+{"id":2,"animationId":0,"consumable":true,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"itypeId":1,"name":"","note":"","occasion":0,"price":0,"repeats":1,"scope":7,"speed":0,"successRate":100,"tpGain":0},
+{"id":3,"animationId":0,"consumable":true,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"itypeId":1,"name":"","note":"","occasion":0,"price":0,"repeats":1,"scope":7,"speed":0,"successRate":100,"tpGain":0},
+{"id":4,"animationId":0,"consumable":true,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"itypeId":1,"name":"","note":"","occasion":0,"price":0,"repeats":1,"scope":7,"speed":0,"successRate":100,"tpGain":0},
+{"id":5,"animationId":0,"consumable":true,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"itypeId":1,"name":"","note":"","occasion":0,"price":0,"repeats":1,"scope":7,"speed":0,"successRate":100,"tpGain":0},
+{"id":6,"animationId":0,"consumable":true,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"itypeId":1,"name":"-----Recovery Items","note":"","occasion":3,"price":0,"repeats":1,"scope":7,"speed":0,"successRate":100,"tpGain":0},
+{"id":7,"animationId":41,"consumable":true,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Restores HP by 500 points.","effects":[{"code":11,"dataId":0,"value1":0,"value2":500}],"hitType":0,"iconIndex":176,"itypeId":1,"name":"Potion","note":"","occasion":0,"price":100,"repeats":1,"scope":7,"speed":0,"successRate":100,"tpGain":0},
+{"id":8,"animationId":41,"consumable":true,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Restores HP by 1500 points.","effects":[{"code":11,"dataId":0,"value1":0,"value2":1500}],"hitType":0,"iconIndex":176,"itypeId":1,"name":"Super Potion","note":"","occasion":0,"price":250,"repeats":1,"scope":7,"speed":0,"successRate":100,"tpGain":0},
+{"id":9,"animationId":41,"consumable":true,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Completely restores HP.","effects":[{"code":11,"dataId":0,"value1":1,"value2":0}],"hitType":0,"iconIndex":176,"itypeId":1,"name":"Full Potion","note":"","occasion":0,"price":550,"repeats":1,"scope":7,"speed":0,"successRate":100,"tpGain":0},
+{"id":10,"animationId":41,"consumable":true,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Restores MP by 300 points.","effects":[{"code":12,"dataId":0,"value1":0,"value2":300}],"hitType":0,"iconIndex":176,"itypeId":1,"name":"Magic Water","note":"","occasion":0,"price":300,"repeats":1,"scope":7,"speed":0,"successRate":100,"tpGain":0},
+{"id":11,"animationId":49,"consumable":true,"damage":{"critical":false,"elementId":0,"formula":"b.mhp / 2","type":3,"variance":20},"description":"Raises the subject from the dead. (Restores HP by half.)","effects":[{"code":22,"dataId":1,"value1":1,"value2":0}],"hitType":0,"iconIndex":176,"itypeId":1,"name":"Stimulant","note":"","occasion":0,"price":500,"repeats":1,"scope":9,"speed":0,"successRate":100,"tpGain":0},
+{"id":12,"animationId":46,"consumable":true,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Removes all status ailments.\nCannot revive a someone from being dead.","effects":[{"code":22,"dataId":4,"value1":1,"value2":0},{"code":22,"dataId":5,"value1":1,"value2":0},{"code":22,"dataId":6,"value1":1,"value2":0},{"code":22,"dataId":7,"value1":1,"value2":0},{"code":22,"dataId":8,"value1":1,"value2":0},{"code":22,"dataId":9,"value1":1,"value2":0},{"code":22,"dataId":10,"value1":1,"value2":0},{"code":22,"dataId":13,"value1":1,"value2":0},{"code":22,"dataId":12,"value1":1,"value2":0}],"hitType":0,"iconIndex":176,"itypeId":1,"name":"Dispel Herb","note":"","occasion":0,"price":200,"repeats":1,"scope":7,"speed":0,"successRate":100,"tpGain":0},
+{"id":13,"animationId":45,"consumable":true,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Cures Poison or Paralysis states.","effects":[{"code":22,"dataId":4,"value1":1,"value2":0},{"code":22,"dataId":12,"value1":1,"value2":0}],"hitType":0,"iconIndex":176,"itypeId":1,"name":"Antidote","note":"","occasion":0,"price":80,"repeats":1,"scope":7,"speed":0,"successRate":100,"tpGain":0},
+{"id":14,"animationId":41,"consumable":true,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Restores HP and MP by half.","effects":[{"code":11,"dataId":0,"value1":0.5,"value2":0},{"code":12,"dataId":0,"value1":0.5,"value2":0}],"hitType":0,"iconIndex":176,"itypeId":1,"name":"Miracle Drop","note":"","occasion":0,"price":450,"repeats":1,"scope":7,"speed":0,"successRate":100,"tpGain":0},
+{"id":15,"animationId":41,"consumable":true,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Completely restores HP and MP.","effects":[{"code":11,"dataId":0,"value1":1,"value2":0},{"code":12,"dataId":0,"value1":1,"value2":0}],"hitType":0,"iconIndex":176,"itypeId":1,"name":"Elixir","note":"","occasion":0,"price":1200,"repeats":1,"scope":7,"speed":0,"successRate":100,"tpGain":0},
+{"id":16,"animationId":0,"consumable":true,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"itypeId":1,"name":"","note":"","occasion":0,"price":0,"repeats":1,"scope":7,"speed":0,"successRate":100,"tpGain":0},
+{"id":17,"animationId":0,"consumable":true,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"itypeId":1,"name":"-----Specialty Items","note":"","occasion":3,"price":0,"repeats":1,"scope":7,"speed":0,"successRate":100,"tpGain":0},
+{"id":18,"animationId":51,"consumable":true,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Halves the number of enemies you will encounter\nfor a while.","effects":[{"code":21,"dataId":29,"value1":1,"value2":0}],"hitType":0,"iconIndex":176,"itypeId":1,"name":"Encounter Decreaser","note":"","occasion":2,"price":100,"repeats":1,"scope":11,"speed":0,"successRate":100,"tpGain":0},
+{"id":19,"animationId":51,"consumable":true,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Increases items and money gained from battle for\na while.","effects":[{"code":21,"dataId":30,"value1":1,"value2":0}],"hitType":0,"iconIndex":176,"itypeId":1,"name":"Drop Increaser","note":"","occasion":0,"price":300,"repeats":1,"scope":11,"speed":0,"successRate":100,"tpGain":0},
+{"id":20,"animationId":0,"consumable":true,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"itypeId":1,"name":"","note":"","occasion":0,"price":0,"repeats":1,"scope":7,"speed":0,"successRate":100,"tpGain":0},
+{"id":21,"animationId":0,"consumable":true,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"itypeId":1,"name":"","note":"","occasion":0,"price":0,"repeats":1,"scope":7,"speed":0,"successRate":100,"tpGain":0},
+{"id":22,"animationId":0,"consumable":true,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"itypeId":1,"name":"-----Enhancement Items","note":"","occasion":3,"price":0,"repeats":1,"scope":7,"speed":0,"successRate":100,"tpGain":0},
+{"id":23,"animationId":51,"consumable":true,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Increases max HP by 50 points.","effects":[{"code":42,"dataId":0,"value1":50,"value2":0}],"hitType":0,"iconIndex":32,"itypeId":1,"name":"HP Increase","note":"","occasion":2,"price":3000,"repeats":1,"scope":7,"speed":0,"successRate":100,"tpGain":0},
+{"id":24,"animationId":51,"consumable":true,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Increases max MP by 10 points.","effects":[{"code":42,"dataId":1,"value1":10,"value2":0}],"hitType":0,"iconIndex":33,"itypeId":1,"name":"MP Increase","note":"","occasion":2,"price":3000,"repeats":1,"scope":7,"speed":0,"successRate":100,"tpGain":0},
+{"id":25,"animationId":51,"consumable":true,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Increases Attack by 3 points.","effects":[{"code":42,"dataId":2,"value1":3,"value2":0}],"hitType":0,"iconIndex":34,"itypeId":1,"name":"Attack Increase","note":"","occasion":2,"price":3000,"repeats":1,"scope":7,"speed":0,"successRate":100,"tpGain":0},
+{"id":26,"animationId":51,"consumable":true,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Increases Defense by 3 points.","effects":[{"code":42,"dataId":3,"value1":3,"value2":0}],"hitType":0,"iconIndex":35,"itypeId":1,"name":"Defense Increase","note":"","occasion":2,"price":3000,"repeats":1,"scope":7,"speed":0,"successRate":100,"tpGain":0},
+{"id":27,"animationId":51,"consumable":true,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Increases M.Attack by 3 points.","effects":[{"code":42,"dataId":4,"value1":3,"value2":0}],"hitType":0,"iconIndex":36,"itypeId":1,"name":"Magic Increase","note":"","occasion":2,"price":3000,"repeats":1,"scope":7,"speed":0,"successRate":100,"tpGain":0},
+{"id":28,"animationId":51,"consumable":true,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Increases M.Defense by 3 points.","effects":[{"code":42,"dataId":5,"value1":3,"value2":0}],"hitType":0,"iconIndex":37,"itypeId":1,"name":"Resistance Increase","note":"","occasion":2,"price":3000,"repeats":1,"scope":7,"speed":0,"successRate":100,"tpGain":0},
+{"id":29,"animationId":51,"consumable":true,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Increases Agility by 3 points.","effects":[{"code":42,"dataId":6,"value1":3,"value2":0}],"hitType":0,"iconIndex":38,"itypeId":1,"name":"Agility Increase","note":"","occasion":2,"price":3000,"repeats":1,"scope":7,"speed":0,"successRate":100,"tpGain":0},
+{"id":30,"animationId":51,"consumable":true,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Increases Luck by 3 points.","effects":[{"code":42,"dataId":7,"value1":3,"value2":0}],"hitType":0,"iconIndex":39,"itypeId":1,"name":"Luck Increase","note":"","occasion":2,"price":3000,"repeats":1,"scope":7,"speed":0,"successRate":100,"tpGain":0}
+]
\ No newline at end of file
diff --git a/data/MapInfos.json b/data/MapInfos.json
new file mode 100644
index 0000000..c5a786d
--- /dev/null
+++ b/data/MapInfos.json
@@ -0,0 +1,3 @@
+[
+null
+]
\ No newline at end of file
diff --git a/data/Skills.json b/data/Skills.json
new file mode 100644
index 0000000..ce335cc
--- /dev/null
+++ b/data/Skills.json
@@ -0,0 +1,238 @@
+[
+null,
+{"id":1,"animationId":-1,"damage":{"critical":true,"elementId":-1,"formula":"a.atk * 4 - b.def * 2","type":1,"variance":20},"description":"","effects":[{"code":21,"dataId":0,"value1":1,"value2":0}],"hitType":1,"iconIndex":76,"message1":"%1 attacks!","message2":"","mpCost":0,"name":"Attack","note":"Skill #1 corresponds to the Attack command.","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":0,"successRate":100,"tpCost":0,"tpGain":5,"messageType":1},
+{"id":2,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[{"code":21,"dataId":2,"value1":1,"value2":0}],"hitType":0,"iconIndex":81,"message1":"%1 guards.","message2":"","mpCost":0,"name":"Guard","note":"Skill #2 corresponds to the Guard command.","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":11,"speed":2000,"stypeId":0,"successRate":100,"tpCost":0,"tpGain":10,"messageType":1},
+{"id":3,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Below are spaces for when you would like to display\nthings above skills when you open the menu.","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"-----Reserved","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":4,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":5,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":6,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":7,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":8,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":9,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":10,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":11,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"-----Enemy","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":12,"animationId":-1,"damage":{"critical":true,"elementId":-1,"formula":"a.atk * 4 - b.def * 2","type":1,"variance":20},"description":"Performs a series of attacks on an enemy.","effects":[{"code":21,"dataId":0,"value1":1,"value2":0}],"hitType":1,"iconIndex":76,"message1":"%1 attacks!","message2":"","mpCost":0,"name":"Dual Attack","note":"","occasion":1,"repeats":2,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":2,"successRate":100,"tpCost":5,"tpGain":0,"messageType":1},
+{"id":13,"animationId":-1,"damage":{"critical":true,"elementId":-1,"formula":"a.atk * 4 - b.def * 2","type":1,"variance":20},"description":"Performs a double attack on a random enemy.","effects":[{"code":21,"dataId":0,"value1":1,"value2":0}],"hitType":1,"iconIndex":76,"message1":"%1 attacks!","message2":"","mpCost":0,"name":"Double Attack","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":4,"speed":0,"stypeId":2,"successRate":100,"tpCost":5,"tpGain":0,"messageType":1},
+{"id":14,"animationId":-1,"damage":{"critical":true,"elementId":-1,"formula":"a.atk * 4 - b.def * 2","type":1,"variance":20},"description":"Performs a triple attack on a random enemy.","effects":[{"code":21,"dataId":0,"value1":1,"value2":0}],"hitType":1,"iconIndex":76,"message1":"%1 attacks!","message2":"","mpCost":0,"name":"Triple Attack","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":5,"speed":0,"stypeId":2,"successRate":100,"tpCost":15,"tpGain":0,"messageType":1},
+{"id":15,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"The user flees from battle.","effects":[{"code":41,"dataId":0,"value1":0,"value2":0}],"hitType":0,"iconIndex":82,"message1":"%1 flees.","message2":"","mpCost":0,"name":"Escape","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":11,"speed":0,"stypeId":2,"successRate":100,"tpCost":5,"tpGain":0,"messageType":1},
+{"id":16,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Waits to see what happens.","effects":[],"hitType":0,"iconIndex":81,"message1":"%1 is waiting to see what happens.","message2":"","mpCost":0,"name":"Wait and See","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":0,"speed":0,"stypeId":2,"successRate":100,"tpCost":0,"tpGain":10,"messageType":1},
+{"id":17,"animationId":58,"damage":{"critical":false,"elementId":0,"formula":"a.atk * 2 - b.def","type":5,"variance":20},"description":"Absorbs HP from an enemy.","effects":[],"hitType":1,"iconIndex":5,"message1":"%1 sucks blood!","message2":"","mpCost":0,"name":"Blood Suck","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":2,"successRate":100,"tpCost":5,"tpGain":0,"messageType":1},
+{"id":18,"animationId":41,"damage":{"critical":false,"elementId":0,"formula":"b.mhp / 4","type":3,"variance":20},"description":"Restores the user’s HP.","effects":[],"hitType":0,"iconIndex":72,"message1":"%1 meditates!","message2":"","mpCost":0,"name":"Meditate","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":11,"speed":0,"stypeId":2,"successRate":100,"tpCost":5,"tpGain":0,"messageType":1},
+{"id":19,"animationId":15,"damage":{"critical":true,"elementId":0,"formula":"a.atk","type":1,"variance":20},"description":"Stabs an enemy with paralyzing needles.","effects":[{"code":21,"dataId":12,"value1":0.5,"value2":0}],"hitType":0,"iconIndex":9,"message1":"%1 does %2!","message2":"","mpCost":0,"name":"Tranquilizer","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":2,"successRate":100,"tpCost":5,"tpGain":0,"messageType":1},
+{"id":20,"animationId":39,"damage":{"critical":false,"elementId":0,"formula":"a.atk * 4 - b.def * 2","type":1,"variance":20},"description":"Inflicts damage and causes an enemy to lose balance.","effects":[{"code":21,"dataId":13,"value1":0.5,"value2":0}],"hitType":1,"iconIndex":78,"message1":"%1 does bodyslam!","message2":"","mpCost":0,"name":"Bodyslam","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":2,"successRate":100,"tpCost":5,"tpGain":0,"messageType":1},
+{"id":21,"animationId":77,"damage":{"critical":true,"elementId":4,"formula":"a.atk * 4 - b.def * 2","type":1,"variance":20},"description":"Inflicts Thunder-type damage and Paralysis state.","effects":[{"code":21,"dataId":12,"value1":0.3,"value2":0}],"hitType":0,"iconIndex":66,"message1":"%1 does %2!","message2":"","mpCost":0,"name":"Shock","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":2,"successRate":100,"tpCost":5,"tpGain":0,"messageType":1},
+{"id":22,"animationId":54,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Covers an enemy in slime and lowers their Agility.","effects":[{"code":32,"dataId":6,"value1":5,"value2":0}],"hitType":0,"iconIndex":9,"message1":"%1 shoots out slime!","message2":"","mpCost":0,"name":"Slime","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":2,"successRate":100,"tpCost":5,"tpGain":0,"messageType":1},
+{"id":23,"animationId":59,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Sprays an enemy with venom and inflicts Poison state.","effects":[{"code":21,"dataId":4,"value1":0.5,"value2":0}],"hitType":0,"iconIndex":2,"message1":"%1 uses %2!","message2":"","mpCost":0,"name":"Venom","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":2,"successRate":100,"tpCost":5,"tpGain":0,"messageType":1},
+{"id":24,"animationId":51,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Rouses the user’s fighting spirit and fortifies\ntheir abilities.","effects":[{"code":31,"dataId":2,"value1":5,"value2":0},{"code":31,"dataId":3,"value1":5,"value2":0},{"code":31,"dataId":5,"value1":5,"value2":0},{"code":31,"dataId":4,"value1":5,"value2":0},{"code":31,"dataId":6,"value1":5,"value2":0}],"hitType":0,"iconIndex":70,"message1":"%1 rouses their fighting spirit!","message2":"","mpCost":0,"name":"Shout","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":11,"speed":0,"stypeId":2,"successRate":100,"tpCost":10,"tpGain":0,"messageType":1},
+{"id":25,"animationId":58,"damage":{"critical":false,"elementId":0,"formula":"5 + a.mat * 0.2","type":6,"variance":5},"description":"Absorbs MP from an enemy.","effects":[],"hitType":1,"iconIndex":80,"message1":"%1 dances bizarrely!","message2":"","mpCost":0,"name":"Bizarre Dance","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":2,"successRate":100,"tpCost":10,"tpGain":0,"messageType":1},
+{"id":26,"animationId":64,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Glares at an enemy and paralyzes them.","effects":[{"code":21,"dataId":12,"value1":0.5,"value2":0}],"hitType":0,"iconIndex":9,"message1":"%1 does %2!","message2":"","mpCost":0,"name":"Petrify","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":2,"successRate":100,"tpCost":5,"tpGain":0,"messageType":1},
+{"id":27,"animationId":11,"damage":{"critical":true,"elementId":0,"formula":"a.atk","type":0,"variance":20},"description":"Blinds an enemy.","effects":[{"code":21,"dataId":5,"value1":0.5,"value2":0}],"hitType":0,"iconIndex":3,"message1":"%1 does %2!","message2":"","mpCost":0,"name":"Eye Poke","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":2,"successRate":100,"tpCost":10,"tpGain":0,"messageType":1},
+{"id":28,"animationId":94,"damage":{"critical":true,"elementId":0,"formula":"a.atk","type":0,"variance":20},"description":"Blinds all enemies.","effects":[{"code":21,"dataId":5,"value1":0.5,"value2":0}],"hitType":0,"iconIndex":3,"message1":"%1 does %2!","message2":"","mpCost":0,"name":"Sandstorm","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":0,"stypeId":2,"successRate":100,"tpCost":10,"tpGain":0,"messageType":1},
+{"id":29,"animationId":40,"damage":{"critical":true,"elementId":0,"formula":"a.atk","type":0,"variance":20},"description":"Blinds all enemies.","effects":[{"code":21,"dataId":5,"value1":0.5,"value2":0}],"hitType":0,"iconIndex":3,"message1":"%1 does %2!","message2":"","mpCost":0,"name":"Flash","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":0,"stypeId":2,"successRate":100,"tpCost":10,"tpGain":0,"messageType":1},
+{"id":30,"animationId":35,"damage":{"critical":true,"elementId":0,"formula":"a.atk","type":0,"variance":20},"description":"Poisons all enemies.","effects":[{"code":21,"dataId":4,"value1":0.5,"value2":0}],"hitType":0,"iconIndex":2,"message1":"%1 does %2!","message2":"","mpCost":0,"name":"Toxic Fog","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":0,"stypeId":2,"successRate":100,"tpCost":10,"tpGain":0,"messageType":1},
+{"id":31,"animationId":36,"damage":{"critical":true,"elementId":0,"formula":"a.atk","type":0,"variance":20},"description":"Puts all enemies to sleep.","effects":[{"code":21,"dataId":10,"value1":0.5,"value2":0}],"hitType":0,"iconIndex":80,"message1":"%1 sings a Lullaby!","message2":"","mpCost":0,"name":"Lullaby","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":0,"stypeId":2,"successRate":100,"tpCost":10,"tpGain":0,"messageType":1},
+{"id":32,"animationId":36,"damage":{"critical":true,"elementId":0,"formula":"a.atk","type":0,"variance":20},"description":"Charms all enemies.","effects":[{"code":21,"dataId":9,"value1":0.5,"value2":0}],"hitType":0,"iconIndex":80,"message1":"%1 sings an Alluring Melody!","message2":"","mpCost":0,"name":"Alluring Melody","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":0,"stypeId":2,"successRate":100,"tpCost":10,"tpGain":0,"messageType":1},
+{"id":33,"animationId":36,"damage":{"critical":true,"elementId":0,"formula":"a.atk","type":0,"variance":20},"description":"Seals all enemies’ magic.","effects":[{"code":21,"dataId":6,"value1":0.5,"value2":0}],"hitType":0,"iconIndex":80,"message1":"%1 sings a Song of Silence!","message2":"","mpCost":0,"name":"Song of Silence","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":0,"stypeId":2,"successRate":100,"tpCost":10,"tpGain":0,"messageType":1},
+{"id":34,"animationId":34,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Confuses all enemies.","effects":[{"code":21,"dataId":8,"value1":0.5,"value2":0}],"hitType":0,"iconIndex":6,"message1":"%1 does %2!","message2":"","mpCost":0,"name":"Sonic Wave","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":0,"stypeId":2,"successRate":100,"tpCost":5,"tpGain":0,"messageType":1},
+{"id":35,"animationId":87,"damage":{"critical":true,"elementId":6,"formula":"30 + a.atk","type":1,"variance":20},"description":"Inflicts Earth-type damage on all enemies.","effects":[],"hitType":1,"iconIndex":68,"message1":"%1 does %2!","message2":"","mpCost":0,"name":"Stone Throw","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":0,"stypeId":2,"successRate":100,"tpCost":10,"tpGain":0,"messageType":1},
+{"id":36,"animationId":93,"damage":{"critical":true,"elementId":7,"formula":"50 + a.atk * 2","type":1,"variance":20},"description":"Inflicts Wind-type damage on all enemies.","effects":[],"hitType":1,"iconIndex":69,"message1":"%1 does %2!","message2":"","mpCost":0,"name":"Dust Devil","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":0,"stypeId":2,"successRate":100,"tpCost":10,"tpGain":0,"messageType":1},
+{"id":37,"animationId":68,"damage":{"critical":true,"elementId":2,"formula":"30 + a.atk * 2","type":1,"variance":20},"description":"Inflicts Fire-type damage on all enemies.","effects":[],"hitType":0,"iconIndex":64,"message1":"%1 does %2!","message2":"","mpCost":0,"name":"Fire Breath","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":0,"stypeId":2,"successRate":100,"tpCost":10,"tpGain":0,"messageType":1},
+{"id":38,"animationId":74,"damage":{"critical":true,"elementId":3,"formula":"30 + a.atk * 2","type":1,"variance":20},"description":"Inflicts Ice-type damage on all enemies.","effects":[],"hitType":0,"iconIndex":65,"message1":"%1 does %2!","message2":"","mpCost":0,"name":"Ice Breath","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":0,"stypeId":2,"successRate":100,"tpCost":10,"tpGain":0,"messageType":1},
+{"id":39,"animationId":89,"damage":{"critical":true,"elementId":6,"formula":"100 + a.atk","type":1,"variance":20},"description":"Inflicts Earth-type damage on all enemies.","effects":[],"hitType":0,"iconIndex":68,"message1":"%1 causes an Earthquake!","message2":"","mpCost":0,"name":"Earthquake","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":0,"stypeId":2,"successRate":100,"tpCost":10,"tpGain":0,"messageType":1},
+{"id":40,"animationId":85,"damage":{"critical":true,"elementId":5,"formula":"100 + a.atk","type":1,"variance":20},"description":"Inflicts Water-type damage on all enemies.","effects":[],"hitType":0,"iconIndex":67,"message1":"%1 causes a Tsunami!","message2":"","mpCost":0,"name":"Tsunami","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":0,"stypeId":2,"successRate":100,"tpCost":10,"tpGain":0,"messageType":1},
+{"id":41,"animationId":16,"damage":{"critical":true,"elementId":-1,"formula":"a.atk * 4 - b.def * 2","type":1,"variance":20},"description":"Inflicts damage on an enemy.","effects":[{"code":21,"dataId":0,"value1":1,"value2":0}],"hitType":1,"iconIndex":76,"message1":"%1 attacks!","message2":"","mpCost":0,"name":"Scratch","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":2,"successRate":100,"tpCost":0,"tpGain":5,"messageType":1},
+{"id":42,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":43,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":44,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":45,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":46,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":47,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":48,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":49,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":50,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":51,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"-----Basic Magic","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":52,"animationId":41,"damage":{"critical":false,"elementId":0,"formula":"500 + a.mat","type":3,"variance":20},"description":"Restores an ally’s HP.","effects":[],"hitType":0,"iconIndex":72,"message1":"%1 casts %2!","message2":"","mpCost":12,"name":"Heal I","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":7,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":5,"messageType":1},
+{"id":53,"animationId":41,"damage":{"critical":false,"elementId":0,"formula":"1000 + a.mat","type":3,"variance":20},"description":"Restores an ally’s HP.","effects":[],"hitType":0,"iconIndex":72,"message1":"%1 casts %2!","message2":"","mpCost":20,"name":"Heal II","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":7,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":5,"messageType":1},
+{"id":54,"animationId":42,"damage":{"critical":false,"elementId":0,"formula":"2000 + a.mat","type":3,"variance":20},"description":"Restores an ally’s HP.","effects":[],"hitType":0,"iconIndex":72,"message1":"%1 casts %2!","message2":"","mpCost":34,"name":"Heal III","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":7,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":5,"messageType":1},
+{"id":55,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":56,"animationId":43,"damage":{"critical":false,"elementId":0,"formula":"300 + a.mat","type":3,"variance":20},"description":"Restores all allies’ HP.","effects":[],"hitType":0,"iconIndex":72,"message1":"%1 casts %2!","message2":"","mpCost":25,"name":"Recover I","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":8,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":2,"messageType":1},
+{"id":57,"animationId":43,"damage":{"critical":false,"elementId":0,"formula":"700 + a.mat","type":3,"variance":20},"description":"Restores all allies’ HP.","effects":[],"hitType":0,"iconIndex":72,"message1":"%1 casts %2!","message2":"","mpCost":50,"name":"Recover II","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":8,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":2,"messageType":1},
+{"id":58,"animationId":44,"damage":{"critical":false,"elementId":0,"formula":"1200 + a.mat","type":3,"variance":20},"description":"Restores all allies’ HP.","effects":[],"hitType":0,"iconIndex":72,"message1":"%1 casts %2!","message2":"","mpCost":80,"name":"Recover III","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":8,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":2,"messageType":1},
+{"id":59,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":60,"animationId":45,"damage":{"critical":false,"elementId":0,"formula":"200 + a.mat","type":0,"variance":20},"description":"Cures an ally’s Poison, Paralysis, or Sleep state.","effects":[{"code":22,"dataId":4,"value1":1,"value2":0},{"code":22,"dataId":10,"value1":1,"value2":0},{"code":22,"dataId":12,"value1":1,"value2":0}],"hitType":0,"iconIndex":72,"message1":"%1 casts %2!","message2":"","mpCost":10,"name":"Cure I","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":7,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":5,"messageType":1},
+{"id":61,"animationId":46,"damage":{"critical":false,"elementId":0,"formula":"200 + a.mat","type":0,"variance":20},"description":"Cures an ally’s status ailments other than Dead.","effects":[{"code":22,"dataId":4,"value1":1,"value2":0},{"code":22,"dataId":5,"value1":1,"value2":0},{"code":22,"dataId":6,"value1":1,"value2":0},{"code":22,"dataId":7,"value1":1,"value2":0},{"code":22,"dataId":8,"value1":1,"value2":0},{"code":22,"dataId":9,"value1":1,"value2":0},{"code":22,"dataId":10,"value1":1,"value2":0},{"code":22,"dataId":12,"value1":1,"value2":0}],"hitType":0,"iconIndex":72,"message1":"%1 casts %2!","message2":"","mpCost":20,"name":"Cure II","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":7,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":5,"messageType":1},
+{"id":62,"animationId":47,"damage":{"critical":false,"elementId":0,"formula":"200 + a.mat","type":0,"variance":20},"description":"Cures all allies’ status ailments other than Dead.","effects":[{"code":22,"dataId":4,"value1":1,"value2":0},{"code":22,"dataId":5,"value1":1,"value2":0},{"code":22,"dataId":6,"value1":1,"value2":0},{"code":22,"dataId":7,"value1":1,"value2":0},{"code":22,"dataId":8,"value1":1,"value2":0},{"code":22,"dataId":9,"value1":1,"value2":0},{"code":22,"dataId":10,"value1":1,"value2":0},{"code":22,"dataId":12,"value1":1,"value2":0}],"hitType":0,"iconIndex":72,"message1":"%1 casts %2!","message2":"","mpCost":45,"name":"Cure III","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":8,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":2,"messageType":1},
+{"id":63,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":64,"animationId":49,"damage":{"critical":false,"elementId":0,"formula":"b.mhp / 10","type":3,"variance":20},"description":"Raises an ally from the dead.","effects":[{"code":22,"dataId":1,"value1":1,"value2":0}],"hitType":0,"iconIndex":72,"message1":"%1 casts %2!","message2":"","mpCost":80,"name":"Raise I","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":9,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":10,"messageType":1},
+{"id":65,"animationId":50,"damage":{"critical":false,"elementId":0,"formula":"b.mhp / 2","type":3,"variance":20},"description":"Raises an ally from the dead and greatly restores\ntheir HP.","effects":[{"code":22,"dataId":1,"value1":1,"value2":0}],"hitType":0,"iconIndex":72,"message1":"%1 casts %2!","message2":"","mpCost":150,"name":"Raise II","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":9,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":10,"messageType":1},
+{"id":66,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":67,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":68,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":69,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":70,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":71,"animationId":59,"damage":{"critical":true,"elementId":0,"formula":"a.atk","type":0,"variance":20},"description":"Poisons all enemies.","effects":[{"code":21,"dataId":4,"value1":0.5,"value2":0}],"hitType":2,"iconIndex":2,"message1":"%1 casts %2!","message2":"","mpCost":15,"name":"Poison","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":2,"messageType":1},
+{"id":72,"animationId":60,"damage":{"critical":true,"elementId":0,"formula":"a.atk","type":0,"variance":20},"description":"Blinds all enemies.","effects":[{"code":21,"dataId":5,"value1":0.5,"value2":0}],"hitType":2,"iconIndex":3,"message1":"%1 casts %2!","message2":"","mpCost":15,"name":"Blind","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":2,"messageType":1},
+{"id":73,"animationId":34,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Confuses all enemies.","effects":[{"code":21,"dataId":8,"value1":0.5,"value2":0}],"hitType":2,"iconIndex":6,"message1":"%1 casts %2!","message2":"","mpCost":15,"name":"Confuse","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":2,"messageType":1},
+{"id":74,"animationId":61,"damage":{"critical":true,"elementId":0,"formula":"a.atk","type":0,"variance":20},"description":"Seals all enemies’ magic.","effects":[{"code":21,"dataId":6,"value1":0.5,"value2":0}],"hitType":2,"iconIndex":4,"message1":"%1 casts %2!","message2":"","mpCost":15,"name":"Silence","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":2,"messageType":1},
+{"id":75,"animationId":62,"damage":{"critical":true,"elementId":0,"formula":"a.atk","type":0,"variance":20},"description":"Puts all enemies to sleep.","effects":[{"code":21,"dataId":10,"value1":0.5,"value2":0}],"hitType":2,"iconIndex":8,"message1":"%1 casts %2!","message2":"","mpCost":15,"name":"Sleep","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":2,"messageType":1},
+{"id":76,"animationId":64,"damage":{"critical":true,"elementId":0,"formula":"a.atk","type":0,"variance":20},"description":"Paralyzes all enemies.","effects":[{"code":21,"dataId":12,"value1":0.4,"value2":0}],"hitType":2,"iconIndex":9,"message1":"%1 casts %2!","message2":"","mpCost":15,"name":"Paralyze","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":2,"messageType":1},
+{"id":77,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":78,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":79,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":80,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":81,"animationId":51,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Increases an ally’s Attack.\nUsable up to 2 times in a row.","effects":[{"code":31,"dataId":2,"value1":5,"value2":0}],"hitType":0,"iconIndex":34,"message1":"%1 casts %2!","message2":"","mpCost":12,"name":"Weapon Bless","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":7,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":5,"messageType":1},
+{"id":82,"animationId":54,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Decreases all enemies’ Attack.\nUsable up to 2 times in a row.","effects":[{"code":32,"dataId":2,"value1":5,"value2":0}],"hitType":2,"iconIndex":50,"message1":"%1 casts %2!","message2":"","mpCost":8,"name":"Weapon Curse","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":2,"messageType":1},
+{"id":83,"animationId":51,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Increases an ally’s Defense.\nUsable up to 2 times in a row.","effects":[{"code":31,"dataId":3,"value1":5,"value2":0}],"hitType":0,"iconIndex":35,"message1":"%1 casts %2!","message2":"","mpCost":12,"name":"Armor Bless","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":7,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":5,"messageType":1},
+{"id":84,"animationId":54,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Decreases all enemies’ Defense.\nUsable up to 2 times in a row.","effects":[{"code":32,"dataId":3,"value1":5,"value2":0}],"hitType":2,"iconIndex":51,"message1":"%1 casts %2!","message2":"","mpCost":8,"name":"Armor Curse","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":2,"messageType":1},
+{"id":85,"animationId":51,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Increases an ally’s M.Attack.\nUsable up to 2 times in a row.","effects":[{"code":31,"dataId":4,"value1":5,"value2":0}],"hitType":0,"iconIndex":36,"message1":"%1 casts %2!","message2":"","mpCost":12,"name":"Spirit Bless","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":7,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":5,"messageType":1},
+{"id":86,"animationId":54,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Decreases all enemies’ M.Attack.\nUsable up to 2 times in a row.","effects":[{"code":32,"dataId":4,"value1":5,"value2":0}],"hitType":2,"iconIndex":52,"message1":"%1 casts %2!","message2":"","mpCost":8,"name":"Spirit Curse","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":2,"messageType":1},
+{"id":87,"animationId":51,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Increases an ally’s M.Defense.\nUsable up to 2 times in a row.","effects":[{"code":31,"dataId":5,"value1":5,"value2":0}],"hitType":0,"iconIndex":37,"message1":"%1 casts %2!","message2":"","mpCost":12,"name":"Divine Bless","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":7,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":5,"messageType":1},
+{"id":88,"animationId":54,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Decreases all enemies’ M.Defense.\nUsable up to 2 times in a row.","effects":[{"code":32,"dataId":5,"value1":5,"value2":0}],"hitType":2,"iconIndex":53,"message1":"%1 casts %2!","message2":"","mpCost":8,"name":"Divine Curse","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":2,"messageType":1},
+{"id":89,"animationId":51,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Increases an ally’s Agility.\nUsable up to 2 times in a row.","effects":[{"code":31,"dataId":6,"value1":5,"value2":0}],"hitType":0,"iconIndex":38,"message1":"%1 casts %2!","message2":"","mpCost":12,"name":"Quicken Movement","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":7,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":5,"messageType":1},
+{"id":90,"animationId":54,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Decreases all enemies’ Agility.\nUsable up to 2 times in a row.","effects":[{"code":32,"dataId":6,"value1":5,"value2":0}],"hitType":2,"iconIndex":54,"message1":"%1 casts %2!","message2":"","mpCost":8,"name":"Slow Movement","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":2,"messageType":1},
+{"id":91,"animationId":58,"damage":{"critical":false,"elementId":0,"formula":"200 + a.mat * 4 - b.mdf * 2","type":5,"variance":20},"description":"Absorbs HP from an enemy.","effects":[],"hitType":2,"iconIndex":72,"message1":"%1 casts %2!","message2":"","mpCost":10,"name":"Life Drain","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":5,"messageType":1},
+{"id":92,"animationId":58,"damage":{"critical":false,"elementId":0,"formula":"10 + a.mat - b.mdf * 0.5","type":6,"variance":20},"description":"Absorbs MP from an enemy.","effects":[],"hitType":2,"iconIndex":72,"message1":"%1 casts %2!","message2":"","mpCost":0,"name":"Mana Drain","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":10,"tpGain":5,"messageType":1},
+{"id":93,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":94,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":95,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":96,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":97,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":98,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":99,"animationId":66,"damage":{"critical":false,"elementId":2,"formula":"100 + a.mat * 2 - b.mdf * 2","type":1,"variance":20},"description":"Inflicts Fire-type damage on an enemy.","effects":[],"hitType":2,"iconIndex":64,"message1":"%1 casts %2!","message2":"","mpCost":15,"name":"Fire I","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":5,"messageType":1},
+{"id":100,"animationId":66,"damage":{"critical":false,"elementId":2,"formula":"300 + a.mat * 2 - b.mdf * 2","type":1,"variance":20},"description":"Inflicts Fire-type damage on an enemy.","effects":[],"hitType":2,"iconIndex":64,"message1":"%1 casts %2!","message2":"","mpCost":30,"name":"Fire II","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":-3,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":5,"messageType":1},
+{"id":101,"animationId":67,"damage":{"critical":false,"elementId":2,"formula":"500 + a.mat * 2 - b.mdf * 2","type":1,"variance":20},"description":"Inflicts Fire-type damage on an enemy.","effects":[],"hitType":2,"iconIndex":64,"message1":"%1 casts %2!","message2":"","mpCost":50,"name":"Fire III","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":-6,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":5,"messageType":1},
+{"id":102,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":103,"animationId":68,"damage":{"critical":false,"elementId":2,"formula":"100 + a.mat * 2 - b.mdf * 2","type":1,"variance":20},"description":"Inflicts Fire-type damage on all enemies.","effects":[],"hitType":2,"iconIndex":64,"message1":"%1 casts %2!","message2":"","mpCost":30,"name":"Flame I","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":-3,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":2,"messageType":1},
+{"id":104,"animationId":69,"damage":{"critical":false,"elementId":2,"formula":"300 + a.mat * 2 - b.mdf * 2","type":1,"variance":20},"description":"Inflicts Fire-type damage on all enemies.","effects":[],"hitType":2,"iconIndex":64,"message1":"%1 casts %2!","message2":"","mpCost":50,"name":"Flame II","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":-6,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":2,"messageType":1},
+{"id":105,"animationId":70,"damage":{"critical":false,"elementId":2,"formula":"500 + a.mat * 2 - b.mdf * 2","type":1,"variance":20},"description":"Inflicts Fire-type damage on all enemies.","effects":[],"hitType":2,"iconIndex":64,"message1":"%1 casts %2!","message2":"","mpCost":90,"name":"Flame III","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":-10,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":2,"messageType":1},
+{"id":106,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":107,"animationId":71,"damage":{"critical":false,"elementId":3,"formula":"100 + a.mat * 2 - b.mdf * 2","type":1,"variance":20},"description":"Inflicts Ice-type damage on an enemy.","effects":[],"hitType":2,"iconIndex":65,"message1":"%1 casts %2!","message2":"","mpCost":15,"name":"Ice I","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":5,"messageType":1},
+{"id":108,"animationId":71,"damage":{"critical":false,"elementId":3,"formula":"300 + a.mat * 2 - b.mdf * 2","type":1,"variance":20},"description":"Inflicts Ice-type damage on an enemy.","effects":[],"hitType":2,"iconIndex":65,"message1":"%1 casts %2!","message2":"","mpCost":30,"name":"Ice II","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":-3,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":5,"messageType":1},
+{"id":109,"animationId":72,"damage":{"critical":false,"elementId":3,"formula":"500 + a.mat * 2 - b.mdf * 2","type":1,"variance":20},"description":"Inflicts Ice-type damage on an enemy.","effects":[],"hitType":2,"iconIndex":65,"message1":"%1 casts %2!","message2":"","mpCost":50,"name":"Ice III","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":-6,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":5,"messageType":1},
+{"id":110,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":111,"animationId":73,"damage":{"critical":false,"elementId":3,"formula":"100 + a.mat * 2 - b.mdf * 2","type":1,"variance":20},"description":"Inflicts Ice-type damage on all enemies.","effects":[],"hitType":2,"iconIndex":65,"message1":"%1 casts %2!","message2":"","mpCost":30,"name":"Blizzard I","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":-3,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":2,"messageType":1},
+{"id":112,"animationId":74,"damage":{"critical":false,"elementId":3,"formula":"300 + a.mat * 2 - b.mdf * 2","type":1,"variance":20},"description":"Inflicts Ice-type damage on all enemies.","effects":[],"hitType":2,"iconIndex":65,"message1":"%1 casts %2!","message2":"","mpCost":50,"name":"Blizzard II","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":-6,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":2,"messageType":1},
+{"id":113,"animationId":75,"damage":{"critical":false,"elementId":3,"formula":"500 + a.mat * 2 - b.mdf * 2","type":1,"variance":20},"description":"Inflicts Ice-type damage on all enemies.","effects":[],"hitType":2,"iconIndex":65,"message1":"%1 casts %2!","message2":"","mpCost":90,"name":"Blizzard III","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":-10,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":2,"messageType":1},
+{"id":114,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":115,"animationId":76,"damage":{"critical":false,"elementId":4,"formula":"100 + a.mat * 2 - b.mdf * 2","type":1,"variance":20},"description":"Inflicts Thunder-type damage on an enemy.","effects":[],"hitType":2,"iconIndex":66,"message1":"%1 casts %2!","message2":"","mpCost":15,"name":"Thunder I","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":5,"messageType":1},
+{"id":116,"animationId":76,"damage":{"critical":false,"elementId":4,"formula":"300 + a.mat * 2 - b.mdf * 2","type":1,"variance":20},"description":"Inflicts Thunder-type damage on an enemy.","effects":[],"hitType":2,"iconIndex":66,"message1":"%1 casts %2!","message2":"","mpCost":30,"name":"Thunder II","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":-3,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":5,"messageType":1},
+{"id":117,"animationId":77,"damage":{"critical":false,"elementId":4,"formula":"500 + a.mat * 2 - b.mdf * 2","type":1,"variance":20},"description":"Inflicts Thunder-type damage on an enemy.","effects":[],"hitType":2,"iconIndex":66,"message1":"%1 casts %2!","message2":"","mpCost":50,"name":"Thunder III","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":-6,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":5,"messageType":1},
+{"id":118,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":119,"animationId":78,"damage":{"critical":false,"elementId":4,"formula":"100 + a.mat * 2 - b.mdf * 2","type":1,"variance":20},"description":"Inflicts Thunder-type damage on all enemies.","effects":[],"hitType":2,"iconIndex":66,"message1":"%1 casts %2!","message2":"","mpCost":30,"name":"Spark I","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":-3,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":2,"messageType":1},
+{"id":120,"animationId":79,"damage":{"critical":false,"elementId":4,"formula":"300 + a.mat * 2 - b.mdf * 2","type":1,"variance":20},"description":"Inflicts Thunder-type damage on all enemies.","effects":[],"hitType":2,"iconIndex":66,"message1":"%1 casts %2!","message2":"","mpCost":50,"name":"Spark II","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":-6,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":2,"messageType":1},
+{"id":121,"animationId":80,"damage":{"critical":false,"elementId":4,"formula":"500 + a.mat * 2 - b.mdf * 2","type":1,"variance":20},"description":"Inflicts Thunder-type damage on all enemies.","effects":[],"hitType":2,"iconIndex":66,"message1":"%1 casts %2!","message2":"","mpCost":90,"name":"Spark III","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":-10,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":2,"messageType":1},
+{"id":122,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":123,"animationId":81,"damage":{"critical":false,"elementId":5,"formula":"300 + a.mat * 2 - b.mdf * 2","type":1,"variance":20},"description":"Inflicts Water-type damage on an enemy.","effects":[],"hitType":2,"iconIndex":67,"message1":"%1 casts %2!","message2":"","mpCost":20,"name":"Water I","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":-3,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":5,"messageType":1},
+{"id":124,"animationId":82,"damage":{"critical":false,"elementId":5,"formula":"500 + a.mat * 2 - b.mdf * 2","type":1,"variance":20},"description":"Inflicts Water-type damage on an enemy.","effects":[],"hitType":2,"iconIndex":67,"message1":"%1 casts %2!","message2":"","mpCost":40,"name":"Water II","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":-6,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":5,"messageType":1},
+{"id":125,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":126,"animationId":83,"damage":{"critical":false,"elementId":5,"formula":"300 + a.mat * 2 - b.mdf * 2","type":1,"variance":20},"description":"Inflicts Water-type damage on all enemies.","effects":[],"hitType":2,"iconIndex":67,"message1":"%1 casts %2!","message2":"","mpCost":40,"name":"Wave I","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":-6,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":2,"messageType":1},
+{"id":127,"animationId":85,"damage":{"critical":false,"elementId":5,"formula":"500 + a.mat * 2 - b.mdf * 2","type":1,"variance":20},"description":"Inflicts Water-type damage on all enemies.","effects":[],"hitType":2,"iconIndex":67,"message1":"%1 casts %2!","message2":"","mpCost":80,"name":"Wave II","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":-10,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":2,"messageType":1},
+{"id":128,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":129,"animationId":86,"damage":{"critical":false,"elementId":6,"formula":"300 + a.mat * 2 - b.mdf * 2","type":1,"variance":20},"description":"Inflicts Earth-type damage on an enemy.","effects":[],"hitType":2,"iconIndex":68,"message1":"%1 casts %2!","message2":"","mpCost":20,"name":"Stone I","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":-3,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":5,"messageType":1},
+{"id":130,"animationId":87,"damage":{"critical":false,"elementId":6,"formula":"500 + a.mat * 2 - b.mdf * 2","type":1,"variance":20},"description":"Inflicts Earth-type damage on an enemy.","effects":[],"hitType":2,"iconIndex":68,"message1":"%1 casts %2!","message2":"","mpCost":40,"name":"Stone II","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":-6,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":5,"messageType":1},
+{"id":131,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":132,"animationId":88,"damage":{"critical":false,"elementId":6,"formula":"300 + a.mat * 2 - b.mdf * 2","type":1,"variance":20},"description":"Inflicts Earth-type damage on all enemies.","effects":[],"hitType":2,"iconIndex":68,"message1":"%1 casts %2!","message2":"","mpCost":40,"name":"Quake I","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":-6,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":2,"messageType":1},
+{"id":133,"animationId":90,"damage":{"critical":false,"elementId":6,"formula":"500 + a.mat * 2 - b.mdf * 2","type":1,"variance":20},"description":"Inflicts Earth-type damage on all enemies.","effects":[],"hitType":2,"iconIndex":68,"message1":"%1 casts %2!","message2":"","mpCost":80,"name":"Quake II","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":-10,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":2,"messageType":1},
+{"id":134,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":135,"animationId":91,"damage":{"critical":false,"elementId":7,"formula":"300 + a.mat * 2 - b.mdf * 2","type":1,"variance":20},"description":"Inflicts Wind-type damage on an enemy.","effects":[],"hitType":2,"iconIndex":69,"message1":"%1 casts %2!","message2":"","mpCost":20,"name":"Wind I","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":-3,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":5,"messageType":1},
+{"id":136,"animationId":92,"damage":{"critical":false,"elementId":7,"formula":"500 + a.mat * 2 - b.mdf * 2","type":1,"variance":20},"description":"Inflicts Wind-type damage on an enemy.","effects":[],"hitType":2,"iconIndex":69,"message1":"%1 casts %2!","message2":"","mpCost":20,"name":"Wind II","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":-6,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":5,"messageType":1},
+{"id":137,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":138,"animationId":93,"damage":{"critical":false,"elementId":7,"formula":"300 + a.mat * 2 - b.mdf * 2","type":1,"variance":20},"description":"Inflicts Wind-type damage on all enemies.","effects":[],"hitType":2,"iconIndex":69,"message1":"%1 casts %2!","message2":"","mpCost":40,"name":"Tornado I","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":-6,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":2,"messageType":1},
+{"id":139,"animationId":95,"damage":{"critical":false,"elementId":7,"formula":"500 + a.mat * 2 - b.mdf * 2","type":1,"variance":20},"description":"Inflicts Wind-type damage on all enemies.","effects":[],"hitType":2,"iconIndex":69,"message1":"%1 casts %2!","message2":"","mpCost":80,"name":"Tornado II","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":-10,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":2,"messageType":1},
+{"id":140,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":141,"animationId":96,"damage":{"critical":false,"elementId":8,"formula":"300 + a.mat * 2 - b.mdf * 2","type":1,"variance":20},"description":"Inflicts Light-type damage on an enemy.","effects":[],"hitType":2,"iconIndex":70,"message1":"%1 casts %2!","message2":"","mpCost":20,"name":"Saint I","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":-3,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":5,"messageType":1},
+{"id":142,"animationId":97,"damage":{"critical":false,"elementId":8,"formula":"500 + a.mat * 2 - b.mdf * 2","type":1,"variance":20},"description":"Inflicts Light-type damage on an enemy.","effects":[],"hitType":2,"iconIndex":70,"message1":"%1 casts %2!","message2":"","mpCost":40,"name":"Saint II","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":-6,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":5,"messageType":1},
+{"id":143,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":144,"animationId":98,"damage":{"critical":false,"elementId":8,"formula":"300 + a.mat * 2 - b.mdf * 2","type":1,"variance":20},"description":"Inflicts Light-type damage on all enemies.","effects":[],"hitType":2,"iconIndex":70,"message1":"%1 casts %2!","message2":"","mpCost":40,"name":"Starlight I","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":-6,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":2,"messageType":1},
+{"id":145,"animationId":99,"damage":{"critical":false,"elementId":8,"formula":"500 + a.mat * 2 - b.mdf * 2","type":1,"variance":20},"description":"Inflicts Light-type damage on all enemies.","effects":[],"hitType":2,"iconIndex":70,"message1":"%1 casts %2!","message2":"","mpCost":80,"name":"Starlight II","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":-10,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":2,"messageType":1},
+{"id":146,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":147,"animationId":101,"damage":{"critical":false,"elementId":9,"formula":"300 + a.mat * 2 - b.mdf * 2","type":1,"variance":20},"description":"Inflicts Darkness-type damage on an enemy.","effects":[],"hitType":2,"iconIndex":71,"message1":"%1 casts %2!","message2":"","mpCost":20,"name":"Shade I","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":-3,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":5,"messageType":1},
+{"id":148,"animationId":102,"damage":{"critical":false,"elementId":9,"formula":"500 + a.mat * 2 - b.mdf * 2","type":1,"variance":20},"description":"Inflicts Darkness-type damage on an enemy.","effects":[],"hitType":2,"iconIndex":71,"message1":"%1 casts %2!","message2":"","mpCost":40,"name":"Shade II","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":-6,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":5,"messageType":1},
+{"id":149,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":150,"animationId":103,"damage":{"critical":false,"elementId":9,"formula":"300 + a.mat * 2 - b.mdf * 2","type":1,"variance":20},"description":"Inflicts Darkness-type damage on all enemies.","effects":[],"hitType":2,"iconIndex":71,"message1":"%1 casts %2!","message2":"","mpCost":40,"name":"Darkness I","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":-6,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":2,"messageType":1},
+{"id":151,"animationId":105,"damage":{"critical":false,"elementId":9,"formula":"500 + a.mat * 2 - b.mdf * 2","type":1,"variance":20},"description":"Inflicts Darkness-type damage on all enemies.","effects":[],"hitType":2,"iconIndex":71,"message1":"%1 casts %2!","message2":"","mpCost":80,"name":"Darkness II","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":-10,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":2,"messageType":1},
+{"id":152,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":153,"animationId":106,"damage":{"critical":false,"elementId":0,"formula":"300 + a.mat * 2","type":1,"variance":20},"description":"Inflicts damage on an enemy regardless of Defense.","effects":[],"hitType":2,"iconIndex":78,"message1":"%1 casts %2!","message2":"","mpCost":25,"name":"Burst I","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":-3,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":5,"messageType":1},
+{"id":154,"animationId":107,"damage":{"critical":false,"elementId":0,"formula":"500 + a.mat * 2","type":1,"variance":20},"description":"Inflicts damage on an enemy regardless of Defense.","effects":[],"hitType":2,"iconIndex":78,"message1":"%1 casts %2!","message2":"","mpCost":50,"name":"Burst II","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":-6,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":5,"messageType":1},
+{"id":155,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":156,"animationId":108,"damage":{"critical":false,"elementId":0,"formula":"300 + a.mat * 2","type":1,"variance":20},"description":"Inflicts damage on all enemies regardless of Defense.","effects":[],"hitType":2,"iconIndex":78,"message1":"%1 casts %2!","message2":"","mpCost":50,"name":"Nuke I","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":-6,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":2,"messageType":1},
+{"id":157,"animationId":110,"damage":{"critical":false,"elementId":0,"formula":"500 + a.mat * 2","type":1,"variance":20},"description":"Inflicts damage on all enemies regardless of Defense.","effects":[],"hitType":2,"iconIndex":78,"message1":"%1 casts %2!","message2":"","mpCost":100,"name":"Nuke II","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":-10,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":2,"messageType":1},
+{"id":158,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":159,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":160,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":161,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":162,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":163,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":164,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":165,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":166,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":167,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":168,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":169,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":170,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":171,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"-----Swordsman Skills","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":2,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":172,"animationId":-1,"damage":{"critical":true,"elementId":-1,"formula":"a.atk * 5 - b.def * 2","type":1,"variance":20},"description":"Performs a powerful attack on an enemy.","effects":[{"code":21,"dataId":0,"value1":1,"value2":0}],"hitType":1,"iconIndex":77,"message1":"%1 does %2!","message2":"","mpCost":0,"name":"Strong Attack","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":2,"successRate":100,"tpCost":10,"tpGain":0,"messageType":1},
+{"id":173,"animationId":-1,"damage":{"critical":true,"elementId":-1,"formula":"30 + a.atk","type":1,"variance":20},"description":"Attacks all enemies.","effects":[],"hitType":1,"iconIndex":76,"message1":"%1 mows down the enemy!","message2":"","mpCost":0,"name":"Slash","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":0,"stypeId":2,"successRate":100,"tpCost":20,"tpGain":0,"messageType":1},
+{"id":174,"animationId":-1,"damage":{"critical":true,"elementId":-1,"formula":"a.atk * 4 - b.def * 2","type":1,"variance":20},"description":"Performs an attack on an enemy twice.","effects":[{"code":21,"dataId":0,"value1":1,"value2":0}],"hitType":1,"iconIndex":76,"message1":"%1 dual attacks!","message2":"","mpCost":0,"name":"Dual Attack","note":"","occasion":1,"repeats":2,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":2,"successRate":100,"tpCost":30,"tpGain":0,"messageType":1},
+{"id":175,"animationId":51,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Rouses the user’s fighting spirit and increases\nAttack. Usable up to 2 times in a row.","effects":[{"code":31,"dataId":2,"value1":5,"value2":0}],"hitType":0,"iconIndex":34,"message1":"%1 uses %2!","message2":"","mpCost":15,"name":"Willpower","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":11,"speed":0,"stypeId":2,"successRate":100,"tpCost":0,"tpGain":10,"messageType":1},
+{"id":176,"animationId":41,"damage":{"critical":false,"elementId":0,"formula":"300 + a.mat","type":3,"variance":20},"description":"Restores an ally’s HP.","effects":[],"hitType":0,"iconIndex":72,"message1":"%1 performs %2!","message2":"","mpCost":6,"name":"First Aid","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":7,"speed":0,"stypeId":2,"successRate":100,"tpCost":0,"tpGain":5,"messageType":1},
+{"id":177,"animationId":25,"damage":{"critical":true,"elementId":-1,"formula":"a.atk * 8 - b.def * 3","type":1,"variance":20},"description":"Performs a super powerful attack on an enemy.","effects":[{"code":21,"dataId":0,"value1":1,"value2":0}],"hitType":1,"iconIndex":77,"message1":"%1 does %2!","message2":"","mpCost":0,"name":"Maiden’s Stance","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":2,"successRate":100,"tpCost":50,"tpGain":0,"messageType":1},
+{"id":178,"animationId":6,"damage":{"critical":true,"elementId":-1,"formula":"a.atk * 5 - b.def * 2","type":1,"variance":20},"description":"Performs a powerful attack on all enemies.","effects":[],"hitType":1,"iconIndex":76,"message1":"%1 mows down the enemy!","message2":"","mpCost":0,"name":"Spin Crash","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":0,"stypeId":2,"successRate":100,"tpCost":100,"tpGain":0,"messageType":1},
+{"id":179,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":180,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":181,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":182,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":183,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":184,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":185,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"-----Priest & Sorcerer Skills","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":186,"animationId":51,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Increases all allies’ Defense and M.Defense.\nUsable up to 2 times in a row.","effects":[{"code":31,"dataId":3,"value1":5,"value2":0},{"code":31,"dataId":5,"value1":5,"value2":0}],"hitType":0,"iconIndex":70,"message1":"%1 offered a prayer!","message2":"","mpCost":0,"name":"Magic Barrier","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":8,"speed":0,"stypeId":1,"successRate":100,"tpCost":30,"tpGain":0,"messageType":1},
+{"id":187,"animationId":52,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Greatly increases the user’s M.Attack for 5 turns.","effects":[{"code":31,"dataId":4,"value1":5,"value2":0},{"code":31,"dataId":4,"value1":5,"value2":0}],"hitType":0,"iconIndex":70,"message1":"%1 casts %2!","message2":"","mpCost":0,"name":"Spell Enhancement","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":11,"speed":0,"stypeId":1,"successRate":100,"tpCost":25,"tpGain":0,"messageType":1},
+{"id":188,"animationId":51,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Rouses all allies’ fighting spirit and increases\nAttack. Usable up to 2 times in a row.","effects":[{"code":31,"dataId":2,"value1":5,"value2":0}],"hitType":0,"iconIndex":34,"message1":"%1 gave encouragement!","message2":"","mpCost":0,"name":"Yell","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":8,"speed":0,"stypeId":1,"successRate":100,"tpCost":30,"tpGain":0,"messageType":1},
+{"id":189,"animationId":110,"damage":{"critical":false,"elementId":0,"formula":"a.mat * 10","type":1,"variance":20},"description":"Inflicts damage on all enemies regardless of Defense.","effects":[],"hitType":2,"iconIndex":78,"message1":"%1 casts %2!","message2":"","mpCost":0,"name":"Meteor","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":0,"stypeId":1,"successRate":100,"tpCost":100,"tpGain":0,"messageType":1},
+{"id":190,"animationId":46,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Bestows Fire-type for 5 turns.","effects":[{"code":21,"dataId":25,"value1":1,"value2":0}],"hitType":0,"iconIndex":64,"message1":"%1 casts %2!","message2":"","mpCost":0,"name":"Fire Weapon","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":7,"speed":0,"stypeId":1,"successRate":100,"tpCost":30,"tpGain":0,"messageType":1},
+{"id":191,"animationId":46,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Bestows Ice-type for 5 turns.","effects":[{"code":21,"dataId":26,"value1":1,"value2":0}],"hitType":0,"iconIndex":65,"message1":"%1 casts %2!","message2":"","mpCost":0,"name":"Ice Weapon","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":7,"speed":0,"stypeId":1,"successRate":100,"tpCost":30,"tpGain":0,"messageType":1},
+{"id":192,"animationId":46,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Bestows Thunder-type for 5 turns.","effects":[{"code":21,"dataId":27,"value1":1,"value2":0}],"hitType":0,"iconIndex":66,"message1":"%1 casts %2!","message2":"","mpCost":0,"name":"Thunder Weapon","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":7,"speed":0,"stypeId":1,"successRate":100,"tpCost":30,"tpGain":0,"messageType":1},
+{"id":193,"animationId":42,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Reflects M.Attack aimed at the user for 5 turns.","effects":[{"code":21,"dataId":18,"value1":1,"value2":0}],"hitType":0,"iconIndex":81,"message1":"%1 casts %2!","message2":"","mpCost":0,"name":"Magic Mirror","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":11,"speed":0,"stypeId":1,"successRate":100,"tpCost":50,"tpGain":0,"messageType":1},
+{"id":194,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":195,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"-----Knight Skills","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":2,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":196,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Automatically protects allies with low HP for 1 turn.","effects":[{"code":21,"dataId":19,"value1":1,"value2":0}],"hitType":0,"iconIndex":81,"message1":"%1 protects team.","message2":"","mpCost":50,"name":"Protect","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":11,"speed":2000,"stypeId":2,"successRate":100,"tpCost":0,"tpGain":10,"messageType":1},
+{"id":197,"animationId":12,"damage":{"critical":true,"elementId":-1,"formula":"a.atk * 4 - b.def * 2","type":1,"variance":20},"description":"Performs an attack on an enemy faster than anyone\nelse.","effects":[{"code":21,"dataId":0,"value1":1,"value2":0}],"hitType":1,"iconIndex":76,"message1":"%1 does %2!","message2":"","mpCost":0,"name":"Falcon Thrust","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":2000,"stypeId":2,"successRate":100,"tpCost":15,"tpGain":0,"messageType":1},
+{"id":198,"animationId":11,"damage":{"critical":true,"elementId":-1,"formula":"a.atk * 4 - b.def * 2","type":1,"variance":20},"description":"Performs an attack on an enemy twice.","effects":[{"code":21,"dataId":0,"value1":1,"value2":0}],"hitType":1,"iconIndex":76,"message1":"%1 does %2!","message2":"","mpCost":0,"name":"Double Thrust","note":"","occasion":1,"repeats":2,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":2,"successRate":100,"tpCost":25,"tpGain":0,"messageType":1},
+{"id":199,"animationId":12,"damage":{"critical":true,"elementId":-1,"formula":"a.atk * 4","type":1,"variance":20},"description":"Inflicts damage on all enemies regardless of Defense.","effects":[{"code":21,"dataId":0,"value1":1,"value2":0}],"hitType":1,"iconIndex":76,"message1":"%1 does %2!","message2":"","mpCost":0,"name":"Armor Piercer","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":2,"successRate":100,"tpCost":30,"tpGain":0,"messageType":1},
+{"id":200,"animationId":51,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Rouses all allies’ fighting spirit and increases\nAttack. Usable up to 2 times in a row.","effects":[{"code":31,"dataId":2,"value1":5,"value2":0}],"hitType":0,"iconIndex":34,"message1":"%1 made a battle cry!","message2":"","mpCost":50,"name":"Battle Cry","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":8,"speed":0,"stypeId":2,"successRate":100,"tpCost":0,"tpGain":2,"messageType":1},
+{"id":201,"animationId":93,"damage":{"critical":true,"elementId":7,"formula":"30 + a.atk","type":1,"variance":20},"description":"Attacks all enemies.","effects":[],"hitType":1,"iconIndex":69,"message1":"%1 does %2!","message2":"","mpCost":0,"name":"Windmill","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":0,"stypeId":2,"successRate":100,"tpCost":20,"tpGain":0,"messageType":1},
+{"id":202,"animationId":52,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Slightly increases the user’s TP.","effects":[{"code":13,"dataId":0,"value1":30,"value2":0}],"hitType":0,"iconIndex":72,"message1":"%1 cleared their mind!","message2":"","mpCost":30,"name":"Clear Mind","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":11,"speed":0,"stypeId":2,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":203,"animationId":26,"damage":{"critical":false,"elementId":-1,"formula":"(a.atk * 4 - b.def * 2)*0.9","type":1,"variance":20},"description":"Randomly performs 4 attacks on 4 enemies.","effects":[{"code":21,"dataId":0,"value1":1,"value2":0}],"hitType":1,"iconIndex":76,"message1":"%1 does %2!","message2":"","mpCost":0,"name":"Wild Thrust","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":6,"speed":0,"stypeId":2,"successRate":100,"tpCost":45,"tpGain":0,"messageType":1},
+{"id":204,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":205,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"-----Bandit Skills","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":2,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":206,"animationId":11,"damage":{"critical":true,"elementId":0,"formula":"a.atk","type":1,"variance":20},"description":"Blinds an enemy.","effects":[{"code":21,"dataId":5,"value1":0.5,"value2":0}],"hitType":1,"iconIndex":3,"message1":"%1 does %2!","message2":"","mpCost":0,"name":"Eye Poke","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":2,"successRate":100,"tpCost":5,"tpGain":0,"messageType":1},
+{"id":207,"animationId":51,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Increases the user’s Agility.","effects":[{"code":31,"dataId":6,"value1":5,"value2":0},{"code":31,"dataId":6,"value1":5,"value2":0}],"hitType":2,"iconIndex":38,"message1":"%1 started %2!","message2":"","mpCost":12,"name":"Warm-up","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":11,"speed":0,"stypeId":2,"successRate":100,"tpCost":0,"tpGain":5,"messageType":1},
+{"id":208,"animationId":40,"damage":{"critical":true,"elementId":0,"formula":"a.atk","type":0,"variance":20},"description":"Blinds all enemies.","effects":[{"code":21,"dataId":5,"value1":0.5,"value2":0}],"hitType":0,"iconIndex":3,"message1":"%1 does %2!","message2":"","mpCost":0,"name":"Flare","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":0,"stypeId":2,"successRate":100,"tpCost":25,"tpGain":5,"messageType":1},
+{"id":209,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Increases items and money gained from battle for\na while.","effects":[{"code":21,"dataId":30,"value1":1,"value2":0}],"hitType":0,"iconIndex":72,"message1":"%1 is observing their surroundings carefully.","message2":"","mpCost":30,"name":"Watchful Eye","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":11,"speed":0,"stypeId":2,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":210,"animationId":93,"damage":{"critical":true,"elementId":7,"formula":"50 + a.atk * 5 - b.def * 2","type":1,"variance":20},"description":"Inflicts Wind-type damage on all enemies.","effects":[],"hitType":1,"iconIndex":69,"message1":"%1 does %2!","message2":"","mpCost":0,"name":"Wind Call","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":0,"stypeId":2,"successRate":100,"tpCost":40,"tpGain":0,"messageType":1},
+{"id":211,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"Makes the user harder to target.","effects":[{"code":21,"dataId":21,"value1":1,"value2":0}],"hitType":0,"iconIndex":82,"message1":"%1 hid.","message2":"","mpCost":0,"name":"Hide","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":11,"speed":0,"stypeId":2,"successRate":100,"tpCost":25,"tpGain":0,"messageType":1},
+{"id":212,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":213,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":214,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":215,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"-----Martial Artist Skills","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":2,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":216,"animationId":38,"damage":{"critical":false,"elementId":0,"formula":"a.atk * 4 - b.def * 2","type":1,"variance":20},"description":"Inflicts damage and causes all enemies to lose balance.","effects":[{"code":21,"dataId":13,"value1":0.5,"value2":0}],"hitType":1,"iconIndex":78,"message1":"%1 does %2!","message2":"","mpCost":0,"name":"Sweep","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":0,"stypeId":2,"successRate":100,"tpCost":15,"tpGain":0,"messageType":1},
+{"id":217,"animationId":45,"damage":{"critical":false,"elementId":0,"formula":"200 + a.mat","type":0,"variance":20},"description":"Cures the user from being weakened.","effects":[{"code":34,"dataId":0,"value1":1,"value2":0},{"code":34,"dataId":1,"value1":1,"value2":0},{"code":34,"dataId":2,"value1":1,"value2":0},{"code":34,"dataId":3,"value1":1,"value2":0},{"code":34,"dataId":5,"value1":1,"value2":0},{"code":34,"dataId":4,"value1":1,"value2":0},{"code":34,"dataId":6,"value1":1,"value2":0},{"code":34,"dataId":7,"value1":1,"value2":0}],"hitType":0,"iconIndex":72,"message1":"%1 uses %2!","message2":"","mpCost":0,"name":"Qigong","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":11,"speed":0,"stypeId":2,"successRate":100,"tpCost":25,"tpGain":0,"messageType":1},
+{"id":218,"animationId":38,"damage":{"critical":true,"elementId":1,"formula":"a.atk * 5 - b.def * 2","type":1,"variance":20},"description":"Inflicts huge damage on all enemies.","effects":[],"hitType":1,"iconIndex":77,"message1":"%1 does %2!","message2":"","mpCost":0,"name":"Roundhouse Kick","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":0,"stypeId":2,"successRate":100,"tpCost":50,"tpGain":0,"messageType":1},
+{"id":219,"animationId":28,"damage":{"critical":true,"elementId":1,"formula":"a.atk * 10","type":1,"variance":20},"description":"Inflicts damage on an enemy regardless of Defense.","effects":[],"hitType":1,"iconIndex":77,"message1":"%1 does %2!","message2":"","mpCost":0,"name":"Tiger Dance","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":2,"successRate":100,"tpCost":100,"tpGain":0,"messageType":1},
+{"id":220,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":221,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":222,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":223,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":224,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":225,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"-----Hunter Skills","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":2,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":226,"animationId":-1,"damage":{"critical":true,"elementId":-1,"formula":"a.atk * 3 - b.def * 2","type":1,"variance":20},"description":"Decreases an enemy’s Attack and Defense.","effects":[{"code":21,"dataId":0,"value1":1,"value2":0},{"code":32,"dataId":2,"value1":5,"value2":0},{"code":32,"dataId":3,"value1":5,"value2":0}],"hitType":1,"iconIndex":78,"message1":"%1 does %2!","message2":"","mpCost":0,"name":"Point Shot","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":0,"successRate":100,"tpCost":10,"tpGain":5,"messageType":1},
+{"id":227,"animationId":-1,"damage":{"critical":true,"elementId":1,"formula":"a.atk * 2 - b.def","type":1,"variance":20},"description":"Shoots at the footing of all enemies and causes them\nto lose balance.","effects":[{"code":21,"dataId":13,"value1":1,"value2":0}],"hitType":1,"iconIndex":78,"message1":"%1 does %2!","message2":"","mpCost":0,"name":"Stun Shot","note":"","occasion":1,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":0,"stypeId":2,"successRate":100,"tpCost":25,"tpGain":5,"messageType":1},
+{"id":228,"animationId":-1,"damage":{"critical":true,"elementId":1,"formula":"a.atk * 3 - b.def * 2","type":1,"variance":20},"description":"Inflicts damage on an enemy 5 times.","effects":[],"hitType":1,"iconIndex":78,"message1":"%1 does %2!","message2":"","mpCost":0,"name":"Team Shot","note":"","occasion":1,"repeats":5,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":2,"successRate":100,"tpCost":50,"tpGain":5,"messageType":1},
+{"id":229,"animationId":98,"damage":{"critical":true,"elementId":1,"formula":"a.atk * 4 - b.def * 2","type":1,"variance":20},"description":"Inflicts damage on all enemies 2 times.","effects":[],"hitType":1,"iconIndex":78,"message1":"%1 does %2!","message2":"","mpCost":0,"name":"Rain Shot","note":"","occasion":1,"repeats":2,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":2,"speed":0,"stypeId":2,"successRate":100,"tpCost":100,"tpGain":5,"messageType":1},
+{"id":230,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":231,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":232,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":233,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":234,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1},
+{"id":235,"animationId":0,"damage":{"critical":false,"elementId":0,"formula":"0","type":0,"variance":20},"description":"","effects":[],"hitType":0,"iconIndex":0,"message1":"","message2":"","mpCost":0,"name":"","note":"","occasion":0,"repeats":1,"requiredWtypeId1":0,"requiredWtypeId2":0,"scope":1,"speed":0,"stypeId":1,"successRate":100,"tpCost":0,"tpGain":0,"messageType":1}
+]
\ No newline at end of file
diff --git a/data/States.json b/data/States.json
new file mode 100644
index 0000000..1c2f860
--- /dev/null
+++ b/data/States.json
@@ -0,0 +1,33 @@
+[
+null,
+{"id":1,"autoRemovalTiming":0,"chanceByDamage":100,"iconIndex":1,"maxTurns":1,"message1":"%1 has fallen!","message2":"%1 is slain!","message3":"","message4":"%1 revives!","minTurns":1,"motion":3,"name":"Dead","note":"State #1 will be added when HP hits 0.","overlay":0,"priority":100,"releaseByDamage":false,"removeAtBattleEnd":false,"removeByDamage":false,"removeByRestriction":false,"removeByWalking":false,"restriction":4,"stepsToRemove":100,"traits":[{"code":23,"dataId":9,"value":0}],"messageType":1},
+{"id":2,"autoRemovalTiming":2,"chanceByDamage":100,"iconIndex":0,"maxTurns":1,"message1":"","message2":"","message3":"","message4":"","minTurns":1,"motion":0,"name":"Guard","note":"","overlay":0,"priority":0,"removeAtBattleEnd":true,"removeByDamage":false,"removeByRestriction":true,"removeByWalking":false,"restriction":0,"stepsToRemove":100,"traits":[{"code":62,"dataId":1,"value":0}],"messageType":1},
+{"id":3,"autoRemovalTiming":0,"chanceByDamage":100,"iconIndex":0,"maxTurns":1,"message1":"","message2":"","message3":"","message4":"","minTurns":1,"motion":0,"name":"Immortal","note":"","overlay":0,"priority":0,"removeAtBattleEnd":true,"removeByDamage":false,"removeByRestriction":false,"removeByWalking":false,"restriction":0,"stepsToRemove":100,"traits":[{"code":14,"dataId":1,"value":0}],"messageType":1},
+{"id":4,"autoRemovalTiming":0,"chanceByDamage":100,"iconIndex":2,"maxTurns":1,"message1":"%1 is poisoned!","message2":"%1 is poisoned!","message3":"","message4":"%1 is no longer poisoned!","minTurns":1,"motion":1,"overlay":1,"name":"Poison","note":"","priority":50,"releaseByDamage":false,"removeAtBattleEnd":false,"removeByDamage":false,"removeByRestriction":false,"removeByWalking":false,"restriction":0,"stepsToRemove":100,"traits":[{"code":22,"dataId":7,"value":-0.1}],"messageType":1},
+{"id":5,"autoRemovalTiming":1,"chanceByDamage":100,"iconIndex":3,"maxTurns":5,"message1":"%1 is blinded!","message2":"%1 is blinded!","message3":"","message4":"%1 is no longer blinded!","minTurns":3,"motion":1,"name":"Blind","note":"","overlay":2,"priority":60,"releaseByDamage":false,"removeAtBattleEnd":true,"removeByDamage":false,"removeByRestriction":false,"removeByWalking":false,"restriction":0,"stepsToRemove":100,"traits":[{"code":22,"dataId":0,"value":-0.5}],"messageType":1},
+{"id":6,"autoRemovalTiming":1,"chanceByDamage":100,"iconIndex":4,"maxTurns":5,"message1":"%1 is silenced!","message2":"%1 is silenced!","message3":"","message4":"%1 is no longer silenced!","minTurns":3,"motion":1,"name":"Silence","note":"","overlay":3,"priority":65,"releaseByDamage":false,"removeAtBattleEnd":true,"removeByDamage":false,"removeByRestriction":false,"removeByWalking":false,"restriction":0,"stepsToRemove":100,"traits":[{"code":42,"dataId":1,"value":0}],"messageType":1},
+{"id":7,"autoRemovalTiming":1,"chanceByDamage":50,"iconIndex":5,"maxTurns":4,"message1":"%1 is enraged!","message2":"%1 is enraged!","message3":"","message4":"%1 is no longer enraged!","minTurns":2,"motion":1,"name":"Rage","note":"","overlay":4,"priority":70,"releaseByDamage":false,"removeAtBattleEnd":true,"removeByDamage":true,"removeByRestriction":false,"removeByWalking":false,"restriction":1,"stepsToRemove":100,"traits":[],"messageType":1},
+{"id":8,"autoRemovalTiming":1,"chanceByDamage":50,"iconIndex":6,"maxTurns":4,"message1":"%1 is confused!","message2":"%1 is confused!","message3":"","message4":"%1 is no longer confused!","minTurns":2,"motion":1,"name":"Confusion","note":"","overlay":5,"priority":75,"releaseByDamage":false,"removeAtBattleEnd":true,"removeByDamage":true,"removeByRestriction":false,"removeByWalking":false,"restriction":2,"stepsToRemove":100,"traits":[],"messageType":1},
+{"id":9,"autoRemovalTiming":1,"chanceByDamage":50,"iconIndex":7,"maxTurns":4,"message1":"%1 is charmed!","message2":"%1 is charmed!","message3":"","message4":"%1 is no longer charmed!","minTurns":2,"motion":1,"name":"Charm","note":"","overlay":6,"priority":80,"releaseByDamage":false,"removeAtBattleEnd":true,"removeByDamage":true,"removeByRestriction":false,"removeByWalking":false,"restriction":3,"stepsToRemove":100,"traits":[],"messageType":1},
+{"id":10,"autoRemovalTiming":1,"chanceByDamage":100,"iconIndex":8,"maxTurns":5,"message1":"%1 falls asleep!","message2":"%1 falls asleep!","message3":"%1 is sleeping.","message4":"%1 wakes up!","minTurns":3,"motion":2,"name":"Sleep","note":"","overlay":7,"priority":90,"releaseByDamage":true,"removeAtBattleEnd":true,"removeByDamage":true,"removeByRestriction":false,"removeByWalking":false,"restriction":4,"stepsToRemove":100,"traits":[{"code":22,"dataId":1,"value":-1}],"messageType":1},
+{"id":11,"autoRemovalTiming":0,"chanceByDamage":100,"traits":[],"iconIndex":0,"maxTurns":1,"message1":"","message2":"","message3":"","message4":"","minTurns":1,"motion":0,"name":"","note":"","overlay":0,"priority":50,"removeAtBattleEnd":false,"removeByDamage":false,"removeByRestriction":false,"removeByWalking":false,"restriction":0,"stepsToRemove":100,"messageType":1},
+{"id":12,"autoRemovalTiming":2,"chanceByDamage":100,"traits":[{"code":22,"dataId":1,"value":-1}],"iconIndex":9,"maxTurns":3,"message1":"%1 is paralyzed and can’t move!","message2":"%1 is paralyzed!","message3":"%1 is paralyzed and can’t move!","message4":"%1 is no longer paralyzed!","minTurns":3,"motion":2,"name":"Paralysis","note":"","overlay":8,"priority":95,"removeAtBattleEnd":true,"removeByDamage":false,"removeByRestriction":false,"removeByWalking":false,"restriction":4,"stepsToRemove":100,"messageType":1},
+{"id":13,"autoRemovalTiming":2,"chanceByDamage":100,"traits":[{"code":22,"dataId":1,"value":-1}],"iconIndex":9,"maxTurns":2,"message1":"%1 lost balance!","message2":"%1 lost balance!","message3":"%1 is still off-balance...","message4":"%1 has regained balance!","minTurns":1,"motion":1,"name":"Stun","note":"","overlay":10,"priority":90,"removeAtBattleEnd":true,"removeByDamage":false,"removeByRestriction":false,"removeByWalking":false,"restriction":4,"stepsToRemove":100,"messageType":1},
+{"id":14,"autoRemovalTiming":0,"chanceByDamage":100,"traits":[],"iconIndex":0,"maxTurns":1,"message1":"","message2":"","message3":"","message4":"","minTurns":1,"motion":0,"name":"","note":"","overlay":0,"priority":50,"removeAtBattleEnd":false,"removeByDamage":false,"removeByRestriction":false,"removeByWalking":false,"restriction":0,"stepsToRemove":100,"messageType":1},
+{"id":15,"autoRemovalTiming":2,"chanceByDamage":100,"traits":[{"code":22,"dataId":7,"value":0.1}],"iconIndex":72,"maxTurns":4,"message1":"","message2":"","message3":"","message4":"","minTurns":4,"motion":0,"name":"HP Regeneration","note":"","overlay":0,"priority":40,"removeAtBattleEnd":true,"removeByDamage":false,"removeByRestriction":false,"removeByWalking":false,"restriction":0,"stepsToRemove":100,"messageType":1},
+{"id":16,"autoRemovalTiming":2,"chanceByDamage":100,"traits":[{"code":22,"dataId":8,"value":0.1}],"iconIndex":72,"maxTurns":4,"message1":"","message2":"","message3":"","message4":"","minTurns":4,"motion":0,"name":"MP Regeneration","note":"","overlay":0,"priority":40,"removeAtBattleEnd":true,"removeByDamage":false,"removeByRestriction":false,"removeByWalking":false,"restriction":0,"stepsToRemove":100,"messageType":1},
+{"id":17,"autoRemovalTiming":2,"chanceByDamage":100,"traits":[{"code":22,"dataId":9,"value":0.1}],"iconIndex":72,"maxTurns":4,"message1":"","message2":"","message3":"","message4":"","minTurns":4,"motion":0,"name":"TP Regeneration","note":"","overlay":0,"priority":40,"removeAtBattleEnd":true,"removeByDamage":false,"removeByRestriction":false,"removeByWalking":false,"restriction":0,"stepsToRemove":100,"messageType":1},
+{"id":18,"autoRemovalTiming":2,"chanceByDamage":100,"traits":[{"code":22,"dataId":5,"value":1}],"iconIndex":70,"maxTurns":5,"message1":"","message2":"","message3":"","message4":"","minTurns":5,"motion":0,"name":"Magic Reflection","note":"","overlay":0,"priority":40,"removeAtBattleEnd":true,"removeByDamage":false,"removeByRestriction":false,"removeByWalking":false,"restriction":0,"stepsToRemove":100,"messageType":1},
+{"id":19,"autoRemovalTiming":2,"chanceByDamage":100,"traits":[{"code":62,"dataId":2,"value":1}],"iconIndex":81,"maxTurns":1,"message1":"","message2":"","message3":"","message4":"","minTurns":1,"motion":0,"name":"Protect","note":"","overlay":0,"priority":40,"removeAtBattleEnd":true,"removeByDamage":false,"removeByRestriction":true,"removeByWalking":false,"restriction":0,"stepsToRemove":100,"messageType":1},
+{"id":20,"autoRemovalTiming":2,"chanceByDamage":100,"traits":[{"code":23,"dataId":0,"value":9}],"iconIndex":76,"maxTurns":5,"message1":"%1 became easier to hit!","message2":"","message3":"","message4":"","minTurns":5,"motion":0,"name":"Provoke","note":"","overlay":0,"priority":40,"removeAtBattleEnd":true,"removeByDamage":false,"removeByRestriction":false,"removeByWalking":false,"restriction":0,"stepsToRemove":100,"messageType":1},
+{"id":21,"autoRemovalTiming":2,"chanceByDamage":100,"traits":[{"code":23,"dataId":0,"value":0}],"iconIndex":81,"maxTurns":5,"message1":"%1 became harder to hit!","message2":"","message3":"","message4":"","minTurns":5,"motion":0,"name":"Hide","note":"","overlay":0,"priority":40,"removeAtBattleEnd":true,"removeByDamage":false,"removeByRestriction":false,"removeByWalking":false,"restriction":0,"stepsToRemove":100,"messageType":1},
+{"id":22,"autoRemovalTiming":1,"chanceByDamage":100,"traits":[{"code":22,"dataId":6,"value":1}],"iconIndex":77,"maxTurns":3,"message1":"","message2":"","message3":"","message4":"","minTurns":3,"motion":0,"name":"Counter Attack","note":"","overlay":0,"priority":50,"removeAtBattleEnd":true,"removeByDamage":false,"removeByRestriction":true,"removeByWalking":false,"restriction":0,"stepsToRemove":100,"messageType":1},
+{"id":23,"autoRemovalTiming":2,"chanceByDamage":100,"traits":[{"code":14,"dataId":4,"value":1},{"code":14,"dataId":5,"value":1},{"code":14,"dataId":6,"value":1},{"code":14,"dataId":7,"value":1},{"code":14,"dataId":8,"value":1},{"code":14,"dataId":9,"value":1},{"code":14,"dataId":10,"value":1},{"code":14,"dataId":12,"value":1},{"code":14,"dataId":13,"value":1}],"iconIndex":70,"maxTurns":5,"message1":"","message2":"","message3":"","message4":"","minTurns":5,"motion":0,"name":"Status Ailment Block","note":"","overlay":0,"priority":50,"removeAtBattleEnd":true,"removeByDamage":false,"removeByRestriction":false,"removeByWalking":false,"restriction":0,"stepsToRemove":100,"messageType":1},
+{"id":24,"autoRemovalTiming":2,"chanceByDamage":100,"traits":[{"code":23,"dataId":4,"value":0.25}],"iconIndex":70,"maxTurns":5,"message1":"","message2":"","message3":"","message4":"","minTurns":5,"motion":0,"name":"Reduce MP Cost","note":"","overlay":0,"priority":50,"removeAtBattleEnd":true,"removeByDamage":false,"removeByRestriction":false,"removeByWalking":false,"restriction":0,"stepsToRemove":100,"messageType":1},
+{"id":25,"autoRemovalTiming":2,"chanceByDamage":100,"traits":[{"code":31,"dataId":2,"value":1},{"code":11,"dataId":2,"value":0.5},{"code":21,"dataId":2,"value":1.1}],"iconIndex":64,"maxTurns":5,"message1":"%1 is now enveloped in an aura of fire.","message2":"%1 is now enveloped in an aura of fire.","message3":"","message4":"","minTurns":5,"motion":0,"name":"Fire Force","note":"","overlay":0,"priority":50,"removeAtBattleEnd":true,"removeByDamage":false,"removeByRestriction":false,"removeByWalking":false,"restriction":0,"stepsToRemove":100,"messageType":1},
+{"id":26,"autoRemovalTiming":2,"chanceByDamage":100,"traits":[{"code":31,"dataId":3,"value":1},{"code":11,"dataId":3,"value":0.5},{"code":21,"dataId":2,"value":1.1}],"iconIndex":65,"maxTurns":5,"message1":"%1 is now enveloped in an icy aura.","message2":"%1 is now enveloped in an icy aura.","message3":"","message4":"","minTurns":5,"motion":0,"name":"Ice Force","note":"","overlay":0,"priority":50,"removeAtBattleEnd":true,"removeByDamage":false,"removeByRestriction":false,"removeByWalking":false,"restriction":0,"stepsToRemove":100,"messageType":1},
+{"id":27,"autoRemovalTiming":2,"chanceByDamage":100,"traits":[{"code":31,"dataId":4,"value":1},{"code":11,"dataId":4,"value":0.5},{"code":21,"dataId":2,"value":1.1}],"iconIndex":66,"maxTurns":5,"message1":"%1 is now enveloped in a thunderous aura.","message2":"%1 is now enveloped in a thunderous aura.","message3":"","message4":"","minTurns":5,"motion":0,"name":"Thunder Force","note":"","overlay":0,"priority":50,"removeAtBattleEnd":true,"removeByDamage":false,"removeByRestriction":false,"removeByWalking":false,"restriction":0,"stepsToRemove":100,"messageType":1},
+{"id":28,"autoRemovalTiming":0,"chanceByDamage":100,"traits":[],"iconIndex":0,"maxTurns":1,"message1":"","message2":"","message3":"","message4":"","minTurns":1,"motion":0,"name":"","note":"","overlay":0,"priority":50,"removeAtBattleEnd":false,"removeByDamage":false,"removeByRestriction":false,"removeByWalking":false,"restriction":0,"stepsToRemove":100,"messageType":1},
+{"id":29,"autoRemovalTiming":0,"chanceByDamage":100,"traits":[{"code":64,"dataId":0,"value":1}],"iconIndex":72,"maxTurns":1,"message1":"","message2":"","message3":"","message4":"","minTurns":1,"motion":0,"name":"Half Encounters","note":"","overlay":0,"priority":20,"removeAtBattleEnd":false,"removeByDamage":false,"removeByRestriction":false,"removeByWalking":true,"restriction":0,"stepsToRemove":100,"messageType":1},
+{"id":30,"autoRemovalTiming":0,"chanceByDamage":100,"traits":[{"code":64,"dataId":4,"value":1},{"code":64,"dataId":5,"value":1}],"iconIndex":70,"maxTurns":1,"message1":"","message2":"","message3":"","message4":"","minTurns":1,"motion":0,"name":"Double Money/Items","note":"","overlay":0,"priority":20,"removeAtBattleEnd":false,"removeByDamage":false,"removeByRestriction":false,"removeByWalking":true,"restriction":0,"stepsToRemove":100,"messageType":1}
+]
\ No newline at end of file
diff --git a/data/System.json b/data/System.json
new file mode 100644
index 0000000..da509eb
--- /dev/null
+++ b/data/System.json
@@ -0,0 +1 @@
+{"advanced":{"gameId":91059537,"screenWidth":816,"screenHeight":624,"uiAreaWidth":816,"uiAreaHeight":624,"numberFontFilename":"mplus-2p-bold-sub.woff","fallbackFonts":"Verdana, sans-serif","fontSize":26,"mainFontFilename":"mplus-1m-regular.woff","screenScale":1,"windowOpacity":192},"airship":{"bgm":{"name":"Ship3","pan":0,"pitch":100,"volume":90},"characterIndex":3,"characterName":"Vehicle","startMapId":0,"startX":0,"startY":0},"armorTypes":["","General Armor","Magic Armor","Light Armor","Heavy Armor","Small Shield","Large Shield"],"attackMotions":[{"type":0,"weaponImageId":0},{"type":1,"weaponImageId":1},{"type":1,"weaponImageId":2},{"type":1,"weaponImageId":3},{"type":1,"weaponImageId":4},{"type":1,"weaponImageId":5},{"type":1,"weaponImageId":6},{"type":2,"weaponImageId":7},{"type":2,"weaponImageId":8},{"type":2,"weaponImageId":9},{"type":0,"weaponImageId":10},{"type":0,"weaponImageId":11},{"type":0,"weaponImageId":12}],"battleBgm":{"name":"Battle1","pan":0,"pitch":100,"volume":90},"battleback1Name":"GrassMaze","battleback2Name":"GrassMaze","battlerHue":0,"battlerName":"Hi_monster","battleSystem":0,"boat":{"bgm":{"name":"Ship1","pan":0,"pitch":100,"volume":90},"characterIndex":0,"characterName":"Vehicle","startMapId":0,"startX":0,"startY":0},"currencyUnit":"G","defeatMe":{"name":"Defeat1","pan":0,"pitch":100,"volume":90},"editMapId":0,"elements":["","Physical","Fire","Ice","Thunder","Water","Earth","Wind","Light","Darkness"],"equipTypes":["","Weapon","Shield","Head","Body","Accessory"],"gameTitle":"Life of a Naomi","gameoverMe":{"name":"Gameover1","pan":0,"pitch":100,"volume":90},"itemCategories":[true,true,true,true],"locale":"en_US","magicSkills":[1],"menuCommands":[true,true,true,true,true,true],"optAutosave":true,"optDisplayTp":true,"optDrawTitle":true,"optExtraExp":false,"optFloorDeath":false,"optFollowers":true,"optKeyItemsNumber":false,"optSideView":false,"optSlipDeath":false,"optTransparent":false,"partyMembers":[1,4,6,7],"ship":{"bgm":{"name":"Ship2","pan":0,"pitch":100,"volume":90},"characterIndex":1,"characterName":"Vehicle","startMapId":0,"startX":0,"startY":0},"skillTypes":["","Magic","Special"],"sounds":[{"name":"Cursor3","pan":0,"pitch":100,"volume":90},{"name":"Decision2","pan":0,"pitch":100,"volume":90},{"name":"Cancel2","pan":0,"pitch":100,"volume":90},{"name":"Buzzer1","pan":0,"pitch":100,"volume":90},{"name":"Equip1","pan":0,"pitch":100,"volume":90},{"name":"Save2","pan":0,"pitch":100,"volume":90},{"name":"Load2","pan":0,"pitch":100,"volume":90},{"name":"Battle1","pan":0,"pitch":100,"volume":90},{"name":"Run","pan":0,"pitch":100,"volume":90},{"name":"Attack3","pan":0,"pitch":100,"volume":90},{"name":"Damage4","pan":0,"pitch":100,"volume":90},{"name":"Collapse1","pan":0,"pitch":100,"volume":90},{"name":"Collapse2","pan":0,"pitch":100,"volume":90},{"name":"Collapse3","pan":0,"pitch":100,"volume":90},{"name":"Damage5","pan":0,"pitch":100,"volume":90},{"name":"Collapse4","pan":0,"pitch":100,"volume":90},{"name":"Recovery","pan":0,"pitch":100,"volume":90},{"name":"Miss","pan":0,"pitch":100,"volume":90},{"name":"Evasion1","pan":0,"pitch":100,"volume":90},{"name":"Evasion2","pan":0,"pitch":100,"volume":90},{"name":"Reflection","pan":0,"pitch":100,"volume":90},{"name":"Shop1","pan":0,"pitch":100,"volume":90},{"name":"Item3","pan":0,"pitch":100,"volume":90},{"name":"Item3","pan":0,"pitch":100,"volume":90}],"startMapId":1,"startX":8,"startY":6,"switches":["","","","","","","","","","","","","","","","","","","","",""],"terms":{"basic":["Level","Lv","HP","HP","MP","MP","TP","TP","EXP","EXP"],"commands":["Fight","Escape","Attack","Guard","Item","Skill","Equip","Status","Formation","Save","Game End","Options","Weapon","Armor","Key Item","Equip","Optimize","Clear","New Game","Continue",null,"To Title","Cancel",null,"Buy","Sell"],"params":["Max HP","Max MP","Attack","Defense","M.Attack","M.Defense","Agility","Luck","Hit","Evasion"],"messages":{"alwaysDash":"Always Dash","commandRemember":"Command Remember","touchUI":"Touch UI","bgmVolume":"BGM Volume","bgsVolume":"BGS Volume","meVolume":"ME Volume","seVolume":"SE Volume","possession":"Possession","expTotal":"Current %1","expNext":"To Next %1","saveMessage":"Which file would you like to save to?","loadMessage":"Which file would you like to load?","file":"File","autosave":"Autosave","partyName":"%1’s Party","emerge":"%1 emerged!","preemptive":"%1 got the upper hand!","surprise":"%1 was surprised!","escapeStart":"%1 has started to escape!","escapeFailure":"However, it was unable to escape!","victory":"%1 was victorious!","defeat":"%1 was defeated.","obtainExp":"%1 %2 received!","obtainGold":"%1\\G found!","obtainItem":"%1 found!","levelUp":"%1 is now %2 %3!","obtainSkill":"%1 learned!","useItem":"%1 uses %2!","criticalToEnemy":"An excellent hit!!","criticalToActor":"A painful blow!!","actorDamage":"%1 took %2 damage!","actorRecovery":"%1 recovered %2 %3!","actorGain":"%1 gained %2 %3!","actorLoss":"%1 lost %2 %3!","actorDrain":"%1 was drained of %2 %3!","actorNoDamage":"%1 took no damage!","actorNoHit":"Miss! %1 took no damage!","enemyDamage":"%1 took %2 damage!","enemyRecovery":"%1 recovered %2 %3!","enemyGain":"%1 gained %2 %3!","enemyLoss":"%1 lost %2 %3!","enemyDrain":"%1 was drained of %2 %3!","enemyNoDamage":"%1 took no damage!","enemyNoHit":"Miss! %1 took no damage!","evasion":"%1 evaded the attack!","magicEvasion":"%1 nullified the magic!","magicReflection":"%1 reflected the magic!","counterAttack":"%1 made a counterattack!","substitute":"%1 protected %2!","buffAdd":"%1’s %2 went up!","debuffAdd":"%1’s %2 went down!","buffRemove":"%1’s %2 returned to normal!","actionFailure":"There was no effect on %1!"}},"testBattlers":[{"actorId":1,"level":1,"equips":[2,1,2,3,0]},{"actorId":4,"level":1,"equips":[31,0,0,5,0]},{"actorId":6,"level":1,"equips":[7,0,65,21,0]},{"actorId":7,"level":1,"equips":[7,0,0,20,0]}],"testTroopId":1,"title1Name":"Ruins","title2Name":"","titleBgm":{"name":"Theme4","pan":0,"pitch":100,"volume":90},"titleCommandWindow":{"background":0,"offsetX":0,"offsetY":0},"variables":["","","","","","","","","","","","","","","","","","","","",""],"versionId":51328477,"victoryMe":{"name":"Victory1","pan":0,"pitch":100,"volume":90},"weaponTypes":["","Dagger","Sword","Flail","Axe","Whip","Staff","Bow","Crossbow","Gun","Claw","Glove","Spear"],"windowTone":[0,0,0,0],"optSplashScreen":false,"optMessageSkip":true,"tileSize":48}
\ No newline at end of file
diff --git a/data/Tilesets.json b/data/Tilesets.json
new file mode 100644
index 0000000..5b0a127
--- /dev/null
+++ b/data/Tilesets.json
@@ -0,0 +1,9 @@
+[
+null,
+{"id":1,"flags":[16,1551,1536,1536,1536,1536,1536,1551,1536,1536,1536,1536,1536,1551,1551,1536,1536,1536,1551,1536,1536,1551,1536,1536,1536,1536,1551,1551,1536,1536,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1536,1536,1536,1536,1536,1536,1536,1536,1551,1551,1551,1551,1551,1551,1551,1551,1536,1536,1536,1536,1536,1536,1536,1536,1551,1551,1551,1551,1551,1551,1551,1551,1536,1536,1536,1536,1536,1536,1536,1536,1551,1551,1551,1551,1551,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1551,1551,1551,1551,1551,1551,1551,1551,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1551,1551,1551,1551,1551,1551,1551,1536,1551,1551,1551,1536,1536,1536,1536,1536,1551,1536,1551,1536,1536,1536,1536,1536,1551,1551,1551,1551,1551,1551,1551,1551,1551,1536,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1536,1552,1552,1552,1552,1552,1552,1552,1552,1551,1551,1551,1551,1551,1551,1552,1552,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1552,1552,1552,1552,1552,1552,1552,1552,1552,1552,1552,1552,1552,1552,1552,1552,1552,1552,1536,1536,1552,1552,1552,1552,1551,1551,1551,1551,1536,1536,1551,1551,1551,1551,1551,1551,1551,1551,1551,1536,1536,1551,1536,1551,1536,1551,1551,1551,1536,1536,1551,1552,1552,1552,1552,1552,1536,1536,1536,1551,1551,1551,1551,1551,1536,1536,1536,1551,1551,1551,1551,1551,1536,1536,1536,1551,1551,1551,1551,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1551,1551,1551,1551,1551,1551,1551,1551,1536,1536,1536,1536,1536,1536,1536,1536,1551,1551,1551,1551,1551,1551,1551,1551,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1551,1551,1536,1536,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1536,1536,1536,1536,1536,1536,1536,1536,1551,1551,1551,1551,1551,1551,1551,1551,1536,1536,1536,1536,1536,1536,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1536,1536,1536,1536,1536,1536,1551,1551,1551,1551,1551,1551,1551,1551,1536,1551,1536,1536,1536,1536,1536,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1536,1536,1536,1536,1536,1536,1536,1536,1551,1551,1551,1551,1551,1551,1551,1551,1551,1536,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3584,3584,3584,3584,3648,3584,3584,3584,3584,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3584,3584,3584,3584,3648,3584,3584,3584,3584,3648,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3584,3584,3584,3584,3648,3584,3584,3584,3584,3648,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3584,3584,3584,3584,3648,3584,3584,3584,3584,3648,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3584,3584,3584,3584,3648,3584,3584,3584,3584,3648,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599],"mode":0,"name":"Overworld","note":"","tilesetNames":["World_A1","World_A2","","","","World_B","World_C","",""]},
+{"id":2,"flags":[16,1536,1536,1536,1536,1552,1552,1552,1552,1536,1536,1536,1536,1551,1551,1551,1552,1574,1574,1574,1574,1551,1536,1551,1551,1574,1574,1574,1574,1552,1552,1552,1552,1536,1536,1536,1551,1551,1551,1551,1552,1536,1536,1536,1536,1551,1536,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1536,1536,1536,1536,1536,1536,1536,1536,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1552,1551,1551,1536,1536,1551,1536,1551,1552,1551,1551,1551,1536,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1536,1536,1600,1536,1551,1552,1551,1551,1536,1536,1536,1536,1551,1551,1551,1551,1551,1551,1551,1536,1551,1551,1551,1551,1552,1552,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1552,1552,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1536,1551,1551,1551,1551,1536,1536,1536,1536,1552,1551,1551,1551,1551,1551,1536,1551,1551,1551,1551,1552,1551,1551,1551,1552,1551,1551,1536,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1536,1615,1536,1551,1551,1551,1552,1552,1552,1552,1552,1552,1552,1552,1552,1551,1551,1551,1551,1551,1552,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1552,1551,1552,1552,1552,1552,1552,1552,1551,1551,1551,1551,1551,1551,1551,1551,1552,1551,1552,1552,1552,1552,1552,1552,1551,1551,1551,1551,1551,1551,1551,1551,1552,1552,1552,1552,1551,1552,1552,1552,1551,1551,1551,1551,1551,1551,1551,1551,1552,1552,1552,1552,1551,1552,1552,1552,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1552,1552,1552,1551,1551,1551,1551,1551,1551,1551,1551,1536,1536,1553,1553,1553,1553,1553,1553,1553,1553,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1553,1553,1551,1551,1551,1553,1553,1553,1551,1551,1553,1553,1553,1551,1551,1551,1553,1553,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1552,1552,1552,1552,1551,1551,1553,1553,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1552,1552,1551,1551,1551,1551,1551,1551,1552,1552,1551,1551,1551,1551,1551,1551,1551,1551,1552,1552,1552,1552,1552,1552,1551,1551,1551,1551,1551,1551,1551,1551,1552,1552,1551,1551,1551,1551,1551,1551,1552,1552,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1664,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1551,1551,1544,1536,1544,1538,1536,1540,1551,1551,1537,1536,1537,1538,1536,1540,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1538,1536,1540,1542,1536,1536,1536,1536,1538,1536,1540,1542,1538,1536,1540,1542,1538,1536,1540,1542,1538,1536,1540,1542,1538,1536,1540,1542,1538,1536,1540,1542,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1546,1544,1548,1536,1536,1546,1544,1548,1538,1536,1540,1536,1536,1538,1536,1540,1538,1536,1540,1536,1536,1538,1536,1540,1551,1551,1551,1536,1536,1551,1551,1551,1551,1551,1551,1536,1536,1551,1551,1551,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599],"mode":1,"name":"Outside","note":"","tilesetNames":["Outside_A1","Outside_A2","Outside_A3","Outside_A4","Outside_A5","Outside_B","Outside_C","",""]},
+{"id":3,"flags":[16,1536,1536,1536,1536,1574,1574,1574,1536,1536,1536,1536,1536,1574,1574,1574,1536,1536,1551,1536,1551,1536,1536,1536,1552,1552,1552,1551,1551,1536,1536,1536,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1536,1536,1536,1551,1536,1536,1536,1679,1679,1679,1679,1679,1551,1551,1551,1536,1536,1536,1679,1679,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1552,1552,1552,1552,1552,1552,1551,1551,1551,1551,1551,1551,1551,1551,1552,1552,1552,1552,1552,1552,1552,1552,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1536,1551,1551,1551,1551,1551,1551,1551,1536,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1552,1552,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1679,1551,1551,1551,1551,1551,1552,1552,1552,1552,1551,1551,1551,1551,1679,1679,1679,1679,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1552,1552,1552,1552,1552,1551,1552,1552,1551,1551,1551,1551,1551,1551,1551,1551,1552,1552,1552,1551,1551,1551,1551,1551,1551,1679,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1536,1536,1536,1536,1552,1551,1552,1552,1552,1552,1552,1552,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1551,1536,1538,1536,1540,1544,1536,1544,1551,1551,1538,1536,1540,1537,1536,1537,1536,1536,1536,1536,1536,1536,1536,1536,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1551,1551,1551,1551,1551,1551,1551,1551,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1551,1551,1551,1551,1551,1551,1551,1551,1536,1536,1536,1536,1536,1536,1536,1536,1538,1536,1540,1542,1538,1536,1540,1542,1538,1536,1540,1542,1538,1536,1540,1542,1538,1536,1540,1542,1538,1536,1540,1542,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599],"mode":1,"name":"Inside","note":"","tilesetNames":["Inside_A1","Inside_A2","","Inside_A4","Inside_A5","Inside_B","Inside_C","",""]},
+{"id":4,"flags":[16,1551,1536,1536,1574,1574,1574,1574,1551,1551,1536,1536,1574,1574,1574,1536,1551,1551,1536,1536,1536,1536,1536,1536,1551,1551,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1551,1551,1551,1551,1551,1551,1551,1551,1552,1552,1552,1552,1552,1552,1552,1552,1551,1551,1551,1551,1551,1551,1551,1551,1552,1552,1552,1552,1552,1552,1552,1552,1551,1551,1551,1551,1551,1551,1551,1551,1552,1552,1552,1551,1552,1552,1552,1552,1551,1551,1551,1551,1551,1551,1551,1551,1552,1552,1552,1552,1552,1552,1552,1552,1552,1551,1551,1551,1551,1552,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1536,1536,1536,1536,1536,1536,1536,1536,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1536,1536,1551,1551,1536,1536,1536,1536,1536,1536,1551,1551,1551,1551,1551,1536,1536,1551,1536,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1552,1552,1552,1552,1552,1552,1552,1552,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1679,1552,1552,1552,1552,1551,1551,1551,1536,1679,1679,1679,1679,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1536,1536,1536,1536,1536,1536,1536,1536,1551,1551,1551,1551,1551,1551,1551,1552,1551,1551,1551,1551,1551,1551,1551,1552,1536,1536,1536,1536,1536,1536,1536,1552,1552,1552,1552,1552,1552,1552,1552,1552,1552,1552,1552,1552,1552,1552,1551,1551,1552,1552,1552,1552,1552,1552,1551,1551,1551,1552,1552,1551,1552,1552,1551,1551,1536,1536,1536,1536,1536,1536,1551,1551,1536,1536,1536,1536,1536,1536,1551,1551,1536,1536,1536,1536,1536,1536,1551,1551,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1536,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1552,1552,1552,1552,1552,1552,1551,1551,1551,1551,1551,1551,1551,1551,1551,1552,1552,1552,1552,1680,1552,1552,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1553,1553,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1550,1550,1551,1550,1551,1551,1550,1551,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1552,1551,1536,1536,1536,1536,1536,1536,1551,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1551,1536,1536,1536,1536,1536,1536,1536,1551,1551,1551,1551,1551,1536,1536,1551,1536,1536,1551,1551,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1551,1551,1551,1536,1536,1536,1536,1538,1536,1540,1542,1538,1536,1540,1542,1538,1536,1540,1542,1538,1536,1540,1542,1538,1536,1540,1542,1538,1536,1540,1542,1538,1536,1540,1542,1538,1536,1540,1542,1538,1536,1540,1542,1538,1536,1540,1542,1538,1536,1540,1542,1538,1536,1540,1542,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1792,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3840,3840,3840,3840,3904,3840,3840,3840,3840,3904,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599],"mode":1,"name":"Dungeon","note":"","tilesetNames":["Dungeon_A1","Dungeon_A2","","Dungeon_A4","Dungeon_A5","Dungeon_B","Dungeon_C","",""]},
+{"id":5,"flags":[16,1551,1551,1551,1551,1551,1551,1551,1552,1552,1552,1552,1552,1552,1552,1552,1536,1536,1536,1536,1536,1536,1536,1536,1551,1551,1551,1551,1551,1551,1551,1551,1536,1536,1536,1536,1536,1536,1536,1536,1536,1552,1552,1536,1536,1536,1551,1536,1536,1551,1551,1536,1536,1536,1536,1536,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1552,1552,1552,1552,1552,1552,1552,1551,1552,1552,1552,1552,1552,1551,1551,1551,1552,1552,1552,1552,1552,1552,1552,1552,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1552,1551,1551,1552,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1552,1552,1552,1552,1552,1552,1552,1552,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1536,1552,1552,1552,1552,1551,1551,1551,1536,1551,1551,1551,1551,1551,1551,1551,1551,1552,1552,1552,1551,1536,1536,1536,1536,1552,1552,1552,1551,1536,1536,1536,1536,1679,1679,1679,1551,1574,1542,1574,1568,1552,1552,1552,1551,1574,1542,1574,1574,1552,1552,1552,1551,1536,1536,1536,1536,1679,1679,1679,1551,1536,1536,1536,1536,1552,1552,1552,1552,1552,1552,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1552,1552,1552,1551,1551,1552,1552,1551,1551,1551,1551,1551,1551,1551,1552,1551,1536,1536,1551,1536,1551,1551,1551,1551,1536,1551,1551,1551,1551,1551,1551,1551,1552,1552,1551,1551,1551,1536,1536,1536,1551,1551,1551,1551,1551,1536,1551,1536,1552,1551,1551,1551,1551,1536,1536,1536,1551,1552,1552,1552,1552,1552,1552,1551,1551,1551,1551,1551,1551,1551,1551,1536,1551,1551,1551,1551,1551,1551,1551,1551,1552,1552,1552,1552,1552,1552,1552,1552,1551,1551,1551,1551,1551,1551,1551,1551,1552,1551,1552,1552,1552,1552,1552,1552,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1552,1552,1552,1551,1551,1551,1551,1551,1552,1552,1552,1551,1551,1551,1551,1536,1551,1536,1551,1536,1551,1551,1551,1552,1551,1551,1551,1551,1551,1551,1551,1552,1551,1551,1551,1552,1551,1551,1551,1552,1551,1551,1551,1552,1551,1551,1551,1551,1552,1552,1552,1551,1551,1551,1551,1551,1552,1552,1552,1552,1551,1551,1551,1551,1551,1552,1552,1551,1551,1551,1551,1552,1552,1552,1552,1552,1551,1551,1551,1552,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1679,1679,1551,1551,1551,1552,1551,1552,1552,1552,1551,1551,1551,1552,1552,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1552,1552,1551,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1551,1536,1538,1536,1540,1544,1536,1544,1551,1551,1538,1536,1540,1537,1536,1537,1536,1536,1536,1536,1551,1551,1536,1536,1551,1551,1551,1536,1538,1536,1540,1542,1536,1536,1536,1551,1536,1536,1536,1551,1536,1536,1536,1536,1538,1536,1540,1542,1536,1536,1536,1536,1536,1536,1536,1551,1538,1536,1540,1542,1538,1536,1540,1542,1536,1536,1536,1536,1536,1536,1536,1536,1538,1536,1540,1542,1538,1536,1540,1542,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1546,1544,1548,1536,1536,1536,1536,1536,1538,1536,1540,1538,1536,1540,1542,1536,1538,1536,1540,1538,1536,1540,1542,1536,1551,1551,1551,1536,1536,1551,1536,1536,1551,1551,1551,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3904,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,3855,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599],"mode":1,"name":"SF Outside","note":"","tilesetNames":["Outside_A1","Outside_A2","SF_Outside_A3","SF_Outside_A4","SF_Outside_A5","SF_Outside_B","SF_Outside_C","",""]},
+{"id":6,"flags":[16,1536,1536,1536,1536,1574,1574,1574,1536,1536,1536,1536,1536,1574,1574,1574,1551,1551,1551,1551,1551,1536,1536,1536,1551,1551,1551,1551,1551,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1546,1548,1545,1542,1551,1551,1551,1551,1539,1541,1544,1542,1551,1551,1551,1551,1542,1538,1540,1680,1552,1552,1552,1552,1552,1552,1551,1679,1551,1551,1551,1551,1551,1551,1551,1679,1551,1551,1551,1551,1551,1551,1551,1536,1552,1552,1552,1552,1552,1552,1551,1551,1552,1552,1552,1551,1551,1551,1551,1551,1552,1552,1549,1547,1551,1551,1551,1551,1551,1551,1550,1551,1551,1551,1679,1679,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1544,1551,1538,1540,1551,1551,1551,1551,1544,1551,1538,1540,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1679,1551,1536,1536,1551,1551,1679,1679,1679,1552,1552,1552,1552,1552,1552,1552,1552,1551,1551,1551,1551,1551,1551,1551,1551,1552,1552,1552,1552,1552,1552,1552,1552,1551,1551,1551,1551,1551,1551,1551,1551,1552,1552,1552,1552,1552,1552,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1536,1551,1551,1551,1552,1551,1551,1551,1536,1551,1551,1551,1551,1551,1551,1551,1551,1551,1679,1679,1551,1551,1551,1551,1551,1679,1679,1679,1551,1551,1551,1551,1551,1551,1551,1551,1551,1552,1552,1551,1551,1551,1536,1536,1536,1551,1551,1536,1552,1552,1551,1551,1551,1551,1551,1551,1551,1551,1551,1536,1551,1551,1536,1551,1551,1551,1551,1551,1552,1552,1552,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1536,1536,1544,1551,1551,1551,1551,1551,1551,1552,1552,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1552,1552,1552,1551,1551,1551,1551,1551,1551,1551,1551,1551,1538,1536,1540,1551,1551,1551,1551,1551,1538,1536,1540,1551,1551,1551,1551,1551,1536,1536,1536,1551,1551,1551,1551,1551,1551,1552,1551,1551,1551,1552,1551,1552,1536,1551,1551,1551,1551,1551,1551,1552,1551,1679,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1552,1552,1552,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1551,1552,1552,1552,1552,1552,1552,1552,1552,1551,1551,1551,1551,1551,1551,1551,1551,1552,1551,1552,1552,1552,1552,1552,1552,1551,1551,1551,1551,1551,1551,1551,1551,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1551,1536,1538,1536,1540,1544,1536,1544,1551,1551,1538,1536,1540,1537,1536,1537,1536,1536,1536,1536,1551,1551,1536,1536,1551,1551,1551,1536,1538,1536,1540,1542,1536,1536,1536,1551,1536,1536,1536,1551,1536,1536,1536,1536,1538,1536,1540,1542,1536,1536,1536,1536,1536,1536,1536,1551,1538,1536,1540,1542,1538,1536,1540,1542,1536,1536,1536,1536,1536,1536,1536,1536,1538,1536,1540,1542,1538,1536,1540,1542,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1546,1544,1548,1536,1536,1536,1536,1536,1538,1536,1540,1538,1540,1540,1542,1536,1538,1536,1540,1538,1540,1540,1542,1536,1551,1551,1551,1536,1536,1551,1536,1536,1551,1551,1551,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,2575,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3648,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,2063,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,3727,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3584,3586,3586,3586,3586,3592,3592,3592,3592,3588,3588,3588,3588,3584,3584,3584,3584,3590,3592,3594,3594,3596,3596,3588,3588,3586,3586,3598,3594,3590,3596,3598,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599,3599],"mode":1,"name":"SF Inside","note":"","tilesetNames":["Inside_A1","Inside_A2","","SF_Inside_A4","SF_Outside_A5","SF_Inside_B","SF_Inside_C","",""]}
+]
\ No newline at end of file
diff --git a/data/Troops.json b/data/Troops.json
new file mode 100644
index 0000000..aabbfd4
--- /dev/null
+++ b/data/Troops.json
@@ -0,0 +1,8 @@
+[
+null,
+{"id":1,"members":[{"enemyId":1,"x":336,"y":436,"hidden":false},{"enemyId":1,"x":480,"y":436,"hidden":false}],"name":"Goblin*2","pages":[{"conditions":{"actorHp":50,"actorId":1,"actorValid":false,"enemyHp":50,"enemyIndex":0,"enemyValid":false,"switchId":1,"switchValid":false,"turnA":0,"turnB":0,"turnEnding":false,"turnValid":false},"list":[{"code":0,"indent":0,"parameters":[]}],"span":0}]},
+{"id":2,"members":[{"enemyId":2,"x":337,"y":436,"hidden":false},{"enemyId":2,"x":480,"y":436,"hidden":false}],"name":"Gnome*2","pages":[{"conditions":{"actorHp":50,"actorId":1,"actorValid":false,"enemyHp":50,"enemyIndex":0,"enemyValid":false,"switchId":1,"switchValid":false,"turnA":0,"turnB":0,"turnEnding":false,"turnValid":false},"list":[{"code":0,"indent":0,"parameters":[]}],"span":0}]},
+{"id":3,"members":[{"enemyId":3,"x":337,"y":436,"hidden":false},{"enemyId":3,"x":479,"y":436,"hidden":false}],"name":"Crow*2","pages":[{"conditions":{"actorHp":50,"actorId":1,"actorValid":false,"enemyHp":50,"enemyIndex":0,"enemyValid":false,"switchId":1,"switchValid":false,"turnA":0,"turnB":0,"turnEnding":false,"turnValid":false},"list":[{"code":0,"indent":0,"parameters":[]}],"span":0}]},
+{"id":4,"members":[{"enemyId":4,"x":408,"y":436,"hidden":false}],"name":"Treant","pages":[{"conditions":{"actorHp":50,"actorId":1,"actorValid":false,"enemyHp":50,"enemyIndex":0,"enemyValid":false,"switchId":1,"switchValid":false,"turnA":0,"turnB":0,"turnEnding":false,"turnValid":false},"list":[{"code":0,"indent":0,"parameters":[]}],"span":0}]},
+{"id":5,"members":[{"enemyId":5,"x":408,"y":436,"hidden":false}],"name":"Hi_monster","pages":[{"conditions":{"actorHp":50,"actorId":1,"actorValid":false,"enemyHp":50,"enemyIndex":0,"enemyValid":false,"switchId":1,"switchValid":false,"turnA":0,"turnB":0,"turnEnding":false,"turnValid":false},"list":[{"code":0,"indent":0,"parameters":[]}],"span":0}]}
+]
\ No newline at end of file
diff --git a/data/Weapons.json b/data/Weapons.json
new file mode 100644
index 0000000..b2e2dd6
--- /dev/null
+++ b/data/Weapons.json
@@ -0,0 +1,53 @@
+[
+null,
+{"id":1,"animationId":6,"description":"[Sword] A light and easy-to-wield short-bladed sword.","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":97,"name":"Short Sword","note":"","params":[0,0,8,0,0,0,0,0],"price":300,"wtypeId":2},
+{"id":2,"animationId":6,"description":"[Sword] A long battle sword boasting a sharp cut.","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":97,"name":"Long Sword","note":"","params":[0,0,12,0,0,0,0,0],"price":670,"wtypeId":2},
+{"id":3,"animationId":6,"description":"[Sword] A wide sword with a curved blade.","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":97,"name":"Falchion","note":"","params":[0,0,18,0,0,0,0,0],"price":1480,"wtypeId":2},
+{"id":4,"animationId":6,"description":"[Sword] A long sword forged with mithril.","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":97,"name":"Mithril Sword","note":"","params":[0,0,25,0,0,0,0,0],"price":3890,"wtypeId":2},
+{"id":5,"animationId":6,"description":"[Sword] A sword forged from the fangs of a dragon.","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":97,"name":"Dragon Blade","note":"","params":[0,0,36,0,0,0,0,0],"price":6970,"wtypeId":2},
+{"id":6,"animationId":0,"description":"","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":0,"name":"","note":"","params":[0,0,0,0,0,0,0,0],"price":0,"wtypeId":0},
+{"id":7,"animationId":1,"description":"[Staff] An inexpensive and widely-used staff.","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":101,"name":"Wooden Staff","note":"","params":[0,0,2,0,8,3,0,0],"price":280,"wtypeId":6},
+{"id":8,"animationId":1,"description":"[Staff] A wand that slightly increases its wielder’s\nmagical powers.","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":101,"name":"Magic Wand","note":"","params":[0,0,3,0,12,6,0,0],"price":780,"wtypeId":6},
+{"id":9,"animationId":1,"description":"[Staff] A silver wand that increases its wielder’s\nmagical powers.","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":101,"name":"Force Wand","note":"","params":[0,0,5,0,21,12,0,0],"price":1680,"wtypeId":6},
+{"id":10,"animationId":1,"description":"[Staff] A mithril rod that increases its wielder’s\nmagical powers.","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":101,"name":"Mithril Rod","note":"","params":[0,0,12,0,32,24,0,0],"price":4120,"wtypeId":6},
+{"id":11,"animationId":1,"description":"[Staff] A dragon staff that increases its wielder’s\nmagical powers.","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":101,"name":"Dragon Staff","note":"","params":[0,0,18,0,45,52,0,0],"price":7680,"wtypeId":6},
+{"id":12,"animationId":0,"description":"","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":0,"name":"","note":"","params":[0,0,0,0,0,0,0,0],"price":0,"wtypeId":0},
+{"id":13,"animationId":1,"description":"[Flail] A flail with a stone head attached to its\nhandle with a chain.","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":98,"name":"Stone Flail","note":"","params":[0,0,7,0,0,0,0,0],"price":360,"wtypeId":3},
+{"id":14,"animationId":1,"description":"[Flail] A flail with a bronze head attached to its\nhandle with a chain.","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":98,"name":"Bronze Flail","note":"","params":[0,0,12,0,0,0,0,0],"price":680,"wtypeId":3},
+{"id":15,"animationId":1,"description":"[Flail] A flail that has been strengthened with steel.","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":98,"name":"Morning Star","note":"","params":[0,0,18,0,0,0,0,0],"price":1460,"wtypeId":3},
+{"id":16,"animationId":1,"description":"[Flail] A flail that has been strengthened with mithril.","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":98,"name":"Mithril Flail","note":"","params":[0,0,23,0,0,0,0,0],"price":2980,"wtypeId":3},
+{"id":17,"animationId":1,"description":"[Flail] A flail that has been strengthened using fangs of a dragon.","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":98,"name":"Dragon Flail","note":"","params":[0,0,29,0,0,0,0,0],"price":6180,"wtypeId":3},
+{"id":18,"animationId":0,"description":"","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":0,"name":"","note":"","params":[0,0,0,0,0,0,0,0],"price":0,"wtypeId":0},
+{"id":19,"animationId":6,"description":"[Axe] A small axe used for logging trees.","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":99,"name":"Hand Axe","note":"","params":[0,0,10,0,0,0,0,0],"price":480,"wtypeId":4},
+{"id":20,"animationId":6,"description":"[Axe] A double-edged axe made for battle.","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":99,"name":"Battle Axe","note":"","params":[0,0,18,0,0,0,0,0],"price":980,"wtypeId":4},
+{"id":21,"animationId":6,"description":"[Axe] A battle axe with a crescent-shaped blade.","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":99,"name":"Bardiche","note":"","params":[0,0,25,0,0,0,0,0],"price":2180,"wtypeId":4},
+{"id":22,"animationId":6,"description":"[Axe] A battle axe forged with mithril.","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":99,"name":"Mithril Axe","note":"","params":[0,0,32,0,0,0,0,0],"price":4500,"wtypeId":4},
+{"id":23,"animationId":6,"description":"[Axe] A battle axe forged from the fangs of a dragon.","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":99,"name":"Dragon Axe","note":"","params":[0,0,45,0,0,0,0,0],"price":9600,"wtypeId":4},
+{"id":24,"animationId":0,"description":"","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":0,"name":"","note":"","params":[0,0,0,0,0,0,0,0],"price":0,"wtypeId":0},
+{"id":25,"animationId":11,"description":"[Spear] A short spear specialized for thrusting.","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":107,"name":"Short Spear","note":"","params":[0,0,6,0,0,0,0,0],"price":320,"wtypeId":12},
+{"id":26,"animationId":11,"description":"[Spear] A spear with the longest handle possible.","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":107,"name":"Long Spear","note":"","params":[0,0,12,0,0,0,0,0],"price":890,"wtypeId":12},
+{"id":27,"animationId":11,"description":"[Spear] A spear with an axe-head at its tip.","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":107,"name":"Halberd","note":"","params":[0,0,18,0,0,0,0,0],"price":1760,"wtypeId":12},
+{"id":28,"animationId":11,"description":"[Spear] A spear forged with mithril.","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":107,"name":"Mithril Spear","note":"","params":[0,0,24,0,0,0,0,0],"price":3420,"wtypeId":12},
+{"id":29,"animationId":11,"description":"[Spear] A spear forged from the fangs of a dragon.","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":107,"name":"Dragon Spear","note":"","params":[0,0,32,0,0,0,0,0],"price":5980,"wtypeId":12},
+{"id":30,"animationId":0,"description":"","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":0,"name":"","note":"","params":[0,0,0,0,0,0,0,0],"price":0,"wtypeId":0},
+{"id":31,"animationId":1,"description":"[Glove] A battle glove with spikes attached to its\nknuckles.","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0},{"code":54,"dataId":2,"value":1},{"code":34,"dataId":0,"value":1}],"iconIndex":106,"name":"Cestus","note":"","params":[0,0,5,5,0,0,0,0],"price":360,"wtypeId":11},
+{"id":32,"animationId":16,"description":"[Claw] A combat weapon with 4 short claws attached.","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0},{"code":54,"dataId":2,"value":1},{"code":34,"dataId":0,"value":1}],"iconIndex":105,"name":"Bagh Naka","note":"","params":[0,0,12,8,0,0,0,0],"price":980,"wtypeId":10},
+{"id":33,"animationId":16,"description":"[Claw] A combat weapon with iron talons attached.","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0},{"code":54,"dataId":2,"value":1},{"code":34,"dataId":0,"value":1}],"iconIndex":105,"name":"Iron Claw","note":"","params":[0,0,20,15,0,0,0,0],"price":1560,"wtypeId":10},
+{"id":34,"animationId":16,"description":"[Claw] A combat weapon with mithril talons attached.","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0},{"code":54,"dataId":2,"value":1},{"code":34,"dataId":0,"value":1}],"iconIndex":105,"name":"Mithril Claw","note":"","params":[0,0,25,18,0,0,0,0],"price":3480,"wtypeId":10},
+{"id":35,"animationId":16,"description":"[Claw] A combat weapon with dragon talons attached.","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0},{"code":54,"dataId":2,"value":1},{"code":34,"dataId":0,"value":1}],"iconIndex":105,"name":"Dragon Claw","note":"","params":[0,0,32,21,0,0,0,0],"price":6890,"wtypeId":10},
+{"id":36,"animationId":0,"description":"","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":0,"name":"","note":"","params":[0,0,0,0,0,0,0,0],"price":0,"wtypeId":0},
+{"id":37,"animationId":11,"description":"[Bow] A short bow made for hunting.","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":102,"name":"Short Bow","note":"","params":[0,0,7,0,0,0,0,0],"price":310,"wtypeId":7},
+{"id":38,"animationId":11,"description":"[Bow] A long bow for battle with superior power.","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":102,"name":"Long Bow","note":"","params":[0,0,12,0,0,0,0,0],"price":780,"wtypeId":7},
+{"id":39,"animationId":11,"description":"[Bow] A crossbow that shoots arrows with powerful\nsprings.","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":103,"name":"Crossbow","note":"","params":[0,0,18,0,0,0,0,0],"price":1860,"wtypeId":8},
+{"id":40,"animationId":11,"description":"[Bow] A crossbow that shoots mithril arrows with\npowerful springs.","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":103,"name":"Mithril Bow","note":"","params":[0,0,23,0,0,0,0,0],"price":3260,"wtypeId":8},
+{"id":41,"animationId":11,"description":"[Bow] A long bow for battle made with dragon’s\nwhiskers.","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":102,"name":"Dragon Bow","note":"","params":[0,0,28,0,0,0,0,0],"price":5980,"wtypeId":7},
+{"id":42,"animationId":0,"description":"","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":0,"name":"","note":"","params":[0,0,0,0,0,0,0,0],"price":0,"wtypeId":0},
+{"id":43,"animationId":6,"description":"[Dagger] A knife used for day-to-day tasks.","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":96,"name":"Knife","note":"","params":[0,0,5,0,0,0,0,0],"price":280,"wtypeId":1},
+{"id":44,"animationId":6,"description":"[Dagger] A short blade used in close combat.","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":96,"name":"Daggar","note":"","params":[0,0,9,0,0,0,0,0],"price":690,"wtypeId":1},
+{"id":45,"animationId":6,"description":"[Dagger] A dagger with a thicker, sturdier blade.","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":96,"name":"Machete","note":"","params":[0,0,12,0,0,0,0,0],"price":1280,"wtypeId":1},
+{"id":46,"animationId":6,"description":"[Dagger] A dagger forged with mithril.","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":96,"name":"Mithril Daggar","note":"","params":[0,0,18,0,0,0,0,0],"price":2930,"wtypeId":1},
+{"id":47,"animationId":6,"description":"[Dagger] A dagger forged from the fangs of a dragon.","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":96,"name":"Dragon Daggar","note":"","params":[0,0,23,0,0,0,0,0],"price":5820,"wtypeId":1},
+{"id":48,"animationId":0,"description":"","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":0,"name":"","note":"","params":[0,0,0,0,0,0,0,0],"price":0,"wtypeId":0},
+{"id":49,"animationId":0,"description":"","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":0,"name":"","note":"","params":[0,0,0,0,0,0,0,0],"price":0,"wtypeId":0},
+{"id":50,"animationId":0,"description":"","etypeId":1,"traits":[{"code":31,"dataId":1,"value":0},{"code":22,"dataId":0,"value":0}],"iconIndex":0,"name":"","note":"","params":[0,0,0,0,0,0,0,0],"price":0,"wtypeId":0}
+]
\ No newline at end of file
diff --git a/effects/Absorb.efkefc b/effects/Absorb.efkefc
new file mode 100644
index 0000000..5f4f422
Binary files /dev/null and b/effects/Absorb.efkefc differ
diff --git a/effects/ArrowSpecial.efkefc b/effects/ArrowSpecial.efkefc
new file mode 100644
index 0000000..17e6d32
Binary files /dev/null and b/effects/ArrowSpecial.efkefc differ
diff --git a/effects/BallsOfLight.efkefc b/effects/BallsOfLight.efkefc
new file mode 100644
index 0000000..2272fca
Binary files /dev/null and b/effects/BallsOfLight.efkefc differ
diff --git a/effects/Bind.efkefc b/effects/Bind.efkefc
new file mode 100644
index 0000000..81779eb
Binary files /dev/null and b/effects/Bind.efkefc differ
diff --git a/effects/Blind.efkefc b/effects/Blind.efkefc
new file mode 100644
index 0000000..be53c6f
Binary files /dev/null and b/effects/Blind.efkefc differ
diff --git a/effects/Bodyslam.efkefc b/effects/Bodyslam.efkefc
new file mode 100644
index 0000000..d60a405
Binary files /dev/null and b/effects/Bodyslam.efkefc differ
diff --git a/effects/Breath.efkefc b/effects/Breath.efkefc
new file mode 100644
index 0000000..151f372
Binary files /dev/null and b/effects/Breath.efkefc differ
diff --git a/effects/ClawEffect.efkefc b/effects/ClawEffect.efkefc
new file mode 100644
index 0000000..335ff9a
Binary files /dev/null and b/effects/ClawEffect.efkefc differ
diff --git a/effects/ClawFire.efkefc b/effects/ClawFire.efkefc
new file mode 100644
index 0000000..09e0ae1
Binary files /dev/null and b/effects/ClawFire.efkefc differ
diff --git a/effects/ClawIce.efkefc b/effects/ClawIce.efkefc
new file mode 100644
index 0000000..c0bea17
Binary files /dev/null and b/effects/ClawIce.efkefc differ
diff --git a/effects/ClawPhysical.efkefc b/effects/ClawPhysical.efkefc
new file mode 100644
index 0000000..742a258
Binary files /dev/null and b/effects/ClawPhysical.efkefc differ
diff --git a/effects/ClawSpecial.efkefc b/effects/ClawSpecial.efkefc
new file mode 100644
index 0000000..047e2c3
Binary files /dev/null and b/effects/ClawSpecial.efkefc differ
diff --git a/effects/ClawThunder.efkefc b/effects/ClawThunder.efkefc
new file mode 100644
index 0000000..47efe73
Binary files /dev/null and b/effects/ClawThunder.efkefc differ
diff --git a/effects/Confusion.efkefc b/effects/Confusion.efkefc
new file mode 100644
index 0000000..28f5202
Binary files /dev/null and b/effects/Confusion.efkefc differ
diff --git a/effects/CureAll1.efkefc b/effects/CureAll1.efkefc
new file mode 100644
index 0000000..a0a5de6
Binary files /dev/null and b/effects/CureAll1.efkefc differ
diff --git a/effects/CureAll2.efkefc b/effects/CureAll2.efkefc
new file mode 100644
index 0000000..939db66
Binary files /dev/null and b/effects/CureAll2.efkefc differ
diff --git a/effects/CureOne1.efkefc b/effects/CureOne1.efkefc
new file mode 100644
index 0000000..7f10d20
Binary files /dev/null and b/effects/CureOne1.efkefc differ
diff --git a/effects/CureOne2.efkefc b/effects/CureOne2.efkefc
new file mode 100644
index 0000000..48a08d3
Binary files /dev/null and b/effects/CureOne2.efkefc differ
diff --git a/effects/DarknessAll1.efkefc b/effects/DarknessAll1.efkefc
new file mode 100644
index 0000000..b12426d
Binary files /dev/null and b/effects/DarknessAll1.efkefc differ
diff --git a/effects/DarknessAll2.efkefc b/effects/DarknessAll2.efkefc
new file mode 100644
index 0000000..f4c4959
Binary files /dev/null and b/effects/DarknessAll2.efkefc differ
diff --git a/effects/DarknessAll3.efkefc b/effects/DarknessAll3.efkefc
new file mode 100644
index 0000000..d6ebfc3
Binary files /dev/null and b/effects/DarknessAll3.efkefc differ
diff --git a/effects/DarknessOne1.efkefc b/effects/DarknessOne1.efkefc
new file mode 100644
index 0000000..164f849
Binary files /dev/null and b/effects/DarknessOne1.efkefc differ
diff --git a/effects/DarknessOne2.efkefc b/effects/DarknessOne2.efkefc
new file mode 100644
index 0000000..758f67e
Binary files /dev/null and b/effects/DarknessOne2.efkefc differ
diff --git a/effects/Death.efkefc b/effects/Death.efkefc
new file mode 100644
index 0000000..bef67dc
Binary files /dev/null and b/effects/Death.efkefc differ
diff --git a/effects/EarthAll1.efkefc b/effects/EarthAll1.efkefc
new file mode 100644
index 0000000..18a55fd
Binary files /dev/null and b/effects/EarthAll1.efkefc differ
diff --git a/effects/EarthAll2.efkefc b/effects/EarthAll2.efkefc
new file mode 100644
index 0000000..2fc34b5
Binary files /dev/null and b/effects/EarthAll2.efkefc differ
diff --git a/effects/EarthAll3.efkefc b/effects/EarthAll3.efkefc
new file mode 100644
index 0000000..f845a24
Binary files /dev/null and b/effects/EarthAll3.efkefc differ
diff --git a/effects/EarthOne1.efkefc b/effects/EarthOne1.efkefc
new file mode 100644
index 0000000..07c52d6
Binary files /dev/null and b/effects/EarthOne1.efkefc differ
diff --git a/effects/EarthOne2.efkefc b/effects/EarthOne2.efkefc
new file mode 100644
index 0000000..4bde62d
Binary files /dev/null and b/effects/EarthOne2.efkefc differ
diff --git a/effects/FireAll1.efkefc b/effects/FireAll1.efkefc
new file mode 100644
index 0000000..faa5a1d
Binary files /dev/null and b/effects/FireAll1.efkefc differ
diff --git a/effects/FireAll2.efkefc b/effects/FireAll2.efkefc
new file mode 100644
index 0000000..2d3baa7
Binary files /dev/null and b/effects/FireAll2.efkefc differ
diff --git a/effects/FireAll3.efkefc b/effects/FireAll3.efkefc
new file mode 100644
index 0000000..f9f7452
Binary files /dev/null and b/effects/FireAll3.efkefc differ
diff --git a/effects/FireOne1.efkefc b/effects/FireOne1.efkefc
new file mode 100644
index 0000000..a180465
Binary files /dev/null and b/effects/FireOne1.efkefc differ
diff --git a/effects/FireOne2.efkefc b/effects/FireOne2.efkefc
new file mode 100644
index 0000000..869050e
Binary files /dev/null and b/effects/FireOne2.efkefc differ
diff --git a/effects/Flash.efkefc b/effects/Flash.efkefc
new file mode 100644
index 0000000..4cd98b6
Binary files /dev/null and b/effects/Flash.efkefc differ
diff --git a/effects/Fog.efkefc b/effects/Fog.efkefc
new file mode 100644
index 0000000..1b72fce
Binary files /dev/null and b/effects/Fog.efkefc differ
diff --git a/effects/GeneralSpecial1.efkefc b/effects/GeneralSpecial1.efkefc
new file mode 100644
index 0000000..993e9a8
Binary files /dev/null and b/effects/GeneralSpecial1.efkefc differ
diff --git a/effects/GeneralSpecial2.efkefc b/effects/GeneralSpecial2.efkefc
new file mode 100644
index 0000000..bf91f25
Binary files /dev/null and b/effects/GeneralSpecial2.efkefc differ
diff --git a/effects/HealAll1.efkefc b/effects/HealAll1.efkefc
new file mode 100644
index 0000000..787ebfd
Binary files /dev/null and b/effects/HealAll1.efkefc differ
diff --git a/effects/HealAll2.efkefc b/effects/HealAll2.efkefc
new file mode 100644
index 0000000..191a93a
Binary files /dev/null and b/effects/HealAll2.efkefc differ
diff --git a/effects/HealOne1.efkefc b/effects/HealOne1.efkefc
new file mode 100644
index 0000000..8fcd3ca
Binary files /dev/null and b/effects/HealOne1.efkefc differ
diff --git a/effects/HealOne2.efkefc b/effects/HealOne2.efkefc
new file mode 100644
index 0000000..e8e4f8e
Binary files /dev/null and b/effects/HealOne2.efkefc differ
diff --git a/effects/HitEffect.efkefc b/effects/HitEffect.efkefc
new file mode 100644
index 0000000..e2720f2
Binary files /dev/null and b/effects/HitEffect.efkefc differ
diff --git a/effects/HitFire.efkefc b/effects/HitFire.efkefc
new file mode 100644
index 0000000..b7fcc48
Binary files /dev/null and b/effects/HitFire.efkefc differ
diff --git a/effects/HitIce.efkefc b/effects/HitIce.efkefc
new file mode 100644
index 0000000..756579e
Binary files /dev/null and b/effects/HitIce.efkefc differ
diff --git a/effects/HitPhysical.efkefc b/effects/HitPhysical.efkefc
new file mode 100644
index 0000000..a9f5894
Binary files /dev/null and b/effects/HitPhysical.efkefc differ
diff --git a/effects/HitSpecial1.efkefc b/effects/HitSpecial1.efkefc
new file mode 100644
index 0000000..3e4c793
Binary files /dev/null and b/effects/HitSpecial1.efkefc differ
diff --git a/effects/HitSpecial2.efkefc b/effects/HitSpecial2.efkefc
new file mode 100644
index 0000000..dcf08ec
Binary files /dev/null and b/effects/HitSpecial2.efkefc differ
diff --git a/effects/HitThunder.efkefc b/effects/HitThunder.efkefc
new file mode 100644
index 0000000..dde1824
Binary files /dev/null and b/effects/HitThunder.efkefc differ
diff --git a/effects/IceAll1.efkefc b/effects/IceAll1.efkefc
new file mode 100644
index 0000000..5f81995
Binary files /dev/null and b/effects/IceAll1.efkefc differ
diff --git a/effects/IceAll2.efkefc b/effects/IceAll2.efkefc
new file mode 100644
index 0000000..d804739
Binary files /dev/null and b/effects/IceAll2.efkefc differ
diff --git a/effects/IceAll3.efkefc b/effects/IceAll3.efkefc
new file mode 100644
index 0000000..77cbeff
Binary files /dev/null and b/effects/IceAll3.efkefc differ
diff --git a/effects/IceOne1.efkefc b/effects/IceOne1.efkefc
new file mode 100644
index 0000000..b22e455
Binary files /dev/null and b/effects/IceOne1.efkefc differ
diff --git a/effects/IceOne2.efkefc b/effects/IceOne2.efkefc
new file mode 100644
index 0000000..ed39ee3
Binary files /dev/null and b/effects/IceOne2.efkefc differ
diff --git a/effects/LaserAll.efkefc b/effects/LaserAll.efkefc
new file mode 100644
index 0000000..760e11a
Binary files /dev/null and b/effects/LaserAll.efkefc differ
diff --git a/effects/LaserOne.efkefc b/effects/LaserOne.efkefc
new file mode 100644
index 0000000..a46c437
Binary files /dev/null and b/effects/LaserOne.efkefc differ
diff --git a/effects/LightAll1.efkefc b/effects/LightAll1.efkefc
new file mode 100644
index 0000000..81c6908
Binary files /dev/null and b/effects/LightAll1.efkefc differ
diff --git a/effects/LightAll2.efkefc b/effects/LightAll2.efkefc
new file mode 100644
index 0000000..648d2fb
Binary files /dev/null and b/effects/LightAll2.efkefc differ
diff --git a/effects/LightAll3.efkefc b/effects/LightAll3.efkefc
new file mode 100644
index 0000000..c3de99a
Binary files /dev/null and b/effects/LightAll3.efkefc differ
diff --git a/effects/LightOne1.efkefc b/effects/LightOne1.efkefc
new file mode 100644
index 0000000..9c35111
Binary files /dev/null and b/effects/LightOne1.efkefc differ
diff --git a/effects/LightOne2.efkefc b/effects/LightOne2.efkefc
new file mode 100644
index 0000000..51f9e3f
Binary files /dev/null and b/effects/LightOne2.efkefc differ
diff --git a/effects/LightPillar1.efkefc b/effects/LightPillar1.efkefc
new file mode 100644
index 0000000..673fb37
Binary files /dev/null and b/effects/LightPillar1.efkefc differ
diff --git a/effects/LightPillar2.efkefc b/effects/LightPillar2.efkefc
new file mode 100644
index 0000000..4ad481d
Binary files /dev/null and b/effects/LightPillar2.efkefc differ
diff --git a/effects/Model/Ball.efkmodel b/effects/Model/Ball.efkmodel
new file mode 100644
index 0000000..47ee1a4
Binary files /dev/null and b/effects/Model/Ball.efkmodel differ
diff --git a/effects/Model/NightHand1.efkmodel b/effects/Model/NightHand1.efkmodel
new file mode 100644
index 0000000..55d71aa
Binary files /dev/null and b/effects/Model/NightHand1.efkmodel differ
diff --git a/effects/Model/NightHand2.efkmodel b/effects/Model/NightHand2.efkmodel
new file mode 100644
index 0000000..7b2eb96
Binary files /dev/null and b/effects/Model/NightHand2.efkmodel differ
diff --git a/effects/Model/NightHand3.efkmodel b/effects/Model/NightHand3.efkmodel
new file mode 100644
index 0000000..f65e9df
Binary files /dev/null and b/effects/Model/NightHand3.efkmodel differ
diff --git a/effects/Model/NightHand4.efkmodel b/effects/Model/NightHand4.efkmodel
new file mode 100644
index 0000000..868f14e
Binary files /dev/null and b/effects/Model/NightHand4.efkmodel differ
diff --git a/effects/Model/Shield.efkmodel b/effects/Model/Shield.efkmodel
new file mode 100644
index 0000000..3ee998e
Binary files /dev/null and b/effects/Model/Shield.efkmodel differ
diff --git a/effects/Model/Skull.efkmodel b/effects/Model/Skull.efkmodel
new file mode 100644
index 0000000..6734252
Binary files /dev/null and b/effects/Model/Skull.efkmodel differ
diff --git a/effects/NeutralAll1.efkefc b/effects/NeutralAll1.efkefc
new file mode 100644
index 0000000..1101f30
Binary files /dev/null and b/effects/NeutralAll1.efkefc differ
diff --git a/effects/NeutralAll2.efkefc b/effects/NeutralAll2.efkefc
new file mode 100644
index 0000000..b2d1564
Binary files /dev/null and b/effects/NeutralAll2.efkefc differ
diff --git a/effects/NeutralAll3.efkefc b/effects/NeutralAll3.efkefc
new file mode 100644
index 0000000..dc2e8e6
Binary files /dev/null and b/effects/NeutralAll3.efkefc differ
diff --git a/effects/NeutralOne1.efkefc b/effects/NeutralOne1.efkefc
new file mode 100644
index 0000000..b777114
Binary files /dev/null and b/effects/NeutralOne1.efkefc differ
diff --git a/effects/NeutralOne2.efkefc b/effects/NeutralOne2.efkefc
new file mode 100644
index 0000000..e48aa70
Binary files /dev/null and b/effects/NeutralOne2.efkefc differ
diff --git a/effects/Paralyze.efkefc b/effects/Paralyze.efkefc
new file mode 100644
index 0000000..3d6a99a
Binary files /dev/null and b/effects/Paralyze.efkefc differ
diff --git a/effects/PierceEffect.efkefc b/effects/PierceEffect.efkefc
new file mode 100644
index 0000000..226bb0c
Binary files /dev/null and b/effects/PierceEffect.efkefc differ
diff --git a/effects/PierceFire.efkefc b/effects/PierceFire.efkefc
new file mode 100644
index 0000000..55ab5ed
Binary files /dev/null and b/effects/PierceFire.efkefc differ
diff --git a/effects/PierceIce.efkefc b/effects/PierceIce.efkefc
new file mode 100644
index 0000000..307e59e
Binary files /dev/null and b/effects/PierceIce.efkefc differ
diff --git a/effects/PiercePhysical.efkefc b/effects/PiercePhysical.efkefc
new file mode 100644
index 0000000..a06249f
Binary files /dev/null and b/effects/PiercePhysical.efkefc differ
diff --git a/effects/PierceSpecial1.efkefc b/effects/PierceSpecial1.efkefc
new file mode 100644
index 0000000..35d8979
Binary files /dev/null and b/effects/PierceSpecial1.efkefc differ
diff --git a/effects/PierceSpecial2.efkefc b/effects/PierceSpecial2.efkefc
new file mode 100644
index 0000000..446d6ed
Binary files /dev/null and b/effects/PierceSpecial2.efkefc differ
diff --git a/effects/PierceThunder.efkefc b/effects/PierceThunder.efkefc
new file mode 100644
index 0000000..208579f
Binary files /dev/null and b/effects/PierceThunder.efkefc differ
diff --git a/effects/Poison.efkefc b/effects/Poison.efkefc
new file mode 100644
index 0000000..1530632
Binary files /dev/null and b/effects/Poison.efkefc differ
diff --git a/effects/Pollen.efkefc b/effects/Pollen.efkefc
new file mode 100644
index 0000000..9dded37
Binary files /dev/null and b/effects/Pollen.efkefc differ
diff --git a/effects/Powerdown1.efkefc b/effects/Powerdown1.efkefc
new file mode 100644
index 0000000..9abb81b
Binary files /dev/null and b/effects/Powerdown1.efkefc differ
diff --git a/effects/Powerdown2.efkefc b/effects/Powerdown2.efkefc
new file mode 100644
index 0000000..56dd60d
Binary files /dev/null and b/effects/Powerdown2.efkefc differ
diff --git a/effects/Powerdown3.efkefc b/effects/Powerdown3.efkefc
new file mode 100644
index 0000000..82ef457
Binary files /dev/null and b/effects/Powerdown3.efkefc differ
diff --git a/effects/Powerup1.efkefc b/effects/Powerup1.efkefc
new file mode 100644
index 0000000..5de4d3e
Binary files /dev/null and b/effects/Powerup1.efkefc differ
diff --git a/effects/Powerup2.efkefc b/effects/Powerup2.efkefc
new file mode 100644
index 0000000..f642e21
Binary files /dev/null and b/effects/Powerup2.efkefc differ
diff --git a/effects/Powerup3.efkefc b/effects/Powerup3.efkefc
new file mode 100644
index 0000000..c82dfc0
Binary files /dev/null and b/effects/Powerup3.efkefc differ
diff --git a/effects/Radiation.efkefc b/effects/Radiation.efkefc
new file mode 100644
index 0000000..8d81c41
Binary files /dev/null and b/effects/Radiation.efkefc differ
diff --git a/effects/Revive1.efkefc b/effects/Revive1.efkefc
new file mode 100644
index 0000000..57605e0
Binary files /dev/null and b/effects/Revive1.efkefc differ
diff --git a/effects/Revive2.efkefc b/effects/Revive2.efkefc
new file mode 100644
index 0000000..733d3d7
Binary files /dev/null and b/effects/Revive2.efkefc differ
diff --git a/effects/ShootAll.efkefc b/effects/ShootAll.efkefc
new file mode 100644
index 0000000..027459f
Binary files /dev/null and b/effects/ShootAll.efkefc differ
diff --git a/effects/ShootBarrage.efkefc b/effects/ShootBarrage.efkefc
new file mode 100644
index 0000000..dfe8f42
Binary files /dev/null and b/effects/ShootBarrage.efkefc differ
diff --git a/effects/ShootNormal.efkefc b/effects/ShootNormal.efkefc
new file mode 100644
index 0000000..69488f8
Binary files /dev/null and b/effects/ShootNormal.efkefc differ
diff --git a/effects/ShootSpecial.efkefc b/effects/ShootSpecial.efkefc
new file mode 100644
index 0000000..576be40
Binary files /dev/null and b/effects/ShootSpecial.efkefc differ
diff --git a/effects/Shout.efkefc b/effects/Shout.efkefc
new file mode 100644
index 0000000..d3b7dae
Binary files /dev/null and b/effects/Shout.efkefc differ
diff --git a/effects/Silence.efkefc b/effects/Silence.efkefc
new file mode 100644
index 0000000..f516864
Binary files /dev/null and b/effects/Silence.efkefc differ
diff --git a/effects/SlashEffect.efkefc b/effects/SlashEffect.efkefc
new file mode 100644
index 0000000..1698067
Binary files /dev/null and b/effects/SlashEffect.efkefc differ
diff --git a/effects/SlashFire.efkefc b/effects/SlashFire.efkefc
new file mode 100644
index 0000000..d3890dc
Binary files /dev/null and b/effects/SlashFire.efkefc differ
diff --git a/effects/SlashIce.efkefc b/effects/SlashIce.efkefc
new file mode 100644
index 0000000..68aea72
Binary files /dev/null and b/effects/SlashIce.efkefc differ
diff --git a/effects/SlashPhysical.efkefc b/effects/SlashPhysical.efkefc
new file mode 100644
index 0000000..de4d3ff
Binary files /dev/null and b/effects/SlashPhysical.efkefc differ
diff --git a/effects/SlashSpecial1.efkefc b/effects/SlashSpecial1.efkefc
new file mode 100644
index 0000000..81a8e5a
Binary files /dev/null and b/effects/SlashSpecial1.efkefc differ
diff --git a/effects/SlashSpecial2.efkefc b/effects/SlashSpecial2.efkefc
new file mode 100644
index 0000000..0fbcb3a
Binary files /dev/null and b/effects/SlashSpecial2.efkefc differ
diff --git a/effects/SlashSpecial3.efkefc b/effects/SlashSpecial3.efkefc
new file mode 100644
index 0000000..7e8cf17
Binary files /dev/null and b/effects/SlashSpecial3.efkefc differ
diff --git a/effects/SlashThunder.efkefc b/effects/SlashThunder.efkefc
new file mode 100644
index 0000000..8bff924
Binary files /dev/null and b/effects/SlashThunder.efkefc differ
diff --git a/effects/Sleep.efkefc b/effects/Sleep.efkefc
new file mode 100644
index 0000000..fbc030e
Binary files /dev/null and b/effects/Sleep.efkefc differ
diff --git a/effects/Song.efkefc b/effects/Song.efkefc
new file mode 100644
index 0000000..865406b
Binary files /dev/null and b/effects/Song.efkefc differ
diff --git a/effects/SonicWave.efkefc b/effects/SonicWave.efkefc
new file mode 100644
index 0000000..21762fc
Binary files /dev/null and b/effects/SonicWave.efkefc differ
diff --git a/effects/Sweep.efkefc b/effects/Sweep.efkefc
new file mode 100644
index 0000000..37df562
Binary files /dev/null and b/effects/Sweep.efkefc differ
diff --git a/effects/Texture/Arrow.png b/effects/Texture/Arrow.png
new file mode 100644
index 0000000..31b027b
Binary files /dev/null and b/effects/Texture/Arrow.png differ
diff --git a/effects/Texture/Circle.png b/effects/Texture/Circle.png
new file mode 100644
index 0000000..d0ee566
Binary files /dev/null and b/effects/Texture/Circle.png differ
diff --git a/effects/Texture/Feather.png b/effects/Texture/Feather.png
new file mode 100644
index 0000000..86a43aa
Binary files /dev/null and b/effects/Texture/Feather.png differ
diff --git a/effects/Texture/Flower.png b/effects/Texture/Flower.png
new file mode 100644
index 0000000..78150e2
Binary files /dev/null and b/effects/Texture/Flower.png differ
diff --git a/effects/Texture/Fog.png b/effects/Texture/Fog.png
new file mode 100644
index 0000000..6cbae74
Binary files /dev/null and b/effects/Texture/Fog.png differ
diff --git a/effects/Texture/HexCircle.png b/effects/Texture/HexCircle.png
new file mode 100644
index 0000000..50393ae
Binary files /dev/null and b/effects/Texture/HexCircle.png differ
diff --git a/effects/Texture/IceRock.png b/effects/Texture/IceRock.png
new file mode 100644
index 0000000..bf949c4
Binary files /dev/null and b/effects/Texture/IceRock.png differ
diff --git a/effects/Texture/LightRing.png b/effects/Texture/LightRing.png
new file mode 100644
index 0000000..6e43845
Binary files /dev/null and b/effects/Texture/LightRing.png differ
diff --git a/effects/Texture/Line1.png b/effects/Texture/Line1.png
new file mode 100644
index 0000000..9f2dca0
Binary files /dev/null and b/effects/Texture/Line1.png differ
diff --git a/effects/Texture/Line2.png b/effects/Texture/Line2.png
new file mode 100644
index 0000000..ec90cc2
Binary files /dev/null and b/effects/Texture/Line2.png differ
diff --git a/effects/Texture/Monster1.png b/effects/Texture/Monster1.png
new file mode 100644
index 0000000..338cbcd
Binary files /dev/null and b/effects/Texture/Monster1.png differ
diff --git a/effects/Texture/Monster2.png b/effects/Texture/Monster2.png
new file mode 100644
index 0000000..6cef345
Binary files /dev/null and b/effects/Texture/Monster2.png differ
diff --git a/effects/Texture/Monster3.png b/effects/Texture/Monster3.png
new file mode 100644
index 0000000..cd632f5
Binary files /dev/null and b/effects/Texture/Monster3.png differ
diff --git a/effects/Texture/Note1.png b/effects/Texture/Note1.png
new file mode 100644
index 0000000..0ed1514
Binary files /dev/null and b/effects/Texture/Note1.png differ
diff --git a/effects/Texture/Note2.png b/effects/Texture/Note2.png
new file mode 100644
index 0000000..ac245f1
Binary files /dev/null and b/effects/Texture/Note2.png differ
diff --git a/effects/Texture/Note3.png b/effects/Texture/Note3.png
new file mode 100644
index 0000000..8b3ddbe
Binary files /dev/null and b/effects/Texture/Note3.png differ
diff --git a/effects/Texture/Note4.png b/effects/Texture/Note4.png
new file mode 100644
index 0000000..bb188ab
Binary files /dev/null and b/effects/Texture/Note4.png differ
diff --git a/effects/Texture/Particle100.png b/effects/Texture/Particle100.png
new file mode 100644
index 0000000..947fd3f
Binary files /dev/null and b/effects/Texture/Particle100.png differ
diff --git a/effects/Texture/ParticleAlpha.png b/effects/Texture/ParticleAlpha.png
new file mode 100644
index 0000000..b4fe9bc
Binary files /dev/null and b/effects/Texture/ParticleAlpha.png differ
diff --git a/effects/Texture/Period.png b/effects/Texture/Period.png
new file mode 100644
index 0000000..a5e29fe
Binary files /dev/null and b/effects/Texture/Period.png differ
diff --git a/effects/Texture/Rhombus1.png b/effects/Texture/Rhombus1.png
new file mode 100644
index 0000000..f5278f6
Binary files /dev/null and b/effects/Texture/Rhombus1.png differ
diff --git a/effects/Texture/Rhombus2.png b/effects/Texture/Rhombus2.png
new file mode 100644
index 0000000..78ee5f0
Binary files /dev/null and b/effects/Texture/Rhombus2.png differ
diff --git a/effects/Texture/Ring.png b/effects/Texture/Ring.png
new file mode 100644
index 0000000..3128681
Binary files /dev/null and b/effects/Texture/Ring.png differ
diff --git a/effects/Texture/Rock.png b/effects/Texture/Rock.png
new file mode 100644
index 0000000..3a872e7
Binary files /dev/null and b/effects/Texture/Rock.png differ
diff --git a/effects/Texture/Shield.png b/effects/Texture/Shield.png
new file mode 100644
index 0000000..3199cd5
Binary files /dev/null and b/effects/Texture/Shield.png differ
diff --git a/effects/Texture/ShockWave1.png b/effects/Texture/ShockWave1.png
new file mode 100644
index 0000000..37a533d
Binary files /dev/null and b/effects/Texture/ShockWave1.png differ
diff --git a/effects/Texture/ShockWave2.png b/effects/Texture/ShockWave2.png
new file mode 100644
index 0000000..07f711c
Binary files /dev/null and b/effects/Texture/ShockWave2.png differ
diff --git a/effects/Texture/ShockWaveRing1.png b/effects/Texture/ShockWaveRing1.png
new file mode 100644
index 0000000..01fbf4e
Binary files /dev/null and b/effects/Texture/ShockWaveRing1.png differ
diff --git a/effects/Texture/ShockWaveRing2.png b/effects/Texture/ShockWaveRing2.png
new file mode 100644
index 0000000..4c98ec9
Binary files /dev/null and b/effects/Texture/ShockWaveRing2.png differ
diff --git a/effects/Texture/Slash1.png b/effects/Texture/Slash1.png
new file mode 100644
index 0000000..721f68a
Binary files /dev/null and b/effects/Texture/Slash1.png differ
diff --git a/effects/Texture/Slash2.png b/effects/Texture/Slash2.png
new file mode 100644
index 0000000..c1d55a9
Binary files /dev/null and b/effects/Texture/Slash2.png differ
diff --git a/effects/Texture/Snow.png b/effects/Texture/Snow.png
new file mode 100644
index 0000000..1d019b9
Binary files /dev/null and b/effects/Texture/Snow.png differ
diff --git a/effects/Texture/Special3_1.png b/effects/Texture/Special3_1.png
new file mode 100644
index 0000000..66caa0d
Binary files /dev/null and b/effects/Texture/Special3_1.png differ
diff --git a/effects/Texture/Special3_2.png b/effects/Texture/Special3_2.png
new file mode 100644
index 0000000..0f95c4e
Binary files /dev/null and b/effects/Texture/Special3_2.png differ
diff --git a/effects/Texture/Special3_3.png b/effects/Texture/Special3_3.png
new file mode 100644
index 0000000..aa6de41
Binary files /dev/null and b/effects/Texture/Special3_3.png differ
diff --git a/effects/Texture/Special3_4.png b/effects/Texture/Special3_4.png
new file mode 100644
index 0000000..60f7e51
Binary files /dev/null and b/effects/Texture/Special3_4.png differ
diff --git a/effects/Texture/Sphere.png b/effects/Texture/Sphere.png
new file mode 100644
index 0000000..bdaa6e0
Binary files /dev/null and b/effects/Texture/Sphere.png differ
diff --git a/effects/Texture/Spin.png b/effects/Texture/Spin.png
new file mode 100644
index 0000000..1bc0a5d
Binary files /dev/null and b/effects/Texture/Spin.png differ
diff --git a/effects/Texture/Star.png b/effects/Texture/Star.png
new file mode 100644
index 0000000..99f125d
Binary files /dev/null and b/effects/Texture/Star.png differ
diff --git a/effects/Texture/Star2.png b/effects/Texture/Star2.png
new file mode 100644
index 0000000..6fc6bd4
Binary files /dev/null and b/effects/Texture/Star2.png differ
diff --git a/effects/Texture/Thorns.png b/effects/Texture/Thorns.png
new file mode 100644
index 0000000..44f6a32
Binary files /dev/null and b/effects/Texture/Thorns.png differ
diff --git a/effects/Texture/ThunderC.png b/effects/Texture/ThunderC.png
new file mode 100644
index 0000000..a733b8c
Binary files /dev/null and b/effects/Texture/ThunderC.png differ
diff --git a/effects/Texture/ThunderH.png b/effects/Texture/ThunderH.png
new file mode 100644
index 0000000..833ea4f
Binary files /dev/null and b/effects/Texture/ThunderH.png differ
diff --git a/effects/Texture/ThunderV.png b/effects/Texture/ThunderV.png
new file mode 100644
index 0000000..0d11d6b
Binary files /dev/null and b/effects/Texture/ThunderV.png differ
diff --git a/effects/Texture/Wind.png b/effects/Texture/Wind.png
new file mode 100644
index 0000000..4b8bb5b
Binary files /dev/null and b/effects/Texture/Wind.png differ
diff --git a/effects/Texture/WindMark.png b/effects/Texture/WindMark.png
new file mode 100644
index 0000000..274a1d1
Binary files /dev/null and b/effects/Texture/WindMark.png differ
diff --git a/effects/Texture/WingL.png b/effects/Texture/WingL.png
new file mode 100644
index 0000000..9f16580
Binary files /dev/null and b/effects/Texture/WingL.png differ
diff --git a/effects/Texture/WingR.png b/effects/Texture/WingR.png
new file mode 100644
index 0000000..7794951
Binary files /dev/null and b/effects/Texture/WingR.png differ
diff --git a/effects/ThunderAll1.efkefc b/effects/ThunderAll1.efkefc
new file mode 100644
index 0000000..b8c002a
Binary files /dev/null and b/effects/ThunderAll1.efkefc differ
diff --git a/effects/ThunderAll2.efkefc b/effects/ThunderAll2.efkefc
new file mode 100644
index 0000000..87e84d5
Binary files /dev/null and b/effects/ThunderAll2.efkefc differ
diff --git a/effects/ThunderAll3.efkefc b/effects/ThunderAll3.efkefc
new file mode 100644
index 0000000..373fc14
Binary files /dev/null and b/effects/ThunderAll3.efkefc differ
diff --git a/effects/ThunderOne1.efkefc b/effects/ThunderOne1.efkefc
new file mode 100644
index 0000000..a6b5453
Binary files /dev/null and b/effects/ThunderOne1.efkefc differ
diff --git a/effects/ThunderOne2.efkefc b/effects/ThunderOne2.efkefc
new file mode 100644
index 0000000..6f33e23
Binary files /dev/null and b/effects/ThunderOne2.efkefc differ
diff --git a/effects/WaterAll1.efkefc b/effects/WaterAll1.efkefc
new file mode 100644
index 0000000..75b7cbd
Binary files /dev/null and b/effects/WaterAll1.efkefc differ
diff --git a/effects/WaterAll2.efkefc b/effects/WaterAll2.efkefc
new file mode 100644
index 0000000..e9b0a05
Binary files /dev/null and b/effects/WaterAll2.efkefc differ
diff --git a/effects/WaterAll3.efkefc b/effects/WaterAll3.efkefc
new file mode 100644
index 0000000..f750eaf
Binary files /dev/null and b/effects/WaterAll3.efkefc differ
diff --git a/effects/WaterOne1.efkefc b/effects/WaterOne1.efkefc
new file mode 100644
index 0000000..e9962be
Binary files /dev/null and b/effects/WaterOne1.efkefc differ
diff --git a/effects/WaterOne2.efkefc b/effects/WaterOne2.efkefc
new file mode 100644
index 0000000..6d33924
Binary files /dev/null and b/effects/WaterOne2.efkefc differ
diff --git a/effects/WindAll1.efkefc b/effects/WindAll1.efkefc
new file mode 100644
index 0000000..a4a37cc
Binary files /dev/null and b/effects/WindAll1.efkefc differ
diff --git a/effects/WindAll2.efkefc b/effects/WindAll2.efkefc
new file mode 100644
index 0000000..c309ca8
Binary files /dev/null and b/effects/WindAll2.efkefc differ
diff --git a/effects/WindAll3.efkefc b/effects/WindAll3.efkefc
new file mode 100644
index 0000000..121e214
Binary files /dev/null and b/effects/WindAll3.efkefc differ
diff --git a/effects/WindOne1.efkefc b/effects/WindOne1.efkefc
new file mode 100644
index 0000000..0c41814
Binary files /dev/null and b/effects/WindOne1.efkefc differ
diff --git a/effects/WindOne2.efkefc b/effects/WindOne2.efkefc
new file mode 100644
index 0000000..88a9f84
Binary files /dev/null and b/effects/WindOne2.efkefc differ
diff --git a/fonts/mplus-1m-regular.woff b/fonts/mplus-1m-regular.woff
new file mode 100644
index 0000000..5c7fcc0
Binary files /dev/null and b/fonts/mplus-1m-regular.woff differ
diff --git a/fonts/mplus-2p-bold-sub.woff b/fonts/mplus-2p-bold-sub.woff
new file mode 100644
index 0000000..1f5b7da
Binary files /dev/null and b/fonts/mplus-2p-bold-sub.woff differ
diff --git a/game.rmmzproject b/game.rmmzproject
new file mode 100644
index 0000000..4567ea1
--- /dev/null
+++ b/game.rmmzproject
@@ -0,0 +1 @@
+RPGMZ 1.8.1
\ No newline at end of file
diff --git a/icon/icon.png b/icon/icon.png
new file mode 100644
index 0000000..57f74a7
Binary files /dev/null and b/icon/icon.png differ
diff --git a/img/battlebacks1/Castle1.png b/img/battlebacks1/Castle1.png
new file mode 100644
index 0000000..c4be94f
Binary files /dev/null and b/img/battlebacks1/Castle1.png differ
diff --git a/img/battlebacks1/Castle2.png b/img/battlebacks1/Castle2.png
new file mode 100644
index 0000000..b82674b
Binary files /dev/null and b/img/battlebacks1/Castle2.png differ
diff --git a/img/battlebacks1/Castle3.png b/img/battlebacks1/Castle3.png
new file mode 100644
index 0000000..f37e727
Binary files /dev/null and b/img/battlebacks1/Castle3.png differ
diff --git a/img/battlebacks1/Clouds.png b/img/battlebacks1/Clouds.png
new file mode 100644
index 0000000..6434345
Binary files /dev/null and b/img/battlebacks1/Clouds.png differ
diff --git a/img/battlebacks1/Cobblestones1.png b/img/battlebacks1/Cobblestones1.png
new file mode 100644
index 0000000..4100d46
Binary files /dev/null and b/img/battlebacks1/Cobblestones1.png differ
diff --git a/img/battlebacks1/Cobblestones2.png b/img/battlebacks1/Cobblestones2.png
new file mode 100644
index 0000000..836fe88
Binary files /dev/null and b/img/battlebacks1/Cobblestones2.png differ
diff --git a/img/battlebacks1/Cobblestones3.png b/img/battlebacks1/Cobblestones3.png
new file mode 100644
index 0000000..0c37c62
Binary files /dev/null and b/img/battlebacks1/Cobblestones3.png differ
diff --git a/img/battlebacks1/Cobblestones4.png b/img/battlebacks1/Cobblestones4.png
new file mode 100644
index 0000000..807563a
Binary files /dev/null and b/img/battlebacks1/Cobblestones4.png differ
diff --git a/img/battlebacks1/Cobblestones5.png b/img/battlebacks1/Cobblestones5.png
new file mode 100644
index 0000000..8f35a3a
Binary files /dev/null and b/img/battlebacks1/Cobblestones5.png differ
diff --git a/img/battlebacks1/Colosseum.png b/img/battlebacks1/Colosseum.png
new file mode 100644
index 0000000..d2c42cb
Binary files /dev/null and b/img/battlebacks1/Colosseum.png differ
diff --git a/img/battlebacks1/Crystal.png b/img/battlebacks1/Crystal.png
new file mode 100644
index 0000000..2785504
Binary files /dev/null and b/img/battlebacks1/Crystal.png differ
diff --git a/img/battlebacks1/Cyberspace.png b/img/battlebacks1/Cyberspace.png
new file mode 100644
index 0000000..c8fee35
Binary files /dev/null and b/img/battlebacks1/Cyberspace.png differ
diff --git a/img/battlebacks1/DecorativeTile1.png b/img/battlebacks1/DecorativeTile1.png
new file mode 100644
index 0000000..f968e38
Binary files /dev/null and b/img/battlebacks1/DecorativeTile1.png differ
diff --git a/img/battlebacks1/DecorativeTile2.png b/img/battlebacks1/DecorativeTile2.png
new file mode 100644
index 0000000..86862f1
Binary files /dev/null and b/img/battlebacks1/DecorativeTile2.png differ
diff --git a/img/battlebacks1/DemonCastle1.png b/img/battlebacks1/DemonCastle1.png
new file mode 100644
index 0000000..676ddb3
Binary files /dev/null and b/img/battlebacks1/DemonCastle1.png differ
diff --git a/img/battlebacks1/DemonCastle2.png b/img/battlebacks1/DemonCastle2.png
new file mode 100644
index 0000000..3cf9c8c
Binary files /dev/null and b/img/battlebacks1/DemonCastle2.png differ
diff --git a/img/battlebacks1/DemonCastle3.png b/img/battlebacks1/DemonCastle3.png
new file mode 100644
index 0000000..e2bf1dd
Binary files /dev/null and b/img/battlebacks1/DemonCastle3.png differ
diff --git a/img/battlebacks1/DemonicWorld.png b/img/battlebacks1/DemonicWorld.png
new file mode 100644
index 0000000..0b45d59
Binary files /dev/null and b/img/battlebacks1/DemonicWorld.png differ
diff --git a/img/battlebacks1/Desert.png b/img/battlebacks1/Desert.png
new file mode 100644
index 0000000..f76dddf
Binary files /dev/null and b/img/battlebacks1/Desert.png differ
diff --git a/img/battlebacks1/Dirt.png b/img/battlebacks1/Dirt.png
new file mode 100644
index 0000000..55b6754
Binary files /dev/null and b/img/battlebacks1/Dirt.png differ
diff --git a/img/battlebacks1/DirtCave.png b/img/battlebacks1/DirtCave.png
new file mode 100644
index 0000000..408c9db
Binary files /dev/null and b/img/battlebacks1/DirtCave.png differ
diff --git a/img/battlebacks1/DirtField.png b/img/battlebacks1/DirtField.png
new file mode 100644
index 0000000..5d3e2c5
Binary files /dev/null and b/img/battlebacks1/DirtField.png differ
diff --git a/img/battlebacks1/Fort1.png b/img/battlebacks1/Fort1.png
new file mode 100644
index 0000000..77d52a9
Binary files /dev/null and b/img/battlebacks1/Fort1.png differ
diff --git a/img/battlebacks1/Fort2.png b/img/battlebacks1/Fort2.png
new file mode 100644
index 0000000..564d29a
Binary files /dev/null and b/img/battlebacks1/Fort2.png differ
diff --git a/img/battlebacks1/GrassMaze.png b/img/battlebacks1/GrassMaze.png
new file mode 100644
index 0000000..768f4ef
Binary files /dev/null and b/img/battlebacks1/GrassMaze.png differ
diff --git a/img/battlebacks1/Grassland.png b/img/battlebacks1/Grassland.png
new file mode 100644
index 0000000..3873bf6
Binary files /dev/null and b/img/battlebacks1/Grassland.png differ
diff --git a/img/battlebacks1/Ground1.png b/img/battlebacks1/Ground1.png
new file mode 100644
index 0000000..5c27c5e
Binary files /dev/null and b/img/battlebacks1/Ground1.png differ
diff --git a/img/battlebacks1/Ground2.png b/img/battlebacks1/Ground2.png
new file mode 100644
index 0000000..ba4062b
Binary files /dev/null and b/img/battlebacks1/Ground2.png differ
diff --git a/img/battlebacks1/IceCave.png b/img/battlebacks1/IceCave.png
new file mode 100644
index 0000000..0d136ed
Binary files /dev/null and b/img/battlebacks1/IceCave.png differ
diff --git a/img/battlebacks1/IceMaze.png b/img/battlebacks1/IceMaze.png
new file mode 100644
index 0000000..4e6b616
Binary files /dev/null and b/img/battlebacks1/IceMaze.png differ
diff --git a/img/battlebacks1/Lava1.png b/img/battlebacks1/Lava1.png
new file mode 100644
index 0000000..fe82d71
Binary files /dev/null and b/img/battlebacks1/Lava1.png differ
diff --git a/img/battlebacks1/Lava2.png b/img/battlebacks1/Lava2.png
new file mode 100644
index 0000000..bd8d0ed
Binary files /dev/null and b/img/battlebacks1/Lava2.png differ
diff --git a/img/battlebacks1/LavaCave.png b/img/battlebacks1/LavaCave.png
new file mode 100644
index 0000000..03a3445
Binary files /dev/null and b/img/battlebacks1/LavaCave.png differ
diff --git a/img/battlebacks1/PoisonSwamp.png b/img/battlebacks1/PoisonSwamp.png
new file mode 100644
index 0000000..f2fbb94
Binary files /dev/null and b/img/battlebacks1/PoisonSwamp.png differ
diff --git a/img/battlebacks1/Road1.png b/img/battlebacks1/Road1.png
new file mode 100644
index 0000000..1488a16
Binary files /dev/null and b/img/battlebacks1/Road1.png differ
diff --git a/img/battlebacks1/Road2.png b/img/battlebacks1/Road2.png
new file mode 100644
index 0000000..738bc8f
Binary files /dev/null and b/img/battlebacks1/Road2.png differ
diff --git a/img/battlebacks1/Road3.png b/img/battlebacks1/Road3.png
new file mode 100644
index 0000000..d5d00c6
Binary files /dev/null and b/img/battlebacks1/Road3.png differ
diff --git a/img/battlebacks1/RockCave.png b/img/battlebacks1/RockCave.png
new file mode 100644
index 0000000..76cd548
Binary files /dev/null and b/img/battlebacks1/RockCave.png differ
diff --git a/img/battlebacks1/Sand.png b/img/battlebacks1/Sand.png
new file mode 100644
index 0000000..e78283b
Binary files /dev/null and b/img/battlebacks1/Sand.png differ
diff --git a/img/battlebacks1/Ship.png b/img/battlebacks1/Ship.png
new file mode 100644
index 0000000..9cb9e88
Binary files /dev/null and b/img/battlebacks1/Ship.png differ
diff --git a/img/battlebacks1/Smoke.png b/img/battlebacks1/Smoke.png
new file mode 100644
index 0000000..b125fc0
Binary files /dev/null and b/img/battlebacks1/Smoke.png differ
diff --git a/img/battlebacks1/Snowfield.png b/img/battlebacks1/Snowfield.png
new file mode 100644
index 0000000..823082f
Binary files /dev/null and b/img/battlebacks1/Snowfield.png differ
diff --git a/img/battlebacks1/Space.png b/img/battlebacks1/Space.png
new file mode 100644
index 0000000..427ae81
Binary files /dev/null and b/img/battlebacks1/Space.png differ
diff --git a/img/battlebacks1/Stone1.png b/img/battlebacks1/Stone1.png
new file mode 100644
index 0000000..a146f91
Binary files /dev/null and b/img/battlebacks1/Stone1.png differ
diff --git a/img/battlebacks1/Stone2.png b/img/battlebacks1/Stone2.png
new file mode 100644
index 0000000..ce996ba
Binary files /dev/null and b/img/battlebacks1/Stone2.png differ
diff --git a/img/battlebacks1/Stone3.png b/img/battlebacks1/Stone3.png
new file mode 100644
index 0000000..23a39bc
Binary files /dev/null and b/img/battlebacks1/Stone3.png differ
diff --git a/img/battlebacks1/Temple.png b/img/battlebacks1/Temple.png
new file mode 100644
index 0000000..c24bd6d
Binary files /dev/null and b/img/battlebacks1/Temple.png differ
diff --git a/img/battlebacks1/Tent.png b/img/battlebacks1/Tent.png
new file mode 100644
index 0000000..d5020e5
Binary files /dev/null and b/img/battlebacks1/Tent.png differ
diff --git a/img/battlebacks1/Wasteland.png b/img/battlebacks1/Wasteland.png
new file mode 100644
index 0000000..892c7d1
Binary files /dev/null and b/img/battlebacks1/Wasteland.png differ
diff --git a/img/battlebacks1/Wood1.png b/img/battlebacks1/Wood1.png
new file mode 100644
index 0000000..9c4fdc2
Binary files /dev/null and b/img/battlebacks1/Wood1.png differ
diff --git a/img/battlebacks1/Wood2.png b/img/battlebacks1/Wood2.png
new file mode 100644
index 0000000..271fb3f
Binary files /dev/null and b/img/battlebacks1/Wood2.png differ
diff --git a/img/battlebacks2/Brick.png b/img/battlebacks2/Brick.png
new file mode 100644
index 0000000..26bd07c
Binary files /dev/null and b/img/battlebacks2/Brick.png differ
diff --git a/img/battlebacks2/Bridge.png b/img/battlebacks2/Bridge.png
new file mode 100644
index 0000000..c174e1c
Binary files /dev/null and b/img/battlebacks2/Bridge.png differ
diff --git a/img/battlebacks2/Castle1.png b/img/battlebacks2/Castle1.png
new file mode 100644
index 0000000..6c32496
Binary files /dev/null and b/img/battlebacks2/Castle1.png differ
diff --git a/img/battlebacks2/Castle2.png b/img/battlebacks2/Castle2.png
new file mode 100644
index 0000000..39ab2cd
Binary files /dev/null and b/img/battlebacks2/Castle2.png differ
diff --git a/img/battlebacks2/Castle3.png b/img/battlebacks2/Castle3.png
new file mode 100644
index 0000000..ffdafe6
Binary files /dev/null and b/img/battlebacks2/Castle3.png differ
diff --git a/img/battlebacks2/Cliff.png b/img/battlebacks2/Cliff.png
new file mode 100644
index 0000000..fca2a59
Binary files /dev/null and b/img/battlebacks2/Cliff.png differ
diff --git a/img/battlebacks2/Clouds.png b/img/battlebacks2/Clouds.png
new file mode 100644
index 0000000..2a5abda
Binary files /dev/null and b/img/battlebacks2/Clouds.png differ
diff --git a/img/battlebacks2/Colosseum.png b/img/battlebacks2/Colosseum.png
new file mode 100644
index 0000000..6ece516
Binary files /dev/null and b/img/battlebacks2/Colosseum.png differ
diff --git a/img/battlebacks2/Crystal.png b/img/battlebacks2/Crystal.png
new file mode 100644
index 0000000..c22323a
Binary files /dev/null and b/img/battlebacks2/Crystal.png differ
diff --git a/img/battlebacks2/Cyberspace.png b/img/battlebacks2/Cyberspace.png
new file mode 100644
index 0000000..f7c46c0
Binary files /dev/null and b/img/battlebacks2/Cyberspace.png differ
diff --git a/img/battlebacks2/DarkSpace.png b/img/battlebacks2/DarkSpace.png
new file mode 100644
index 0000000..7638947
Binary files /dev/null and b/img/battlebacks2/DarkSpace.png differ
diff --git a/img/battlebacks2/DemonCastle1.png b/img/battlebacks2/DemonCastle1.png
new file mode 100644
index 0000000..b1d4286
Binary files /dev/null and b/img/battlebacks2/DemonCastle1.png differ
diff --git a/img/battlebacks2/DemonCastle2.png b/img/battlebacks2/DemonCastle2.png
new file mode 100644
index 0000000..8df9da0
Binary files /dev/null and b/img/battlebacks2/DemonCastle2.png differ
diff --git a/img/battlebacks2/DemonCastle3.png b/img/battlebacks2/DemonCastle3.png
new file mode 100644
index 0000000..f0af09a
Binary files /dev/null and b/img/battlebacks2/DemonCastle3.png differ
diff --git a/img/battlebacks2/DemonicWorld.png b/img/battlebacks2/DemonicWorld.png
new file mode 100644
index 0000000..5490f62
Binary files /dev/null and b/img/battlebacks2/DemonicWorld.png differ
diff --git a/img/battlebacks2/Desert.png b/img/battlebacks2/Desert.png
new file mode 100644
index 0000000..b55051d
Binary files /dev/null and b/img/battlebacks2/Desert.png differ
diff --git a/img/battlebacks2/DirtCave.png b/img/battlebacks2/DirtCave.png
new file mode 100644
index 0000000..b6d0643
Binary files /dev/null and b/img/battlebacks2/DirtCave.png differ
diff --git a/img/battlebacks2/Forest.png b/img/battlebacks2/Forest.png
new file mode 100644
index 0000000..743741d
Binary files /dev/null and b/img/battlebacks2/Forest.png differ
diff --git a/img/battlebacks2/Fort1.png b/img/battlebacks2/Fort1.png
new file mode 100644
index 0000000..05dae78
Binary files /dev/null and b/img/battlebacks2/Fort1.png differ
diff --git a/img/battlebacks2/Fort2.png b/img/battlebacks2/Fort2.png
new file mode 100644
index 0000000..0d6ce36
Binary files /dev/null and b/img/battlebacks2/Fort2.png differ
diff --git a/img/battlebacks2/GrassMaze.png b/img/battlebacks2/GrassMaze.png
new file mode 100644
index 0000000..b67e27a
Binary files /dev/null and b/img/battlebacks2/GrassMaze.png differ
diff --git a/img/battlebacks2/Grassland.png b/img/battlebacks2/Grassland.png
new file mode 100644
index 0000000..8ed3603
Binary files /dev/null and b/img/battlebacks2/Grassland.png differ
diff --git a/img/battlebacks2/IceCave.png b/img/battlebacks2/IceCave.png
new file mode 100644
index 0000000..0a607cb
Binary files /dev/null and b/img/battlebacks2/IceCave.png differ
diff --git a/img/battlebacks2/IceMaze.png b/img/battlebacks2/IceMaze.png
new file mode 100644
index 0000000..ea65d69
Binary files /dev/null and b/img/battlebacks2/IceMaze.png differ
diff --git a/img/battlebacks2/Lava.png b/img/battlebacks2/Lava.png
new file mode 100644
index 0000000..a99ba1c
Binary files /dev/null and b/img/battlebacks2/Lava.png differ
diff --git a/img/battlebacks2/LavaCave.png b/img/battlebacks2/LavaCave.png
new file mode 100644
index 0000000..7fda535
Binary files /dev/null and b/img/battlebacks2/LavaCave.png differ
diff --git a/img/battlebacks2/PoisonSwamp.png b/img/battlebacks2/PoisonSwamp.png
new file mode 100644
index 0000000..41df320
Binary files /dev/null and b/img/battlebacks2/PoisonSwamp.png differ
diff --git a/img/battlebacks2/Port.png b/img/battlebacks2/Port.png
new file mode 100644
index 0000000..d9caedd
Binary files /dev/null and b/img/battlebacks2/Port.png differ
diff --git a/img/battlebacks2/RockCave.png b/img/battlebacks2/RockCave.png
new file mode 100644
index 0000000..386f98f
Binary files /dev/null and b/img/battlebacks2/RockCave.png differ
diff --git a/img/battlebacks2/Room1.png b/img/battlebacks2/Room1.png
new file mode 100644
index 0000000..5fe21c0
Binary files /dev/null and b/img/battlebacks2/Room1.png differ
diff --git a/img/battlebacks2/Room2.png b/img/battlebacks2/Room2.png
new file mode 100644
index 0000000..de72f61
Binary files /dev/null and b/img/battlebacks2/Room2.png differ
diff --git a/img/battlebacks2/Room3.png b/img/battlebacks2/Room3.png
new file mode 100644
index 0000000..a650414
Binary files /dev/null and b/img/battlebacks2/Room3.png differ
diff --git a/img/battlebacks2/Ruins1.png b/img/battlebacks2/Ruins1.png
new file mode 100644
index 0000000..0e04bf7
Binary files /dev/null and b/img/battlebacks2/Ruins1.png differ
diff --git a/img/battlebacks2/Ruins2.png b/img/battlebacks2/Ruins2.png
new file mode 100644
index 0000000..6c5f88f
Binary files /dev/null and b/img/battlebacks2/Ruins2.png differ
diff --git a/img/battlebacks2/Ruins3.png b/img/battlebacks2/Ruins3.png
new file mode 100644
index 0000000..6d7825c
Binary files /dev/null and b/img/battlebacks2/Ruins3.png differ
diff --git a/img/battlebacks2/Ship.png b/img/battlebacks2/Ship.png
new file mode 100644
index 0000000..db03f7a
Binary files /dev/null and b/img/battlebacks2/Ship.png differ
diff --git a/img/battlebacks2/Smoke.png b/img/battlebacks2/Smoke.png
new file mode 100644
index 0000000..a4bd12c
Binary files /dev/null and b/img/battlebacks2/Smoke.png differ
diff --git a/img/battlebacks2/Snowfield.png b/img/battlebacks2/Snowfield.png
new file mode 100644
index 0000000..4c8e1b5
Binary files /dev/null and b/img/battlebacks2/Snowfield.png differ
diff --git a/img/battlebacks2/Stone1.png b/img/battlebacks2/Stone1.png
new file mode 100644
index 0000000..5712881
Binary files /dev/null and b/img/battlebacks2/Stone1.png differ
diff --git a/img/battlebacks2/Stone2.png b/img/battlebacks2/Stone2.png
new file mode 100644
index 0000000..d8a2de1
Binary files /dev/null and b/img/battlebacks2/Stone2.png differ
diff --git a/img/battlebacks2/Stone3.png b/img/battlebacks2/Stone3.png
new file mode 100644
index 0000000..c13f53a
Binary files /dev/null and b/img/battlebacks2/Stone3.png differ
diff --git a/img/battlebacks2/Temple.png b/img/battlebacks2/Temple.png
new file mode 100644
index 0000000..1f1ddb8
Binary files /dev/null and b/img/battlebacks2/Temple.png differ
diff --git a/img/battlebacks2/Tent.png b/img/battlebacks2/Tent.png
new file mode 100644
index 0000000..72f1b2c
Binary files /dev/null and b/img/battlebacks2/Tent.png differ
diff --git a/img/battlebacks2/Tower.png b/img/battlebacks2/Tower.png
new file mode 100644
index 0000000..3af7579
Binary files /dev/null and b/img/battlebacks2/Tower.png differ
diff --git a/img/battlebacks2/Town1.png b/img/battlebacks2/Town1.png
new file mode 100644
index 0000000..3849a90
Binary files /dev/null and b/img/battlebacks2/Town1.png differ
diff --git a/img/battlebacks2/Town2.png b/img/battlebacks2/Town2.png
new file mode 100644
index 0000000..bf8f52e
Binary files /dev/null and b/img/battlebacks2/Town2.png differ
diff --git a/img/battlebacks2/Town3.png b/img/battlebacks2/Town3.png
new file mode 100644
index 0000000..917d579
Binary files /dev/null and b/img/battlebacks2/Town3.png differ
diff --git a/img/battlebacks2/Town4.png b/img/battlebacks2/Town4.png
new file mode 100644
index 0000000..6fc4e68
Binary files /dev/null and b/img/battlebacks2/Town4.png differ
diff --git a/img/battlebacks2/Town5.png b/img/battlebacks2/Town5.png
new file mode 100644
index 0000000..30056ca
Binary files /dev/null and b/img/battlebacks2/Town5.png differ
diff --git a/img/battlebacks2/Wasteland.png b/img/battlebacks2/Wasteland.png
new file mode 100644
index 0000000..351af92
Binary files /dev/null and b/img/battlebacks2/Wasteland.png differ
diff --git a/img/characters/!$Gate1.png b/img/characters/!$Gate1.png
new file mode 100644
index 0000000..e01667a
Binary files /dev/null and b/img/characters/!$Gate1.png differ
diff --git a/img/characters/!$Gate2.png b/img/characters/!$Gate2.png
new file mode 100644
index 0000000..42dd0cf
Binary files /dev/null and b/img/characters/!$Gate2.png differ
diff --git a/img/characters/!$SF_Gate1.png b/img/characters/!$SF_Gate1.png
new file mode 100644
index 0000000..17849e1
Binary files /dev/null and b/img/characters/!$SF_Gate1.png differ
diff --git a/img/characters/!$SF_Gate2.png b/img/characters/!$SF_Gate2.png
new file mode 100644
index 0000000..9d63ffd
Binary files /dev/null and b/img/characters/!$SF_Gate2.png differ
diff --git a/img/characters/!$SF_Gate3.png b/img/characters/!$SF_Gate3.png
new file mode 100644
index 0000000..9e1bba7
Binary files /dev/null and b/img/characters/!$SF_Gate3.png differ
diff --git a/img/characters/!Chest.png b/img/characters/!Chest.png
new file mode 100644
index 0000000..280e270
Binary files /dev/null and b/img/characters/!Chest.png differ
diff --git a/img/characters/!Crystal.png b/img/characters/!Crystal.png
new file mode 100644
index 0000000..223cb16
Binary files /dev/null and b/img/characters/!Crystal.png differ
diff --git a/img/characters/!Door1.png b/img/characters/!Door1.png
new file mode 100644
index 0000000..5eec503
Binary files /dev/null and b/img/characters/!Door1.png differ
diff --git a/img/characters/!Door2.png b/img/characters/!Door2.png
new file mode 100644
index 0000000..f08460d
Binary files /dev/null and b/img/characters/!Door2.png differ
diff --git a/img/characters/!Flame.png b/img/characters/!Flame.png
new file mode 100644
index 0000000..bc24f84
Binary files /dev/null and b/img/characters/!Flame.png differ
diff --git a/img/characters/!Other1.png b/img/characters/!Other1.png
new file mode 100644
index 0000000..f3a2abb
Binary files /dev/null and b/img/characters/!Other1.png differ
diff --git a/img/characters/!Other2.png b/img/characters/!Other2.png
new file mode 100644
index 0000000..9559b3b
Binary files /dev/null and b/img/characters/!Other2.png differ
diff --git a/img/characters/!SF_Chest.png b/img/characters/!SF_Chest.png
new file mode 100644
index 0000000..5eae705
Binary files /dev/null and b/img/characters/!SF_Chest.png differ
diff --git a/img/characters/!SF_Door1.png b/img/characters/!SF_Door1.png
new file mode 100644
index 0000000..e0cc5c9
Binary files /dev/null and b/img/characters/!SF_Door1.png differ
diff --git a/img/characters/!SF_Door2.png b/img/characters/!SF_Door2.png
new file mode 100644
index 0000000..01e6d1b
Binary files /dev/null and b/img/characters/!SF_Door2.png differ
diff --git a/img/characters/!SF_Switch1.png b/img/characters/!SF_Switch1.png
new file mode 100644
index 0000000..08fb0cd
Binary files /dev/null and b/img/characters/!SF_Switch1.png differ
diff --git a/img/characters/!Switch1.png b/img/characters/!Switch1.png
new file mode 100644
index 0000000..b1a15c4
Binary files /dev/null and b/img/characters/!Switch1.png differ
diff --git a/img/characters/!Switch2.png b/img/characters/!Switch2.png
new file mode 100644
index 0000000..6e437ca
Binary files /dev/null and b/img/characters/!Switch2.png differ
diff --git a/img/characters/!Weapon.png b/img/characters/!Weapon.png
new file mode 100644
index 0000000..4f28004
Binary files /dev/null and b/img/characters/!Weapon.png differ
diff --git a/img/characters/$BigMonster1.png b/img/characters/$BigMonster1.png
new file mode 100644
index 0000000..de7409c
Binary files /dev/null and b/img/characters/$BigMonster1.png differ
diff --git a/img/characters/$BigMonster2.png b/img/characters/$BigMonster2.png
new file mode 100644
index 0000000..2190f69
Binary files /dev/null and b/img/characters/$BigMonster2.png differ
diff --git a/img/characters/Actor1.png b/img/characters/Actor1.png
new file mode 100644
index 0000000..f2769dc
Binary files /dev/null and b/img/characters/Actor1.png differ
diff --git a/img/characters/Actor2.png b/img/characters/Actor2.png
new file mode 100644
index 0000000..041f11e
Binary files /dev/null and b/img/characters/Actor2.png differ
diff --git a/img/characters/Actor3.png b/img/characters/Actor3.png
new file mode 100644
index 0000000..838ab19
Binary files /dev/null and b/img/characters/Actor3.png differ
diff --git a/img/characters/Damage1.png b/img/characters/Damage1.png
new file mode 100644
index 0000000..2b6954e
Binary files /dev/null and b/img/characters/Damage1.png differ
diff --git a/img/characters/Damage2.png b/img/characters/Damage2.png
new file mode 100644
index 0000000..c9ba400
Binary files /dev/null and b/img/characters/Damage2.png differ
diff --git a/img/characters/Damage3.png b/img/characters/Damage3.png
new file mode 100644
index 0000000..46a1943
Binary files /dev/null and b/img/characters/Damage3.png differ
diff --git a/img/characters/Evil.png b/img/characters/Evil.png
new file mode 100644
index 0000000..8f0c76a
Binary files /dev/null and b/img/characters/Evil.png differ
diff --git a/img/characters/Monster.png b/img/characters/Monster.png
new file mode 100644
index 0000000..86a9961
Binary files /dev/null and b/img/characters/Monster.png differ
diff --git a/img/characters/Nature.png b/img/characters/Nature.png
new file mode 100644
index 0000000..79e8512
Binary files /dev/null and b/img/characters/Nature.png differ
diff --git a/img/characters/People1.png b/img/characters/People1.png
new file mode 100644
index 0000000..dbae017
Binary files /dev/null and b/img/characters/People1.png differ
diff --git a/img/characters/People2.png b/img/characters/People2.png
new file mode 100644
index 0000000..8f08602
Binary files /dev/null and b/img/characters/People2.png differ
diff --git a/img/characters/People3.png b/img/characters/People3.png
new file mode 100644
index 0000000..aa3fcc1
Binary files /dev/null and b/img/characters/People3.png differ
diff --git a/img/characters/People4.png b/img/characters/People4.png
new file mode 100644
index 0000000..cdd0851
Binary files /dev/null and b/img/characters/People4.png differ
diff --git a/img/characters/SF_Actor1.png b/img/characters/SF_Actor1.png
new file mode 100644
index 0000000..e99c0e8
Binary files /dev/null and b/img/characters/SF_Actor1.png differ
diff --git a/img/characters/SF_Actor2.png b/img/characters/SF_Actor2.png
new file mode 100644
index 0000000..3be702c
Binary files /dev/null and b/img/characters/SF_Actor2.png differ
diff --git a/img/characters/SF_Actor3.png b/img/characters/SF_Actor3.png
new file mode 100644
index 0000000..55974c4
Binary files /dev/null and b/img/characters/SF_Actor3.png differ
diff --git a/img/characters/SF_Damage1.png b/img/characters/SF_Damage1.png
new file mode 100644
index 0000000..09fb14d
Binary files /dev/null and b/img/characters/SF_Damage1.png differ
diff --git a/img/characters/SF_Damage2.png b/img/characters/SF_Damage2.png
new file mode 100644
index 0000000..784f5ee
Binary files /dev/null and b/img/characters/SF_Damage2.png differ
diff --git a/img/characters/SF_Monster.png b/img/characters/SF_Monster.png
new file mode 100644
index 0000000..ff168d4
Binary files /dev/null and b/img/characters/SF_Monster.png differ
diff --git a/img/characters/SF_People1.png b/img/characters/SF_People1.png
new file mode 100644
index 0000000..63ee548
Binary files /dev/null and b/img/characters/SF_People1.png differ
diff --git a/img/characters/SF_People2.png b/img/characters/SF_People2.png
new file mode 100644
index 0000000..989799f
Binary files /dev/null and b/img/characters/SF_People2.png differ
diff --git a/img/characters/SF_People3.png b/img/characters/SF_People3.png
new file mode 100644
index 0000000..937ad26
Binary files /dev/null and b/img/characters/SF_People3.png differ
diff --git a/img/characters/SF_Vehicle.png b/img/characters/SF_Vehicle.png
new file mode 100644
index 0000000..aca7f42
Binary files /dev/null and b/img/characters/SF_Vehicle.png differ
diff --git a/img/characters/Vehicle.png b/img/characters/Vehicle.png
new file mode 100644
index 0000000..07e0fc7
Binary files /dev/null and b/img/characters/Vehicle.png differ
diff --git a/img/enemies/Actor1_3.png b/img/enemies/Actor1_3.png
new file mode 100644
index 0000000..7fa1075
Binary files /dev/null and b/img/enemies/Actor1_3.png differ
diff --git a/img/enemies/Actor1_4.png b/img/enemies/Actor1_4.png
new file mode 100644
index 0000000..207136b
Binary files /dev/null and b/img/enemies/Actor1_4.png differ
diff --git a/img/enemies/Actor1_5.png b/img/enemies/Actor1_5.png
new file mode 100644
index 0000000..dcb108c
Binary files /dev/null and b/img/enemies/Actor1_5.png differ
diff --git a/img/enemies/Actor1_6.png b/img/enemies/Actor1_6.png
new file mode 100644
index 0000000..f1cc400
Binary files /dev/null and b/img/enemies/Actor1_6.png differ
diff --git a/img/enemies/Actor2_1.png b/img/enemies/Actor2_1.png
new file mode 100644
index 0000000..394f182
Binary files /dev/null and b/img/enemies/Actor2_1.png differ
diff --git a/img/enemies/Actor2_2.png b/img/enemies/Actor2_2.png
new file mode 100644
index 0000000..366ad32
Binary files /dev/null and b/img/enemies/Actor2_2.png differ
diff --git a/img/enemies/Actor2_3.png b/img/enemies/Actor2_3.png
new file mode 100644
index 0000000..3a6cae4
Binary files /dev/null and b/img/enemies/Actor2_3.png differ
diff --git a/img/enemies/Actor2_4.png b/img/enemies/Actor2_4.png
new file mode 100644
index 0000000..4cc861a
Binary files /dev/null and b/img/enemies/Actor2_4.png differ
diff --git a/img/enemies/Actor2_5.png b/img/enemies/Actor2_5.png
new file mode 100644
index 0000000..a465747
Binary files /dev/null and b/img/enemies/Actor2_5.png differ
diff --git a/img/enemies/Actor2_6.png b/img/enemies/Actor2_6.png
new file mode 100644
index 0000000..2426c3d
Binary files /dev/null and b/img/enemies/Actor2_6.png differ
diff --git a/img/enemies/Actor2_7.png b/img/enemies/Actor2_7.png
new file mode 100644
index 0000000..dc69a0f
Binary files /dev/null and b/img/enemies/Actor2_7.png differ
diff --git a/img/enemies/Actor3_1.png b/img/enemies/Actor3_1.png
new file mode 100644
index 0000000..f2e0232
Binary files /dev/null and b/img/enemies/Actor3_1.png differ
diff --git a/img/enemies/Actor3_2.png b/img/enemies/Actor3_2.png
new file mode 100644
index 0000000..e4c8d8a
Binary files /dev/null and b/img/enemies/Actor3_2.png differ
diff --git a/img/enemies/Actor3_3.png b/img/enemies/Actor3_3.png
new file mode 100644
index 0000000..00e6990
Binary files /dev/null and b/img/enemies/Actor3_3.png differ
diff --git a/img/enemies/Actor3_4.png b/img/enemies/Actor3_4.png
new file mode 100644
index 0000000..f69da50
Binary files /dev/null and b/img/enemies/Actor3_4.png differ
diff --git a/img/enemies/Berserker.png b/img/enemies/Berserker.png
new file mode 100644
index 0000000..738f119
Binary files /dev/null and b/img/enemies/Berserker.png differ
diff --git a/img/enemies/Birdman.png b/img/enemies/Birdman.png
new file mode 100644
index 0000000..930b3b6
Binary files /dev/null and b/img/enemies/Birdman.png differ
diff --git a/img/enemies/Blackknight.png b/img/enemies/Blackknight.png
new file mode 100644
index 0000000..1afb93a
Binary files /dev/null and b/img/enemies/Blackknight.png differ
diff --git a/img/enemies/Caitsith.png b/img/enemies/Caitsith.png
new file mode 100644
index 0000000..39d3338
Binary files /dev/null and b/img/enemies/Caitsith.png differ
diff --git a/img/enemies/Captain.png b/img/enemies/Captain.png
new file mode 100644
index 0000000..b95055f
Binary files /dev/null and b/img/enemies/Captain.png differ
diff --git a/img/enemies/Crab.png b/img/enemies/Crab.png
new file mode 100644
index 0000000..40aba7b
Binary files /dev/null and b/img/enemies/Crab.png differ
diff --git a/img/enemies/Crow.png b/img/enemies/Crow.png
new file mode 100644
index 0000000..d85fbea
Binary files /dev/null and b/img/enemies/Crow.png differ
diff --git a/img/enemies/Darkelf.png b/img/enemies/Darkelf.png
new file mode 100644
index 0000000..f09326e
Binary files /dev/null and b/img/enemies/Darkelf.png differ
diff --git a/img/enemies/Demon.png b/img/enemies/Demon.png
new file mode 100644
index 0000000..5f19c16
Binary files /dev/null and b/img/enemies/Demon.png differ
diff --git a/img/enemies/Demon_metamorphosis.png b/img/enemies/Demon_metamorphosis.png
new file mode 100644
index 0000000..f0fd694
Binary files /dev/null and b/img/enemies/Demon_metamorphosis.png differ
diff --git a/img/enemies/Demoncount.png b/img/enemies/Demoncount.png
new file mode 100644
index 0000000..e14e7eb
Binary files /dev/null and b/img/enemies/Demoncount.png differ
diff --git a/img/enemies/Demonpot.png b/img/enemies/Demonpot.png
new file mode 100644
index 0000000..7df680a
Binary files /dev/null and b/img/enemies/Demonpot.png differ
diff --git a/img/enemies/Dragon.png b/img/enemies/Dragon.png
new file mode 100644
index 0000000..9ba9a49
Binary files /dev/null and b/img/enemies/Dragon.png differ
diff --git a/img/enemies/Evilbook.png b/img/enemies/Evilbook.png
new file mode 100644
index 0000000..772b1a1
Binary files /dev/null and b/img/enemies/Evilbook.png differ
diff --git a/img/enemies/Evilgod.png b/img/enemies/Evilgod.png
new file mode 100644
index 0000000..16e25f8
Binary files /dev/null and b/img/enemies/Evilgod.png differ
diff --git a/img/enemies/Foxman.png b/img/enemies/Foxman.png
new file mode 100644
index 0000000..215c2d7
Binary files /dev/null and b/img/enemies/Foxman.png differ
diff --git a/img/enemies/Frilledlizard.png b/img/enemies/Frilledlizard.png
new file mode 100644
index 0000000..0da1ddd
Binary files /dev/null and b/img/enemies/Frilledlizard.png differ
diff --git a/img/enemies/Gatekeeper.png b/img/enemies/Gatekeeper.png
new file mode 100644
index 0000000..f654e48
Binary files /dev/null and b/img/enemies/Gatekeeper.png differ
diff --git a/img/enemies/Gnome.png b/img/enemies/Gnome.png
new file mode 100644
index 0000000..57ed77c
Binary files /dev/null and b/img/enemies/Gnome.png differ
diff --git a/img/enemies/Goblin.png b/img/enemies/Goblin.png
new file mode 100644
index 0000000..68c986c
Binary files /dev/null and b/img/enemies/Goblin.png differ
diff --git a/img/enemies/God_of_light.png b/img/enemies/God_of_light.png
new file mode 100644
index 0000000..c97bdfc
Binary files /dev/null and b/img/enemies/God_of_light.png differ
diff --git a/img/enemies/Goddess.png b/img/enemies/Goddess.png
new file mode 100644
index 0000000..27e8c5d
Binary files /dev/null and b/img/enemies/Goddess.png differ
diff --git a/img/enemies/Goddess_of_death.png b/img/enemies/Goddess_of_death.png
new file mode 100644
index 0000000..5893b29
Binary files /dev/null and b/img/enemies/Goddess_of_death.png differ
diff --git a/img/enemies/Hakutaku.png b/img/enemies/Hakutaku.png
new file mode 100644
index 0000000..0f39609
Binary files /dev/null and b/img/enemies/Hakutaku.png differ
diff --git a/img/enemies/Harpy.png b/img/enemies/Harpy.png
new file mode 100644
index 0000000..a5ca3d7
Binary files /dev/null and b/img/enemies/Harpy.png differ
diff --git a/img/enemies/Hi_monster.png b/img/enemies/Hi_monster.png
new file mode 100644
index 0000000..b263221
Binary files /dev/null and b/img/enemies/Hi_monster.png differ
diff --git a/img/enemies/Highking.png b/img/enemies/Highking.png
new file mode 100644
index 0000000..9e36805
Binary files /dev/null and b/img/enemies/Highking.png differ
diff --git a/img/enemies/Hydra.png b/img/enemies/Hydra.png
new file mode 100644
index 0000000..27f47e1
Binary files /dev/null and b/img/enemies/Hydra.png differ
diff --git a/img/enemies/Ketos.png b/img/enemies/Ketos.png
new file mode 100644
index 0000000..a9cf96e
Binary files /dev/null and b/img/enemies/Ketos.png differ
diff --git a/img/enemies/Kraken.png b/img/enemies/Kraken.png
new file mode 100644
index 0000000..410dd3c
Binary files /dev/null and b/img/enemies/Kraken.png differ
diff --git a/img/enemies/Lich.png b/img/enemies/Lich.png
new file mode 100644
index 0000000..15c9396
Binary files /dev/null and b/img/enemies/Lich.png differ
diff --git a/img/enemies/Machinerybee.png b/img/enemies/Machinerybee.png
new file mode 100644
index 0000000..52973ef
Binary files /dev/null and b/img/enemies/Machinerybee.png differ
diff --git a/img/enemies/Matango.png b/img/enemies/Matango.png
new file mode 100644
index 0000000..6469832
Binary files /dev/null and b/img/enemies/Matango.png differ
diff --git a/img/enemies/Mechascorpion.png b/img/enemies/Mechascorpion.png
new file mode 100644
index 0000000..a78add7
Binary files /dev/null and b/img/enemies/Mechascorpion.png differ
diff --git a/img/enemies/Medusa.png b/img/enemies/Medusa.png
new file mode 100644
index 0000000..e70a554
Binary files /dev/null and b/img/enemies/Medusa.png differ
diff --git a/img/enemies/Mercenary.png b/img/enemies/Mercenary.png
new file mode 100644
index 0000000..4b1ea0a
Binary files /dev/null and b/img/enemies/Mercenary.png differ
diff --git a/img/enemies/Mimic.png b/img/enemies/Mimic.png
new file mode 100644
index 0000000..56adbd0
Binary files /dev/null and b/img/enemies/Mimic.png differ
diff --git a/img/enemies/Oddegg.png b/img/enemies/Oddegg.png
new file mode 100644
index 0000000..c078855
Binary files /dev/null and b/img/enemies/Oddegg.png differ
diff --git a/img/enemies/Petitdevil.png b/img/enemies/Petitdevil.png
new file mode 100644
index 0000000..654914a
Binary files /dev/null and b/img/enemies/Petitdevil.png differ
diff --git a/img/enemies/Plasma.png b/img/enemies/Plasma.png
new file mode 100644
index 0000000..3141401
Binary files /dev/null and b/img/enemies/Plasma.png differ
diff --git a/img/enemies/SF_Agent.png b/img/enemies/SF_Agent.png
new file mode 100644
index 0000000..fc3ac49
Binary files /dev/null and b/img/enemies/SF_Agent.png differ
diff --git a/img/enemies/SF_Anaconda.png b/img/enemies/SF_Anaconda.png
new file mode 100644
index 0000000..4487f18
Binary files /dev/null and b/img/enemies/SF_Anaconda.png differ
diff --git a/img/enemies/SF_Armygorilla.png b/img/enemies/SF_Armygorilla.png
new file mode 100644
index 0000000..e31c2b9
Binary files /dev/null and b/img/enemies/SF_Armygorilla.png differ
diff --git a/img/enemies/SF_Armymonkey.png b/img/enemies/SF_Armymonkey.png
new file mode 100644
index 0000000..b8853cb
Binary files /dev/null and b/img/enemies/SF_Armymonkey.png differ
diff --git a/img/enemies/SF_Blueogre.png b/img/enemies/SF_Blueogre.png
new file mode 100644
index 0000000..6209320
Binary files /dev/null and b/img/enemies/SF_Blueogre.png differ
diff --git a/img/enemies/SF_Boss.png b/img/enemies/SF_Boss.png
new file mode 100644
index 0000000..cab71cd
Binary files /dev/null and b/img/enemies/SF_Boss.png differ
diff --git a/img/enemies/SF_Brownbear.png b/img/enemies/SF_Brownbear.png
new file mode 100644
index 0000000..41c0f17
Binary files /dev/null and b/img/enemies/SF_Brownbear.png differ
diff --git a/img/enemies/SF_Cyborg.png b/img/enemies/SF_Cyborg.png
new file mode 100644
index 0000000..c0f3d01
Binary files /dev/null and b/img/enemies/SF_Cyborg.png differ
diff --git a/img/enemies/SF_Demon_of_universe.png b/img/enemies/SF_Demon_of_universe.png
new file mode 100644
index 0000000..3c240d5
Binary files /dev/null and b/img/enemies/SF_Demon_of_universe.png differ
diff --git a/img/enemies/SF_Drone.png b/img/enemies/SF_Drone.png
new file mode 100644
index 0000000..5a7fcf1
Binary files /dev/null and b/img/enemies/SF_Drone.png differ
diff --git a/img/enemies/SF_Enmadaio.png b/img/enemies/SF_Enmadaio.png
new file mode 100644
index 0000000..04d9337
Binary files /dev/null and b/img/enemies/SF_Enmadaio.png differ
diff --git a/img/enemies/SF_Evilteddybear.png b/img/enemies/SF_Evilteddybear.png
new file mode 100644
index 0000000..8a5d203
Binary files /dev/null and b/img/enemies/SF_Evilteddybear.png differ
diff --git a/img/enemies/SF_Hannyamask.png b/img/enemies/SF_Hannyamask.png
new file mode 100644
index 0000000..f7c4152
Binary files /dev/null and b/img/enemies/SF_Hannyamask.png differ
diff --git a/img/enemies/SF_Hermit.png b/img/enemies/SF_Hermit.png
new file mode 100644
index 0000000..457e717
Binary files /dev/null and b/img/enemies/SF_Hermit.png differ
diff --git a/img/enemies/SF_Jiangshi.png b/img/enemies/SF_Jiangshi.png
new file mode 100644
index 0000000..54b7bd6
Binary files /dev/null and b/img/enemies/SF_Jiangshi.png differ
diff --git a/img/enemies/SF_Kamaitachi.png b/img/enemies/SF_Kamaitachi.png
new file mode 100644
index 0000000..869d9b8
Binary files /dev/null and b/img/enemies/SF_Kamaitachi.png differ
diff --git a/img/enemies/SF_Kappa.png b/img/enemies/SF_Kappa.png
new file mode 100644
index 0000000..decf126
Binary files /dev/null and b/img/enemies/SF_Kappa.png differ
diff --git a/img/enemies/SF_Madclown.png b/img/enemies/SF_Madclown.png
new file mode 100644
index 0000000..c550efd
Binary files /dev/null and b/img/enemies/SF_Madclown.png differ
diff --git a/img/enemies/SF_Madscientist.png b/img/enemies/SF_Madscientist.png
new file mode 100644
index 0000000..e1d4eca
Binary files /dev/null and b/img/enemies/SF_Madscientist.png differ
diff --git a/img/enemies/SF_Mafia.png b/img/enemies/SF_Mafia.png
new file mode 100644
index 0000000..e5e3430
Binary files /dev/null and b/img/enemies/SF_Mafia.png differ
diff --git a/img/enemies/SF_Mechasphere.png b/img/enemies/SF_Mechasphere.png
new file mode 100644
index 0000000..1e836dc
Binary files /dev/null and b/img/enemies/SF_Mechasphere.png differ
diff --git a/img/enemies/SF_Phoenix.png b/img/enemies/SF_Phoenix.png
new file mode 100644
index 0000000..971a02d
Binary files /dev/null and b/img/enemies/SF_Phoenix.png differ
diff --git a/img/enemies/SF_Redogre.png b/img/enemies/SF_Redogre.png
new file mode 100644
index 0000000..cd516a0
Binary files /dev/null and b/img/enemies/SF_Redogre.png differ
diff --git a/img/enemies/SF_Securityrobot.png b/img/enemies/SF_Securityrobot.png
new file mode 100644
index 0000000..30cb1f2
Binary files /dev/null and b/img/enemies/SF_Securityrobot.png differ
diff --git a/img/enemies/SF_Shadow.png b/img/enemies/SF_Shadow.png
new file mode 100644
index 0000000..950386f
Binary files /dev/null and b/img/enemies/SF_Shadow.png differ
diff --git a/img/enemies/SF_Skullmask.png b/img/enemies/SF_Skullmask.png
new file mode 100644
index 0000000..f0e971e
Binary files /dev/null and b/img/enemies/SF_Skullmask.png differ
diff --git a/img/enemies/SF_Slaughterrobot.png b/img/enemies/SF_Slaughterrobot.png
new file mode 100644
index 0000000..35dbdbd
Binary files /dev/null and b/img/enemies/SF_Slaughterrobot.png differ
diff --git a/img/enemies/SF_Specialforces.png b/img/enemies/SF_Specialforces.png
new file mode 100644
index 0000000..a2c6298
Binary files /dev/null and b/img/enemies/SF_Specialforces.png differ
diff --git a/img/enemies/SF_Talkingmuppet.png b/img/enemies/SF_Talkingmuppet.png
new file mode 100644
index 0000000..7026ad6
Binary files /dev/null and b/img/enemies/SF_Talkingmuppet.png differ
diff --git a/img/enemies/SF_Timebomb.png b/img/enemies/SF_Timebomb.png
new file mode 100644
index 0000000..0eac2f9
Binary files /dev/null and b/img/enemies/SF_Timebomb.png differ
diff --git a/img/enemies/SF_Whitewolf.png b/img/enemies/SF_Whitewolf.png
new file mode 100644
index 0000000..40446a9
Binary files /dev/null and b/img/enemies/SF_Whitewolf.png differ
diff --git a/img/enemies/SF_Will_o_the_wisp.png b/img/enemies/SF_Will_o_the_wisp.png
new file mode 100644
index 0000000..478f472
Binary files /dev/null and b/img/enemies/SF_Will_o_the_wisp.png differ
diff --git a/img/enemies/SF_Wolf.png b/img/enemies/SF_Wolf.png
new file mode 100644
index 0000000..a21dadc
Binary files /dev/null and b/img/enemies/SF_Wolf.png differ
diff --git a/img/enemies/SF_Workrobot.png b/img/enemies/SF_Workrobot.png
new file mode 100644
index 0000000..4215242
Binary files /dev/null and b/img/enemies/SF_Workrobot.png differ
diff --git a/img/enemies/SF_Zombiedog.png b/img/enemies/SF_Zombiedog.png
new file mode 100644
index 0000000..533b2f0
Binary files /dev/null and b/img/enemies/SF_Zombiedog.png differ
diff --git a/img/enemies/Sailor.png b/img/enemies/Sailor.png
new file mode 100644
index 0000000..34297e1
Binary files /dev/null and b/img/enemies/Sailor.png differ
diff --git a/img/enemies/Salamander.png b/img/enemies/Salamander.png
new file mode 100644
index 0000000..c3e1fdc
Binary files /dev/null and b/img/enemies/Salamander.png differ
diff --git a/img/enemies/Sandworm.png b/img/enemies/Sandworm.png
new file mode 100644
index 0000000..b93496d
Binary files /dev/null and b/img/enemies/Sandworm.png differ
diff --git a/img/enemies/Siren.png b/img/enemies/Siren.png
new file mode 100644
index 0000000..3d124d2
Binary files /dev/null and b/img/enemies/Siren.png differ
diff --git a/img/enemies/Sorcerer.png b/img/enemies/Sorcerer.png
new file mode 100644
index 0000000..84f217a
Binary files /dev/null and b/img/enemies/Sorcerer.png differ
diff --git a/img/enemies/Stoneknight.png b/img/enemies/Stoneknight.png
new file mode 100644
index 0000000..536b9fd
Binary files /dev/null and b/img/enemies/Stoneknight.png differ
diff --git a/img/enemies/Sylph.png b/img/enemies/Sylph.png
new file mode 100644
index 0000000..084e513
Binary files /dev/null and b/img/enemies/Sylph.png differ
diff --git a/img/enemies/Tigerbunny.png b/img/enemies/Tigerbunny.png
new file mode 100644
index 0000000..491b28e
Binary files /dev/null and b/img/enemies/Tigerbunny.png differ
diff --git a/img/enemies/Treant.png b/img/enemies/Treant.png
new file mode 100644
index 0000000..b547af4
Binary files /dev/null and b/img/enemies/Treant.png differ
diff --git a/img/enemies/Undine.png b/img/enemies/Undine.png
new file mode 100644
index 0000000..7947c81
Binary files /dev/null and b/img/enemies/Undine.png differ
diff --git a/img/enemies/Unicorn.png b/img/enemies/Unicorn.png
new file mode 100644
index 0000000..21247f8
Binary files /dev/null and b/img/enemies/Unicorn.png differ
diff --git a/img/enemies/Witch.png b/img/enemies/Witch.png
new file mode 100644
index 0000000..fce0ebf
Binary files /dev/null and b/img/enemies/Witch.png differ
diff --git a/img/enemies/Wolfman.png b/img/enemies/Wolfman.png
new file mode 100644
index 0000000..900977c
Binary files /dev/null and b/img/enemies/Wolfman.png differ
diff --git a/img/enemies/Wraith.png b/img/enemies/Wraith.png
new file mode 100644
index 0000000..8ebc002
Binary files /dev/null and b/img/enemies/Wraith.png differ
diff --git a/img/enemies/Zombie.png b/img/enemies/Zombie.png
new file mode 100644
index 0000000..e8e4dda
Binary files /dev/null and b/img/enemies/Zombie.png differ
diff --git a/img/faces/Actor1.png b/img/faces/Actor1.png
new file mode 100644
index 0000000..613d25d
Binary files /dev/null and b/img/faces/Actor1.png differ
diff --git a/img/faces/Actor2.png b/img/faces/Actor2.png
new file mode 100644
index 0000000..c8b8db8
Binary files /dev/null and b/img/faces/Actor2.png differ
diff --git a/img/faces/Actor3.png b/img/faces/Actor3.png
new file mode 100644
index 0000000..9f2b510
Binary files /dev/null and b/img/faces/Actor3.png differ
diff --git a/img/faces/Evil.png b/img/faces/Evil.png
new file mode 100644
index 0000000..6917c15
Binary files /dev/null and b/img/faces/Evil.png differ
diff --git a/img/faces/Monster.png b/img/faces/Monster.png
new file mode 100644
index 0000000..724c154
Binary files /dev/null and b/img/faces/Monster.png differ
diff --git a/img/faces/Nature.png b/img/faces/Nature.png
new file mode 100644
index 0000000..7eb1c83
Binary files /dev/null and b/img/faces/Nature.png differ
diff --git a/img/faces/People1.png b/img/faces/People1.png
new file mode 100644
index 0000000..1f2af4f
Binary files /dev/null and b/img/faces/People1.png differ
diff --git a/img/faces/People2.png b/img/faces/People2.png
new file mode 100644
index 0000000..bb3afeb
Binary files /dev/null and b/img/faces/People2.png differ
diff --git a/img/faces/People3.png b/img/faces/People3.png
new file mode 100644
index 0000000..d6108ff
Binary files /dev/null and b/img/faces/People3.png differ
diff --git a/img/faces/People4.png b/img/faces/People4.png
new file mode 100644
index 0000000..21d8a43
Binary files /dev/null and b/img/faces/People4.png differ
diff --git a/img/faces/SF_Actor1.png b/img/faces/SF_Actor1.png
new file mode 100644
index 0000000..107b85f
Binary files /dev/null and b/img/faces/SF_Actor1.png differ
diff --git a/img/faces/SF_Actor2.png b/img/faces/SF_Actor2.png
new file mode 100644
index 0000000..e1339c3
Binary files /dev/null and b/img/faces/SF_Actor2.png differ
diff --git a/img/faces/SF_Actor3.png b/img/faces/SF_Actor3.png
new file mode 100644
index 0000000..a2d8544
Binary files /dev/null and b/img/faces/SF_Actor3.png differ
diff --git a/img/faces/SF_Monster.png b/img/faces/SF_Monster.png
new file mode 100644
index 0000000..78c01f0
Binary files /dev/null and b/img/faces/SF_Monster.png differ
diff --git a/img/faces/SF_People1.png b/img/faces/SF_People1.png
new file mode 100644
index 0000000..05528e5
Binary files /dev/null and b/img/faces/SF_People1.png differ
diff --git a/img/parallaxes/BlueSky.png b/img/parallaxes/BlueSky.png
new file mode 100644
index 0000000..509d718
Binary files /dev/null and b/img/parallaxes/BlueSky.png differ
diff --git a/img/parallaxes/Clouds.png b/img/parallaxes/Clouds.png
new file mode 100644
index 0000000..afd749c
Binary files /dev/null and b/img/parallaxes/Clouds.png differ
diff --git a/img/parallaxes/DarkClouds.png b/img/parallaxes/DarkClouds.png
new file mode 100644
index 0000000..81a11ad
Binary files /dev/null and b/img/parallaxes/DarkClouds.png differ
diff --git a/img/parallaxes/DarkSpace.png b/img/parallaxes/DarkSpace.png
new file mode 100644
index 0000000..b3f90a0
Binary files /dev/null and b/img/parallaxes/DarkSpace.png differ
diff --git a/img/parallaxes/Desert.png b/img/parallaxes/Desert.png
new file mode 100644
index 0000000..d66a802
Binary files /dev/null and b/img/parallaxes/Desert.png differ
diff --git a/img/parallaxes/DesertNight.png b/img/parallaxes/DesertNight.png
new file mode 100644
index 0000000..5b0aed7
Binary files /dev/null and b/img/parallaxes/DesertNight.png differ
diff --git a/img/parallaxes/Forest.png b/img/parallaxes/Forest.png
new file mode 100644
index 0000000..600c245
Binary files /dev/null and b/img/parallaxes/Forest.png differ
diff --git a/img/parallaxes/IslandofSky1.png b/img/parallaxes/IslandofSky1.png
new file mode 100644
index 0000000..2a7cc67
Binary files /dev/null and b/img/parallaxes/IslandofSky1.png differ
diff --git a/img/parallaxes/IslandofSky2.png b/img/parallaxes/IslandofSky2.png
new file mode 100644
index 0000000..23d3244
Binary files /dev/null and b/img/parallaxes/IslandofSky2.png differ
diff --git a/img/parallaxes/Lava.png b/img/parallaxes/Lava.png
new file mode 100644
index 0000000..57d0022
Binary files /dev/null and b/img/parallaxes/Lava.png differ
diff --git a/img/parallaxes/Mountains1.png b/img/parallaxes/Mountains1.png
new file mode 100644
index 0000000..1b39a3f
Binary files /dev/null and b/img/parallaxes/Mountains1.png differ
diff --git a/img/parallaxes/Mountains2.png b/img/parallaxes/Mountains2.png
new file mode 100644
index 0000000..80c2770
Binary files /dev/null and b/img/parallaxes/Mountains2.png differ
diff --git a/img/parallaxes/Mountains3.png b/img/parallaxes/Mountains3.png
new file mode 100644
index 0000000..b7e5293
Binary files /dev/null and b/img/parallaxes/Mountains3.png differ
diff --git a/img/parallaxes/Ocean.png b/img/parallaxes/Ocean.png
new file mode 100644
index 0000000..afb0870
Binary files /dev/null and b/img/parallaxes/Ocean.png differ
diff --git a/img/parallaxes/RedSky.png b/img/parallaxes/RedSky.png
new file mode 100644
index 0000000..3f80587
Binary files /dev/null and b/img/parallaxes/RedSky.png differ
diff --git a/img/parallaxes/River.png b/img/parallaxes/River.png
new file mode 100644
index 0000000..a3c3347
Binary files /dev/null and b/img/parallaxes/River.png differ
diff --git a/img/parallaxes/SnowForest.png b/img/parallaxes/SnowForest.png
new file mode 100644
index 0000000..faa121d
Binary files /dev/null and b/img/parallaxes/SnowForest.png differ
diff --git a/img/parallaxes/Space.png b/img/parallaxes/Space.png
new file mode 100644
index 0000000..c2a6843
Binary files /dev/null and b/img/parallaxes/Space.png differ
diff --git a/img/parallaxes/StarlitSky.png b/img/parallaxes/StarlitSky.png
new file mode 100644
index 0000000..57adc1a
Binary files /dev/null and b/img/parallaxes/StarlitSky.png differ
diff --git a/img/parallaxes/Twilight.png b/img/parallaxes/Twilight.png
new file mode 100644
index 0000000..a1bcc62
Binary files /dev/null and b/img/parallaxes/Twilight.png differ
diff --git a/img/parallaxes/Universe.png b/img/parallaxes/Universe.png
new file mode 100644
index 0000000..68602a9
Binary files /dev/null and b/img/parallaxes/Universe.png differ
diff --git a/img/pictures/Actor1_1.png b/img/pictures/Actor1_1.png
new file mode 100644
index 0000000..db6f317
Binary files /dev/null and b/img/pictures/Actor1_1.png differ
diff --git a/img/pictures/Actor1_2.png b/img/pictures/Actor1_2.png
new file mode 100644
index 0000000..2c6a221
Binary files /dev/null and b/img/pictures/Actor1_2.png differ
diff --git a/img/pictures/Actor1_3.png b/img/pictures/Actor1_3.png
new file mode 100644
index 0000000..3c6b8a1
Binary files /dev/null and b/img/pictures/Actor1_3.png differ
diff --git a/img/pictures/Actor1_4.png b/img/pictures/Actor1_4.png
new file mode 100644
index 0000000..227ebc9
Binary files /dev/null and b/img/pictures/Actor1_4.png differ
diff --git a/img/pictures/Actor1_5.png b/img/pictures/Actor1_5.png
new file mode 100644
index 0000000..e0f7612
Binary files /dev/null and b/img/pictures/Actor1_5.png differ
diff --git a/img/pictures/Actor1_6.png b/img/pictures/Actor1_6.png
new file mode 100644
index 0000000..8a23546
Binary files /dev/null and b/img/pictures/Actor1_6.png differ
diff --git a/img/pictures/Actor1_7.png b/img/pictures/Actor1_7.png
new file mode 100644
index 0000000..f9051da
Binary files /dev/null and b/img/pictures/Actor1_7.png differ
diff --git a/img/pictures/Actor1_8.png b/img/pictures/Actor1_8.png
new file mode 100644
index 0000000..96f49ed
Binary files /dev/null and b/img/pictures/Actor1_8.png differ
diff --git a/img/pictures/Actor2_1.png b/img/pictures/Actor2_1.png
new file mode 100644
index 0000000..3e6767d
Binary files /dev/null and b/img/pictures/Actor2_1.png differ
diff --git a/img/pictures/Actor2_2.png b/img/pictures/Actor2_2.png
new file mode 100644
index 0000000..eed9f7f
Binary files /dev/null and b/img/pictures/Actor2_2.png differ
diff --git a/img/pictures/Actor2_3.png b/img/pictures/Actor2_3.png
new file mode 100644
index 0000000..24487e0
Binary files /dev/null and b/img/pictures/Actor2_3.png differ
diff --git a/img/pictures/Actor2_4.png b/img/pictures/Actor2_4.png
new file mode 100644
index 0000000..4d1a2a4
Binary files /dev/null and b/img/pictures/Actor2_4.png differ
diff --git a/img/pictures/Actor2_5.png b/img/pictures/Actor2_5.png
new file mode 100644
index 0000000..b5d6f0a
Binary files /dev/null and b/img/pictures/Actor2_5.png differ
diff --git a/img/pictures/Actor2_6.png b/img/pictures/Actor2_6.png
new file mode 100644
index 0000000..1aef179
Binary files /dev/null and b/img/pictures/Actor2_6.png differ
diff --git a/img/pictures/Actor2_7.png b/img/pictures/Actor2_7.png
new file mode 100644
index 0000000..068bb79
Binary files /dev/null and b/img/pictures/Actor2_7.png differ
diff --git a/img/pictures/Actor2_8.png b/img/pictures/Actor2_8.png
new file mode 100644
index 0000000..78571a7
Binary files /dev/null and b/img/pictures/Actor2_8.png differ
diff --git a/img/pictures/Actor3_1.png b/img/pictures/Actor3_1.png
new file mode 100644
index 0000000..3a6712a
Binary files /dev/null and b/img/pictures/Actor3_1.png differ
diff --git a/img/pictures/Actor3_2.png b/img/pictures/Actor3_2.png
new file mode 100644
index 0000000..aec841b
Binary files /dev/null and b/img/pictures/Actor3_2.png differ
diff --git a/img/pictures/Actor3_3.png b/img/pictures/Actor3_3.png
new file mode 100644
index 0000000..48ff4de
Binary files /dev/null and b/img/pictures/Actor3_3.png differ
diff --git a/img/pictures/Actor3_4.png b/img/pictures/Actor3_4.png
new file mode 100644
index 0000000..c5e4fa8
Binary files /dev/null and b/img/pictures/Actor3_4.png differ
diff --git a/img/pictures/Actor3_5.png b/img/pictures/Actor3_5.png
new file mode 100644
index 0000000..6d1c6bc
Binary files /dev/null and b/img/pictures/Actor3_5.png differ
diff --git a/img/pictures/Actor3_6.png b/img/pictures/Actor3_6.png
new file mode 100644
index 0000000..50703b7
Binary files /dev/null and b/img/pictures/Actor3_6.png differ
diff --git a/img/pictures/Actor3_7.png b/img/pictures/Actor3_7.png
new file mode 100644
index 0000000..e67163d
Binary files /dev/null and b/img/pictures/Actor3_7.png differ
diff --git a/img/pictures/Actor3_8.png b/img/pictures/Actor3_8.png
new file mode 100644
index 0000000..244f41d
Binary files /dev/null and b/img/pictures/Actor3_8.png differ
diff --git a/img/pictures/Evil_1.png b/img/pictures/Evil_1.png
new file mode 100644
index 0000000..0d3195e
Binary files /dev/null and b/img/pictures/Evil_1.png differ
diff --git a/img/pictures/Evil_2.png b/img/pictures/Evil_2.png
new file mode 100644
index 0000000..5184229
Binary files /dev/null and b/img/pictures/Evil_2.png differ
diff --git a/img/pictures/Evil_3.png b/img/pictures/Evil_3.png
new file mode 100644
index 0000000..2bef5e8
Binary files /dev/null and b/img/pictures/Evil_3.png differ
diff --git a/img/pictures/Evil_4.png b/img/pictures/Evil_4.png
new file mode 100644
index 0000000..9ae1612
Binary files /dev/null and b/img/pictures/Evil_4.png differ
diff --git a/img/pictures/Evil_5.png b/img/pictures/Evil_5.png
new file mode 100644
index 0000000..e9a5b0c
Binary files /dev/null and b/img/pictures/Evil_5.png differ
diff --git a/img/pictures/Evil_6.png b/img/pictures/Evil_6.png
new file mode 100644
index 0000000..571ae89
Binary files /dev/null and b/img/pictures/Evil_6.png differ
diff --git a/img/pictures/Evil_7.png b/img/pictures/Evil_7.png
new file mode 100644
index 0000000..f3fe5b1
Binary files /dev/null and b/img/pictures/Evil_7.png differ
diff --git a/img/pictures/Evil_8.png b/img/pictures/Evil_8.png
new file mode 100644
index 0000000..94961ff
Binary files /dev/null and b/img/pictures/Evil_8.png differ
diff --git a/img/pictures/Monster_1.png b/img/pictures/Monster_1.png
new file mode 100644
index 0000000..a67dc88
Binary files /dev/null and b/img/pictures/Monster_1.png differ
diff --git a/img/pictures/Monster_2.png b/img/pictures/Monster_2.png
new file mode 100644
index 0000000..55b2951
Binary files /dev/null and b/img/pictures/Monster_2.png differ
diff --git a/img/pictures/Monster_3.png b/img/pictures/Monster_3.png
new file mode 100644
index 0000000..a098a8d
Binary files /dev/null and b/img/pictures/Monster_3.png differ
diff --git a/img/pictures/Monster_4.png b/img/pictures/Monster_4.png
new file mode 100644
index 0000000..686e3d0
Binary files /dev/null and b/img/pictures/Monster_4.png differ
diff --git a/img/pictures/Monster_5.png b/img/pictures/Monster_5.png
new file mode 100644
index 0000000..61194b6
Binary files /dev/null and b/img/pictures/Monster_5.png differ
diff --git a/img/pictures/Monster_6.png b/img/pictures/Monster_6.png
new file mode 100644
index 0000000..87e6179
Binary files /dev/null and b/img/pictures/Monster_6.png differ
diff --git a/img/pictures/Monster_7.png b/img/pictures/Monster_7.png
new file mode 100644
index 0000000..2928531
Binary files /dev/null and b/img/pictures/Monster_7.png differ
diff --git a/img/pictures/Monster_8.png b/img/pictures/Monster_8.png
new file mode 100644
index 0000000..d54c7ea
Binary files /dev/null and b/img/pictures/Monster_8.png differ
diff --git a/img/pictures/Nature_1.png b/img/pictures/Nature_1.png
new file mode 100644
index 0000000..3f6764e
Binary files /dev/null and b/img/pictures/Nature_1.png differ
diff --git a/img/pictures/Nature_2.png b/img/pictures/Nature_2.png
new file mode 100644
index 0000000..727a8e3
Binary files /dev/null and b/img/pictures/Nature_2.png differ
diff --git a/img/pictures/Nature_3.png b/img/pictures/Nature_3.png
new file mode 100644
index 0000000..93641b5
Binary files /dev/null and b/img/pictures/Nature_3.png differ
diff --git a/img/pictures/Nature_4.png b/img/pictures/Nature_4.png
new file mode 100644
index 0000000..85a3555
Binary files /dev/null and b/img/pictures/Nature_4.png differ
diff --git a/img/pictures/Nature_5.png b/img/pictures/Nature_5.png
new file mode 100644
index 0000000..df1fc36
Binary files /dev/null and b/img/pictures/Nature_5.png differ
diff --git a/img/pictures/Nature_6.png b/img/pictures/Nature_6.png
new file mode 100644
index 0000000..8691408
Binary files /dev/null and b/img/pictures/Nature_6.png differ
diff --git a/img/pictures/Nature_7.png b/img/pictures/Nature_7.png
new file mode 100644
index 0000000..0c0a59b
Binary files /dev/null and b/img/pictures/Nature_7.png differ
diff --git a/img/pictures/Nature_8.png b/img/pictures/Nature_8.png
new file mode 100644
index 0000000..e8ce77c
Binary files /dev/null and b/img/pictures/Nature_8.png differ
diff --git a/img/pictures/People1_1.png b/img/pictures/People1_1.png
new file mode 100644
index 0000000..aa376e2
Binary files /dev/null and b/img/pictures/People1_1.png differ
diff --git a/img/pictures/People1_2.png b/img/pictures/People1_2.png
new file mode 100644
index 0000000..e1a23ce
Binary files /dev/null and b/img/pictures/People1_2.png differ
diff --git a/img/pictures/People1_3.png b/img/pictures/People1_3.png
new file mode 100644
index 0000000..ea60da6
Binary files /dev/null and b/img/pictures/People1_3.png differ
diff --git a/img/pictures/People1_4.png b/img/pictures/People1_4.png
new file mode 100644
index 0000000..9b4d3d6
Binary files /dev/null and b/img/pictures/People1_4.png differ
diff --git a/img/pictures/People1_5.png b/img/pictures/People1_5.png
new file mode 100644
index 0000000..ff2bd27
Binary files /dev/null and b/img/pictures/People1_5.png differ
diff --git a/img/pictures/People1_6.png b/img/pictures/People1_6.png
new file mode 100644
index 0000000..20af0e0
Binary files /dev/null and b/img/pictures/People1_6.png differ
diff --git a/img/pictures/People1_7.png b/img/pictures/People1_7.png
new file mode 100644
index 0000000..e02e182
Binary files /dev/null and b/img/pictures/People1_7.png differ
diff --git a/img/pictures/People1_8.png b/img/pictures/People1_8.png
new file mode 100644
index 0000000..96066e6
Binary files /dev/null and b/img/pictures/People1_8.png differ
diff --git a/img/pictures/People2_1.png b/img/pictures/People2_1.png
new file mode 100644
index 0000000..62bd427
Binary files /dev/null and b/img/pictures/People2_1.png differ
diff --git a/img/pictures/People2_2.png b/img/pictures/People2_2.png
new file mode 100644
index 0000000..24b0f9d
Binary files /dev/null and b/img/pictures/People2_2.png differ
diff --git a/img/pictures/People2_3.png b/img/pictures/People2_3.png
new file mode 100644
index 0000000..3916e8b
Binary files /dev/null and b/img/pictures/People2_3.png differ
diff --git a/img/pictures/People2_4.png b/img/pictures/People2_4.png
new file mode 100644
index 0000000..43eb3fa
Binary files /dev/null and b/img/pictures/People2_4.png differ
diff --git a/img/pictures/People2_5.png b/img/pictures/People2_5.png
new file mode 100644
index 0000000..625c196
Binary files /dev/null and b/img/pictures/People2_5.png differ
diff --git a/img/pictures/People2_6.png b/img/pictures/People2_6.png
new file mode 100644
index 0000000..0433c47
Binary files /dev/null and b/img/pictures/People2_6.png differ
diff --git a/img/pictures/People2_7.png b/img/pictures/People2_7.png
new file mode 100644
index 0000000..a5b7334
Binary files /dev/null and b/img/pictures/People2_7.png differ
diff --git a/img/pictures/People2_8.png b/img/pictures/People2_8.png
new file mode 100644
index 0000000..420ae1a
Binary files /dev/null and b/img/pictures/People2_8.png differ
diff --git a/img/pictures/People3_1.png b/img/pictures/People3_1.png
new file mode 100644
index 0000000..533df62
Binary files /dev/null and b/img/pictures/People3_1.png differ
diff --git a/img/pictures/People3_2.png b/img/pictures/People3_2.png
new file mode 100644
index 0000000..15e80b8
Binary files /dev/null and b/img/pictures/People3_2.png differ
diff --git a/img/pictures/People3_3.png b/img/pictures/People3_3.png
new file mode 100644
index 0000000..7c43fee
Binary files /dev/null and b/img/pictures/People3_3.png differ
diff --git a/img/pictures/People3_4.png b/img/pictures/People3_4.png
new file mode 100644
index 0000000..176451f
Binary files /dev/null and b/img/pictures/People3_4.png differ
diff --git a/img/pictures/People3_5.png b/img/pictures/People3_5.png
new file mode 100644
index 0000000..b4362a0
Binary files /dev/null and b/img/pictures/People3_5.png differ
diff --git a/img/pictures/People3_6.png b/img/pictures/People3_6.png
new file mode 100644
index 0000000..d157cb3
Binary files /dev/null and b/img/pictures/People3_6.png differ
diff --git a/img/pictures/People3_7.png b/img/pictures/People3_7.png
new file mode 100644
index 0000000..ee1b4ea
Binary files /dev/null and b/img/pictures/People3_7.png differ
diff --git a/img/pictures/People3_8.png b/img/pictures/People3_8.png
new file mode 100644
index 0000000..99840c1
Binary files /dev/null and b/img/pictures/People3_8.png differ
diff --git a/img/pictures/People4_1.png b/img/pictures/People4_1.png
new file mode 100644
index 0000000..511813e
Binary files /dev/null and b/img/pictures/People4_1.png differ
diff --git a/img/pictures/People4_2.png b/img/pictures/People4_2.png
new file mode 100644
index 0000000..bf93b64
Binary files /dev/null and b/img/pictures/People4_2.png differ
diff --git a/img/pictures/People4_3.png b/img/pictures/People4_3.png
new file mode 100644
index 0000000..cd82bb0
Binary files /dev/null and b/img/pictures/People4_3.png differ
diff --git a/img/pictures/People4_4.png b/img/pictures/People4_4.png
new file mode 100644
index 0000000..8140eeb
Binary files /dev/null and b/img/pictures/People4_4.png differ
diff --git a/img/pictures/People4_5.png b/img/pictures/People4_5.png
new file mode 100644
index 0000000..7666190
Binary files /dev/null and b/img/pictures/People4_5.png differ
diff --git a/img/pictures/People4_6.png b/img/pictures/People4_6.png
new file mode 100644
index 0000000..877c869
Binary files /dev/null and b/img/pictures/People4_6.png differ
diff --git a/img/pictures/People4_7.png b/img/pictures/People4_7.png
new file mode 100644
index 0000000..fb9d68b
Binary files /dev/null and b/img/pictures/People4_7.png differ
diff --git a/img/pictures/People4_8.png b/img/pictures/People4_8.png
new file mode 100644
index 0000000..b42b328
Binary files /dev/null and b/img/pictures/People4_8.png differ
diff --git a/img/pictures/SF_Actor1_1.png b/img/pictures/SF_Actor1_1.png
new file mode 100644
index 0000000..734b7f1
Binary files /dev/null and b/img/pictures/SF_Actor1_1.png differ
diff --git a/img/pictures/SF_Actor1_2.png b/img/pictures/SF_Actor1_2.png
new file mode 100644
index 0000000..3d1dcda
Binary files /dev/null and b/img/pictures/SF_Actor1_2.png differ
diff --git a/img/pictures/SF_Actor1_3.png b/img/pictures/SF_Actor1_3.png
new file mode 100644
index 0000000..f6b25ce
Binary files /dev/null and b/img/pictures/SF_Actor1_3.png differ
diff --git a/img/pictures/SF_Actor1_4.png b/img/pictures/SF_Actor1_4.png
new file mode 100644
index 0000000..2c4be10
Binary files /dev/null and b/img/pictures/SF_Actor1_4.png differ
diff --git a/img/pictures/SF_Actor1_5.png b/img/pictures/SF_Actor1_5.png
new file mode 100644
index 0000000..ff6b84e
Binary files /dev/null and b/img/pictures/SF_Actor1_5.png differ
diff --git a/img/pictures/SF_Actor1_6.png b/img/pictures/SF_Actor1_6.png
new file mode 100644
index 0000000..501aae6
Binary files /dev/null and b/img/pictures/SF_Actor1_6.png differ
diff --git a/img/pictures/SF_Actor1_7.png b/img/pictures/SF_Actor1_7.png
new file mode 100644
index 0000000..54b39fd
Binary files /dev/null and b/img/pictures/SF_Actor1_7.png differ
diff --git a/img/pictures/SF_Actor1_8.png b/img/pictures/SF_Actor1_8.png
new file mode 100644
index 0000000..f552759
Binary files /dev/null and b/img/pictures/SF_Actor1_8.png differ
diff --git a/img/pictures/SF_Actor2_1.png b/img/pictures/SF_Actor2_1.png
new file mode 100644
index 0000000..f3fa51b
Binary files /dev/null and b/img/pictures/SF_Actor2_1.png differ
diff --git a/img/pictures/SF_Actor2_2.png b/img/pictures/SF_Actor2_2.png
new file mode 100644
index 0000000..0c4321c
Binary files /dev/null and b/img/pictures/SF_Actor2_2.png differ
diff --git a/img/pictures/SF_Actor2_3.png b/img/pictures/SF_Actor2_3.png
new file mode 100644
index 0000000..b27a211
Binary files /dev/null and b/img/pictures/SF_Actor2_3.png differ
diff --git a/img/pictures/SF_Actor2_4.png b/img/pictures/SF_Actor2_4.png
new file mode 100644
index 0000000..b9bb745
Binary files /dev/null and b/img/pictures/SF_Actor2_4.png differ
diff --git a/img/pictures/SF_Actor2_5.png b/img/pictures/SF_Actor2_5.png
new file mode 100644
index 0000000..9afad08
Binary files /dev/null and b/img/pictures/SF_Actor2_5.png differ
diff --git a/img/pictures/SF_Actor2_6.png b/img/pictures/SF_Actor2_6.png
new file mode 100644
index 0000000..75ba76a
Binary files /dev/null and b/img/pictures/SF_Actor2_6.png differ
diff --git a/img/pictures/SF_Actor2_7.png b/img/pictures/SF_Actor2_7.png
new file mode 100644
index 0000000..329e4a4
Binary files /dev/null and b/img/pictures/SF_Actor2_7.png differ
diff --git a/img/pictures/SF_Actor2_8.png b/img/pictures/SF_Actor2_8.png
new file mode 100644
index 0000000..088f23d
Binary files /dev/null and b/img/pictures/SF_Actor2_8.png differ
diff --git a/img/pictures/SF_Actor3_1.png b/img/pictures/SF_Actor3_1.png
new file mode 100644
index 0000000..2a7ee28
Binary files /dev/null and b/img/pictures/SF_Actor3_1.png differ
diff --git a/img/pictures/SF_Actor3_2.png b/img/pictures/SF_Actor3_2.png
new file mode 100644
index 0000000..9368b56
Binary files /dev/null and b/img/pictures/SF_Actor3_2.png differ
diff --git a/img/pictures/SF_Actor3_3.png b/img/pictures/SF_Actor3_3.png
new file mode 100644
index 0000000..0d54df3
Binary files /dev/null and b/img/pictures/SF_Actor3_3.png differ
diff --git a/img/pictures/SF_Actor3_4.png b/img/pictures/SF_Actor3_4.png
new file mode 100644
index 0000000..ad6b4fc
Binary files /dev/null and b/img/pictures/SF_Actor3_4.png differ
diff --git a/img/pictures/SF_Actor3_5.png b/img/pictures/SF_Actor3_5.png
new file mode 100644
index 0000000..572ea85
Binary files /dev/null and b/img/pictures/SF_Actor3_5.png differ
diff --git a/img/pictures/SF_Actor3_6.png b/img/pictures/SF_Actor3_6.png
new file mode 100644
index 0000000..d75320e
Binary files /dev/null and b/img/pictures/SF_Actor3_6.png differ
diff --git a/img/pictures/SF_Actor3_7.png b/img/pictures/SF_Actor3_7.png
new file mode 100644
index 0000000..73ebcfb
Binary files /dev/null and b/img/pictures/SF_Actor3_7.png differ
diff --git a/img/pictures/SF_Actor3_8.png b/img/pictures/SF_Actor3_8.png
new file mode 100644
index 0000000..0338d4b
Binary files /dev/null and b/img/pictures/SF_Actor3_8.png differ
diff --git a/img/pictures/SF_Monster_1.png b/img/pictures/SF_Monster_1.png
new file mode 100644
index 0000000..6aba2ed
Binary files /dev/null and b/img/pictures/SF_Monster_1.png differ
diff --git a/img/pictures/SF_Monster_2.png b/img/pictures/SF_Monster_2.png
new file mode 100644
index 0000000..9211d4e
Binary files /dev/null and b/img/pictures/SF_Monster_2.png differ
diff --git a/img/pictures/SF_Monster_3.png b/img/pictures/SF_Monster_3.png
new file mode 100644
index 0000000..4a4c01d
Binary files /dev/null and b/img/pictures/SF_Monster_3.png differ
diff --git a/img/pictures/SF_Monster_4.png b/img/pictures/SF_Monster_4.png
new file mode 100644
index 0000000..3336298
Binary files /dev/null and b/img/pictures/SF_Monster_4.png differ
diff --git a/img/pictures/SF_Monster_5.png b/img/pictures/SF_Monster_5.png
new file mode 100644
index 0000000..c34f8f6
Binary files /dev/null and b/img/pictures/SF_Monster_5.png differ
diff --git a/img/pictures/SF_Monster_6.png b/img/pictures/SF_Monster_6.png
new file mode 100644
index 0000000..4981a3d
Binary files /dev/null and b/img/pictures/SF_Monster_6.png differ
diff --git a/img/pictures/SF_Monster_7.png b/img/pictures/SF_Monster_7.png
new file mode 100644
index 0000000..1825d97
Binary files /dev/null and b/img/pictures/SF_Monster_7.png differ
diff --git a/img/pictures/SF_Monster_8.png b/img/pictures/SF_Monster_8.png
new file mode 100644
index 0000000..97f36cf
Binary files /dev/null and b/img/pictures/SF_Monster_8.png differ
diff --git a/img/pictures/SF_People1_1.png b/img/pictures/SF_People1_1.png
new file mode 100644
index 0000000..c4de6da
Binary files /dev/null and b/img/pictures/SF_People1_1.png differ
diff --git a/img/pictures/SF_People1_2.png b/img/pictures/SF_People1_2.png
new file mode 100644
index 0000000..f6db343
Binary files /dev/null and b/img/pictures/SF_People1_2.png differ
diff --git a/img/pictures/SF_People1_3.png b/img/pictures/SF_People1_3.png
new file mode 100644
index 0000000..6224e32
Binary files /dev/null and b/img/pictures/SF_People1_3.png differ
diff --git a/img/pictures/SF_People1_4.png b/img/pictures/SF_People1_4.png
new file mode 100644
index 0000000..574ba43
Binary files /dev/null and b/img/pictures/SF_People1_4.png differ
diff --git a/img/pictures/SF_People1_5.png b/img/pictures/SF_People1_5.png
new file mode 100644
index 0000000..9cd7e9e
Binary files /dev/null and b/img/pictures/SF_People1_5.png differ
diff --git a/img/pictures/SF_People1_6.png b/img/pictures/SF_People1_6.png
new file mode 100644
index 0000000..0311025
Binary files /dev/null and b/img/pictures/SF_People1_6.png differ
diff --git a/img/pictures/SF_People1_7.png b/img/pictures/SF_People1_7.png
new file mode 100644
index 0000000..64368e9
Binary files /dev/null and b/img/pictures/SF_People1_7.png differ
diff --git a/img/pictures/SF_People1_8.png b/img/pictures/SF_People1_8.png
new file mode 100644
index 0000000..3cbb966
Binary files /dev/null and b/img/pictures/SF_People1_8.png differ
diff --git a/img/sv_actors/Actor1_1.png b/img/sv_actors/Actor1_1.png
new file mode 100644
index 0000000..8c9d731
Binary files /dev/null and b/img/sv_actors/Actor1_1.png differ
diff --git a/img/sv_actors/Actor1_2.png b/img/sv_actors/Actor1_2.png
new file mode 100644
index 0000000..e876b4c
Binary files /dev/null and b/img/sv_actors/Actor1_2.png differ
diff --git a/img/sv_actors/Actor1_3.png b/img/sv_actors/Actor1_3.png
new file mode 100644
index 0000000..2a1df8b
Binary files /dev/null and b/img/sv_actors/Actor1_3.png differ
diff --git a/img/sv_actors/Actor1_4.png b/img/sv_actors/Actor1_4.png
new file mode 100644
index 0000000..a9359df
Binary files /dev/null and b/img/sv_actors/Actor1_4.png differ
diff --git a/img/sv_actors/Actor1_5.png b/img/sv_actors/Actor1_5.png
new file mode 100644
index 0000000..2ddff4e
Binary files /dev/null and b/img/sv_actors/Actor1_5.png differ
diff --git a/img/sv_actors/Actor1_6.png b/img/sv_actors/Actor1_6.png
new file mode 100644
index 0000000..17ee87f
Binary files /dev/null and b/img/sv_actors/Actor1_6.png differ
diff --git a/img/sv_actors/Actor1_7.png b/img/sv_actors/Actor1_7.png
new file mode 100644
index 0000000..05cc428
Binary files /dev/null and b/img/sv_actors/Actor1_7.png differ
diff --git a/img/sv_actors/Actor1_8.png b/img/sv_actors/Actor1_8.png
new file mode 100644
index 0000000..311693d
Binary files /dev/null and b/img/sv_actors/Actor1_8.png differ
diff --git a/img/sv_actors/Actor2_1.png b/img/sv_actors/Actor2_1.png
new file mode 100644
index 0000000..6996e30
Binary files /dev/null and b/img/sv_actors/Actor2_1.png differ
diff --git a/img/sv_actors/Actor2_2.png b/img/sv_actors/Actor2_2.png
new file mode 100644
index 0000000..b0a3cf5
Binary files /dev/null and b/img/sv_actors/Actor2_2.png differ
diff --git a/img/sv_actors/Actor2_3.png b/img/sv_actors/Actor2_3.png
new file mode 100644
index 0000000..d8ce54f
Binary files /dev/null and b/img/sv_actors/Actor2_3.png differ
diff --git a/img/sv_actors/Actor2_4.png b/img/sv_actors/Actor2_4.png
new file mode 100644
index 0000000..94ec572
Binary files /dev/null and b/img/sv_actors/Actor2_4.png differ
diff --git a/img/sv_actors/Actor2_5.png b/img/sv_actors/Actor2_5.png
new file mode 100644
index 0000000..05fcf10
Binary files /dev/null and b/img/sv_actors/Actor2_5.png differ
diff --git a/img/sv_actors/Actor2_6.png b/img/sv_actors/Actor2_6.png
new file mode 100644
index 0000000..49adcd5
Binary files /dev/null and b/img/sv_actors/Actor2_6.png differ
diff --git a/img/sv_actors/Actor2_7.png b/img/sv_actors/Actor2_7.png
new file mode 100644
index 0000000..1f08408
Binary files /dev/null and b/img/sv_actors/Actor2_7.png differ
diff --git a/img/sv_actors/Actor2_8.png b/img/sv_actors/Actor2_8.png
new file mode 100644
index 0000000..e88e6d0
Binary files /dev/null and b/img/sv_actors/Actor2_8.png differ
diff --git a/img/sv_actors/Actor3_5.png b/img/sv_actors/Actor3_5.png
new file mode 100644
index 0000000..ea0c781
Binary files /dev/null and b/img/sv_actors/Actor3_5.png differ
diff --git a/img/sv_actors/Actor3_6.png b/img/sv_actors/Actor3_6.png
new file mode 100644
index 0000000..b740f7f
Binary files /dev/null and b/img/sv_actors/Actor3_6.png differ
diff --git a/img/sv_actors/Actor3_7.png b/img/sv_actors/Actor3_7.png
new file mode 100644
index 0000000..7c9fbbc
Binary files /dev/null and b/img/sv_actors/Actor3_7.png differ
diff --git a/img/sv_actors/Actor3_8.png b/img/sv_actors/Actor3_8.png
new file mode 100644
index 0000000..3ac5ba9
Binary files /dev/null and b/img/sv_actors/Actor3_8.png differ
diff --git a/img/sv_actors/SF_Actor1_1.png b/img/sv_actors/SF_Actor1_1.png
new file mode 100644
index 0000000..9cc6621
Binary files /dev/null and b/img/sv_actors/SF_Actor1_1.png differ
diff --git a/img/sv_actors/SF_Actor1_2.png b/img/sv_actors/SF_Actor1_2.png
new file mode 100644
index 0000000..f28cbbb
Binary files /dev/null and b/img/sv_actors/SF_Actor1_2.png differ
diff --git a/img/sv_actors/SF_Actor1_3.png b/img/sv_actors/SF_Actor1_3.png
new file mode 100644
index 0000000..8ae77de
Binary files /dev/null and b/img/sv_actors/SF_Actor1_3.png differ
diff --git a/img/sv_actors/SF_Actor1_4.png b/img/sv_actors/SF_Actor1_4.png
new file mode 100644
index 0000000..dce7672
Binary files /dev/null and b/img/sv_actors/SF_Actor1_4.png differ
diff --git a/img/sv_actors/SF_Actor1_5.png b/img/sv_actors/SF_Actor1_5.png
new file mode 100644
index 0000000..40af3e9
Binary files /dev/null and b/img/sv_actors/SF_Actor1_5.png differ
diff --git a/img/sv_actors/SF_Actor1_6.png b/img/sv_actors/SF_Actor1_6.png
new file mode 100644
index 0000000..356e0b4
Binary files /dev/null and b/img/sv_actors/SF_Actor1_6.png differ
diff --git a/img/sv_actors/SF_Actor1_7.png b/img/sv_actors/SF_Actor1_7.png
new file mode 100644
index 0000000..b1220f4
Binary files /dev/null and b/img/sv_actors/SF_Actor1_7.png differ
diff --git a/img/sv_actors/SF_Actor1_8.png b/img/sv_actors/SF_Actor1_8.png
new file mode 100644
index 0000000..66a79a4
Binary files /dev/null and b/img/sv_actors/SF_Actor1_8.png differ
diff --git a/img/sv_actors/SF_Actor2_1.png b/img/sv_actors/SF_Actor2_1.png
new file mode 100644
index 0000000..9b899a5
Binary files /dev/null and b/img/sv_actors/SF_Actor2_1.png differ
diff --git a/img/sv_actors/SF_Actor2_2.png b/img/sv_actors/SF_Actor2_2.png
new file mode 100644
index 0000000..0c702f7
Binary files /dev/null and b/img/sv_actors/SF_Actor2_2.png differ
diff --git a/img/sv_actors/SF_Actor2_3.png b/img/sv_actors/SF_Actor2_3.png
new file mode 100644
index 0000000..c76ea93
Binary files /dev/null and b/img/sv_actors/SF_Actor2_3.png differ
diff --git a/img/sv_actors/SF_Actor2_4.png b/img/sv_actors/SF_Actor2_4.png
new file mode 100644
index 0000000..a4a9eb6
Binary files /dev/null and b/img/sv_actors/SF_Actor2_4.png differ
diff --git a/img/sv_actors/SF_Actor2_5.png b/img/sv_actors/SF_Actor2_5.png
new file mode 100644
index 0000000..346ea58
Binary files /dev/null and b/img/sv_actors/SF_Actor2_5.png differ
diff --git a/img/sv_actors/SF_Actor2_6.png b/img/sv_actors/SF_Actor2_6.png
new file mode 100644
index 0000000..e65010f
Binary files /dev/null and b/img/sv_actors/SF_Actor2_6.png differ
diff --git a/img/sv_actors/SF_Actor2_7.png b/img/sv_actors/SF_Actor2_7.png
new file mode 100644
index 0000000..e031667
Binary files /dev/null and b/img/sv_actors/SF_Actor2_7.png differ
diff --git a/img/sv_actors/SF_Actor2_8.png b/img/sv_actors/SF_Actor2_8.png
new file mode 100644
index 0000000..449b180
Binary files /dev/null and b/img/sv_actors/SF_Actor2_8.png differ
diff --git a/img/sv_actors/SF_Actor3_5.png b/img/sv_actors/SF_Actor3_5.png
new file mode 100644
index 0000000..7db0d7f
Binary files /dev/null and b/img/sv_actors/SF_Actor3_5.png differ
diff --git a/img/sv_actors/SF_Actor3_6.png b/img/sv_actors/SF_Actor3_6.png
new file mode 100644
index 0000000..ecab485
Binary files /dev/null and b/img/sv_actors/SF_Actor3_6.png differ
diff --git a/img/sv_actors/SF_Actor3_7.png b/img/sv_actors/SF_Actor3_7.png
new file mode 100644
index 0000000..966036b
Binary files /dev/null and b/img/sv_actors/SF_Actor3_7.png differ
diff --git a/img/sv_actors/SF_Actor3_8.png b/img/sv_actors/SF_Actor3_8.png
new file mode 100644
index 0000000..8162eee
Binary files /dev/null and b/img/sv_actors/SF_Actor3_8.png differ
diff --git a/img/sv_enemies/Actor1_3.png b/img/sv_enemies/Actor1_3.png
new file mode 100644
index 0000000..3657983
Binary files /dev/null and b/img/sv_enemies/Actor1_3.png differ
diff --git a/img/sv_enemies/Actor1_4.png b/img/sv_enemies/Actor1_4.png
new file mode 100644
index 0000000..390683d
Binary files /dev/null and b/img/sv_enemies/Actor1_4.png differ
diff --git a/img/sv_enemies/Actor1_5.png b/img/sv_enemies/Actor1_5.png
new file mode 100644
index 0000000..8d10f75
Binary files /dev/null and b/img/sv_enemies/Actor1_5.png differ
diff --git a/img/sv_enemies/Actor1_6.png b/img/sv_enemies/Actor1_6.png
new file mode 100644
index 0000000..667b555
Binary files /dev/null and b/img/sv_enemies/Actor1_6.png differ
diff --git a/img/sv_enemies/Actor2_1.png b/img/sv_enemies/Actor2_1.png
new file mode 100644
index 0000000..5d0ed57
Binary files /dev/null and b/img/sv_enemies/Actor2_1.png differ
diff --git a/img/sv_enemies/Actor2_2.png b/img/sv_enemies/Actor2_2.png
new file mode 100644
index 0000000..454957c
Binary files /dev/null and b/img/sv_enemies/Actor2_2.png differ
diff --git a/img/sv_enemies/Actor2_3.png b/img/sv_enemies/Actor2_3.png
new file mode 100644
index 0000000..30a1df2
Binary files /dev/null and b/img/sv_enemies/Actor2_3.png differ
diff --git a/img/sv_enemies/Actor2_4.png b/img/sv_enemies/Actor2_4.png
new file mode 100644
index 0000000..b7e6f4a
Binary files /dev/null and b/img/sv_enemies/Actor2_4.png differ
diff --git a/img/sv_enemies/Actor2_5.png b/img/sv_enemies/Actor2_5.png
new file mode 100644
index 0000000..f4214f1
Binary files /dev/null and b/img/sv_enemies/Actor2_5.png differ
diff --git a/img/sv_enemies/Actor2_6.png b/img/sv_enemies/Actor2_6.png
new file mode 100644
index 0000000..e3f48a7
Binary files /dev/null and b/img/sv_enemies/Actor2_6.png differ
diff --git a/img/sv_enemies/Actor2_7.png b/img/sv_enemies/Actor2_7.png
new file mode 100644
index 0000000..4e57dde
Binary files /dev/null and b/img/sv_enemies/Actor2_7.png differ
diff --git a/img/sv_enemies/Actor3_1.png b/img/sv_enemies/Actor3_1.png
new file mode 100644
index 0000000..c76c7b5
Binary files /dev/null and b/img/sv_enemies/Actor3_1.png differ
diff --git a/img/sv_enemies/Actor3_2.png b/img/sv_enemies/Actor3_2.png
new file mode 100644
index 0000000..804270f
Binary files /dev/null and b/img/sv_enemies/Actor3_2.png differ
diff --git a/img/sv_enemies/Actor3_3.png b/img/sv_enemies/Actor3_3.png
new file mode 100644
index 0000000..f5b73a7
Binary files /dev/null and b/img/sv_enemies/Actor3_3.png differ
diff --git a/img/sv_enemies/Actor3_4.png b/img/sv_enemies/Actor3_4.png
new file mode 100644
index 0000000..a7ee8d3
Binary files /dev/null and b/img/sv_enemies/Actor3_4.png differ
diff --git a/img/sv_enemies/Berserker.png b/img/sv_enemies/Berserker.png
new file mode 100644
index 0000000..f51727c
Binary files /dev/null and b/img/sv_enemies/Berserker.png differ
diff --git a/img/sv_enemies/Birdman.png b/img/sv_enemies/Birdman.png
new file mode 100644
index 0000000..313f2b2
Binary files /dev/null and b/img/sv_enemies/Birdman.png differ
diff --git a/img/sv_enemies/Blackknight.png b/img/sv_enemies/Blackknight.png
new file mode 100644
index 0000000..501632b
Binary files /dev/null and b/img/sv_enemies/Blackknight.png differ
diff --git a/img/sv_enemies/Caitsith.png b/img/sv_enemies/Caitsith.png
new file mode 100644
index 0000000..9a1693d
Binary files /dev/null and b/img/sv_enemies/Caitsith.png differ
diff --git a/img/sv_enemies/Captain.png b/img/sv_enemies/Captain.png
new file mode 100644
index 0000000..42dfc8a
Binary files /dev/null and b/img/sv_enemies/Captain.png differ
diff --git a/img/sv_enemies/Crab.png b/img/sv_enemies/Crab.png
new file mode 100644
index 0000000..ddfe4c5
Binary files /dev/null and b/img/sv_enemies/Crab.png differ
diff --git a/img/sv_enemies/Crow.png b/img/sv_enemies/Crow.png
new file mode 100644
index 0000000..978d089
Binary files /dev/null and b/img/sv_enemies/Crow.png differ
diff --git a/img/sv_enemies/Darkelf.png b/img/sv_enemies/Darkelf.png
new file mode 100644
index 0000000..e1239eb
Binary files /dev/null and b/img/sv_enemies/Darkelf.png differ
diff --git a/img/sv_enemies/Demon.png b/img/sv_enemies/Demon.png
new file mode 100644
index 0000000..1d88781
Binary files /dev/null and b/img/sv_enemies/Demon.png differ
diff --git a/img/sv_enemies/Demon_metamorphosis.png b/img/sv_enemies/Demon_metamorphosis.png
new file mode 100644
index 0000000..387a52f
Binary files /dev/null and b/img/sv_enemies/Demon_metamorphosis.png differ
diff --git a/img/sv_enemies/Demoncount.png b/img/sv_enemies/Demoncount.png
new file mode 100644
index 0000000..2277c27
Binary files /dev/null and b/img/sv_enemies/Demoncount.png differ
diff --git a/img/sv_enemies/Demonpot.png b/img/sv_enemies/Demonpot.png
new file mode 100644
index 0000000..d447a09
Binary files /dev/null and b/img/sv_enemies/Demonpot.png differ
diff --git a/img/sv_enemies/Dragon.png b/img/sv_enemies/Dragon.png
new file mode 100644
index 0000000..7e47f22
Binary files /dev/null and b/img/sv_enemies/Dragon.png differ
diff --git a/img/sv_enemies/Evilbook.png b/img/sv_enemies/Evilbook.png
new file mode 100644
index 0000000..28d0e59
Binary files /dev/null and b/img/sv_enemies/Evilbook.png differ
diff --git a/img/sv_enemies/Evilgod.png b/img/sv_enemies/Evilgod.png
new file mode 100644
index 0000000..b249130
Binary files /dev/null and b/img/sv_enemies/Evilgod.png differ
diff --git a/img/sv_enemies/Foxman.png b/img/sv_enemies/Foxman.png
new file mode 100644
index 0000000..152a518
Binary files /dev/null and b/img/sv_enemies/Foxman.png differ
diff --git a/img/sv_enemies/Frilledlizard.png b/img/sv_enemies/Frilledlizard.png
new file mode 100644
index 0000000..7c8fdb7
Binary files /dev/null and b/img/sv_enemies/Frilledlizard.png differ
diff --git a/img/sv_enemies/Gatekeeper.png b/img/sv_enemies/Gatekeeper.png
new file mode 100644
index 0000000..c266efc
Binary files /dev/null and b/img/sv_enemies/Gatekeeper.png differ
diff --git a/img/sv_enemies/Gnome.png b/img/sv_enemies/Gnome.png
new file mode 100644
index 0000000..61fa2bd
Binary files /dev/null and b/img/sv_enemies/Gnome.png differ
diff --git a/img/sv_enemies/Goblin.png b/img/sv_enemies/Goblin.png
new file mode 100644
index 0000000..bd83ce2
Binary files /dev/null and b/img/sv_enemies/Goblin.png differ
diff --git a/img/sv_enemies/God_of_light.png b/img/sv_enemies/God_of_light.png
new file mode 100644
index 0000000..e602253
Binary files /dev/null and b/img/sv_enemies/God_of_light.png differ
diff --git a/img/sv_enemies/Goddess.png b/img/sv_enemies/Goddess.png
new file mode 100644
index 0000000..90327df
Binary files /dev/null and b/img/sv_enemies/Goddess.png differ
diff --git a/img/sv_enemies/Goddess_of_death.png b/img/sv_enemies/Goddess_of_death.png
new file mode 100644
index 0000000..17d09e4
Binary files /dev/null and b/img/sv_enemies/Goddess_of_death.png differ
diff --git a/img/sv_enemies/Hakutaku.png b/img/sv_enemies/Hakutaku.png
new file mode 100644
index 0000000..264ca81
Binary files /dev/null and b/img/sv_enemies/Hakutaku.png differ
diff --git a/img/sv_enemies/Harpy.png b/img/sv_enemies/Harpy.png
new file mode 100644
index 0000000..324570c
Binary files /dev/null and b/img/sv_enemies/Harpy.png differ
diff --git a/img/sv_enemies/Hi_monster.png b/img/sv_enemies/Hi_monster.png
new file mode 100644
index 0000000..ab4148d
Binary files /dev/null and b/img/sv_enemies/Hi_monster.png differ
diff --git a/img/sv_enemies/Highking.png b/img/sv_enemies/Highking.png
new file mode 100644
index 0000000..81ff69a
Binary files /dev/null and b/img/sv_enemies/Highking.png differ
diff --git a/img/sv_enemies/Hydra.png b/img/sv_enemies/Hydra.png
new file mode 100644
index 0000000..c71f08f
Binary files /dev/null and b/img/sv_enemies/Hydra.png differ
diff --git a/img/sv_enemies/Ketos.png b/img/sv_enemies/Ketos.png
new file mode 100644
index 0000000..79f8826
Binary files /dev/null and b/img/sv_enemies/Ketos.png differ
diff --git a/img/sv_enemies/Kraken.png b/img/sv_enemies/Kraken.png
new file mode 100644
index 0000000..2406eac
Binary files /dev/null and b/img/sv_enemies/Kraken.png differ
diff --git a/img/sv_enemies/Lich.png b/img/sv_enemies/Lich.png
new file mode 100644
index 0000000..bd71329
Binary files /dev/null and b/img/sv_enemies/Lich.png differ
diff --git a/img/sv_enemies/Machinerybee.png b/img/sv_enemies/Machinerybee.png
new file mode 100644
index 0000000..cc3ba33
Binary files /dev/null and b/img/sv_enemies/Machinerybee.png differ
diff --git a/img/sv_enemies/Matango.png b/img/sv_enemies/Matango.png
new file mode 100644
index 0000000..14fed78
Binary files /dev/null and b/img/sv_enemies/Matango.png differ
diff --git a/img/sv_enemies/Mechascorpion.png b/img/sv_enemies/Mechascorpion.png
new file mode 100644
index 0000000..c0dfcf3
Binary files /dev/null and b/img/sv_enemies/Mechascorpion.png differ
diff --git a/img/sv_enemies/Medusa.png b/img/sv_enemies/Medusa.png
new file mode 100644
index 0000000..5d692ce
Binary files /dev/null and b/img/sv_enemies/Medusa.png differ
diff --git a/img/sv_enemies/Mercenary.png b/img/sv_enemies/Mercenary.png
new file mode 100644
index 0000000..f6b8598
Binary files /dev/null and b/img/sv_enemies/Mercenary.png differ
diff --git a/img/sv_enemies/Mimic.png b/img/sv_enemies/Mimic.png
new file mode 100644
index 0000000..557271c
Binary files /dev/null and b/img/sv_enemies/Mimic.png differ
diff --git a/img/sv_enemies/Oddegg.png b/img/sv_enemies/Oddegg.png
new file mode 100644
index 0000000..3aeaa50
Binary files /dev/null and b/img/sv_enemies/Oddegg.png differ
diff --git a/img/sv_enemies/Petitdevil.png b/img/sv_enemies/Petitdevil.png
new file mode 100644
index 0000000..ac3d19e
Binary files /dev/null and b/img/sv_enemies/Petitdevil.png differ
diff --git a/img/sv_enemies/Plasma.png b/img/sv_enemies/Plasma.png
new file mode 100644
index 0000000..f0096a3
Binary files /dev/null and b/img/sv_enemies/Plasma.png differ
diff --git a/img/sv_enemies/SF_Agent.png b/img/sv_enemies/SF_Agent.png
new file mode 100644
index 0000000..354d39c
Binary files /dev/null and b/img/sv_enemies/SF_Agent.png differ
diff --git a/img/sv_enemies/SF_Anaconda.png b/img/sv_enemies/SF_Anaconda.png
new file mode 100644
index 0000000..65bff37
Binary files /dev/null and b/img/sv_enemies/SF_Anaconda.png differ
diff --git a/img/sv_enemies/SF_ArmyGorilla.png b/img/sv_enemies/SF_ArmyGorilla.png
new file mode 100644
index 0000000..5bfe9b1
Binary files /dev/null and b/img/sv_enemies/SF_ArmyGorilla.png differ
diff --git a/img/sv_enemies/SF_Armymonkey.png b/img/sv_enemies/SF_Armymonkey.png
new file mode 100644
index 0000000..910ef5b
Binary files /dev/null and b/img/sv_enemies/SF_Armymonkey.png differ
diff --git a/img/sv_enemies/SF_Blueogre.png b/img/sv_enemies/SF_Blueogre.png
new file mode 100644
index 0000000..5f9009f
Binary files /dev/null and b/img/sv_enemies/SF_Blueogre.png differ
diff --git a/img/sv_enemies/SF_Boss.png b/img/sv_enemies/SF_Boss.png
new file mode 100644
index 0000000..ce44b8c
Binary files /dev/null and b/img/sv_enemies/SF_Boss.png differ
diff --git a/img/sv_enemies/SF_Brownbear.png b/img/sv_enemies/SF_Brownbear.png
new file mode 100644
index 0000000..082ab41
Binary files /dev/null and b/img/sv_enemies/SF_Brownbear.png differ
diff --git a/img/sv_enemies/SF_Cyborg.png b/img/sv_enemies/SF_Cyborg.png
new file mode 100644
index 0000000..a56207f
Binary files /dev/null and b/img/sv_enemies/SF_Cyborg.png differ
diff --git a/img/sv_enemies/SF_Demon_of_universe.png b/img/sv_enemies/SF_Demon_of_universe.png
new file mode 100644
index 0000000..1022dfb
Binary files /dev/null and b/img/sv_enemies/SF_Demon_of_universe.png differ
diff --git a/img/sv_enemies/SF_Drone.png b/img/sv_enemies/SF_Drone.png
new file mode 100644
index 0000000..59325bb
Binary files /dev/null and b/img/sv_enemies/SF_Drone.png differ
diff --git a/img/sv_enemies/SF_Enmadaio.png b/img/sv_enemies/SF_Enmadaio.png
new file mode 100644
index 0000000..3d7a22d
Binary files /dev/null and b/img/sv_enemies/SF_Enmadaio.png differ
diff --git a/img/sv_enemies/SF_Evilteddybear.png b/img/sv_enemies/SF_Evilteddybear.png
new file mode 100644
index 0000000..49c5a17
Binary files /dev/null and b/img/sv_enemies/SF_Evilteddybear.png differ
diff --git a/img/sv_enemies/SF_Hannyamask.png b/img/sv_enemies/SF_Hannyamask.png
new file mode 100644
index 0000000..d7f08b3
Binary files /dev/null and b/img/sv_enemies/SF_Hannyamask.png differ
diff --git a/img/sv_enemies/SF_Hermit.png b/img/sv_enemies/SF_Hermit.png
new file mode 100644
index 0000000..db71e1f
Binary files /dev/null and b/img/sv_enemies/SF_Hermit.png differ
diff --git a/img/sv_enemies/SF_Jiangshi.png b/img/sv_enemies/SF_Jiangshi.png
new file mode 100644
index 0000000..96d5773
Binary files /dev/null and b/img/sv_enemies/SF_Jiangshi.png differ
diff --git a/img/sv_enemies/SF_Kamaitachi.png b/img/sv_enemies/SF_Kamaitachi.png
new file mode 100644
index 0000000..7fb304b
Binary files /dev/null and b/img/sv_enemies/SF_Kamaitachi.png differ
diff --git a/img/sv_enemies/SF_Kappa.png b/img/sv_enemies/SF_Kappa.png
new file mode 100644
index 0000000..273a2bc
Binary files /dev/null and b/img/sv_enemies/SF_Kappa.png differ
diff --git a/img/sv_enemies/SF_Madclown.png b/img/sv_enemies/SF_Madclown.png
new file mode 100644
index 0000000..0a8ae5c
Binary files /dev/null and b/img/sv_enemies/SF_Madclown.png differ
diff --git a/img/sv_enemies/SF_Madscientist.png b/img/sv_enemies/SF_Madscientist.png
new file mode 100644
index 0000000..5e657a9
Binary files /dev/null and b/img/sv_enemies/SF_Madscientist.png differ
diff --git a/img/sv_enemies/SF_Mafia.png b/img/sv_enemies/SF_Mafia.png
new file mode 100644
index 0000000..52a17f3
Binary files /dev/null and b/img/sv_enemies/SF_Mafia.png differ
diff --git a/img/sv_enemies/SF_Mechasphere.png b/img/sv_enemies/SF_Mechasphere.png
new file mode 100644
index 0000000..03add87
Binary files /dev/null and b/img/sv_enemies/SF_Mechasphere.png differ
diff --git a/img/sv_enemies/SF_Phoenix.png b/img/sv_enemies/SF_Phoenix.png
new file mode 100644
index 0000000..d420717
Binary files /dev/null and b/img/sv_enemies/SF_Phoenix.png differ
diff --git a/img/sv_enemies/SF_Redogre.png b/img/sv_enemies/SF_Redogre.png
new file mode 100644
index 0000000..a66c3f1
Binary files /dev/null and b/img/sv_enemies/SF_Redogre.png differ
diff --git a/img/sv_enemies/SF_Securityrobot.png b/img/sv_enemies/SF_Securityrobot.png
new file mode 100644
index 0000000..51179b2
Binary files /dev/null and b/img/sv_enemies/SF_Securityrobot.png differ
diff --git a/img/sv_enemies/SF_Shadow.png b/img/sv_enemies/SF_Shadow.png
new file mode 100644
index 0000000..1cca521
Binary files /dev/null and b/img/sv_enemies/SF_Shadow.png differ
diff --git a/img/sv_enemies/SF_Skullmask.png b/img/sv_enemies/SF_Skullmask.png
new file mode 100644
index 0000000..176e282
Binary files /dev/null and b/img/sv_enemies/SF_Skullmask.png differ
diff --git a/img/sv_enemies/SF_Slaughterrobot.png b/img/sv_enemies/SF_Slaughterrobot.png
new file mode 100644
index 0000000..b963c6c
Binary files /dev/null and b/img/sv_enemies/SF_Slaughterrobot.png differ
diff --git a/img/sv_enemies/SF_Specialforces.png b/img/sv_enemies/SF_Specialforces.png
new file mode 100644
index 0000000..ee210f6
Binary files /dev/null and b/img/sv_enemies/SF_Specialforces.png differ
diff --git a/img/sv_enemies/SF_Talkingmuppet.png b/img/sv_enemies/SF_Talkingmuppet.png
new file mode 100644
index 0000000..e662195
Binary files /dev/null and b/img/sv_enemies/SF_Talkingmuppet.png differ
diff --git a/img/sv_enemies/SF_Timebomb.png b/img/sv_enemies/SF_Timebomb.png
new file mode 100644
index 0000000..5dff5b5
Binary files /dev/null and b/img/sv_enemies/SF_Timebomb.png differ
diff --git a/img/sv_enemies/SF_Whitewolf.png b/img/sv_enemies/SF_Whitewolf.png
new file mode 100644
index 0000000..3a05c0b
Binary files /dev/null and b/img/sv_enemies/SF_Whitewolf.png differ
diff --git a/img/sv_enemies/SF_Will_o_the_wisp.png b/img/sv_enemies/SF_Will_o_the_wisp.png
new file mode 100644
index 0000000..cc15842
Binary files /dev/null and b/img/sv_enemies/SF_Will_o_the_wisp.png differ
diff --git a/img/sv_enemies/SF_Wolf.png b/img/sv_enemies/SF_Wolf.png
new file mode 100644
index 0000000..04ddf89
Binary files /dev/null and b/img/sv_enemies/SF_Wolf.png differ
diff --git a/img/sv_enemies/SF_Workrobot.png b/img/sv_enemies/SF_Workrobot.png
new file mode 100644
index 0000000..0574055
Binary files /dev/null and b/img/sv_enemies/SF_Workrobot.png differ
diff --git a/img/sv_enemies/SF_Zombiedog.png b/img/sv_enemies/SF_Zombiedog.png
new file mode 100644
index 0000000..915cd32
Binary files /dev/null and b/img/sv_enemies/SF_Zombiedog.png differ
diff --git a/img/sv_enemies/Sailor.png b/img/sv_enemies/Sailor.png
new file mode 100644
index 0000000..3e93e99
Binary files /dev/null and b/img/sv_enemies/Sailor.png differ
diff --git a/img/sv_enemies/Salamander.png b/img/sv_enemies/Salamander.png
new file mode 100644
index 0000000..1f704fe
Binary files /dev/null and b/img/sv_enemies/Salamander.png differ
diff --git a/img/sv_enemies/Sandworm.png b/img/sv_enemies/Sandworm.png
new file mode 100644
index 0000000..d0c30b7
Binary files /dev/null and b/img/sv_enemies/Sandworm.png differ
diff --git a/img/sv_enemies/Siren.png b/img/sv_enemies/Siren.png
new file mode 100644
index 0000000..65c7f41
Binary files /dev/null and b/img/sv_enemies/Siren.png differ
diff --git a/img/sv_enemies/Sorcerer.png b/img/sv_enemies/Sorcerer.png
new file mode 100644
index 0000000..c9c7de0
Binary files /dev/null and b/img/sv_enemies/Sorcerer.png differ
diff --git a/img/sv_enemies/Stoneknight.png b/img/sv_enemies/Stoneknight.png
new file mode 100644
index 0000000..fe1435a
Binary files /dev/null and b/img/sv_enemies/Stoneknight.png differ
diff --git a/img/sv_enemies/Sylph.png b/img/sv_enemies/Sylph.png
new file mode 100644
index 0000000..bd7cc98
Binary files /dev/null and b/img/sv_enemies/Sylph.png differ
diff --git a/img/sv_enemies/Tigerbunny.png b/img/sv_enemies/Tigerbunny.png
new file mode 100644
index 0000000..543c6f1
Binary files /dev/null and b/img/sv_enemies/Tigerbunny.png differ
diff --git a/img/sv_enemies/Treant.png b/img/sv_enemies/Treant.png
new file mode 100644
index 0000000..976ba8b
Binary files /dev/null and b/img/sv_enemies/Treant.png differ
diff --git a/img/sv_enemies/Undine.png b/img/sv_enemies/Undine.png
new file mode 100644
index 0000000..17ccda9
Binary files /dev/null and b/img/sv_enemies/Undine.png differ
diff --git a/img/sv_enemies/Unicorn.png b/img/sv_enemies/Unicorn.png
new file mode 100644
index 0000000..6d9acaa
Binary files /dev/null and b/img/sv_enemies/Unicorn.png differ
diff --git a/img/sv_enemies/Witch.png b/img/sv_enemies/Witch.png
new file mode 100644
index 0000000..44d93d2
Binary files /dev/null and b/img/sv_enemies/Witch.png differ
diff --git a/img/sv_enemies/Wolfman.png b/img/sv_enemies/Wolfman.png
new file mode 100644
index 0000000..365a2ed
Binary files /dev/null and b/img/sv_enemies/Wolfman.png differ
diff --git a/img/sv_enemies/Wraith.png b/img/sv_enemies/Wraith.png
new file mode 100644
index 0000000..6c89e29
Binary files /dev/null and b/img/sv_enemies/Wraith.png differ
diff --git a/img/sv_enemies/Zombie.png b/img/sv_enemies/Zombie.png
new file mode 100644
index 0000000..c8efd61
Binary files /dev/null and b/img/sv_enemies/Zombie.png differ
diff --git a/img/system/Balloon.png b/img/system/Balloon.png
new file mode 100644
index 0000000..969069e
Binary files /dev/null and b/img/system/Balloon.png differ
diff --git a/img/system/ButtonSet.png b/img/system/ButtonSet.png
new file mode 100644
index 0000000..954ad7b
Binary files /dev/null and b/img/system/ButtonSet.png differ
diff --git a/img/system/GameOver.png b/img/system/GameOver.png
new file mode 100644
index 0000000..5c19209
Binary files /dev/null and b/img/system/GameOver.png differ
diff --git a/img/system/IconSet.png b/img/system/IconSet.png
new file mode 100644
index 0000000..356ac49
Binary files /dev/null and b/img/system/IconSet.png differ
diff --git a/img/system/Shadow1.png b/img/system/Shadow1.png
new file mode 100644
index 0000000..b3ecae1
Binary files /dev/null and b/img/system/Shadow1.png differ
diff --git a/img/system/Shadow2.png b/img/system/Shadow2.png
new file mode 100644
index 0000000..7de1760
Binary files /dev/null and b/img/system/Shadow2.png differ
diff --git a/img/system/Splash.png b/img/system/Splash.png
new file mode 100644
index 0000000..49eb7ff
Binary files /dev/null and b/img/system/Splash.png differ
diff --git a/img/system/States.png b/img/system/States.png
new file mode 100644
index 0000000..ecc0078
Binary files /dev/null and b/img/system/States.png differ
diff --git a/img/system/Weapons1.png b/img/system/Weapons1.png
new file mode 100644
index 0000000..10da0ba
Binary files /dev/null and b/img/system/Weapons1.png differ
diff --git a/img/system/Weapons2.png b/img/system/Weapons2.png
new file mode 100644
index 0000000..fa5de02
Binary files /dev/null and b/img/system/Weapons2.png differ
diff --git a/img/system/Weapons3.png b/img/system/Weapons3.png
new file mode 100644
index 0000000..cf1af2d
Binary files /dev/null and b/img/system/Weapons3.png differ
diff --git a/img/system/Window.png b/img/system/Window.png
new file mode 100644
index 0000000..084bf62
Binary files /dev/null and b/img/system/Window.png differ
diff --git a/img/tilesets/Dungeon_A1.png b/img/tilesets/Dungeon_A1.png
new file mode 100644
index 0000000..34458d0
Binary files /dev/null and b/img/tilesets/Dungeon_A1.png differ
diff --git a/img/tilesets/Dungeon_A1.txt b/img/tilesets/Dungeon_A1.txt
new file mode 100644
index 0000000..881cd0f
--- /dev/null
+++ b/img/tilesets/Dungeon_A1.txt
@@ -0,0 +1,16 @@
+Water A|水場A
+Deep Water|深い水場
+Swamp Grass|水草
+Lotus Pads (Flowers)|蓮の葉(花)
+Lava|溶岩
+Waterfall A (Lava Cave)|滝A(溶岩洞窟)
+Water B (Grass Maze)|水場B(草迷宮)
+Waterfall B (Grass Maze)|滝B(草迷宮)
+Water C (Dirt Cave)|水場C(土洞窟)
+Waterfall C (Dirt Cave)|滝C(土洞窟)
+Water D (Rock Cave)|水場D(岩洞窟)
+Waterfall D (Rock Cave)|滝D(岩洞窟)
+Water E (Crystal)|水場E(水晶)
+Waterfall E (Crystal)|滝E(水晶)
+Canal|水路
+Waterfall (Stone Wall)|滝F(石壁)
diff --git a/img/tilesets/Dungeon_A2.png b/img/tilesets/Dungeon_A2.png
new file mode 100644
index 0000000..606400e
Binary files /dev/null and b/img/tilesets/Dungeon_A2.png differ
diff --git a/img/tilesets/Dungeon_A2.txt b/img/tilesets/Dungeon_A2.txt
new file mode 100644
index 0000000..1fc02f7
--- /dev/null
+++ b/img/tilesets/Dungeon_A2.txt
@@ -0,0 +1,32 @@
+Ground A (Dirt Cave)|床A(土洞窟)
+Ground B (Grass Maze)|床B(草迷宮)
+Dark Ground A (Dirt Cave)|濃い床A(土洞窟)
+Dark Ground B (Grass Maze)|濃い床B(草迷宮)
+Hole A (Dirt Cave)|穴A(土洞窟)
+Hole B (Grass Maze)|穴B(草迷宮)
+Hole I (Stone Floor)|穴I(石の床)
+Ground Cracks|床のひび割れ
+Ground C (Rock Cave)|床C(岩洞窟)
+Ground D (Crystal)|床D(水晶)
+Dark Ground C (Rock Cave)|濃い床C(岩洞窟)
+Dark Ground D (Crystal)|濃い床D(水晶)
+Hole C (Rock Cave)|穴C(岩洞窟)
+Hole D (Crystal)|穴D(水晶)
+Hole J|穴J
+Soil on Ground|床の汚れ
+Ground E (Lava Cave)|床E(溶岩洞窟)
+Ground F (In Body)|床F(体内)
+Dark Ground E (Lava Cave)|濃い床E(溶岩洞窟)
+Rug A|じゅうたんA
+Hole E (Lava Cave)|穴E(溶岩洞窟)
+Hole F (In Body)|穴F(体内)
+Fencepost|柵
+Moss on Ground|床の苔
+Ground G (Ice Cave)|床G(氷洞窟)
+Ground H (Demonic World)|床H(魔界)
+Dark Ground G (Ice Cave)|濃い床G(氷洞窟)
+Rug B|じゅうたんB
+Hole G (Ice Cave)|穴G(氷洞窟)
+Hole H (Demonic World)|穴H(魔界)
+Raised Stone|石段
+Poison Swamp|毒の沼
diff --git a/img/tilesets/Dungeon_A4.png b/img/tilesets/Dungeon_A4.png
new file mode 100644
index 0000000..1059bc1
Binary files /dev/null and b/img/tilesets/Dungeon_A4.png differ
diff --git a/img/tilesets/Dungeon_A4.txt b/img/tilesets/Dungeon_A4.txt
new file mode 100644
index 0000000..22ef370
--- /dev/null
+++ b/img/tilesets/Dungeon_A4.txt
@@ -0,0 +1,48 @@
+Wall A (Dirt Cave)|壁A(土洞窟)
+Wall B (Rock Cave)|壁B(岩洞窟)
+Wall C (Lava Cave)|壁C(溶岩洞窟)
+Wall D (Ice Cave)|壁D(氷洞窟)
+Wall E (Grass Maze)|壁E(草迷宮)
+Wall F (Crystal)|壁F(水晶)
+Wall G (In Body)|壁G(体内)
+Wall H (Demonic World)|壁H(魔界)
+Wall A (Dirt Cave)|壁A(土洞窟)
+Wall B (Rock Cave)|壁B(岩洞窟)
+Wall C (Lava Cave)|壁C(溶岩洞窟)
+Wall D (Ice Cave)|壁D(氷洞窟)
+Wall E (Grass Maze)|壁E(草迷宮)
+Wall F (Crystal)|壁F(水晶)
+Wall G (In Body)|壁G(体内)
+Wall H (Demonic World)|壁H(魔界)
+Wall I (Stone)|壁I(石)
+Wall J (Brick)|壁J(レンガ)
+Wall K (Stone)|壁K(石)
+Wall L (Marble)|壁L(大理石)
+Wall M (Moss)|壁M(苔)
+Wall N (Castle)|壁N(城)
+Wall O (Fort)|壁O(砦)
+Wall P (Demon Castle)|壁P(魔王城)
+Wall I (Stone)|壁I(石)
+Wall J (Brick)|壁J(レンガ)
+Wall K (Stone)|壁K(石)
+Wall L (Marble)|壁L(大理石)
+Wall M (Moss)|壁M(苔)
+Wall N (Castle)|壁N(城)
+Wall O (Fort)|壁O(砦)
+Wall P (Demon Castle)|壁P(魔王城)
+Wall Q (Mecha)|壁Q(メカ)
+Wall R (Stone)|壁R(石)
+Wall S (Frozen)|壁S(凍結)
+Wall T (Dirt Cave, Gold)|壁T(土洞窟・黄金)
+Ledge A (Dirt Cave)|段差A(土洞窟)
+Ledge B (Rock Cave)|段差B(岩洞窟)
+Ledge C (Lava Cave)|段差C(溶岩洞窟)
+Ledge D (Ice Cave)|段差D(氷洞窟)
+Wall Q (Mecha)|壁Q(メカ)
+Wall R (Stone)|壁R(石)
+Wall S (Frozen)|壁S(凍結)
+Wall T (Dirt Cave, Gold)|壁T(土洞窟・黄金)
+Ledge A (Dirt Cave)|段差A(土洞窟)
+Ledge B (Rock Cave)|段差B(岩洞窟)
+Ledge C (Lava Cave)|段差C(溶岩洞窟)
+Ledge D (Ice Cave)|段差D(氷洞窟)
diff --git a/img/tilesets/Dungeon_A5.png b/img/tilesets/Dungeon_A5.png
new file mode 100644
index 0000000..ccdf9ec
Binary files /dev/null and b/img/tilesets/Dungeon_A5.png differ
diff --git a/img/tilesets/Dungeon_A5.txt b/img/tilesets/Dungeon_A5.txt
new file mode 100644
index 0000000..b4466b8
--- /dev/null
+++ b/img/tilesets/Dungeon_A5.txt
@@ -0,0 +1,128 @@
+Darkness|暗闇
+Floating Floor A (Dirt)|浮かぶ床A(土)
+Floating Floor B (Rock)|浮かぶ床B(岩)
+Translucent Floor A|半透明の床A
+Translucent Floor B|半透明の床B
+Stairs A (Dirt)|階段A(土)
+Stairs B (Translucent)|階段B(半透明)
+Wire Mesh|金網
+Transparent|透明
+Floating Floor A (Dirt)|浮かぶ床A(土)
+Floating Floor B (Rock)|浮かぶ床B(岩)
+Translucent Floor A|半透明の床A
+Translucent Floor B|半透明の床B
+Stairs A (Rock)|階段A(岩)
+Stairs B (Translucent)|階段B(半透明)
+Wire Mesh|金網
+Ground A (Wood)|床A(木製)
+Ground B (Wood)|床B(木製)
+Ground (Wood, Ruins)|床A(木製・廃墟)
+Ground (Wood, Ruins)|床B(木製・廃墟)
+Cobblestones A|石畳A
+Cobblestones B|石畳B
+Cobblestones C|石畳C
+Cobblestones D|石畳D
+Cobblestones E|石畳E
+Decorative Tile A|化粧タイルA
+Decorative Tile B|化粧タイルB
+Interior Floor A|内装床A
+Interior Floor B (Light)|内装床B(明かり)
+Tile Floor A|タイル床A
+Tile Floor B|タイル床B
+Tile Floor C|タイル床C
+Cobblestones F|石畳F
+Ground C (Rock Cave, Red Crystal)|床C(岩洞窟・赤水晶)
+Ground D (Rock Cave, Blue Crystal)|床D(岩洞窟・青水晶)
+Ground E (Rock Cave, Green Crystal)|床E(岩洞窟・緑水晶)
+Ground F (Dirt)|床F(土)
+Ground G (Demon Castle)|床G(魔王城)
+Ground H (Gold)|床H(黄金)
+Ground I (Ice)|床I(氷)
+Stairs A (Dirt Cave, Left)|階段A(土洞窟・左)
+Stairs A (Dirt Cave, Center)|階段A(土洞窟・中央)
+Stairs A (Dirt Cave, Right)|階段A(土洞窟・右)
+Stairs A (Dirt Cave)|階段A(土洞窟)
+Stairs B (Rock Cave, Left)|階段B(岩洞窟・左)
+Stairs B (Rock Cave, Center)|階段B(岩洞窟・中央)
+Stairs B (Rock Cave, Right)|階段B(岩洞窟・右)
+Stairs B (Rock Cave)|階段B(岩洞窟)
+Stairs C (Lava Cave, Left)|階段C(溶岩洞窟・左)
+Stairs C (Lava Cave, Center)|階段C(溶岩洞窟・中央)
+Stairs C (Lava Cave, Right)|階段C(溶岩洞窟・右)
+Stairs C (Lava Cave)|階段C(溶岩洞窟)
+Stairs D (Ice Cave, Left)|階段D(氷洞窟・左)
+Stairs D (Ice Cave, Center)|階段D(氷洞窟・中央)
+Stairs D (Ice Cave, Right)|階段D(氷洞窟・右)
+Stairs D (Ice Cave)|階段D(氷洞窟)
+Stairs E (Grass Maze, Left)|階段E(草迷宮・左)
+Stairs E (Grass Maze, Center)|階段E(草迷宮・中央)
+Stairs E (Grass Maze, Right)|階段E(草迷宮・右)
+Stairs E (Grass Maze)|階段E(草迷宮)
+Stairs F (Crystal, Left)|階段F(水晶・左)
+Stairs F (Crystal, Center)|階段F(水晶・中央)
+Stairs F (Crystal, Right)|階段F(水晶・右)
+Stairs F (Crystal)|階段F(水晶)
+Stairs G (In Body, Left)|階段G(体内・左)
+Stairs G (In Body, Center)|階段G(体内・中央)
+Stairs G (In Body, Right)|階段G(体内・右)
+Stairs G (In Body)|階段G(体内)
+Stairs H (Demonic World, Left)|階段H(魔界・左)
+Stairs H (Demonic World, Center)|階段H(魔界・中央)
+Stairs H (Demonic World, Right)|階段H(魔界・右)
+Stairs H (Demonic World)|階段H(魔界)
+Stairs I (Stone, Left)|階段I(石・左)
+Stairs I (Stone, Center)|階段I(石・中央)
+Stairs I (Stone, Right)|階段I(石・右)
+Stairs I (Stone)|階段I(石)
+Stairs J (Ruins, Left)|階段J(廃墟・左)
+Stairs J (Ruins, Center)|階段J(廃墟・中央)
+Stairs J (Ruins, Right)|階段J(廃墟・右)
+Stairs J (Ruins)|階段J(廃墟)
+Stairs K (Stone, Left)|階段K(石・左)
+Stairs K (Stone, Center)|階段K(石・中央)
+Stairs K (Stone, Right)|階段K(石・右)
+Stairs K (Stone)|階段K(石)
+Stairs L (Ruins, Left)|階段L(廃墟・左)
+Stairs L (Ruins, Center)|階段L(廃墟・中央)
+Stairs L (Ruins, Right)|階段L(廃墟・右)
+Stairs L (Ruins)|階段L(廃墟)
+Ground (Dirt Cave, Ruins)|床A(土洞窟・廃墟)
+Ground (Rock Cave, Ruins)|床B(岩洞窟・廃墟)
+Ground (Lava Cave, Ruins)|床C(溶岩洞窟・廃墟)
+Ground (Ice Cave, Ruins)|床D(氷洞窟・廃墟)
+Ground (Grass Maze, Ruins)|床E(草迷宮・廃墟)
+Ground (Crystal, Ruins)|床F(水晶・廃墟)
+Ground (In Body, Ruins)|床G(体内・廃墟)
+Ground (Demonic World, Ruins)|床H(魔界・廃墟)
+Cobblestones A (Ruins)|石畳A(廃墟)
+Cobblestones B (Ruins)|石畳B(廃墟)
+Cobblestones C (Ruins)|石畳C(廃墟)
+Cobblestones D (Ruins)|石畳D(廃墟)
+Cobblestones E (Ruins)|石畳E(廃墟)
+Decorative Tile A (Ruins)|化粧タイルA(廃墟)
+Decorative Tile B (Ruins)|化粧タイルB(廃墟)
+Interior Floor A (Ruins)|内装床A(廃墟)
+Tile Floor A (Ruins)|タイル床A(廃墟)
+Tile Floor B (Ruins)|タイル床B(廃墟)
+Tile Floor C (Ruins)|タイル床C(廃墟)
+Cobblestones F (Ruins)|石畳F(廃墟)
+Ground F (Dirt, Ruins)|床F(土・廃墟)
+Ground G (Demon Castle, Ruins)|床G(魔王城・廃墟)
+Ground I (Ice, Ruins)|床I(氷・廃墟)
+Relief Floor Tile (Silver)|レリーフ床(銀)
+Large Relief Floor Tile|大きなレリーフ床
+Large Relief Floor Tile|大きなレリーフ床
+Large Relief Floor Tile (Ruins)|大きなレリーフ床(廃墟)
+Large Relief Floor Tile (Ruins)|大きなレリーフ床(廃墟)
+Directional Floor Tile A (Down)|方向床A(下)
+Directional Floor Tile B (Up)|方向床B(上)
+Relief Floor Tile A (Gold)|レリーフ床A(金)
+Relief Floor Tile B (Gold)|レリーフ床B(金)
+Large Relief Floor Tile|大きなレリーフ床
+Large Relief Floor Tile|大きなレリーフ床
+Large Relief Floor Tile (Ruins)|大きなレリーフ床(廃墟)
+Large Relief Floor Tile (Ruins)|大きなレリーフ床(廃墟)
+Directional Floor Tile C (Left)|方向床C(左)
+Directional Floor Tile D (Right)|方向床D(右)
+Relief Floor Tile C (Gold)|レリーフ床C(金)
+Relief Floor Tile D (Gold, Ruins)|レリーフ床D(金・廃墟)
diff --git a/img/tilesets/Dungeon_B.png b/img/tilesets/Dungeon_B.png
new file mode 100644
index 0000000..5033fe0
Binary files /dev/null and b/img/tilesets/Dungeon_B.png differ
diff --git a/img/tilesets/Dungeon_B.txt b/img/tilesets/Dungeon_B.txt
new file mode 100644
index 0000000..c4d2ad4
--- /dev/null
+++ b/img/tilesets/Dungeon_B.txt
@@ -0,0 +1,256 @@
+Transparent|透明
+Wall Moss|壁の苔
+Stairs A (Up)|階段A(上り)
+Stairs B (Up)|階段B(上り)
+Metal Ladder|鉄ばしご
+Wood Ladder|木製はしご
+Rope|ロープ
+Vines A|ツタA
+Fissures A|亀裂A
+Wall Fern|壁のシダ
+Stairs A (Down)|階段A(下り)
+Stairs B (Down)|階段B(下り)
+Metal Ladder|鉄ばしご
+Wood Ladder|木製はしご
+Rope|ロープ
+Vines A|ツタA
+Crumbling Wall|崩れた壁
+Dug-Up Ground|掘られた床
+Stairs C (Up)|階段C(上り)
+Stairs D (Up)|階段D(上り)
+Metal Ladder|鉄ばしご
+Wood Ladder|木製はしご
+Rope|ロープ
+Vines B (Down)|ツタB(下り)
+Crumbling Wall|崩れた壁
+Dug-Up Ground|掘られた床
+Stairs C (Down)|階段C(下り)
+Stairs D (Down)|階段D(下り)
+Hole A (Metal Ladder)|穴A(鉄ばしご)
+Hole B (Wood Ladder)|穴B(木製はしご)
+Hole C (Rope)|穴C(ロープ)
+Hole D|穴D
+Gravel A (Dirt Cave)|砂利A(土洞窟)
+Gravel B (Rock Cave)|砂利B(岩洞窟)
+Gravel C (Lava Cave)|砂利C(溶岩洞窟)
+Ice Pieces |氷の欠片
+Small Sprouts A (Grass Maze)|小さな芽A(草迷宮)
+Small Crystals|小さな水晶
+Detritus (In Body)|床装飾(体内)
+Small Sprouts B (Demonic World)|小さな芽B(魔界)
+Boulder A (Dirt Cave)|岩A(土洞窟)
+Boulder B (Rock Cave)|岩B(岩洞窟)
+Boulder C (Lava Cave)|岩C(溶岩洞窟)
+Lump of Ice|氷塊
+Boulder D (Grass Maze)|岩D(草迷宮)
+Crystal|水晶
+Spherical Lump|球状突起物
+Boulder E (Demonic World)|岩E(魔界)
+Tall Rock A (Dirt Cave)|大きな岩A(土洞窟)
+Tall Rock B (Rock Cave)|大きな岩B(岩洞窟)
+Tall Rock C (Lava Cave)|大きな岩C(溶岩洞窟)
+Tall Lump of Ice|大きな氷塊
+Tall Rock D (Grass Maze)|大きな岩D(草迷宮)
+Large Crystal|大きな水晶
+Large Growth|大型突起物
+Tall Rock E (Demonic World)|大きな岩E(魔界)
+Tall Rock A (Dirt Cave)|大きな岩A(土洞窟)
+Tall Rock B (Rock Cave)|大きな岩B(岩洞窟)
+Tall Rock C (Lava Cave)|大きな岩C(溶岩洞窟)
+Tall Lump of Ice|大きな氷塊
+Tall Rock D (Grass Maze)|大きな岩D(草迷宮)
+Large Crystal|大きな水晶
+Large Growth|大型突起物
+Tall Rock E (Demonic World)|大きな岩E(魔界)
+Monument A|石碑A
+Monument B|石碑B
+Large Monument|大きな石碑
+Large Monument|大きな石碑
+Large Monument|大きな石碑
+Large Monument (Light)|大きな石碑(光)
+Large Monument (Light)|大きな石碑(光)
+Large Monument (Light)|大きな石碑(光)
+Monument A|石碑A
+Monument C|石碑C
+Large Monument|大きな石碑
+Large Monument|大きな石碑
+Large Monument|大きな石碑
+Large Monument (Light)|大きな石碑(光)
+Large Monument (Light)|大きな石碑(光)
+Large Monument (Light)|大きな石碑(光)
+Statue|石像
+Angel Statue|天使像
+Goddess Statue|女神像
+Dais|台座
+God Statue|神像
+Demon Statue|悪魔像
+Dragon Statue|竜像
+Dragon Statue|竜像
+Statue|石像
+Angel Statue|天使像
+Goddess Statue|女神像
+Broken Statue|壊れた像
+God Statue|神像
+Demon Statue|悪魔像
+Dragon Statue|竜像
+Dragon Statue|竜像
+Obelisk|オベリスク
+Stone Pillar A|石の柱A
+Stone Pillar B|石の柱B
+Stone Pillar B (Moss)|石の柱B(苔)
+Stone Pillar B (Ice)|石の柱B(氷)
+Stone Pillar C|石の柱C
+Stone Pillar D|石の柱D
+Orb Pillar|オーブの柱
+Obelisk|オベリスク
+Stone Pillar A|石の柱A
+Stone Pillar B|石の柱B
+Stone Pillar B (Moss)|石の柱B(苔)
+Stone Pillar B (Ice)|石の柱B(氷)
+Stone Pillar C|石の柱C
+Stone Pillar D|石の柱D
+Orb Pillar|オーブの柱
+Obelisk|オベリスク
+Broken Stone Pillar A|折れた石の柱A
+Broken Stone Pillar B|折れた石の柱B
+Broken Stone Pillar B (Moss)|折れた石の柱B(苔)
+Broken Stone Pillar B (Ice)|折れた石の柱B(氷)
+Stone Pillar C|石の柱C
+Broken Stone Pillar D|折れた石の柱D
+Broken Orb Pillar|折れたオーブの柱
+Rubble|瓦礫A
+Rubble (Moss)|瓦礫B(苔)
+Rubble (Ice)|瓦礫C(氷)
+Broken Stone Pillar C|折れた石の柱C
+Rubble (Dirt)|瓦礫D(土)
+Scrap Wood|端材
+Barricade A (H)|バリケードA(横)
+Barricade B (V)|バリケードB(縦)
+Wall Bracing|壁の補強材
+Wall Bracing|壁の補強材
+Wall Bracing|壁の補強材
+Wall Bracing|壁の補強材
+Wall Bracing|壁の補強材
+Wall Bracing (Abandoned Mine)|壁の補強材(廃坑)
+Wall Bracing (Abandoned Mine)|壁の補強材(廃坑)
+Wall Bracing (Abandoned Mine)|壁の補強材(廃坑)
+Wall Bracing|壁の補強材
+Wall Bracing|壁の補強材
+Wall Bracing|壁の補強材
+Wall Bracing|壁の補強材
+Wall Bracing|壁の補強材
+Wall Bracing (Abandoned Mine)|壁の補強材(廃坑)
+Wall Bracing (Abandoned Mine)|壁の補強材(廃坑)
+Wall Bracing (Abandoned Mine)|壁の補強材(廃坑)
+Log Bridge (V)|丸太の橋(縦)
+Log Bridge (H)|丸太の橋(横)
+Wood Bridge (V)|木の橋(縦)
+Wood Bridge (H)|木の橋(横)
+Stone Bridge (V)|石の橋(縦)
+Stone Bridge (H)|石の橋(横)
+Wood Bridge (V)|木の橋(縦)
+Wood Bridge (H)|木の橋(横)
+Bridge Spar (Wood, Center A)|橋げた(木・中央A)
+Bridge Spar (Wood, Left)|橋げた(木・左)
+Bridge Spar (Wood, Center B)|橋げた(木・中央B)
+Bridge Spar (Wood, Right)|橋げた(木・右)
+Bridge Spar (Stone, Center A)|橋げた(石・中央A)
+Bridge Spar (Stone, Left)|橋げた(石・左)
+Bridge Spar (Stone, Center B)||橋げた(石・中央B)
+Bridge Spar (Stone, Right)|橋げた(石・右)
+Exit A|外への出口A
+Entrance A|入口A
+Exit B|外への出口B
+Entrance B|入口B
+Exit C|外への出口C
+Entrance C|入口C
+Window A|窓A
+Window B|窓B
+Exit D|外への出口D
+Entrance D|入口D
+Exit E|外への出口E
+Entrance E|入口E
+Light From Exit A (Top)|出口からの光A(上)
+Light From Exit B (Bottom)|出口からの光B(下)
+Window A|窓A
+Window B|窓B
+Spider Web|蜘蛛の巣
+Stone Tablet|石版
+Stone Tablet (Ruins)|石版(廃墟)
+Entrance A|入口A
+Entrance A (Extend)|入口A(延長部分)
+Entrance A (Top Half A)|入口A(上半分A)
+Entrance B|入口B
+Entrance A (Top Half B)|入口A(上半分B)
+Wall Vines A|壁のツタA
+Wall Vines B|壁のツタB
+Wall Vines C|壁のツタC
+Fissures B|亀裂B
+Fissures C|亀裂C
+Fissures D|亀裂D
+Fissures E|亀裂E
+Beanstalk A|豆の木A
+Wall Vines A|壁のツタA
+Wall Vines B|壁のツタB
+Wall Vines C|壁のツタC
+Fissures B|亀裂B
+Fissures C|亀裂C
+Fissures D|亀裂D
+Beanstalk B (Snow)|豆の木B(雪)
+Beanstalk C (Dead)|豆の木C(枯れ)
+Large Gravel Mound A (Dirt)|大きな土砂A(土)
+Large Gravel Mound A (Dirt)|大きな土砂A(土)
+Large Gravel Mound B (Stone)|大きな土砂B(石)
+Large Gravel Mound B (Stone)|大きな土砂B(石)
+Large Gold Mound|大きな金の山
+Large Gold Mound|大きな金の山
+Large Silver Mound|大きな銀の山
+Large Silver Mound|大きな銀の山
+Large Gravel Mound A (Dirt)|大きな土砂A(土)
+Large Gravel Mound A (Dirt)|大きな土砂A(土)
+Large Gravel Mound B (Stone)|大きな土砂B(石)
+Large Gravel Mound B (Stone)|大きな土砂B(石)
+Large Gold Mound|大きな金の山
+Large Gold Mound|大きな金の山
+Large Silver Mound|大きな銀の山
+Large Silver Mound|大きな銀の山
+Gravel Mound (Dirt)|土砂A(土)
+Gravel Mound (Stone)|土砂B(石)
+Gold Bricks A|金の延べ棒A
+Gold Bricks B|金の延べ棒B
+Crate A (Dirt)|木箱A(土)
+Crate B (Stone)|木箱B(石)
+Crate C (Ruins)|木箱C(廃墟)
+Pot A (Ruins)|壺A(廃墟)
+Gold Mound|金の山
+Silver Mound|銀の山
+Silver Bricks A|銀の延べ棒A
+Silver Bricks B|銀の延べ棒B
+Crate D (Gold Dust)|木箱D(金)
+Crate E (Silver Dust)|木箱E(銀)
+Pot A|壺A
+Pot B|壺B
+Shovel|スコップ
+Pickax|つるはし
+Rope|ロープ
+Mound of Gold Coins|金貨の山
+Crate F|木箱F
+Crate G|木箱G
+Barrel A|樽A
+Barrel B (Ruins)|樽B(廃墟)
+Large Bones|大きな骸骨
+Large Bones|大きな骸骨
+Bones A|骸骨A
+Table (Ruins)|テーブル(廃墟)
+Jail Bars|鉄格子
+Jail Bars|鉄格子
+Jail Bars|鉄格子
+Jail Bars|鉄格子
+Large Bones|大きな骸骨
+Large Bones|大きな骸骨
+Bones B|骸骨B
+Stool (Ruins)|椅子(廃墟)
+Jail Bars|鉄格子
+Jail Bars|鉄格子
+Jail Bars|鉄格子
+Jail Bars|鉄格子
diff --git a/img/tilesets/Dungeon_C.png b/img/tilesets/Dungeon_C.png
new file mode 100644
index 0000000..6f11904
Binary files /dev/null and b/img/tilesets/Dungeon_C.png differ
diff --git a/img/tilesets/Dungeon_C.txt b/img/tilesets/Dungeon_C.txt
new file mode 100644
index 0000000..143e6ff
--- /dev/null
+++ b/img/tilesets/Dungeon_C.txt
@@ -0,0 +1,256 @@
+Decorative Pillar A (Stone)|装飾柱A(石)
+Decorative Pillar B (Stone)|装飾柱B(石)
+Decorative Pillar C (Temple)|装飾柱C(遺跡)
+Decorative Pillar D (Rock Cave)|装飾柱D(岩洞窟)
+Decorative Pillar E (Demon Castle)|装飾柱E(魔王城)
+Decorative Pillar F (Fort)|装飾柱F(砦)
+Decorative Pillar G (Dirt Cave)|装飾柱G(土洞窟)
+Decorative Pillar H (Factory)|装飾柱H(工場)
+Decorative Pillar A (Stone)|装飾柱A(石)
+Decorative Pillar B (Stone)|装飾柱B(石)
+Decorative Pillar C (Temple)|装飾柱C(遺跡)
+Decorative Pillar D (Rock Cave)|装飾柱D(岩洞窟)
+Decorative Pillar E (Demon Castle)|装飾柱E(魔王城)
+Decorative Pillar F (Fort)|装飾柱F(砦)
+Decorative Pillar G (Dirt Cave)|装飾柱G(土洞窟)
+Decorative Pillar H (Factory)|装飾柱H(工場)
+Decorative Pillar A (Stone)|装飾柱A(石)
+Decorative Pillar B (Stone)|装飾柱B(石)
+Decorative Pillar C (Temple)|装飾柱C(遺跡)
+Decorative Pillar D (Rock Cave)|装飾柱D(岩洞窟)
+Decorative Pillar E (Demon Castle)|装飾柱E(魔王城)
+Decorative Pillar F (Fort)|装飾柱F(砦)
+Decorative Pillar G (Dirt Cave)|装飾柱G(土洞窟)
+Decorative Pillar H (Factory)|装飾柱H(工場)
+Decorative Pillar A (Stone, Ruins)|装飾柱A(石・廃墟)
+Decorative Pillar B (Stone, Ruins)|装飾柱B(石・廃墟)
+Decorative Pillar C (Temple, Ruins)|装飾柱C(遺跡・廃墟)
+Decorative Pillar D (Rock Cave, Ruins)|装飾柱D(岩洞窟・廃墟)
+Decorative Pillar E (Demon Castle, Ruins)|装飾柱E(魔王城・廃墟)
+Decorative Pillar F (Fort, Ruins)|装飾柱F(砦・廃墟)
+Decorative Pillar G (Dirt Cave, Ruins)|装飾柱G(土洞窟・廃墟)
+Decorative Pillar A (Stone, Front, Ruins)|装飾柱A(石・手前・廃墟)
+Decorative Pillar A (Stone, Ruins)|装飾柱A(石・廃墟)
+Decorative Pillar B (Stone, Ruins)|装飾柱B(石・廃墟)
+Decorative Pillar C (Temple, Ruins)|装飾柱C(遺跡・廃墟)
+Decorative Pillar D (Rock Cave, Ruins)|装飾柱D(岩洞窟・廃墟)
+Decorative Pillar E (Demon Castle, Ruins)|装飾柱E(魔王城・廃墟)
+Decorative Pillar F (Fort, Ruins)|装飾柱F(砦・廃墟)
+Decorative Pillar G (Dirt Cave, Ruins)|装飾柱G(土洞窟・廃墟)
+Decorative Pillar D (Rock Cave, Front, Ruins)|装飾柱F(岩洞窟・手前・廃墟)
+Decorative Pillar A (Stone, Ruins)|装飾柱A(石・廃墟)
+Decorative Pillar B (Stone, Ruins)|装飾柱B(石・廃墟)
+Decorative Pillar C (Temple, Ruins)|装飾柱C(遺跡・廃墟)
+Decorative Pillar D (Rock Cave, Ruins)|装飾柱D(岩洞窟・廃墟)
+Decorative Pillar E (Demon Castle, Ruins)|装飾柱E(魔王城・廃墟)
+Decorative Pillar F (Fort, Ruins)|装飾柱F(砦・廃墟)
+Decorative Pillar G (Dirt Cave, Ruins)|装飾柱G(土洞窟・廃墟)
+Decorative Pillar F (Fort, Front, Ruins)|装飾柱F(砦・手前・廃墟)
+Decorative Pillar A (Stone, Front)|装飾柱A(石・手前)
+Decorative Pillar B (Stone, Front)|装飾柱B(石・手前)
+Decorative Pillar C (Temple, Front)|装飾柱C(神殿・手前)
+Decorative Pillar D (Rock Cave, Front)|装飾柱D(岩洞窟・手前)
+Decorative Pillar E (Demon Castle, Front)|装飾柱E(魔王城・手前)
+Decorative Pillar F (Fort, Front)|装飾柱F(砦・手前)
+Decorative Pillar G (Dirt Cave, Front)|装飾柱G(土洞窟・手前)
+Decorative Pillar H (Factory, Front)|装飾柱H(工場・手前)
+Gate A|門A
+Gate A|門A
+Gate A|門A
+Gate B|門B
+Gate B|門B
+Gate B|門B
+Decorative Pillar I (Demonic)|装飾柱I(悪魔)
+Decorative Pillar I (Demonic, Ruins)|装飾柱I(悪魔・廃墟)
+Gate A|門A
+Gate A|門A
+Gate A|門A
+Gate B|門B
+Gate B|門B
+Gate B|門B
+Decorative Pillar I (Demonic)|装飾柱I(悪魔)
+Decorative Pillar I (Demonic, Ruins)|装飾柱I(悪魔・廃墟)
+Gate A|門A
+Gate A|門A
+Gate A|門A
+Gate B|門B
+Gate B|門B
+Gate B|門B
+Coffin A (Right)|棺A(右)
+Coffin A (Right)|棺A(右)
+Hexagram|魔法陣
+Hexagram|魔法陣
+Hexagram|魔法陣
+Hexagram (Lit)|魔法陣(光)
+Hexagram (Lit)|魔法陣(光)
+Hexagram (Lit)|魔法陣(光)
+Coffin B (Top)|棺B(上)
+Coffin C (Bottom)|棺C(下)
+Hexagram|魔法陣
+Hexagram|魔法陣
+Hexagram|魔法陣
+Hexagram (Lit)|魔法陣(光)
+Hexagram (Lit)|魔法陣(光)
+Hexagram (Lit)|魔法陣(光)
+Coffin B (Top)|棺B(上)
+Coffin C (Bottom)|棺C(下)
+Hexagram|魔法陣
+Hexagram|魔法陣
+Hexagram|魔法陣
+Hexagram (Lit)|魔法陣(光)
+Hexagram (Lit)|魔法陣(光)
+Hexagram (Lit)|魔法陣(光)
+Coffin D (Left)|棺D(左)
+Coffin D (Left)|棺D(左)
+Rails|線路
+Rails|線路
+Rails|線路
+Rails|線路
+Rails (Ruins)|線路(廃墟)
+Rails (Ruins)|線路(廃墟)
+Rails (Ruins)|線路(廃墟)
+Rails (Ruins)|線路(廃墟)
+Rails|線路
+Railroad Ties A|枕木A
+Rails|線路
+Rails|線路
+Rails|線路
+Rails|線路
+Rails|線路
+Rails|線路
+Rails|線路
+Railroad Ties B|枕木B
+Rails|線路
+Rails|線路
+Rails|線路
+Rails|線路
+Rails|線路
+Rails|線路
+Mural A|壁画A
+Hieroglyph|ヒエログリフ
+Hieroglyph|ヒエログリフ
+Large Mural A|大きな壁画A
+Large Mural A|大きな壁画A
+Large Mural A|大きな壁画A
+Bed|ベッド
+Bed (Ruins)|ベッド(廃墟)
+Mural B|壁画B
+Hieroglyph|ヒエログリフ
+Hieroglyph|ヒエログリフ
+Large Mural B|大きな壁画B
+Large Mural B|大きな壁画B
+Large Mural B|大きな壁画B
+Bed|ベッド
+Bed (Ruins)|ベッド(廃墟)
+Middle Window A|中型窓A
+Middle Window B|中型窓B
+Middle Window C|中型窓C
+Middle Window D (Ruins)|中型窓窓D(廃墟)
+Window (Demon Castle)|窓(魔王城)
+Table|テーブル
+Cheap Bed|粗末なベッド
+Straw Bed|むしろの寝床
+Middle Window A|中型窓A
+Middle Window B|中型窓B
+Middle Window C|中型窓C
+Middle Window D (Ruins)|中型窓窓D(廃墟)
+Window (Demon Castle)|窓(魔王城)
+Stool|椅子
+Cheap Bed|粗末なベッド
+Straw Bed|むしろの寝床
+Large Window A|大型窓A
+Large Window B|大型窓B
+Large Window C|大型窓C
+Stained Glass Window|ステンドグラス
+Large Window D|大型窓D
+Window A|窓A
+Window B|窓B
+Window C|窓C
+Large Window A|大型窓A
+Large Window B|大型窓B
+Large Window C|大型窓C
+Stained Glass Window|ステンドグラス
+Large Window D|大型窓D
+Window A|窓A
+Window B|窓B
+Window C|窓C
+Chest A|チェストA
+Cabinet|キャビネット
+Closet|クローゼット
+Chest of Drawers|タンス
+Dish Cabinet|食器棚
+Wine Rack|ワインセラー
+Bottle Shelf A|ボトル棚A
+Bottle Shelf B|ボトル棚B
+Chest B|チェストB
+Chest C|チェストC
+Closet|クローゼット
+Chest of Drawers|タンス
+Dish Cabinet|食器棚
+Wine Rack|ワインセラー
+Bottle Shelf A|ボトル棚A
+Bottle Shelf B|ボトル棚B
+Tipped Shelf|倒れた棚
+Sundries Shelf A|雑貨棚A
+Sundries Shelf A|雑貨棚A
+Sundries Shelf B|雑貨棚B
+Medicine Shelf|薬品棚
+Bookshelf A|本棚A
+Bookshelf B|本棚B
+Bookshelf B|本棚B
+Tipped Shelf|倒れた棚
+Sundries Shelf A|雑貨棚A
+Sundries Shelf A|雑貨棚A
+Sundries Shelf B|雑貨棚B
+Medicine Shelf|薬品棚
+Bookshelf A|本棚A
+Bookshelf B|本棚B
+Bookshelf B|本棚B
+Curtains A|カーテンA
+Curtains B|カーテンB
+Curtains C|カーテンC
+Curtains D|カーテンD
+Curtains A (Ruins)|カーテンA(廃墟)
+Curtains B (Ruins)|カーテンB(廃墟)
+Curtains C (Ruins)|カーテンC(廃墟)
+Curtains D (Ruins)|カーテンD(廃墟)
+Curtains A|カーテンA
+Curtains B|カーテンB
+Curtains C|カーテンC
+Curtains D|カーテンD
+Curtains A (Ruins)|カーテンA(廃墟)
+Curtains B (Ruins)|カーテンB(廃墟)
+Curtains C (Ruins)|カーテンC(廃墟)
+Curtains D (Ruins)|カーテンD(廃墟)
+Clock|時計
+Mirror|鏡
+Clock (Ruins)|時計(廃墟)
+Mirror (Ruins)|鏡(廃墟)
+Stacked Crates|積まれた木箱
+Stacked Crates|積まれた木箱
+Tapestry A|タペストリーA
+Tapestry A (Ruins)|タペストリーA(廃墟)
+Clock|時計
+Mirror|鏡
+Clock (Ruins)|時計(廃墟)
+Mirror (Ruins)|鏡(廃墟)
+Stacked Crates|積まれた木箱
+Stacked Crates|積まれた木箱
+Tapestry A|タペストリーA
+Tapestry A (Ruins)|タペストリーA(廃墟)
+Chair A (Wood)|背もたれ椅子A(木製)
+Chair B (Stone)|背もたれ椅子B(石)
+Throne A|玉座A
+Throne A|玉座A
+Throne A|玉座A
+Throne B (Demon Castle)|玉座B(魔王城)
+Throne B (Demon Castle)|玉座B(魔王城)
+Throne B (Demon Castle)|玉座B(魔王城)
+Chair A (Wood)|背もたれ椅子A(木製)
+Chair B (Stone)|背もたれ椅子B(石)
+Throne A|玉座A
+Throne A|玉座A
+Throne A|玉座A
+Throne B (Demon Castle)|玉座B(魔王城)
+Throne B (Demon Castle)|玉座B(魔王城)
+Throne B (Demon Castle)|玉座B(魔王城)
diff --git a/img/tilesets/Inside_A1.png b/img/tilesets/Inside_A1.png
new file mode 100644
index 0000000..1d96a60
Binary files /dev/null and b/img/tilesets/Inside_A1.png differ
diff --git a/img/tilesets/Inside_A1.txt b/img/tilesets/Inside_A1.txt
new file mode 100644
index 0000000..297a5a2
--- /dev/null
+++ b/img/tilesets/Inside_A1.txt
@@ -0,0 +1,16 @@
+Water A|水場A
+Deep Water|深い水場
+Lotus Pads (Flowers)|蓮の葉(花)
+Purple Water|紫の水
+Water B (Surround Stonewall)|水場B(囲み石壁)
+Waterfall A (Shine Fall)|滝A(光る滝)
+Pond A (Rock Pond)|池A(岩池)
+Waterfall B (Grid Fall)|滝B(マス目滝)
+Water C (Tile)|水場C(タイル)
+Water D (Small Hole)|水場D(小穴)
+Water E (Water Surface)|水場E(水面)
+Water F (Water Footing)|水場F(足場)
+Water G (Surround Waterwall)|水場G(囲み水壁)
+Water H (Big Hole)|水場H(大穴)
+Pond B (Purple Rock Pond)|池B(紫岩池)
+Waterfall C (Purple Fall)|滝C(紫滝)
\ No newline at end of file
diff --git a/img/tilesets/Inside_A2.png b/img/tilesets/Inside_A2.png
new file mode 100644
index 0000000..0077a4f
Binary files /dev/null and b/img/tilesets/Inside_A2.png differ
diff --git a/img/tilesets/Inside_A2.txt b/img/tilesets/Inside_A2.txt
new file mode 100644
index 0000000..bffe0c8
--- /dev/null
+++ b/img/tilesets/Inside_A2.txt
@@ -0,0 +1,32 @@
+Ground A (Wood Floor Stripe)|床A(木目縦床)
+Ground B (Stone Floor Tile)|床B(石タイル床)
+Ground C (Dirt Floor)|床C(土床)
+Tatami|畳
+Hole A (Orange Cave)|穴A(オレンジ)
+Raised Stone A (Blue)|石段(青)
+Ground D (Black Floor)|床D(黒床)
+Table A (Wood)|テーブルA(木製)
+Ground E (Wood Floor Border)|床E(木目横床)
+Ground F (Stone Floor Brick)|床F(石レンガ床)
+Rug A (Red Flower)|じゅうたんA(赤花じゅうたん)
+Rug B (Oriental Green)|じゅうたんB(オリエント緑じゅうたん)
+Hole B (Brown Cave)|穴B(茶色)
+Raised Stone B (Purple)|石段(紫)
+Ground G (Dark Enclave Floor)|床G(暗い飛び地)
+Table B (Dark Wood)|テーブルB(濃い木製)
+Ground H (Wood Floor Lattice)|床H(木格子)
+Ground I (Stone Floor Color Tile)|床I(石カラータイル床)
+Rug C (Oriental Blue)|じゅうたんC(オリエント青じゅうたん)
+Rug D (Oriental Redpink)|じゅうたんD(オリエント赤ピンクじゅうたん)
+Hole C (Black Cave)|穴C(黒色)
+Raised Stone B (Yellow)|石段(黄)
+Ground J (Enclave Floor)|床J(飛び地)
+Table C (White Wood)|テーブルC(白木製)
+Ground K (Oriental Floor)|床K(オリエント床)
+Ground L (Stone Floor X Tile)|床L(石X字タイル床)
+Rug E (Oriental Red)|じゅうたんE(オリエント赤じゅうたん)
+Rug F (Oriental Purple)|じゅうたんF(オリエント紫じゅうたん)
+Hole D (Square Black Cave)|穴D(四角黒色)
+Raised Stone C (Gray)|石段(灰色)
+Ground M (Stone Enclave Floor)|床M(石飛び地)
+Table D (White Cloth)|テーブルD(白布)
\ No newline at end of file
diff --git a/img/tilesets/Inside_A4.png b/img/tilesets/Inside_A4.png
new file mode 100644
index 0000000..067755f
Binary files /dev/null and b/img/tilesets/Inside_A4.png differ
diff --git a/img/tilesets/Inside_A4.txt b/img/tilesets/Inside_A4.txt
new file mode 100644
index 0000000..91df6bd
--- /dev/null
+++ b/img/tilesets/Inside_A4.txt
@@ -0,0 +1,48 @@
+Wall A (Stone)|壁A(石)
+Wall B (Castle)|壁B(城)
+Wall C (Fort)|壁C(砦)
+Wall D (Stone)|壁D(石)
+Wall E (Stone)|壁E(石)
+Wall F (Brick)|壁F(レンガ)
+Wall G (Stone)|壁G(石)
+Interior Wall A (Stone)|内装壁A(石)
+Wall A (Stone)|壁A(石)
+Wall B (Castle)|壁B(城)
+Wall C (Fort)|壁C(砦)
+Wall D (Stone)|壁D(石)
+Wall E (Stone)|壁E(石)
+Wall F (Brick)|壁F(レンガ)
+Wall G (Stone)|壁G(石)
+Interior Wall A (Stone)|内装壁A(石)
+Wall H (Wood)|壁H(木造)
+Wall I (Log)|壁I(丸太)
+Wall J (Wood)|壁J(木造)
+Interior Wall B (Plaster)|内装壁B(石膏壁)
+Interior Wall C (Plaster)|内装壁C(石膏壁)
+Wall K (Stone)|壁K(石)
+Wall L (Marble)|壁L(大理石)
+Wall M (Marble)|壁M(大理石)
+Wall H (Wood)|壁H(木造)
+Wall I (Log)|壁I(丸太)
+Wall J (Wood)|壁J(木造)
+Interior Wall B (Plaster)|内装壁B(石膏壁)
+Interior Wall C (Plaster)|内装壁C(石膏壁)
+Wall K (Stone)|壁K(石)
+Wall L (Marble)|壁L(大理石)
+Wall M (Marble)|壁M(大理石)
+Interior Wall D (Desert)|内装壁D(砂漠風)
+Interior Wall E (Desert)|内装壁E(砂漠風)
+Interior Wall F (Mansion)|内装壁F(豪邸)
+Interior Wall G (Mansion)|内装壁G(豪邸)
+Wall N (Tent)|壁N(テント)
+Wall O (Demon Castle)|壁O(魔王城)
+Wall P (Gold)|壁P(黄金)
+Wall Q (Ice)|壁Q(氷)
+Interior Wall D (Desert)|内装壁D(砂漠風)
+Interior Wall E (Desert)|内装壁E(砂漠風)
+Interior Wall F (Mansion)|内装壁F(豪邸)
+Interior Wall G (Mansion)|内装壁G(豪邸)
+Wall N (Tent)|壁N(テント)
+Wall O (Demon Castle)|壁O(魔王城)
+Wall P (Gold)|壁P(黄金)
+Wall Q (Ice)|壁Q(氷)
diff --git a/img/tilesets/Inside_A5.png b/img/tilesets/Inside_A5.png
new file mode 100644
index 0000000..1356b75
Binary files /dev/null and b/img/tilesets/Inside_A5.png differ
diff --git a/img/tilesets/Inside_A5.txt b/img/tilesets/Inside_A5.txt
new file mode 100644
index 0000000..ce13f5b
--- /dev/null
+++ b/img/tilesets/Inside_A5.txt
@@ -0,0 +1,128 @@
+Darkness|暗闇
+Dirt Floor|土の床
+Stone Bridge (V, Left)|石の橋(縦・左)
+Stone Bridge (V Center)|石の橋(縦・中央)
+Stone Bridge (V, Riight)|石の橋(縦・右)
+Stone Bridge (H, Top)|石の橋(横・上)
+Stone Bridge (H Center)|石の橋(横・中央)
+Broken Bridge (H, Top)|壊れた橋(横・上)
+Transparent|透明
+Dirt Ledge|土の段差
+Broken Bridge (V, Left)|壊れた橋(縦・左)
+Broken Bridge (V Center)|壊れた橋(縦・中央)
+Broken Bridge (V, Riight)|壊れた橋(縦・右)
+Stone Bridge (H, Bottom)|石の橋(横・下)
+Broken Bridge (H Center)|壊れた橋(横・中央)
+Broken Bridge (H, Bottom)|壊れた橋(横・下)
+Wood Floor A|木の床A
+Wood Floor B|木の床B
+Wood Floor C|木の床C
+Wood Floor D|木の床D
+Cobblestones A|石畳A
+Cobblestones B|石畳B
+Cobblestones C|石畳C
+Cobblestones D|石畳D
+Ledge A (Wood)|段差A(木製)
+Ledge B (Wood)|段差B(木製)
+Ledge C (Wood)|段差C(木製)
+Ledge D (Wood)|段差D(木製)
+Ledge E (Stone)|段差E(石)
+Ledge F (Stone)|段差F(石)
+Ledge G (Stone)|段差G(石)
+Ledge H (Stone)|段差H(石)
+Wood Floor A (Ruins)|木の床A(廃墟)
+Wood Floor B (Ruins)|木の床B(廃墟)
+Wood Floor C (Ruins)|木の床C(廃墟)
+Wood Floor D (Ruins)|木の床D(廃墟)
+Cobblestones A (Ruins)|石畳A(廃墟)
+Cobblestones B (Ruins)|石畳B(廃墟)
+Cobblestones C (Ruins)|石畳C(廃墟)
+Cobblestones D (Ruins)|石畳D(廃墟)
+Cobblestones E|石畳E
+Interior Floor A (Tile)|内装床A(タイル)
+Interior Floor B (Tile)|内装床B(タイル)
+Interior Floor C (Tile)|内装床C(タイル)
+Interior Floor D (Stone)|内装床D(石)
+Interior Floor E (Tile)|内装床E(タイル)
+Interior Floor F (Tile)|内装床F(タイル)
+Interior Floor G (Tile)|内装床G(タイル)
+Ledge I (Stone)|段差I(石)
+Ledge J (Stone)|段差J(石)
+Ledge K (Stone)|段差K(石)
+Ledge L (Stone)|段差L(石)
+Ledge M (Stone)|段差M(石)
+Ledge N (Stone)|段差N(石)
+Ledge O (Stone)|段差O(石)
+Ledge P (Stone)|段差P(石)
+Cobblestones E (Ruins)|石畳E(廃墟)
+Interior Floor A (Tile, Ruins)|内装床A(タイル・廃墟)
+Interior Floor B (Tile, Ruins)|内装床B(タイル・廃墟)
+Interior Floor C (Tile, Ruins)|内装床C(タイル・廃墟)
+Interior Floor D (Stone, Ruins)|内装床D(石・廃墟)
+Interior Floor E (Tile, Ruins)|内装床E(タイル・廃墟)
+Interior Floor F (Tile, Ruins)|内装床F(タイル・廃墟)
+Interior Floor G (Tile, Ruins)|内装床G(タイル・廃墟)
+Cobblestones F|石畳F
+Interior Floor H (Dirt)|内装床H(土)
+Interior Floor I (Marble)|内装床I(大理石)
+Interior Floor J (Carpet)|内装床J(じゅうたん)
+Interior Floor K (Demon Castle)|内装床K(魔王城)
+Interior Floor L (Demon Castle)|内装床L(魔王城)
+Gold Floor|黄金の床
+Ice Floor|氷の床
+Ledge Q (Stone)|段差Q(石)
+Ledge R (Dirt)|段差R(土)
+Ledge S (Marble)|段差S(大理石)
+Ledge T (Carpet)|段差T(じゅうたん)
+Ledge U (Demon Castle)|段差U(魔界城)
+Ledge V (Demon Castle)|段差V(魔界城)
+Ledge W (Gold)|段差W(黄金)
+Ledge X (Ice)|段差X(氷)
+Cobblestones F (Ruins)|石畳F(廃墟)
+Interior Floor H (Dirt, Ruins)|内装床H(土・廃墟)
+Interior Floor I (Marble, Ruins)|内装床I(大理石・廃墟)
+Interior Floor J (Carpet, Ruins)|内装床J(じゅうたん・廃墟)
+Interior Floor K (Demon Castle, Ruins)|内装床K(魔王城・廃墟)
+Interior Floor L (Demon Castle, Ruins)|内装床L(魔王城・廃墟)
+Gold Floor (Ruins)|黄金の床(廃墟)
+Ice Floor (Ruins)|氷の床(廃墟)
+Stairs A (Wood, Left)|階段A(木製・左)
+Stairs A (Wood, Center)|階段A(木製・中央)
+Stairs A (Wood)|階段A(木製・右)
+Stairs A (Wood)|階段A(木製)
+Stairs B (Stone, Left)|階段B(石・左)
+Stairs B (Stone, Center)|階段B(石・中央)
+Stairs B (Stone, Right)|階段B(石・右)
+Stairs B (Stone)|階段B(石)
+Stairs C (Stone, Left)|階段C(石・左)
+Stairs C (Stone, Center)|階段C(石・中央)
+Stairs C (Stone, Right)|階段C(石・右)
+Stairs C (Stone)|階段C(石)
+Stairs C (Stone, Ruins, Left)|階段C(石・廃墟・左)
+Stairs C (Stone, Ruins, Center)|階段C(石・廃墟・中央)
+Stairs C (Stone, Ruins, Right)|階段C(石・廃墟・右)
+Stairs C (Stone, Ruins)|階段C(石・廃墟)
+Stairs D (Carpet, Left)|階段D(じゅうたん・左)
+Stairs D (Carpet, Center)|階段D(じゅうたん・中央)
+Stairs D (Carpet, Right)|階段D(じゅうたん・右)
+Stairs D (Carpet)|階段D(じゅうたん)
+Stairs E (Carpet, Left)|階段E(じゅうたん・左)
+Stairs E (Carpet, Center)|階段E(じゅうたん・中央)
+Stairs E (Carpet, Right)|階段E(じゅうたん・右)
+Stairs E (Carpet)|階段E(じゅうたん)
+Large Relief Floor Tile|大きなレリーフ床
+Large Relief Floor Tile|大きなレリーフ床
+Large Relief Floor Tile (Ruins)|大きなレリーフ床(廃墟)
+Large Relief Floor Tile (Ruins)|大きなレリーフ床(廃墟)
+Relief Floor Tile A (Silver)|レリーフ床A(銀)
+Relief Floor Tile B (Silver)|レリーフ床B(銀)
+Relief Floor Tile C (Gold)|レリーフ床C(金)
+Relief Floor Tile D (Gold)|レリーフ床D(金)
+Large Relief Floor Tile|大きなレリーフ床
+Large Relief Floor Tile|大きなレリーフ床
+Large Relief Floor Tile (Ruins)|大きなレリーフ床(廃墟)
+Large Relief Floor Tile (Ruins)|大きなレリーフ床(廃墟)
+Relief Floor Tile E (Silver, Ruins)|レリーフ床E(銀・廃墟)
+Relief Floor Tile F (Silver)|レリーフ床F(銀)
+Relief Floor Tile G (Gold, Ruins)|レリーフ床G(金・廃墟)
+Relief Floor Tile H (Gold)|レリーフ床H(金)
diff --git a/img/tilesets/Inside_B.png b/img/tilesets/Inside_B.png
new file mode 100644
index 0000000..e891a42
Binary files /dev/null and b/img/tilesets/Inside_B.png differ
diff --git a/img/tilesets/Inside_B.txt b/img/tilesets/Inside_B.txt
new file mode 100644
index 0000000..343671b
--- /dev/null
+++ b/img/tilesets/Inside_B.txt
@@ -0,0 +1,256 @@
+Transparent|透明
+Stairs A (Up)|階段A(上り)
+Stairs B (Up)|階段B(上り)
+Stairs C (Up)|階段C(上り)
+Stairs D (Up)|階段D(上り)
+Metal Ladder|鉄ばしご
+Wood Ladder|木製はしご
+Rope|ロープ
+Hole|穴
+Stairs A (Down)|階段A(下り)
+Stairs B (Down)|階段B(下り)
+Stairs C (Down)|階段C(下り)
+Stairs D (Down)|階段D(下り)
+Metal Ladder|鉄ばしご
+Wood Ladder|木製はしご
+Rope|ロープ
+Entrance A|入口A
+Entrance A (Extend)|入口A(延長部分)
+Entrance A (Top Half A)|入口A(上半分A)S
+Entrance B|入口B
+Entrance A (Top Half B)|入口A(上半分B)
+Metal Ladder|鉄ばしご
+Wood Ladder|木製はしご
+Rope|ロープ
+Stone Pillar A|石の柱A
+Stone Pillar B|石の柱B
+Fort Pillar|砦の柱
+Rubble|瓦礫
+Rubble|瓦礫
+Hole A (Metal Ladder)|穴A(鉄ばしご)
+Hole B (Wood Ladder)|穴B(木製はしご)
+Hole C (Rope)|穴C(ロープ)
+Stone Pillar A|石の柱A
+Stone Pillar B|石の柱B
+Fort Pillar|砦の柱
+Stone Tablet|石版
+Fissures A|亀裂A
+Fissures B|亀裂B
+Fissures C|亀裂C
+Fissures D|亀裂D
+Broken Stone Pillar A|折れた石の柱A
+Broken Stone Pillar B|折れた石の柱B
+Broken Fort Pillar|折れた砦の柱
+Stone Tablet (Ruins)|石版(廃墟)
+Fissures A|亀裂A
+Fissures B|亀裂B
+Fissures C|亀裂C
+Fissures E|亀裂E
+Curtains A|カーテンA
+Curtains B|カーテンB
+Curtains C|カーテンC
+Curtains D|カーテンD
+Curtains A (Ruins)|カーテンA(廃墟)
+Curtains B (Ruins)|カーテンB(廃墟)
+Curtains C (Ruins)|カーテンC(廃墟)
+Curtains D (Ruins)|カーテンD(廃墟)
+Curtains A|カーテンA
+Curtains B|カーテンB
+Curtains C|カーテンC
+Curtains D|カーテンD
+Curtains A (Ruins)|カーテンA(廃墟)
+Curtains B (Ruins)|カーテンB(廃墟)
+Curtains C (Ruins)|カーテンC(廃墟)
+Curtains D (Ruins)|カーテンD(廃墟)
+Middle Window A|中型窓A
+Middle Window A|中型窓A
+Middle Window B|中型窓B
+Middle Window B|中型窓B
+Large Window A|大型窓A
+Large Window B|大型窓B
+Large Window C|大型窓C
+Stained Glass Window|ステンドグラス
+Middle Window A|中型窓A
+Middle Window A|中型窓A
+Middle Window B|中型窓B
+Middle Window B|中型窓B
+Large Window A|大型窓A
+Large Window B|大型窓B
+Large Window C|大型窓C
+Stained Glass Window|ステンドグラス
+Tapestry A|タペストリーA
+Tapestry A (Ruins)|タペストリーA(廃墟)
+Swords A|剣A
+Swords B|剣B
+Large Window D|大型窓D
+Window A|窓A
+Window B|窓B
+Window C|窓C
+Tapestry A|タペストリーA
+Tapestry A (Ruins)|タペストリーA(廃墟)
+Shield|盾
+Posted Notice|貼り紙
+Large Window D|大型窓D
+Window A|窓A
+Window B|窓B
+Window C|窓C
+Sofa (Castle)|ソファ(城)
+Sofa (Castle)|ソファ(城)
+Sofa (Castle)|ソファ(城)
+Sofa (Castle)|ソファ(城)
+Sofa (Castle)|ソファ(城)
+Chair A (Wood)|背もたれ椅子A(木製)
+Chair B (Stone)|背もたれ椅子B(石)
+Throne (Demon Castle)|玉座(魔王城)
+Sofa (Castle)|ソファ(城)
+Sofa (Castle)|ソファ(城)
+Sofa (Castle)|ソファ(城)
+Sofa (Castle)|ソファ(城)
+Sofa (Castle)|ソファ(城)
+Chair A (Wood)|背もたれ椅子A(木製)
+Chair B (Stone)|背もたれ椅子B(石)
+Throne (Demon Castle)|玉座(魔王城)
+Table A|テーブルA
+Table A|テーブルA
+Table B|テーブルB
+Table C|テーブルC
+Table D|テーブルD
+Clock|時計
+Mirror|鏡
+Window (Demon Castle)|窓(魔王城)
+Stool A|椅子A
+Stool B|椅子B
+Stool C|椅子C
+Table E|テーブルE
+Table F|テーブルF
+Clock|時計
+Mirror|鏡
+Window (Demon Castle)|窓(魔王城)
+World Map|世界地図
+World Map|世界地図
+Painting|絵画
+Painting|絵画
+Portrait A|肖像画A
+Portrait B|肖像画B
+Painting A|絵画A
+Painting B|絵画B
+Chest A|チェストA
+Cabinet|キャビネット
+Closet|クローゼット
+Chest of Drawers|タンス
+Dish Cabinet|食器棚
+Wine Rack|ワインセラー
+Bottle Shelf A|ボトル棚A
+Bottle Shelf B|ボトル棚B
+Chest B|チェストB
+Chest C|チェストC
+Closet|クローゼット
+Chest of Drawers|タンス
+Dish Cabinet|食器棚
+Wine Rack|ワインセラー
+Bottle Shelf A|ボトル棚A
+Bottle Shelf B|ボトル棚B
+Bread Shelf|パン棚
+Sundries Shelf A|雑貨棚A
+Sundries Shelf A|雑貨棚A
+Sundries Shelf B|雑貨棚B
+Medicine Shelf|薬品棚
+Bookshelf A|本棚A
+Bookshelf B|本棚B
+Bookshelf B|本棚B
+Bread Shelf|パン棚
+Sundries Shelf A|雑貨棚A
+Sundries Shelf A|雑貨棚A
+Sundries Shelf B|雑貨棚B
+Medicine Shelf|薬品棚
+Bookshelf A|本棚A
+Bookshelf B|本棚B
+Bookshelf B|本棚B
+Bed|ベッド
+Large Bed|ダブルベッド
+Large Bed|ダブルベッド
+Cheap Bed A|粗末なベッドA
+Cheap Bed B|粗末なベッドB
+Straw Bed|むしろの寝床
+Bed (Ruins)|ベッド(廃墟)
+Tipped Shelf|倒れた棚
+Bed|ベッド
+Large Bed|ダブルベッド
+Large Bed|ダブルベッド
+Cheap Bed A|粗末なベッドA
+Cheap Bed B|粗末なベッドB
+Straw Bed|むしろの寝床
+Bed (Ruins)|ベッド(廃墟)
+Tipped Shelf|倒れた棚
+Simple Shelf A (Jars)|簡易棚A(瓶)
+Simple Shelf B (Books)|簡易棚B(本)
+Fireplace A (Stone)|暖炉A(石)
+Fireplace B (Brick)|暖炉B(レンガ)
+Fireplace C (Iron)|暖炉C(鉄)
+Large Fireplace|大きな暖炉
+Large Fireplace|大きな暖炉
+Large Fireplace|大きな暖炉
+Simple Shelf C (Sacks)|簡易棚C(袋)
+Simple Shelf D (Bottles)|簡易棚D(ボトル)
+Fireplace A (Stone)|暖炉A(石)
+Fireplace B (Brick)|暖炉B(レンガ)
+Fireplace C (Iron)|暖炉C(鉄)
+Large Fireplace|大きな暖炉
+Large Fireplace|大きな暖炉
+Large Fireplace|大きな暖炉
+Oven|かまど
+Sink|流し
+Kitchen Counter A|調理台A
+Kitchen Counter B|調理台B
+Dresser|ドレッサー
+Piano|ピアノ
+Piano|ピアノ
+Piano|ピアノ
+Simple Shelf E|簡易棚E
+Pot A|壺A
+Pot B|壺B
+Basin|桶
+Barrel|樽
+Piano|ピアノ
+Piano|ピアノ
+Piano|ピアノ
+Posted Notice (Ruins)|貼り紙(廃墟)
+Basin|桶
+Tub A|たらいA
+Tub B|たらいB
+Scrap Wood|端材
+Pipe Organ|パイプオルガン
+Pipe Organ|パイプオルガン
+Pipe Organ|パイプオルガン
+Crate A|木箱A
+Crate B|木箱B
+Stacked Crates|積まれた木箱
+Stacked Crates|積まれた木箱
+Crate C (Ruins)|木箱C(廃墟)
+Pipe Organ|パイプオルガン
+Pipe Organ|パイプオルガン
+Pipe Organ|パイプオルガン
+Crate D|木箱D
+Crate E|木箱E
+Stacked Crates|積まれた木箱
+Stacked Crates|積まれた木箱
+Pot C (Ruins)|壺C(廃墟)
+Barrel (Ruins)|樽(廃墟)
+Table A (Ruins)|テーブルA(廃墟)
+Stool (Ruins)|椅子(廃墟)
+Crate F|木箱F
+Crate G|木箱G
+Sacks C|麻袋C
+Large Crate|大きな木箱
+Jail Bar|鉄格子
+Jail Bar|鉄格子
+Jail Bar|鉄格子
+Jail Bar|鉄格子
+Sack A|麻袋A
+Sack B|麻袋B
+Sacks C|麻袋C
+Large Crate|大きな木箱
+Jail Bar|鉄格子
+Jail Bar|鉄格子
+Jail Bar|鉄格子
+Jail Bar|鉄格子
diff --git a/img/tilesets/Inside_C.png b/img/tilesets/Inside_C.png
new file mode 100644
index 0000000..dfef9b4
Binary files /dev/null and b/img/tilesets/Inside_C.png differ
diff --git a/img/tilesets/Inside_C.txt b/img/tilesets/Inside_C.txt
new file mode 100644
index 0000000..231b0ae
--- /dev/null
+++ b/img/tilesets/Inside_C.txt
@@ -0,0 +1,256 @@
+Teapot A|ティーポットA
+Teapot B|ティーポットB
+Cup (Lower Left)|カップ(左下)
+Cup (Upper Right)|カップ(右上)
+Pot A|ポットA
+Pot B|ポットB
+Glass A (Lower Left)|グラスA(左下)
+Glass A (Upper Right)|グラスA(右上)
+Bottle A|ボトルA
+Bottle B|ボトルB
+Glass B (Lower Left)|グラスB(左下)
+Glass B (Upper Right)|グラスB(右上)
+Glass C (Lower Left)|グラスC(左下)
+Glass C (Upper Right)|グラスC(右上)
+Glass D (Lower Left)|グラスD(左下)
+Glass D (Upper Right)|グラスD(右上)
+Pot C|ポットC
+Pot D|ポットD
+Pint Mug A (Lower Left)|ジョッキA(左下)
+Pint Mug A (Upper Right)|ジョッキA(右上)
+Pint Mug B (Lower Left)|ジョッキB(左下)
+Pint Mug B (Upper Right)|ジョッキB(右上)
+Glass E (Lower Left)|グラスE(左下)
+Glass E (Upper Right)|グラスE(右上)
+Bottle C|ボトルC
+Broken Bottle|割れたボトル
+Bottle D|ボトルD
+Bottle E|ボトルE
+Bottle F|ボトルF
+Pint Mug C|ジョッキC
+Pint Mug D|ジョッキD
+Glass F|グラスF
+Side Dishes|副菜
+Meal (Meat)|肉料理
+Assorted Vegetables|野菜盛り合わせ
+Assorted Fruitsl|フルーツ盛り合わせ
+Roast Chicken|丸焼き
+Meal (Fish)|魚料理
+Pasta|パスタ
+Assorted Cakes|ケーキ盛り合わせ
+Dinner Set A (Bottom)|夕食セットA(下)
+Dinner Set B (Top)|夕食セットB(上)
+Dinner Set C (Left)|夕食セットC(左)
+Dinner Set D (Right)|夕食セットD(右)
+Gratin|グラタン
+Fried Rice|チャーハン
+Beef Stew|ビーフシチュー
+Paella|パエリア
+Breakfast Set A (Bottom)|朝食セットA(下)
+Breakfast Set B (Top)|朝食セットB(上)
+Breakfast Set C (Left)|朝食セットC(左)
+Breakfast Set D (Right)|朝食セットD(右)
+Assorted Cheeses|チーズ盛り合わせ
+Stew|シチュー
+Mushroom Dishes|きのこ料理
+Tart|タルト
+Beer Barrel A|ビール樽A
+Beer Barrel B|ビール樽B
+Plate A|皿A
+Plates B|皿B
+Plates C|皿C
+Chopping Board|まな板
+Soup Bowl|スープボウル
+Paella Pan|パエリア鍋
+Closed Book A (V)|閉じた本A(縦)
+Closed Book A (H)|閉じた本A(横)
+Closed Book B (V)|閉じた本B(縦)
+Closed Book B (H)|閉じた本B(横)
+Open Book A (V)|開いた本A(縦)
+Open Book A (H)|開いた本A(横)
+Closed Books C|閉じた本C
+Closed Book D|閉じた本D
+Note A (V)|メモA(縦)
+Note A (H)|メモA(横)
+Notes B (V)|メモB(縦)
+Pen A|ペン
+Map A (V)|地図A(縦)
+Map B (H)|地図B(横)
+Note C (V)|メモC(縦)
+Note C (H)|メモC(横)
+Notes D|メモD
+Envelope|封筒
+Scrolls A|巻物A
+Scrolls B|巻物B
+Planter A|プランターA
+Planter B|プランターB
+Potted Plant A|植木鉢A
+Potted Plant B|植木鉢B
+Case A|ケースA
+Case B|ケースB
+Case C|ケースC
+Hourglass|砂時計
+Small Box A|小箱A
+Small Box B|小箱B
+Small Box C|小箱C
+Small Box D|小箱D
+Sack A|袋A
+Sacks B|袋B
+Medicine Bottle A|薬瓶A
+Medicine Bottles B|薬瓶B
+Potion A|液体入り瓶A
+Potion B|液体入り瓶B
+Potion C|液体入り瓶C
+Potion D|液体入り瓶D
+Basket A|バスケットA
+Basket B|バスケットB
+Basket C|バスケットC
+Basket D|バスケットD
+Rugs A|じゅうたんA
+Rugs B|じゅうたんB
+Rugs C|じゅうたんC
+Balance|天秤
+Stuffed Doll A|ぬいぐるみA
+Stuffed Doll B|ぬいぐるみB
+Stuffed Doll C|ぬいぐるみC
+Doll A|人形A
+Doll B|人形B
+Doll C|人形C
+Gifts A|プレゼントA
+Gifts B|プレゼントB
+Globe|地球儀
+Bell|ベル
+Cloth (Magic Circle)|布(魔法陣)
+Crystal Ball|水晶玉
+Jewelry Case A|宝石ケースA
+Necklace|ネックレス
+Crown|王冠
+Jewelry Case B|宝石ケースB
+Sword A|剣A
+Swords B|剣B
+Swords C|剣C
+Axes|斧
+Spears A|槍A
+Spears B|槍B
+Whip|鞭
+Knives|短剣
+Cooking Utensils|調理器具
+Hanging Meat|吊るし肉
+Shield A|盾A
+Shield B|盾B
+Men's Clothing A (Hanging)|男物の服A(壁掛け)
+Men's Clothing B (Hanging)|男物の服B(壁掛け)
+Women's Clothing A (Hanging)|女物の服A(壁掛け)
+Women's Clothing B (Hanging)|女物の服B(壁掛け)
+Sword Rack A|剣掛台A
+Sword Rack B|剣掛台B
+Hammers|ハンマー
+Bows & Arrows|弓矢
+Blacksmith's Table A|金床A
+Blacksmith's Table B|金床B
+Large Basin|水桶
+Scrap Metal|鉄くず
+Helmet A|兜A
+Helmet B|兜B
+Helmet C|兜C
+Hat A (Stand)|帽子A(スタンド)
+Hat B (Stand)|帽子B(スタンド)
+Hat C (Stand)|帽子C(スタンド)
+Women's Clothing A (Stand)|女物の服A(スタンド)
+Women's Clothing B (Stand)|女物の服B(スタンド)
+Armor A (Stand)|鎧A(スタンド)
+Armor B (Stand)|鎧B(スタンド)
+Armor C (Stand)|鎧C(スタンド)
+Armor D (Stand)|鎧D(スタンド)
+Women's Clothing C (Stand)|女物の服C(スタンド)
+Men's Clothing A (Stand)|男物の服A(スタンド)
+Men's Clothing B (Stand)|男物の服B(スタンド)
+Women's Clothing D (Stand)|女物の服D(スタンド)
+Church Symbol|教会のシンボル
+Goddess Statue|女神像
+God Statue|神像
+Statue A|石像A
+Statue B|石像B
+Dais|台座
+Repository of Swords|剣立て
+Repository of Spears|槍立て
+Church Symbol|教会のシンボル
+Goddess Statue|女神像
+God Statue|神像
+Statue A|石像A
+Statue B|石像B
+Broken Statue|壊れた像
+Repository of Swords|剣立て
+Repository of Spears|槍立て
+Church Table|教会机
+Church Table|教会机
+Church Table|教会机
+Decorative Pillar A|装飾柱A
+Decorative Pillar A|装飾柱A
+Decorative Pillar B|装飾柱B
+Decorative Pillar A (Ruins)|装飾柱A(廃墟)
+Decorative Pillar B (Ruins)|装飾柱B(廃墟)
+Church Table|教会机
+Church Table|教会机
+Church Table|教会机
+Decorative Pillar A (Ruins)|装飾柱A(廃墟)
+Decorative Pillar A|装飾柱A
+Decorative Pillar B|装飾柱B
+Decorative Pillar A (Ruins)|装飾柱A(廃墟)
+Decorative Pillar B (Ruins)|装飾柱B(廃墟)
+Gold Bricks A|金の延べ棒A
+Gold Bricks B|金の延べ棒B
+Silver Bricks A|銀の延べ棒A
+Silver Bricks B|銀の延べ棒B
+Decorative Pillar A|装飾柱A
+Decorative Pillar B|装飾柱B
+Decorative Pillar A (Ruins)|装飾柱A(廃墟)
+Decorative Pillar B (Ruins)|装飾柱B(廃墟)
+Monument A|石碑A
+Monument B|石碑B
+Demon Statue|悪魔像
+Dragon Statue|竜像
+Dragon Statue|竜像
+Large Monument|大きな石碑
+Large Monument|大きな石碑
+Large Monument|大きな石碑
+Monument A|石碑A
+Monument C|石碑C
+Demon Statue|悪魔像
+Dragon Statue|竜像
+Dragon Statue|竜像
+Large Monument|大きな石碑
+Large Monument|大きな石碑
+Large Monument|大きな石碑
+Railings (Wood)|段差用手すり(木製)
+Railings (Wood)|段差用手すり(木製)
+Railings (Wood)|段差用手すり(木製)
+Railings (Wood)|段差用手すり(木製)
+Railings (Wood)|段差用手すり(木製)
+Railings (Wood)|段差用手すり(木製)
+Railings (Wood)|段差用手すり(木製)
+Railings (Wood)|段差用手すり(木製)
+Banister A (Wood)|階段用手すりA(木製)
+Banister A (Wood)|階段用手すりA(木製)
+Banister B (Stone)|階段用手すりB(石)
+Banister B (Stone)|階段用手すりB(石)
+Banister C (Temple)|階段用手すりC(神殿)
+Banister C (Temple)|階段用手すりC(神殿)
+Banister D (Castle)|階段用手すりD(城)
+Banister D (Castle)|階段用手すりD(城)
+Banister A (Wood)|階段用手すりA(木製)
+Banister A (Wood)|階段用手すりA(木製)
+Banister B (Stone)|階段用手すりB(石)
+Banister B (Stone)|階段用手すりB(石)
+Banister C (Temple)|階段用手すりC(神殿)
+Banister C (Temple)|階段用手すりC(神殿)
+Banister D (Castle)|階段用手すりD(城)
+Banister D (Castle)|階段用手すりD(城)
+Banister A (Wood)|階段用手すりA(木製)
+Banister A (Wood)|階段用手すりA(木製)
+Banister B (Stone)|階段用手すりB(石)
+Banister B (Stone)|階段用手すりB(石)
+Banister C (Temple)|階段用手すりC(神殿)
+Banister C (Temple)|階段用手すりC(神殿)
+Banister D (Castle)|階段用手すりD(城)
+Banister D (Castle)|階段用手すりD(城)
diff --git a/img/tilesets/Outside_A1.png b/img/tilesets/Outside_A1.png
new file mode 100644
index 0000000..3579e18
Binary files /dev/null and b/img/tilesets/Outside_A1.png differ
diff --git a/img/tilesets/Outside_A1.txt b/img/tilesets/Outside_A1.txt
new file mode 100644
index 0000000..2ccfa58
--- /dev/null
+++ b/img/tilesets/Outside_A1.txt
@@ -0,0 +1,16 @@
+Water A (Meadow)|水場A(草地)
+Pond|池
+Swamp Grass A|水草A
+Swamp Grass B|水草B
+Water B (Snow)|水場B(雪)
+Waterfall A|滝A
+Canal|水路
+Waterfall B (Stone Wall)|滝B(石壁)
+Water C (Dirt)|水場C(土)
+Waterfall C (Cliff)|滝C(崖)
+Water D (Sand)|水場 D(砂)
+Waterfall D (Boulder)|滝D(玉石)
+Water E (Port)|水場E(港)
+Water Bubbles|泡
+Poison Swamp|毒の沼
+Dead Tree|枯れ木
diff --git a/img/tilesets/Outside_A2.png b/img/tilesets/Outside_A2.png
new file mode 100644
index 0000000..69128a8
Binary files /dev/null and b/img/tilesets/Outside_A2.png differ
diff --git a/img/tilesets/Outside_A2.txt b/img/tilesets/Outside_A2.txt
new file mode 100644
index 0000000..5d8fad0
--- /dev/null
+++ b/img/tilesets/Outside_A2.txt
@@ -0,0 +1,32 @@
+Meadow|草地
+Dirt (Meadow)|土(草地)
+Road (Meadow)|道(草地)
+Cobblestones A|石畳A
+Bush|茂み
+Road Edging|縁石
+Fencepost A (Wood)|柵A(木製)
+Fissures|ひび割れ
+Dirt|土
+Grass (Dirt)|草地(土)
+Road (Dirt)|道(土)
+Cobblestones A (Dirt)|石畳A(土)
+Bush (Dead)|茂み(枯れ草)
+Road Edging (Snow)|縁石(雪)
+Fencepost B (Metal)|柵B(金属)
+Soil|汚れ
+Sand|砂地
+Grass (Sand)|草地(砂地)
+Road (Sand)|道(砂地)
+Cobblestones B|石畳B
+Bush (Sand)|茂み(砂地)
+Hole|穴
+Fencepost C (Stone)|柵C(石)
+Moss|苔
+Snow|雪
+Dirt (Snow)|土(雪)
+Road (Snow)|道(雪)
+Carpet|カーペット
+Bush (Snow)|茂み(雪)
+Hole|穴
+Fencepost A (Wood, Snow)|柵A(木製・雪)
+Ledge|段差
diff --git a/img/tilesets/Outside_A3.png b/img/tilesets/Outside_A3.png
new file mode 100644
index 0000000..997d115
Binary files /dev/null and b/img/tilesets/Outside_A3.png differ
diff --git a/img/tilesets/Outside_A3.txt b/img/tilesets/Outside_A3.txt
new file mode 100644
index 0000000..c4efc86
--- /dev/null
+++ b/img/tilesets/Outside_A3.txt
@@ -0,0 +1,32 @@
+Roof A (Dressed Tile)|屋根A(化粧瓦)
+Roof B (Pink Tile)|屋根B(ピンク瓦)
+Roof C (Orange Tile)|屋根C(橙瓦)
+Roof D (Yellow Tile)|屋根D(黄瓦)
+Roof E (Wood)|屋根E(木造)
+Roof F (Wood, Ruins)|屋根F(木造・廃墟)
+Roof G (Log)|屋根G(丸太)
+Roof H (Dark Blue Tile)|屋根H(紺瓦)
+Outer Wall A (Rock Wall)|外壁A(石壁)
+Outer Wall B (Plaster)|外壁B(石膏壁)
+Outer Wall C (Brick)|外壁C(レンガ)
+Outer Wall D (Plaster)|外壁D(石膏壁)
+Outer Wall E (Wood)|外壁E(木造)
+Outer Wall F (Wood)|外壁F(木造)
+Outer Wall G (Log)|外壁G(丸太)
+Outer Wall H (Demon Castle)外壁H(魔王城)
+Roof I (Green Tile)|屋根I(緑瓦)
+Roof J (Temple)|屋根J(神殿)
+Roof K (Stone)|屋根K(石)
+Roof L (Thatched)|屋根L(茅葺)
+Roof M (Tent)|屋根M(テント)
+Snow Roof A|雪の屋根A
+Snow Roof B|雪の屋根B
+Ice Roof|氷の屋根
+Outer Wall I (Rock Wall)|外壁I(石壁)
+Outer Wall J (Temple)|外壁J(神殿)
+Outer Wall K (Rock Wall)|外壁K(石壁)
+Outer Wall L (Moss)|外壁L(苔)
+Outer Wall M (Tent)|外壁M(テント)
+Snow Outer Wall (Brick)|雪の外壁(レンガ)
+Snow Outer Wall (Wood)|雪の外壁(木造)
+Ice Outer Wall|氷の外壁
diff --git a/img/tilesets/Outside_A4.png b/img/tilesets/Outside_A4.png
new file mode 100644
index 0000000..6845db9
Binary files /dev/null and b/img/tilesets/Outside_A4.png differ
diff --git a/img/tilesets/Outside_A4.txt b/img/tilesets/Outside_A4.txt
new file mode 100644
index 0000000..be2ff40
--- /dev/null
+++ b/img/tilesets/Outside_A4.txt
@@ -0,0 +1,48 @@
+Wall A (Stone)|壁A(石)
+Wall B (Stone)|壁B(石)
+Wall C (Stone)|壁C(石)
+Building A (Castle)|建物A(城)
+Building B (Castle, Snow)|建物B(城・雪)
+Building C (Fort)|建物C(砦)
+Building D (Fort, Snow)|建物D(砦・雪)
+Demon Castle|魔王城
+Wall A (Stone)|壁A(石)
+Wall B (Stone)|壁B(石)
+Wall C (Stone)|壁C(石)
+Building A (Castle)|建物A(城)
+Building B (Castle, Snow)|建物B(城・雪)
+Building C (Fort)|建物C(砦)
+Building D (Fort, Snow)|建物D(砦・雪)
+Demon Castle|魔王城
+Wall C (Brick)|壁C(レンガ)
+Wall D (Stone)|壁D(石)
+Wall E (Marble)|壁E(大理石)
+Wall F (Marble)|壁F(大理石)
+Building E (Dirt Wall)|建物E(土壁)
+Building F (Desert)|建物F(砂漠風)
+Wall G (Gold)|壁G(黄金)
+Building G (Mecha)|建物G(メカ)
+Wall C (Brick)|壁C(レンガ)
+Wall D (Stone)|壁D(石)
+Wall E (Marble)|壁E(大理石)
+Wall F (Marble)|壁F(大理石)
+Building E (Dirt Wall)|建物E(土壁)
+Building F (Desert)|建物F(砂漠風)
+Wall G (Gold)|壁G(黄金)
+Building G (Mecha)|建物G(メカ)
+Wall H (Moss)|壁H(苔)
+Wall I (Hedge)|壁I(生け垣)
+Forest A|森A
+Forest B (Snow)|森B(雪)
+Ledge A (Meadow)|段差A(草地)
+Ledge B (Dirt)|段差B(土)
+Ledge C (Desert)|段差C(砂地)
+Ledge D (Snow)|段差D(雪)
+Wall H (Moss)|壁H(苔)
+Wall I (Hedge)|壁I(生け垣)
+Forest A|森A
+Forest B (Snow)|森B(雪)
+Ledge A (Meadow)|段差A(草地)
+Ledge B (Dirt)|段差B(土)
+Ledge C (Desert)|段差C(砂地)
+Ledge D (Snow)|段差D(雪)
diff --git a/img/tilesets/Outside_A5.png b/img/tilesets/Outside_A5.png
new file mode 100644
index 0000000..b4f81e6
Binary files /dev/null and b/img/tilesets/Outside_A5.png differ
diff --git a/img/tilesets/Outside_A5.txt b/img/tilesets/Outside_A5.txt
new file mode 100644
index 0000000..7c21fd9
--- /dev/null
+++ b/img/tilesets/Outside_A5.txt
@@ -0,0 +1,128 @@
+Darkness|暗闇
+Night Sky A|夜空A
+Large Bridge (H, Top)|大きな橋(横・上)
+Large Bridge (H, Center)|大きな橋(横・中央)
+Large Bridge (Snow, H, Top)|大きな橋(雪・横・上)
+Large Bridge (V, Left)|大きな橋(縦・左)
+Large Bridge (V, Center)|大きな橋(縦・中央)
+Large Bridge (V, Right)|大きな橋(縦・右)
+Transparent|透明
+Night Sky B|夜空B
+Large Bridge (H, Bottom)|大きな橋(横・下)
+Large Bridge (Snow, H, Center)|大きな橋(雪・横・中央)
+Large Bridge (Snow, H, Bottom)|大きな橋(雪・横・下)
+Large Bridge (Snow, V, Left)|大きな橋(雪・縦・左)
+Large Bridge (Snow, V, Center)|大きな橋(雪・縦・中央)
+Large Bridge (Snow, V, Right)|大きな橋(雪・縦・右)
+Meadow A|草地A
+Dirt A|土A
+Desert A|砂地A
+Snow A|雪A
+Meadow|草地B
+Dirt B|土B
+Desert B|砂地B
+Snow B|雪B
+Cobblestones A|石畳A
+Cobblestones B|石畳B
+Cobblestones C|石畳C
+Cobblestones D|石畳D
+Cobblestones A (Ruins)|石畳A(廃墟)
+Cobblestones B (Ruins)|石畳B(廃墟)
+Cobblestones C (Ruins)|石畳C(廃墟)
+Cobblestones D (Ruins)|石畳D(廃墟)
+Cobblestones E|石畳E
+Cobblestones F|石畳F
+Cobblestones G|石畳G
+Demon Castle Floor|魔王城の床
+Cobblestones E (Ruins)|石畳E(廃墟)
+Cobblestones F (Ruins)|石畳F(廃墟)
+Cobblestones G (Ruins)|石畳G(廃墟)
+Demon Castle Floor (Ruins)|魔王城の床(廃墟)
+Ledge (Port, Left)|段差(港・左)
+Ledge (Port, Center)|段差(港・中央)
+Ledge (Port, Right)|段差(港・右)
+Ledge (Port)|段差(港)
+Tile Floor A|タイル床A
+Tile Floor B|タイル床B
+Tile Floor C (Gold)|タイル床C(金)
+Tile Floor D (Ice)|タイル床D(氷)
+Stairs (Meadow, Left)|階段(草地・左)
+Stairs (Meadow, Center)|階段(草地・中央)
+Stairs (Meadow, Right)|階段(草地・右)
+Stairs (Meadow)|階段
+Stairs (Dirt, Left)|階段(土・左)
+Stairs (Dirt, Center)|階段(土・中央)
+Stairs (Dirt, Right)|階段(土・右)
+Stairs (Dirt)|階段(土)
+Stairs (Desert, Left)|階段(砂地・左)
+Stairs (Desert, Center)|階段(砂地・中央)
+Stairs (Desert, Right)|階段(砂地・右)
+Stairs (Desert)|階段(砂地)
+Stairs (Snow, Left)|階段(雪・左)
+Stairs (Snow, Center)|階段(雪・中央)
+Stairs (Snow, Right)|階段(雪・右)
+Stairs (Snow)|階段(雪)
+Stairs (Paved, Left)|階段(舗装・左)
+Stairs (Paved, Center)|階段(舗装・中央)
+Stairs (Paved, Right)|階段(舗装・右)
+Stairs (Paved)|階段(舗装)
+Stairs (Ruins, Left)|階段(廃墟・左)
+Stairs (Ruins, Center)|階段(廃墟・中央)
+Stairs (Ruins, Right)|階段(廃墟・右)
+Stairs (Ruins)|階段(廃墟)
+Large Relief Floor Tile|大きなレリーフ床
+Large Relief Floor Tile|大きなレリーフ床
+Large Relief Floor Tile (Ruins)|大きなレリーフ床(廃墟)
+Large Relief Floor Tile (Ruins)|大きなレリーフ床(廃墟)
+Farm Field A (Top)|畑A(上)
+Farm Field A (Center)|畑A(中央)
+Farm Field B (Snow, Top)|畑B(雪・上)
+Farm Field B (Snow, Center)|畑B(雪・中央)
+Large Relief Floor Tile|大きなレリーフ床
+Large Relief Floor Tile|大きなレリーフ床
+Large Relief Floor Tile (Ruins)|大きなレリーフ床(廃墟)
+Large Relief Floor Tile (Ruins)|大きなレリーフ床(廃墟)
+Farm Field A (Top)|畑A(上)
+Farm Field A (Center)|畑A(中央)
+Farm Field B (Snow, Top)|畑B(雪・上)
+Farm Field B (Snow, Center)|畑B(雪・中央)
+Ledge (Meadow)|段差(草地)
+Ledge (Meadow)|段差(草地)
+Ledge (Meadow)|段差(草地)
+Garden A|花壇A
+Garden B (Snow)|花壇B(雪)
+Ledge (Dirt)|段差(土)
+Ledge (Dirt)|段差(土)
+Ledge (Dirt)|段差(土)
+Ledge (Meadow)|段差(草地)
+Ledge (Meadow)|段差(草地)
+Ledge (Meadow)|段差(草地)
+Ledge (Meadow)|段差(草地)
+Ledge (Meadow)|段差(草地)
+Ledge (Dirt)|段差(土)
+Ledge (Dirt)|段差(土)
+Ledge (Dirt)|段差(土)
+Ledge (Meadow)|段差(草地)
+Ledge (Meadow)|段差(草地)
+Ledge (Meadow)|段差(草地)
+Ledge (Meadow)|段差(草地)
+Ledge (Meadow)|段差(草地)
+Ledge (Dirt)|段差(土)
+Ledge (Dirt)|段差(土)
+Ledge (Dirt)|段差(土)
+Cliff|崖
+Cliff|崖
+Cliff|崖
+Ledge (Dirt)|段差(土)
+Ledge (Dirt)|段差(土)
+Cliff|崖
+Cliff|崖
+Cliff|崖
+Cliff (Meadow)|崖(草地)
+Cliff (Meadow)|崖(草地)
+Cliff (Meadow)|崖(草地)
+Ledge (Dirt)|段差(土)
+Ledge (Dirt)|段差(土)
+Cliff (Dirt)|崖(土)
+Cliff (Dirt)|崖(土)
+Cliff (Dirt)|崖(土)
diff --git a/img/tilesets/Outside_B.png b/img/tilesets/Outside_B.png
new file mode 100644
index 0000000..14607f9
Binary files /dev/null and b/img/tilesets/Outside_B.png differ
diff --git a/img/tilesets/Outside_B.txt b/img/tilesets/Outside_B.txt
new file mode 100644
index 0000000..8d4fae1
--- /dev/null
+++ b/img/tilesets/Outside_B.txt
@@ -0,0 +1,256 @@
+Transparent|透明
+Stairs A (Up)|階段A(上り)
+Stairs B (Up)|階段B(上り)
+Stairs C (Up)|階段C(上り)
+Stairs D (Up)|階段D(上り)
+Tent A|テントA
+Tent A|テントA
+Tent A|テントA
+Streetlight A|街灯A
+Stairs A (Down)|階段A(下り)
+Stairs B (Down)|階段B(下り)
+Stairs C (Down)|階段C(下り)
+Stairs D (Down)|階段D(下り)
+Tent A|テントA
+Tent A|テントA
+Tent A|テントA
+Streetlight A|街灯A
+Metal Ladder|鉄ばしご
+Wood Ladder|木製はしご
+Rope|ロープ
+Vines A|ツタ
+Tent A|テントA
+Tent A (Entrance)|テントA(入口)
+Tent A|テントA
+Streetlight A|街灯A
+Metal Ladder|鉄ばしご
+Wood Ladder|木製はしご
+Rope|ロープ
+Vines A|ツタA
+Tent B|テントB
+Tent B|テントB
+Tent B|テントB
+Streetlight B (Snow)|街灯B(雪)
+Metal Ladder|鉄ばしご
+Wood Ladder|木製はしご
+Rope|ロープ
+Vines B (Down)|ツタB(下り)
+Tent B|テントB
+Tent B|テントB
+Tent B|テントB
+Streetlight B (Snow)|街灯B(雪)
+Hole A (Metal Ladder)|穴A(鉄ばしご)
+Hole B (Wood Ladder)|穴B(木製はしご)
+Hole C (Rope)|穴C(ロープ)
+Hole D|穴D
+Tent B|テントB
+Tent B (Entrance, Snow)|テント(入口・雪)
+Tent B|テントB
+Streetlight B (Snow)|街灯B(雪)
+Wall Vines A|壁のツタA
+Wall Vines B|壁のツタB
+Wall Vines C|壁のツタC
+Fissures A|亀裂A
+Fissures B|亀裂B
+Fissures C|亀裂C
+Fissures D|亀裂D
+Wall Moss|壁の苔
+Wall Vines A|壁のツタA
+Wall Vines B|壁のツタB
+Wall Vines C|壁のツタC
+Fissures A|亀裂A
+Fissures B|亀裂B
+Fissures C|亀裂C
+Fissures E|亀裂E
+Wall Fern|壁のシダ
+Shop Sign (Sword)|看板(剣)
+Shop Sign (Sword & Shield)|看板(剣と盾)
+Shop Sign (Armor)|看板(鎧)
+Shop Sign (Sack)|看板(袋)
+Shop Sign (Teapot)|看板(ポット)
+Shop Sign (Inn)|看板(宿)
+Shop Sign (Pub)|看板(酒場)
+Shop Sign (Eatery)|看板(食堂)
+Shop Sign (Hexagram)|看板(魔法陣)
+Shop Sign (Staves)|看板(杖)
+Shop Sign (Coin)|看板(コイン)
+Shop Sign (Necklace)|看板(ネックレス)
+Shop Sign (Hammer)|看板(ハンマー)
+Shop Sign (Crest)|看板(紋章)
+Shop Sign (Blank)|看板(無地)
+Log Bridge (V)|丸太の橋(縦)
+Log Bridge (H)|丸太の橋(横)
+Wood Bridge (V)|木の橋(縦)
+Wood Bridge (H)|木の橋(横)
+Stone Bridge (V)|石の橋(縦)
+Stone Bridge (H)|石の橋(横)
+Wood Bridge (V)|木の橋(縦)
+Wood Bridge (H)|木の橋(横)
+Bridge Spar (Wood, Center A)|橋げた(木・中央A)
+Bridge Spar (Wood, Left)|橋げた(木・左)
+Bridge Spar (Wood, Center B)|橋げた(木・中央B)
+Bridge Spar (Wood, Right)|橋げた(木・右)
+Bridge Spar (Stone, Center A)|橋げた(石・中央A)
+Bridge Spar (Stone, Left)|橋げた(石・左)
+Bridge Spar (Stone, Center B)||橋げた(石・中央B)
+Bridge Spar (Stone, Right)|橋げた(石・右)
+Window A|窓A
+Window B|窓B
+Window C|窓C
+Window D|窓D
+Middle Window A|中型窓A
+Middle Window B|中型窓B
+Middle Window C|中型窓C
+Middle Window D|中型窓D
+Window E|窓E
+Window F|窓F
+Window G|窓G
+Window H|窓H
+Middle Window A|中型窓A
+Middle Window E|中型窓E
+Middle Window C|中型窓C
+Middle Window D|中型窓D
+Large Window A|大型窓A
+Large Window B|大型窓B
+Large Window C|大型窓C
+Stained Glass Window|ステンドグラス
+Large Window D|大型窓D
+Middle Window F|中型窓F
+Middle Window G|中型窓G
+Middle Window H|中型窓H
+Large Window A|大型窓A
+Large Window E|大型窓E
+Large Window C|大型窓C
+Stained Glass Window B|ステンドグラスB
+Large Window D|大型窓D
+Middle Window F|中型窓F
+Middle Window G|中型窓G
+Middle Window H|中型窓H
+Chimney|煙突
+Mooring Bollard A|ビットA
+Mooring Bollard B (Rope)|ビットB(ロープ)
+Entrance A|入口A
+Entrance A (Extend)|入口A(延長部分)
+Entrance A (Top Half A)|入口A(上半分A)S
+Entrance B|入口B
+Entrance A (Top Half B)|入口A(上半分B)
+Chimney|煙突
+Sign A|立て札A
+Sign B|立て札B
+Well|井戸
+Stepping Stones|踏み石
+Barrel|樽
+Grave A|墓A
+Grave B|墓B
+Pot|壺
+Basin A|桶A
+Basin B|桶B
+Rock Fire Pit A|石のかまどA
+Rock Fire Pit B|石のかまどB
+Barricade (H)|バリケード(横)
+Barricade (V)|バリケード(縦)
+Beanstalk|豆の木
+Grass A|草A
+Grass B|草B
+Grass C|草C
+Grass D|草D
+Stump|切り株
+Tree|木
+Tree|木
+Boulder A|岩A
+Flowers A|花A
+Flowers B|花B
+Flowers C|花C
+Flowers D|花D
+Fallen Log|倒木
+Tree|木
+Bush|植え込み
+Boulder B|岩B
+Scarecrow|かかし
+Hole|穴
+Firewood|薪
+Rocks|小石
+Crops A|農作物A
+Crops B|農作物B
+Crops C|農作物C
+Crops D|農作物D
+Large Tree|大木
+Large Tree|大木
+Large Tree|大木
+Large Tree|大木
+Large Crate|大きな木箱
+Crate A|木箱A
+Crate B|木箱B
+Crate C|木箱C
+Large Tree|大木
+Large Tree|大木
+Large Tree|大木
+Large Tree|大木
+Large Crate|大きな木箱
+Crate D|木箱D
+Crate E|木箱E
+Crate F|木箱F
+Conifer Tree (Snow)|針葉樹(雪)
+Conifer Tree (Snow)|針葉樹(雪)
+Conifer Tree (Snow)|針葉樹(雪)
+Conifer Tree (Snow)|針葉樹(雪)
+Scarecrow (Snow)|かかし(雪)
+Pot (Snow)|壺(雪)
+Bucket (Snow)|桶(雪)
+Crate (Snow)|木箱(雪)
+Large Conifer Tree (Snow)|大針葉樹(雪)
+Large Conifer Tree (Snow)|大針葉樹(雪)
+Large Conifer Tree (Snow)|大針葉樹(雪)
+Large Conifer Tree (Snow)|大針葉樹(雪)
+Mooring Bollard (Snow)|ビット(雪)
+Barricade (H, Snow)|バリケード(横・雪)
+Barricade (H, Snow)|バリケード(縦・雪)
+Beanstalk (Snow)|豆の木(雪)
+Stump (Snow)|切り株(雪)
+Sign A (Snow)|立て札A(雪)
+Sign B (Snow)|立て札B(雪)
+Well (Snow)|井戸(雪)
+Stepping Stones (Snow)|踏み石(雪)
+Barrel (Snow)|樽(雪)
+Grave A (Snow)|墓A(雪)
+Grave B (Snow)|墓B(雪)
+Snowman|雪だるま
+Grass A (Snow)|草A(雪)
+Grass B (Snow)|草B(雪)
+Grass C (Snow)|草C(雪)
+Grass D (Snow)|草D(雪)
+Conifer Tree (Snow)|針葉樹(雪)
+Conifer Tree (Snow)|針葉樹(雪)
+Boulder A (Snow)|岩A(雪)
+Dead Beanstalk|枯れた豆の木
+Hole (Snow)|穴(雪)
+Firewood (Snow)|薪(雪)
+Rocks (Snow)|小石(雪)
+Fallen Log (Snow)|倒木(雪)
+Conifer Tree (Snow)|針葉樹(雪)
+Bush (Snow)|植え込み(雪)
+Boulder B (Snow)|岩B(雪)
+Dead Tree|枯れ木
+Dead Tree|枯れ木
+Mushrooms A|キノコA
+Mushrooms B|キノコB
+Palm Tree|ヤシの木
+Palm Tree|ヤシの木
+Cactus|サボテン
+Dead Grass A|枯れ草A
+Dead Tree|枯れ木
+Dead Tree (Shrub)|枯れ木(低木)
+Rafflesia|ラフレシア
+Stump (Moss)|切り株(苔)
+Palm Tree|ヤシの木
+Bush (Flowers)|植え込み(花)
+Fern|シダ
+Dead Grass B|枯れ草B
+Hay|干し草
+Hay (Snow)|干し草(雪)
+Floral Patch|花畑
+Susuki Grass|ススキ
+Fallen Leaves|落ち葉
+Lotus Pads A|蓮の葉A
+Lotus Pads B (Flowers)|蓮の葉B(花)
+Lotus Pads C|蓮の葉C
diff --git a/img/tilesets/Outside_C.png b/img/tilesets/Outside_C.png
new file mode 100644
index 0000000..6723537
Binary files /dev/null and b/img/tilesets/Outside_C.png differ
diff --git a/img/tilesets/Outside_C.txt b/img/tilesets/Outside_C.txt
new file mode 100644
index 0000000..4c98460
--- /dev/null
+++ b/img/tilesets/Outside_C.txt
@@ -0,0 +1,256 @@
+Obelisk|オベリスク
+Stone Pillar A|石の柱A
+Stone Pillar B|石の柱B
+Stone Pillar B (Moss)|石の柱B(苔)
+Stone Pillar B (Snow)|石の柱B(雪)
+Stone Pillar C|石の柱C
+Stone Pillar D|石の柱D
+Demon Castle Pillar|魔王城の柱
+Obelisk|オベリスク
+Stone Pillar A|石の柱A
+Stone Pillar B|石の柱B
+Stone Pillar B (Moss)|石の柱B(苔)
+Stone Pillar B (Snow)|石の柱B(雪)
+Stone Pillar C|石の柱C
+Stone Pillar D|石の柱D
+Demon Castle Pillar|魔王城の柱
+Obelisk|オベリスク
+Broken Stone Pillar A|折れた石の柱A
+Broken Stone Pillar B|折れた石の柱B
+Broken Stone Pillar B (Moss)|折れた石の柱B(苔)
+Broken Stone Pillar B (Snow)|折れた石の柱B(雪)
+Broken Stone Pillar C|折れた石の柱C
+Broken Stone Pillar D|折れた石の柱D
+Broken Demon Castle Pillar|折れた魔王城の柱
+Bones A|骸骨A
+Bones B|骸骨B
+Rubble|瓦礫A
+Rubble B (Moss)|瓦礫B(苔)
+Rubble C (Snow)|瓦礫C(雪)
+Rubble D|瓦礫D
+Rubble E|瓦礫E
+Rubble F (Demon Castle)|瓦礫F(魔王城)
+Monument A|石碑A
+Monument B|石碑B
+Large Monument|大きな石碑
+Large Monument|大きな石碑
+Large Monument|大きな石碑
+Large Monument|大きな石碑
+Large Monument|大きな石碑
+Large Monument|大きな石碑
+Monument A|石碑A
+Monument C|石碑C
+Large Monument|大きな石碑
+Large Monument|大きな石碑
+Large Monument|大きな石碑
+Large Monument|大きな石碑
+Large Monument|大きな石碑
+Large Monument|大きな石碑
+Monument A (Snow)|石碑A(雪)
+Monument B (Snow)|石碑B(雪)
+Large Monument (Snow)|大きな石碑(雪)
+Large Monument (Snow)|大きな石碑(雪)
+Large Monument (Snow)|大きな石碑(雪)
+Large Monument (Snow)|大きな石碑(雪)
+Large Monument (Snow)|大きな石碑(雪)
+Large Monument (Snow)|大きな石碑(雪)
+Monument A (Snow)|石碑A(雪)
+Monument C (Snow)|石碑C(雪)
+Large Monument (Snow)|大きな石碑(雪)
+Large Monument (Snow)|大きな石碑(雪)
+Large Monument (Snow)|大きな石碑(雪)
+Large Monument (Snow)|大きな石碑(雪)
+Large Monument (Snow)|大きな石碑(雪)
+Large Monument (Snow)|大きな石碑(雪)
+Statue A|石像A
+Statue B|石像B
+Angel Statue|天使像
+Demon Statue|悪魔像
+Dais|台座
+Dragon Statue|竜像
+Dragon Statue|竜像
+God Statue|神像
+Statue A|石像A
+Statue B|石像B
+Angel Statue|天使像
+Demon Statue|悪魔像
+Broken Dais|壊れた台座
+Dragon Statue|竜像
+Dragon Statue|竜像
+God Statue|神像
+Statue A (Snow)|石像A(雪)
+Statue B (Snow)|石像B(雪)
+Angel Statue (Snow)|天使像(雪)
+Demon Statue (Snow)|悪魔像(雪)
+Dais (Snow)|台座(雪)
+Dragon Statue (Snow)|竜像(雪)
+Dragon Statue (Snow)|竜像(雪)
+Ice Statue|氷像
+Statue A (Snow)|石像A(雪)
+Statue B (Snow)|石像B(雪)
+Angel Statue (Snow)|天使像(雪)
+Demon Statue (Snow)|悪魔像(雪)
+Broken Dais (Snow)|壊れた台座(雪)
+Dragon Statue (Snow)|竜像(雪)
+Dragon Statue (Snow)|竜像(雪)
+Ice Statue|氷像
+Tapestry A|タペストリーA
+Tapestry A (Ruins)|タペストリーA(廃墟)
+Tapestry B|タペストリーB
+Tapestry B (Ruins)|タペストリーB(廃墟)
+Tapestry C|タペストリーC
+Tapestry C (Ruins)|タペストリーC(廃墟)
+Tapestry D|タペストリーD
+Tapestry D (Ruins)|タペストリーD(廃墟)
+Tapestry A|タペストリーA
+Tapestry A (Ruins)|タペストリーA(廃墟)
+Tapestry B|タペストリーB
+Tapestry B (Ruins)|タペストリーB(廃墟)
+Tapestry C|タペストリーC
+Tapestry C (Ruins)|タペストリーC(廃墟)
+Tapestry D|タペストリーD
+Tapestry D (Ruins)|タペストリーD(廃墟)
+Window A (Demon Castle)|窓A(魔王城)
+Window B (Demon Castle)|窓B(魔王城)
+Window C (Demon Castle)|窓C(魔王城)
+Antenna|アンテナ
+Chimney|煙突
+Chimney|煙突
+Cave Entrance|洞窟入口
+Mine Entrance|坑道入口
+Window A (Demon Castle)|窓A(魔王城)
+Window B (Demon Castle)|窓B(魔王城)
+Window D (Demon Castle)|窓D(魔王城)
+Antenna|アンテナ
+Chimney|煙突
+Chimney|煙突
+Cave Entrance|洞窟入口
+Mine Entrance|坑道入口
+Roof A (Green Tile)|屋根A(緑瓦)
+Roof A (Green Tile)|屋根A(緑瓦)
+Roof A (Green Tile)|屋根A(緑瓦)
+Roof A (Green Tile)|屋根A(緑瓦)
+Roof A (Green Tile)|屋根A(緑瓦)
+Roof B (Snow)|屋根B(雪)
+Roof B (Snow)|屋根B(雪)
+Roof B (Snow)|屋根B(雪)
+Roof A (Green Tile)|屋根A(緑瓦)
+Roof A (Green Tile)|屋根A(緑瓦)
+Roof A (Green Tile)|屋根A(緑瓦)
+Roof A (Green Tile)|屋根A(緑瓦)
+Roof A (Green Tile)|屋根A(緑瓦)
+Roof B (Snow)|屋根B(雪)
+Roof B (Snow)|屋根B(雪)
+Roof B (Snow)|屋根B(雪)
+Roof A (Green Tile)|屋根A(緑瓦)
+Roof A (Green Tile)|屋根A(緑瓦)
+Roof A (Green Tile)|屋根A(緑瓦)
+Roof B (Snow)|屋根B(雪)
+Roof B (Snow)|屋根B(雪)
+Roof B (Snow)|屋根B(雪)
+Roof B (Snow)|屋根B(雪)
+Roof B (Snow)|屋根B(雪)
+Roof C (Yellow Tile)|屋根C(黄瓦)
+Roof C (Yellow Tile)|屋根C(黄瓦)
+Roof C (Yellow Tile)|屋根C(黄瓦)
+Roof B (Snow)|屋根B(雪)
+Roof B (Snow)|屋根B(雪)
+Roof D (Wood)|屋根D(木造)
+Roof D (Wood)|屋根D(木造)
+Roof D (Wood)|屋根D(木造)
+Roof C (Yellow Tile)|屋根C(黄瓦)
+Roof C (Yellow Tile)|屋根C(黄瓦)
+Roof C (Yellow Tile)|屋根C(黄瓦)
+Roof C (Yellow Tile)|屋根C(黄瓦)
+Roof C (Yellow Tile)|屋根C(黄瓦)
+Roof D (Wood)|屋根D(木造)
+Roof D (Wood)|屋根D(木造)
+Roof D (Wood)|屋根D(木造)
+Roof C (Yellow Tile)|屋根C(黄瓦)
+Roof C (Yellow Tile)|屋根C(黄瓦)
+Roof C (Yellow Tile)|屋根C(黄瓦)
+Roof C (Yellow Tile)|屋根C(黄瓦)
+Roof C (Yellow Tile)|屋根C(黄瓦)
+Roof D (Wood)|屋根D(木造)
+Roof D (Wood)|屋根D(木造)
+Roof D (Wood)|屋根D(木造)
+Round Tower A (Castle)|円塔A(城)
+Round Tower A (Castle)|円塔A(城)
+Round Tower B (Fort)|円塔B(砦)
+Round Tower B (Fort)|円塔B(砦)
+Roof Detail A (Green Tile)|屋根飾りA(緑瓦)
+Roof Detail B (Snow)|屋根飾りB(雪)
+Roof D (Wood)|屋根D(木造)
+Roof D (Wood)|屋根D(木造)
+Round Tower A (Castle)|円塔A(城)
+Round Tower A (Castle)|円塔A(城)
+Round Tower B (Fort)|円塔B(砦)
+Round Tower B (Fort)|円塔B(砦)
+Roof Detail C (Yellow Tile)|屋根飾りC(黄瓦)
+Roof Detail D (Wood)|屋根飾りD(木造)
+Roof D (Wood)|屋根D(木造)
+Roof D (Wood)|屋根D(木造)
+Round Tower A (Castle)|円塔A(城)
+Round Tower A (Castle)|円塔A(城)
+Round Tower B (Fort)|円塔B(砦)
+Round Tower B (Fort)|円塔B(砦)
+Round Tower A (Castle's Spire)|円塔A(城の尖塔)
+Round Tower A (Castle's Spire)|円塔A(城の尖塔)
+Round Tower B (Fort)|円塔B(砦)
+Round Tower B (Fort)|円塔B(砦)
+Round Tower A (Castle)|円塔A(城)
+Round Tower A (Castle)|円塔A(城)
+Round Tower B (Fort)|円塔B(砦)
+Round Tower B (Fort)|円塔B(砦)
+Round Tower A (Castle's Spire)|円塔A(城の尖塔)
+Round Tower A (Castle's Spire)|円塔A(城の尖塔)
+Round Tower B (Fort, Snow)|円塔B(砦・雪)
+Round Tower B (Fort, Snow)|円塔B(砦・雪)
+Round Tower A (Castle)|円塔A(城)
+Round Tower A (Castle)|円塔A(城)
+Round Tower B (Fort)|円塔B(砦)
+Round Tower B (Fort)|円塔B(砦)
+Round Tower A (Castle's Spire)|円塔A(城の尖塔)
+Round Tower A (Castle's Spire)|円塔A(城の尖塔)
+Round Tower C (Demon Castle)|円塔C(魔王城)
+Round Tower C (Demon Castle)|円塔C(魔王城)
+Round Tower A (Castle, Snow)|円塔A(城・雪)
+Round Tower A (Castle, Snow)|円塔A(城・雪)
+Round Tower B (Fort, Snow)|円塔B(砦・雪)
+Round Tower B (Fort, Snow)|円塔B(砦・雪)
+Round Tower A (Castle)|円塔A(城)
+Round Tower A (Castle)|円塔A(城)
+Round Tower C (Demon Castle)|円塔C(魔王城)
+Round Tower C (Demon Castle)|円塔C(魔王城)
+Round Tower A (Castle, Snow)|円塔A(城・雪)
+Round Tower A (Castle, Snow)|円塔A(城・雪)
+Round Tower B (Fort, Snow)|円塔B(砦・雪)
+Round Tower B (Fort, Snow)|円塔B(砦・雪)
+Round Tower A (Castle's Spire, Snow)|円塔A(城の尖塔・雪)
+Round Tower A (Castle's Spire, Snow)|円塔A(城の尖塔・雪)
+Round Tower C (Demon Castle)|円塔C(魔王城)
+Round Tower C (Demon Castle)|円塔C(魔王城)
+Round Tower A (Castle, Snow)|円塔A(城・雪)
+Round Tower A (Castle, Snow)|円塔A(城・雪)
+Round Tower B (Fort, Snow)|円塔B(砦・雪)
+Round Tower B (Fort, Snow)|円塔B(砦・雪)
+Round Tower A (Castle's Spire, Snow)|円塔A(城の尖塔・雪)
+Round Tower A (Castle's Spire, Snow)|円塔A(城の尖塔・雪)
+Round Tower C (Demon Castle)|円塔C(魔王城)
+Round Tower C (Demon Castle)|円塔C(魔王城)
+Round Tower A (Castle, Snow)|円塔A(城・雪)
+Round Tower A (Castle, Snow)|円塔A(城・雪)
+Round Tower B (Fort, Snow)|円塔B(砦・雪)
+Round Tower B (Fort, Snow)|円塔B(砦・雪)
+Round Tower A (Castle's Spire, Snow)|円塔A(城の尖塔・雪)
+Round Tower A (Castle's Spire, Snow)|円塔A(城の尖塔・雪)
+Round Tower C (Demon Castle)|円塔C(魔王城)
+Round Tower C (Demon Castle)|円塔C(魔王城)
+Round Tower A (Castle, Snow)|円塔A(城・雪)
+Round Tower A (Castle, Snow)|円塔A(城・雪)
+Round Tower B (Fort, Snow)|円塔B(砦・雪)
+Round Tower B (Fort, Snow)|円塔B(砦・雪)
+Round Tower A (Castle, Snow)|円塔A(城・雪)
+Round Tower A (Castle, Snow)|円塔A(城・雪)
+Round Tower C (Demon Castle)|円塔C(魔王城)
+Round Tower C (Demon Castle)|円塔C(魔王城)
diff --git a/img/tilesets/SF_Inside_A4.png b/img/tilesets/SF_Inside_A4.png
new file mode 100644
index 0000000..aa572cd
Binary files /dev/null and b/img/tilesets/SF_Inside_A4.png differ
diff --git a/img/tilesets/SF_Inside_A4.txt b/img/tilesets/SF_Inside_A4.txt
new file mode 100644
index 0000000..b2ccab5
--- /dev/null
+++ b/img/tilesets/SF_Inside_A4.txt
@@ -0,0 +1,48 @@
+Wall A (Concrete)|壁A(コンクリート)
+Wall B (Concrete)|壁B(コンクリート)
+Wall C (House)|壁C(現代住宅)
+Wall D (Metal)|壁D(金属)
+Wall E (Metal, Red Rust)|壁E(金属・赤錆)
+Wall F (Metal, Patina)|壁F(金属・緑青錆)
+Wall G (Barracks)|壁G(バラック)
+Wall H (Chinese)|壁H(中華風)
+Wall A (Concrete)|壁A(コンクリート)
+Wall B (Concrete)|壁B(コンクリート)
+Wall C (House)|壁C(現代住宅)
+Wall D (Metal)|壁D(金属)
+Wall E (Metal, Red Rust)|壁E(金属・赤錆)
+Wall F (Tent, Camouflage)|壁F(テント・迷彩)
+Wall G (Barracks)|壁G(バラック)
+Wall H (Chinese)|壁H(中華風)
+Wall I (Factory)|壁I(工場)
+Wall J (Factory)|壁J(工場)
+Interior Wall A (Pattern)|内装壁A(模様)
+Interior Wall B (Pattern)|内装壁B(模様)
+Interior Wall C (Pattern)|内装壁C(模様)
+Interior Wall D (Pattern)|内装壁D(模様)
+Interior Wall E (Pattern)|内装壁E(模様)
+Wall K (Brick)|壁K(レンガ)
+Wall I (Factory)|壁I(工場)
+Wall J (Factory)|壁J(工場)
+Interior Wall A (Pattern)|内装壁A(模様)
+Interior Wall B (Pattern)|内装壁B(模様)
+Interior Wall C (Pattern)|内装壁C(模様)
+Interior Wall D (Pattern)|内装壁D(模様)
+Interior Wall E (Pattern)|内装壁E(模様)
+Wall K (Brick)|壁K(レンガ)
+Wall L (Wood)|壁L(木造)
+Wall M (House)|壁M(現代住宅)
+Wall N (Building)|壁N(ビル)
+Wall O (Other Dimension)|壁O(異空間)
+Wall P (Neon)|壁P(ネオン)
+Wall Q (Wire Mesh)|壁Q(金網)
+Wall R (Wire Mesh, Red Rust)|壁R(金網・赤錆)
+Wall S (Wire Mesh, Patina)|壁S(金網・緑青錆)
+Wall L (Wood)|壁L(木造)
+Wall M (House)|壁M(現代住宅)
+Wall N (Building)|壁N(ビル)
+Wall O (Other Dimension)|壁O(異空間)
+Wall P (Neon)|壁P(ネオン)
+Wall Q (Wire Mesh)|壁Q(金網)
+Wall R (Wire Mesh, Red Rust)|壁R(金網・赤錆)
+Wall S (Wire Mesh, Patina)|壁S(金網・緑青錆)
diff --git a/img/tilesets/SF_Inside_B.png b/img/tilesets/SF_Inside_B.png
new file mode 100644
index 0000000..037aee8
Binary files /dev/null and b/img/tilesets/SF_Inside_B.png differ
diff --git a/img/tilesets/SF_Inside_B.txt b/img/tilesets/SF_Inside_B.txt
new file mode 100644
index 0000000..9a952ab
--- /dev/null
+++ b/img/tilesets/SF_Inside_B.txt
@@ -0,0 +1,256 @@
+Transparent|透明
+Stairs A (Up)|階段A(上り)
+Stairs B (Up)|階段B(上り)
+Stairs C (Up)|階段C(上り)
+Stairs D (Up)|階段D(上り)
+Wood Ladder|木製はしご
+Metal Stairs|金属階段
+Crane Rope|クレーンロープ
+Hole|穴
+Stairs A (Down)|階段A(下り)
+Stairs B (Down)|階段B(下り)
+Stairs C (Down)|階段C(下り)
+Stairs D (Down)|階段D(下り)
+Wood Ladder|木製はしご
+Metal Stairs|金属階段
+Crane Rope|クレーンロープ
+Midsize Window A|中型窓A
+Midsize Window B|中型窓B
+Large Window A|大型窓A
+Midsize Window C|中型窓C
+Large Window B|大型窓B
+Wood Ladder|木製はしご
+Metal Stairs|金属階段
+Crane Rope|クレーンロープ
+Midsize Window A|中型窓A
+Midsize Window B|中型窓B
+Large Window A|大型窓A
+Midsize Window C|中型窓C
+Large Window B|大型窓B
+Hole A (Wood Ladder)|穴A(木製はしご)
+Hole B (Metal Stairs)|穴B(金属階段)
+Hole C (Crane Rope)|穴C(クレーンロープ)
+Asphalt Bridge (V)|アスファルトの橋(縦)
+Asphalt Bridge (H)|アスファルトの橋(横)
+Stone Bridge (V)|石の橋(縦)
+Stone Bridge (H)|石の橋(横)
+Metal Bridge A (V)|金属の橋A(縦)
+Metal Bridge A (H)|金属の橋A(横)
+Metal Bridge B (V)|金属の橋B(縦)
+Metal Bridge B (H)|金属の橋B(横)
+Bridge Spar A (Asphalt, Center A)|橋げたA(アスファルト・中央A)
+Bridge Spar A (Asphalt, Left)|橋げたA(アスファルト・左)
+Bridge Spar A (Asphalt, Center B)|橋げたA(アスファルト・中央B)
+Bridge Spar A (Asphalt, Right)|橋げたA(アスファルト・右)
+Bridge Spar B (Metal, Center A)|橋げたB(金属・中央A)
+Bridge Spar B (Metal, Left)|橋げたB(金属・左)
+Bridge Spar B (Metal, Center B)|橋げたB(金属・中央B)
+Bridge Spar B (Metal, Right)|橋げたB(金属・右)
+Metal Fence|金属フェンス
+Metal Fence|金属フェンス
+Metal Fence|金属フェンス
+Warning Plate A|警告プレートA
+Connecting Bridge (Metal)|連絡橋(金属)
+Connecting Bridge (Metal)|連絡橋(金属)
+Connecting Bridge (Metal)|連絡橋(金属)
+Connecting Bridge (Metal, Stairs)|連絡橋(金属・階段)
+Metal Fence|金属フェンス
+Warning Plate B|警告プレートB
+Metal Fence|金属フェンス
+Warning Plate C|警告プレートC
+Connecting Bridge (Metal)|連絡橋(金属)
+Connecting Bridge (Metal)|連絡橋(金属)
+Connecting Bridge (Metal)|連絡橋(金属)
+Connecting Bridge (Metal, Stairs)|連絡橋(金属・階段)
+Metal Fence|金属フェンス
+Metal Fence|金属フェンス
+Metal Fence|金属フェンス
+Warning Plate (Biohazard Mark)|警告プレート(バイオハザードマーク)
+Connecting Bridge (Metal)|連絡橋(金属)
+Connecting Bridge (Metal)|連絡橋(金属)
+Connecting Bridge (Metal)|連絡橋(金属)
+Podium (H)|教壇机(横)
+Pillar A (Asphalt)|柱A(アスファルト)
+Pillar B (Metal)|柱B(金属)
+Pillar C (Display)|柱C(ディスプレイ)
+Pillar D (Decoration)|柱D(装飾)
+Pillar E (Metal)|柱E(金属)
+Pillar F (Brick)|柱F(レンガ)
+Large Window C|大型窓C
+Podium (H)|教壇机(横)
+Pillar A (Asphalt)|柱A(アスファルト)
+Pillar B (Metal)|柱B(金属)
+Pillar C (Display)|柱C(ディスプレイ)
+Pillar D (Decoration)|柱D(装飾)
+Pillar E (Metal)|柱E(金属)
+Pillar F (Brick)|柱F(レンガ)
+Large Window C|大型窓C
+Podium (V)|教壇机(縦)
+Broken Pillar A (Asphalt)|折れた柱A(アスファルト)
+Broken Pillar B (Metal)|折れた柱B(金属)
+Broken Pillar C (Display)|折れた柱C(ディスプレイ)
+Broken Pillar D (Decoration)|折れた柱D(装飾)
+Broken Pillar E (Metal)|折れた柱E(金属)
+Broken Pillar F (Brick)|折れた柱F(レンガ)
+Barricade (No Entry)|バリケード(通行禁止)
+Podium (V)|教壇机(縦)
+Girder A (Asphalt, Left)|梁A(アスファルト・左)
+Girder A (Asphalt, Center)|梁A(アスファルト・中央)
+Girder A (Asphalt, Right)|梁A(アスファルト・右)
+Girder C (Decoration, Left)|梁C(装飾・左)
+Girder C (Decoration, Center)|梁C(装飾・中央)
+Girder C (Decoration, Right)|梁C(装飾・右)
+Bar (No Entry)|バー(通行禁止)
+Bar (No Entry)|バー(通行禁止)
+Girder B (Metal, Left)|梁B(金属・左)
+Girder B (Metal, Center)|梁B(金属・中央)
+Girder B (Metal, Right)|梁B(金属・右)
+Rubble A (Asphalt)|瓦礫A(アスファルト)
+Rubble B (Metal)|瓦礫B(金属)
+Fissures A|亀裂A
+Fissures B|亀裂B
+Fissures C|亀裂C
+Jail Bars|鉄格子
+Laser Barrier|レーザーバリア
+Wheelchair (Left)|車いす(左)
+Wheelchair (Right)|車いす(右)
+Pipe Frame Bed (Ruins)|パイプベッド(廃墟)
+Fissures A|亀裂A
+Fissures B|亀裂B
+Fissures C|亀裂C
+Jail Bars|鉄格子
+Laser Barrier|レーザーバリア
+Wheelchair (Bottom)|車いす(下)
+Wheelchair (Fallen)|車いす(倒れ)
+Pipe Frame Bed (Ruins)|パイプベッド(廃墟)
+Lab Equipment|実験器具
+School Desk (V)|学校机(縦)
+School Desk (H)|学校机(横)
+TV|テレビ
+Computer|PC
+Laptop|ノートPC
+Printer|プリンター
+Telephone|電話
+Intercom (Hanging)|インターホン(壁掛け)
+Tablet Device|タブレット端末
+Table Clock|置時計
+Gas Stove|ガスコンロ
+Kitchen Counter|調理台
+Sink|流し
+Exhaust Fan|換気扇
+Air Conditioner|エアコン
+Wastebasket|ゴミ箱
+Book Stand|本立て
+Document|書類
+School Chair (Bottom)|学校イス(下)
+School Chair (Top)|学校イス(上)
+School Chair (Right)|学校イス(右)
+School Chair (Left)|学校イス(左)
+Sofa (Right)|ソファ(右)
+Sofa (Left)|ソファ(左)
+Sofa (Down)|ソファ(下)
+Sofa (Up)|ソファ(下)
+Office Chair (Bottom)|オフィスチェア(下)
+Office Chair (Top)|オフィスチェア(上)
+Office Chair (Right)|オフィスチェア(右)
+Office Chair (Left)|オフィスチェア(左)
+Sofa (Right)|ソファ(右)
+Sofa (Left)|ソファ(左)
+Sofa (Top)|ソファ(上)
+Sofa (Top)|ソファ(上)
+Washing Machine|洗濯機
+Western Style Toilet|洋式便器
+Urinal|男性用便器
+Bathroom Sink|洗面台
+Bathtub (V)|バスタブ(縦)
+Bathtub (H)|バスタブ(横)
+Bathtub (H)|バスタブ(横)
+Glass Table (V)|ガラステーブル(縦)
+Washing Machine|洗濯機
+Western Style Toilet|洋式便器
+Urinal|男性用便器
+Wash Basin|洗面台
+Bathtub (V)|バスタブ(縦)
+Glass Table (H)|ガラステーブル(横)
+Glass Table (H)|ガラステーブル(横)
+Glass Table (V)|ガラステーブル(縦)
+Refrigerator|冷蔵庫
+Bookshelf A|本棚A
+Chest of Drawers A|タンスA
+Miscellaneous Item Shelf|雑貨棚
+Locker A|ロッカーA
+Document Shelf|資料棚
+Medicine Shelf|薬品棚
+Locker B (School)|ロッカーB(学校)
+Refrigerator|冷蔵庫
+Bookshelf A|本棚A
+Chest of Drawers A|タンスA
+Miscellaneous Item Shelf|雑貨棚
+Locker A|ロッカーA
+Document Shelf|資料棚
+Medicine Shelf|薬品棚
+Locker B (School)|ロッカーB(学校)
+Display Shelf A|商品陳列棚A
+Display Shelf B|商品陳列棚B
+Convenience Store Shelf A|コンビニ棚A
+Convenience Store Shelf B|コンビニ棚B
+Document Shelf (Ruins)|資料棚(廃墟)
+Chest of Drawers B (Decoration)|タンスB(装飾)
+Shelf A (Decoration)|棚A(装飾)
+Bookshelf B (Decoration)|本棚B(装飾)
+Display Shelf A|商品陳列棚A
+Display Shelf B|商品陳列棚B
+Convenience Store Shelf A|コンビニ棚A
+Convenience Store Shelf B|コンビニ棚B
+Document Shelf (Ruins)|資料棚(廃墟)
+Chest of Drawers B (Decoration)|タンスB(装飾)
+Shelf A (Decoration)|棚A(装飾)
+Bookshelf B (Decoration)|本棚B(装飾)
+Stacked Crates|積まれた木箱
+Shipping Container|コンテナ
+Stacked Cardboard Boxes|積まれたダンボール
+Vending Machine|自動販売機
+ATM|ATM
+Steel Shelf|鉄骨棚
+Operating Table|手術台
+Hospital Bed|病院ベッド
+Stacked Crates|積まれた木箱
+Shipping Container|コンテナ
+Stacked Cardboard Boxes|積まれたダンボール
+Vending Machine|自動販売機
+ATM|ATM
+Steel Shelf|鉄骨棚
+Operating Table|手術台
+Hospital Bed|病院ベッド
+Bed|ベッド
+Mattress|敷布団
+Large Bed|ダブルベッド
+Large Bed|ダブルベッド
+Pipe Frame Bed|パイプベッド
+Slot Machine|スロット
+Poker Table|ポーカー台
+Poker Table|ポーカー台
+Bed|ベッド
+Mattress|敷布団
+Large Bed|ダブルベッド
+Large Bed|ダブルベッド
+Pipe Frame Bed|パイプベッド
+Slot Machine|スロット
+Poker Table|ポーカー台
+Poker Table|ポーカー台
+Chest A (Wood)|チェストA(木製)
+Chest B (Metal)|チェストB(金属)
+Chest C (Decoration)|チェストC(装飾)
+Large Desk A|大きいデスクA
+Large Desk A|大きいデスクA
+Roulette Table|ルーレット台
+Roulette Table|ルーレット台
+Roulette Table|ルーレット台
+Side Desk A (Wood)|サイドデスクA(木製)
+Side Desk B (Metal)|サイドデスクB(金属)
+Desk|デスク
+Large Desk B|大きいデスクB
+Large Desk B|大きいデスクB
+Roulette Table|ルーレット台
+Roulette Table|ルーレット台
+Roulette Table|ルーレット台
\ No newline at end of file
diff --git a/img/tilesets/SF_Inside_C.png b/img/tilesets/SF_Inside_C.png
new file mode 100644
index 0000000..62a5cf6
Binary files /dev/null and b/img/tilesets/SF_Inside_C.png differ
diff --git a/img/tilesets/SF_Inside_C.txt b/img/tilesets/SF_Inside_C.txt
new file mode 100644
index 0000000..8a0ffdb
--- /dev/null
+++ b/img/tilesets/SF_Inside_C.txt
@@ -0,0 +1,256 @@
+Black Board|黒板
+Black Board|黒板
+Black Board|黒板
+White Board|ホワイトボード
+White Board|ホワイトボード
+White Board|ホワイトボード
+Partition A|衝立A
+Partition B|衝立B
+Black Board|黒板
+Black Board|黒板
+Black Board|黒板
+White Board|ホワイトボード
+White Board|ホワイトボード
+White Board|ホワイトボード
+Partition A|衝立A
+Partition B|衝立B
+Stool|腰掛けイス
+Skeleton Model|骨格模型
+Biological Specimen|生物標本
+Potted Plant|植木鉢
+Armchair|肘掛け椅子
+Insect Specimen|昆虫標本
+Restroom Mark (Men)|トイレマーク(男性)
+Restroom Mark (Women)|トイレマーク(女性)
+Wall Speaker|壁掛けスピーカー
+Skeleton Model |骨格模型
+Biological Specimen|生物標本
+Fire Extinguisher|消火器
+Armchair|肘掛け椅子
+Room Plate|室名札
+EXIT Sign|EXIT
+Vent|通気口
+Painting A|絵画A
+Painting B|絵画B
+Vision Test Chart|視力検査表
+Plaster Bust|石膏胸像
+Calendar|カレンダー
+Plant A|植物A
+Plant B|植物B
+Plant C|植物C
+Painting C|絵画C
+Painting D|絵画D
+Anatomical Chart|人体図
+Canvas|キャンバス
+Bulletin Board|掲示板
+Plant A|植物A
+Plant B|植物B
+Plant C|植物C
+Plumbing|配管
+Plumbing|配管
+Valve|バルブ
+Machine A|機械A
+Machine B|機械B
+Machine C|機械C
+Air Vent A|通風口A
+Air Vent B|通風口B
+Plumbing|配管
+Plumbing|配管
+Plumbing|配管
+Neon Tube|ネオン管
+Neon Tube|ネオン管
+Neon Tube|ネオン管
+Fan|ファン
+Fluorescent Light|蛍光灯
+Plumbing|配管
+Plumbing|配管
+Plumbing|配管
+Neon Tube|ネオン管
+Neon Tube|ネオン管
+Neon Tube|ネオン管
+Outdoor Air Intake Unit|室外機
+Shutter|シャッター
+Plumbing|配管
+Plumbing|配管
+Plumbing|配管
+Control Panel A|操作パネルA
+Control Panel B|操作パネルB
+Control Panel C|操作パネルC
+Pipe (H)|パイプ(横)
+Pipe (V)|パイプ(縦)
+Line A|ラインA
+Line B|ラインB
+Road Closed|通行止め
+Waste|廃棄物
+Scrap Metal|スクラップ
+Mysterious Liquid|謎の液体
+Scattered Papers|散らばった紙
+Pipe (V)|パイプ(縦)
+Belt Conveyor (V)|ベルトコンベアー(縦)
+Belt Conveyor (H)|ベルトコンベアー(横)
+Belt Conveyor (H)|ベルトコンベアー(横)
+Belt Conveyor (H)|ベルトコンベアー(横)
+Duct|ダクト
+Mechanical Device|機械装置
+Pile of Rubble|瓦礫の山
+Pile of Rubble|瓦礫の山
+Belt Conveyor (V)|ベルトコンベアー(縦)
+Robot Arm|ロボットアーム
+Server Machine|サーバマシン
+Meters|計器類
+Duct|ダクト
+Mechanical Device|機械装置
+Pile of Rubble|瓦礫の山
+Pile of Rubble|瓦礫の山
+Belt Conveyor (V)|ベルトコンベアー(縦)
+Robot Arm|ロボットアーム
+Server Machine|サーバマシン
+Meters|計器類
+Duct|ダクト
+Drain|排水口
+Graffiti|落書き
+Graffiti|落書き
+Monitor A|モニターA
+Monitor B|モニターB
+Large Monitor|大型モニター
+Large Monitor|大型モニター
+IV Stand|点滴スタンド
+ECG Monitor|心電図モニタ
+Sewing Mannequin|トルソー
+Rubble|瓦礫
+Operation Board A|操作盤A
+Operation Board B|操作盤B
+Operation Board C|操作盤C
+Operation Board D|操作盤D
+IV Stand|点滴スタンド
+ECG Monitor|心電図モニタ
+Sewing Mannequin|トルソー
+Broken Machine|壊れた機械
+Stairs|階段
+Stairs|階段
+Stairs|階段
+Cage|檻
+Cage|檻
+Handrail|欄干
+Handrail|欄干
+Handrail|欄干
+Stairs|階段
+Stairs|階段
+Stairs|階段
+Curtains A|カーテンA
+Curtains B|カーテンB
+Curtains C|カーテンC
+Curtains D|カーテンD
+Handrail|欄干
+Stairs|階段
+Stairs|階段
+Stairs|階段
+Curtains A|カーテンA
+Curtains B|カーテンB
+Curtains C|カーテンC
+Curtains D|カーテンD
+Emergency Alarm|非常ベル
+Spider Web|蜘蛛の巣
+Mirror|鏡
+Vase|花瓶
+Piano|ピアノ
+Piano|ピアノ
+Piano|ピアノ
+Stained Glass|ステンドグラス
+Decorative Pillar|装飾柱
+Dripping|液垂れ
+Mirror|鏡
+Lamp|電気スタンド
+Piano|ピアノ
+Piano|ピアノ
+Piano|ピアノ
+Stained Glass|ステンドグラス
+Decorative Pillar|装飾柱
+Picture Frame|写真立て
+Side Table|サイドテーブル
+Altar|祭壇
+Fireplace|暖炉
+Fireplace|暖炉
+Fireplace|暖炉
+Stuffed Doll A|ぬいぐるみA
+Decorative Pillar|装飾柱
+Book A|本A
+Book B|本B
+Glass Pieces|ガラス片
+Fireplace|暖炉
+Fireplace|暖炉
+Fireplace|暖炉
+Doll|人形
+Stuffed Doll B|ぬいぐるみB
+Beer Mug|ビールジョッキ
+Wine & Glass|ワインとグラス
+Noodle Dish|麺料理
+Bread|パン
+Banister A (V)|手すりA(縦)
+Banister A (V)|手すりA(縦)
+Banister B (V)|手すりB(縦)
+Banister B (V)|手すりB(縦)
+Meat Dish|肉料理
+Roast Chicken|ローストチキン
+Cake|ケーキ
+Fruit Bowl|果物盛り合わせ
+Banister A (V)|手すりA(縦)
+Banister A (V)|手すりA(縦)
+Banister B (V)|手すりB(縦)
+Banister B (V)|手すりB(縦)
+Plate A|皿A
+Teapot & Cup|ティーポットとカップ
+Ration|レーション
+Plate B|皿B
+Banister A (V)|手すりA(縦)
+Banister A (V)|手すりA(縦)
+Banister B (V)|手すりB(縦)
+Banister B (V)|手すりB(縦)
+Demon Statue|悪魔像
+Goddess Statue|女神像
+Soldier Statue|兵士像
+Wall Clock|柱時計
+Banister A (H)|手すりA(横)
+Banister A (H)|手すりA(横)
+Banister A (H)|手すりA(横)
+Banister A (H)|手すりA(横)
+Demon Statue|悪魔像
+Goddess Statue|女神像
+Soldier Statue|兵士像
+Wall Clock|柱時計
+Banister B (H)|手すりB(横)
+Banister B (H)|手すりB(横)
+Banister B (H)|手すりB(横)
+Banister B (H)|手すりB(横)
+Monument A|モニュメントA
+Monument B|モニュメントB
+Huge Stele|巨大な石版
+Huge Stele|巨大な石版
+Huge Stele|巨大な石版
+Huge Display|巨大ディスプレイ
+Huge Display|巨大ディスプレイ
+Huge Display|巨大ディスプレイ
+Monument A|モニュメントA
+Monument B|モニュメントB
+Huge Stele|巨大な石版
+Huge Stele|巨大な石版
+Huge Stele|巨大な石版
+Huge Display|巨大ディスプレイ
+Huge Display|巨大ディスプレイ
+Huge Display|巨大ディスプレイ
+Monument C|モニュメントC
+Monument D|モニュメントD
+Sphere Machinery|球体機械
+Sphere Machinery|球体機械
+Sphere Machinery|球体機械
+Large Machine|大型機械
+Large Machine|大型機械
+Large Machine|大型機械
+Monument C|モニュメントC
+Control Panel|コントロールパネル
+Sphere Machinery|球体機械
+Sphere Machinery|球体機械
+Sphere Machinery|球体機械
+Large Machine|大型機械
+Large Machine|大型機械
+Large Machine|大型機械
diff --git a/img/tilesets/SF_Outside_A3.png b/img/tilesets/SF_Outside_A3.png
new file mode 100644
index 0000000..2b69441
Binary files /dev/null and b/img/tilesets/SF_Outside_A3.png differ
diff --git a/img/tilesets/SF_Outside_A3.txt b/img/tilesets/SF_Outside_A3.txt
new file mode 100644
index 0000000..a2a7417
--- /dev/null
+++ b/img/tilesets/SF_Outside_A3.txt
@@ -0,0 +1,32 @@
+Roof A (Brick)|屋根A(レンガ)
+Roof B (Factory)|屋根B(工場)
+Roof C (Metal, Red Rust)|屋根C(金属・赤錆)
+Roof D (Barracks)|屋根D(バラック)
+Roof E (Barracks)|屋根E(バラック)
+Roof F (Barracks)|屋根F(バラック)
+Roor G (Ivy)|屋根G(ツタ)
+Roof H (House)|屋根H(現代住宅)
+Outer Wall A (Stone)|外壁A(石)
+Outer Wall B (Factory)|外壁B(工場)
+Outer Wall C (Metal, Red Rust)|外壁C(金属・赤錆)
+Outer Wall D (Barracks)|外壁D(バラック)
+Outer Wall E (Barracks)|外壁E(バラック)
+Outer Wall F (Factory)|外壁F(工場)
+Outer Wall G (Ivy)|外壁G(ツタ)
+Outer Wall H (House)|外壁H(現代住宅)
+Roof I (Barracks)|屋根I(バラック)
+Roof J (Brick)|屋根J(レンガ)
+Roof K (Metal, Patina)|屋根K(金属・緑青錆)
+Roof L (Chinese)|屋根L(中華風)
+Roof M (Blue Sheet)|屋根M(ブルーシート)
+Roof N (Wood)|屋根N(木造)
+Roof O (Brick)|屋根O(レンガ)
+Roof P (Wood)|屋根P(木造)
+Outer Wall I (Tile)|外壁I(タイル)
+Outer Wall J (Brick)|外壁J(レンガ)
+Outer Wall K (Mortar)|外壁K(モルタル)
+Outer Wall L (Chinese)|外壁L(中華風)
+Outer Wall M (Blue Sheet)|外壁M(ブルーシート)
+Outer Wall N (Wood)|外壁N(木造)
+Outer Wall O (Brick)|外壁O(レンガ)
+Outer Wall P (Wood)|外壁P(木造)
diff --git a/img/tilesets/SF_Outside_A4.png b/img/tilesets/SF_Outside_A4.png
new file mode 100644
index 0000000..18f3c9d
Binary files /dev/null and b/img/tilesets/SF_Outside_A4.png differ
diff --git a/img/tilesets/SF_Outside_A4.txt b/img/tilesets/SF_Outside_A4.txt
new file mode 100644
index 0000000..7d4b9f9
--- /dev/null
+++ b/img/tilesets/SF_Outside_A4.txt
@@ -0,0 +1,48 @@
+Wall A (Concrete)|壁A(コンクリート)
+Wall B (Concrete, Dirty)|壁B(コンクリート・汚れ)
+Wall C (Block)|壁C(ブロック)
+Wall D (Apartment)|壁D(マンション)
+Wall E (Apartment)|壁E(マンション)
+Wall F (Metal)|壁F(金属)
+Wall G (Metal, Red Rust)|壁G(金属・赤錆)
+Wall H (Metal, Patina)|壁H(金属・緑青錆)
+Wall A (Concrete)|壁A(コンクリート)
+Wall B (Concrete, Dirty)|壁B(コンクリート・汚れ)
+Wall C (Block)|壁C(ブロック)
+Wall D (Apartment)|壁D(マンション)
+Wall E (Apartment)|壁E(マンション)
+Wall F (Metal)|壁F(金属)
+Wall G (Metal, Red Rust)|壁G(金属・赤錆)
+Wall H (Metal, Patina)|壁H(金属・緑青錆)
+Wall I (Barracks)|壁I(バラック)
+Wall J (Barracks)|壁J(バラック)
+Wall K (Factory)|壁K(工場)
+Cliff A (Demonic Ground)|崖A(魔界の地面)
+Wall L (Factory)|壁L(工場)
+Wall M (Factory)|壁M(工場)
+Wall N (Building)|壁N(ビル)
+Wall O (Brick)|壁O(レンガ)
+Wall I (Barracks)|壁I(バラック)
+Wall J (Barracks)|壁J(バラック)
+Wall K (Factory)|壁K(工場)
+Cliff A (Demonic Ground)|崖A(魔界の地面)
+Wall L (Factory)|壁L(工場)
+Wall M (Factory)|壁M(工場)
+Wall N (Building)|壁N(ビル)
+Wall O (Brick)|壁O(レンガ)
+Wall P (Chinese)|壁P(中華風)
+Wall Q (Wire Mesh)|壁Q(金網)
+Wall R (Wire Mesh, Red Rust)|壁R(金網・赤錆)
+Wall S (Wire Mesh, Patina)|壁S(金網・緑青錆)
+Wall T (Wood)|壁T(木造)
+Wall U (Wood, Dirty)|壁U(木造・汚れ)
+Wall V (Building)|壁V(ビル)
+Wall W (Building)|壁W(ビル)
+Wall P (Chinese)|壁P(中華風)
+Wall Q (Wire Mesh)|壁Q(金網)
+Wall R (Wire Mesh, Red Rust)|壁R(金網・赤錆)
+Wall S (Wire Mesh, Patina)|壁S(金網・緑青錆)
+Wall T (Wood)|壁T(木造)
+Wall U (Wood, Dirty)|壁U(木造・汚れ)
+Wall V (Building)|壁V(ビル)
+Wall W (Building)|壁W(ビル)
diff --git a/img/tilesets/SF_Outside_A5.png b/img/tilesets/SF_Outside_A5.png
new file mode 100644
index 0000000..e84ea1b
Binary files /dev/null and b/img/tilesets/SF_Outside_A5.png differ
diff --git a/img/tilesets/SF_Outside_A5.txt b/img/tilesets/SF_Outside_A5.txt
new file mode 100644
index 0000000..32f87cb
--- /dev/null
+++ b/img/tilesets/SF_Outside_A5.txt
@@ -0,0 +1,128 @@
+Darkness|暗闇
+Grid floor|格子床
+Metal Bridge (V, Left)|金属橋(縦・左)
+Metal Bridge (V, Center)|金属橋(縦・中央)
+Metal Bridge (V, Right)|金属橋(縦・右)
+Asphalt Bridge (H, Top)|アスファルト橋(横・上)
+Metal Bridge (H, Center)|金属橋(横・中央)
+Metal Bridge (H, Top)|金属橋(横・上)
+Transparent|透明
+Grid floor|格子床
+Asphalt Bridge (V, Left)|アスファルト橋(縦・左)
+Asphalt Bridge (V, Center)|アスファルト橋(縦・中央)
+Asphalt Bridge (V, Right)|アスファルト橋(縦・右)
+Asphalt Bridge (H, Bottom)|アスファルト橋(横・下)
+Asphalt Bridge (H, Center)|アスファルト橋(横・中央)
+Metal Bridge (H, Bottom)|金属橋(横・下)
+Waste Land|荒地
+Metal Floor A (Factory)|金属床A(工場)
+Concrete Floor|コンクリート床
+Concrete Floor (Ruins)|コンクリート床(廃墟)
+Hole|穴
+Grid floor (Ruins)|格子床(廃墟)
+Asphalt Floor (Ruins)|アスファルト床(廃墟)
+Metal Floor A (Factory, Ruins)|金属床A(工場・廃墟)
+Waste Land|荒地
+Metal Floor A (Factory)|金属床A(工場)
+Concrete Floor|コンクリート床
+Mecha Floor|機械床
+Stairs A (Asphalt, Left)|階段A(アスファルト・左)
+Stairs A (Asphalt, Center)|階段A(アスファルト・中央)
+Stairs A (Asphalt, Right)|階段A(アスファルト・右)
+Stairs A (Asphalt)|階段A(アスファルト)
+Dirty Floor|汚れた床
+Dirty Floor (Ruins)|汚れた床(廃墟)
+Mecha Floor (Ruins) A|機械床(廃墟)A
+Mecha Floor (Ruins) B|機械床(廃墟)B
+Asphalt Floor (Dirty)|アスファルト床(汚れ)
+Asphalt Floor (Dirty, Ruins)|アスファルト床(汚れ・廃墟)
+Wood Floor A|木の床A
+Wood Floor A (Ruins)|木の床A(廃墟)
+Bumpy Tile A|点字ブロックA
+Bumpy Tile B|点字ブロックB
+Bumpy Tile C|点字ブロックC
+Bumpy Tile C (Ruins)|点字ブロックC(廃墟)
+Stairs B (Metal, Left)|階段B(金属・左)
+Stairs B (Metal, Center)|階段B(金属・中央)
+Stairs B (Metal, Right)|階段B(金属・右)
+Stairs B (Metal)|階段B(金属)
+Interior Floor A (Green Resin)|内装床A(緑樹脂)
+Interior Floor B (Tile)|内装床B(タイル)
+Interior Floor B (Tile, Ruins)|内装床B(タイル・廃墟)
+Interior Floor C (Decoration)|内装床C(装飾)
+Interior Floor D (Decoration)|内装床D(装飾)
+Interior Floor E (Decoration)|内装床E(装飾)
+Wood Floor B|木の床B
+Wood Floor B (Ruins)|木の床B(廃墟)
+Stairs C (Meadow, Left)|階段C(草地・左)
+Stairs C (Meadow, Center)|階段C(草地・中央)
+Stairs C (Meadow, Right)|階段C(草地・右)
+Stairs C (Meadow)|階段C(草地)
+Stairs D (Wood, Left)|階段D(木製・左)
+Stairs D (Wood, Center)|階段D(木製・中央)
+Stairs D (Wood, Right)|階段D(木製・右)
+Stairs D (Wood)|階段D(木製)
+Cobblestones A|石畳A
+Cobblestones B|石畳B
+Cobblestones C|石畳C
+Cobblestones D|石畳D
+Metal Floor B|金属床B
+Metal Floor B (Rust, Ruins)|金属床B(サビ・廃墟)
+Metal Floor C|金属床C
+Metal Floor C (Rust, Ruins)|金属床C(サビ・廃墟)
+Stairs E (Carpet, Left)|階段E(じゅうたん・左)
+Stairs E (Carpet, Center)|階段E(じゅうたん・中央)
+Stairs E (Carpet, Right)|階段E(じゅうたん・右)
+Stairs E (Carpet)|階段E(じゅうたん)
+Stairs F (Desert, Left)|階段F(砂地・左)
+Stairs F (Desert, Center)|階段F(砂地・中央)
+Stairs F (Desert, Right)|階段F(砂地・右)
+Stairs F (Desert)|階段F(砂地)
+Mark Floor A|マーク床A
+Mark Floor B|マーク床B
+Mark Floor C|マーク床C
+Mark Floor D|マーク床D
+Mark Floor E|マーク床E
+Mark Floor E (Ruins)|マーク床E(廃墟)
+Mark Floor F (Off)|マーク床F(消)
+Mark Floor F|マーク床F
+Neon Floor|ネオン床
+Interior Floor F (Tile Carpet)|内装床F(タイルカーペット)
+Interior Floor F (Tile Carpet, Ruins)|内装床F(タイルカーペット・廃墟)
+Ledge (Demonic Ground)|段差(魔界の地面)
+Ledge (Demonic Ground)|段差(魔界の地面)
+Ledge (Demonic Ground)|段差(魔界の地面)
+Ledge (Demonic Ground)|段差(魔界の地面)
+Ledge (Demonic Ground)|段差(魔界の地面)
+Marble Floor|大理石床
+Interior Floor G (Linoleum)|内装床G(リノリウム)
+Interior Floor G (Linoleum, Ruins)|内装床G(リノリウム・廃墟)
+Ledge (Demonic Ground)|段差(魔界の地面)
+Ledge (Demonic Ground)|段差(魔界の地面)
+Ledge (Demonic Ground)|段差(魔界の地面)
+Ledge (Demonic Ground)|段差(魔界の地面)
+Ledge (Demonic Ground)|段差(魔界の地面)
+Stairs G (Tile Carpet, Left)|階段G(タイルカーペット・左)
+Stairs G (Tile Carpet, Center)|階段G(タイルカーペット・中央)
+Stairs G (Tile Carpet, Right)|階段G(タイルカーペット・右)
+Stairs G (Tile Carpet)|階段G(タイルカーペット)
+Cobblestones E|石畳E
+Ledge (Demonic Ground)|段差(魔界の地面)
+Ledge (Demonic Ground)|段差(魔界の地面)
+Ledge (Demonic Ground)|段差(魔界の地面)
+Stairs H (Linoleum, Left)|階段H(リノリウム・左)
+Stairs H (Linoleum, Center)|階段H(リノリウム・中央)
+Stairs H (Linoleum, Right)|階段H(リノリウム・右)
+Stairs H (Linoleum)|階段H(リノリウム)
+Cobblestones F|石畳F
+Cliff (Demonic Ground)|崖(魔界の地面)
+Cliff (Demonic Ground)|崖(魔界の地面)
+Cliff (Demonic Ground)|崖(魔界の地面)
+Marble Floor (Ruins)|大理石床(廃墟)
+Wood Floor C|木の床C
+Wood Floor C (Ruins)|木の床C(廃墟)
+Metal Floor D (Machine)|金属床D(機械)
+Metal Floor D (Machine, Ruins)|金属床D(機械・廃墟)
+Cliff (Demonic Ground)|崖(魔界の地面)
+Cliff (Demonic Ground)|崖(魔界の地面)
+Cliff (Demonic Ground)|崖(魔界の地面)
diff --git a/img/tilesets/SF_Outside_B.png b/img/tilesets/SF_Outside_B.png
new file mode 100644
index 0000000..5cc3745
Binary files /dev/null and b/img/tilesets/SF_Outside_B.png differ
diff --git a/img/tilesets/SF_Outside_B.txt b/img/tilesets/SF_Outside_B.txt
new file mode 100644
index 0000000..6bcb07b
--- /dev/null
+++ b/img/tilesets/SF_Outside_B.txt
@@ -0,0 +1,256 @@
+Transparent|透明
+Neon Shop Sign (Weapon)|ネオン看板(武器屋)
+Neon Shop Sign (Armor)|ネオン看板(防具屋)
+Neon Shop Sign (Item)|ネオン看板(アイテム屋)
+Neon Shop Sign (Pharmacy)|ネオン看板(薬屋)
+Neon Shop Sign (Cafe)|ネオン看板(酒場)
+Neon Shop Sign (Inn)|ネオン看板(宿屋)
+Neon Shop Sign (Market)|ネオン看板(マーケット)
+Metal Shop Sign (Weapon)|金属看板(武器屋)
+Metal Shop Sign (Armor)|金属看板(防具屋)
+Metal Shop Sign (Item)|金属看板(アイテム屋)
+Metal Shop Sign (Pharmacy)|金属看板(薬屋)
+Metal Shop Sign (Cafe)|金属看板(酒場)
+Metal Shop Sign (Inn)|金属看板(宿屋)
+Metal Shop Sign (Firearm)|金属看板(銃器屋)
+Metal Shop Sign (Blank)|金属看板(無地)
+Asphalt Bridge (V)|アスファルトの橋(縦)
+Asphalt Bridge (H)|アスファルトの橋(横)
+Stone Bridge (V)|石の橋(縦)
+Stone Bridge (H)|石の橋(横)
+Metal Bridge A (V)|金属の橋A(縦)
+Metal Bridge A (H)|金属の橋A(横)
+Metal Bridge B (V)|金属の橋B(縦)
+Metal Bridge B (H)|金属の橋B(横)
+Bridge Spar A (Asphalt, Center A)|橋げたA(アスファルト・中央A)
+Bridge Spar A (Asphalt, Left)|橋げたA(アスファルト・左)
+Bridge Spar A (Asphalt, Center B)|橋げたA(アスファルト・中央B)
+Bridge Spar A (Asphalt, Right)|橋げたA(アスファルト・右)
+Bridge Spar B (Metal, Center A)|橋げたB(金属・中央A)
+Bridge Spar B (Metal, Left)|橋げたB(金属・左)
+Bridge Spar B (Metal, Center B)|橋げたB(金属・中央B)
+Bridge Spar B (Metal, Right)|橋げたB(金属・右)
+White Line|白線
+White Line|白線
+White Line|白線
+White Line|白線
+White Line|白線
+Red & Black Line|赤黒線
+Red & Black Line|赤黒線
+Red & Black Line|赤黒線
+White Line|白線
+Traffic Lights (Car)|信号機(車)
+Traffic Lights (Pedestrian)|信号機(歩行者)
+Entrance A|入口A
+White Line (Crosswalk)|白線(横断歩道)
+Red & Black Line|赤黒線
+Traffic Cone|通行止めコーン
+Red & Black Line|赤黒線
+White Line|白線
+Traffic Lights (Car)|信号機(車)
+Traffic Lights (Pedestrian)|信号機(歩行者)
+Entrance B|入口B
+White Line|白線
+Red & Black Line|赤黒線
+Red & Black Line|赤黒線
+Red & Black Line|赤黒線
+Window A|窓A
+Window B|窓B
+Window C|窓C
+Window D|窓D
+Window E|窓E
+Window F|窓F
+Window G|窓G
+Window H|窓H
+Midsize Window A|中型窓A
+Midsize Window B|中型窓B
+Midsize Window C|中型窓C
+Midsize Window D|中型窓D
+Midsize Window E|中型窓E
+Midsize Window F|中型窓F
+Midsize Window G|中型窓G
+Midsize Window H|中型窓H
+Midsize Window A|中型窓A
+Midsize Window B|中型窓B
+Midsize Window C|中型窓C
+Midsize Window D|中型窓D
+Midsize Window E|中型窓E
+Midsize Window F|中型窓F
+Midsize Window G|中型窓G
+Midsize Window H|中型窓H
+Neon Shop Sign (V)|ネオン看板(縦)
+Neon Shop Sign (V)|ネオン看板(縦)
+Neon Shop Sign (V)|ネオン看板(縦)
+Neon Shop Sign (H)|ネオン看板(横)
+Neon Shop Sign (H)|ネオン看板(横)
+Street Light A|街灯A
+Street Light B|街灯B
+Stained Glass Window|ステンドグラス
+Neon Shop Sign (V)|ネオン看板(縦)
+Neon Shop Sign (V)|ネオン看板(縦)
+Neon Shop Sign (V)|ネオン看板(縦)
+Neon Shop Sign (H)|ネオン看板(横)
+Neon Shop Sign (H)|ネオン看板(横)
+Street Light A|街灯A
+Street Light B|街灯B
+Stained Glass Window|ステンドグラス
+Neon Shop Sign (V)|ネオン看板(縦)
+Neon Shop Sign (V)|ネオン看板(縦)
+Neon Shop Sign (V)|ネオン看板(縦)
+Neon Shop Sign (H)|ネオン看板(横)
+Neon Shop Sign (H)|ネオン看板(横)
+Stacked Crates|積まれた木箱
+Shipping Container|コンテナ
+Stacked Cardboard|積まれたダンボール
+Chimney A|煙突A
+Chimney B|煙突B
+Chimney C|煙突C
+Exhaust Port Wall|壁面用排気口
+Roof Window|屋根用出窓
+Stacked Crates|積まれた木箱
+Shipping Container|コンテナ
+Stacked Cardboard|積まれたダンボール
+Wall Poster|張り紙
+Signboard A|看板A
+Signboard B|看板B
+Digital Signage A|電子看板A
+Digital Signage C|電子看板C
+Neon Shop Sign (CASINO)|ネオン看板(カジノ)
+Neon Shop Sign (CASINO)|ネオン看板(カジノ)
+Small Crane|小型クレーン
+Poster|ポスター
+Signboard C|看板C
+Digital Signage B|電子看板B
+Digital Signage B|電子看板B
+Digital Signage C|電子看板C
+Iron Materials|鉄資材
+Helmet|ヘルメット
+Small Crane|小型クレーン
+Crate|木箱
+Shipping Container|コンテナ
+Cardboard Box|ダンボール
+Barrel|樽
+Oil Drum|ドラム缶
+Garbage Can|ゴミ箱
+Sorted Waste Bins|分別ゴミ箱
+Sorted Waste Bins|分別ゴミ箱
+Plant A|植物A
+Plant B|植物B
+Plant C|植物C
+Vending Machine|自動販売機
+ATM|ATM
+Tree|木
+Roadside Tree|街路樹
+Utility Pole|電柱
+Plant A|植物A
+Plant B|植物B
+Plant C|植物C
+Vending Machine|自動販売機
+ATM|ATM
+Tree|木
+Avenue Tree|街路樹
+Utility Pole|電柱
+Public Phone|公衆電話
+Machine Device|機械端末
+Planter (Plant)|プランター(植物)
+Planter (Potted Plant)|プランター(盆栽)
+Potted Plant|植木鉢
+Tree (Loop)|木(ループ)
+Tombstone (Cross)|墓石(十字架)
+Tombstone (Plaque)|墓石(プレート)
+Neon Tube|ネオン管
+Neon Tube|ネオン管
+Machine A|機械A
+Machine B|機械B
+Machine C|機械C
+Barricade (No Entry)|バリケード(通行禁止)
+Bar (No Entry)|バー(通行禁止)
+Bar (No Entry)|バー(通行禁止)
+Neon Tube|ネオン管
+Neon Tube|ネオン管
+Outdoor Air Intake Unit|室外機
+Waste|廃棄物
+Scrap Metal|スクラップ
+Fissures A|亀裂A
+Fissures B|亀裂B
+Fissures C|亀裂C
+Neon Tube|ネオン管
+Neon Tube|ネオン管
+Air Vent A|通風口A
+Air Vent B|通風口B
+Shutter|シャッター
+Fissures A|亀裂A
+Fissures B|亀裂B
+Fissures C|亀裂C
+Drain|排水口
+Guardrail|ガードレール
+Timetable|時刻表
+Piled Up Tires|積まれたタイヤ
+Small Fuel Tank|小型燃料タンク
+Car (Red)|車(赤)
+Car (Red)|車(赤)
+Manhole|マンホール
+Bus|バス
+Bus|バス
+Truck|トラック
+Truck|トラック
+Wrecked Car|壊れた車
+Car (Black)|車(黒)
+Car (Black)|車(黒)
+Vent|通気口
+Bus|バス
+Bus|バス
+Truck|トラック
+Truck|トラック
+Wrecked Car|壊れた車
+Car (Blue)|車(青)
+Car (Blue)|車(青)
+Oil Drum (Leak)|ドラム缶(液漏れ)
+Food Stalls|露店(食べ物)
+Food Stalls|露店(食べ物)
+Food Stalls|露店(食べ物)
+Stall Goods A|露店商品A
+Stairs A (Up)|階段A(上り)
+Stairs B (Up)|階段B(上り)
+Stairs C (Down)|階段C(下り)
+Stairs D (Down)|階段D(下り)
+Food Stalls|露店(食べ物)
+Food Stalls|露店(食べ物)
+Food Stalls|露店(食べ物)
+Stall Goods B|露店商品B
+Stairs C (Up)|階段C(上り)
+Stairs D (Up)|階段D(上り)
+Stairs A (Down)|階段A(下り)
+Stairs B (Down)|階段B(下り)
+Food Stalls|露店(食べ物)
+Food Stalls|露店(食べ物)
+Food Stalls|露店(食べ物)
+Stall Goods C|露店商品C
+Metal Ladder|鉄ばしご
+Metal Stairs|金属階段
+Rope|ロープ
+Net|ネット
+Junk Stalls|露店(ジャンク)
+Junk Stalls|露店(ジャンク)
+Junk Stalls|露店(ジャンク)
+Stall Goods D|露店商品D
+Metal Ladder|鉄ばしご
+Metal Stairs|金属階段
+Rope|ロープ
+Net|ネット
+Junk Stalls|露店(ジャンク)
+Junk Stalls|露店(ジャンク)
+Junk Stalls|露店(ジャンク)
+Stall Goods E|露店商品E
+Metal Ladder|鉄ばしご
+Metal Stairs|金属階段
+Rope|ロープ
+Net|ネット
+Junk Stalls|露店(ジャンク)
+Junk Stalls|露店(ジャンク)
+Junk Stalls|露店(ジャンク)
+Stall Goods F|露店商品F
+Hole A (Metal Ladder)|穴A(鉄ばしご)
+Hole B (Metal Stairs)|穴B(金属階段)
+Hole C (Rope)|穴C(ロープ)
+Hole|穴
diff --git a/img/tilesets/SF_Outside_C.png b/img/tilesets/SF_Outside_C.png
new file mode 100644
index 0000000..5220e01
Binary files /dev/null and b/img/tilesets/SF_Outside_C.png differ
diff --git a/img/tilesets/SF_Outside_C.txt b/img/tilesets/SF_Outside_C.txt
new file mode 100644
index 0000000..90a0cbe
--- /dev/null
+++ b/img/tilesets/SF_Outside_C.txt
@@ -0,0 +1,256 @@
+Fountain A|噴水A
+Fountain A|噴水A
+Fountain B|噴水B
+Fountain B|噴水B
+Slide|滑り台
+Slide|滑り台
+Exercise Bar|鉄棒
+Drinking Fountain|水飲み場
+Fountain A|噴水A
+Fountain A|噴水A
+Fountain B|噴水B
+Fountain B|噴水B
+Slide|滑り台
+Slide|滑り台
+Water Well Pump|ポンプ井戸
+Garbage Dumpster|ごみ収集箱
+Fountain C|噴水C
+Fountain C|噴水C
+Fountain C|噴水C
+Bench A|ベンチA
+Bench A|ベンチA
+Swing|ブランコ
+Shop Canopy|店用天蓋
+Barbed Wire|有刺鉄線
+Fountain C|噴水C
+Fountain C|噴水C
+Fountain C|噴水C
+Bench B|ベンチB
+Bench B|ベンチB
+Swing|ブランコ
+Shop Canopy|店用天蓋
+Barbed Wire|有刺鉄線
+Grass A|草A
+Grass B|草B
+Hole|穴
+Small Stones|小石
+Flower Bed|花壇
+Flower Bed|花壇
+Flower Bed|花壇
+Barbed Wire|有刺鉄線
+Flower|花
+Cage|檻
+Cage|檻
+Graffiti|落書き
+Graffiti|落書き
+Barbed Wire|有刺鉄線
+Barbed Wire|有刺鉄線
+Barbed Wire|有刺鉄線
+Demon Statue|悪魔像
+Goddess Statue|女神像
+Metal Fence|金属フェンス
+Metal Fence|金属フェンス
+Metal Fence|金属フェンス
+Gutter|側溝
+Gutter|側溝
+Gutter|側溝
+Demon Statue|悪魔像
+Goddess Statue|女神像
+Metal Fence|金属フェンス
+Warning Plate|警告プレート
+Metal Fence|金属フェンス
+Gutter|側溝
+Postal Box|ポスト
+Gutter|側溝
+Soldier Statue|兵士像
+Warning Plate (Biohazard Mark)|警告プレート(バイオハザードマーク)
+Metal Fence|金属フェンス
+Metal Fence|金属フェンス
+Metal Fence|金属フェンス
+Gutter|側溝
+Gutter|側溝
+Gutter|側溝
+Soldier Statue|兵士像
+Pillar A (Asphalt)|柱A(アスファルト)
+Pillar B (Metal)|柱B(金属)
+Pillar C (Machine)|柱C(機械)
+Pillar D (Decoration)|柱D(装飾)
+Pillar E (Metal)|柱E(金属)
+Pillar F (Brick)|柱F(レンガ)
+Food Waste|生ゴミ
+Warning Plate|警告プレート
+Pillar A (Asphalt)|柱A(アスファルト)
+Pillar B (Metal)|柱B(金属)
+Pillar C (Machine)|柱C(機械)
+Pillar D (Decoration)|柱D(装飾)
+Pillar E (Metal)|柱E(金属)
+Pillar F (Brick)|柱F(レンガ)
+Mysterious Liquid|謎の液体
+Warning Plate|警告プレート
+Broken Pillar A (Asphalt)|折れた柱A(アスファルト)
+Broken Pillar B (Metal)|折れた柱B(金属)
+Broken Pillar C (Machine)|折れた柱C(機械)
+Broken Pillar D (Decoration)|折れた柱D(装飾)
+Broken Pillar E (Metal)|折れた柱E(金属)
+Broken Pillar F (Brick)|折れた柱F(レンガ)
+Fire Hydrant|消火栓
+Monument A|モニュメントA
+Monument B|モニュメントB
+Huge Stele|巨大な石版
+Huge Stele|巨大な石版
+Huge Stele|巨大な石版
+Huge Iron Monument|巨大プレート
+Huge Iron Monument|巨大プレート
+Huge Iron Monument|巨大プレート
+Monument A|モニュメントA
+Monument B|モニュメントB
+Huge Stele|巨大な石版
+Huge Stele|巨大な石版
+Huge Stele|巨大な石版
+Huge Iron Monument|巨大プレート
+Huge Iron Monument|巨大プレート
+Huge Iron Monument|巨大プレート
+Monument C|モニュメントC
+Monument D|モニュメントD
+Sphere Machinery|球体機械
+Sphere Machinery|球体機械
+Sphere Machinery|球体機械
+Large Machine|大型機械
+Large Machine|大型機械
+Large Machine|大型機械
+Monument C|モニュメントC
+Control Panel|コントロールパネル
+Sphere Machinery|球体機械
+Sphere Machinery|球体機械
+Sphere Machinery|球体機械
+Large Machine|大型機械
+Large Machine|大型機械
+Large Machine|大型機械
+Wall A|壁A
+Wall A|壁A
+Wall A|壁A
+Decorative Pillar A|装飾柱A
+Arch A|門A
+Arch A|門A
+Arch A|門A
+Decorative Pillar B|装飾柱B
+Wall A|壁A
+Wall A|壁A
+Wall A|壁A
+Decorative Pillar A|装飾柱A
+Arch A|門A
+Arch A|門A
+Arch A|門A
+Decorative Pillar B|装飾柱B
+Wall A|壁A
+Wall A|壁A
+Wall A|壁A
+Decorative Pillar A|装飾柱A
+Arch A|門A
+Arch A|門A
+Arch A|門A
+Decorative Pillar B|装飾柱B
+Wall B (Topside)|壁B(上面)
+Wall B (Topside)|壁B(上面)
+Wall B (Topside)|壁B(上面)
+Spire|尖塔
+Clock Tower|時計塔
+Clock Tower|時計塔
+Clock Tower|時計塔
+Wall A Ceiling|壁A天井
+Wall B (Topside)|壁B(上面)
+Wall B (Topside)|壁B(上面)
+Wall B (Topside)|壁B(上面)
+Spire|尖塔
+Clock Tower|時計塔
+Clock Tower|時計塔
+Clock Tower|時計塔
+Decorative Pillar A (Front)|装飾柱A(手前)
+Wall B (Topside)|壁B(上面)
+Wall B (Topside)|壁B(上面)
+Wall B (Topside)|壁B(上面)
+Spire|尖塔
+Clock Tower|時計塔
+Clock Tower|時計塔
+Clock Tower|時計塔
+Decorative Pillar B (Front)|装飾柱B(手前)
+Wall B|壁B
+Wall B|壁B
+Wall B|壁B
+Spire|尖塔
+Arch B|門B
+Arch B|門B
+Arch B|門B
+Iron Fence B|鉄柵B
+Wall B|壁B
+Wall B|壁B
+Wall B|壁B
+Spire|尖塔
+Arch B|門B
+Arch B|門B
+Arch B|門B
+Gate|門扉
+Wall B|壁B
+Wall B|壁B
+Wall B|壁B
+Spire|尖塔
+Arch B|門B
+Arch B|門B
+Arch B|門B
+Gate|門扉
+Rooftop Railing|屋上用手すり
+Rooftop Railing|屋上用手すり
+Rooftop Railing|屋上用手すり
+Iron Fence A|鉄柵A
+Tank|戦車
+Tank|戦車
+Helicopter|ヘリコプター
+Helicopter|ヘリコプター
+Rooftop Railing|屋上用手すり
+Round Clock|丸時計
+Rooftop Railing|屋上用手すり
+Iron Fence A|鉄柵A
+Tank|戦車
+Tank|戦車
+Helicopter|ヘリコプター
+Helicopter|ヘリコプター
+Rooftop Railing|屋上用手すり
+Rooftop Railing|屋上用手すり
+Rooftop Railing|屋上用手すり
+Iron Fence A|鉄柵A
+Rooftop Billboard B|屋上看板B
+Rooftop Billboard B|屋上看板B
+Food Cart|屋台
+Food Cart|屋台
+Convenience Store|コンビニエンスストア
+Convenience Store|コンビニエンスストア
+Convenience Store|コンビニエンスストア
+Steel Tower|鉄塔
+Rooftop Billboard A|屋上看板A
+Roof|屋根
+Roof|屋根
+Roof|屋根
+Convenience Store|コンビニエンスストア
+Convenience Store|コンビニエンスストア
+Convenience Store|コンビニエンスストア
+Steel Tower|鉄塔
+Water Storage Tank|貯水タンク
+Roof|屋根
+Roof|屋根
+Roof|屋根
+Bus Waiting Area|待合所
+Bus Waiting Area|待合所
+Station Kiosk|駅の売店
+Steel Tower|鉄塔
+Water Storage Tank|貯水タンク
+Roof|屋根
+Roof|屋根
+Roof|屋根
+Bus Waiting Area|待合所
+Bus Waiting Area|待合所
+Station Kiosk|駅の売店
+Roof Detail|屋根飾り
+Roof|屋根
+Roof|屋根
+Roof|屋根
+Roof|屋根
diff --git a/img/tilesets/World_A1.png b/img/tilesets/World_A1.png
new file mode 100644
index 0000000..f39b4d6
Binary files /dev/null and b/img/tilesets/World_A1.png differ
diff --git a/img/tilesets/World_A1.txt b/img/tilesets/World_A1.txt
new file mode 100644
index 0000000..9055912
--- /dev/null
+++ b/img/tilesets/World_A1.txt
@@ -0,0 +1,16 @@
+Sea|海
+Deep Sea|深い海
+Rock Shoal|岩礁
+Icebergs|氷山
+Poison Swamp|毒の沼
+Dead Trees|枯れ木
+Lava|溶岩
+Lava Bubbles|溶岩の泡
+Pond|池
+Boulder|岩
+Frozen Sea|凍った海
+Whirlpool|渦
+Land's End|大地の境界
+Endless Waterfall|下界に落ちる滝
+Cloud (Land's End)|雲(大地の境界)
+Cloud|雲
diff --git a/img/tilesets/World_A2.png b/img/tilesets/World_A2.png
new file mode 100644
index 0000000..4e9ff07
Binary files /dev/null and b/img/tilesets/World_A2.png differ
diff --git a/img/tilesets/World_A2.txt b/img/tilesets/World_A2.txt
new file mode 100644
index 0000000..fc9cbf5
--- /dev/null
+++ b/img/tilesets/World_A2.txt
@@ -0,0 +1,32 @@
+Grassland A|草原A
+Grassland A (Dark)|草原A(濃)
+Grassland B|草原B
+Grassland B (Dark)|草原B(濃)
+Forest|森
+Forest (Conifer)|森(針葉樹)
+Mountain (Grass)|山(草)
+Mountain (Dirt)|山(土)
+Wasteland A|荒れ地A
+Wasteland B|荒れ地B
+Dirt Field A|土肌A
+Dirt Field B|土肌B
+Forest (Dead Trees)|森(枯れ木)
+Road (Dirt)|道(土)
+Hill (Dirt)|丘(土)
+Mountain (Sandstone)|山(砂岩)
+Desert A|砂漠A
+Desert B|砂漠B
+Rocky Land A|岩地A
+Rocky Land B (Lava)|岩地B(溶岩)
+Forest (Palm Trees)|森(ヤシの木)
+Road (Paved)|道(舗装)
+Mountain (Rock)|山(岩)
+Mountain (Lava)|山(溶岩)
+Snowfield|雪原
+Mountain (Snow)|山(雪)
+Clouds|雲
+Large Clouds|大きな雲
+Forest (Snow)|森(雪)
+Pit|穴
+Hill (Sandstone)|丘(砂岩)
+Hill (Snow)|丘(雪)
diff --git a/img/tilesets/World_B.png b/img/tilesets/World_B.png
new file mode 100644
index 0000000..484e86e
Binary files /dev/null and b/img/tilesets/World_B.png differ
diff --git a/img/tilesets/World_B.txt b/img/tilesets/World_B.txt
new file mode 100644
index 0000000..e7674b1
--- /dev/null
+++ b/img/tilesets/World_B.txt
@@ -0,0 +1,256 @@
+Transparent|透明
+Sign|立て札
+Pier (H)|桟橋(横)
+Pier (V)|桟橋(縦)
+Pond|池
+Oasis|オアシス
+Pond (Ice)|池(氷)
+Rainbow|虹
+Tent|テント
+Igloo|氷の家
+Pyramid|ピラミッド
+Giant Tree|大樹
+Giant Tree (Snow)|大樹(雪)
+Dirt|土砂
+Avalanche|雪崩
+Rainbow|虹
+Cave A|洞窟A
+Cave B|洞窟B
+Cave (Collapsed)|洞窟(土砂崩れ)
+Mine|坑道
+Tunnel|トンネル
+Tunnel (Blocked)|トンネル(通行止め)
+Shrine|ほこら
+Shrine (Snow)|ほこら(雪)
+Bridge (H)|橋(横)
+Bridge (V)|橋(縦)
+Collapsed Bridge (H)|崩れた橋(横)
+Collapsed Bridge (V)|崩れた橋(縦)
+Snow Bridge (H)|雪の橋(横)
+Snow Bridge (V)|雪の橋(縦)
+Collapsed Snow Bridge (H)|崩れた雪の橋(横)
+Collapsed Snow Bridge (V)|崩れた雪の橋(縦)
+Castle A|城A
+Castle A|城A
+Castle B|城B
+Castle B|城B
+Fort A|砦A
+Fort A|砦A
+Fort B|砦B
+Fort B|砦B
+Castle A|城A
+Castle A|城A
+Castle B|城B
+Castle B|城B
+Fort A|砦A
+Fort A|砦A
+Fort B|砦B
+Fort B|砦B
+Castle C|城C
+Castle C|城C
+Castle D|城D
+Castle D|城D
+Castle (Ruins)|城(廃墟)
+Castle (Ruins)|城(廃墟)
+Fort (Ruins)|砦(廃墟)
+Fort (Ruins)|砦(廃墟)
+Castle C|城C
+Castle C|城C
+Castle D|城D
+Castle D|城D
+Castle (Ruins)|城(廃墟)
+Castle (Ruins)|城(廃墟)
+Fort (Ruins)|砦(廃墟)
+Fort (Ruins)|砦(廃墟)
+Castle A, B (Snow)|城A・B(雪)
+Castle A, B (Snow)|城A・B(雪)
+Castle C, D (Snow)|城C・D(雪)
+Castle C, D (Snow)|城C・D(雪)
+Fort (Snow)|砦(雪)
+Fort (Snow)|砦(雪)
+Castle (Ruins, Snow)|城(廃墟・雪)
+Castle (Ruins, Snow)|城(廃墟・雪)
+Castle A, B (Snow)|城A・B(雪)
+Castle A, B (Snow)|城A・B(雪)
+Castle C, D (Snow)|城C・D(雪)
+Castle C, D (Snow)|城C・D(雪)
+Fort (Snow)|砦(雪)
+Fort (Snow)|砦(雪)
+Castle (Ruins, Snow)|城(廃墟・雪)
+Castle (Ruins, Snow)|城(廃墟・雪)
+Tower A|塔A
+Tower A (Ruins)|塔A(廃墟)
+Tower B|塔B
+Tower C|塔C
+Tower A (Snow)|塔A(雪)
+Tower D|塔D
+Temple A|神殿A
+Temple A (Snow)|神殿A(雪)
+Tower A|塔A
+Tower A (Ruins)|塔A(廃墟)
+Tower B|塔B
+Tower C|塔C
+Tower A (Snow)|塔A(雪)
+Tower D (Ruins)|塔D(廃墟)
+Temple B|神殿B
+Temple C|神殿C
+Fortress City |城塞都市
+Fortress City |城塞都市
+Fortress City (Snow)|城塞都市(雪)
+Fortress City (Snow)|城塞都市(雪)
+Large Mansion|大きな屋敷
+Large Mansion|大きな屋敷
+School of Magic|魔法学校
+School of Magic|魔法学校
+Fortress City |城塞都市
+Fortress City |城塞都市
+Fortress City (Snow)|城塞都市(雪)
+Fortress City (Snow)|城塞都市(雪)
+Large Mansion|大きな屋敷
+Large Mansion|大きな屋敷
+School of Magic|魔法学校
+School of Magic|魔法学校
+Town A|町A
+Town A|町A
+Town B|町B
+Town B|町B
+Village A|村A
+Village A|村A
+Village B|村B
+Village B|村B
+Town C|町C
+House (Town)|家(町)
+Village C|村C
+House (Village)|家(村)
+Town C (Snow)|町C(雪)
+House (Town, Snow)|家(町・雪)
+Village C (Snow)|村C(雪)
+House (Village, Snow)|家(村・雪)
+Town A (Snow)|町A(雪)
+Town A (Snow)|町A(雪)
+Town B (Snow)|町B(雪)
+Town B (Snow)|町B(雪)
+Village A (Snow)|村A(雪)
+Village A (Snow)|村A(雪)
+Village B (Snow)|村B(雪)
+Village B (Snow)|村B(雪)
+Town D (Desert)|町D(砂漠)
+Town D (Desert)|町D(砂漠)
+Town E (Desert)|町E(砂漠)
+Town E (Desert)|町E(砂漠)
+Town F (Desert)|町F(砂漠)
+Large Tent|大きなテント
+House (Desert)|家(砂漠)
+Pit House|竪穴式住居
+Castle (Walled)|城(城壁)
+Castle (Walled)|城(城壁)
+Castle (Walled)|城(城壁)
+Demon Castle|魔王城
+Demon Castle|魔王城
+Cursed Castle|呪われた城
+Cursed Castle|呪われた城
+Town C (Ruins)|町C(廃墟)
+Castle (Walled)|城(城壁)
+Castle (Walled)|城(城壁)
+Castle (Walled)|城(城壁)
+Demon Castle|魔王城
+Demon Castle|魔王城
+Cursed Castle|呪われた城
+Cursed Castle|呪われた城
+Town F (Ruins)|町F(廃墟)
+Castle (Walled)|城(城壁)
+Castle (Walled)|城(城壁)
+Castle (Walled)|城(城壁)
+Town A (Ruins)|町A(廃墟)
+Town A (Ruins)|町A(廃墟)
+Village A (Ruins)|村A(廃墟)
+Village A (Ruins)|村A(廃墟)
+House (Ruins)|家(廃墟)
+Castle Wall (Ruins A)|城壁(廃墟A)
+Castle Wall (Ruins B)|城壁(廃墟B)
+Castle Wall (Ruins C)|城壁(廃墟C)
+Castle Wall|城壁
+Castle Wall|城壁
+Castle Wall|城壁
+Castle Wall|城壁
+Castle Wall|城壁
+Castle Wall|城壁
+Castle Wall (Gate)|城壁(城門)
+Castle Wall|城壁
+Castle Wall|城壁
+Castle Wall|城壁
+Castle Wall|城壁
+Castle Wall|城壁
+Castle Wall|城壁
+Castle Wall|城壁
+Castle Wall|城壁
+Castle Wall|城壁
+Castle Wall|城壁
+Castle Wall|城壁
+Castle Wall|城壁
+Castle Wall|城壁
+Castle Wall|城壁
+Castle Wall|城壁
+Castle Wall|城壁
+Castle Wall|城壁
+Castle Wall|城壁
+Castle Wall|城壁
+Castle Wall|城壁
+Castle Wall|城壁
+Lookout Post|やぐら
+Crater|クレーター
+Trail|山道
+Rock Mountain|岩山
+Rock Mountain|岩山
+Rock Mountain (Sandstone)|岩山(砂岩)
+Rock Mountain (Sandstone)|岩山(砂岩)
+Rock Mountain (Snow)|岩山(雪)
+Rock Mountain (Snow)|岩山(雪)
+Volcano Crater (Lava)|火口(溶岩)
+Volcano Crater (Lava)|火口(溶岩)
+Rock Mountain|岩山
+Rock Mountain|岩山
+Rock Mountain (Sandstone)|岩山(砂岩)
+Rock Mountain (Sandstone)|岩山(砂岩)
+Rock Mountain (Snow)|岩山(雪)
+Rock Mountain (Snow)|岩山(雪)
+Volcano Crater|火口
+Volcano Crater|火口
+Rock Mountain|岩山
+Rock Mountain|岩山
+Rock Mountain (Sandstone)|岩山(砂岩)
+Rock Mountain (Sandstone)|岩山(砂岩)
+Rock Mountain (Snow)|岩山(雪)
+Rock Mountain (Snow)|岩山(雪)
+Volcano|火山
+Volcano|火山
+Rock Mountain|岩山
+Rock Mountain|岩山
+Rock Mountain (Sandstone)|岩山(砂岩)
+Rock Mountain (Sandstone)|岩山(砂岩)
+Rock Mountain (Snow)|岩山(雪)
+Rock Mountain (Snow)|岩山(雪)
+Floating Continent (Giant Tree)|浮遊大陸(大樹)
+Floating Continent (Giant Tree)|浮遊大陸(大樹)
+Floating Continent|浮遊大陸
+Floating Continent|浮遊大陸
+Floating Continent (Cloud)|浮遊大陸(雲)
+Floating Continent (Cloud)|浮遊大陸(雲)
+Cloud Land|雲の大地
+Cloud Land|雲の大地
+Floating Continent (Castle)|浮遊大陸(城)
+Floating Continent (Castle)|浮遊大陸(城)
+Floating Continent|浮遊大陸
+Floating Continent|浮遊大陸
+Floating Continent (Cloud)|浮遊大陸(雲)
+Floating Continent (Cloud)|浮遊大陸(雲)
+Cloud Land|雲の大地
+Cloud Land|雲の大地
+Floating Continent (Temple)|浮遊大陸(神殿)
+Floating Continent (Temple)|浮遊大陸(神殿)
+Floating Continent (Shadow)|浮遊大陸(影)
+Floating Continent (Shadow)|浮遊大陸(影)
+Cloud Land (Temple)|雲の大地(神殿)
+Cloud Land (Temple)|雲の大地(神殿)
+Cloud Land (Castle)|雲の大地(城)
+Cloud Land (Castle)|雲の大地(城)
diff --git a/img/tilesets/World_C.png b/img/tilesets/World_C.png
new file mode 100644
index 0000000..f0af34f
Binary files /dev/null and b/img/tilesets/World_C.png differ
diff --git a/img/tilesets/World_C.txt b/img/tilesets/World_C.txt
new file mode 100644
index 0000000..8de6c75
--- /dev/null
+++ b/img/tilesets/World_C.txt
@@ -0,0 +1,256 @@
+Hole|穴
+Signboard A|看板A
+Signboard B|看板B
+Signboard C|看板C
+Iron Bridge (H)|鉄橋(横)
+Iron Bridge (V)|鉄橋(縦)
+Reservoir A|貯水池A
+Reservoir B|貯水池B
+Hut|小屋
+Shanty|掘っ立て小屋
+Signboard D|看板D
+Digital Signage A|電子看板A
+Digital Signage B|電子看板B
+Windmill|風車
+Parabolic Antenna|パラボラアンテナ
+Heliport|ヘリポート
+Entrance A (Open)|入口A(開)
+Entrance A (Closed)|入口A(閉)
+Entrance B (Open)|入口B(開)
+Entrance B (Closed)|入口B(閉)
+Entrance C (Open)|入口C(開)
+Entrance C (Closed)|入口C(閉)
+Entrance D (Closed)|入口D(閉)
+Entrance E (Closed)|入口E(閉)
+Road|道路
+Road|道路
+Road Closed|通行止め
+Rocky Mountain A|岩山A
+Rocky Mountain A|岩山A
+Rocky Mountain B|岩山B
+Rocky Mountain B|岩山B
+Rocky Mountain C|岩山C
+Road|道路
+Road|道路
+Road|道路
+Rocky Mountain A|岩山A
+Rocky Mountain A|岩山A
+Rocky Mountain B|岩山B
+Rocky Mountain B|岩山B
+Rocky Mountain C|岩山C
+Road|道路
+Road|道路
+Road|道路
+Rocky Mountain A|岩山A
+Rocky Mountain A|岩山A
+Rocky Mountain B|岩山B
+Rocky Mountain B|岩山B
+Rocky Mountain D|岩山D
+Road|道路
+Road|道路
+Road|道路
+Rocky Mountain A|岩山A
+Rocky Mountain A|岩山A
+Rocky Mountain B|岩山B
+Rocky Mountain B|岩山B
+Broken Buildings|壊れたビル街
+Town A|町A
+Town B|町B
+Slum A|スラム街A
+Slum B|スラム街B
+Mansion A|邸宅A
+Mansion A|邸宅A
+Gate A|ゲートA
+Gate B|ゲートB
+Shopping Area A|商店街A
+Shopping Area B|商店街B
+Buildings A|ビル街A
+Buildings B|ビル街B
+Mansion B|邸宅B
+Mansion B|邸宅B
+Gate C|ゲートC
+Gate D|ゲートD
+Residential Street|住宅街
+Residential Street|住宅街
+Slum|スラム街
+Slum|スラム街
+School|学校
+School|学校
+Hospital|病院
+Hospital|病院
+Residential Street|住宅街
+Residential Street|住宅街
+Slum|スラム街
+Slum|スラム街
+School|学校
+School|学校
+Hospital|病院
+Hospital|病院
+City A|街A
+City A|街A
+City B|街B
+City B|街B
+Residence A|屋敷A
+Residence A|屋敷A
+Residence B|屋敷B
+Residence B|屋敷B
+City A|街A
+City A|街A
+City B|街B
+City B|街B
+Residence A|屋敷A
+Residence A|屋敷A
+Residence B|屋敷B
+Residence B|屋敷B
+Bridge A (V)|橋A(縦)
+Bridge A (H)|橋A(横)
+Broken Bridge A (V)|壊れた橋A(縦)
+Broken Bridge A (H)|壊れた橋A(横)
+Bridge B (V)|橋B(縦)
+Bridge B (H)|橋B(横)
+Broken Bridge B (V)|壊れた橋(縦)
+Broken Bridge B (H)|壊れた橋(横)
+Building A|ビルA
+Building B|ビルB
+Building C|ビルC
+Building D|ビルD
+Apartment|マンション
+Apartment Complex|マンション群
+Collapsed Building A|崩壊したビルA
+Collapsed Building B|崩壊したビルB
+Building A|ビルA
+Building B|ビルB
+Building C|ビルC
+Building D|ビルD
+Apartment|マンション
+Apartment Complex|マンション群
+Collapsed Building A|崩壊したビルA
+Collapsed Building B|崩壊したビルB
+Large Town A|大きな町A
+Large Town A|大きな町A
+Entertainment District A|歓楽街A
+Entertainment District A|歓楽街A
+Police Station|警察署
+Police Station|警察署
+Island A|島A
+Island A|島A
+Large Town A|大きな町A
+Large Town A|大きな町A
+Entertainment District A|歓楽街A
+Entertainment District A|歓楽街A
+Police Station|警察署
+Police Station|警察署
+Island A|島A
+Island A|島A
+Large Town B|大きな町B
+Large Town B|大きな町B
+Entertainment District B|歓楽街B
+Entertainment District B|歓楽街B
+Museum|博物館
+Museum|博物館
+Island B|島B
+Island B|島B
+Large Town B|大きな町B
+Large Town B|大きな町B
+Entertainment District B|歓楽街B
+Entertainment District B|歓楽街B
+Museum|博物館
+Museum|博物館
+Island B|島B
+Island B|島B
+Warehouse A|倉庫A
+Warehouse A|倉庫A
+Factory|工場
+Factory|工場
+Warehouse B|倉庫B
+Gantry Crane|ガントリークレーン
+Park|公園
+Island C|島C
+Warehouse A|倉庫A
+Warehouse A|倉庫A
+Factory|工場
+Factory|工場
+Warehouse B|倉庫B
+Gantry Crane|ガントリークレーン
+Statue A|像A
+Statue B|像B
+Laboratory|研究所
+Laboratory|研究所
+Construction Site|工事現場
+Construction Site|工事現場
+Watchtower|監視塔
+Steel Tower|鉄塔
+Tower A|タワーA
+Tower B|タワーB
+Laboratory|研究所
+Laboratory|研究所
+Construction Site|工事現場
+Construction Site|工事現場
+Watchtower|監視塔
+Steel Tower|鉄塔
+Tower A|タワーA
+Tower B|タワーB
+Outer Wall|外壁
+Outer Wall|外壁
+Outer Wall|外壁
+Outer Wall|外壁
+Outer Wall|外壁
+Outer Wall|外壁
+Outer Wall|外壁
+Outer Wall|外壁
+Outer Wall|外壁
+Outer Wall (Gate)|外壁(門)
+Outer Wall|外壁
+Outer Wall|外壁
+Outer Wall|外壁
+Outer Wall|外壁
+Outer Wall|外壁
+Outer Wall|外壁
+Outer Wall|外壁
+Outer Wall|外壁
+Outer Wall|外壁
+Outer Wall|外壁
+Outer Wall|外壁
+Outer Wall|外壁
+Outer Wall|外壁
+Outer Wall (Gate)|外壁(門)
+Outer Wall|外壁
+Outer Wall|外壁
+Outer Wall|外壁
+Outer Wall|外壁
+Outer Wall|外壁
+Outer Wall|外壁
+Outer Wall|外壁
+Outer Wall|外壁
+Outer Wall|外壁
+Outer Wall|外壁
+Outer Wall|外壁
+Outer Wall|外壁
+Outer Wall|外壁
+Outer Wall|外壁
+Outer Wall|外壁
+Outer Wall|外壁
+Theme Park|テーマパーク
+Theme Park|テーマパーク
+Port|港湾
+Port|港湾
+Military Base|軍事基地
+Military Base|軍事基地
+Dome|ドーム
+Dome|ドーム
+Theme Park|テーマパーク
+Theme Park|テーマパーク
+Port|港湾
+Port|港湾
+Military Base|軍事基地
+Military Base|軍事基地
+Dome|ドーム
+Dome|ドーム
+Lighthouse|灯台
+Broken Lighthouse|壊れた灯台
+Temple|寺院
+Church|教会
+Cemetery A|墓地A
+Cemetery B|墓地B
+Prison|刑務所
+Prison|刑務所
diff --git a/img/titles1/Beach.png b/img/titles1/Beach.png
new file mode 100644
index 0000000..8aca2b4
Binary files /dev/null and b/img/titles1/Beach.png differ
diff --git a/img/titles1/Bigtree.png b/img/titles1/Bigtree.png
new file mode 100644
index 0000000..a0bfb9c
Binary files /dev/null and b/img/titles1/Bigtree.png differ
diff --git a/img/titles1/Canyon.png b/img/titles1/Canyon.png
new file mode 100644
index 0000000..21a1c4a
Binary files /dev/null and b/img/titles1/Canyon.png differ
diff --git a/img/titles1/FlyingIsland.png b/img/titles1/FlyingIsland.png
new file mode 100644
index 0000000..43dee4d
Binary files /dev/null and b/img/titles1/FlyingIsland.png differ
diff --git a/img/titles1/Gate.png b/img/titles1/Gate.png
new file mode 100644
index 0000000..43944f5
Binary files /dev/null and b/img/titles1/Gate.png differ
diff --git a/img/titles1/Gold.png b/img/titles1/Gold.png
new file mode 100644
index 0000000..dc2816a
Binary files /dev/null and b/img/titles1/Gold.png differ
diff --git a/img/titles1/Jungle.png b/img/titles1/Jungle.png
new file mode 100644
index 0000000..bba2144
Binary files /dev/null and b/img/titles1/Jungle.png differ
diff --git a/img/titles1/Mansion.png b/img/titles1/Mansion.png
new file mode 100644
index 0000000..014226c
Binary files /dev/null and b/img/titles1/Mansion.png differ
diff --git a/img/titles1/Monument.png b/img/titles1/Monument.png
new file mode 100644
index 0000000..4e633c7
Binary files /dev/null and b/img/titles1/Monument.png differ
diff --git a/img/titles1/Mountain.png b/img/titles1/Mountain.png
new file mode 100644
index 0000000..01341f9
Binary files /dev/null and b/img/titles1/Mountain.png differ
diff --git a/img/titles1/Night.png b/img/titles1/Night.png
new file mode 100644
index 0000000..b9d2f0d
Binary files /dev/null and b/img/titles1/Night.png differ
diff --git a/img/titles1/Oasis.png b/img/titles1/Oasis.png
new file mode 100644
index 0000000..5abea53
Binary files /dev/null and b/img/titles1/Oasis.png differ
diff --git a/img/titles1/Ruins.png b/img/titles1/Ruins.png
new file mode 100644
index 0000000..93b3f84
Binary files /dev/null and b/img/titles1/Ruins.png differ
diff --git a/img/titles1/Sky.png b/img/titles1/Sky.png
new file mode 100644
index 0000000..6acbc8a
Binary files /dev/null and b/img/titles1/Sky.png differ
diff --git a/img/titles1/Snow.png b/img/titles1/Snow.png
new file mode 100644
index 0000000..5aa4ba7
Binary files /dev/null and b/img/titles1/Snow.png differ
diff --git a/img/titles1/Sword.png b/img/titles1/Sword.png
new file mode 100644
index 0000000..9baf773
Binary files /dev/null and b/img/titles1/Sword.png differ
diff --git a/img/titles1/Town1.png b/img/titles1/Town1.png
new file mode 100644
index 0000000..22289fa
Binary files /dev/null and b/img/titles1/Town1.png differ
diff --git a/img/titles1/Town2.png b/img/titles1/Town2.png
new file mode 100644
index 0000000..604cc8f
Binary files /dev/null and b/img/titles1/Town2.png differ
diff --git a/img/titles1/Universe.png b/img/titles1/Universe.png
new file mode 100644
index 0000000..060ae95
Binary files /dev/null and b/img/titles1/Universe.png differ
diff --git a/img/titles1/Wasteland.png b/img/titles1/Wasteland.png
new file mode 100644
index 0000000..f25fdd4
Binary files /dev/null and b/img/titles1/Wasteland.png differ
diff --git a/img/titles2/Floral.png b/img/titles2/Floral.png
new file mode 100644
index 0000000..be10c58
Binary files /dev/null and b/img/titles2/Floral.png differ
diff --git a/img/titles2/Medieval.png b/img/titles2/Medieval.png
new file mode 100644
index 0000000..0f63d4c
Binary files /dev/null and b/img/titles2/Medieval.png differ
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..a471280
--- /dev/null
+++ b/index.html
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+ Life of a Naomi
+
+
+
+
+
diff --git a/js/libs/effekseer.min.js b/js/libs/effekseer.min.js
new file mode 100644
index 0000000..9c7bf3b
--- /dev/null
+++ b/js/libs/effekseer.min.js
@@ -0,0 +1,128 @@
+/*!
+ * Effekseer for WebGL v1.70b
+ * https://github.com/effekseer/EffekseerForWebGL
+ *
+ * This software is licensed under the MIT License.
+ * http://www.opensource.org/licenses/mit-license
+ */
+var effekseer_native = (function() {
+ var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined;
+ if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename;
+ return (
+function(effekseer_native) {
+ effekseer_native = effekseer_native || {};
+
+var Module=typeof effekseer_native!=="undefined"?effekseer_native:{};var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var arguments_=[];var thisProgram="./this.program";var quit_=function(status,toThrow){throw toThrow};var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string";ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;var nodeFS;var nodePath;if(ENVIRONMENT_IS_NODE){if(ENVIRONMENT_IS_WORKER){scriptDirectory=require("path").dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}read_=function shell_read(filename,binary){if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);return nodeFS["readFileSync"](filename,binary?null:"utf8")};readBinary=function readBinary(filename){var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",abort);quit_=function(status){process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){read_=function shell_read(f){return read(f)}}readBinary=function readBinary(f){var data;if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){arguments_=scriptArgs}else if(typeof arguments!="undefined"){arguments_=arguments}if(typeof quit==="function"){quit_=function(status){quit(status)}}if(typeof print!=="undefined"){if(typeof console==="undefined")console={};console.log=print;console.warn=console.error=typeof printErr!=="undefined"?printErr:print}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=function(title){document.title=title}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var STACK_ALIGN=16;function dynamicAlloc(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=ret+size+15&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;return ret}function getNativeTypeSize(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return 4}else if(type[0]==="i"){var bits=Number(type.substr(1));assert(bits%8===0,"getNativeTypeSize invalid bits "+bits+", type "+type);return bits/8}else{return 0}}}}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}}function convertJsFunctionToWasm(func,sig){if(typeof WebAssembly.Function==="function"){var typeNames={"i":"i32","j":"i64","f":"f32","d":"f64"};var type={parameters:[],results:sig[0]=="v"?[]:[typeNames[sig[0]]]};for(var i=1;i>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}var wasmMemory;var wasmTable=new WebAssembly.Table({"initial":1295,"maximum":1295+0,"element":"anyfunc"});var ABORT=false;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];assert(func,"Cannot call unknown function "+ident+", make sure it is exported");return func}function ccall(ident,returnType,argTypes,args,opts){var toC={"string":function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret},"array":function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string")return UTF8ToString(ret);if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i=endIdx))++endPtr;if(endPtr-idx>16&&heap.subarray&&UTF8Decoder){return UTF8Decoder.decode(heap.subarray(idx,endPtr))}else{var str="";while(idx>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function UTF16ToString(ptr){var endPtr=ptr;var idx=endPtr>>1;while(HEAP16[idx])++idx;endPtr=idx<<1;if(endPtr-ptr>32&&UTF16Decoder){return UTF16Decoder.decode(HEAPU8.subarray(ptr,endPtr))}else{var i=0;var str="";while(1){var codeUnit=HEAP16[ptr+i*2>>1];if(codeUnit==0)return str;++i;str+=String.fromCharCode(codeUnit)}}}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var WASM_PAGE_SIZE=65536;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var STACK_BASE=5615984,DYNAMIC_BASE=5615984,DYNAMICTOP_PTR=372944;var INITIAL_INITIAL_MEMORY=Module["INITIAL_MEMORY"]||33554432;if(Module["wasmMemory"]){wasmMemory=Module["wasmMemory"]}else{wasmMemory=new WebAssembly.Memory({"initial":INITIAL_INITIAL_MEMORY/WASM_PAGE_SIZE,"maximum":2147483648/WASM_PAGE_SIZE})}if(wasmMemory){buffer=wasmMemory.buffer}INITIAL_INITIAL_MEMORY=buffer.byteLength;updateGlobalBufferAndViews(buffer);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var Math_abs=Math.abs;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_min=Math.min;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what+="";out(what);err(what);ABORT=true;EXITSTATUS=1;what="abort("+what+"). Build with -s ASSERTIONS=1 for more info.";throw new WebAssembly.RuntimeError(what)}function hasPrefix(str,prefix){return String.prototype.startsWith?str.startsWith(prefix):str.indexOf(prefix)===0}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return hasPrefix(filename,dataURIPrefix)}var fileURIPrefix="file://";function isFileURI(filename){return hasPrefix(filename,fileURIPrefix)}var wasmBinaryFile="effekseer.core.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(){try{if(wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(wasmBinaryFile)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&typeof fetch==="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary()})}return new Promise(function(resolve,reject){resolve(getBinary())})}function createWasm(){var info={"env":asmLibraryArg,"wasi_snapshot_preview1":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiatedSource(output){receiveInstance(output["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&typeof fetch==="function"){fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiatedSource,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");instantiateArrayBuffer(receiveInstantiatedSource)})})}else{return instantiateArrayBuffer(receiveInstantiatedSource)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync();return{}}var tempDouble;var tempI64;var ASM_CONSTS={343260:function($0,$1){return Module._loadBinary(UTF16ToString($0),$1)!=null},343325:function($0,$1,$2,$3){var buffer=Module._loadBinary(UTF16ToString($0),$3);var memptr=_malloc(buffer.byteLength);HEAP8.set(new Uint8Array(buffer),memptr);setValue($1,memptr,"i32");setValue($2,buffer.byteLength,"i32")},343768:function($0){return Module._loadImage(UTF16ToString($0))!=null},343827:function($0,$1){var binding=GLctx.getParameter(GLctx.TEXTURE_BINDING_2D);var img=Module._loadImage(UTF16ToString($0));GLctx.bindTexture(GLctx.TEXTURE_2D,GL.textures[$1]);var pa=gl.getParameter(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL);var oldFlipY=gl.getParameter(gl.UNPACK_FLIP_Y_WEBGL);GLctx.pixelStorei(GLctx.UNPACK_PREMULTIPLY_ALPHA_WEBGL,false);GLctx.pixelStorei(GLctx.UNPACK_FLIP_Y_WEBGL,false);GLctx.texImage2D(GLctx.TEXTURE_2D,0,GLctx.RGBA,GLctx.RGBA,GLctx.UNSIGNED_BYTE,img);if(Module._isPowerOfTwo(img)){GLctx.generateMipmap(GLctx.TEXTURE_2D)}GLctx.pixelStorei(GLctx.UNPACK_PREMULTIPLY_ALPHA_WEBGL,pa);GLctx.pixelStorei(GLctx.UNPACK_FLIP_Y_WEBGL,oldFlipY);GLctx.bindTexture(GLctx.TEXTURE_2D,binding)}};function _emscripten_asm_const_iii(code,sigPtr,argbuf){var args=readAsmConstArgs(sigPtr,argbuf);return ASM_CONSTS[code].apply(null,args)}__ATINIT__.push({func:function(){___wasm_call_ctors()}});function demangle(func){return func}function demangleAll(text){var regex=/\b_Z[\w\d_]+/g;return text.replace(regex,function(x){var y=demangle(x);return x===y?x:y+" ["+x+"]"})}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error}catch(e){err=e}if(!err.stack){return"(no stack trace available)"}}return err.stack.toString()}function ___cxa_allocate_exception(size){return _malloc(size)}function _atexit(func,arg){__ATEXIT__.unshift({func:func,arg:arg})}function ___cxa_atexit(a0,a1){return _atexit(a0,a1)}var ___exception_infos={};var ___exception_last=0;function __ZSt18uncaught_exceptionv(){return __ZSt18uncaught_exceptionv.uncaught_exceptions>0}function ___cxa_throw(ptr,type,destructor){___exception_infos[ptr]={ptr:ptr,adjusted:[ptr],type:type,destructor:destructor,refcount:0,caught:false,rethrown:false};___exception_last=ptr;if(!("uncaught_exception"in __ZSt18uncaught_exceptionv)){__ZSt18uncaught_exceptionv.uncaught_exceptions=1}else{__ZSt18uncaught_exceptionv.uncaught_exceptions++}throw ptr}function setErrNo(value){HEAP32[___errno_location()>>2]=value;return value}function ___map_file(pathname,size){setErrNo(63);return-1}var PATH={splitPath:function(filename){var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:function(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:function(path){var isAbsolute=path.charAt(0)==="/",trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(function(p){return!!p}),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:function(path){var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:function(path){if(path==="/")return"/";var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},extname:function(path){return PATH.splitPath(path)[3]},join:function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join("/"))},join2:function(l,r){return PATH.normalize(l+"/"+r)}};var SYSCALLS={mappings:{},buffers:[null,[],[]],printChar:function(stream,curr){var buffer=SYSCALLS.buffers[stream];if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},get64:function(low,high){return low}};function ___sys_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;return 0}function ___sys_ioctl(fd,op,varargs){SYSCALLS.varargs=varargs;return 0}function syscallMunmap(addr,len){if((addr|0)===-1||len===0){return-28}var info=SYSCALLS.mappings[addr];if(!info)return 0;if(len===info.len){SYSCALLS.mappings[addr]=null;if(info.allocated){_free(info.malloc)}}return 0}function ___sys_munmap(addr,len){return syscallMunmap(addr,len)}function ___sys_open(path,flags,varargs){SYSCALLS.varargs=varargs}function _abort(){abort()}function _emscripten_set_main_loop_timing(mode,value){Browser.mainLoop.timingMode=mode;Browser.mainLoop.timingValue=value;if(!Browser.mainLoop.func){return 1}if(mode==0){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setTimeout(){var timeUntilNextTick=Math.max(0,Browser.mainLoop.tickStartTime+value-_emscripten_get_now())|0;setTimeout(Browser.mainLoop.runner,timeUntilNextTick)};Browser.mainLoop.method="timeout"}else if(mode==1){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_rAF(){Browser.requestAnimationFrame(Browser.mainLoop.runner)};Browser.mainLoop.method="rAF"}else if(mode==2){if(typeof setImmediate==="undefined"){var setImmediates=[];var emscriptenMainLoopMessageId="setimmediate";var Browser_setImmediate_messageHandler=function(event){if(event.data===emscriptenMainLoopMessageId||event.data.target===emscriptenMainLoopMessageId){event.stopPropagation();setImmediates.shift()()}};addEventListener("message",Browser_setImmediate_messageHandler,true);setImmediate=function Browser_emulated_setImmediate(func){setImmediates.push(func);if(ENVIRONMENT_IS_WORKER){if(Module["setImmediates"]===undefined)Module["setImmediates"]=[];Module["setImmediates"].push(func);postMessage({target:emscriptenMainLoopMessageId})}else postMessage(emscriptenMainLoopMessageId,"*")}}Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setImmediate(){setImmediate(Browser.mainLoop.runner)};Browser.mainLoop.method="immediate"}return 0}var _emscripten_get_now;if(ENVIRONMENT_IS_NODE){_emscripten_get_now=function(){var t=process["hrtime"]();return t[0]*1e3+t[1]/1e6}}else if(typeof dateNow!=="undefined"){_emscripten_get_now=dateNow}else _emscripten_get_now=function(){return performance.now()};function _emscripten_set_main_loop(func,fps,simulateInfiniteLoop,arg,noSetTiming){noExitRuntime=true;assert(!Browser.mainLoop.func,"emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters.");Browser.mainLoop.func=func;Browser.mainLoop.arg=arg;var browserIterationFunc;if(typeof arg!=="undefined"){browserIterationFunc=function(){Module["dynCall_vi"](func,arg)}}else{browserIterationFunc=function(){Module["dynCall_v"](func)}}var thisMainLoopId=Browser.mainLoop.currentlyRunningMainloop;Browser.mainLoop.runner=function Browser_mainLoop_runner(){if(ABORT)return;if(Browser.mainLoop.queue.length>0){var start=Date.now();var blocker=Browser.mainLoop.queue.shift();blocker.func(blocker.arg);if(Browser.mainLoop.remainingBlockers){var remaining=Browser.mainLoop.remainingBlockers;var next=remaining%1==0?remaining-1:Math.floor(remaining);if(blocker.counted){Browser.mainLoop.remainingBlockers=next}else{next=next+.5;Browser.mainLoop.remainingBlockers=(8*remaining+next)/9}}console.log('main loop blocker "'+blocker.name+'" took '+(Date.now()-start)+" ms");Browser.mainLoop.updateStatus();if(thisMainLoopId1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}else if(Browser.mainLoop.timingMode==0){Browser.mainLoop.tickStartTime=_emscripten_get_now()}Browser.mainLoop.runIter(browserIterationFunc);if(thisMainLoopId0)_emscripten_set_main_loop_timing(0,1e3/fps);else _emscripten_set_main_loop_timing(1,1);Browser.mainLoop.scheduler()}if(simulateInfiniteLoop){throw"unwind"}}var Browser={mainLoop:{scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],pause:function(){Browser.mainLoop.scheduler=null;Browser.mainLoop.currentlyRunningMainloop++},resume:function(){Browser.mainLoop.currentlyRunningMainloop++;var timingMode=Browser.mainLoop.timingMode;var timingValue=Browser.mainLoop.timingValue;var func=Browser.mainLoop.func;Browser.mainLoop.func=null;_emscripten_set_main_loop(func,0,false,Browser.mainLoop.arg,true);_emscripten_set_main_loop_timing(timingMode,timingValue);Browser.mainLoop.scheduler()},updateStatus:function(){if(Module["setStatus"]){var message=Module["statusMessage"]||"Please wait...";var remaining=Browser.mainLoop.remainingBlockers;var expected=Browser.mainLoop.expectedBlockers;if(remaining){if(remaining=6){var curr=leftchar>>leftbits-6&63;leftbits-=6;ret+=BASE[curr]}}if(leftbits==2){ret+=BASE[(leftchar&3)<<4];ret+=PAD+PAD}else if(leftbits==4){ret+=BASE[(leftchar&15)<<2];ret+=PAD}return ret}audio.src="data:audio/x-"+name.substr(-3)+";base64,"+encode64(byteArray);finish(audio)};audio.src=url;Browser.safeSetTimeout(function(){finish(audio)},1e4)}else{return fail()}};Module["preloadPlugins"].push(audioPlugin);function pointerLockChange(){Browser.pointerLock=document["pointerLockElement"]===Module["canvas"]||document["mozPointerLockElement"]===Module["canvas"]||document["webkitPointerLockElement"]===Module["canvas"]||document["msPointerLockElement"]===Module["canvas"]}var canvas=Module["canvas"];if(canvas){canvas.requestPointerLock=canvas["requestPointerLock"]||canvas["mozRequestPointerLock"]||canvas["webkitRequestPointerLock"]||canvas["msRequestPointerLock"]||function(){};canvas.exitPointerLock=document["exitPointerLock"]||document["mozExitPointerLock"]||document["webkitExitPointerLock"]||document["msExitPointerLock"]||function(){};canvas.exitPointerLock=canvas.exitPointerLock.bind(document);document.addEventListener("pointerlockchange",pointerLockChange,false);document.addEventListener("mozpointerlockchange",pointerLockChange,false);document.addEventListener("webkitpointerlockchange",pointerLockChange,false);document.addEventListener("mspointerlockchange",pointerLockChange,false);if(Module["elementPointerLock"]){canvas.addEventListener("click",function(ev){if(!Browser.pointerLock&&Module["canvas"].requestPointerLock){Module["canvas"].requestPointerLock();ev.preventDefault()}},false)}}},createContext:function(canvas,useWebGL,setInModule,webGLContextAttributes){if(useWebGL&&Module.ctx&&canvas==Module.canvas)return Module.ctx;var ctx;var contextHandle;if(useWebGL){var contextAttributes={antialias:false,alpha:false,majorVersion:1};if(webGLContextAttributes){for(var attribute in webGLContextAttributes){contextAttributes[attribute]=webGLContextAttributes[attribute]}}if(typeof GL!=="undefined"){contextHandle=GL.createContext(canvas,contextAttributes);if(contextHandle){ctx=GL.getContext(contextHandle).GLctx}}}else{ctx=canvas.getContext("2d")}if(!ctx)return null;if(setInModule){if(!useWebGL)assert(typeof GLctx==="undefined","cannot set in module if GLctx is used, but we are a non-GL context that would replace it");Module.ctx=ctx;if(useWebGL)GL.makeContextCurrent(contextHandle);Module.useWebGL=useWebGL;Browser.moduleContextCreatedCallbacks.forEach(function(callback){callback()});Browser.init()}return ctx},destroyContext:function(canvas,useWebGL,setInModule){},fullscreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullscreen:function(lockPointer,resizeCanvas){Browser.lockPointer=lockPointer;Browser.resizeCanvas=resizeCanvas;if(typeof Browser.lockPointer==="undefined")Browser.lockPointer=true;if(typeof Browser.resizeCanvas==="undefined")Browser.resizeCanvas=false;var canvas=Module["canvas"];function fullscreenChange(){Browser.isFullscreen=false;var canvasContainer=canvas.parentNode;if((document["fullscreenElement"]||document["mozFullScreenElement"]||document["msFullscreenElement"]||document["webkitFullscreenElement"]||document["webkitCurrentFullScreenElement"])===canvasContainer){canvas.exitFullscreen=Browser.exitFullscreen;if(Browser.lockPointer)canvas.requestPointerLock();Browser.isFullscreen=true;if(Browser.resizeCanvas){Browser.setFullscreenCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}else{canvasContainer.parentNode.insertBefore(canvas,canvasContainer);canvasContainer.parentNode.removeChild(canvasContainer);if(Browser.resizeCanvas){Browser.setWindowedCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}if(Module["onFullScreen"])Module["onFullScreen"](Browser.isFullscreen);if(Module["onFullscreen"])Module["onFullscreen"](Browser.isFullscreen)}if(!Browser.fullscreenHandlersInstalled){Browser.fullscreenHandlersInstalled=true;document.addEventListener("fullscreenchange",fullscreenChange,false);document.addEventListener("mozfullscreenchange",fullscreenChange,false);document.addEventListener("webkitfullscreenchange",fullscreenChange,false);document.addEventListener("MSFullscreenChange",fullscreenChange,false)}var canvasContainer=document.createElement("div");canvas.parentNode.insertBefore(canvasContainer,canvas);canvasContainer.appendChild(canvas);canvasContainer.requestFullscreen=canvasContainer["requestFullscreen"]||canvasContainer["mozRequestFullScreen"]||canvasContainer["msRequestFullscreen"]||(canvasContainer["webkitRequestFullscreen"]?function(){canvasContainer["webkitRequestFullscreen"](Element["ALLOW_KEYBOARD_INPUT"])}:null)||(canvasContainer["webkitRequestFullScreen"]?function(){canvasContainer["webkitRequestFullScreen"](Element["ALLOW_KEYBOARD_INPUT"])}:null);canvasContainer.requestFullscreen()},exitFullscreen:function(){if(!Browser.isFullscreen){return false}var CFS=document["exitFullscreen"]||document["cancelFullScreen"]||document["mozCancelFullScreen"]||document["msExitFullscreen"]||document["webkitCancelFullScreen"]||function(){};CFS.apply(document,[]);return true},nextRAF:0,fakeRequestAnimationFrame:function(func){var now=Date.now();if(Browser.nextRAF===0){Browser.nextRAF=now+1e3/60}else{while(now+2>=Browser.nextRAF){Browser.nextRAF+=1e3/60}}var delay=Math.max(Browser.nextRAF-now,0);setTimeout(func,delay)},requestAnimationFrame:function(func){if(typeof requestAnimationFrame==="function"){requestAnimationFrame(func);return}var RAF=Browser.fakeRequestAnimationFrame;RAF(func)},safeCallback:function(func){return function(){if(!ABORT)return func.apply(null,arguments)}},allowAsyncCallbacks:true,queuedAsyncCallbacks:[],pauseAsyncCallbacks:function(){Browser.allowAsyncCallbacks=false},resumeAsyncCallbacks:function(){Browser.allowAsyncCallbacks=true;if(Browser.queuedAsyncCallbacks.length>0){var callbacks=Browser.queuedAsyncCallbacks;Browser.queuedAsyncCallbacks=[];callbacks.forEach(function(func){func()})}},safeRequestAnimationFrame:function(func){return Browser.requestAnimationFrame(function(){if(ABORT)return;if(Browser.allowAsyncCallbacks){func()}else{Browser.queuedAsyncCallbacks.push(func)}})},safeSetTimeout:function(func,timeout){noExitRuntime=true;return setTimeout(function(){if(ABORT)return;if(Browser.allowAsyncCallbacks){func()}else{Browser.queuedAsyncCallbacks.push(func)}},timeout)},safeSetInterval:function(func,timeout){noExitRuntime=true;return setInterval(function(){if(ABORT)return;if(Browser.allowAsyncCallbacks){func()}},timeout)},getMimetype:function(name){return{"jpg":"image/jpeg","jpeg":"image/jpeg","png":"image/png","bmp":"image/bmp","ogg":"audio/ogg","wav":"audio/wav","mp3":"audio/mpeg"}[name.substr(name.lastIndexOf(".")+1)]},getUserMedia:function(func){if(!window.getUserMedia){window.getUserMedia=navigator["getUserMedia"]||navigator["mozGetUserMedia"]}window.getUserMedia(func)},getMovementX:function(event){return event["movementX"]||event["mozMovementX"]||event["webkitMovementX"]||0},getMovementY:function(event){return event["movementY"]||event["mozMovementY"]||event["webkitMovementY"]||0},getMouseWheelDelta:function(event){var delta=0;switch(event.type){case"DOMMouseScroll":delta=event.detail/3;break;case"mousewheel":delta=event.wheelDelta/120;break;case"wheel":delta=event.deltaY;switch(event.deltaMode){case 0:delta/=100;break;case 1:delta/=3;break;case 2:delta*=80;break;default:throw"unrecognized mouse wheel delta mode: "+event.deltaMode}break;default:throw"unrecognized mouse wheel event: "+event.type}return delta},mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:function(event){if(Browser.pointerLock){if(event.type!="mousemove"&&"mozMovementX"in event){Browser.mouseMovementX=Browser.mouseMovementY=0}else{Browser.mouseMovementX=Browser.getMovementX(event);Browser.mouseMovementY=Browser.getMovementY(event)}if(typeof SDL!="undefined"){Browser.mouseX=SDL.mouseX+Browser.mouseMovementX;Browser.mouseY=SDL.mouseY+Browser.mouseMovementY}else{Browser.mouseX+=Browser.mouseMovementX;Browser.mouseY+=Browser.mouseMovementY}}else{var rect=Module["canvas"].getBoundingClientRect();var cw=Module["canvas"].width;var ch=Module["canvas"].height;var scrollX=typeof window.scrollX!=="undefined"?window.scrollX:window.pageXOffset;var scrollY=typeof window.scrollY!=="undefined"?window.scrollY:window.pageYOffset;if(event.type==="touchstart"||event.type==="touchend"||event.type==="touchmove"){var touch=event.touch;if(touch===undefined){return}var adjustedX=touch.pageX-(scrollX+rect.left);var adjustedY=touch.pageY-(scrollY+rect.top);adjustedX=adjustedX*(cw/rect.width);adjustedY=adjustedY*(ch/rect.height);var coords={x:adjustedX,y:adjustedY};if(event.type==="touchstart"){Browser.lastTouches[touch.identifier]=coords;Browser.touches[touch.identifier]=coords}else if(event.type==="touchend"||event.type==="touchmove"){var last=Browser.touches[touch.identifier];if(!last)last=coords;Browser.lastTouches[touch.identifier]=last;Browser.touches[touch.identifier]=coords}return}var x=event.pageX-(scrollX+rect.left);var y=event.pageY-(scrollY+rect.top);x=x*(cw/rect.width);y=y*(ch/rect.height);Browser.mouseMovementX=x-Browser.mouseX;Browser.mouseMovementY=y-Browser.mouseY;Browser.mouseX=x;Browser.mouseY=y}},asyncLoad:function(url,onload,onerror,noRunDep){var dep=!noRunDep?getUniqueRunDependency("al "+url):"";readAsync(url,function(arrayBuffer){assert(arrayBuffer,'Loading data file "'+url+'" failed (no arrayBuffer).');onload(new Uint8Array(arrayBuffer));if(dep)removeRunDependency(dep)},function(event){if(onerror){onerror()}else{throw'Loading data file "'+url+'" failed.'}});if(dep)addRunDependency(dep)},resizeListeners:[],updateResizeListeners:function(){var canvas=Module["canvas"];Browser.resizeListeners.forEach(function(listener){listener(canvas.width,canvas.height)})},setCanvasSize:function(width,height,noUpdates){var canvas=Module["canvas"];Browser.updateCanvasDimensions(canvas,width,height);if(!noUpdates)Browser.updateResizeListeners()},windowedWidth:0,windowedHeight:0,setFullscreenCanvasSize:function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags|8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()},setWindowedCanvasSize:function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags&~8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()},updateCanvasDimensions:function(canvas,wNative,hNative){if(wNative&&hNative){canvas.widthNative=wNative;canvas.heightNative=hNative}else{wNative=canvas.widthNative;hNative=canvas.heightNative}var w=wNative;var h=hNative;if(Module["forcedAspectRatio"]&&Module["forcedAspectRatio"]>0){if(w/h0?AL.freeIds.pop():AL._nextId++},freeIds:[],scheduleContextAudio:function(ctx){if(Browser.mainLoop.timingMode===1&&document["visibilityState"]!="visible"){return}for(var i in ctx.sources){AL.scheduleSourceAudio(ctx.sources[i])}},scheduleSourceAudio:function(src,lookahead){if(Browser.mainLoop.timingMode===1&&document["visibilityState"]!="visible"){return}if(src.state!==4114){return}var currentTime=AL.updateSourceTime(src);var startTime=src.bufStartTime;var startOffset=src.bufOffset;var bufCursor=src.bufsProcessed;for(var i=0;i=src.bufQueue.length){if(src.looping){bufCursor%=src.bufQueue.length}else{break}}var buf=src.bufQueue[bufCursor%src.bufQueue.length];if(buf.length===0){skipCount++;if(skipCount===src.bufQueue.length){break}}else{var audioSrc=src.context.audioCtx.createBufferSource();audioSrc.buffer=buf.audioBuf;audioSrc.playbackRate.value=src.playbackRate;if(buf.audioBuf._loopStart||buf.audioBuf._loopEnd){audioSrc.loopStart=buf.audioBuf._loopStart;audioSrc.loopEnd=buf.audioBuf._loopEnd}var duration=0;if(src.type===4136&&src.looping){duration=Number.POSITIVE_INFINITY;audioSrc.loop=true;if(buf.audioBuf._loopStart){audioSrc.loopStart=buf.audioBuf._loopStart}if(buf.audioBuf._loopEnd){audioSrc.loopEnd=buf.audioBuf._loopEnd}}else{duration=(buf.audioBuf.duration-startOffset)/src.playbackRate}audioSrc._startOffset=startOffset;audioSrc._duration=duration;audioSrc._skipCount=skipCount;skipCount=0;audioSrc.connect(src.gain);if(typeof audioSrc.start!=="undefined"){startTime=Math.max(startTime,src.context.audioCtx.currentTime);audioSrc.start(startTime,startOffset)}else if(typeof audioSrc.noteOn!=="undefined"){startTime=Math.max(startTime,src.context.audioCtx.currentTime);audioSrc.noteOn(startTime)}audioSrc._startTime=startTime;src.audioQueue.push(audioSrc);startTime+=duration}startOffset=0;bufCursor++}},updateSourceTime:function(src){var currentTime=src.context.audioCtx.currentTime;if(src.state!==4114){return currentTime}if(!isFinite(src.bufStartTime)){src.bufStartTime=currentTime-src.bufOffset/src.playbackRate;src.bufOffset=0}var nextStartTime=0;while(src.audioQueue.length){var audioSrc=src.audioQueue[0];src.bufsProcessed+=audioSrc._skipCount;nextStartTime=audioSrc._startTime+audioSrc._duration;if(currentTime=src.bufQueue.length&&!src.looping){AL.setSourceState(src,4116)}else if(src.type===4136&&src.looping){var buf=src.bufQueue[0];if(buf.length===0){src.bufOffset=0}else{var delta=(currentTime-src.bufStartTime)*src.playbackRate;var loopStart=buf.audioBuf._loopStart||0;var loopEnd=buf.audioBuf._loopEnd||buf.audioBuf.duration;if(loopEnd<=loopStart){loopEnd=buf.audioBuf.duration}if(delta0){src.bufStartTime+=Math.floor((currentTime-src.bufStartTime)/srcDuration)*srcDuration}}for(var i=0;i=src.bufQueue.length){if(src.looping){src.bufsProcessed%=src.bufQueue.length}else{AL.setSourceState(src,4116);break}}var buf=src.bufQueue[src.bufsProcessed];if(buf.length>0){nextStartTime=src.bufStartTime+buf.audioBuf.duration/src.playbackRate;if(currentTime1){src.audioQueue.length=1}},stopSourceAudio:function(src){for(var i=0;isrc.bufQueue[src.bufsProcessed].audioBuf.duration){offset-=src.bufQueue[src.bufsProcessed].audiobuf.duration;src.bufsProcessed++}src.bufOffset=offset}if(playing){AL.setSourceState(src,4114)}},getGlobalParam:function(funcname,param){if(!AL.currentCtx){return null}switch(param){case 49152:return AL.currentCtx.dopplerFactor;case 49155:return AL.currentCtx.speedOfSound;case 53248:return AL.currentCtx.distanceModel;default:AL.currentCtx.err=40962;return null}},setGlobalParam:function(funcname,param,value){if(!AL.currentCtx){return}switch(param){case 49152:if(!Number.isFinite(value)||value<0){AL.currentCtx.err=40963;return}AL.currentCtx.dopplerFactor=value;AL.updateListenerSpace(AL.currentCtx);break;case 49155:if(!Number.isFinite(value)||value<=0){AL.currentCtx.err=40963;return}AL.currentCtx.speedOfSound=value;AL.updateListenerSpace(AL.currentCtx);break;case 53248:switch(value){case 0:case 53249:case 53250:case 53251:case 53252:case 53253:case 53254:AL.currentCtx.distanceModel=value;AL.updateContextGlobal(AL.currentCtx);break;default:AL.currentCtx.err=40963;return}break;default:AL.currentCtx.err=40962;return}},getListenerParam:function(funcname,param){if(!AL.currentCtx){return null}switch(param){case 4100:return AL.currentCtx.listener.position;case 4102:return AL.currentCtx.listener.velocity;case 4111:return AL.currentCtx.listener.direction.concat(AL.currentCtx.listener.up);case 4106:return AL.currentCtx.gain.gain.value;default:AL.currentCtx.err=40962;return null}},setListenerParam:function(funcname,param,value){if(!AL.currentCtx){return}if(value===null){AL.currentCtx.err=40962;return}var listener=AL.currentCtx.listener;switch(param){case 4100:if(!Number.isFinite(value[0])||!Number.isFinite(value[1])||!Number.isFinite(value[2])){AL.currentCtx.err=40963;return}listener.position[0]=value[0];listener.position[1]=value[1];listener.position[2]=value[2];AL.updateListenerSpace(AL.currentCtx);break;case 4102:if(!Number.isFinite(value[0])||!Number.isFinite(value[1])||!Number.isFinite(value[2])){AL.currentCtx.err=40963;return}listener.velocity[0]=value[0];listener.velocity[1]=value[1];listener.velocity[2]=value[2];AL.updateListenerSpace(AL.currentCtx);break;case 4106:if(!Number.isFinite(value)||value<0){AL.currentCtx.err=40963;return}AL.currentCtx.gain.gain.value=value;break;case 4111:if(!Number.isFinite(value[0])||!Number.isFinite(value[1])||!Number.isFinite(value[2])||!Number.isFinite(value[3])||!Number.isFinite(value[4])||!Number.isFinite(value[5])){AL.currentCtx.err=40963;return}listener.direction[0]=value[0];listener.direction[1]=value[1];listener.direction[2]=value[2];listener.up[0]=value[3];listener.up[1]=value[4];listener.up[2]=value[5];AL.updateListenerSpace(AL.currentCtx);break;default:AL.currentCtx.err=40962;return}},getBufferParam:function(funcname,bufferId,param){if(!AL.currentCtx){return}var buf=AL.buffers[bufferId];if(!buf||bufferId===0){AL.currentCtx.err=40961;return}switch(param){case 8193:return buf.frequency;case 8194:return buf.bytesPerSample*8;case 8195:return buf.channels;case 8196:return buf.length*buf.bytesPerSample*buf.channels;case 8213:if(buf.length===0){return[0,0]}else{return[(buf.audioBuf._loopStart||0)*buf.frequency,(buf.audioBuf._loopEnd||buf.length)*buf.frequency]}default:AL.currentCtx.err=40962;return null}},setBufferParam:function(funcname,bufferId,param,value){if(!AL.currentCtx){return}var buf=AL.buffers[bufferId];if(!buf||bufferId===0){AL.currentCtx.err=40961;return}if(value===null){AL.currentCtx.err=40962;return}switch(param){case 8196:if(value!==0){AL.currentCtx.err=40963;return}break;case 8213:if(value[0]<0||value[0]>buf.length||value[1]<0||value[1]>buf.Length||value[0]>=value[1]){AL.currentCtx.err=40963;return}if(buf.refCount>0){AL.currentCtx.err=40964;return}if(buf.audioBuf){buf.audioBuf._loopStart=value[0]/buf.frequency;buf.audioBuf._loopEnd=value[1]/buf.frequency}break;default:AL.currentCtx.err=40962;return}},getSourceParam:function(funcname,sourceId,param){if(!AL.currentCtx){return null}var src=AL.currentCtx.sources[sourceId];if(!src){AL.currentCtx.err=40961;return null}switch(param){case 514:return src.relative;case 4097:return src.coneInnerAngle;case 4098:return src.coneOuterAngle;case 4099:return src.pitch;case 4100:return src.position;case 4101:return src.direction;case 4102:return src.velocity;case 4103:return src.looping;case 4105:if(src.type===4136){return src.bufQueue[0].id}else{return 0}case 4106:return src.gain.gain.value;case 4109:return src.minGain;case 4110:return src.maxGain;case 4112:return src.state;case 4117:if(src.bufQueue.length===1&&src.bufQueue[0].id===0){return 0}else{return src.bufQueue.length}case 4118:if(src.bufQueue.length===1&&src.bufQueue[0].id===0||src.looping){return 0}else{return src.bufsProcessed}case 4128:return src.refDistance;case 4129:return src.rolloffFactor;case 4130:return src.coneOuterGain;case 4131:return src.maxDistance;case 4132:return AL.sourceTell(src);case 4133:var offset=AL.sourceTell(src);if(offset>0){offset*=src.bufQueue[0].frequency}return offset;case 4134:var offset=AL.sourceTell(src);if(offset>0){offset*=src.bufQueue[0].frequency*src.bufQueue[0].bytesPerSample}return offset;case 4135:return src.type;case 4628:return src.spatialize;case 8201:var length=0;var bytesPerFrame=0;for(var i=0;i0){var audioSrc=src.audioQueue[0];audioSrc.loop=true;audioSrc._duration=Number.POSITIVE_INFINITY}}else if(value===0){src.looping=false;var currentTime=AL.updateSourceTime(src);if(src.type===4136&&src.audioQueue.length>0){var audioSrc=src.audioQueue[0];audioSrc.loop=false;audioSrc._duration=src.bufQueue[0].audioBuf.duration/src.playbackRate;audioSrc._startTime=currentTime-src.bufOffset/src.playbackRate}}else{AL.currentCtx.err=40963;return}break;case 4105:if(src.state===4114||src.state===4115){AL.currentCtx.err=40964;return}if(value===0){for(var i in src.bufQueue){src.bufQueue[i].refCount--}src.bufQueue.length=1;src.bufQueue[0]=AL.buffers[0];src.bufsProcessed=0;src.type=4144}else{var buf=AL.buffers[value];if(!buf){AL.currentCtx.err=40963;return}for(var i in src.bufQueue){src.bufQueue[i].refCount--}src.bufQueue.length=0;buf.refCount++;src.bufQueue=[buf];src.bufsProcessed=0;src.type=4136}AL.initSourcePanner(src);AL.scheduleSourceAudio(src);break;case 4106:if(!Number.isFinite(value)||value<0){AL.currentCtx.err=40963;return}src.gain.gain.value=value;break;case 4109:if(!Number.isFinite(value)||value<0||value>Math.min(src.maxGain,1)){AL.currentCtx.err=40963;return}src.minGain=value;break;case 4110:if(!Number.isFinite(value)||value1){AL.currentCtx.err=40963;return}src.maxGain=value;break;case 4128:if(!Number.isFinite(value)||value<0){AL.currentCtx.err=40963;return}src.refDistance=value;if(src.panner){src.panner.refDistance=value}break;case 4129:if(!Number.isFinite(value)||value<0){AL.currentCtx.err=40963;return}src.rolloffFactor=value;if(src.panner){src.panner.rolloffFactor=value}break;case 4130:if(!Number.isFinite(value)||value<0||value>1){AL.currentCtx.err=40963;return}src.coneOuterGain=value;if(src.panner){src.panner.coneOuterGain=value}break;case 4131:if(!Number.isFinite(value)||value<0){AL.currentCtx.err=40963;return}src.maxDistance=value;if(src.panner){src.panner.maxDistance=value}break;case 4132:if(value<0||value>AL.sourceDuration(src)){AL.currentCtx.err=40963;return}AL.sourceSeek(src,value);break;case 4133:var srcLen=AL.sourceDuration(src);if(srcLen>0){var frequency;for(var bufId in src.bufQueue){if(bufId){frequency=src.bufQueue[bufId].frequency;break}}value/=frequency}if(value<0||value>srcLen){AL.currentCtx.err=40963;return}AL.sourceSeek(src,value);break;case 4134:var srcLen=AL.sourceDuration(src);if(srcLen>0){var bytesPerSec;for(var bufId in src.bufQueue){if(bufId){var buf=src.bufQueue[bufId];bytesPerSec=buf.frequency*buf.bytesPerSample*buf.channels;break}}value/=bytesPerSec}if(value<0||value>srcLen){AL.currentCtx.err=40963;return}AL.sourceSeek(src,value);break;case 4628:if(value!==0&&value!==1&&value!==2){AL.currentCtx.err=40963;return}src.spatialize=value;AL.initSourcePanner(src);break;case 8201:case 8202:case 8203:AL.currentCtx.err=40964;break;case 53248:switch(value){case 0:case 53249:case 53250:case 53251:case 53252:case 53253:case 53254:src.distanceModel=value;if(AL.currentCtx.sourceDistanceModel){AL.updateContextGlobal(AL.currentCtx)}break;default:AL.currentCtx.err=40963;return}break;default:AL.currentCtx.err=40962;return}},captures:{},sharedCaptureAudioCtx:null,requireValidCaptureDevice:function(deviceId,funcname){if(deviceId===0){AL.alcErr=40961;return null}var c=AL.captures[deviceId];if(!c){AL.alcErr=40961;return null}var err=c.mediaStreamError;if(err){AL.alcErr=40961;return null}return c}};function _alBufferData(bufferId,format,pData,size,freq){if(!AL.currentCtx){return}var buf=AL.buffers[bufferId];if(!buf){AL.currentCtx.err=40963;return}if(freq<=0){AL.currentCtx.err=40963;return}var audioBuf=null;try{switch(format){case 4352:if(size>0){audioBuf=AL.currentCtx.audioCtx.createBuffer(1,size,freq);var channel0=audioBuf.getChannelData(0);for(var i=0;i0){audioBuf=AL.currentCtx.audioCtx.createBuffer(1,size>>1,freq);var channel0=audioBuf.getChannelData(0);pData>>=1;for(var i=0;i>1;++i){channel0[i]=HEAP16[pData++]*30517578125e-15}}buf.bytesPerSample=2;buf.channels=1;buf.length=size>>1;break;case 4354:if(size>0){audioBuf=AL.currentCtx.audioCtx.createBuffer(2,size>>1,freq);var channel0=audioBuf.getChannelData(0);var channel1=audioBuf.getChannelData(1);for(var i=0;i>1;++i){channel0[i]=HEAPU8[pData++]*.0078125-1;channel1[i]=HEAPU8[pData++]*.0078125-1}}buf.bytesPerSample=1;buf.channels=2;buf.length=size>>1;break;case 4355:if(size>0){audioBuf=AL.currentCtx.audioCtx.createBuffer(2,size>>2,freq);var channel0=audioBuf.getChannelData(0);var channel1=audioBuf.getChannelData(1);pData>>=1;for(var i=0;i>2;++i){channel0[i]=HEAP16[pData++]*30517578125e-15;channel1[i]=HEAP16[pData++]*30517578125e-15}}buf.bytesPerSample=2;buf.channels=2;buf.length=size>>2;break;case 65552:if(size>0){audioBuf=AL.currentCtx.audioCtx.createBuffer(1,size>>2,freq);var channel0=audioBuf.getChannelData(0);pData>>=2;for(var i=0;i>2;++i){channel0[i]=HEAPF32[pData++]}}buf.bytesPerSample=4;buf.channels=1;buf.length=size>>2;break;case 65553:if(size>0){audioBuf=AL.currentCtx.audioCtx.createBuffer(2,size>>3,freq);var channel0=audioBuf.getChannelData(0);var channel1=audioBuf.getChannelData(1);pData>>=2;for(var i=0;i>3;++i){channel0[i]=HEAPF32[pData++];channel1[i]=HEAPF32[pData++]}}buf.bytesPerSample=4;buf.channels=2;buf.length=size>>3;break;default:AL.currentCtx.err=40963;return}buf.frequency=freq;buf.audioBuf=audioBuf}catch(e){AL.currentCtx.err=40963;return}}function _alDeleteBuffers(count,pBufferIds){if(!AL.currentCtx){return}for(var i=0;i>2];if(bufId===0){continue}if(!AL.buffers[bufId]){AL.currentCtx.err=40961;return}if(AL.buffers[bufId].refCount){AL.currentCtx.err=40964;return}}for(var i=0;i>2];if(bufId===0){continue}AL.deviceRefCounts[AL.buffers[bufId].deviceId]--;delete AL.buffers[bufId];AL.freeIds.push(bufId)}}function _alSourcei(sourceId,param,value){switch(param){case 514:case 4097:case 4098:case 4103:case 4105:case 4128:case 4129:case 4131:case 4132:case 4133:case 4134:case 4628:case 8201:case 8202:case 53248:AL.setSourceParam("alSourcei",sourceId,param,value);break;default:AL.setSourceParam("alSourcei",sourceId,param,null);break}}function _alDeleteSources(count,pSourceIds){if(!AL.currentCtx){return}for(var i=0;i>2];if(!AL.currentCtx.sources[srcId]){AL.currentCtx.err=40961;return}}for(var i=0;i>2];AL.setSourceState(AL.currentCtx.sources[srcId],4116);_alSourcei(srcId,4105,0);delete AL.currentCtx.sources[srcId];AL.freeIds.push(srcId)}}function _alGenBuffers(count,pBufferIds){if(!AL.currentCtx){return}for(var i=0;i>2]=buf.id}}function _alGenSources(count,pSourceIds){if(!AL.currentCtx){return}for(var i=0;i>2]=src.id}}function _alGetSourcei(sourceId,param,pValue){var val=AL.getSourceParam("alGetSourcei",sourceId,param);if(val===null){return}if(!pValue){AL.currentCtx.err=40963;return}switch(param){case 514:case 4097:case 4098:case 4103:case 4105:case 4112:case 4117:case 4118:case 4128:case 4129:case 4131:case 4132:case 4133:case 4134:case 4135:case 4628:case 8201:case 8202:case 53248:HEAP32[pValue>>2]=val;break;default:AL.currentCtx.err=40962;return}}function _alListenerfv(param,pValues){if(!AL.currentCtx){return}if(!pValues){AL.currentCtx.err=40963;return}switch(param){case 4100:case 4102:AL.paramArray[0]=HEAPF32[pValues>>2];AL.paramArray[1]=HEAPF32[pValues+4>>2];AL.paramArray[2]=HEAPF32[pValues+8>>2];AL.setListenerParam("alListenerfv",param,AL.paramArray);break;case 4111:AL.paramArray[0]=HEAPF32[pValues>>2];AL.paramArray[1]=HEAPF32[pValues+4>>2];AL.paramArray[2]=HEAPF32[pValues+8>>2];AL.paramArray[3]=HEAPF32[pValues+12>>2];AL.paramArray[4]=HEAPF32[pValues+16>>2];AL.paramArray[5]=HEAPF32[pValues+20>>2];AL.setListenerParam("alListenerfv",param,AL.paramArray);break;default:AL.setListenerParam("alListenerfv",param,null);break}}function _alSourcePause(sourceId){if(!AL.currentCtx){return}var src=AL.currentCtx.sources[sourceId];if(!src){AL.currentCtx.err=40961;return}AL.setSourceState(src,4115)}function _alSourcePlay(sourceId){if(!AL.currentCtx){return}var src=AL.currentCtx.sources[sourceId];if(!src){AL.currentCtx.err=40961;return}AL.setSourceState(src,4114)}function _alSourceStop(sourceId){if(!AL.currentCtx){return}var src=AL.currentCtx.sources[sourceId];if(!src){AL.currentCtx.err=40961;return}AL.setSourceState(src,4116)}function _alSourcef(sourceId,param,value){switch(param){case 4097:case 4098:case 4099:case 4106:case 4109:case 4110:case 4128:case 4129:case 4130:case 4131:case 4132:case 4133:case 4134:case 8203:AL.setSourceParam("alSourcef",sourceId,param,value);break;default:AL.setSourceParam("alSourcef",sourceId,param,null);break}}function _alSourcefv(sourceId,param,pValues){if(!AL.currentCtx){return}if(!pValues){AL.currentCtx.err=40963;return}switch(param){case 4097:case 4098:case 4099:case 4106:case 4109:case 4110:case 4128:case 4129:case 4130:case 4131:case 4132:case 4133:case 4134:case 8203:var val=HEAPF32[pValues>>2];AL.setSourceParam("alSourcefv",sourceId,param,val);break;case 4100:case 4101:case 4102:AL.paramArray[0]=HEAPF32[pValues>>2];AL.paramArray[1]=HEAPF32[pValues+4>>2];AL.paramArray[2]=HEAPF32[pValues+8>>2];AL.setSourceParam("alSourcefv",sourceId,param,AL.paramArray);break;default:AL.setSourceParam("alSourcefv",sourceId,param,null);break}}function _alcCreateContext(deviceId,pAttrList){if(!(deviceId in AL.deviceRefCounts)){AL.alcErr=40961;return 0}var options=null;var attrs=[];var hrtf=null;pAttrList>>=2;if(pAttrList){var attr=0;var val=0;while(true){attr=HEAP32[pAttrList++];attrs.push(attr);if(attr===0){break}val=HEAP32[pAttrList++];attrs.push(val);switch(attr){case 4103:if(!options){options={}}options.sampleRate=val;break;case 4112:case 4113:break;case 6546:switch(val){case 0:hrtf=false;break;case 1:hrtf=true;break;case 2:break;default:AL.alcErr=40964;return 0}break;case 6550:if(val!==0){AL.alcErr=40964;return 0}break;default:AL.alcErr=40964;return 0}}}var AudioContext=window.AudioContext||window.webkitAudioContext;var ac=null;try{if(options){ac=new AudioContext(options)}else{ac=new AudioContext}}catch(e){if(e.name==="NotSupportedError"){AL.alcErr=40964}else{AL.alcErr=40961}return 0}if(typeof ac.createGain==="undefined"){ac.createGain=ac.createGainNode}var gain=ac.createGain();gain.connect(ac.destination);var ctx={deviceId:deviceId,id:AL.newId(),attrs:attrs,audioCtx:ac,listener:{position:[0,0,0],velocity:[0,0,0],direction:[0,0,0],up:[0,0,0]},sources:[],interval:setInterval(function(){AL.scheduleContextAudio(ctx)},AL.QUEUE_INTERVAL),gain:gain,distanceModel:53250,speedOfSound:343.3,dopplerFactor:1,sourceDistanceModel:false,hrtf:hrtf||false,_err:0,get err(){return this._err},set err(val){if(this._err===0||val===0){this._err=val}}};AL.deviceRefCounts[deviceId]++;AL.contexts[ctx.id]=ctx;if(hrtf!==null){for(var ctxId in AL.contexts){var c=AL.contexts[ctxId];if(c.deviceId===deviceId){c.hrtf=hrtf;AL.updateContextGlobal(c)}}}return ctx.id}function _alcMakeContextCurrent(contextId){if(contextId===0){AL.currentCtx=null;return 0}else{AL.currentCtx=AL.contexts[contextId];return 1}}function _alcOpenDevice(pDeviceName){if(pDeviceName){var name=UTF8ToString(pDeviceName);if(name!==AL.DEVICE_NAME){return 0}}if(typeof AudioContext!=="undefined"||typeof webkitAudioContext!=="undefined"){var deviceId=AL.newId();AL.deviceRefCounts[deviceId]=0;return deviceId}else{return 0}}var _emscripten_get_now_is_monotonic=true;function _clock_gettime(clk_id,tp){var now;if(clk_id===0){now=Date.now()}else if((clk_id===1||clk_id===4)&&_emscripten_get_now_is_monotonic){now=_emscripten_get_now()}else{setErrNo(28);return-1}HEAP32[tp>>2]=now/1e3|0;HEAP32[tp+4>>2]=now%1e3*1e3*1e3|0;return 0}var EGL={errorCode:12288,defaultDisplayInitialized:false,currentContext:0,currentReadSurface:0,currentDrawSurface:0,contextAttributes:{alpha:false,depth:false,stencil:false,antialias:false},stringCache:{},setErrorCode:function(code){EGL.errorCode=code},chooseConfig:function(display,attribList,config,config_size,numConfigs){if(display!=62e3){EGL.setErrorCode(12296);return 0}if(attribList){for(;;){var param=HEAP32[attribList>>2];if(param==12321){var alphaSize=HEAP32[attribList+4>>2];EGL.contextAttributes.alpha=alphaSize>0}else if(param==12325){var depthSize=HEAP32[attribList+4>>2];EGL.contextAttributes.depth=depthSize>0}else if(param==12326){var stencilSize=HEAP32[attribList+4>>2];EGL.contextAttributes.stencil=stencilSize>0}else if(param==12337){var samples=HEAP32[attribList+4>>2];EGL.contextAttributes.antialias=samples>0}else if(param==12338){var samples=HEAP32[attribList+4>>2];EGL.contextAttributes.antialias=samples==1}else if(param==12544){var requestedPriority=HEAP32[attribList+4>>2];EGL.contextAttributes.lowLatency=requestedPriority!=12547}else if(param==12344){break}attribList+=8}}if((!config||!config_size)&&!numConfigs){EGL.setErrorCode(12300);return 0}if(numConfigs){HEAP32[numConfigs>>2]=1}if(config&&config_size>0){HEAP32[config>>2]=62002}EGL.setErrorCode(12288);return 1}};function _eglGetProcAddress(name_){return _emscripten_GetProcAddress(name_)}function _emscripten_get_sbrk_ptr(){return 372944}function __webgl_acquireInstancedArraysExtension(ctx){var ext=ctx.getExtension("ANGLE_instanced_arrays");if(ext){ctx["vertexAttribDivisor"]=function(index,divisor){ext["vertexAttribDivisorANGLE"](index,divisor)};ctx["drawArraysInstanced"]=function(mode,first,count,primcount){ext["drawArraysInstancedANGLE"](mode,first,count,primcount)};ctx["drawElementsInstanced"]=function(mode,count,type,indices,primcount){ext["drawElementsInstancedANGLE"](mode,count,type,indices,primcount)}}}function __webgl_acquireVertexArrayObjectExtension(ctx){var ext=ctx.getExtension("OES_vertex_array_object");if(ext){ctx["createVertexArray"]=function(){return ext["createVertexArrayOES"]()};ctx["deleteVertexArray"]=function(vao){ext["deleteVertexArrayOES"](vao)};ctx["bindVertexArray"]=function(vao){ext["bindVertexArrayOES"](vao)};ctx["isVertexArray"]=function(vao){return ext["isVertexArrayOES"](vao)}}}function __webgl_acquireDrawBuffersExtension(ctx){var ext=ctx.getExtension("WEBGL_draw_buffers");if(ext){ctx["drawBuffers"]=function(n,bufs){ext["drawBuffersWEBGL"](n,bufs)}}}var GL={counter:1,lastError:0,buffers:[],mappedBuffers:{},programs:[],framebuffers:[],renderbuffers:[],textures:[],uniforms:[],shaders:[],vaos:[],contexts:[],currentContext:null,offscreenCanvases:{},timerQueriesEXT:[],programInfos:{},stringCache:{},unpackAlignment:4,init:function(){var miniTempFloatBuffer=new Float32Array(GL.MINI_TEMP_BUFFER_SIZE);for(var i=0;i>2]:-1;source+=UTF8ToString(HEAP32[string+i*4>>2],len<0?undefined:len)}return source},createContext:function(canvas,webGLContextAttributes){var ctx=canvas.getContext("webgl",webGLContextAttributes);if(!ctx)return 0;var handle=GL.registerContext(ctx,webGLContextAttributes);return handle},registerContext:function(ctx,webGLContextAttributes){var handle=GL.getNewId(GL.contexts);var context={handle:handle,attributes:webGLContextAttributes,version:webGLContextAttributes.majorVersion,GLctx:ctx};if(ctx.canvas)ctx.canvas.GLctxObject=context;GL.contexts[handle]=context;if(typeof webGLContextAttributes.enableExtensionsByDefault==="undefined"||webGLContextAttributes.enableExtensionsByDefault){GL.initExtensions(context)}return handle},makeContextCurrent:function(contextHandle){GL.currentContext=GL.contexts[contextHandle];Module.ctx=GLctx=GL.currentContext&&GL.currentContext.GLctx;return!(contextHandle&&!GLctx)},getContext:function(contextHandle){return GL.contexts[contextHandle]},deleteContext:function(contextHandle){if(GL.currentContext===GL.contexts[contextHandle])GL.currentContext=null;if(typeof JSEvents==="object")JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas);if(GL.contexts[contextHandle]&&GL.contexts[contextHandle].GLctx.canvas)GL.contexts[contextHandle].GLctx.canvas.GLctxObject=undefined;GL.contexts[contextHandle]=null},initExtensions:function(context){if(!context)context=GL.currentContext;if(context.initExtensionsDone)return;context.initExtensionsDone=true;var GLctx=context.GLctx;if(context.version<2){__webgl_acquireInstancedArraysExtension(GLctx);__webgl_acquireVertexArrayObjectExtension(GLctx);__webgl_acquireDrawBuffersExtension(GLctx)}GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query");var automaticallyEnabledExtensions=["OES_texture_float","OES_texture_half_float","OES_standard_derivatives","OES_vertex_array_object","WEBGL_compressed_texture_s3tc","WEBGL_depth_texture","OES_element_index_uint","EXT_texture_filter_anisotropic","EXT_frag_depth","WEBGL_draw_buffers","ANGLE_instanced_arrays","OES_texture_float_linear","OES_texture_half_float_linear","EXT_blend_minmax","EXT_shader_texture_lod","EXT_texture_norm16","WEBGL_compressed_texture_pvrtc","EXT_color_buffer_half_float","WEBGL_color_buffer_float","EXT_sRGB","WEBGL_compressed_texture_etc1","EXT_disjoint_timer_query","WEBGL_compressed_texture_etc","WEBGL_compressed_texture_astc","EXT_color_buffer_float","WEBGL_compressed_texture_s3tc_srgb","EXT_disjoint_timer_query_webgl2","WEBKIT_WEBGL_compressed_texture_pvrtc"];var exts=GLctx.getSupportedExtensions()||[];exts.forEach(function(ext){if(automaticallyEnabledExtensions.indexOf(ext)!=-1){GLctx.getExtension(ext)}})},populateUniformTable:function(program){var p=GL.programs[program];var ptable=GL.programInfos[program]={uniforms:{},maxUniformLength:0,maxAttributeLength:-1,maxUniformBlockNameLength:-1};var utable=ptable.uniforms;var numUniforms=GLctx.getProgramParameter(p,35718);for(var i=0;i>2];var buffer=GL.buffers[id];if(!buffer)continue;GLctx.deleteBuffer(buffer);buffer.name=0;GL.buffers[id]=null;if(id==GL.currArrayBuffer)GL.currArrayBuffer=0;if(id==GL.currElementArrayBuffer)GL.currElementArrayBuffer=0}}function _emscripten_glDeleteFramebuffers(n,framebuffers){for(var i=0;i>2];var framebuffer=GL.framebuffers[id];if(!framebuffer)continue;GLctx.deleteFramebuffer(framebuffer);framebuffer.name=0;GL.framebuffers[id]=null}}function _emscripten_glDeleteProgram(id){if(!id)return;var program=GL.programs[id];if(!program){GL.recordError(1281);return}GLctx.deleteProgram(program);program.name=0;GL.programs[id]=null;GL.programInfos[id]=null}function _emscripten_glDeleteQueriesEXT(n,ids){for(var i=0;i>2];var query=GL.timerQueriesEXT[id];if(!query)continue;GLctx.disjointTimerQueryExt["deleteQueryEXT"](query);GL.timerQueriesEXT[id]=null}}function _emscripten_glDeleteRenderbuffers(n,renderbuffers){for(var i=0;i>2];var renderbuffer=GL.renderbuffers[id];if(!renderbuffer)continue;GLctx.deleteRenderbuffer(renderbuffer);renderbuffer.name=0;GL.renderbuffers[id]=null}}function _emscripten_glDeleteShader(id){if(!id)return;var shader=GL.shaders[id];if(!shader){GL.recordError(1281);return}GLctx.deleteShader(shader);GL.shaders[id]=null}function _emscripten_glDeleteTextures(n,textures){for(var i=0;i>2];var texture=GL.textures[id];if(!texture)continue;GLctx.deleteTexture(texture);texture.name=0;GL.textures[id]=null}}function _emscripten_glDeleteVertexArraysOES(n,vaos){for(var i=0;i>2];GLctx["deleteVertexArray"](GL.vaos[id]);GL.vaos[id]=null}}function _emscripten_glDepthFunc(x0){GLctx["depthFunc"](x0)}function _emscripten_glDepthMask(flag){GLctx.depthMask(!!flag)}function _emscripten_glDepthRangef(x0,x1){GLctx["depthRange"](x0,x1)}function _emscripten_glDetachShader(program,shader){GLctx.detachShader(GL.programs[program],GL.shaders[shader])}function _emscripten_glDisable(x0){GLctx["disable"](x0)}function _emscripten_glDisableVertexAttribArray(index){GLctx.disableVertexAttribArray(index)}function _emscripten_glDrawArrays(mode,first,count){GLctx.drawArrays(mode,first,count)}function _emscripten_glDrawArraysInstancedANGLE(mode,first,count,primcount){GLctx["drawArraysInstanced"](mode,first,count,primcount)}var __tempFixedLengthArray=[];function _emscripten_glDrawBuffersWEBGL(n,bufs){var bufArray=__tempFixedLengthArray[n];for(var i=0;i>2]}GLctx["drawBuffers"](bufArray)}function _emscripten_glDrawElements(mode,count,type,indices){GLctx.drawElements(mode,count,type,indices)}function _emscripten_glDrawElementsInstancedANGLE(mode,count,type,indices,primcount){GLctx["drawElementsInstanced"](mode,count,type,indices,primcount)}function _emscripten_glEnable(x0){GLctx["enable"](x0)}function _emscripten_glEnableVertexAttribArray(index){GLctx.enableVertexAttribArray(index)}function _emscripten_glEndQueryEXT(target){GLctx.disjointTimerQueryExt["endQueryEXT"](target)}function _emscripten_glFinish(){GLctx["finish"]()}function _emscripten_glFlush(){GLctx["flush"]()}function _emscripten_glFramebufferRenderbuffer(target,attachment,renderbuffertarget,renderbuffer){GLctx.framebufferRenderbuffer(target,attachment,renderbuffertarget,GL.renderbuffers[renderbuffer])}function _emscripten_glFramebufferTexture2D(target,attachment,textarget,texture,level){GLctx.framebufferTexture2D(target,attachment,textarget,GL.textures[texture],level)}function _emscripten_glFrontFace(x0){GLctx["frontFace"](x0)}function __glGenObject(n,buffers,createFunction,objectTable){for(var i=0;i>2]=id}}function _emscripten_glGenBuffers(n,buffers){__glGenObject(n,buffers,"createBuffer",GL.buffers)}function _emscripten_glGenFramebuffers(n,ids){__glGenObject(n,ids,"createFramebuffer",GL.framebuffers)}function _emscripten_glGenQueriesEXT(n,ids){for(var i=0;i>2]=0;return}var id=GL.getNewId(GL.timerQueriesEXT);query.name=id;GL.timerQueriesEXT[id]=query;HEAP32[ids+i*4>>2]=id}}function _emscripten_glGenRenderbuffers(n,renderbuffers){__glGenObject(n,renderbuffers,"createRenderbuffer",GL.renderbuffers)}function _emscripten_glGenTextures(n,textures){__glGenObject(n,textures,"createTexture",GL.textures)}function _emscripten_glGenVertexArraysOES(n,arrays){__glGenObject(n,arrays,"createVertexArray",GL.vaos)}function _emscripten_glGenerateMipmap(x0){GLctx["generateMipmap"](x0)}function _emscripten_glGetActiveAttrib(program,index,bufSize,length,size,type,name){program=GL.programs[program];var info=GLctx.getActiveAttrib(program,index);if(!info)return;var numBytesWrittenExclNull=bufSize>0&&name?stringToUTF8(info.name,name,bufSize):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull;if(size)HEAP32[size>>2]=info.size;if(type)HEAP32[type>>2]=info.type}function _emscripten_glGetActiveUniform(program,index,bufSize,length,size,type,name){program=GL.programs[program];var info=GLctx.getActiveUniform(program,index);if(!info)return;var numBytesWrittenExclNull=bufSize>0&&name?stringToUTF8(info.name,name,bufSize):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull;if(size)HEAP32[size>>2]=info.size;if(type)HEAP32[type>>2]=info.type}function _emscripten_glGetAttachedShaders(program,maxCount,count,shaders){var result=GLctx.getAttachedShaders(GL.programs[program]);var len=result.length;if(len>maxCount){len=maxCount}HEAP32[count>>2]=len;for(var i=0;i>2]=id}}function _emscripten_glGetAttribLocation(program,name){return GLctx.getAttribLocation(GL.programs[program],UTF8ToString(name))}function writeI53ToI64(ptr,num){HEAPU32[ptr>>2]=num;HEAPU32[ptr+4>>2]=(num-HEAPU32[ptr>>2])/4294967296}function emscriptenWebGLGet(name_,p,type){if(!p){GL.recordError(1281);return}var ret=undefined;switch(name_){case 36346:ret=1;break;case 36344:if(type!=0&&type!=1){GL.recordError(1280)}return;case 36345:ret=0;break;case 34466:var formats=GLctx.getParameter(34467);ret=formats?formats.length:0;break}if(ret===undefined){var result=GLctx.getParameter(name_);switch(typeof result){case"number":ret=result;break;case"boolean":ret=result?1:0;break;case"string":GL.recordError(1280);return;case"object":if(result===null){switch(name_){case 34964:case 35725:case 34965:case 36006:case 36007:case 32873:case 34229:case 34068:{ret=0;break}default:{GL.recordError(1280);return}}}else if(result instanceof Float32Array||result instanceof Uint32Array||result instanceof Int32Array||result instanceof Array){for(var i=0;i>2]=result[i];break;case 2:HEAPF32[p+i*4>>2]=result[i];break;case 4:HEAP8[p+i>>0]=result[i]?1:0;break}}return}else{try{ret=result.name|0}catch(e){GL.recordError(1280);err("GL_INVALID_ENUM in glGet"+type+"v: Unknown object returned from WebGL getParameter("+name_+")! (error: "+e+")");return}}break;default:GL.recordError(1280);err("GL_INVALID_ENUM in glGet"+type+"v: Native code calling glGet"+type+"v("+name_+") and it returns "+result+" of type "+typeof result+"!");return}}switch(type){case 1:writeI53ToI64(p,ret);break;case 0:HEAP32[p>>2]=ret;break;case 2:HEAPF32[p>>2]=ret;break;case 4:HEAP8[p>>0]=ret?1:0;break}}function _emscripten_glGetBooleanv(name_,p){emscriptenWebGLGet(name_,p,4)}function _emscripten_glGetBufferParameteriv(target,value,data){if(!data){GL.recordError(1281);return}HEAP32[data>>2]=GLctx.getBufferParameter(target,value)}function _emscripten_glGetError(){var error=GLctx.getError()||GL.lastError;GL.lastError=0;return error}function _emscripten_glGetFloatv(name_,p){emscriptenWebGLGet(name_,p,2)}function _emscripten_glGetFramebufferAttachmentParameteriv(target,attachment,pname,params){var result=GLctx.getFramebufferAttachmentParameter(target,attachment,pname);if(result instanceof WebGLRenderbuffer||result instanceof WebGLTexture){result=result.name|0}HEAP32[params>>2]=result}function _emscripten_glGetIntegerv(name_,p){emscriptenWebGLGet(name_,p,0)}function _emscripten_glGetProgramInfoLog(program,maxLength,length,infoLog){var log=GLctx.getProgramInfoLog(GL.programs[program]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull}function _emscripten_glGetProgramiv(program,pname,p){if(!p){GL.recordError(1281);return}if(program>=GL.counter){GL.recordError(1281);return}var ptable=GL.programInfos[program];if(!ptable){GL.recordError(1282);return}if(pname==35716){var log=GLctx.getProgramInfoLog(GL.programs[program]);if(log===null)log="(unknown error)";HEAP32[p>>2]=log.length+1}else if(pname==35719){HEAP32[p>>2]=ptable.maxUniformLength}else if(pname==35722){if(ptable.maxAttributeLength==-1){program=GL.programs[program];var numAttribs=GLctx.getProgramParameter(program,35721);ptable.maxAttributeLength=0;for(var i=0;i>2]=ptable.maxAttributeLength}else if(pname==35381){if(ptable.maxUniformBlockNameLength==-1){program=GL.programs[program];var numBlocks=GLctx.getProgramParameter(program,35382);ptable.maxUniformBlockNameLength=0;for(var i=0;i>2]=ptable.maxUniformBlockNameLength}else{HEAP32[p>>2]=GLctx.getProgramParameter(GL.programs[program],pname)}}function _emscripten_glGetQueryObjecti64vEXT(id,pname,params){if(!params){GL.recordError(1281);return}var query=GL.timerQueriesEXT[id];var param=GLctx.disjointTimerQueryExt["getQueryObjectEXT"](query,pname);var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}writeI53ToI64(params,ret)}function _emscripten_glGetQueryObjectivEXT(id,pname,params){if(!params){GL.recordError(1281);return}var query=GL.timerQueriesEXT[id];var param=GLctx.disjointTimerQueryExt["getQueryObjectEXT"](query,pname);var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}HEAP32[params>>2]=ret}function _emscripten_glGetQueryObjectui64vEXT(id,pname,params){if(!params){GL.recordError(1281);return}var query=GL.timerQueriesEXT[id];var param=GLctx.disjointTimerQueryExt["getQueryObjectEXT"](query,pname);var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}writeI53ToI64(params,ret)}function _emscripten_glGetQueryObjectuivEXT(id,pname,params){if(!params){GL.recordError(1281);return}var query=GL.timerQueriesEXT[id];var param=GLctx.disjointTimerQueryExt["getQueryObjectEXT"](query,pname);var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}HEAP32[params>>2]=ret}function _emscripten_glGetQueryivEXT(target,pname,params){if(!params){GL.recordError(1281);return}HEAP32[params>>2]=GLctx.disjointTimerQueryExt["getQueryEXT"](target,pname)}function _emscripten_glGetRenderbufferParameteriv(target,pname,params){if(!params){GL.recordError(1281);return}HEAP32[params>>2]=GLctx.getRenderbufferParameter(target,pname)}function _emscripten_glGetShaderInfoLog(shader,maxLength,length,infoLog){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull}function _emscripten_glGetShaderPrecisionFormat(shaderType,precisionType,range,precision){var result=GLctx.getShaderPrecisionFormat(shaderType,precisionType);HEAP32[range>>2]=result.rangeMin;HEAP32[range+4>>2]=result.rangeMax;HEAP32[precision>>2]=result.precision}function _emscripten_glGetShaderSource(shader,bufSize,length,source){var result=GLctx.getShaderSource(GL.shaders[shader]);if(!result)return;var numBytesWrittenExclNull=bufSize>0&&source?stringToUTF8(result,source,bufSize):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull}function _emscripten_glGetShaderiv(shader,pname,p){if(!p){GL.recordError(1281);return}if(pname==35716){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";HEAP32[p>>2]=log.length+1}else if(pname==35720){var source=GLctx.getShaderSource(GL.shaders[shader]);var sourceLength=source===null||source.length==0?0:source.length+1;HEAP32[p>>2]=sourceLength}else{HEAP32[p>>2]=GLctx.getShaderParameter(GL.shaders[shader],pname)}}function stringToNewUTF8(jsString){var length=lengthBytesUTF8(jsString)+1;var cString=_malloc(length);stringToUTF8(jsString,cString,length);return cString}function _emscripten_glGetString(name_){if(GL.stringCache[name_])return GL.stringCache[name_];var ret;switch(name_){case 7939:var exts=GLctx.getSupportedExtensions()||[];exts=exts.concat(exts.map(function(e){return"GL_"+e}));ret=stringToNewUTF8(exts.join(" "));break;case 7936:case 7937:case 37445:case 37446:var s=GLctx.getParameter(name_);if(!s){GL.recordError(1280)}ret=stringToNewUTF8(s);break;case 7938:var glVersion=GLctx.getParameter(7938);{glVersion="OpenGL ES 2.0 ("+glVersion+")"}ret=stringToNewUTF8(glVersion);break;case 35724:var glslVersion=GLctx.getParameter(35724);var ver_re=/^WebGL GLSL ES ([0-9]\.[0-9][0-9]?)(?:$| .*)/;var ver_num=glslVersion.match(ver_re);if(ver_num!==null){if(ver_num[1].length==3)ver_num[1]=ver_num[1]+"0";glslVersion="OpenGL ES GLSL ES "+ver_num[1]+" ("+glslVersion+")"}ret=stringToNewUTF8(glslVersion);break;default:GL.recordError(1280);return 0}GL.stringCache[name_]=ret;return ret}function _emscripten_glGetTexParameterfv(target,pname,params){if(!params){GL.recordError(1281);return}HEAPF32[params>>2]=GLctx.getTexParameter(target,pname)}function _emscripten_glGetTexParameteriv(target,pname,params){if(!params){GL.recordError(1281);return}HEAP32[params>>2]=GLctx.getTexParameter(target,pname)}function jstoi_q(str){return parseInt(str)}function _emscripten_glGetUniformLocation(program,name){name=UTF8ToString(name);var arrayIndex=0;if(name[name.length-1]=="]"){var leftBrace=name.lastIndexOf("[");arrayIndex=name[leftBrace+1]!="]"?jstoi_q(name.slice(leftBrace+1)):0;name=name.slice(0,leftBrace)}var uniformInfo=GL.programInfos[program]&&GL.programInfos[program].uniforms[name];if(uniformInfo&&arrayIndex>=0&&arrayIndex>2]=data;break;case 2:HEAPF32[params>>2]=data;break;default:throw"internal emscriptenWebGLGetUniform() error, bad type: "+type}}else{for(var i=0;i>2]=data[i];break;case 2:HEAPF32[params+i*4>>2]=data[i];break;default:throw"internal emscriptenWebGLGetUniform() error, bad type: "+type}}}}function _emscripten_glGetUniformfv(program,location,params){emscriptenWebGLGetUniform(program,location,params,2)}function _emscripten_glGetUniformiv(program,location,params){emscriptenWebGLGetUniform(program,location,params,0)}function _emscripten_glGetVertexAttribPointerv(index,pname,pointer){if(!pointer){GL.recordError(1281);return}HEAP32[pointer>>2]=GLctx.getVertexAttribOffset(index,pname)}function emscriptenWebGLGetVertexAttrib(index,pname,params,type){if(!params){GL.recordError(1281);return}var data=GLctx.getVertexAttrib(index,pname);if(pname==34975){HEAP32[params>>2]=data&&data["name"]}else if(typeof data=="number"||typeof data=="boolean"){switch(type){case 0:HEAP32[params>>2]=data;break;case 2:HEAPF32[params>>2]=data;break;case 5:HEAP32[params>>2]=Math.fround(data);break;default:throw"internal emscriptenWebGLGetVertexAttrib() error, bad type: "+type}}else{for(var i=0;i>2]=data[i];break;case 2:HEAPF32[params+i*4>>2]=data[i];break;case 5:HEAP32[params+i*4>>2]=Math.fround(data[i]);break;default:throw"internal emscriptenWebGLGetVertexAttrib() error, bad type: "+type}}}}function _emscripten_glGetVertexAttribfv(index,pname,params){emscriptenWebGLGetVertexAttrib(index,pname,params,2)}function _emscripten_glGetVertexAttribiv(index,pname,params){emscriptenWebGLGetVertexAttrib(index,pname,params,5)}function _emscripten_glHint(x0,x1){GLctx["hint"](x0,x1)}function _emscripten_glIsBuffer(buffer){var b=GL.buffers[buffer];if(!b)return 0;return GLctx.isBuffer(b)}function _emscripten_glIsEnabled(x0){return GLctx["isEnabled"](x0)}function _emscripten_glIsFramebuffer(framebuffer){var fb=GL.framebuffers[framebuffer];if(!fb)return 0;return GLctx.isFramebuffer(fb)}function _emscripten_glIsProgram(program){program=GL.programs[program];if(!program)return 0;return GLctx.isProgram(program)}function _emscripten_glIsQueryEXT(id){var query=GL.timerQueriesEXT[id];if(!query)return 0;return GLctx.disjointTimerQueryExt["isQueryEXT"](query)}function _emscripten_glIsRenderbuffer(renderbuffer){var rb=GL.renderbuffers[renderbuffer];if(!rb)return 0;return GLctx.isRenderbuffer(rb)}function _emscripten_glIsShader(shader){var s=GL.shaders[shader];if(!s)return 0;return GLctx.isShader(s)}function _emscripten_glIsTexture(id){var texture=GL.textures[id];if(!texture)return 0;return GLctx.isTexture(texture)}function _emscripten_glIsVertexArrayOES(array){var vao=GL.vaos[array];if(!vao)return 0;return GLctx["isVertexArray"](vao)}function _emscripten_glLineWidth(x0){GLctx["lineWidth"](x0)}function _emscripten_glLinkProgram(program){GLctx.linkProgram(GL.programs[program]);GL.populateUniformTable(program)}function _emscripten_glPixelStorei(pname,param){if(pname==3317){GL.unpackAlignment=param}GLctx.pixelStorei(pname,param)}function _emscripten_glPolygonOffset(x0,x1){GLctx["polygonOffset"](x0,x1)}function _emscripten_glQueryCounterEXT(id,target){GLctx.disjointTimerQueryExt["queryCounterEXT"](GL.timerQueriesEXT[id],target)}function __computeUnpackAlignedImageSize(width,height,sizePerPixel,alignment){function roundedToNextMultipleOf(x,y){return x+y-1&-y}var plainRowSize=width*sizePerPixel;var alignedRowSize=roundedToNextMultipleOf(plainRowSize,alignment);return height*alignedRowSize}function __colorChannelsInGlTextureFormat(format){var colorChannels={5:3,6:4,8:2,29502:3,29504:4};return colorChannels[format-6402]||1}function __heapObjectForWebGLType(type){type-=5120;if(type==1)return HEAPU8;if(type==4)return HEAP32;if(type==6)return HEAPF32;if(type==5||type==28922)return HEAPU32;return HEAPU16}function __heapAccessShiftForWebGLHeap(heap){return 31-Math.clz32(heap.BYTES_PER_ELEMENT)}function emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,internalFormat){var heap=__heapObjectForWebGLType(type);var shift=__heapAccessShiftForWebGLHeap(heap);var byteSize=1<>shift,pixels+bytes>>shift)}function _emscripten_glReadPixels(x,y,width,height,format,type,pixels){var pixelData=emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,format);if(!pixelData){GL.recordError(1280);return}GLctx.readPixels(x,y,width,height,format,type,pixelData)}function _emscripten_glReleaseShaderCompiler(){}function _emscripten_glRenderbufferStorage(x0,x1,x2,x3){GLctx["renderbufferStorage"](x0,x1,x2,x3)}function _emscripten_glSampleCoverage(value,invert){GLctx.sampleCoverage(value,!!invert)}function _emscripten_glScissor(x0,x1,x2,x3){GLctx["scissor"](x0,x1,x2,x3)}function _emscripten_glShaderBinary(){GL.recordError(1280)}function _emscripten_glShaderSource(shader,count,string,length){var source=GL.getSource(shader,count,string,length);GLctx.shaderSource(GL.shaders[shader],source)}function _emscripten_glStencilFunc(x0,x1,x2){GLctx["stencilFunc"](x0,x1,x2)}function _emscripten_glStencilFuncSeparate(x0,x1,x2,x3){GLctx["stencilFuncSeparate"](x0,x1,x2,x3)}function _emscripten_glStencilMask(x0){GLctx["stencilMask"](x0)}function _emscripten_glStencilMaskSeparate(x0,x1){GLctx["stencilMaskSeparate"](x0,x1)}function _emscripten_glStencilOp(x0,x1,x2){GLctx["stencilOp"](x0,x1,x2)}function _emscripten_glStencilOpSeparate(x0,x1,x2,x3){GLctx["stencilOpSeparate"](x0,x1,x2,x3)}function _emscripten_glTexImage2D(target,level,internalFormat,width,height,border,format,type,pixels){GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,pixels?emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,internalFormat):null)}function _emscripten_glTexParameterf(x0,x1,x2){GLctx["texParameterf"](x0,x1,x2)}function _emscripten_glTexParameterfv(target,pname,params){var param=HEAPF32[params>>2];GLctx.texParameterf(target,pname,param)}function _emscripten_glTexParameteri(x0,x1,x2){GLctx["texParameteri"](x0,x1,x2)}function _emscripten_glTexParameteriv(target,pname,params){var param=HEAP32[params>>2];GLctx.texParameteri(target,pname,param)}function _emscripten_glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels){var pixelData=null;if(pixels)pixelData=emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,0);GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixelData)}function _emscripten_glUniform1f(location,v0){GLctx.uniform1f(GL.uniforms[location],v0)}function _emscripten_glUniform1fv(location,count,value){if(count<=GL.MINI_TEMP_BUFFER_SIZE){var view=GL.miniTempBufferFloatViews[count-1];for(var i=0;i>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*4>>2)}GLctx.uniform1fv(GL.uniforms[location],view)}function _emscripten_glUniform1i(location,v0){GLctx.uniform1i(GL.uniforms[location],v0)}function _emscripten_glUniform1iv(location,count,value){if(count<=GL.MINI_TEMP_BUFFER_SIZE){var view=GL.miniTempBufferIntViews[count-1];for(var i=0;i>2]}}else{var view=HEAP32.subarray(value>>2,value+count*4>>2)}GLctx.uniform1iv(GL.uniforms[location],view)}function _emscripten_glUniform2f(location,v0,v1){GLctx.uniform2f(GL.uniforms[location],v0,v1)}function _emscripten_glUniform2fv(location,count,value){if(2*count<=GL.MINI_TEMP_BUFFER_SIZE){var view=GL.miniTempBufferFloatViews[2*count-1];for(var i=0;i<2*count;i+=2){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*8>>2)}GLctx.uniform2fv(GL.uniforms[location],view)}function _emscripten_glUniform2i(location,v0,v1){GLctx.uniform2i(GL.uniforms[location],v0,v1)}function _emscripten_glUniform2iv(location,count,value){if(2*count<=GL.MINI_TEMP_BUFFER_SIZE){var view=GL.miniTempBufferIntViews[2*count-1];for(var i=0;i<2*count;i+=2){view[i]=HEAP32[value+4*i>>2];view[i+1]=HEAP32[value+(4*i+4)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*8>>2)}GLctx.uniform2iv(GL.uniforms[location],view)}function _emscripten_glUniform3f(location,v0,v1,v2){GLctx.uniform3f(GL.uniforms[location],v0,v1,v2)}function _emscripten_glUniform3fv(location,count,value){if(3*count<=GL.MINI_TEMP_BUFFER_SIZE){var view=GL.miniTempBufferFloatViews[3*count-1];for(var i=0;i<3*count;i+=3){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*12>>2)}GLctx.uniform3fv(GL.uniforms[location],view)}function _emscripten_glUniform3i(location,v0,v1,v2){GLctx.uniform3i(GL.uniforms[location],v0,v1,v2)}function _emscripten_glUniform3iv(location,count,value){if(3*count<=GL.MINI_TEMP_BUFFER_SIZE){var view=GL.miniTempBufferIntViews[3*count-1];for(var i=0;i<3*count;i+=3){view[i]=HEAP32[value+4*i>>2];view[i+1]=HEAP32[value+(4*i+4)>>2];view[i+2]=HEAP32[value+(4*i+8)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*12>>2)}GLctx.uniform3iv(GL.uniforms[location],view)}function _emscripten_glUniform4f(location,v0,v1,v2,v3){GLctx.uniform4f(GL.uniforms[location],v0,v1,v2,v3)}function _emscripten_glUniform4fv(location,count,value){if(4*count<=GL.MINI_TEMP_BUFFER_SIZE){var view=GL.miniTempBufferFloatViews[4*count-1];var heap=HEAPF32;value>>=2;for(var i=0;i<4*count;i+=4){var dst=value+i;view[i]=heap[dst];view[i+1]=heap[dst+1];view[i+2]=heap[dst+2];view[i+3]=heap[dst+3]}}else{var view=HEAPF32.subarray(value>>2,value+count*16>>2)}GLctx.uniform4fv(GL.uniforms[location],view)}function _emscripten_glUniform4i(location,v0,v1,v2,v3){GLctx.uniform4i(GL.uniforms[location],v0,v1,v2,v3)}function _emscripten_glUniform4iv(location,count,value){if(4*count<=GL.MINI_TEMP_BUFFER_SIZE){var view=GL.miniTempBufferIntViews[4*count-1];for(var i=0;i<4*count;i+=4){view[i]=HEAP32[value+4*i>>2];view[i+1]=HEAP32[value+(4*i+4)>>2];view[i+2]=HEAP32[value+(4*i+8)>>2];view[i+3]=HEAP32[value+(4*i+12)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*16>>2)}GLctx.uniform4iv(GL.uniforms[location],view)}function _emscripten_glUniformMatrix2fv(location,count,transpose,value){if(4*count<=GL.MINI_TEMP_BUFFER_SIZE){var view=GL.miniTempBufferFloatViews[4*count-1];for(var i=0;i<4*count;i+=4){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2];view[i+3]=HEAPF32[value+(4*i+12)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*16>>2)}GLctx.uniformMatrix2fv(GL.uniforms[location],!!transpose,view)}function _emscripten_glUniformMatrix3fv(location,count,transpose,value){if(9*count<=GL.MINI_TEMP_BUFFER_SIZE){var view=GL.miniTempBufferFloatViews[9*count-1];for(var i=0;i<9*count;i+=9){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2];view[i+3]=HEAPF32[value+(4*i+12)>>2];view[i+4]=HEAPF32[value+(4*i+16)>>2];view[i+5]=HEAPF32[value+(4*i+20)>>2];view[i+6]=HEAPF32[value+(4*i+24)>>2];view[i+7]=HEAPF32[value+(4*i+28)>>2];view[i+8]=HEAPF32[value+(4*i+32)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*36>>2)}GLctx.uniformMatrix3fv(GL.uniforms[location],!!transpose,view)}function _emscripten_glUniformMatrix4fv(location,count,transpose,value){if(16*count<=GL.MINI_TEMP_BUFFER_SIZE){var view=GL.miniTempBufferFloatViews[16*count-1];var heap=HEAPF32;value>>=2;for(var i=0;i<16*count;i+=16){var dst=value+i;view[i]=heap[dst];view[i+1]=heap[dst+1];view[i+2]=heap[dst+2];view[i+3]=heap[dst+3];view[i+4]=heap[dst+4];view[i+5]=heap[dst+5];view[i+6]=heap[dst+6];view[i+7]=heap[dst+7];view[i+8]=heap[dst+8];view[i+9]=heap[dst+9];view[i+10]=heap[dst+10];view[i+11]=heap[dst+11];view[i+12]=heap[dst+12];view[i+13]=heap[dst+13];view[i+14]=heap[dst+14];view[i+15]=heap[dst+15]}}else{var view=HEAPF32.subarray(value>>2,value+count*64>>2)}GLctx.uniformMatrix4fv(GL.uniforms[location],!!transpose,view)}function _emscripten_glUseProgram(program){GLctx.useProgram(GL.programs[program])}function _emscripten_glValidateProgram(program){GLctx.validateProgram(GL.programs[program])}function _emscripten_glVertexAttrib1f(x0,x1){GLctx["vertexAttrib1f"](x0,x1)}function _emscripten_glVertexAttrib1fv(index,v){GLctx.vertexAttrib1f(index,HEAPF32[v>>2])}function _emscripten_glVertexAttrib2f(x0,x1,x2){GLctx["vertexAttrib2f"](x0,x1,x2)}function _emscripten_glVertexAttrib2fv(index,v){GLctx.vertexAttrib2f(index,HEAPF32[v>>2],HEAPF32[v+4>>2])}function _emscripten_glVertexAttrib3f(x0,x1,x2,x3){GLctx["vertexAttrib3f"](x0,x1,x2,x3)}function _emscripten_glVertexAttrib3fv(index,v){GLctx.vertexAttrib3f(index,HEAPF32[v>>2],HEAPF32[v+4>>2],HEAPF32[v+8>>2])}function _emscripten_glVertexAttrib4f(x0,x1,x2,x3,x4){GLctx["vertexAttrib4f"](x0,x1,x2,x3,x4)}function _emscripten_glVertexAttrib4fv(index,v){GLctx.vertexAttrib4f(index,HEAPF32[v>>2],HEAPF32[v+4>>2],HEAPF32[v+8>>2],HEAPF32[v+12>>2])}function _emscripten_glVertexAttribDivisorANGLE(index,divisor){GLctx["vertexAttribDivisor"](index,divisor)}function _emscripten_glVertexAttribPointer(index,size,type,normalized,stride,ptr){GLctx.vertexAttribPointer(index,size,type,!!normalized,stride,ptr)}function _emscripten_glViewport(x0,x1,x2,x3){GLctx["viewport"](x0,x1,x2,x3)}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function _emscripten_get_heap_size(){return HEAPU8.length}function emscripten_realloc_buffer(size){try{wasmMemory.grow(size-buffer.byteLength+65535>>>16);updateGlobalBufferAndViews(wasmMemory.buffer);return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){requestedSize=requestedSize>>>0;var oldSize=_emscripten_get_heap_size();var PAGE_MULTIPLE=65536;var maxHeapSize=2147483648;if(requestedSize>maxHeapSize){return false}var minHeapSize=16777216;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(minHeapSize,requestedSize,overGrownHeapSize),PAGE_MULTIPLE));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}var ENV={};function __getExecutableName(){return thisProgram||"./this.program"}function getEnvStrings(){if(!getEnvStrings.strings){var env={"USER":"web_user","LOGNAME":"web_user","PATH":"/","PWD":"/","HOME":"/home/web_user","LANG":(typeof navigator==="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8","_":__getExecutableName()};for(var x in ENV){env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(x+"="+env[x])}getEnvStrings.strings=strings}return getEnvStrings.strings}function _environ_get(__environ,environ_buf){var bufSize=0;getEnvStrings().forEach(function(string,i){var ptr=environ_buf+bufSize;HEAP32[__environ+i*4>>2]=ptr;writeAsciiToMemory(string,ptr);bufSize+=string.length+1});return 0}function _environ_sizes_get(penviron_count,penviron_buf_size){var strings=getEnvStrings();HEAP32[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(function(string){bufSize+=string.length+1});HEAP32[penviron_buf_size>>2]=bufSize;return 0}function _fd_close(fd){return 0}function _fd_read(fd,iov,iovcnt,pnum){var stream=SYSCALLS.getStreamFromFD(fd);var num=SYSCALLS.doReadv(stream,iov,iovcnt);HEAP32[pnum>>2]=num;return 0}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){}function _fd_write(fd,iov,iovcnt,pnum){var num=0;for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j>2]=num;return 0}function _glActiveTexture(x0){GLctx["activeTexture"](x0)}function _glAttachShader(program,shader){GLctx.attachShader(GL.programs[program],GL.shaders[shader])}function _glBindBuffer(target,buffer){GLctx.bindBuffer(target,GL.buffers[buffer])}function _glBindFramebuffer(target,framebuffer){GLctx.bindFramebuffer(target,GL.framebuffers[framebuffer])}function _glBindTexture(target,texture){GLctx.bindTexture(target,GL.textures[texture])}function _glBlendEquation(x0){GLctx["blendEquation"](x0)}function _glBlendEquationSeparate(x0,x1){GLctx["blendEquationSeparate"](x0,x1)}function _glBlendFuncSeparate(x0,x1,x2,x3){GLctx["blendFuncSeparate"](x0,x1,x2,x3)}function _glBufferData(target,size,data,usage){GLctx.bufferData(target,data?HEAPU8.subarray(data,data+size):size,usage)}function _glBufferSubData(target,offset,size,data){GLctx.bufferSubData(target,offset,HEAPU8.subarray(data,data+size))}function _glClear(x0){GLctx["clear"](x0)}function _glClearColor(x0,x1,x2,x3){GLctx["clearColor"](x0,x1,x2,x3)}function _glCompileShader(shader){GLctx.compileShader(GL.shaders[shader])}function _glCopyTexSubImage2D(x0,x1,x2,x3,x4,x5,x6,x7){GLctx["copyTexSubImage2D"](x0,x1,x2,x3,x4,x5,x6,x7)}function _glCreateProgram(){var id=GL.getNewId(GL.programs);var program=GLctx.createProgram();program.name=id;GL.programs[id]=program;return id}function _glCreateShader(shaderType){var id=GL.getNewId(GL.shaders);GL.shaders[id]=GLctx.createShader(shaderType);return id}function _glCullFace(x0){GLctx["cullFace"](x0)}function _glDeleteBuffers(n,buffers){for(var i=0;i>2];var buffer=GL.buffers[id];if(!buffer)continue;GLctx.deleteBuffer(buffer);buffer.name=0;GL.buffers[id]=null;if(id==GL.currArrayBuffer)GL.currArrayBuffer=0;if(id==GL.currElementArrayBuffer)GL.currElementArrayBuffer=0}}function _glDeleteFramebuffers(n,framebuffers){for(var i=0;i>2];var framebuffer=GL.framebuffers[id];if(!framebuffer)continue;GLctx.deleteFramebuffer(framebuffer);framebuffer.name=0;GL.framebuffers[id]=null}}function _glDeleteProgram(id){if(!id)return;var program=GL.programs[id];if(!program){GL.recordError(1281);return}GLctx.deleteProgram(program);program.name=0;GL.programs[id]=null;GL.programInfos[id]=null}function _glDeleteShader(id){if(!id)return;var shader=GL.shaders[id];if(!shader){GL.recordError(1281);return}GLctx.deleteShader(shader);GL.shaders[id]=null}function _glDeleteTextures(n,textures){for(var i=0;i>2];var texture=GL.textures[id];if(!texture)continue;GLctx.deleteTexture(texture);texture.name=0;GL.textures[id]=null}}function _glDepthFunc(x0){GLctx["depthFunc"](x0)}function _glDepthMask(flag){GLctx.depthMask(!!flag)}function _glDisable(x0){GLctx["disable"](x0)}function _glDisableVertexAttribArray(index){GLctx.disableVertexAttribArray(index)}function _glDrawElements(mode,count,type,indices){GLctx.drawElements(mode,count,type,indices)}function _glEnable(x0){GLctx["enable"](x0)}function _glEnableVertexAttribArray(index){GLctx.enableVertexAttribArray(index)}function _glFramebufferTexture2D(target,attachment,textarget,texture,level){GLctx.framebufferTexture2D(target,attachment,textarget,GL.textures[texture],level)}function _glGenBuffers(n,buffers){__glGenObject(n,buffers,"createBuffer",GL.buffers)}function _glGenFramebuffers(n,ids){__glGenObject(n,ids,"createFramebuffer",GL.framebuffers)}function _glGenTextures(n,textures){__glGenObject(n,textures,"createTexture",GL.textures)}function _glGenerateMipmap(x0){GLctx["generateMipmap"](x0)}function _glGetAttribLocation(program,name){return GLctx.getAttribLocation(GL.programs[program],UTF8ToString(name))}function _glGetBooleanv(name_,p){emscriptenWebGLGet(name_,p,4)}function _glGetIntegerv(name_,p){emscriptenWebGLGet(name_,p,0)}function _glGetProgramiv(program,pname,p){if(!p){GL.recordError(1281);return}if(program>=GL.counter){GL.recordError(1281);return}var ptable=GL.programInfos[program];if(!ptable){GL.recordError(1282);return}if(pname==35716){var log=GLctx.getProgramInfoLog(GL.programs[program]);if(log===null)log="(unknown error)";HEAP32[p>>2]=log.length+1}else if(pname==35719){HEAP32[p>>2]=ptable.maxUniformLength}else if(pname==35722){if(ptable.maxAttributeLength==-1){program=GL.programs[program];var numAttribs=GLctx.getProgramParameter(program,35721);ptable.maxAttributeLength=0;for(var i=0;i>2]=ptable.maxAttributeLength}else if(pname==35381){if(ptable.maxUniformBlockNameLength==-1){program=GL.programs[program];var numBlocks=GLctx.getProgramParameter(program,35382);ptable.maxUniformBlockNameLength=0;for(var i=0;i>2]=ptable.maxUniformBlockNameLength}else{HEAP32[p>>2]=GLctx.getProgramParameter(GL.programs[program],pname)}}function _glGetShaderiv(shader,pname,p){if(!p){GL.recordError(1281);return}if(pname==35716){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";HEAP32[p>>2]=log.length+1}else if(pname==35720){var source=GLctx.getShaderSource(GL.shaders[shader]);var sourceLength=source===null||source.length==0?0:source.length+1;HEAP32[p>>2]=sourceLength}else{HEAP32[p>>2]=GLctx.getShaderParameter(GL.shaders[shader],pname)}}function _glGetString(name_){if(GL.stringCache[name_])return GL.stringCache[name_];var ret;switch(name_){case 7939:var exts=GLctx.getSupportedExtensions()||[];exts=exts.concat(exts.map(function(e){return"GL_"+e}));ret=stringToNewUTF8(exts.join(" "));break;case 7936:case 7937:case 37445:case 37446:var s=GLctx.getParameter(name_);if(!s){GL.recordError(1280)}ret=stringToNewUTF8(s);break;case 7938:var glVersion=GLctx.getParameter(7938);{glVersion="OpenGL ES 2.0 ("+glVersion+")"}ret=stringToNewUTF8(glVersion);break;case 35724:var glslVersion=GLctx.getParameter(35724);var ver_re=/^WebGL GLSL ES ([0-9]\.[0-9][0-9]?)(?:$| .*)/;var ver_num=glslVersion.match(ver_re);if(ver_num!==null){if(ver_num[1].length==3)ver_num[1]=ver_num[1]+"0";glslVersion="OpenGL ES GLSL ES "+ver_num[1]+" ("+glslVersion+")"}ret=stringToNewUTF8(glslVersion);break;default:GL.recordError(1280);return 0}GL.stringCache[name_]=ret;return ret}function _glGetUniformLocation(program,name){name=UTF8ToString(name);var arrayIndex=0;if(name[name.length-1]=="]"){var leftBrace=name.lastIndexOf("[");arrayIndex=name[leftBrace+1]!="]"?jstoi_q(name.slice(leftBrace+1)):0;name=name.slice(0,leftBrace)}var uniformInfo=GL.programInfos[program]&&GL.programInfos[program].uniforms[name];if(uniformInfo&&arrayIndex>=0&&arrayIndex>=2;for(var i=0;i<4*count;i+=4){var dst=value+i;view[i]=heap[dst];view[i+1]=heap[dst+1];view[i+2]=heap[dst+2];view[i+3]=heap[dst+3]}}else{var view=HEAPF32.subarray(value>>2,value+count*16>>2)}GLctx.uniform4fv(GL.uniforms[location],view)}function _glUniformMatrix4fv(location,count,transpose,value){if(16*count<=GL.MINI_TEMP_BUFFER_SIZE){var view=GL.miniTempBufferFloatViews[16*count-1];var heap=HEAPF32;value>>=2;for(var i=0;i<16*count;i+=16){var dst=value+i;view[i]=heap[dst];view[i+1]=heap[dst+1];view[i+2]=heap[dst+2];view[i+3]=heap[dst+3];view[i+4]=heap[dst+4];view[i+5]=heap[dst+5];view[i+6]=heap[dst+6];view[i+7]=heap[dst+7];view[i+8]=heap[dst+8];view[i+9]=heap[dst+9];view[i+10]=heap[dst+10];view[i+11]=heap[dst+11];view[i+12]=heap[dst+12];view[i+13]=heap[dst+13];view[i+14]=heap[dst+14];view[i+15]=heap[dst+15]}}else{var view=HEAPF32.subarray(value>>2,value+count*64>>2)}GLctx.uniformMatrix4fv(GL.uniforms[location],!!transpose,view)}function _glUseProgram(program){GLctx.useProgram(GL.programs[program])}function _glVertexAttribPointer(index,size,type,normalized,stride,ptr){GLctx.vertexAttribPointer(index,size,type,!!normalized,stride,ptr)}function _glViewport(x0,x1,x2,x3){GLctx["viewport"](x0,x1,x2,x3)}function _pthread_create(){return 6}function _pthread_join(){}function _pthread_mutexattr_destroy(){}function _pthread_mutexattr_init(){}function _pthread_mutexattr_settype(){}function _roundf(d){d=+d;return d>=+0?+Math_floor(d+ +.5):+Math_ceil(d-+.5)}function _setTempRet0($i){setTempRet0($i|0)}function __isLeapYear(year){return year%4===0&&(year%100!==0||year%400===0)}function __arraySum(array,index){var sum=0;for(var i=0;i<=index;sum+=array[i++]){}return sum}var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];var __MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function __addDays(date,days){var newDate=new Date(date.getTime());while(days>0){var leap=__isLeapYear(newDate.getFullYear());var currentMonth=newDate.getMonth();var daysInCurrentMonth=(leap?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR)[currentMonth];if(days>daysInCurrentMonth-newDate.getDate()){days-=daysInCurrentMonth-newDate.getDate()+1;newDate.setDate(1);if(currentMonth<11){newDate.setMonth(currentMonth+1)}else{newDate.setMonth(0);newDate.setFullYear(newDate.getFullYear()+1)}}else{newDate.setDate(newDate.getDate()+days);return newDate}}return newDate}function _strftime(s,maxsize,format,tm){var tm_zone=HEAP32[tm+40>>2];var date={tm_sec:HEAP32[tm>>2],tm_min:HEAP32[tm+4>>2],tm_hour:HEAP32[tm+8>>2],tm_mday:HEAP32[tm+12>>2],tm_mon:HEAP32[tm+16>>2],tm_year:HEAP32[tm+20>>2],tm_wday:HEAP32[tm+24>>2],tm_yday:HEAP32[tm+28>>2],tm_isdst:HEAP32[tm+32>>2],tm_gmtoff:HEAP32[tm+36>>2],tm_zone:tm_zone?UTF8ToString(tm_zone):""};var pattern=UTF8ToString(format);var EXPANSION_RULES_1={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var rule in EXPANSION_RULES_1){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_1[rule])}var WEEKDAYS=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var MONTHS=["January","February","March","April","May","June","July","August","September","October","November","December"];function leadingSomething(value,digits,character){var str=typeof value==="number"?value.toString():value||"";while(str.length0?1:0}var compare;if((compare=sgn(date1.getFullYear()-date2.getFullYear()))===0){if((compare=sgn(date1.getMonth()-date2.getMonth()))===0){compare=sgn(date1.getDate()-date2.getDate())}}return compare}function getFirstWeekStartDate(janFourth){switch(janFourth.getDay()){case 0:return new Date(janFourth.getFullYear()-1,11,29);case 1:return janFourth;case 2:return new Date(janFourth.getFullYear(),0,3);case 3:return new Date(janFourth.getFullYear(),0,2);case 4:return new Date(janFourth.getFullYear(),0,1);case 5:return new Date(janFourth.getFullYear()-1,11,31);case 6:return new Date(janFourth.getFullYear()-1,11,30)}}function getWeekBasedYear(date){var thisDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);var janFourthThisYear=new Date(thisDate.getFullYear(),0,4);var janFourthNextYear=new Date(thisDate.getFullYear()+1,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);if(compareByDay(firstWeekStartThisYear,thisDate)<=0){if(compareByDay(firstWeekStartNextYear,thisDate)<=0){return thisDate.getFullYear()+1}else{return thisDate.getFullYear()}}else{return thisDate.getFullYear()-1}}var EXPANSION_RULES_2={"%a":function(date){return WEEKDAYS[date.tm_wday].substring(0,3)},"%A":function(date){return WEEKDAYS[date.tm_wday]},"%b":function(date){return MONTHS[date.tm_mon].substring(0,3)},"%B":function(date){return MONTHS[date.tm_mon]},"%C":function(date){var year=date.tm_year+1900;return leadingNulls(year/100|0,2)},"%d":function(date){return leadingNulls(date.tm_mday,2)},"%e":function(date){return leadingSomething(date.tm_mday,2," ")},"%g":function(date){return getWeekBasedYear(date).toString().substring(2)},"%G":function(date){return getWeekBasedYear(date)},"%H":function(date){return leadingNulls(date.tm_hour,2)},"%I":function(date){var twelveHour=date.tm_hour;if(twelveHour==0)twelveHour=12;else if(twelveHour>12)twelveHour-=12;return leadingNulls(twelveHour,2)},"%j":function(date){return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900)?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,date.tm_mon-1),3)},"%m":function(date){return leadingNulls(date.tm_mon+1,2)},"%M":function(date){return leadingNulls(date.tm_min,2)},"%n":function(){return"\n"},"%p":function(date){if(date.tm_hour>=0&&date.tm_hour<12){return"AM"}else{return"PM"}},"%S":function(date){return leadingNulls(date.tm_sec,2)},"%t":function(){return"\t"},"%u":function(date){return date.tm_wday||7},"%U":function(date){var janFirst=new Date(date.tm_year+1900,0,1);var firstSunday=janFirst.getDay()===0?janFirst:__addDays(janFirst,7-janFirst.getDay());var endDate=new Date(date.tm_year+1900,date.tm_mon,date.tm_mday);if(compareByDay(firstSunday,endDate)<0){var februaryFirstUntilEndMonth=__arraySum(__isLeapYear(endDate.getFullYear())?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,endDate.getMonth()-1)-31;var firstSundayUntilEndJanuary=31-firstSunday.getDate();var days=firstSundayUntilEndJanuary+februaryFirstUntilEndMonth+endDate.getDate();return leadingNulls(Math.ceil(days/7),2)}return compareByDay(firstSunday,janFirst)===0?"01":"00"},"%V":function(date){var janFourthThisYear=new Date(date.tm_year+1900,0,4);var janFourthNextYear=new Date(date.tm_year+1901,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);var endDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);if(compareByDay(endDate,firstWeekStartThisYear)<0){return"53"}if(compareByDay(firstWeekStartNextYear,endDate)<=0){return"01"}var daysDifference;if(firstWeekStartThisYear.getFullYear()=0;off=Math.abs(off)/60;off=off/60*100+off%60;return(ahead?"+":"-")+String("0000"+off).slice(-4)},"%Z":function(date){return date.tm_zone},"%%":function(){return"%"}};for(var rule in EXPANSION_RULES_2){if(pattern.indexOf(rule)>=0){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_2[rule](date))}}var bytes=intArrayFromString(pattern,false);if(bytes.length>maxsize){return 0}writeArrayToMemory(bytes,s);return bytes.length-1}function _strftime_l(s,maxsize,format,tm){return _strftime(s,maxsize,format,tm)}function readAsmConstArgs(sigPtr,buf){if(!readAsmConstArgs.array){readAsmConstArgs.array=[]}var args=readAsmConstArgs.array;args.length=0;var ch;while(ch=HEAPU8[sigPtr++]){if(ch===100||ch===102){buf=buf+7&~7;args.push(HEAPF64[buf>>3]);buf+=8}else{buf=buf+3&~3;args.push(HEAP32[buf>>2]);buf+=4}}return args}Module["requestFullscreen"]=function Module_requestFullscreen(lockPointer,resizeCanvas){Browser.requestFullscreen(lockPointer,resizeCanvas)};Module["requestAnimationFrame"]=function Module_requestAnimationFrame(func){Browser.requestAnimationFrame(func)};Module["setCanvasSize"]=function Module_setCanvasSize(width,height,noUpdates){Browser.setCanvasSize(width,height,noUpdates)};Module["pauseMainLoop"]=function Module_pauseMainLoop(){Browser.mainLoop.pause()};Module["resumeMainLoop"]=function Module_resumeMainLoop(){Browser.mainLoop.resume()};Module["getUserMedia"]=function Module_getUserMedia(){Browser.getUserMedia()};Module["createContext"]=function Module_createContext(canvas,useWebGL,setInModule,webGLContextAttributes){return Browser.createContext(canvas,useWebGL,setInModule,webGLContextAttributes)};var GLctx;GL.init();for(var i=0;i<32;i++)__tempFixedLengthArray.push(new Array(i));var ASSERTIONS=false;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var asmLibraryArg={"__cxa_allocate_exception":___cxa_allocate_exception,"__cxa_atexit":___cxa_atexit,"__cxa_throw":___cxa_throw,"__map_file":___map_file,"__sys_fcntl64":___sys_fcntl64,"__sys_ioctl":___sys_ioctl,"__sys_munmap":___sys_munmap,"__sys_open":___sys_open,"abort":_abort,"alBufferData":_alBufferData,"alDeleteBuffers":_alDeleteBuffers,"alDeleteSources":_alDeleteSources,"alGenBuffers":_alGenBuffers,"alGenSources":_alGenSources,"alGetSourcei":_alGetSourcei,"alListenerfv":_alListenerfv,"alSourcePause":_alSourcePause,"alSourcePlay":_alSourcePlay,"alSourceStop":_alSourceStop,"alSourcef":_alSourcef,"alSourcefv":_alSourcefv,"alSourcei":_alSourcei,"alcCreateContext":_alcCreateContext,"alcMakeContextCurrent":_alcMakeContextCurrent,"alcOpenDevice":_alcOpenDevice,"clock_gettime":_clock_gettime,"eglGetProcAddress":_eglGetProcAddress,"emscripten_asm_const_iii":_emscripten_asm_const_iii,"emscripten_get_sbrk_ptr":_emscripten_get_sbrk_ptr,"emscripten_glActiveTexture":_emscripten_glActiveTexture,"emscripten_glAttachShader":_emscripten_glAttachShader,"emscripten_glBeginQueryEXT":_emscripten_glBeginQueryEXT,"emscripten_glBindAttribLocation":_emscripten_glBindAttribLocation,"emscripten_glBindBuffer":_emscripten_glBindBuffer,"emscripten_glBindFramebuffer":_emscripten_glBindFramebuffer,"emscripten_glBindRenderbuffer":_emscripten_glBindRenderbuffer,"emscripten_glBindTexture":_emscripten_glBindTexture,"emscripten_glBindVertexArrayOES":_emscripten_glBindVertexArrayOES,"emscripten_glBlendColor":_emscripten_glBlendColor,"emscripten_glBlendEquation":_emscripten_glBlendEquation,"emscripten_glBlendEquationSeparate":_emscripten_glBlendEquationSeparate,"emscripten_glBlendFunc":_emscripten_glBlendFunc,"emscripten_glBlendFuncSeparate":_emscripten_glBlendFuncSeparate,"emscripten_glBufferData":_emscripten_glBufferData,"emscripten_glBufferSubData":_emscripten_glBufferSubData,"emscripten_glCheckFramebufferStatus":_emscripten_glCheckFramebufferStatus,"emscripten_glClear":_emscripten_glClear,"emscripten_glClearColor":_emscripten_glClearColor,"emscripten_glClearDepthf":_emscripten_glClearDepthf,"emscripten_glClearStencil":_emscripten_glClearStencil,"emscripten_glColorMask":_emscripten_glColorMask,"emscripten_glCompileShader":_emscripten_glCompileShader,"emscripten_glCompressedTexImage2D":_emscripten_glCompressedTexImage2D,"emscripten_glCompressedTexSubImage2D":_emscripten_glCompressedTexSubImage2D,"emscripten_glCopyTexImage2D":_emscripten_glCopyTexImage2D,"emscripten_glCopyTexSubImage2D":_emscripten_glCopyTexSubImage2D,"emscripten_glCreateProgram":_emscripten_glCreateProgram,"emscripten_glCreateShader":_emscripten_glCreateShader,"emscripten_glCullFace":_emscripten_glCullFace,"emscripten_glDeleteBuffers":_emscripten_glDeleteBuffers,"emscripten_glDeleteFramebuffers":_emscripten_glDeleteFramebuffers,"emscripten_glDeleteProgram":_emscripten_glDeleteProgram,"emscripten_glDeleteQueriesEXT":_emscripten_glDeleteQueriesEXT,"emscripten_glDeleteRenderbuffers":_emscripten_glDeleteRenderbuffers,"emscripten_glDeleteShader":_emscripten_glDeleteShader,"emscripten_glDeleteTextures":_emscripten_glDeleteTextures,"emscripten_glDeleteVertexArraysOES":_emscripten_glDeleteVertexArraysOES,"emscripten_glDepthFunc":_emscripten_glDepthFunc,"emscripten_glDepthMask":_emscripten_glDepthMask,"emscripten_glDepthRangef":_emscripten_glDepthRangef,"emscripten_glDetachShader":_emscripten_glDetachShader,"emscripten_glDisable":_emscripten_glDisable,"emscripten_glDisableVertexAttribArray":_emscripten_glDisableVertexAttribArray,"emscripten_glDrawArrays":_emscripten_glDrawArrays,"emscripten_glDrawArraysInstancedANGLE":_emscripten_glDrawArraysInstancedANGLE,"emscripten_glDrawBuffersWEBGL":_emscripten_glDrawBuffersWEBGL,"emscripten_glDrawElements":_emscripten_glDrawElements,"emscripten_glDrawElementsInstancedANGLE":_emscripten_glDrawElementsInstancedANGLE,"emscripten_glEnable":_emscripten_glEnable,"emscripten_glEnableVertexAttribArray":_emscripten_glEnableVertexAttribArray,"emscripten_glEndQueryEXT":_emscripten_glEndQueryEXT,"emscripten_glFinish":_emscripten_glFinish,"emscripten_glFlush":_emscripten_glFlush,"emscripten_glFramebufferRenderbuffer":_emscripten_glFramebufferRenderbuffer,"emscripten_glFramebufferTexture2D":_emscripten_glFramebufferTexture2D,"emscripten_glFrontFace":_emscripten_glFrontFace,"emscripten_glGenBuffers":_emscripten_glGenBuffers,"emscripten_glGenFramebuffers":_emscripten_glGenFramebuffers,"emscripten_glGenQueriesEXT":_emscripten_glGenQueriesEXT,"emscripten_glGenRenderbuffers":_emscripten_glGenRenderbuffers,"emscripten_glGenTextures":_emscripten_glGenTextures,"emscripten_glGenVertexArraysOES":_emscripten_glGenVertexArraysOES,"emscripten_glGenerateMipmap":_emscripten_glGenerateMipmap,"emscripten_glGetActiveAttrib":_emscripten_glGetActiveAttrib,"emscripten_glGetActiveUniform":_emscripten_glGetActiveUniform,"emscripten_glGetAttachedShaders":_emscripten_glGetAttachedShaders,"emscripten_glGetAttribLocation":_emscripten_glGetAttribLocation,"emscripten_glGetBooleanv":_emscripten_glGetBooleanv,"emscripten_glGetBufferParameteriv":_emscripten_glGetBufferParameteriv,"emscripten_glGetError":_emscripten_glGetError,"emscripten_glGetFloatv":_emscripten_glGetFloatv,"emscripten_glGetFramebufferAttachmentParameteriv":_emscripten_glGetFramebufferAttachmentParameteriv,"emscripten_glGetIntegerv":_emscripten_glGetIntegerv,"emscripten_glGetProgramInfoLog":_emscripten_glGetProgramInfoLog,"emscripten_glGetProgramiv":_emscripten_glGetProgramiv,"emscripten_glGetQueryObjecti64vEXT":_emscripten_glGetQueryObjecti64vEXT,"emscripten_glGetQueryObjectivEXT":_emscripten_glGetQueryObjectivEXT,"emscripten_glGetQueryObjectui64vEXT":_emscripten_glGetQueryObjectui64vEXT,"emscripten_glGetQueryObjectuivEXT":_emscripten_glGetQueryObjectuivEXT,"emscripten_glGetQueryivEXT":_emscripten_glGetQueryivEXT,"emscripten_glGetRenderbufferParameteriv":_emscripten_glGetRenderbufferParameteriv,"emscripten_glGetShaderInfoLog":_emscripten_glGetShaderInfoLog,"emscripten_glGetShaderPrecisionFormat":_emscripten_glGetShaderPrecisionFormat,"emscripten_glGetShaderSource":_emscripten_glGetShaderSource,"emscripten_glGetShaderiv":_emscripten_glGetShaderiv,"emscripten_glGetString":_emscripten_glGetString,"emscripten_glGetTexParameterfv":_emscripten_glGetTexParameterfv,"emscripten_glGetTexParameteriv":_emscripten_glGetTexParameteriv,"emscripten_glGetUniformLocation":_emscripten_glGetUniformLocation,"emscripten_glGetUniformfv":_emscripten_glGetUniformfv,"emscripten_glGetUniformiv":_emscripten_glGetUniformiv,"emscripten_glGetVertexAttribPointerv":_emscripten_glGetVertexAttribPointerv,"emscripten_glGetVertexAttribfv":_emscripten_glGetVertexAttribfv,"emscripten_glGetVertexAttribiv":_emscripten_glGetVertexAttribiv,"emscripten_glHint":_emscripten_glHint,"emscripten_glIsBuffer":_emscripten_glIsBuffer,"emscripten_glIsEnabled":_emscripten_glIsEnabled,"emscripten_glIsFramebuffer":_emscripten_glIsFramebuffer,"emscripten_glIsProgram":_emscripten_glIsProgram,"emscripten_glIsQueryEXT":_emscripten_glIsQueryEXT,"emscripten_glIsRenderbuffer":_emscripten_glIsRenderbuffer,"emscripten_glIsShader":_emscripten_glIsShader,"emscripten_glIsTexture":_emscripten_glIsTexture,"emscripten_glIsVertexArrayOES":_emscripten_glIsVertexArrayOES,"emscripten_glLineWidth":_emscripten_glLineWidth,"emscripten_glLinkProgram":_emscripten_glLinkProgram,"emscripten_glPixelStorei":_emscripten_glPixelStorei,"emscripten_glPolygonOffset":_emscripten_glPolygonOffset,"emscripten_glQueryCounterEXT":_emscripten_glQueryCounterEXT,"emscripten_glReadPixels":_emscripten_glReadPixels,"emscripten_glReleaseShaderCompiler":_emscripten_glReleaseShaderCompiler,"emscripten_glRenderbufferStorage":_emscripten_glRenderbufferStorage,"emscripten_glSampleCoverage":_emscripten_glSampleCoverage,"emscripten_glScissor":_emscripten_glScissor,"emscripten_glShaderBinary":_emscripten_glShaderBinary,"emscripten_glShaderSource":_emscripten_glShaderSource,"emscripten_glStencilFunc":_emscripten_glStencilFunc,"emscripten_glStencilFuncSeparate":_emscripten_glStencilFuncSeparate,"emscripten_glStencilMask":_emscripten_glStencilMask,"emscripten_glStencilMaskSeparate":_emscripten_glStencilMaskSeparate,"emscripten_glStencilOp":_emscripten_glStencilOp,"emscripten_glStencilOpSeparate":_emscripten_glStencilOpSeparate,"emscripten_glTexImage2D":_emscripten_glTexImage2D,"emscripten_glTexParameterf":_emscripten_glTexParameterf,"emscripten_glTexParameterfv":_emscripten_glTexParameterfv,"emscripten_glTexParameteri":_emscripten_glTexParameteri,"emscripten_glTexParameteriv":_emscripten_glTexParameteriv,"emscripten_glTexSubImage2D":_emscripten_glTexSubImage2D,"emscripten_glUniform1f":_emscripten_glUniform1f,"emscripten_glUniform1fv":_emscripten_glUniform1fv,"emscripten_glUniform1i":_emscripten_glUniform1i,"emscripten_glUniform1iv":_emscripten_glUniform1iv,"emscripten_glUniform2f":_emscripten_glUniform2f,"emscripten_glUniform2fv":_emscripten_glUniform2fv,"emscripten_glUniform2i":_emscripten_glUniform2i,"emscripten_glUniform2iv":_emscripten_glUniform2iv,"emscripten_glUniform3f":_emscripten_glUniform3f,"emscripten_glUniform3fv":_emscripten_glUniform3fv,"emscripten_glUniform3i":_emscripten_glUniform3i,"emscripten_glUniform3iv":_emscripten_glUniform3iv,"emscripten_glUniform4f":_emscripten_glUniform4f,"emscripten_glUniform4fv":_emscripten_glUniform4fv,"emscripten_glUniform4i":_emscripten_glUniform4i,"emscripten_glUniform4iv":_emscripten_glUniform4iv,"emscripten_glUniformMatrix2fv":_emscripten_glUniformMatrix2fv,"emscripten_glUniformMatrix3fv":_emscripten_glUniformMatrix3fv,"emscripten_glUniformMatrix4fv":_emscripten_glUniformMatrix4fv,"emscripten_glUseProgram":_emscripten_glUseProgram,"emscripten_glValidateProgram":_emscripten_glValidateProgram,"emscripten_glVertexAttrib1f":_emscripten_glVertexAttrib1f,"emscripten_glVertexAttrib1fv":_emscripten_glVertexAttrib1fv,"emscripten_glVertexAttrib2f":_emscripten_glVertexAttrib2f,"emscripten_glVertexAttrib2fv":_emscripten_glVertexAttrib2fv,"emscripten_glVertexAttrib3f":_emscripten_glVertexAttrib3f,"emscripten_glVertexAttrib3fv":_emscripten_glVertexAttrib3fv,"emscripten_glVertexAttrib4f":_emscripten_glVertexAttrib4f,"emscripten_glVertexAttrib4fv":_emscripten_glVertexAttrib4fv,"emscripten_glVertexAttribDivisorANGLE":_emscripten_glVertexAttribDivisorANGLE,"emscripten_glVertexAttribPointer":_emscripten_glVertexAttribPointer,"emscripten_glViewport":_emscripten_glViewport,"emscripten_memcpy_big":_emscripten_memcpy_big,"emscripten_resize_heap":_emscripten_resize_heap,"environ_get":_environ_get,"environ_sizes_get":_environ_sizes_get,"fd_close":_fd_close,"fd_read":_fd_read,"fd_seek":_fd_seek,"fd_write":_fd_write,"glActiveTexture":_glActiveTexture,"glAttachShader":_glAttachShader,"glBindBuffer":_glBindBuffer,"glBindFramebuffer":_glBindFramebuffer,"glBindTexture":_glBindTexture,"glBlendEquation":_glBlendEquation,"glBlendEquationSeparate":_glBlendEquationSeparate,"glBlendFuncSeparate":_glBlendFuncSeparate,"glBufferData":_glBufferData,"glBufferSubData":_glBufferSubData,"glClear":_glClear,"glClearColor":_glClearColor,"glCompileShader":_glCompileShader,"glCopyTexSubImage2D":_glCopyTexSubImage2D,"glCreateProgram":_glCreateProgram,"glCreateShader":_glCreateShader,"glCullFace":_glCullFace,"glDeleteBuffers":_glDeleteBuffers,"glDeleteFramebuffers":_glDeleteFramebuffers,"glDeleteProgram":_glDeleteProgram,"glDeleteShader":_glDeleteShader,"glDeleteTextures":_glDeleteTextures,"glDepthFunc":_glDepthFunc,"glDepthMask":_glDepthMask,"glDisable":_glDisable,"glDisableVertexAttribArray":_glDisableVertexAttribArray,"glDrawElements":_glDrawElements,"glEnable":_glEnable,"glEnableVertexAttribArray":_glEnableVertexAttribArray,"glFramebufferTexture2D":_glFramebufferTexture2D,"glGenBuffers":_glGenBuffers,"glGenFramebuffers":_glGenFramebuffers,"glGenTextures":_glGenTextures,"glGenerateMipmap":_glGenerateMipmap,"glGetAttribLocation":_glGetAttribLocation,"glGetBooleanv":_glGetBooleanv,"glGetIntegerv":_glGetIntegerv,"glGetProgramiv":_glGetProgramiv,"glGetShaderiv":_glGetShaderiv,"glGetString":_glGetString,"glGetUniformLocation":_glGetUniformLocation,"glIsEnabled":_glIsEnabled,"glLinkProgram":_glLinkProgram,"glShaderSource":_glShaderSource,"glTexImage2D":_glTexImage2D,"glTexParameteri":_glTexParameteri,"glUniform1i":_glUniform1i,"glUniform4fv":_glUniform4fv,"glUniformMatrix4fv":_glUniformMatrix4fv,"glUseProgram":_glUseProgram,"glVertexAttribPointer":_glVertexAttribPointer,"glViewport":_glViewport,"memory":wasmMemory,"pthread_create":_pthread_create,"pthread_join":_pthread_join,"pthread_mutexattr_destroy":_pthread_mutexattr_destroy,"pthread_mutexattr_init":_pthread_mutexattr_init,"pthread_mutexattr_settype":_pthread_mutexattr_settype,"roundf":_roundf,"setTempRet0":_setTempRet0,"strftime_l":_strftime_l,"table":wasmTable};var asm=createWasm();Module["asm"]=asm;var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["__wasm_call_ctors"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["free"]).apply(null,arguments)};var _strstr=Module["_strstr"]=function(){return(_strstr=Module["_strstr"]=Module["asm"]["strstr"]).apply(null,arguments)};var _EffekseerInit=Module["_EffekseerInit"]=function(){return(_EffekseerInit=Module["_EffekseerInit"]=Module["asm"]["EffekseerInit"]).apply(null,arguments)};var _EffekseerTerminate=Module["_EffekseerTerminate"]=function(){return(_EffekseerTerminate=Module["_EffekseerTerminate"]=Module["asm"]["EffekseerTerminate"]).apply(null,arguments)};var _EffekseerUpdate=Module["_EffekseerUpdate"]=function(){return(_EffekseerUpdate=Module["_EffekseerUpdate"]=Module["asm"]["EffekseerUpdate"]).apply(null,arguments)};var _EffekseerBeginUpdate=Module["_EffekseerBeginUpdate"]=function(){return(_EffekseerBeginUpdate=Module["_EffekseerBeginUpdate"]=Module["asm"]["EffekseerBeginUpdate"]).apply(null,arguments)};var _EffekseerEndUpdate=Module["_EffekseerEndUpdate"]=function(){return(_EffekseerEndUpdate=Module["_EffekseerEndUpdate"]=Module["asm"]["EffekseerEndUpdate"]).apply(null,arguments)};var _EffekseerUpdateHandle=Module["_EffekseerUpdateHandle"]=function(){return(_EffekseerUpdateHandle=Module["_EffekseerUpdateHandle"]=Module["asm"]["EffekseerUpdateHandle"]).apply(null,arguments)};var _EffekseerDraw=Module["_EffekseerDraw"]=function(){return(_EffekseerDraw=Module["_EffekseerDraw"]=Module["asm"]["EffekseerDraw"]).apply(null,arguments)};var _EffekseerBeginDraw=Module["_EffekseerBeginDraw"]=function(){return(_EffekseerBeginDraw=Module["_EffekseerBeginDraw"]=Module["asm"]["EffekseerBeginDraw"]).apply(null,arguments)};var _EffekseerEndDraw=Module["_EffekseerEndDraw"]=function(){return(_EffekseerEndDraw=Module["_EffekseerEndDraw"]=Module["asm"]["EffekseerEndDraw"]).apply(null,arguments)};var _EffekseerDrawHandle=Module["_EffekseerDrawHandle"]=function(){return(_EffekseerDrawHandle=Module["_EffekseerDrawHandle"]=Module["asm"]["EffekseerDrawHandle"]).apply(null,arguments)};var _EffekseerSetProjectionMatrix=Module["_EffekseerSetProjectionMatrix"]=function(){return(_EffekseerSetProjectionMatrix=Module["_EffekseerSetProjectionMatrix"]=Module["asm"]["EffekseerSetProjectionMatrix"]).apply(null,arguments)};var _EffekseerSetProjectionPerspective=Module["_EffekseerSetProjectionPerspective"]=function(){return(_EffekseerSetProjectionPerspective=Module["_EffekseerSetProjectionPerspective"]=Module["asm"]["EffekseerSetProjectionPerspective"]).apply(null,arguments)};var _EffekseerSetProjectionOrthographic=Module["_EffekseerSetProjectionOrthographic"]=function(){return(_EffekseerSetProjectionOrthographic=Module["_EffekseerSetProjectionOrthographic"]=Module["asm"]["EffekseerSetProjectionOrthographic"]).apply(null,arguments)};var _EffekseerSetCameraMatrix=Module["_EffekseerSetCameraMatrix"]=function(){return(_EffekseerSetCameraMatrix=Module["_EffekseerSetCameraMatrix"]=Module["asm"]["EffekseerSetCameraMatrix"]).apply(null,arguments)};var _EffekseerSetCameraLookAt=Module["_EffekseerSetCameraLookAt"]=function(){return(_EffekseerSetCameraLookAt=Module["_EffekseerSetCameraLookAt"]=Module["asm"]["EffekseerSetCameraLookAt"]).apply(null,arguments)};var _EffekseerLoadEffect=Module["_EffekseerLoadEffect"]=function(){return(_EffekseerLoadEffect=Module["_EffekseerLoadEffect"]=Module["asm"]["EffekseerLoadEffect"]).apply(null,arguments)};var _EffekseerReleaseEffect=Module["_EffekseerReleaseEffect"]=function(){return(_EffekseerReleaseEffect=Module["_EffekseerReleaseEffect"]=Module["asm"]["EffekseerReleaseEffect"]).apply(null,arguments)};var _EffekseerReloadResources=Module["_EffekseerReloadResources"]=function(){return(_EffekseerReloadResources=Module["_EffekseerReloadResources"]=Module["asm"]["EffekseerReloadResources"]).apply(null,arguments)};var _EffekseerStopAllEffects=Module["_EffekseerStopAllEffects"]=function(){return(_EffekseerStopAllEffects=Module["_EffekseerStopAllEffects"]=Module["asm"]["EffekseerStopAllEffects"]).apply(null,arguments)};var _EffekseerPlayEffect=Module["_EffekseerPlayEffect"]=function(){return(_EffekseerPlayEffect=Module["_EffekseerPlayEffect"]=Module["asm"]["EffekseerPlayEffect"]).apply(null,arguments)};var _EffekseerStopEffect=Module["_EffekseerStopEffect"]=function(){return(_EffekseerStopEffect=Module["_EffekseerStopEffect"]=Module["asm"]["EffekseerStopEffect"]).apply(null,arguments)};var _EffekseerStopRoot=Module["_EffekseerStopRoot"]=function(){return(_EffekseerStopRoot=Module["_EffekseerStopRoot"]=Module["asm"]["EffekseerStopRoot"]).apply(null,arguments)};var _EffekseerExists=Module["_EffekseerExists"]=function(){return(_EffekseerExists=Module["_EffekseerExists"]=Module["asm"]["EffekseerExists"]).apply(null,arguments)};var _EffekseerSetFrame=Module["_EffekseerSetFrame"]=function(){return(_EffekseerSetFrame=Module["_EffekseerSetFrame"]=Module["asm"]["EffekseerSetFrame"]).apply(null,arguments)};var _EffekseerSetLocation=Module["_EffekseerSetLocation"]=function(){return(_EffekseerSetLocation=Module["_EffekseerSetLocation"]=Module["asm"]["EffekseerSetLocation"]).apply(null,arguments)};var _EffekseerSetRotation=Module["_EffekseerSetRotation"]=function(){return(_EffekseerSetRotation=Module["_EffekseerSetRotation"]=Module["asm"]["EffekseerSetRotation"]).apply(null,arguments)};var _EffekseerSetScale=Module["_EffekseerSetScale"]=function(){return(_EffekseerSetScale=Module["_EffekseerSetScale"]=Module["asm"]["EffekseerSetScale"]).apply(null,arguments)};var _EffekseerSetMatrix=Module["_EffekseerSetMatrix"]=function(){return(_EffekseerSetMatrix=Module["_EffekseerSetMatrix"]=Module["asm"]["EffekseerSetMatrix"]).apply(null,arguments)};var _EffekseerGetDynamicInput=Module["_EffekseerGetDynamicInput"]=function(){return(_EffekseerGetDynamicInput=Module["_EffekseerGetDynamicInput"]=Module["asm"]["EffekseerGetDynamicInput"]).apply(null,arguments)};var _EffekseerSetDynamicInput=Module["_EffekseerSetDynamicInput"]=function(){return(_EffekseerSetDynamicInput=Module["_EffekseerSetDynamicInput"]=Module["asm"]["EffekseerSetDynamicInput"]).apply(null,arguments)};var _EffekseerSendTrigger=Module["_EffekseerSendTrigger"]=function(){return(_EffekseerSendTrigger=Module["_EffekseerSendTrigger"]=Module["asm"]["EffekseerSendTrigger"]).apply(null,arguments)};var _EffekseerSetAllColor=Module["_EffekseerSetAllColor"]=function(){return(_EffekseerSetAllColor=Module["_EffekseerSetAllColor"]=Module["asm"]["EffekseerSetAllColor"]).apply(null,arguments)};var _EffekseerSetTargetLocation=Module["_EffekseerSetTargetLocation"]=function(){return(_EffekseerSetTargetLocation=Module["_EffekseerSetTargetLocation"]=Module["asm"]["EffekseerSetTargetLocation"]).apply(null,arguments)};var _EffekseerSetPaused=Module["_EffekseerSetPaused"]=function(){return(_EffekseerSetPaused=Module["_EffekseerSetPaused"]=Module["asm"]["EffekseerSetPaused"]).apply(null,arguments)};var _EffekseerSetShown=Module["_EffekseerSetShown"]=function(){return(_EffekseerSetShown=Module["_EffekseerSetShown"]=Module["asm"]["EffekseerSetShown"]).apply(null,arguments)};var _EffekseerSetSpeed=Module["_EffekseerSetSpeed"]=function(){return(_EffekseerSetSpeed=Module["_EffekseerSetSpeed"]=Module["asm"]["EffekseerSetSpeed"]).apply(null,arguments)};var _EffekseerSetRandomSeed=Module["_EffekseerSetRandomSeed"]=function(){return(_EffekseerSetRandomSeed=Module["_EffekseerSetRandomSeed"]=Module["asm"]["EffekseerSetRandomSeed"]).apply(null,arguments)};var _EffekseerGetRestInstancesCount=Module["_EffekseerGetRestInstancesCount"]=function(){return(_EffekseerGetRestInstancesCount=Module["_EffekseerGetRestInstancesCount"]=Module["asm"]["EffekseerGetRestInstancesCount"]).apply(null,arguments)};var _EffekseerGetUpdateTime=Module["_EffekseerGetUpdateTime"]=function(){return(_EffekseerGetUpdateTime=Module["_EffekseerGetUpdateTime"]=Module["asm"]["EffekseerGetUpdateTime"]).apply(null,arguments)};var _EffekseerGetDrawTime=Module["_EffekseerGetDrawTime"]=function(){return(_EffekseerGetDrawTime=Module["_EffekseerGetDrawTime"]=Module["asm"]["EffekseerGetDrawTime"]).apply(null,arguments)};var _EffekseerIsVertexArrayObjectSupported=Module["_EffekseerIsVertexArrayObjectSupported"]=function(){return(_EffekseerIsVertexArrayObjectSupported=Module["_EffekseerIsVertexArrayObjectSupported"]=Module["asm"]["EffekseerIsVertexArrayObjectSupported"]).apply(null,arguments)};var _EffekseerSetRestorationOfStatesFlag=Module["_EffekseerSetRestorationOfStatesFlag"]=function(){return(_EffekseerSetRestorationOfStatesFlag=Module["_EffekseerSetRestorationOfStatesFlag"]=Module["asm"]["EffekseerSetRestorationOfStatesFlag"]).apply(null,arguments)};var _EffekseerCaptureBackground=Module["_EffekseerCaptureBackground"]=function(){return(_EffekseerCaptureBackground=Module["_EffekseerCaptureBackground"]=Module["asm"]["EffekseerCaptureBackground"]).apply(null,arguments)};var _EffekseerResetBackground=Module["_EffekseerResetBackground"]=function(){return(_EffekseerResetBackground=Module["_EffekseerResetBackground"]=Module["asm"]["EffekseerResetBackground"]).apply(null,arguments)};var _EffekseerSetLogEnabled=Module["_EffekseerSetLogEnabled"]=function(){return(_EffekseerSetLogEnabled=Module["_EffekseerSetLogEnabled"]=Module["asm"]["EffekseerSetLogEnabled"]).apply(null,arguments)};var ___errno_location=Module["___errno_location"]=function(){return(___errno_location=Module["___errno_location"]=Module["asm"]["__errno_location"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["malloc"]).apply(null,arguments)};var _setThrew=Module["_setThrew"]=function(){return(_setThrew=Module["_setThrew"]=Module["asm"]["setThrew"]).apply(null,arguments)};var _emscripten_GetProcAddress=Module["_emscripten_GetProcAddress"]=function(){return(_emscripten_GetProcAddress=Module["_emscripten_GetProcAddress"]=Module["asm"]["emscripten_GetProcAddress"]).apply(null,arguments)};var _emscripten_main_thread_process_queued_calls=Module["_emscripten_main_thread_process_queued_calls"]=function(){return(_emscripten_main_thread_process_queued_calls=Module["_emscripten_main_thread_process_queued_calls"]=Module["asm"]["emscripten_main_thread_process_queued_calls"]).apply(null,arguments)};var stackSave=Module["stackSave"]=function(){return(stackSave=Module["stackSave"]=Module["asm"]["stackSave"]).apply(null,arguments)};var stackAlloc=Module["stackAlloc"]=function(){return(stackAlloc=Module["stackAlloc"]=Module["asm"]["stackAlloc"]).apply(null,arguments)};var stackRestore=Module["stackRestore"]=function(){return(stackRestore=Module["stackRestore"]=Module["asm"]["stackRestore"]).apply(null,arguments)};var __growWasmMemory=Module["__growWasmMemory"]=function(){return(__growWasmMemory=Module["__growWasmMemory"]=Module["asm"]["__growWasmMemory"]).apply(null,arguments)};var dynCall_ii=Module["dynCall_ii"]=function(){return(dynCall_ii=Module["dynCall_ii"]=Module["asm"]["dynCall_ii"]).apply(null,arguments)};var dynCall_vi=Module["dynCall_vi"]=function(){return(dynCall_vi=Module["dynCall_vi"]=Module["asm"]["dynCall_vi"]).apply(null,arguments)};var dynCall_viii=Module["dynCall_viii"]=function(){return(dynCall_viii=Module["dynCall_viii"]=Module["asm"]["dynCall_viii"]).apply(null,arguments)};var dynCall_viiii=Module["dynCall_viiii"]=function(){return(dynCall_viiii=Module["dynCall_viiii"]=Module["asm"]["dynCall_viiii"]).apply(null,arguments)};var dynCall_vii=Module["dynCall_vii"]=function(){return(dynCall_vii=Module["dynCall_vii"]=Module["asm"]["dynCall_vii"]).apply(null,arguments)};var dynCall_iiiii=Module["dynCall_iiiii"]=function(){return(dynCall_iiiii=Module["dynCall_iiiii"]=Module["asm"]["dynCall_iiiii"]).apply(null,arguments)};var dynCall_iiii=Module["dynCall_iiii"]=function(){return(dynCall_iiii=Module["dynCall_iiii"]=Module["asm"]["dynCall_iiii"]).apply(null,arguments)};var dynCall_iiiiifi=Module["dynCall_iiiiifi"]=function(){return(dynCall_iiiiifi=Module["dynCall_iiiiifi"]=Module["asm"]["dynCall_iiiiifi"]).apply(null,arguments)};var dynCall_viiiii=Module["dynCall_viiiii"]=function(){return(dynCall_viiiii=Module["dynCall_viiiii"]=Module["asm"]["dynCall_viiiii"]).apply(null,arguments)};var dynCall_fi=Module["dynCall_fi"]=function(){return(dynCall_fi=Module["dynCall_fi"]=Module["asm"]["dynCall_fi"]).apply(null,arguments)};var dynCall_iii=Module["dynCall_iii"]=function(){return(dynCall_iii=Module["dynCall_iii"]=Module["asm"]["dynCall_iii"]).apply(null,arguments)};var dynCall_iiiiiiii=Module["dynCall_iiiiiiii"]=function(){return(dynCall_iiiiiiii=Module["dynCall_iiiiiiii"]=Module["asm"]["dynCall_iiiiiiii"]).apply(null,arguments)};var dynCall_iiiiiii=Module["dynCall_iiiiiii"]=function(){return(dynCall_iiiiiii=Module["dynCall_iiiiiii"]=Module["asm"]["dynCall_iiiiiii"]).apply(null,arguments)};var dynCall_viiiiii=Module["dynCall_viiiiii"]=function(){return(dynCall_viiiiii=Module["dynCall_viiiiii"]=Module["asm"]["dynCall_viiiiii"]).apply(null,arguments)};var dynCall_i=Module["dynCall_i"]=function(){return(dynCall_i=Module["dynCall_i"]=Module["asm"]["dynCall_i"]).apply(null,arguments)};var dynCall_fif=Module["dynCall_fif"]=function(){return(dynCall_fif=Module["dynCall_fif"]=Module["asm"]["dynCall_fif"]).apply(null,arguments)};var dynCall_viifff=Module["dynCall_viifff"]=function(){return(dynCall_viifff=Module["dynCall_viifff"]=Module["asm"]["dynCall_viifff"]).apply(null,arguments)};var dynCall_viiif=Module["dynCall_viiif"]=function(){return(dynCall_viiif=Module["dynCall_viiif"]=Module["asm"]["dynCall_viiif"]).apply(null,arguments)};var dynCall_fiii=Module["dynCall_fiii"]=function(){return(dynCall_fiii=Module["dynCall_fiii"]=Module["asm"]["dynCall_fiii"]).apply(null,arguments)};var dynCall_jii=Module["dynCall_jii"]=function(){return(dynCall_jii=Module["dynCall_jii"]=Module["asm"]["dynCall_jii"]).apply(null,arguments)};var dynCall_viij=Module["dynCall_viij"]=function(){return(dynCall_viij=Module["dynCall_viij"]=Module["asm"]["dynCall_viij"]).apply(null,arguments)};var dynCall_fii=Module["dynCall_fii"]=function(){return(dynCall_fii=Module["dynCall_fii"]=Module["asm"]["dynCall_fii"]).apply(null,arguments)};var dynCall_viif=Module["dynCall_viif"]=function(){return(dynCall_viif=Module["dynCall_viif"]=Module["asm"]["dynCall_viif"]).apply(null,arguments)};var dynCall_vijf=Module["dynCall_vijf"]=function(){return(dynCall_vijf=Module["dynCall_vijf"]=Module["asm"]["dynCall_vijf"]).apply(null,arguments)};var dynCall_vif=Module["dynCall_vif"]=function(){return(dynCall_vif=Module["dynCall_vif"]=Module["asm"]["dynCall_vif"]).apply(null,arguments)};var dynCall_iiifff=Module["dynCall_iiifff"]=function(){return(dynCall_iiifff=Module["dynCall_iiifff"]=Module["asm"]["dynCall_iiifff"]).apply(null,arguments)};var dynCall_fiff=Module["dynCall_fiff"]=function(){return(dynCall_fiff=Module["dynCall_fiff"]=Module["asm"]["dynCall_fiff"]).apply(null,arguments)};var dynCall_ji=Module["dynCall_ji"]=function(){return(dynCall_ji=Module["dynCall_ji"]=Module["asm"]["dynCall_ji"]).apply(null,arguments)};var dynCall_vij=Module["dynCall_vij"]=function(){return(dynCall_vij=Module["dynCall_vij"]=Module["asm"]["dynCall_vij"]).apply(null,arguments)};var dynCall_fiif=Module["dynCall_fiif"]=function(){return(dynCall_fiif=Module["dynCall_fiif"]=Module["asm"]["dynCall_fiif"]).apply(null,arguments)};var dynCall_viijii=Module["dynCall_viijii"]=function(){return(dynCall_viijii=Module["dynCall_viijii"]=Module["asm"]["dynCall_viijii"]).apply(null,arguments)};var dynCall_v=Module["dynCall_v"]=function(){return(dynCall_v=Module["dynCall_v"]=Module["asm"]["dynCall_v"]).apply(null,arguments)};var dynCall_iiiiii=Module["dynCall_iiiiii"]=function(){return(dynCall_iiiiii=Module["dynCall_iiiiii"]=Module["asm"]["dynCall_iiiiii"]).apply(null,arguments)};var dynCall_iiiiiiiii=Module["dynCall_iiiiiiiii"]=function(){return(dynCall_iiiiiiiii=Module["dynCall_iiiiiiiii"]=Module["asm"]["dynCall_iiiiiiiii"]).apply(null,arguments)};var dynCall_jiji=Module["dynCall_jiji"]=function(){return(dynCall_jiji=Module["dynCall_jiji"]=Module["asm"]["dynCall_jiji"]).apply(null,arguments)};var dynCall_iidiiii=Module["dynCall_iidiiii"]=function(){return(dynCall_iidiiii=Module["dynCall_iidiiii"]=Module["asm"]["dynCall_iidiiii"]).apply(null,arguments)};var dynCall_iiiiij=Module["dynCall_iiiiij"]=function(){return(dynCall_iiiiij=Module["dynCall_iiiiij"]=Module["asm"]["dynCall_iiiiij"]).apply(null,arguments)};var dynCall_iiiiid=Module["dynCall_iiiiid"]=function(){return(dynCall_iiiiid=Module["dynCall_iiiiid"]=Module["asm"]["dynCall_iiiiid"]).apply(null,arguments)};var dynCall_iiiiijj=Module["dynCall_iiiiijj"]=function(){return(dynCall_iiiiijj=Module["dynCall_iiiiijj"]=Module["asm"]["dynCall_iiiiijj"]).apply(null,arguments)};var dynCall_iiiiiijj=Module["dynCall_iiiiiijj"]=function(){return(dynCall_iiiiiijj=Module["dynCall_iiiiiijj"]=Module["asm"]["dynCall_iiiiiijj"]).apply(null,arguments)};var dynCall_vffff=Module["dynCall_vffff"]=function(){return(dynCall_vffff=Module["dynCall_vffff"]=Module["asm"]["dynCall_vffff"]).apply(null,arguments)};var dynCall_vf=Module["dynCall_vf"]=function(){return(dynCall_vf=Module["dynCall_vf"]=Module["asm"]["dynCall_vf"]).apply(null,arguments)};var dynCall_viiiiiiii=Module["dynCall_viiiiiiii"]=function(){return(dynCall_viiiiiiii=Module["dynCall_viiiiiiii"]=Module["asm"]["dynCall_viiiiiiii"]).apply(null,arguments)};var dynCall_viiiiiiiii=Module["dynCall_viiiiiiiii"]=function(){return(dynCall_viiiiiiiii=Module["dynCall_viiiiiiiii"]=Module["asm"]["dynCall_viiiiiiiii"]).apply(null,arguments)};var dynCall_vff=Module["dynCall_vff"]=function(){return(dynCall_vff=Module["dynCall_vff"]=Module["asm"]["dynCall_vff"]).apply(null,arguments)};var dynCall_viiiiiii=Module["dynCall_viiiiiii"]=function(){return(dynCall_viiiiiii=Module["dynCall_viiiiiii"]=Module["asm"]["dynCall_viiiiiii"]).apply(null,arguments)};var dynCall_vfi=Module["dynCall_vfi"]=function(){return(dynCall_vfi=Module["dynCall_vfi"]=Module["asm"]["dynCall_vfi"]).apply(null,arguments)};var dynCall_viff=Module["dynCall_viff"]=function(){return(dynCall_viff=Module["dynCall_viff"]=Module["asm"]["dynCall_viff"]).apply(null,arguments)};var dynCall_vifff=Module["dynCall_vifff"]=function(){return(dynCall_vifff=Module["dynCall_vifff"]=Module["asm"]["dynCall_vifff"]).apply(null,arguments)};var dynCall_viffff=Module["dynCall_viffff"]=function(){return(dynCall_viffff=Module["dynCall_viffff"]=Module["asm"]["dynCall_viffff"]).apply(null,arguments)};Module["asm"]=asm;Module["cwrap"]=cwrap;Module["UTF8ToString"]=UTF8ToString;var calledRun;Module["then"]=function(func){if(calledRun){func(Module)}else{var old=Module["onRuntimeInitialized"];Module["onRuntimeInitialized"]=function(){if(old)old();func(Module)}}return Module};function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0)return;function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}noExitRuntime=true;run();Module["GL"]=GL;
+
+
+ return effekseer_native
+}
+);
+})();
+if (typeof exports === 'object' && typeof module === 'object')
+ module.exports = effekseer_native;
+ else if (typeof define === 'function' && define['amd'])
+ define([], function() { return effekseer_native; });
+ else if (typeof exports === 'object')
+ exports["effekseer_native"] = effekseer_native;
+ "use strict";var _typeof=typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"?function(obj){return typeof obj;}:function(obj){return obj&&typeof Symbol==="function"&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj;};var _createClass=function(){function defineProperties(target,props){for(var i=0;i0){for(var i=0;i>2);Core.SetMatrix(this.context.nativeptr,this.native,arrmem);Module.stackRestore(stack);}
+},{key:"setAllColor",value:function setAllColor(r,g,b,a){Core.SetAllColor(this.context.nativeptr,this.native,r,g,b,a);}
+},{key:"setTargetLocation",value:function setTargetLocation(x,y,z){Core.SetTargetLocation(this.context.nativeptr,this.native,x,y,z);}
+},{key:"getDynamicInput",value:function getDynamicInput(index){return Core.GetDynamicInput(this.context.nativeptr,this.native,index);}
+},{key:"setDynamicInput",value:function setDynamicInput(index,value){Core.SetDynamicInput(this.context.nativeptr,this.native,index,value);}
+},{key:"sendTrigger",value:function sendTrigger(index){Core.SendTrigger(this.context.nativeptr,this.native,index);}
+},{key:"setPaused",value:function setPaused(paused){Core.SetPaused(this.context.nativeptr,this.native,paused);}
+},{key:"setShown",value:function setShown(shown){Core.SetShown(this.context.nativeptr,this.native,shown);}
+},{key:"setSpeed",value:function setSpeed(speed){Core.SetSpeed(this.context.nativeptr,this.native,speed);}
+},{key:"setRandomSeed",value:function setRandomSeed(seed){Core.SetRandomSeed(this.context.nativeptr,this.native,seed);}},{key:"exists",get:function get(){return!!Core.Exists(this.context.nativeptr,this.native);}}]);return EffekseerHandle;}();var _isImagePowerOfTwo=function _isImagePowerOfTwo(image){return!(image.width&image.width-1)&&!(image.height&image.height-1);};var calcNextPowerOfTwo=function calcNextPowerOfTwo(v){var sizes=[2,4,8,16,32,64,128,256,512,1024,2048];var foundInd=-1;for(var i=0;i=v){return sizes[i];}}
+for(var i=sizes.length-1;i>=0;i--){if(sizes[i]<=v){return sizes[i];}}
+return 1;};var _convertPowerOfTwoImage=function _convertPowerOfTwoImage(image){if(!_isImagePowerOfTwo(image)){var canvas=document.createElement("canvas");canvas.width=calcNextPowerOfTwo(image.width);canvas.height=calcNextPowerOfTwo(image.height);var context2d=canvas.getContext("2d");context2d.drawImage(image,0,0,image.width,image.height,0,0,canvas.width,canvas.height);image=canvas;}
+return image;};var _loadBinFile=function _loadBinFile(url,onload,onerror){var xhr=new XMLHttpRequest();xhr.open('GET',url,true);xhr.responseType="arraybuffer";xhr.onload=function(){onload(xhr.response);};xhr.onerror=function(){if(!(typeof onerror==="undefined"))onerror('not found',url);};xhr.send(null);};var _loadResource=function _loadResource(path,onload,onerror){splitted_path=path.split('?');var ext_path=path;if(splitted_path.length>=2){ext_path=splitted_path[0];}
+var extindex=ext_path.lastIndexOf(".");var ext=extindex>=0?ext_path.slice(extindex):"";if(ext==".png"||ext==".jpg"){var image=new Image();image.onload=function(){var converted_image=_convertPowerOfTwoImage(image);onload(converted_image);};image.onerror=function(){if(!(typeof onerror==="undefined"))onerror('not found',path);};image.crossOrigin=_imageCrossOrigin;image.src=path;}else if(ext==".tga"){if(!(typeof onerror==="undefined"))onerror('not supported',path);}else{_loadBinFile(path,function(buffer){onload(buffer);},onerror);}};var loadingEffect=null;var ContextStates=function(){function ContextStates(gl){_classCallCheck(this,ContextStates);this.restore_texture_slot_max=8;this._gl=gl;this.ext_vao=null;this.isWebGL2VAOEnabled=false;this.effekseer_vao=null;this.current_vao=null;this.current_vbo=null;this.current_ibo=null;this.current_textures=[];this.current_textures.length=this.restore_texture_slot_max;this.current_active_texture_id=null;this.ext_vao=this._gl.getExtension('OES_vertex_array_object');if(this.ext_vao!=null){this.effekseer_vao=this.ext_vao.createVertexArrayOES();}else if('createVertexArray'in this._gl){this.isWebGL2VAOEnabled=true;this.effekseer_vao=this._gl.createVertexArray();}}
+_createClass(ContextStates,[{key:"release",value:function release(){if(this.effekseer_vao){if(this.ext_vao){this.ext_vao.deleteVertexArrayOES(this.effekseer_vao);}else if(this.isWebGL2VAOEnabled){this._gl.deleteVertexArray(this.effekseer_vao);}
+this.effekseer_vao=null;}
+this._gl=null;}},{key:"save",value:function save(){this.current_vbo=this._gl.getParameter(this._gl.ARRAY_BUFFER_BINDING);this.current_ibo=this._gl.getParameter(this._gl.ELEMENT_ARRAY_BUFFER_BINDING);if(this.ext_vao!=null){this.current_vao=this._gl.getParameter(this.ext_vao.VERTEX_ARRAY_BINDING_OES);this.ext_vao.bindVertexArrayOES(this.effekseer_vao);}else if(this.isWebGL2VAOEnabled){this.current_vao=this._gl.getParameter(this._gl.VERTEX_ARRAY_BINDING);this._gl.bindVertexArray(this.effekseer_vao);}
+this.current_active_texture_id=this._gl.getParameter(this._gl.ACTIVE_TEXTURE);for(var i=0;i>2);Core.SetProjectionMatrix(this.nativeptr,arrmem);Module.stackRestore(stack);}
+},{key:"setProjectionPerspective",value:function setProjectionPerspective(fov,aspect,near,far){Core.SetProjectionPerspective(this.nativeptr,fov,aspect,near,far);}
+},{key:"setProjectionOrthographic",value:function setProjectionOrthographic(width,height,near,far){Core.SetProjectionOrthographic(this.nativeptr,width,height,near,far);}
+},{key:"setCameraMatrix",value:function setCameraMatrix(matrixArray){var stack=Module.stackSave();var arrmem=Module.stackAlloc(4*16);Module.HEAPF32.set(matrixArray,arrmem>>2);Core.SetCameraMatrix(this.nativeptr,arrmem);Module.stackRestore(stack);}
+},{key:"setCameraLookAt",value:function setCameraLookAt(positionX,positionY,positionZ,targetX,targetY,targetZ,upvecX,upvecY,upvecZ){Core.SetCameraLookAt(this.nativeptr,positionX,positionY,positionZ,targetX,targetY,targetZ,upvecX,upvecY,upvecZ);}
+},{key:"setCameraLookAtFromVector",value:function setCameraLookAtFromVector(position,target,upvec){upvecVector=(typeof upvecVector==="undefined"?"undefined":_typeof(upvecVector))==="object"?upvecVector:{x:0,y:1,z:0};Core.SetCameraLookAt(this.nativeptr,position.x,position.y,position.z,target.x,target.y,target.z,upvec.x,upvec.y,upvec.z);}
+},{key:"loadEffect",value:function loadEffect(data){var scale=arguments.length>1&&arguments[1]!==undefined?arguments[1]:1.0;var onload=arguments[2];var onerror=arguments[3];var redirect=arguments[4];this._makeContextCurrent();var effect=new EffekseerEffect(this);if(typeof scale==="function"){console.log("Error : second arguments is number from version 1.5");effect.scale=1.0;effect.onload=scale;effect.onerror=onload;effect.redirect=redirect;}else{effect.scale=scale;effect.onload=onload;effect.onerror=onerror;effect.redirect=redirect;}
+if(typeof data==="string"){var dirIndex=data.lastIndexOf("/");effect.baseDir=dirIndex>=0?data.slice(0,dirIndex+1):"";_loadBinFile(data,function(buffer){effect._load(buffer);},effect.onerror);}else if(data instanceof ArrayBuffer){var buffer=data;effect._load(buffer);}
+return effect;}
+},{key:"loadEffectPackage",value:function loadEffectPackage(path,Unzip){var scale=arguments.length>2&&arguments[2]!==undefined?arguments[2]:1.0;var onload=arguments[3];var onerror=arguments[4];if(Unzip==null)this._makeContextCurrent();var effect=new EffekseerEffect(this);effect.scale=scale;effect.onload=onload;effect.onerror=onerror;if(typeof path==="string"){var dirIndex=path.lastIndexOf("/");effect.baseDir=dirIndex>=0?path.slice(0,dirIndex+1):"";_loadBinFile(path,function(buffer){effect._loadFromPackage(buffer,Unzip);},effect.onerror);}else if(path instanceof ArrayBuffer){var buffer=path;effect._loadFromPackage(buffer,Unzip);}
+return effect;}
+},{key:"releaseEffect",value:function releaseEffect(effect){this._makeContextCurrent();if(effect==null){console.warn("the effect is null.");return;}
+if(!effect.isLoaded){console.warn("the effect has not be loaded yet.");return;}
+if(effect.nativeptr==null){console.warn("the effect has been released.");return;}
+Core.ReleaseEffect(this.nativeptr,effect.nativeptr);effect.nativeptr=null;}
+},{key:"play",value:function play(effect,x,y,z){if(!effect||!effect.isLoaded){return null;}
+if(x===undefined)x=0;if(y===undefined)y=0;if(z===undefined)z=0;var handle=Core.PlayEffect(this.nativeptr,effect.nativeptr,x,y,z);return handle>=0?new EffekseerHandle(this,handle):null;}
+},{key:"stopAll",value:function stopAll(){Core.StopAllEffects(this.nativeptr);}
+},{key:"setResourceLoader",value:function setResourceLoader(loader){_loadResource=loader;}
+},{key:"getRestInstancesCount",value:function getRestInstancesCount(){return Core.GetRestInstancesCount(this.nativeptr);}
+},{key:"getUpdateTime",value:function getUpdateTime(){return Core.GetUpdateTime(this.nativeptr);}
+},{key:"getDrawTime",value:function getDrawTime(){return Core.GetDrawTime(this.nativeptr);}
+},{key:"isVertexArrayObjectSupported",value:function isVertexArrayObjectSupported(){return Core.IsVertexArrayObjectSupported(this.nativeptr);}
+},{key:"setRestorationOfStatesFlag",value:function setRestorationOfStatesFlag(flag){this._restorationOfStatesFlag=flag;Core.SetRestorationOfStatesFlag(this.nativeptr,flag);}
+},{key:"captureBackground",value:function captureBackground(x,y,width,height){return Core.CaptureBackground(this.nativeptr,x,y,width,height);}
+},{key:"resetBackground",value:function resetBackground(){return Core.ResetBackground(this.nativeptr);}}]);return EffekseerContext;}();var Effekseer=function(){function Effekseer(){_classCallCheck(this,Effekseer);}
+_createClass(Effekseer,[{key:"initRuntime",value:function initRuntime(path,onload,onerror){if(typeof effekseer_native==="undefined"){onload();return;}
+_onloadAssembly=onload;_onerrorAssembly=onerror;_initalize_wasm(path);}
+},{key:"createContext",value:function createContext(){if(!_is_runtime_initialized){return null;}
+return new EffekseerContext();}
+},{key:"releaseContext",value:function releaseContext(context){if(context.contextStates){context.contextStates.release();}
+if(context._gl){context._gl=null;}
+if(context.nativeptr==null){return;}
+Core.Terminate(context.nativeptr);context.nativeptr=null;}
+},{key:"setLogEnabled",value:function setLogEnabled(flag){Core.SetLogEnabled(flag);}
+},{key:"setImageCrossOrigin",value:function setImageCrossOrigin(crossOrigin){_imageCrossOrigin=crossOrigin;}
+},{key:"init",value:function init(webglContext,settings){console.warn('deprecated : please use through createContext.');this.defaultContext=new EffekseerContext();this.defaultContext.init(webglContext,settings);}
+},{key:"update",value:function update(deltaFrames){console.warn('deprecated : please use through createContext.');this.defaultContext.update(deltaFrames);}},{key:"beginUpdate",value:function beginUpdate(){console.warn('deprecated : please use through createContext.');this.defaultContext.beginUpdate();}},{key:"endUpdate",value:function endUpdate(){console.warn('deprecated : please use through createContext.');this.defaultContext.endUpdate();}},{key:"updateHandle",value:function updateHandle(handle,deltaFrames){console.warn('deprecated : please use through createContext.');this.defaultContext.updateHandle(handle,deltaFrames);}
+},{key:"draw",value:function draw(){console.warn('deprecated : please use through createContext.');this.defaultContext.draw();}},{key:"beginDraw",value:function beginDraw(){console.warn('deprecated : please use through createContext.');this.defaultContext.beginDraw();}},{key:"endDraw",value:function endDraw(){console.warn('deprecated : please use through createContext.');this.defaultContext.endDraw();}},{key:"drawHandle",value:function drawHandle(handle){console.warn('deprecated : please use through createContext.');this.defaultContext.drawHandle(handle);}
+},{key:"setProjectionMatrix",value:function setProjectionMatrix(matrixArray){console.warn('deprecated : please use through createContext.');this.defaultContext.setProjectionMatrix(matrixArray);}
+},{key:"setProjectionPerspective",value:function setProjectionPerspective(fov,aspect,near,far){console.warn('deprecated : please use through createContext.');this.defaultContext.SetProjectionPerspective(fov,aspect,near,far);}
+},{key:"setProjectionOrthographic",value:function setProjectionOrthographic(width,height,near,far){console.warn('deprecated : please use through createContext.');this.defaultContext.setProjectionOrthographic(width,height,near,far);}
+},{key:"setCameraMatrix",value:function setCameraMatrix(matrixArray){console.warn('deprecated : please use through createContext.');this.defaultContext.setCameraMatrix(matrixArray);}
+},{key:"setCameraLookAt",value:function setCameraLookAt(positionX,positionY,positionZ,targetX,targetY,targetZ,upvecX,upvecY,upvecZ){console.warn('deprecated : please use through createContext.');this.defaultContext.setCameraLookAt(positionX,positionY,positionZ,targetX,targetY,targetZ,upvecX,upvecY,upvecZ);}
+},{key:"setCameraLookAtFromVector",value:function setCameraLookAtFromVector(position,target,upvec){console.warn('deprecated : please use through createContext.');this.defaultContext.setCameraLookAtFromVector(position,target,upvec);}
+},{key:"loadEffect",value:function loadEffect(path){var scale=arguments.length>1&&arguments[1]!==undefined?arguments[1]:1.0;var onload=arguments[2];var onerror=arguments[3];console.warn('deprecated : please use through createContext.');return this.defaultContext.loadEffect(path,scale,onload,onerror);}
+},{key:"releaseEffect",value:function releaseEffect(effect){console.warn('deprecated : please use through createContext.');this.defaultContext.releaseEffect(effect);}
+},{key:"play",value:function play(effect,x,y,z){console.warn('deprecated : please use through createContext.');return this.defaultContext.play(effect,x,y,z);}
+},{key:"stopAll",value:function stopAll(){console.warn('deprecated : please use through createContext.');this.defaultContext.stopAll();}
+},{key:"setResourceLoader",value:function setResourceLoader(loader){console.warn('deprecated : please use through createContext.');this.defaultContext.setResourceLoader(loader);}
+},{key:"isVertexArrayObjectSupported",value:function isVertexArrayObjectSupported(){console.warn('deprecated : please use through createContext.');return this.defaultContext.isVertexArrayObjectSupported();}}]);return Effekseer;}();return new Effekseer();}();if(typeof exports!=='undefined'){exports=effekseer;}
\ No newline at end of file
diff --git a/js/libs/effekseer.wasm b/js/libs/effekseer.wasm
new file mode 100644
index 0000000..e91daf4
Binary files /dev/null and b/js/libs/effekseer.wasm differ
diff --git a/js/libs/localforage.min.js b/js/libs/localforage.min.js
new file mode 100644
index 0000000..eb87534
--- /dev/null
+++ b/js/libs/localforage.min.js
@@ -0,0 +1,7 @@
+/*!
+ localForage -- Offline Storage, Improved
+ Version 1.7.3
+ https://localforage.github.io/localForage
+ (c) 2013-2017 Mozilla, Apache License 2.0
+*/
+!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;b="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,b.localforage=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c||a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g=43)}}).catch(function(){return!1})}function n(a){return"boolean"==typeof xa?va.resolve(xa):m(a).then(function(a){return xa=a})}function o(a){var b=ya[a.name],c={};c.promise=new va(function(a,b){c.resolve=a,c.reject=b}),b.deferredOperations.push(c),b.dbReady?b.dbReady=b.dbReady.then(function(){return c.promise}):b.dbReady=c.promise}function p(a){var b=ya[a.name],c=b.deferredOperations.pop();if(c)return c.resolve(),c.promise}function q(a,b){var c=ya[a.name],d=c.deferredOperations.pop();if(d)return d.reject(b),d.promise}function r(a,b){return new va(function(c,d){if(ya[a.name]=ya[a.name]||B(),a.db){if(!b)return c(a.db);o(a),a.db.close()}var e=[a.name];b&&e.push(a.version);var f=ua.open.apply(ua,e);b&&(f.onupgradeneeded=function(b){var c=f.result;try{c.createObjectStore(a.storeName),b.oldVersion<=1&&c.createObjectStore(wa)}catch(c){if("ConstraintError"!==c.name)throw c;console.warn('The database "'+a.name+'" has been upgraded from version '+b.oldVersion+" to version "+b.newVersion+', but the storage "'+a.storeName+'" already exists.')}}),f.onerror=function(a){a.preventDefault(),d(f.error)},f.onsuccess=function(){c(f.result),p(a)}})}function s(a){return r(a,!1)}function t(a){return r(a,!0)}function u(a,b){if(!a.db)return!0;var c=!a.db.objectStoreNames.contains(a.storeName),d=a.versiona.db.version;if(d&&(a.version!==b&&console.warn('The database "'+a.name+"\" can't be downgraded from version "+a.db.version+" to version "+a.version+"."),a.version=a.db.version),e||c){if(c){var f=a.db.version+1;f>a.version&&(a.version=f)}return!0}return!1}function v(a){return new va(function(b,c){var d=new FileReader;d.onerror=c,d.onloadend=function(c){var d=btoa(c.target.result||"");b({__local_forage_encoded_blob:!0,data:d,type:a.type})},d.readAsBinaryString(a)})}function w(a){return g([l(atob(a.data))],{type:a.type})}function x(a){return a&&a.__local_forage_encoded_blob}function y(a){var b=this,c=b._initReady().then(function(){var a=ya[b._dbInfo.name];if(a&&a.dbReady)return a.dbReady});return i(c,a,a),c}function z(a){o(a);for(var b=ya[a.name],c=b.forages,d=0;d0&&(!a.db||"InvalidStateError"===e.name||"NotFoundError"===e.name))return va.resolve().then(function(){if(!a.db||"NotFoundError"===e.name&&!a.db.objectStoreNames.contains(a.storeName)&&a.version<=a.db.version)return a.db&&(a.version=a.db.version+1),t(a)}).then(function(){return z(a).then(function(){A(a,b,c,d-1)})}).catch(c);c(e)}}function B(){return{forages:[],db:null,dbReady:null,deferredOperations:[]}}function C(a){function b(){return va.resolve()}var c=this,d={db:null};if(a)for(var e in a)d[e]=a[e];var f=ya[d.name];f||(f=B(),ya[d.name]=f),f.forages.push(c),c._initReady||(c._initReady=c.ready,c.ready=y);for(var g=[],h=0;h>4,k[i++]=(15&d)<<4|e>>2,k[i++]=(3&e)<<6|63&f;return j}function O(a){var b,c=new Uint8Array(a),d="";for(b=0;b>2],d+=Da[(3&c[b])<<4|c[b+1]>>4],d+=Da[(15&c[b+1])<<2|c[b+2]>>6],d+=Da[63&c[b+2]];return c.length%3==2?d=d.substring(0,d.length-1)+"=":c.length%3==1&&(d=d.substring(0,d.length-2)+"=="),d}function P(a,b){var c="";if(a&&(c=Ua.call(a)),a&&("[object ArrayBuffer]"===c||a.buffer&&"[object ArrayBuffer]"===Ua.call(a.buffer))){var d,e=Ga;a instanceof ArrayBuffer?(d=a,e+=Ia):(d=a.buffer,"[object Int8Array]"===c?e+=Ka:"[object Uint8Array]"===c?e+=La:"[object Uint8ClampedArray]"===c?e+=Ma:"[object Int16Array]"===c?e+=Na:"[object Uint16Array]"===c?e+=Pa:"[object Int32Array]"===c?e+=Oa:"[object Uint32Array]"===c?e+=Qa:"[object Float32Array]"===c?e+=Ra:"[object Float64Array]"===c?e+=Sa:b(new Error("Failed to get type for BinaryArray"))),b(e+O(d))}else if("[object Blob]"===c){var f=new FileReader;f.onload=function(){var c=Ea+a.type+"~"+O(this.result);b(Ga+Ja+c)},f.readAsArrayBuffer(a)}else try{b(JSON.stringify(a))}catch(c){console.error("Couldn't convert value into a JSON string: ",a),b(null,c)}}function Q(a){if(a.substring(0,Ha)!==Ga)return JSON.parse(a);var b,c=a.substring(Ta),d=a.substring(Ha,Ta);if(d===Ja&&Fa.test(c)){var e=c.match(Fa);b=e[1],c=c.substring(e[0].length)}var f=N(c);switch(d){case Ia:return f;case Ja:return g([f],{type:b});case Ka:return new Int8Array(f);case La:return new Uint8Array(f);case Ma:return new Uint8ClampedArray(f);case Na:return new Int16Array(f);case Pa:return new Uint16Array(f);case Oa:return new Int32Array(f);case Qa:return new Uint32Array(f);case Ra:return new Float32Array(f);case Sa:return new Float64Array(f);default:throw new Error("Unkown type: "+d)}}function R(a,b,c,d){a.executeSql("CREATE TABLE IF NOT EXISTS "+b.storeName+" (id INTEGER PRIMARY KEY, key unique, value)",[],c,d)}function S(a){var b=this,c={db:null};if(a)for(var d in a)c[d]="string"!=typeof a[d]?a[d].toString():a[d];var e=new va(function(a,d){try{c.db=openDatabase(c.name,String(c.version),c.description,c.size)}catch(a){return d(a)}c.db.transaction(function(e){R(e,c,function(){b._dbInfo=c,a()},function(a,b){d(b)})},d)});return c.serializer=Va,e}function T(a,b,c,d,e,f){a.executeSql(c,d,e,function(a,g){g.code===g.SYNTAX_ERR?a.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name = ?",[b.storeName],function(a,h){h.rows.length?f(a,g):R(a,b,function(){a.executeSql(c,d,e,f)},f)},f):f(a,g)},f)}function U(a,b){var c=this;a=j(a);var d=new va(function(b,d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){T(c,e,"SELECT * FROM "+e.storeName+" WHERE key = ? LIMIT 1",[a],function(a,c){var d=c.rows.length?c.rows.item(0).value:null;d&&(d=e.serializer.deserialize(d)),b(d)},function(a,b){d(b)})})}).catch(d)});return h(d,b),d}function V(a,b){var c=this,d=new va(function(b,d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){T(c,e,"SELECT * FROM "+e.storeName,[],function(c,d){for(var f=d.rows,g=f.length,h=0;h0)return void f(W.apply(e,[a,h,c,d-1]));g(b)}})})}).catch(g)});return h(f,c),f}function X(a,b,c){return W.apply(this,[a,b,c,1])}function Y(a,b){var c=this;a=j(a);var d=new va(function(b,d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){T(c,e,"DELETE FROM "+e.storeName+" WHERE key = ?",[a],function(){b()},function(a,b){d(b)})})}).catch(d)});return h(d,b),d}function Z(a){var b=this,c=new va(function(a,c){b.ready().then(function(){var d=b._dbInfo;d.db.transaction(function(b){T(b,d,"DELETE FROM "+d.storeName,[],function(){a()},function(a,b){c(b)})})}).catch(c)});return h(c,a),c}function $(a){var b=this,c=new va(function(a,c){b.ready().then(function(){var d=b._dbInfo;d.db.transaction(function(b){T(b,d,"SELECT COUNT(key) as c FROM "+d.storeName,[],function(b,c){var d=c.rows.item(0).c;a(d)},function(a,b){c(b)})})}).catch(c)});return h(c,a),c}function _(a,b){var c=this,d=new va(function(b,d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){T(c,e,"SELECT key FROM "+e.storeName+" WHERE id = ? LIMIT 1",[a+1],function(a,c){var d=c.rows.length?c.rows.item(0).key:null;b(d)},function(a,b){d(b)})})}).catch(d)});return h(d,b),d}function aa(a){var b=this,c=new va(function(a,c){b.ready().then(function(){var d=b._dbInfo;d.db.transaction(function(b){T(b,d,"SELECT key FROM "+d.storeName,[],function(b,c){for(var d=[],e=0;e '__WebKitDatabaseInfoTable__'",[],function(c,d){for(var e=[],f=0;f0}function ha(a){var b=this,c={};if(a)for(var d in a)c[d]=a[d];return c.keyPrefix=ea(a,b._defaultConfig),ga()?(b._dbInfo=c,c.serializer=Va,va.resolve()):va.reject()}function ia(a){var b=this,c=b.ready().then(function(){for(var a=b._dbInfo.keyPrefix,c=localStorage.length-1;c>=0;c--){var d=localStorage.key(c);0===d.indexOf(a)&&localStorage.removeItem(d)}});return h(c,a),c}function ja(a,b){var c=this;a=j(a);var d=c.ready().then(function(){var b=c._dbInfo,d=localStorage.getItem(b.keyPrefix+a);return d&&(d=b.serializer.deserialize(d)),d});return h(d,b),d}function ka(a,b){var c=this,d=c.ready().then(function(){for(var b=c._dbInfo,d=b.keyPrefix,e=d.length,f=localStorage.length,g=1,h=0;h=0;b--){var c=localStorage.key(b);0===c.indexOf(a)&&localStorage.removeItem(c)}}):va.reject("Invalid arguments"),h(d,b),d}function ra(a,b){a[b]=function(){var c=arguments;return a.ready().then(function(){return a[b].apply(a,c)})}}function sa(){for(var a=1;a>>6:(a<65536?e[r++]=224|a>>>12:(e[r++]=240|a>>>18,e[r++]=128|a>>>12&63),e[r++]=128|a>>>6&63),e[r++]=128|63&a);return e},a.buf2binstring=function(t){return d(t,t.length)},a.binstring2buf=function(t){for(var e=new l.Buf8(t.length),a=0,i=e.length;a>10&1023,o[i++]=56320|1023&n)}return d(o,i)},a.utf8border=function(t,e){var a;for((e=e||t.length)>t.length&&(e=t.length),a=e-1;0<=a&&128==(192&t[a]);)a--;return a<0?e:0===a?e:a+h[t[a]]>e?a:e}},{"./common":3}],5:[function(t,e,a){"use strict";e.exports=function(t,e,a,i){for(var n=65535&t|0,r=t>>>16&65535|0,s=0;0!==a;){for(a-=s=2e3>>1:t>>>1;e[a]=t}return e}();e.exports=function(t,e,a,i){var n=o,r=i+a;t^=-1;for(var s=i;s>>8^n[255&(t^e[s])];return-1^t}},{}],8:[function(t,e,a){"use strict";var l,_=t("../utils/common"),h=t("./trees"),u=t("./adler32"),c=t("./crc32"),i=t("./messages"),d=0,f=4,b=0,g=-2,m=-1,w=4,n=2,p=8,v=9,r=286,s=30,o=19,k=2*r+1,y=15,x=3,z=258,B=z+x+1,S=42,E=113,A=1,Z=2,R=3,C=4;function N(t,e){return t.msg=i[e],e}function O(t){return(t<<1)-(4t.avail_out&&(a=t.avail_out),0!==a&&(_.arraySet(t.output,e.pending_buf,e.pending_out,a,t.next_out),t.next_out+=a,e.pending_out+=a,t.total_out+=a,t.avail_out-=a,e.pending-=a,0===e.pending&&(e.pending_out=0))}function U(t,e){h._tr_flush_block(t,0<=t.block_start?t.block_start:-1,t.strstart-t.block_start,e),t.block_start=t.strstart,I(t.strm)}function T(t,e){t.pending_buf[t.pending++]=e}function F(t,e){t.pending_buf[t.pending++]=e>>>8&255,t.pending_buf[t.pending++]=255&e}function L(t,e){var a,i,n=t.max_chain_length,r=t.strstart,s=t.prev_length,o=t.nice_match,l=t.strstart>t.w_size-B?t.strstart-(t.w_size-B):0,h=t.window,d=t.w_mask,f=t.prev,_=t.strstart+z,u=h[r+s-1],c=h[r+s];t.prev_length>=t.good_match&&(n>>=2),o>t.lookahead&&(o=t.lookahead);do{if(h[(a=e)+s]===c&&h[a+s-1]===u&&h[a]===h[r]&&h[++a]===h[r+1]){r+=2,a++;do{}while(h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&r<_);if(i=z-(_-r),r=_-z,sl&&0!=--n);return s<=t.lookahead?s:t.lookahead}function H(t){var e,a,i,n,r,s,o,l,h,d,f=t.w_size;do{if(n=t.window_size-t.lookahead-t.strstart,t.strstart>=f+(f-B)){for(_.arraySet(t.window,t.window,f,f,0),t.match_start-=f,t.strstart-=f,t.block_start-=f,e=a=t.hash_size;i=t.head[--e],t.head[e]=f<=i?i-f:0,--a;);for(e=a=f;i=t.prev[--e],t.prev[e]=f<=i?i-f:0,--a;);n+=f}if(0===t.strm.avail_in)break;if(s=t.strm,o=t.window,l=t.strstart+t.lookahead,h=n,d=void 0,d=s.avail_in,h=x)for(r=t.strstart-t.insert,t.ins_h=t.window[r],t.ins_h=(t.ins_h<=x&&(t.ins_h=(t.ins_h<=x)if(i=h._tr_tally(t,t.strstart-t.match_start,t.match_length-x),t.lookahead-=t.match_length,t.match_length<=t.max_lazy_match&&t.lookahead>=x){for(t.match_length--;t.strstart++,t.ins_h=(t.ins_h<=x&&(t.ins_h=(t.ins_h<=x&&t.match_length<=t.prev_length){for(n=t.strstart+t.lookahead-x,i=h._tr_tally(t,t.strstart-1-t.prev_match,t.prev_length-x),t.lookahead-=t.prev_length-1,t.prev_length-=2;++t.strstart<=n&&(t.ins_h=(t.ins_h<t.pending_buf_size-5&&(a=t.pending_buf_size-5);;){if(t.lookahead<=1){if(H(t),0===t.lookahead&&e===d)return A;if(0===t.lookahead)break}t.strstart+=t.lookahead,t.lookahead=0;var i=t.block_start+a;if((0===t.strstart||t.strstart>=i)&&(t.lookahead=t.strstart-i,t.strstart=i,U(t,!1),0===t.strm.avail_out))return A;if(t.strstart-t.block_start>=t.w_size-B&&(U(t,!1),0===t.strm.avail_out))return A}return t.insert=0,e===f?(U(t,!0),0===t.strm.avail_out?R:C):(t.strstart>t.block_start&&(U(t,!1),t.strm.avail_out),A)}),new M(4,4,8,4,j),new M(4,5,16,8,j),new M(4,6,32,32,j),new M(4,4,16,16,K),new M(8,16,32,32,K),new M(8,16,128,128,K),new M(8,32,128,256,K),new M(32,128,258,1024,K),new M(32,258,258,4096,K)],a.deflateInit=function(t,e){return G(t,e,p,15,8,0)},a.deflateInit2=G,a.deflateReset=q,a.deflateResetKeep=Y,a.deflateSetHeader=function(t,e){return t&&t.state?2!==t.state.wrap?g:(t.state.gzhead=e,b):g},a.deflate=function(t,e){var a,i,n,r;if(!t||!t.state||5>8&255),T(i,i.gzhead.time>>16&255),T(i,i.gzhead.time>>24&255),T(i,9===i.level?2:2<=i.strategy||i.level<2?4:0),T(i,255&i.gzhead.os),i.gzhead.extra&&i.gzhead.extra.length&&(T(i,255&i.gzhead.extra.length),T(i,i.gzhead.extra.length>>8&255)),i.gzhead.hcrc&&(t.adler=c(t.adler,i.pending_buf,i.pending,0)),i.gzindex=0,i.status=69):(T(i,0),T(i,0),T(i,0),T(i,0),T(i,0),T(i,9===i.level?2:2<=i.strategy||i.level<2?4:0),T(i,3),i.status=E);else{var s=p+(i.w_bits-8<<4)<<8;s|=(2<=i.strategy||i.level<2?0:i.level<6?1:6===i.level?2:3)<<6,0!==i.strstart&&(s|=32),s+=31-s%31,i.status=E,F(i,s),0!==i.strstart&&(F(i,t.adler>>>16),F(i,65535&t.adler)),t.adler=1}if(69===i.status)if(i.gzhead.extra){for(n=i.pending;i.gzindex<(65535&i.gzhead.extra.length)&&(i.pending!==i.pending_buf_size||(i.gzhead.hcrc&&i.pending>n&&(t.adler=c(t.adler,i.pending_buf,i.pending-n,n)),I(t),n=i.pending,i.pending!==i.pending_buf_size));)T(i,255&i.gzhead.extra[i.gzindex]),i.gzindex++;i.gzhead.hcrc&&i.pending>n&&(t.adler=c(t.adler,i.pending_buf,i.pending-n,n)),i.gzindex===i.gzhead.extra.length&&(i.gzindex=0,i.status=73)}else i.status=73;if(73===i.status)if(i.gzhead.name){n=i.pending;do{if(i.pending===i.pending_buf_size&&(i.gzhead.hcrc&&i.pending>n&&(t.adler=c(t.adler,i.pending_buf,i.pending-n,n)),I(t),n=i.pending,i.pending===i.pending_buf_size)){r=1;break}T(i,r=i.gzindexn&&(t.adler=c(t.adler,i.pending_buf,i.pending-n,n)),0===r&&(i.gzindex=0,i.status=91)}else i.status=91;if(91===i.status)if(i.gzhead.comment){n=i.pending;do{if(i.pending===i.pending_buf_size&&(i.gzhead.hcrc&&i.pending>n&&(t.adler=c(t.adler,i.pending_buf,i.pending-n,n)),I(t),n=i.pending,i.pending===i.pending_buf_size)){r=1;break}T(i,r=i.gzindexn&&(t.adler=c(t.adler,i.pending_buf,i.pending-n,n)),0===r&&(i.status=103)}else i.status=103;if(103===i.status&&(i.gzhead.hcrc?(i.pending+2>i.pending_buf_size&&I(t),i.pending+2<=i.pending_buf_size&&(T(i,255&t.adler),T(i,t.adler>>8&255),t.adler=0,i.status=E)):i.status=E),0!==i.pending){if(I(t),0===t.avail_out)return i.last_flush=-1,b}else if(0===t.avail_in&&O(e)<=O(a)&&e!==f)return N(t,-5);if(666===i.status&&0!==t.avail_in)return N(t,-5);if(0!==t.avail_in||0!==i.lookahead||e!==d&&666!==i.status){var o=2===i.strategy?function(t,e){for(var a;;){if(0===t.lookahead&&(H(t),0===t.lookahead)){if(e===d)return A;break}if(t.match_length=0,a=h._tr_tally(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++,a&&(U(t,!1),0===t.strm.avail_out))return A}return t.insert=0,e===f?(U(t,!0),0===t.strm.avail_out?R:C):t.last_lit&&(U(t,!1),0===t.strm.avail_out)?A:Z}(i,e):3===i.strategy?function(t,e){for(var a,i,n,r,s=t.window;;){if(t.lookahead<=z){if(H(t),t.lookahead<=z&&e===d)return A;if(0===t.lookahead)break}if(t.match_length=0,t.lookahead>=x&&0t.lookahead&&(t.match_length=t.lookahead)}if(t.match_length>=x?(a=h._tr_tally(t,1,t.match_length-x),t.lookahead-=t.match_length,t.strstart+=t.match_length,t.match_length=0):(a=h._tr_tally(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++),a&&(U(t,!1),0===t.strm.avail_out))return A}return t.insert=0,e===f?(U(t,!0),0===t.strm.avail_out?R:C):t.last_lit&&(U(t,!1),0===t.strm.avail_out)?A:Z}(i,e):l[i.level].func(i,e);if(o!==R&&o!==C||(i.status=666),o===A||o===R)return 0===t.avail_out&&(i.last_flush=-1),b;if(o===Z&&(1===e?h._tr_align(i):5!==e&&(h._tr_stored_block(i,0,0,!1),3===e&&(D(i.head),0===i.lookahead&&(i.strstart=0,i.block_start=0,i.insert=0))),I(t),0===t.avail_out))return i.last_flush=-1,b}return e!==f?b:i.wrap<=0?1:(2===i.wrap?(T(i,255&t.adler),T(i,t.adler>>8&255),T(i,t.adler>>16&255),T(i,t.adler>>24&255),T(i,255&t.total_in),T(i,t.total_in>>8&255),T(i,t.total_in>>16&255),T(i,t.total_in>>24&255)):(F(i,t.adler>>>16),F(i,65535&t.adler)),I(t),0=a.w_size&&(0===r&&(D(a.head),a.strstart=0,a.block_start=0,a.insert=0),h=new _.Buf8(a.w_size),_.arraySet(h,e,d-a.w_size,a.w_size,0),e=h,d=a.w_size),s=t.avail_in,o=t.next_in,l=t.input,t.avail_in=d,t.next_in=0,t.input=e,H(a);a.lookahead>=x;){for(i=a.strstart,n=a.lookahead-(x-1);a.ins_h=(a.ins_h<>>=v=p>>>24,c-=v,0===(v=p>>>16&255))S[r++]=65535&p;else{if(!(16&v)){if(0==(64&v)){p=b[(65535&p)+(u&(1<>>=v,c-=v),c<15&&(u+=B[i++]<>>=v=p>>>24,c-=v,!(16&(v=p>>>16&255))){if(0==(64&v)){p=g[(65535&p)+(u&(1<>>=v,c-=v,(v=r-s)>3,u&=(1<<(c-=k<<3))-1,t.next_in=i,t.next_out=r,t.avail_in=i>>24&255)+(t>>>8&65280)+((65280&t)<<8)+((255&t)<<24)}function r(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Z.Buf16(320),this.work=new Z.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function s(t){var e;return t&&t.state?(e=t.state,t.total_in=t.total_out=e.total=0,t.msg="",e.wrap&&(t.adler=1&e.wrap),e.mode=F,e.last=0,e.havedict=0,e.dmax=32768,e.head=null,e.hold=0,e.bits=0,e.lencode=e.lendyn=new Z.Buf32(i),e.distcode=e.distdyn=new Z.Buf32(n),e.sane=1,e.back=-1,U):T}function o(t){var e;return t&&t.state?((e=t.state).wsize=0,e.whave=0,e.wnext=0,s(t)):T}function l(t,e){var a,i;return t&&t.state?(i=t.state,e<0?(a=0,e=-e):(a=1+(e>>4),e<48&&(e&=15)),e&&(e<8||15=r.wsize?(Z.arraySet(r.window,e,a-r.wsize,r.wsize,0),r.wnext=0,r.whave=r.wsize):(i<(n=r.wsize-r.wnext)&&(n=i),Z.arraySet(r.window,e,a-i,n,r.wnext),(i-=n)?(Z.arraySet(r.window,e,a-i,i,0),r.wnext=i,r.whave=r.wsize):(r.wnext+=n,r.wnext===r.wsize&&(r.wnext=0),r.whave>>8&255,a.check=C(a.check,E,2,0),d=h=0,a.mode=2;break}if(a.flags=0,a.head&&(a.head.done=!1),!(1&a.wrap)||(((255&h)<<8)+(h>>8))%31){t.msg="incorrect header check",a.mode=30;break}if(8!=(15&h)){t.msg="unknown compression method",a.mode=30;break}if(d-=4,y=8+(15&(h>>>=4)),0===a.wbits)a.wbits=y;else if(y>a.wbits){t.msg="invalid window size",a.mode=30;break}a.dmax=1<>8&1),512&a.flags&&(E[0]=255&h,E[1]=h>>>8&255,a.check=C(a.check,E,2,0)),d=h=0,a.mode=3;case 3:for(;d<32;){if(0===o)break t;o--,h+=i[r++]<>>8&255,E[2]=h>>>16&255,E[3]=h>>>24&255,a.check=C(a.check,E,4,0)),d=h=0,a.mode=4;case 4:for(;d<16;){if(0===o)break t;o--,h+=i[r++]<>8),512&a.flags&&(E[0]=255&h,E[1]=h>>>8&255,a.check=C(a.check,E,2,0)),d=h=0,a.mode=5;case 5:if(1024&a.flags){for(;d<16;){if(0===o)break t;o--,h+=i[r++]<>>8&255,a.check=C(a.check,E,2,0)),d=h=0}else a.head&&(a.head.extra=null);a.mode=6;case 6:if(1024&a.flags&&(o<(u=a.length)&&(u=o),u&&(a.head&&(y=a.head.extra_len-a.length,a.head.extra||(a.head.extra=new Array(a.head.extra_len)),Z.arraySet(a.head.extra,i,r,u,y)),512&a.flags&&(a.check=C(a.check,i,u,r)),o-=u,r+=u,a.length-=u),a.length))break t;a.length=0,a.mode=7;case 7:if(2048&a.flags){if(0===o)break t;for(u=0;y=i[r+u++],a.head&&y&&a.length<65536&&(a.head.name+=String.fromCharCode(y)),y&&u>9&1,a.head.done=!0),t.adler=a.check=0,a.mode=12;break;case 10:for(;d<32;){if(0===o)break t;o--,h+=i[r++]<>>=7&d,d-=7&d,a.mode=27;break}for(;d<3;){if(0===o)break t;o--,h+=i[r++]<>>=1)){case 0:a.mode=14;break;case 1:if(H(a),a.mode=20,6!==e)break;h>>>=2,d-=2;break t;case 2:a.mode=17;break;case 3:t.msg="invalid block type",a.mode=30}h>>>=2,d-=2;break;case 14:for(h>>>=7&d,d-=7&d;d<32;){if(0===o)break t;o--,h+=i[r++]<>>16^65535)){t.msg="invalid stored block lengths",a.mode=30;break}if(a.length=65535&h,d=h=0,a.mode=15,6===e)break t;case 15:a.mode=16;case 16:if(u=a.length){if(o>>=5,d-=5,a.ndist=1+(31&h),h>>>=5,d-=5,a.ncode=4+(15&h),h>>>=4,d-=4,286>>=3,d-=3}for(;a.have<19;)a.lens[A[a.have++]]=0;if(a.lencode=a.lendyn,a.lenbits=7,z={bits:a.lenbits},x=O(0,a.lens,0,19,a.lencode,0,a.work,z),a.lenbits=z.bits,x){t.msg="invalid code lengths set",a.mode=30;break}a.have=0,a.mode=19;case 19:for(;a.have>>16&255,w=65535&S,!((g=S>>>24)<=d);){if(0===o)break t;o--,h+=i[r++]<>>=g,d-=g,a.lens[a.have++]=w;else{if(16===w){for(B=g+2;d>>=g,d-=g,0===a.have){t.msg="invalid bit length repeat",a.mode=30;break}y=a.lens[a.have-1],u=3+(3&h),h>>>=2,d-=2}else if(17===w){for(B=g+3;d>>=g)),h>>>=3,d-=3}else{for(B=g+7;d>>=g)),h>>>=7,d-=7}if(a.have+u>a.nlen+a.ndist){t.msg="invalid bit length repeat",a.mode=30;break}for(;u--;)a.lens[a.have++]=y}}if(30===a.mode)break;if(0===a.lens[256]){t.msg="invalid code -- missing end-of-block",a.mode=30;break}if(a.lenbits=9,z={bits:a.lenbits},x=O(D,a.lens,0,a.nlen,a.lencode,0,a.work,z),a.lenbits=z.bits,x){t.msg="invalid literal/lengths set",a.mode=30;break}if(a.distbits=6,a.distcode=a.distdyn,z={bits:a.distbits},x=O(I,a.lens,a.nlen,a.ndist,a.distcode,0,a.work,z),a.distbits=z.bits,x){t.msg="invalid distances set",a.mode=30;break}if(a.mode=20,6===e)break t;case 20:a.mode=21;case 21:if(6<=o&&258<=l){t.next_out=s,t.avail_out=l,t.next_in=r,t.avail_in=o,a.hold=h,a.bits=d,N(t,_),s=t.next_out,n=t.output,l=t.avail_out,r=t.next_in,i=t.input,o=t.avail_in,h=a.hold,d=a.bits,12===a.mode&&(a.back=-1);break}for(a.back=0;m=(S=a.lencode[h&(1<>>16&255,w=65535&S,!((g=S>>>24)<=d);){if(0===o)break t;o--,h+=i[r++]<>p)])>>>16&255,w=65535&S,!(p+(g=S>>>24)<=d);){if(0===o)break t;o--,h+=i[r++]<>>=p,d-=p,a.back+=p}if(h>>>=g,d-=g,a.back+=g,a.length=w,0===m){a.mode=26;break}if(32&m){a.back=-1,a.mode=12;break}if(64&m){t.msg="invalid literal/length code",a.mode=30;break}a.extra=15&m,a.mode=22;case 22:if(a.extra){for(B=a.extra;d>>=a.extra,d-=a.extra,a.back+=a.extra}a.was=a.length,a.mode=23;case 23:for(;m=(S=a.distcode[h&(1<>>16&255,w=65535&S,!((g=S>>>24)<=d);){if(0===o)break t;o--,h+=i[r++]<>p)])>>>16&255,w=65535&S,!(p+(g=S>>>24)<=d);){if(0===o)break t;o--,h+=i[r++]<>>=p,d-=p,a.back+=p}if(h>>>=g,d-=g,a.back+=g,64&m){t.msg="invalid distance code",a.mode=30;break}a.offset=w,a.extra=15&m,a.mode=24;case 24:if(a.extra){for(B=a.extra;d>>=a.extra,d-=a.extra,a.back+=a.extra}if(a.offset>a.dmax){t.msg="invalid distance too far back",a.mode=30;break}a.mode=25;case 25:if(0===l)break t;if(u=_-l,a.offset>u){if((u=a.offset-u)>a.whave&&a.sane){t.msg="invalid distance too far back",a.mode=30;break}u>a.wnext?(u-=a.wnext,c=a.wsize-u):c=a.wnext-u,u>a.length&&(u=a.length),b=a.window}else b=n,c=s-a.offset,u=a.length;for(lu?(b=N[O+s[p]],g=A[Z+s[p]]):(b=96,g=0),l=1<>z)+(h-=l)]=c<<24|b<<16|g|0,0!==h;);for(l=1<>=1;if(0!==l?(E&=l-1,E+=l):E=0,p++,0==--R[w]){if(w===k)break;w=e[a+s[p]]}if(y>>7)]}function T(t,e){t.pending_buf[t.pending++]=255&e,t.pending_buf[t.pending++]=e>>>8&255}function F(t,e,a){t.bi_valid>n-a?(t.bi_buf|=e<>n-t.bi_valid,t.bi_valid+=a-n):(t.bi_buf|=e<>>=1,a<<=1,0<--e;);return a>>>1}function j(t,e,a){var i,n,r=new Array(m+1),s=0;for(i=1;i<=m;i++)r[i]=s=s+a[i-1]<<1;for(n=0;n<=e;n++){var o=t[2*n+1];0!==o&&(t[2*n]=H(r[o]++,o))}}function K(t){var e;for(e=0;e<_;e++)t.dyn_ltree[2*e]=0;for(e=0;e>1;1<=a;a--)Y(t,r,a);for(n=l;a=t.heap[1],t.heap[1]=t.heap[t.heap_len--],Y(t,r,1),i=t.heap[1],t.heap[--t.heap_max]=a,t.heap[--t.heap_max]=i,r[2*n]=r[2*a]+r[2*i],t.depth[n]=(t.depth[a]>=t.depth[i]?t.depth[a]:t.depth[i])+1,r[2*a+1]=r[2*i+1]=n,t.heap[1]=n++,Y(t,r,1),2<=t.heap_len;);t.heap[--t.heap_max]=t.heap[1],function(t,e){var a,i,n,r,s,o,l=e.dyn_tree,h=e.max_code,d=e.stat_desc.static_tree,f=e.stat_desc.has_stree,_=e.stat_desc.extra_bits,u=e.stat_desc.extra_base,c=e.stat_desc.max_length,b=0;for(r=0;r<=m;r++)t.bl_count[r]=0;for(l[2*t.heap[t.heap_max]+1]=0,a=t.heap_max+1;a>=7;i>>=1)if(1&a&&0!==t.dyn_ltree[2*e])return o;if(0!==t.dyn_ltree[18]||0!==t.dyn_ltree[20]||0!==t.dyn_ltree[26])return h;for(e=32;e>>3,(r=t.static_len+3+7>>>3)<=n&&(n=r)):n=r=a+5,a+4<=n&&-1!==e?Q(t,e,a,i):4===t.strategy||r===n?(F(t,2+(i?1:0),3),q(t,S,E)):(F(t,4+(i?1:0),3),function(t,e,a,i){var n;for(F(t,e-257,5),F(t,a-1,5),F(t,i-4,4),n=0;n>>8&255,t.pending_buf[t.d_buf+2*t.last_lit+1]=255&e,t.pending_buf[t.l_buf+t.last_lit]=255&a,t.last_lit++,0===e?t.dyn_ltree[2*a]++:(t.matches++,e--,t.dyn_ltree[2*(Z[a]+f+1)]++,t.dyn_dtree[2*U(e)]++),t.last_lit===t.lit_bufsize-1},a._tr_align=function(t){var e;F(t,2,3),L(t,w,S),16===(e=t).bi_valid?(T(e,e.bi_buf),e.bi_buf=0,e.bi_valid=0):8<=e.bi_valid&&(e.pending_buf[e.pending++]=255&e.bi_buf,e.bi_buf>>=8,e.bi_valid-=8)}},{"../utils/common":3}],15:[function(t,e,a){"use strict";e.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}},{}],"/":[function(t,e,a){"use strict";var i={};(0,t("./lib/utils/common").assign)(i,t("./lib/deflate"),t("./lib/inflate"),t("./lib/zlib/constants")),e.exports=i},{"./lib/deflate":1,"./lib/inflate":2,"./lib/utils/common":3,"./lib/zlib/constants":6}]},{},[])("/")});
diff --git a/js/libs/pixi.js b/js/libs/pixi.js
new file mode 100644
index 0000000..e9d11bc
--- /dev/null
+++ b/js/libs/pixi.js
@@ -0,0 +1,41996 @@
+/*!
+ * pixi.js - v5.3.12
+ * Compiled Wed, 23 Mar 2022 18:38:07 UTC
+ *
+ * pixi.js is licensed under the MIT License.
+ * http://www.opensource.org/licenses/mit-license
+ */
+var PIXI = (function (exports) {
+ 'use strict';
+
+ var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
+
+ function commonjsRequire () {
+ throw new Error('Dynamic requires are not currently supported by rollup-plugin-commonjs');
+ }
+
+ function unwrapExports (x) {
+ return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
+ }
+
+ function createCommonjsModule(fn, module) {
+ return module = { exports: {} }, fn(module, module.exports), module.exports;
+ }
+
+ function getCjsExportFromNamespace (n) {
+ return n && n['default'] || n;
+ }
+
+ var promise = createCommonjsModule(function (module, exports) {
+ (function(global){
+
+ //
+ // Check for native Promise and it has correct interface
+ //
+
+ var NativePromise = global['Promise'];
+ var nativePromiseSupported =
+ NativePromise &&
+ // Some of these methods are missing from
+ // Firefox/Chrome experimental implementations
+ 'resolve' in NativePromise &&
+ 'reject' in NativePromise &&
+ 'all' in NativePromise &&
+ 'race' in NativePromise &&
+ // Older version of the spec had a resolver object
+ // as the arg rather than a function
+ (function(){
+ var resolve;
+ new NativePromise(function(r){ resolve = r; });
+ return typeof resolve === 'function';
+ })();
+
+
+ //
+ // export if necessary
+ //
+
+ if ('object' !== 'undefined' && exports)
+ {
+ // node.js
+ exports.Promise = nativePromiseSupported ? NativePromise : Promise;
+ exports.Polyfill = Promise;
+ }
+ else
+ {
+ // AMD
+ if (typeof undefined == 'function' && undefined.amd)
+ {
+ undefined(function(){
+ return nativePromiseSupported ? NativePromise : Promise;
+ });
+ }
+ else
+ {
+ // in browser add to global
+ if (!nativePromiseSupported)
+ { global['Promise'] = Promise; }
+ }
+ }
+
+
+ //
+ // Polyfill
+ //
+
+ var PENDING = 'pending';
+ var SEALED = 'sealed';
+ var FULFILLED = 'fulfilled';
+ var REJECTED = 'rejected';
+ var NOOP = function(){};
+
+ function isArray(value) {
+ return Object.prototype.toString.call(value) === '[object Array]';
+ }
+
+ // async calls
+ var asyncSetTimer = typeof setImmediate !== 'undefined' ? setImmediate : setTimeout;
+ var asyncQueue = [];
+ var asyncTimer;
+
+ function asyncFlush(){
+ // run promise callbacks
+ for (var i = 0; i < asyncQueue.length; i++)
+ { asyncQueue[i][0](asyncQueue[i][1]); }
+
+ // reset async asyncQueue
+ asyncQueue = [];
+ asyncTimer = false;
+ }
+
+ function asyncCall(callback, arg){
+ asyncQueue.push([callback, arg]);
+
+ if (!asyncTimer)
+ {
+ asyncTimer = true;
+ asyncSetTimer(asyncFlush, 0);
+ }
+ }
+
+
+ function invokeResolver(resolver, promise) {
+ function resolvePromise(value) {
+ resolve(promise, value);
+ }
+
+ function rejectPromise(reason) {
+ reject(promise, reason);
+ }
+
+ try {
+ resolver(resolvePromise, rejectPromise);
+ } catch(e) {
+ rejectPromise(e);
+ }
+ }
+
+ function invokeCallback(subscriber){
+ var owner = subscriber.owner;
+ var settled = owner.state_;
+ var value = owner.data_;
+ var callback = subscriber[settled];
+ var promise = subscriber.then;
+
+ if (typeof callback === 'function')
+ {
+ settled = FULFILLED;
+ try {
+ value = callback(value);
+ } catch(e) {
+ reject(promise, e);
+ }
+ }
+
+ if (!handleThenable(promise, value))
+ {
+ if (settled === FULFILLED)
+ { resolve(promise, value); }
+
+ if (settled === REJECTED)
+ { reject(promise, value); }
+ }
+ }
+
+ function handleThenable(promise, value) {
+ var resolved;
+
+ try {
+ if (promise === value)
+ { throw new TypeError('A promises callback cannot return that same promise.'); }
+
+ if (value && (typeof value === 'function' || typeof value === 'object'))
+ {
+ var then = value.then; // then should be retrived only once
+
+ if (typeof then === 'function')
+ {
+ then.call(value, function(val){
+ if (!resolved)
+ {
+ resolved = true;
+
+ if (value !== val)
+ { resolve(promise, val); }
+ else
+ { fulfill(promise, val); }
+ }
+ }, function(reason){
+ if (!resolved)
+ {
+ resolved = true;
+
+ reject(promise, reason);
+ }
+ });
+
+ return true;
+ }
+ }
+ } catch (e) {
+ if (!resolved)
+ { reject(promise, e); }
+
+ return true;
+ }
+
+ return false;
+ }
+
+ function resolve(promise, value){
+ if (promise === value || !handleThenable(promise, value))
+ { fulfill(promise, value); }
+ }
+
+ function fulfill(promise, value){
+ if (promise.state_ === PENDING)
+ {
+ promise.state_ = SEALED;
+ promise.data_ = value;
+
+ asyncCall(publishFulfillment, promise);
+ }
+ }
+
+ function reject(promise, reason){
+ if (promise.state_ === PENDING)
+ {
+ promise.state_ = SEALED;
+ promise.data_ = reason;
+
+ asyncCall(publishRejection, promise);
+ }
+ }
+
+ function publish(promise) {
+ var callbacks = promise.then_;
+ promise.then_ = undefined;
+
+ for (var i = 0; i < callbacks.length; i++) {
+ invokeCallback(callbacks[i]);
+ }
+ }
+
+ function publishFulfillment(promise){
+ promise.state_ = FULFILLED;
+ publish(promise);
+ }
+
+ function publishRejection(promise){
+ promise.state_ = REJECTED;
+ publish(promise);
+ }
+
+ /**
+ * @class
+ */
+ function Promise(resolver){
+ if (typeof resolver !== 'function')
+ { throw new TypeError('Promise constructor takes a function argument'); }
+
+ if (this instanceof Promise === false)
+ { throw new TypeError('Failed to construct \'Promise\': Please use the \'new\' operator, this object constructor cannot be called as a function.'); }
+
+ this.then_ = [];
+
+ invokeResolver(resolver, this);
+ }
+
+ Promise.prototype = {
+ constructor: Promise,
+
+ state_: PENDING,
+ then_: null,
+ data_: undefined,
+
+ then: function(onFulfillment, onRejection){
+ var subscriber = {
+ owner: this,
+ then: new this.constructor(NOOP),
+ fulfilled: onFulfillment,
+ rejected: onRejection
+ };
+
+ if (this.state_ === FULFILLED || this.state_ === REJECTED)
+ {
+ // already resolved, call callback async
+ asyncCall(invokeCallback, subscriber);
+ }
+ else
+ {
+ // subscribe
+ this.then_.push(subscriber);
+ }
+
+ return subscriber.then;
+ },
+
+ 'catch': function(onRejection) {
+ return this.then(null, onRejection);
+ }
+ };
+
+ Promise.all = function(promises){
+ var Class = this;
+
+ if (!isArray(promises))
+ { throw new TypeError('You must pass an array to Promise.all().'); }
+
+ return new Class(function(resolve, reject){
+ var results = [];
+ var remaining = 0;
+
+ function resolver(index){
+ remaining++;
+ return function(value){
+ results[index] = value;
+ if (!--remaining)
+ { resolve(results); }
+ };
+ }
+
+ for (var i = 0, promise; i < promises.length; i++)
+ {
+ promise = promises[i];
+
+ if (promise && typeof promise.then === 'function')
+ { promise.then(resolver(i), reject); }
+ else
+ { results[i] = promise; }
+ }
+
+ if (!remaining)
+ { resolve(results); }
+ });
+ };
+
+ Promise.race = function(promises){
+ var Class = this;
+
+ if (!isArray(promises))
+ { throw new TypeError('You must pass an array to Promise.race().'); }
+
+ return new Class(function(resolve, reject) {
+ for (var i = 0, promise; i < promises.length; i++)
+ {
+ promise = promises[i];
+
+ if (promise && typeof promise.then === 'function')
+ { promise.then(resolve, reject); }
+ else
+ { resolve(promise); }
+ }
+ });
+ };
+
+ Promise.resolve = function(value){
+ var Class = this;
+
+ if (value && typeof value === 'object' && value.constructor === Class)
+ { return value; }
+
+ return new Class(function(resolve){
+ resolve(value);
+ });
+ };
+
+ Promise.reject = function(reason){
+ var Class = this;
+
+ return new Class(function(resolve, reject){
+ reject(reason);
+ });
+ };
+
+ })(typeof window != 'undefined' ? window : typeof commonjsGlobal != 'undefined' ? commonjsGlobal : typeof self != 'undefined' ? self : commonjsGlobal);
+ });
+ var promise_1 = promise.Promise;
+ var promise_2 = promise.Polyfill;
+
+ /*
+ object-assign
+ (c) Sindre Sorhus
+ @license MIT
+ */
+
+ 'use strict';
+ /* eslint-disable no-unused-vars */
+ var getOwnPropertySymbols = Object.getOwnPropertySymbols;
+ var hasOwnProperty = Object.prototype.hasOwnProperty;
+ var propIsEnumerable = Object.prototype.propertyIsEnumerable;
+
+ function toObject(val) {
+ if (val === null || val === undefined) {
+ throw new TypeError('Object.assign cannot be called with null or undefined');
+ }
+
+ return Object(val);
+ }
+
+ function shouldUseNative() {
+ try {
+ if (!Object.assign) {
+ return false;
+ }
+
+ // Detect buggy property enumeration order in older V8 versions.
+
+ // https://bugs.chromium.org/p/v8/issues/detail?id=4118
+ var test1 = new String('abc'); // eslint-disable-line no-new-wrappers
+ test1[5] = 'de';
+ if (Object.getOwnPropertyNames(test1)[0] === '5') {
+ return false;
+ }
+
+ // https://bugs.chromium.org/p/v8/issues/detail?id=3056
+ var test2 = {};
+ for (var i = 0; i < 10; i++) {
+ test2['_' + String.fromCharCode(i)] = i;
+ }
+ var order2 = Object.getOwnPropertyNames(test2).map(function (n) {
+ return test2[n];
+ });
+ if (order2.join('') !== '0123456789') {
+ return false;
+ }
+
+ // https://bugs.chromium.org/p/v8/issues/detail?id=3056
+ var test3 = {};
+ 'abcdefghijklmnopqrst'.split('').forEach(function (letter) {
+ test3[letter] = letter;
+ });
+ if (Object.keys(Object.assign({}, test3)).join('') !==
+ 'abcdefghijklmnopqrst') {
+ return false;
+ }
+
+ return true;
+ } catch (err) {
+ // We don't expect any of the above to throw, but better to be safe.
+ return false;
+ }
+ }
+
+ var objectAssign = shouldUseNative() ? Object.assign : function (target, source) {
+ var arguments$1 = arguments;
+
+ var from;
+ var to = toObject(target);
+ var symbols;
+
+ for (var s = 1; s < arguments.length; s++) {
+ from = Object(arguments$1[s]);
+
+ for (var key in from) {
+ if (hasOwnProperty.call(from, key)) {
+ to[key] = from[key];
+ }
+ }
+
+ if (getOwnPropertySymbols) {
+ symbols = getOwnPropertySymbols(from);
+ for (var i = 0; i < symbols.length; i++) {
+ if (propIsEnumerable.call(from, symbols[i])) {
+ to[symbols[i]] = from[symbols[i]];
+ }
+ }
+ }
+ }
+
+ return to;
+ };
+
+ /*!
+ * @pixi/polyfill - v5.3.12
+ * Compiled Wed, 23 Mar 2022 18:38:07 UTC
+ *
+ * @pixi/polyfill is licensed under the MIT License.
+ * http://www.opensource.org/licenses/mit-license
+ */
+
+ // Support for IE 9 - 11 which does not include Promises
+ if (!window.Promise) {
+ window.Promise = promise_2;
+ }
+
+ // References:
+ if (!Object.assign) {
+ Object.assign = objectAssign;
+ }
+
+ // References:
+ // http://paulirish.com/2011/requestanimationframe-for-smart-animating/
+ // https://gist.github.com/1579671
+ // http://updates.html5rocks.com/2012/05/requestAnimationFrame-API-now-with-sub-millisecond-precision
+ // https://gist.github.com/timhall/4078614
+ // https://github.com/Financial-Times/polyfill-service/tree/master/polyfills/requestAnimationFrame
+ // Expected to be used with Browserfiy
+ // Browserify automatically detects the use of `global` and passes the
+ // correct reference of `global`, `self`, and finally `window`
+ var ONE_FRAME_TIME = 16;
+ // Date.now
+ if (!(Date.now && Date.prototype.getTime)) {
+ Date.now = function now() {
+ return new Date().getTime();
+ };
+ }
+ // performance.now
+ if (!(window.performance && window.performance.now)) {
+ var startTime_1 = Date.now();
+ if (!window.performance) {
+ window.performance = {};
+ }
+ window.performance.now = function () { return Date.now() - startTime_1; };
+ }
+ // requestAnimationFrame
+ var lastTime = Date.now();
+ var vendors = ['ms', 'moz', 'webkit', 'o'];
+ for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
+ var p = vendors[x];
+ window.requestAnimationFrame = window[p + "RequestAnimationFrame"];
+ window.cancelAnimationFrame = window[p + "CancelAnimationFrame"]
+ || window[p + "CancelRequestAnimationFrame"];
+ }
+ if (!window.requestAnimationFrame) {
+ window.requestAnimationFrame = function (callback) {
+ if (typeof callback !== 'function') {
+ throw new TypeError(callback + "is not a function");
+ }
+ var currentTime = Date.now();
+ var delay = ONE_FRAME_TIME + lastTime - currentTime;
+ if (delay < 0) {
+ delay = 0;
+ }
+ lastTime = currentTime;
+ return window.setTimeout(function () {
+ lastTime = Date.now();
+ callback(performance.now());
+ }, delay);
+ };
+ }
+ if (!window.cancelAnimationFrame) {
+ window.cancelAnimationFrame = function (id) { return clearTimeout(id); };
+ }
+
+ // References:
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign
+ if (!Math.sign) {
+ Math.sign = function mathSign(x) {
+ x = Number(x);
+ if (x === 0 || isNaN(x)) {
+ return x;
+ }
+ return x > 0 ? 1 : -1;
+ };
+ }
+
+ // References:
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger
+ if (!Number.isInteger) {
+ Number.isInteger = function numberIsInteger(value) {
+ return typeof value === 'number' && isFinite(value) && Math.floor(value) === value;
+ };
+ }
+
+ if (!window.ArrayBuffer) {
+ window.ArrayBuffer = Array;
+ }
+ if (!window.Float32Array) {
+ window.Float32Array = Array;
+ }
+ if (!window.Uint32Array) {
+ window.Uint32Array = Array;
+ }
+ if (!window.Uint16Array) {
+ window.Uint16Array = Array;
+ }
+ if (!window.Uint8Array) {
+ window.Uint8Array = Array;
+ }
+ if (!window.Int32Array) {
+ window.Int32Array = Array;
+ }
+
+ var appleIphone = /iPhone/i;
+ var appleIpod = /iPod/i;
+ var appleTablet = /iPad/i;
+ var appleUniversal = /\biOS-universal(?:.+)Mac\b/i;
+ var androidPhone = /\bAndroid(?:.+)Mobile\b/i;
+ var androidTablet = /Android/i;
+ var amazonPhone = /(?:SD4930UR|\bSilk(?:.+)Mobile\b)/i;
+ var amazonTablet = /Silk/i;
+ var windowsPhone = /Windows Phone/i;
+ var windowsTablet = /\bWindows(?:.+)ARM\b/i;
+ var otherBlackBerry = /BlackBerry/i;
+ var otherBlackBerry10 = /BB10/i;
+ var otherOpera = /Opera Mini/i;
+ var otherChrome = /\b(CriOS|Chrome)(?:.+)Mobile/i;
+ var otherFirefox = /Mobile(?:.+)Firefox\b/i;
+ var isAppleTabletOnIos13 = function (navigator) {
+ return (typeof navigator !== 'undefined' &&
+ navigator.platform === 'MacIntel' &&
+ typeof navigator.maxTouchPoints === 'number' &&
+ navigator.maxTouchPoints > 1 &&
+ typeof MSStream === 'undefined');
+ };
+ function createMatch(userAgent) {
+ return function (regex) { return regex.test(userAgent); };
+ }
+ function isMobile(param) {
+ var nav = {
+ userAgent: '',
+ platform: '',
+ maxTouchPoints: 0
+ };
+ if (!param && typeof navigator !== 'undefined') {
+ nav = {
+ userAgent: navigator.userAgent,
+ platform: navigator.platform,
+ maxTouchPoints: navigator.maxTouchPoints || 0
+ };
+ }
+ else if (typeof param === 'string') {
+ nav.userAgent = param;
+ }
+ else if (param && param.userAgent) {
+ nav = {
+ userAgent: param.userAgent,
+ platform: param.platform,
+ maxTouchPoints: param.maxTouchPoints || 0
+ };
+ }
+ var userAgent = nav.userAgent;
+ var tmp = userAgent.split('[FBAN');
+ if (typeof tmp[1] !== 'undefined') {
+ userAgent = tmp[0];
+ }
+ tmp = userAgent.split('Twitter');
+ if (typeof tmp[1] !== 'undefined') {
+ userAgent = tmp[0];
+ }
+ var match = createMatch(userAgent);
+ var result = {
+ apple: {
+ phone: match(appleIphone) && !match(windowsPhone),
+ ipod: match(appleIpod),
+ tablet: !match(appleIphone) &&
+ (match(appleTablet) || isAppleTabletOnIos13(nav)) &&
+ !match(windowsPhone),
+ universal: match(appleUniversal),
+ device: (match(appleIphone) ||
+ match(appleIpod) ||
+ match(appleTablet) ||
+ match(appleUniversal) ||
+ isAppleTabletOnIos13(nav)) &&
+ !match(windowsPhone)
+ },
+ amazon: {
+ phone: match(amazonPhone),
+ tablet: !match(amazonPhone) && match(amazonTablet),
+ device: match(amazonPhone) || match(amazonTablet)
+ },
+ android: {
+ phone: (!match(windowsPhone) && match(amazonPhone)) ||
+ (!match(windowsPhone) && match(androidPhone)),
+ tablet: !match(windowsPhone) &&
+ !match(amazonPhone) &&
+ !match(androidPhone) &&
+ (match(amazonTablet) || match(androidTablet)),
+ device: (!match(windowsPhone) &&
+ (match(amazonPhone) ||
+ match(amazonTablet) ||
+ match(androidPhone) ||
+ match(androidTablet))) ||
+ match(/\bokhttp\b/i)
+ },
+ windows: {
+ phone: match(windowsPhone),
+ tablet: match(windowsTablet),
+ device: match(windowsPhone) || match(windowsTablet)
+ },
+ other: {
+ blackberry: match(otherBlackBerry),
+ blackberry10: match(otherBlackBerry10),
+ opera: match(otherOpera),
+ firefox: match(otherFirefox),
+ chrome: match(otherChrome),
+ device: match(otherBlackBerry) ||
+ match(otherBlackBerry10) ||
+ match(otherOpera) ||
+ match(otherFirefox) ||
+ match(otherChrome)
+ },
+ any: false,
+ phone: false,
+ tablet: false
+ };
+ result.any =
+ result.apple.device ||
+ result.android.device ||
+ result.windows.device ||
+ result.other.device;
+ result.phone =
+ result.apple.phone || result.android.phone || result.windows.phone;
+ result.tablet =
+ result.apple.tablet || result.android.tablet || result.windows.tablet;
+ return result;
+ }
+
+ /*!
+ * @pixi/settings - v5.3.12
+ * Compiled Wed, 23 Mar 2022 18:38:07 UTC
+ *
+ * @pixi/settings is licensed under the MIT License.
+ * http://www.opensource.org/licenses/mit-license
+ */
+
+ // The ESM/CJS versions of ismobilejs only
+ var isMobile$1 = isMobile(window.navigator);
+
+ /**
+ * The maximum recommended texture units to use.
+ * In theory the bigger the better, and for desktop we'll use as many as we can.
+ * But some mobile devices slow down if there is to many branches in the shader.
+ * So in practice there seems to be a sweet spot size that varies depending on the device.
+ *
+ * In v4, all mobile devices were limited to 4 texture units because for this.
+ * In v5, we allow all texture units to be used on modern Apple or Android devices.
+ *
+ * @private
+ * @param {number} max
+ * @returns {number}
+ */
+ function maxRecommendedTextures(max) {
+ var allowMax = true;
+ if (isMobile$1.tablet || isMobile$1.phone) {
+ if (isMobile$1.apple.device) {
+ var match = (navigator.userAgent).match(/OS (\d+)_(\d+)?/);
+ if (match) {
+ var majorVersion = parseInt(match[1], 10);
+ // Limit texture units on devices below iOS 11, which will be older hardware
+ if (majorVersion < 11) {
+ allowMax = false;
+ }
+ }
+ }
+ if (isMobile$1.android.device) {
+ var match = (navigator.userAgent).match(/Android\s([0-9.]*)/);
+ if (match) {
+ var majorVersion = parseInt(match[1], 10);
+ // Limit texture units on devices below Android 7 (Nougat), which will be older hardware
+ if (majorVersion < 7) {
+ allowMax = false;
+ }
+ }
+ }
+ }
+ return allowMax ? max : 4;
+ }
+
+ /**
+ * Uploading the same buffer multiple times in a single frame can cause performance issues.
+ * Apparent on iOS so only check for that at the moment
+ * This check may become more complex if this issue pops up elsewhere.
+ *
+ * @private
+ * @returns {boolean}
+ */
+ function canUploadSameBuffer() {
+ return !isMobile$1.apple.device;
+ }
+
+ /**
+ * User's customizable globals for overriding the default PIXI settings, such
+ * as a renderer's default resolution, framerate, float precision, etc.
+ * @example
+ * // Use the native window resolution as the default resolution
+ * // will support high-density displays when rendering
+ * PIXI.settings.RESOLUTION = window.devicePixelRatio;
+ *
+ * // Disable interpolation when scaling, will make texture be pixelated
+ * PIXI.settings.SCALE_MODE = PIXI.SCALE_MODES.NEAREST;
+ * @namespace PIXI.settings
+ */
+ var settings = {
+ /**
+ * If set to true WebGL will attempt make textures mimpaped by default.
+ * Mipmapping will only succeed if the base texture uploaded has power of two dimensions.
+ *
+ * @static
+ * @name MIPMAP_TEXTURES
+ * @memberof PIXI.settings
+ * @type {PIXI.MIPMAP_MODES}
+ * @default PIXI.MIPMAP_MODES.POW2
+ */
+ MIPMAP_TEXTURES: 1,
+ /**
+ * Default anisotropic filtering level of textures.
+ * Usually from 0 to 16
+ *
+ * @static
+ * @name ANISOTROPIC_LEVEL
+ * @memberof PIXI.settings
+ * @type {number}
+ * @default 0
+ */
+ ANISOTROPIC_LEVEL: 0,
+ /**
+ * Default resolution / device pixel ratio of the renderer.
+ *
+ * @static
+ * @name RESOLUTION
+ * @memberof PIXI.settings
+ * @type {number}
+ * @default 1
+ */
+ RESOLUTION: 1,
+ /**
+ * Default filter resolution.
+ *
+ * @static
+ * @name FILTER_RESOLUTION
+ * @memberof PIXI.settings
+ * @type {number}
+ * @default 1
+ */
+ FILTER_RESOLUTION: 1,
+ /**
+ * The maximum textures that this device supports.
+ *
+ * @static
+ * @name SPRITE_MAX_TEXTURES
+ * @memberof PIXI.settings
+ * @type {number}
+ * @default 32
+ */
+ SPRITE_MAX_TEXTURES: maxRecommendedTextures(32),
+ // TODO: maybe change to SPRITE.BATCH_SIZE: 2000
+ // TODO: maybe add PARTICLE.BATCH_SIZE: 15000
+ /**
+ * The default sprite batch size.
+ *
+ * The default aims to balance desktop and mobile devices.
+ *
+ * @static
+ * @name SPRITE_BATCH_SIZE
+ * @memberof PIXI.settings
+ * @type {number}
+ * @default 4096
+ */
+ SPRITE_BATCH_SIZE: 4096,
+ /**
+ * The default render options if none are supplied to {@link PIXI.Renderer}
+ * or {@link PIXI.CanvasRenderer}.
+ *
+ * @static
+ * @name RENDER_OPTIONS
+ * @memberof PIXI.settings
+ * @type {object}
+ * @property {HTMLCanvasElement} view=null
+ * @property {number} resolution=1
+ * @property {boolean} antialias=false
+ * @property {boolean} autoDensity=false
+ * @property {boolean} transparent=false
+ * @property {number} backgroundColor=0x000000
+ * @property {boolean} clearBeforeRender=true
+ * @property {boolean} preserveDrawingBuffer=false
+ * @property {number} width=800
+ * @property {number} height=600
+ * @property {boolean} legacy=false
+ */
+ RENDER_OPTIONS: {
+ view: null,
+ antialias: false,
+ autoDensity: false,
+ transparent: false,
+ backgroundColor: 0x000000,
+ clearBeforeRender: true,
+ preserveDrawingBuffer: false,
+ width: 800,
+ height: 600,
+ legacy: false,
+ },
+ /**
+ * Default Garbage Collection mode.
+ *
+ * @static
+ * @name GC_MODE
+ * @memberof PIXI.settings
+ * @type {PIXI.GC_MODES}
+ * @default PIXI.GC_MODES.AUTO
+ */
+ GC_MODE: 0,
+ /**
+ * Default Garbage Collection max idle.
+ *
+ * @static
+ * @name GC_MAX_IDLE
+ * @memberof PIXI.settings
+ * @type {number}
+ * @default 3600
+ */
+ GC_MAX_IDLE: 60 * 60,
+ /**
+ * Default Garbage Collection maximum check count.
+ *
+ * @static
+ * @name GC_MAX_CHECK_COUNT
+ * @memberof PIXI.settings
+ * @type {number}
+ * @default 600
+ */
+ GC_MAX_CHECK_COUNT: 60 * 10,
+ /**
+ * Default wrap modes that are supported by pixi.
+ *
+ * @static
+ * @name WRAP_MODE
+ * @memberof PIXI.settings
+ * @type {PIXI.WRAP_MODES}
+ * @default PIXI.WRAP_MODES.CLAMP
+ */
+ WRAP_MODE: 33071,
+ /**
+ * Default scale mode for textures.
+ *
+ * @static
+ * @name SCALE_MODE
+ * @memberof PIXI.settings
+ * @type {PIXI.SCALE_MODES}
+ * @default PIXI.SCALE_MODES.LINEAR
+ */
+ SCALE_MODE: 1,
+ /**
+ * Default specify float precision in vertex shader.
+ *
+ * @static
+ * @name PRECISION_VERTEX
+ * @memberof PIXI.settings
+ * @type {PIXI.PRECISION}
+ * @default PIXI.PRECISION.HIGH
+ */
+ PRECISION_VERTEX: 'highp',
+ /**
+ * Default specify float precision in fragment shader.
+ * iOS is best set at highp due to https://github.com/pixijs/pixi.js/issues/3742
+ *
+ * @static
+ * @name PRECISION_FRAGMENT
+ * @memberof PIXI.settings
+ * @type {PIXI.PRECISION}
+ * @default PIXI.PRECISION.MEDIUM
+ */
+ PRECISION_FRAGMENT: isMobile$1.apple.device ? 'highp' : 'mediump',
+ /**
+ * Can we upload the same buffer in a single frame?
+ *
+ * @static
+ * @name CAN_UPLOAD_SAME_BUFFER
+ * @memberof PIXI.settings
+ * @type {boolean}
+ */
+ CAN_UPLOAD_SAME_BUFFER: canUploadSameBuffer(),
+ /**
+ * Enables bitmap creation before image load. This feature is experimental.
+ *
+ * @static
+ * @name CREATE_IMAGE_BITMAP
+ * @memberof PIXI.settings
+ * @type {boolean}
+ * @default false
+ */
+ CREATE_IMAGE_BITMAP: false,
+ /**
+ * If true PixiJS will Math.floor() x/y values when rendering, stopping pixel interpolation.
+ * Advantages can include sharper image quality (like text) and faster rendering on canvas.
+ * The main disadvantage is movement of objects may appear less smooth.
+ *
+ * @static
+ * @constant
+ * @memberof PIXI.settings
+ * @type {boolean}
+ * @default false
+ */
+ ROUND_PIXELS: false,
+ };
+
+ var eventemitter3 = createCommonjsModule(function (module) {
+ 'use strict';
+
+ var has = Object.prototype.hasOwnProperty
+ , prefix = '~';
+
+ /**
+ * Constructor to create a storage for our `EE` objects.
+ * An `Events` instance is a plain object whose properties are event names.
+ *
+ * @constructor
+ * @private
+ */
+ function Events() {}
+
+ //
+ // We try to not inherit from `Object.prototype`. In some engines creating an
+ // instance in this way is faster than calling `Object.create(null)` directly.
+ // If `Object.create(null)` is not supported we prefix the event names with a
+ // character to make sure that the built-in object properties are not
+ // overridden or used as an attack vector.
+ //
+ if (Object.create) {
+ Events.prototype = Object.create(null);
+
+ //
+ // This hack is needed because the `__proto__` property is still inherited in
+ // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.
+ //
+ if (!new Events().__proto__) { prefix = false; }
+ }
+
+ /**
+ * Representation of a single event listener.
+ *
+ * @param {Function} fn The listener function.
+ * @param {*} context The context to invoke the listener with.
+ * @param {Boolean} [once=false] Specify if the listener is a one-time listener.
+ * @constructor
+ * @private
+ */
+ function EE(fn, context, once) {
+ this.fn = fn;
+ this.context = context;
+ this.once = once || false;
+ }
+
+ /**
+ * Add a listener for a given event.
+ *
+ * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.
+ * @param {(String|Symbol)} event The event name.
+ * @param {Function} fn The listener function.
+ * @param {*} context The context to invoke the listener with.
+ * @param {Boolean} once Specify if the listener is a one-time listener.
+ * @returns {EventEmitter}
+ * @private
+ */
+ function addListener(emitter, event, fn, context, once) {
+ if (typeof fn !== 'function') {
+ throw new TypeError('The listener must be a function');
+ }
+
+ var listener = new EE(fn, context || emitter, once)
+ , evt = prefix ? prefix + event : event;
+
+ if (!emitter._events[evt]) { emitter._events[evt] = listener, emitter._eventsCount++; }
+ else if (!emitter._events[evt].fn) { emitter._events[evt].push(listener); }
+ else { emitter._events[evt] = [emitter._events[evt], listener]; }
+
+ return emitter;
+ }
+
+ /**
+ * Clear event by name.
+ *
+ * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.
+ * @param {(String|Symbol)} evt The Event name.
+ * @private
+ */
+ function clearEvent(emitter, evt) {
+ if (--emitter._eventsCount === 0) { emitter._events = new Events(); }
+ else { delete emitter._events[evt]; }
+ }
+
+ /**
+ * Minimal `EventEmitter` interface that is molded against the Node.js
+ * `EventEmitter` interface.
+ *
+ * @constructor
+ * @public
+ */
+ function EventEmitter() {
+ this._events = new Events();
+ this._eventsCount = 0;
+ }
+
+ /**
+ * Return an array listing the events for which the emitter has registered
+ * listeners.
+ *
+ * @returns {Array}
+ * @public
+ */
+ EventEmitter.prototype.eventNames = function eventNames() {
+ var names = []
+ , events
+ , name;
+
+ if (this._eventsCount === 0) { return names; }
+
+ for (name in (events = this._events)) {
+ if (has.call(events, name)) { names.push(prefix ? name.slice(1) : name); }
+ }
+
+ if (Object.getOwnPropertySymbols) {
+ return names.concat(Object.getOwnPropertySymbols(events));
+ }
+
+ return names;
+ };
+
+ /**
+ * Return the listeners registered for a given event.
+ *
+ * @param {(String|Symbol)} event The event name.
+ * @returns {Array} The registered listeners.
+ * @public
+ */
+ EventEmitter.prototype.listeners = function listeners(event) {
+ var evt = prefix ? prefix + event : event
+ , handlers = this._events[evt];
+
+ if (!handlers) { return []; }
+ if (handlers.fn) { return [handlers.fn]; }
+
+ for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {
+ ee[i] = handlers[i].fn;
+ }
+
+ return ee;
+ };
+
+ /**
+ * Return the number of listeners listening to a given event.
+ *
+ * @param {(String|Symbol)} event The event name.
+ * @returns {Number} The number of listeners.
+ * @public
+ */
+ EventEmitter.prototype.listenerCount = function listenerCount(event) {
+ var evt = prefix ? prefix + event : event
+ , listeners = this._events[evt];
+
+ if (!listeners) { return 0; }
+ if (listeners.fn) { return 1; }
+ return listeners.length;
+ };
+
+ /**
+ * Calls each of the listeners registered for a given event.
+ *
+ * @param {(String|Symbol)} event The event name.
+ * @returns {Boolean} `true` if the event had listeners, else `false`.
+ * @public
+ */
+ EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {
+ var arguments$1 = arguments;
+
+ var evt = prefix ? prefix + event : event;
+
+ if (!this._events[evt]) { return false; }
+
+ var listeners = this._events[evt]
+ , len = arguments.length
+ , args
+ , i;
+
+ if (listeners.fn) {
+ if (listeners.once) { this.removeListener(event, listeners.fn, undefined, true); }
+
+ switch (len) {
+ case 1: return listeners.fn.call(listeners.context), true;
+ case 2: return listeners.fn.call(listeners.context, a1), true;
+ case 3: return listeners.fn.call(listeners.context, a1, a2), true;
+ case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;
+ case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;
+ case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;
+ }
+
+ for (i = 1, args = new Array(len -1); i < len; i++) {
+ args[i - 1] = arguments$1[i];
+ }
+
+ listeners.fn.apply(listeners.context, args);
+ } else {
+ var length = listeners.length
+ , j;
+
+ for (i = 0; i < length; i++) {
+ if (listeners[i].once) { this.removeListener(event, listeners[i].fn, undefined, true); }
+
+ switch (len) {
+ case 1: listeners[i].fn.call(listeners[i].context); break;
+ case 2: listeners[i].fn.call(listeners[i].context, a1); break;
+ case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;
+ case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;
+ default:
+ if (!args) { for (j = 1, args = new Array(len -1); j < len; j++) {
+ args[j - 1] = arguments$1[j];
+ } }
+
+ listeners[i].fn.apply(listeners[i].context, args);
+ }
+ }
+ }
+
+ return true;
+ };
+
+ /**
+ * Add a listener for a given event.
+ *
+ * @param {(String|Symbol)} event The event name.
+ * @param {Function} fn The listener function.
+ * @param {*} [context=this] The context to invoke the listener with.
+ * @returns {EventEmitter} `this`.
+ * @public
+ */
+ EventEmitter.prototype.on = function on(event, fn, context) {
+ return addListener(this, event, fn, context, false);
+ };
+
+ /**
+ * Add a one-time listener for a given event.
+ *
+ * @param {(String|Symbol)} event The event name.
+ * @param {Function} fn The listener function.
+ * @param {*} [context=this] The context to invoke the listener with.
+ * @returns {EventEmitter} `this`.
+ * @public
+ */
+ EventEmitter.prototype.once = function once(event, fn, context) {
+ return addListener(this, event, fn, context, true);
+ };
+
+ /**
+ * Remove the listeners of a given event.
+ *
+ * @param {(String|Symbol)} event The event name.
+ * @param {Function} fn Only remove the listeners that match this function.
+ * @param {*} context Only remove the listeners that have this context.
+ * @param {Boolean} once Only remove one-time listeners.
+ * @returns {EventEmitter} `this`.
+ * @public
+ */
+ EventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {
+ var evt = prefix ? prefix + event : event;
+
+ if (!this._events[evt]) { return this; }
+ if (!fn) {
+ clearEvent(this, evt);
+ return this;
+ }
+
+ var listeners = this._events[evt];
+
+ if (listeners.fn) {
+ if (
+ listeners.fn === fn &&
+ (!once || listeners.once) &&
+ (!context || listeners.context === context)
+ ) {
+ clearEvent(this, evt);
+ }
+ } else {
+ for (var i = 0, events = [], length = listeners.length; i < length; i++) {
+ if (
+ listeners[i].fn !== fn ||
+ (once && !listeners[i].once) ||
+ (context && listeners[i].context !== context)
+ ) {
+ events.push(listeners[i]);
+ }
+ }
+
+ //
+ // Reset the array, or remove it completely if we have no more listeners.
+ //
+ if (events.length) { this._events[evt] = events.length === 1 ? events[0] : events; }
+ else { clearEvent(this, evt); }
+ }
+
+ return this;
+ };
+
+ /**
+ * Remove all listeners, or those of the specified event.
+ *
+ * @param {(String|Symbol)} [event] The event name.
+ * @returns {EventEmitter} `this`.
+ * @public
+ */
+ EventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {
+ var evt;
+
+ if (event) {
+ evt = prefix ? prefix + event : event;
+ if (this._events[evt]) { clearEvent(this, evt); }
+ } else {
+ this._events = new Events();
+ this._eventsCount = 0;
+ }
+
+ return this;
+ };
+
+ //
+ // Alias methods names because people roll like that.
+ //
+ EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
+ EventEmitter.prototype.addListener = EventEmitter.prototype.on;
+
+ //
+ // Expose the prefix.
+ //
+ EventEmitter.prefixed = prefix;
+
+ //
+ // Allow `EventEmitter` to be imported as module namespace.
+ //
+ EventEmitter.EventEmitter = EventEmitter;
+
+ //
+ // Expose the module.
+ //
+ if ('undefined' !== 'object') {
+ module.exports = EventEmitter;
+ }
+ });
+
+ 'use strict';
+
+ var earcut_1 = earcut;
+ var default_1 = earcut;
+
+ function earcut(data, holeIndices, dim) {
+
+ dim = dim || 2;
+
+ var hasHoles = holeIndices && holeIndices.length,
+ outerLen = hasHoles ? holeIndices[0] * dim : data.length,
+ outerNode = linkedList(data, 0, outerLen, dim, true),
+ triangles = [];
+
+ if (!outerNode || outerNode.next === outerNode.prev) { return triangles; }
+
+ var minX, minY, maxX, maxY, x, y, invSize;
+
+ if (hasHoles) { outerNode = eliminateHoles(data, holeIndices, outerNode, dim); }
+
+ // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox
+ if (data.length > 80 * dim) {
+ minX = maxX = data[0];
+ minY = maxY = data[1];
+
+ for (var i = dim; i < outerLen; i += dim) {
+ x = data[i];
+ y = data[i + 1];
+ if (x < minX) { minX = x; }
+ if (y < minY) { minY = y; }
+ if (x > maxX) { maxX = x; }
+ if (y > maxY) { maxY = y; }
+ }
+
+ // minX, minY and invSize are later used to transform coords into integers for z-order calculation
+ invSize = Math.max(maxX - minX, maxY - minY);
+ invSize = invSize !== 0 ? 1 / invSize : 0;
+ }
+
+ earcutLinked(outerNode, triangles, dim, minX, minY, invSize);
+
+ return triangles;
+ }
+
+ // create a circular doubly linked list from polygon points in the specified winding order
+ function linkedList(data, start, end, dim, clockwise) {
+ var i, last;
+
+ if (clockwise === (signedArea(data, start, end, dim) > 0)) {
+ for (i = start; i < end; i += dim) { last = insertNode(i, data[i], data[i + 1], last); }
+ } else {
+ for (i = end - dim; i >= start; i -= dim) { last = insertNode(i, data[i], data[i + 1], last); }
+ }
+
+ if (last && equals(last, last.next)) {
+ removeNode(last);
+ last = last.next;
+ }
+
+ return last;
+ }
+
+ // eliminate colinear or duplicate points
+ function filterPoints(start, end) {
+ if (!start) { return start; }
+ if (!end) { end = start; }
+
+ var p = start,
+ again;
+ do {
+ again = false;
+
+ if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {
+ removeNode(p);
+ p = end = p.prev;
+ if (p === p.next) { break; }
+ again = true;
+
+ } else {
+ p = p.next;
+ }
+ } while (again || p !== end);
+
+ return end;
+ }
+
+ // main ear slicing loop which triangulates a polygon (given as a linked list)
+ function earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) {
+ if (!ear) { return; }
+
+ // interlink polygon nodes in z-order
+ if (!pass && invSize) { indexCurve(ear, minX, minY, invSize); }
+
+ var stop = ear,
+ prev, next;
+
+ // iterate through ears, slicing them one by one
+ while (ear.prev !== ear.next) {
+ prev = ear.prev;
+ next = ear.next;
+
+ if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {
+ // cut off the triangle
+ triangles.push(prev.i / dim);
+ triangles.push(ear.i / dim);
+ triangles.push(next.i / dim);
+
+ removeNode(ear);
+
+ // skipping the next vertex leads to less sliver triangles
+ ear = next.next;
+ stop = next.next;
+
+ continue;
+ }
+
+ ear = next;
+
+ // if we looped through the whole remaining polygon and can't find any more ears
+ if (ear === stop) {
+ // try filtering points and slicing again
+ if (!pass) {
+ earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1);
+
+ // if this didn't work, try curing all small self-intersections locally
+ } else if (pass === 1) {
+ ear = cureLocalIntersections(filterPoints(ear), triangles, dim);
+ earcutLinked(ear, triangles, dim, minX, minY, invSize, 2);
+
+ // as a last resort, try splitting the remaining polygon into two
+ } else if (pass === 2) {
+ splitEarcut(ear, triangles, dim, minX, minY, invSize);
+ }
+
+ break;
+ }
+ }
+ }
+
+ // check whether a polygon node forms a valid ear with adjacent nodes
+ function isEar(ear) {
+ var a = ear.prev,
+ b = ear,
+ c = ear.next;
+
+ if (area(a, b, c) >= 0) { return false; } // reflex, can't be an ear
+
+ // now make sure we don't have other points inside the potential ear
+ var p = ear.next.next;
+
+ while (p !== ear.prev) {
+ if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&
+ area(p.prev, p, p.next) >= 0) { return false; }
+ p = p.next;
+ }
+
+ return true;
+ }
+
+ function isEarHashed(ear, minX, minY, invSize) {
+ var a = ear.prev,
+ b = ear,
+ c = ear.next;
+
+ if (area(a, b, c) >= 0) { return false; } // reflex, can't be an ear
+
+ // triangle bbox; min & max are calculated like this for speed
+ var minTX = a.x < b.x ? (a.x < c.x ? a.x : c.x) : (b.x < c.x ? b.x : c.x),
+ minTY = a.y < b.y ? (a.y < c.y ? a.y : c.y) : (b.y < c.y ? b.y : c.y),
+ maxTX = a.x > b.x ? (a.x > c.x ? a.x : c.x) : (b.x > c.x ? b.x : c.x),
+ maxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : (b.y > c.y ? b.y : c.y);
+
+ // z-order range for the current triangle bbox;
+ var minZ = zOrder(minTX, minTY, minX, minY, invSize),
+ maxZ = zOrder(maxTX, maxTY, minX, minY, invSize);
+
+ var p = ear.prevZ,
+ n = ear.nextZ;
+
+ // look for points inside the triangle in both directions
+ while (p && p.z >= minZ && n && n.z <= maxZ) {
+ if (p !== ear.prev && p !== ear.next &&
+ pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&
+ area(p.prev, p, p.next) >= 0) { return false; }
+ p = p.prevZ;
+
+ if (n !== ear.prev && n !== ear.next &&
+ pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) &&
+ area(n.prev, n, n.next) >= 0) { return false; }
+ n = n.nextZ;
+ }
+
+ // look for remaining points in decreasing z-order
+ while (p && p.z >= minZ) {
+ if (p !== ear.prev && p !== ear.next &&
+ pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&
+ area(p.prev, p, p.next) >= 0) { return false; }
+ p = p.prevZ;
+ }
+
+ // look for remaining points in increasing z-order
+ while (n && n.z <= maxZ) {
+ if (n !== ear.prev && n !== ear.next &&
+ pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) &&
+ area(n.prev, n, n.next) >= 0) { return false; }
+ n = n.nextZ;
+ }
+
+ return true;
+ }
+
+ // go through all polygon nodes and cure small local self-intersections
+ function cureLocalIntersections(start, triangles, dim) {
+ var p = start;
+ do {
+ var a = p.prev,
+ b = p.next.next;
+
+ if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {
+
+ triangles.push(a.i / dim);
+ triangles.push(p.i / dim);
+ triangles.push(b.i / dim);
+
+ // remove two nodes involved
+ removeNode(p);
+ removeNode(p.next);
+
+ p = start = b;
+ }
+ p = p.next;
+ } while (p !== start);
+
+ return filterPoints(p);
+ }
+
+ // try splitting polygon into two and triangulate them independently
+ function splitEarcut(start, triangles, dim, minX, minY, invSize) {
+ // look for a valid diagonal that divides the polygon into two
+ var a = start;
+ do {
+ var b = a.next.next;
+ while (b !== a.prev) {
+ if (a.i !== b.i && isValidDiagonal(a, b)) {
+ // split the polygon in two by the diagonal
+ var c = splitPolygon(a, b);
+
+ // filter colinear points around the cuts
+ a = filterPoints(a, a.next);
+ c = filterPoints(c, c.next);
+
+ // run earcut on each half
+ earcutLinked(a, triangles, dim, minX, minY, invSize);
+ earcutLinked(c, triangles, dim, minX, minY, invSize);
+ return;
+ }
+ b = b.next;
+ }
+ a = a.next;
+ } while (a !== start);
+ }
+
+ // link every hole into the outer loop, producing a single-ring polygon without holes
+ function eliminateHoles(data, holeIndices, outerNode, dim) {
+ var queue = [],
+ i, len, start, end, list;
+
+ for (i = 0, len = holeIndices.length; i < len; i++) {
+ start = holeIndices[i] * dim;
+ end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;
+ list = linkedList(data, start, end, dim, false);
+ if (list === list.next) { list.steiner = true; }
+ queue.push(getLeftmost(list));
+ }
+
+ queue.sort(compareX);
+
+ // process holes from left to right
+ for (i = 0; i < queue.length; i++) {
+ outerNode = eliminateHole(queue[i], outerNode);
+ outerNode = filterPoints(outerNode, outerNode.next);
+ }
+
+ return outerNode;
+ }
+
+ function compareX(a, b) {
+ return a.x - b.x;
+ }
+
+ // find a bridge between vertices that connects hole with an outer ring and and link it
+ function eliminateHole(hole, outerNode) {
+ var bridge = findHoleBridge(hole, outerNode);
+ if (!bridge) {
+ return outerNode;
+ }
+
+ var bridgeReverse = splitPolygon(bridge, hole);
+
+ // filter collinear points around the cuts
+ var filteredBridge = filterPoints(bridge, bridge.next);
+ filterPoints(bridgeReverse, bridgeReverse.next);
+
+ // Check if input node was removed by the filtering
+ return outerNode === bridge ? filteredBridge : outerNode;
+ }
+
+ // David Eberly's algorithm for finding a bridge between hole and outer polygon
+ function findHoleBridge(hole, outerNode) {
+ var p = outerNode,
+ hx = hole.x,
+ hy = hole.y,
+ qx = -Infinity,
+ m;
+
+ // find a segment intersected by a ray from the hole's leftmost point to the left;
+ // segment's endpoint with lesser x will be potential connection point
+ do {
+ if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {
+ var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);
+ if (x <= hx && x > qx) {
+ qx = x;
+ if (x === hx) {
+ if (hy === p.y) { return p; }
+ if (hy === p.next.y) { return p.next; }
+ }
+ m = p.x < p.next.x ? p : p.next;
+ }
+ }
+ p = p.next;
+ } while (p !== outerNode);
+
+ if (!m) { return null; }
+
+ if (hx === qx) { return m; } // hole touches outer segment; pick leftmost endpoint
+
+ // look for points inside the triangle of hole point, segment intersection and endpoint;
+ // if there are no points found, we have a valid connection;
+ // otherwise choose the point of the minimum angle with the ray as connection point
+
+ var stop = m,
+ mx = m.x,
+ my = m.y,
+ tanMin = Infinity,
+ tan;
+
+ p = m;
+
+ do {
+ if (hx >= p.x && p.x >= mx && hx !== p.x &&
+ pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {
+
+ tan = Math.abs(hy - p.y) / (hx - p.x); // tangential
+
+ if (locallyInside(p, hole) &&
+ (tan < tanMin || (tan === tanMin && (p.x > m.x || (p.x === m.x && sectorContainsSector(m, p)))))) {
+ m = p;
+ tanMin = tan;
+ }
+ }
+
+ p = p.next;
+ } while (p !== stop);
+
+ return m;
+ }
+
+ // whether sector in vertex m contains sector in vertex p in the same coordinates
+ function sectorContainsSector(m, p) {
+ return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0;
+ }
+
+ // interlink polygon nodes in z-order
+ function indexCurve(start, minX, minY, invSize) {
+ var p = start;
+ do {
+ if (p.z === null) { p.z = zOrder(p.x, p.y, minX, minY, invSize); }
+ p.prevZ = p.prev;
+ p.nextZ = p.next;
+ p = p.next;
+ } while (p !== start);
+
+ p.prevZ.nextZ = null;
+ p.prevZ = null;
+
+ sortLinked(p);
+ }
+
+ // Simon Tatham's linked list merge sort algorithm
+ // http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html
+ function sortLinked(list) {
+ var i, p, q, e, tail, numMerges, pSize, qSize,
+ inSize = 1;
+
+ do {
+ p = list;
+ list = null;
+ tail = null;
+ numMerges = 0;
+
+ while (p) {
+ numMerges++;
+ q = p;
+ pSize = 0;
+ for (i = 0; i < inSize; i++) {
+ pSize++;
+ q = q.nextZ;
+ if (!q) { break; }
+ }
+ qSize = inSize;
+
+ while (pSize > 0 || (qSize > 0 && q)) {
+
+ if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {
+ e = p;
+ p = p.nextZ;
+ pSize--;
+ } else {
+ e = q;
+ q = q.nextZ;
+ qSize--;
+ }
+
+ if (tail) { tail.nextZ = e; }
+ else { list = e; }
+
+ e.prevZ = tail;
+ tail = e;
+ }
+
+ p = q;
+ }
+
+ tail.nextZ = null;
+ inSize *= 2;
+
+ } while (numMerges > 1);
+
+ return list;
+ }
+
+ // z-order of a point given coords and inverse of the longer side of data bbox
+ function zOrder(x, y, minX, minY, invSize) {
+ // coords are transformed into non-negative 15-bit integer range
+ x = 32767 * (x - minX) * invSize;
+ y = 32767 * (y - minY) * invSize;
+
+ x = (x | (x << 8)) & 0x00FF00FF;
+ x = (x | (x << 4)) & 0x0F0F0F0F;
+ x = (x | (x << 2)) & 0x33333333;
+ x = (x | (x << 1)) & 0x55555555;
+
+ y = (y | (y << 8)) & 0x00FF00FF;
+ y = (y | (y << 4)) & 0x0F0F0F0F;
+ y = (y | (y << 2)) & 0x33333333;
+ y = (y | (y << 1)) & 0x55555555;
+
+ return x | (y << 1);
+ }
+
+ // find the leftmost node of a polygon ring
+ function getLeftmost(start) {
+ var p = start,
+ leftmost = start;
+ do {
+ if (p.x < leftmost.x || (p.x === leftmost.x && p.y < leftmost.y)) { leftmost = p; }
+ p = p.next;
+ } while (p !== start);
+
+ return leftmost;
+ }
+
+ // check if a point lies within a convex triangle
+ function pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {
+ return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 &&
+ (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 &&
+ (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0;
+ }
+
+ // check if a diagonal between two polygon nodes is valid (lies in polygon interior)
+ function isValidDiagonal(a, b) {
+ return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && // dones't intersect other edges
+ (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible
+ (area(a.prev, a, b.prev) || area(a, b.prev, b)) || // does not create opposite-facing sectors
+ equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); // special zero-length case
+ }
+
+ // signed area of a triangle
+ function area(p, q, r) {
+ return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);
+ }
+
+ // check if two points are equal
+ function equals(p1, p2) {
+ return p1.x === p2.x && p1.y === p2.y;
+ }
+
+ // check if two segments intersect
+ function intersects(p1, q1, p2, q2) {
+ var o1 = sign(area(p1, q1, p2));
+ var o2 = sign(area(p1, q1, q2));
+ var o3 = sign(area(p2, q2, p1));
+ var o4 = sign(area(p2, q2, q1));
+
+ if (o1 !== o2 && o3 !== o4) { return true; } // general case
+
+ if (o1 === 0 && onSegment(p1, p2, q1)) { return true; } // p1, q1 and p2 are collinear and p2 lies on p1q1
+ if (o2 === 0 && onSegment(p1, q2, q1)) { return true; } // p1, q1 and q2 are collinear and q2 lies on p1q1
+ if (o3 === 0 && onSegment(p2, p1, q2)) { return true; } // p2, q2 and p1 are collinear and p1 lies on p2q2
+ if (o4 === 0 && onSegment(p2, q1, q2)) { return true; } // p2, q2 and q1 are collinear and q1 lies on p2q2
+
+ return false;
+ }
+
+ // for collinear points p, q, r, check if point q lies on segment pr
+ function onSegment(p, q, r) {
+ return q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y);
+ }
+
+ function sign(num) {
+ return num > 0 ? 1 : num < 0 ? -1 : 0;
+ }
+
+ // check if a polygon diagonal intersects any polygon segments
+ function intersectsPolygon(a, b) {
+ var p = a;
+ do {
+ if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&
+ intersects(p, p.next, a, b)) { return true; }
+ p = p.next;
+ } while (p !== a);
+
+ return false;
+ }
+
+ // check if a polygon diagonal is locally inside the polygon
+ function locallyInside(a, b) {
+ return area(a.prev, a, a.next) < 0 ?
+ area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 :
+ area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;
+ }
+
+ // check if the middle point of a polygon diagonal is inside the polygon
+ function middleInside(a, b) {
+ var p = a,
+ inside = false,
+ px = (a.x + b.x) / 2,
+ py = (a.y + b.y) / 2;
+ do {
+ if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y &&
+ (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))
+ { inside = !inside; }
+ p = p.next;
+ } while (p !== a);
+
+ return inside;
+ }
+
+ // link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;
+ // if one belongs to the outer ring and another to a hole, it merges it into a single ring
+ function splitPolygon(a, b) {
+ var a2 = new Node(a.i, a.x, a.y),
+ b2 = new Node(b.i, b.x, b.y),
+ an = a.next,
+ bp = b.prev;
+
+ a.next = b;
+ b.prev = a;
+
+ a2.next = an;
+ an.prev = a2;
+
+ b2.next = a2;
+ a2.prev = b2;
+
+ bp.next = b2;
+ b2.prev = bp;
+
+ return b2;
+ }
+
+ // create a node and optionally link it with previous one (in a circular doubly linked list)
+ function insertNode(i, x, y, last) {
+ var p = new Node(i, x, y);
+
+ if (!last) {
+ p.prev = p;
+ p.next = p;
+
+ } else {
+ p.next = last.next;
+ p.prev = last;
+ last.next.prev = p;
+ last.next = p;
+ }
+ return p;
+ }
+
+ function removeNode(p) {
+ p.next.prev = p.prev;
+ p.prev.next = p.next;
+
+ if (p.prevZ) { p.prevZ.nextZ = p.nextZ; }
+ if (p.nextZ) { p.nextZ.prevZ = p.prevZ; }
+ }
+
+ function Node(i, x, y) {
+ // vertex index in coordinates array
+ this.i = i;
+
+ // vertex coordinates
+ this.x = x;
+ this.y = y;
+
+ // previous and next vertex nodes in a polygon ring
+ this.prev = null;
+ this.next = null;
+
+ // z-order curve value
+ this.z = null;
+
+ // previous and next nodes in z-order
+ this.prevZ = null;
+ this.nextZ = null;
+
+ // indicates whether this is a steiner point
+ this.steiner = false;
+ }
+
+ // return a percentage difference between the polygon area and its triangulation area;
+ // used to verify correctness of triangulation
+ earcut.deviation = function (data, holeIndices, dim, triangles) {
+ var hasHoles = holeIndices && holeIndices.length;
+ var outerLen = hasHoles ? holeIndices[0] * dim : data.length;
+
+ var polygonArea = Math.abs(signedArea(data, 0, outerLen, dim));
+ if (hasHoles) {
+ for (var i = 0, len = holeIndices.length; i < len; i++) {
+ var start = holeIndices[i] * dim;
+ var end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;
+ polygonArea -= Math.abs(signedArea(data, start, end, dim));
+ }
+ }
+
+ var trianglesArea = 0;
+ for (i = 0; i < triangles.length; i += 3) {
+ var a = triangles[i] * dim;
+ var b = triangles[i + 1] * dim;
+ var c = triangles[i + 2] * dim;
+ trianglesArea += Math.abs(
+ (data[a] - data[c]) * (data[b + 1] - data[a + 1]) -
+ (data[a] - data[b]) * (data[c + 1] - data[a + 1]));
+ }
+
+ return polygonArea === 0 && trianglesArea === 0 ? 0 :
+ Math.abs((trianglesArea - polygonArea) / polygonArea);
+ };
+
+ function signedArea(data, start, end, dim) {
+ var sum = 0;
+ for (var i = start, j = end - dim; i < end; i += dim) {
+ sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);
+ j = i;
+ }
+ return sum;
+ }
+
+ // turn a polygon in a multi-dimensional array form (e.g. as in GeoJSON) into a form Earcut accepts
+ earcut.flatten = function (data) {
+ var dim = data[0][0].length,
+ result = {vertices: [], holes: [], dimensions: dim},
+ holeIndex = 0;
+
+ for (var i = 0; i < data.length; i++) {
+ for (var j = 0; j < data[i].length; j++) {
+ for (var d = 0; d < dim; d++) { result.vertices.push(data[i][j][d]); }
+ }
+ if (i > 0) {
+ holeIndex += data[i - 1].length;
+ result.holes.push(holeIndex);
+ }
+ }
+ return result;
+ };
+ earcut_1.default = default_1;
+
+ var punycode = createCommonjsModule(function (module, exports) {
+ /*! https://mths.be/punycode v1.3.2 by @mathias */
+ ;(function(root) {
+
+ /** Detect free variables */
+ var freeExports = 'object' == 'object' && exports &&
+ !exports.nodeType && exports;
+ var freeModule = 'object' == 'object' && module &&
+ !module.nodeType && module;
+ var freeGlobal = typeof commonjsGlobal == 'object' && commonjsGlobal;
+ if (
+ freeGlobal.global === freeGlobal ||
+ freeGlobal.window === freeGlobal ||
+ freeGlobal.self === freeGlobal
+ ) {
+ root = freeGlobal;
+ }
+
+ /**
+ * The `punycode` object.
+ * @name punycode
+ * @type Object
+ */
+ var punycode,
+
+ /** Highest positive signed 32-bit float value */
+ maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1
+
+ /** Bootstring parameters */
+ base = 36,
+ tMin = 1,
+ tMax = 26,
+ skew = 38,
+ damp = 700,
+ initialBias = 72,
+ initialN = 128, // 0x80
+ delimiter = '-', // '\x2D'
+
+ /** Regular expressions */
+ regexPunycode = /^xn--/,
+ regexNonASCII = /[^\x20-\x7E]/, // unprintable ASCII chars + non-ASCII chars
+ regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g, // RFC 3490 separators
+
+ /** Error messages */
+ errors = {
+ 'overflow': 'Overflow: input needs wider integers to process',
+ 'not-basic': 'Illegal input >= 0x80 (not a basic code point)',
+ 'invalid-input': 'Invalid input'
+ },
+
+ /** Convenience shortcuts */
+ baseMinusTMin = base - tMin,
+ floor = Math.floor,
+ stringFromCharCode = String.fromCharCode,
+
+ /** Temporary variable */
+ key;
+
+ /*--------------------------------------------------------------------------*/
+
+ /**
+ * A generic error utility function.
+ * @private
+ * @param {String} type The error type.
+ * @returns {Error} Throws a `RangeError` with the applicable error message.
+ */
+ function error(type) {
+ throw RangeError(errors[type]);
+ }
+
+ /**
+ * A generic `Array#map` utility function.
+ * @private
+ * @param {Array} array The array to iterate over.
+ * @param {Function} callback The function that gets called for every array
+ * item.
+ * @returns {Array} A new array of values returned by the callback function.
+ */
+ function map(array, fn) {
+ var length = array.length;
+ var result = [];
+ while (length--) {
+ result[length] = fn(array[length]);
+ }
+ return result;
+ }
+
+ /**
+ * A simple `Array#map`-like wrapper to work with domain name strings or email
+ * addresses.
+ * @private
+ * @param {String} domain The domain name or email address.
+ * @param {Function} callback The function that gets called for every
+ * character.
+ * @returns {Array} A new string of characters returned by the callback
+ * function.
+ */
+ function mapDomain(string, fn) {
+ var parts = string.split('@');
+ var result = '';
+ if (parts.length > 1) {
+ // In email addresses, only the domain name should be punycoded. Leave
+ // the local part (i.e. everything up to `@`) intact.
+ result = parts[0] + '@';
+ string = parts[1];
+ }
+ // Avoid `split(regex)` for IE8 compatibility. See #17.
+ string = string.replace(regexSeparators, '\x2E');
+ var labels = string.split('.');
+ var encoded = map(labels, fn).join('.');
+ return result + encoded;
+ }
+
+ /**
+ * Creates an array containing the numeric code points of each Unicode
+ * character in the string. While JavaScript uses UCS-2 internally,
+ * this function will convert a pair of surrogate halves (each of which
+ * UCS-2 exposes as separate characters) into a single code point,
+ * matching UTF-16.
+ * @see `punycode.ucs2.encode`
+ * @see
+ * @memberOf punycode.ucs2
+ * @name decode
+ * @param {String} string The Unicode input string (UCS-2).
+ * @returns {Array} The new array of code points.
+ */
+ function ucs2decode(string) {
+ var output = [],
+ counter = 0,
+ length = string.length,
+ value,
+ extra;
+ while (counter < length) {
+ value = string.charCodeAt(counter++);
+ if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
+ // high surrogate, and there is a next character
+ extra = string.charCodeAt(counter++);
+ if ((extra & 0xFC00) == 0xDC00) { // low surrogate
+ output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
+ } else {
+ // unmatched surrogate; only append this code unit, in case the next
+ // code unit is the high surrogate of a surrogate pair
+ output.push(value);
+ counter--;
+ }
+ } else {
+ output.push(value);
+ }
+ }
+ return output;
+ }
+
+ /**
+ * Creates a string based on an array of numeric code points.
+ * @see `punycode.ucs2.decode`
+ * @memberOf punycode.ucs2
+ * @name encode
+ * @param {Array} codePoints The array of numeric code points.
+ * @returns {String} The new Unicode string (UCS-2).
+ */
+ function ucs2encode(array) {
+ return map(array, function(value) {
+ var output = '';
+ if (value > 0xFFFF) {
+ value -= 0x10000;
+ output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);
+ value = 0xDC00 | value & 0x3FF;
+ }
+ output += stringFromCharCode(value);
+ return output;
+ }).join('');
+ }
+
+ /**
+ * Converts a basic code point into a digit/integer.
+ * @see `digitToBasic()`
+ * @private
+ * @param {Number} codePoint The basic numeric code point value.
+ * @returns {Number} The numeric value of a basic code point (for use in
+ * representing integers) in the range `0` to `base - 1`, or `base` if
+ * the code point does not represent a value.
+ */
+ function basicToDigit(codePoint) {
+ if (codePoint - 48 < 10) {
+ return codePoint - 22;
+ }
+ if (codePoint - 65 < 26) {
+ return codePoint - 65;
+ }
+ if (codePoint - 97 < 26) {
+ return codePoint - 97;
+ }
+ return base;
+ }
+
+ /**
+ * Converts a digit/integer into a basic code point.
+ * @see `basicToDigit()`
+ * @private
+ * @param {Number} digit The numeric value of a basic code point.
+ * @returns {Number} The basic code point whose value (when used for
+ * representing integers) is `digit`, which needs to be in the range
+ * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is
+ * used; else, the lowercase form is used. The behavior is undefined
+ * if `flag` is non-zero and `digit` has no uppercase form.
+ */
+ function digitToBasic(digit, flag) {
+ // 0..25 map to ASCII a..z or A..Z
+ // 26..35 map to ASCII 0..9
+ return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);
+ }
+
+ /**
+ * Bias adaptation function as per section 3.4 of RFC 3492.
+ * http://tools.ietf.org/html/rfc3492#section-3.4
+ * @private
+ */
+ function adapt(delta, numPoints, firstTime) {
+ var k = 0;
+ delta = firstTime ? floor(delta / damp) : delta >> 1;
+ delta += floor(delta / numPoints);
+ for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {
+ delta = floor(delta / baseMinusTMin);
+ }
+ return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));
+ }
+
+ /**
+ * Converts a Punycode string of ASCII-only symbols to a string of Unicode
+ * symbols.
+ * @memberOf punycode
+ * @param {String} input The Punycode string of ASCII-only symbols.
+ * @returns {String} The resulting string of Unicode symbols.
+ */
+ function decode(input) {
+ // Don't use UCS-2
+ var output = [],
+ inputLength = input.length,
+ out,
+ i = 0,
+ n = initialN,
+ bias = initialBias,
+ basic,
+ j,
+ index,
+ oldi,
+ w,
+ k,
+ digit,
+ t,
+ /** Cached calculation results */
+ baseMinusT;
+
+ // Handle the basic code points: let `basic` be the number of input code
+ // points before the last delimiter, or `0` if there is none, then copy
+ // the first basic code points to the output.
+
+ basic = input.lastIndexOf(delimiter);
+ if (basic < 0) {
+ basic = 0;
+ }
+
+ for (j = 0; j < basic; ++j) {
+ // if it's not a basic code point
+ if (input.charCodeAt(j) >= 0x80) {
+ error('not-basic');
+ }
+ output.push(input.charCodeAt(j));
+ }
+
+ // Main decoding loop: start just after the last delimiter if any basic code
+ // points were copied; start at the beginning otherwise.
+
+ for (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {
+
+ // `index` is the index of the next character to be consumed.
+ // Decode a generalized variable-length integer into `delta`,
+ // which gets added to `i`. The overflow checking is easier
+ // if we increase `i` as we go, then subtract off its starting
+ // value at the end to obtain `delta`.
+ for (oldi = i, w = 1, k = base; /* no condition */; k += base) {
+
+ if (index >= inputLength) {
+ error('invalid-input');
+ }
+
+ digit = basicToDigit(input.charCodeAt(index++));
+
+ if (digit >= base || digit > floor((maxInt - i) / w)) {
+ error('overflow');
+ }
+
+ i += digit * w;
+ t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
+
+ if (digit < t) {
+ break;
+ }
+
+ baseMinusT = base - t;
+ if (w > floor(maxInt / baseMinusT)) {
+ error('overflow');
+ }
+
+ w *= baseMinusT;
+
+ }
+
+ out = output.length + 1;
+ bias = adapt(i - oldi, out, oldi == 0);
+
+ // `i` was supposed to wrap around from `out` to `0`,
+ // incrementing `n` each time, so we'll fix that now:
+ if (floor(i / out) > maxInt - n) {
+ error('overflow');
+ }
+
+ n += floor(i / out);
+ i %= out;
+
+ // Insert `n` at position `i` of the output
+ output.splice(i++, 0, n);
+
+ }
+
+ return ucs2encode(output);
+ }
+
+ /**
+ * Converts a string of Unicode symbols (e.g. a domain name label) to a
+ * Punycode string of ASCII-only symbols.
+ * @memberOf punycode
+ * @param {String} input The string of Unicode symbols.
+ * @returns {String} The resulting Punycode string of ASCII-only symbols.
+ */
+ function encode(input) {
+ var n,
+ delta,
+ handledCPCount,
+ basicLength,
+ bias,
+ j,
+ m,
+ q,
+ k,
+ t,
+ currentValue,
+ output = [],
+ /** `inputLength` will hold the number of code points in `input`. */
+ inputLength,
+ /** Cached calculation results */
+ handledCPCountPlusOne,
+ baseMinusT,
+ qMinusT;
+
+ // Convert the input in UCS-2 to Unicode
+ input = ucs2decode(input);
+
+ // Cache the length
+ inputLength = input.length;
+
+ // Initialize the state
+ n = initialN;
+ delta = 0;
+ bias = initialBias;
+
+ // Handle the basic code points
+ for (j = 0; j < inputLength; ++j) {
+ currentValue = input[j];
+ if (currentValue < 0x80) {
+ output.push(stringFromCharCode(currentValue));
+ }
+ }
+
+ handledCPCount = basicLength = output.length;
+
+ // `handledCPCount` is the number of code points that have been handled;
+ // `basicLength` is the number of basic code points.
+
+ // Finish the basic string - if it is not empty - with a delimiter
+ if (basicLength) {
+ output.push(delimiter);
+ }
+
+ // Main encoding loop:
+ while (handledCPCount < inputLength) {
+
+ // All non-basic code points < n have been handled already. Find the next
+ // larger one:
+ for (m = maxInt, j = 0; j < inputLength; ++j) {
+ currentValue = input[j];
+ if (currentValue >= n && currentValue < m) {
+ m = currentValue;
+ }
+ }
+
+ // Increase `delta` enough to advance the decoder's state to ,
+ // but guard against overflow
+ handledCPCountPlusOne = handledCPCount + 1;
+ if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
+ error('overflow');
+ }
+
+ delta += (m - n) * handledCPCountPlusOne;
+ n = m;
+
+ for (j = 0; j < inputLength; ++j) {
+ currentValue = input[j];
+
+ if (currentValue < n && ++delta > maxInt) {
+ error('overflow');
+ }
+
+ if (currentValue == n) {
+ // Represent delta as a generalized variable-length integer
+ for (q = delta, k = base; /* no condition */; k += base) {
+ t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
+ if (q < t) {
+ break;
+ }
+ qMinusT = q - t;
+ baseMinusT = base - t;
+ output.push(
+ stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))
+ );
+ q = floor(qMinusT / baseMinusT);
+ }
+
+ output.push(stringFromCharCode(digitToBasic(q, 0)));
+ bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);
+ delta = 0;
+ ++handledCPCount;
+ }
+ }
+
+ ++delta;
+ ++n;
+
+ }
+ return output.join('');
+ }
+
+ /**
+ * Converts a Punycode string representing a domain name or an email address
+ * to Unicode. Only the Punycoded parts of the input will be converted, i.e.
+ * it doesn't matter if you call it on a string that has already been
+ * converted to Unicode.
+ * @memberOf punycode
+ * @param {String} input The Punycoded domain name or email address to
+ * convert to Unicode.
+ * @returns {String} The Unicode representation of the given Punycode
+ * string.
+ */
+ function toUnicode(input) {
+ return mapDomain(input, function(string) {
+ return regexPunycode.test(string)
+ ? decode(string.slice(4).toLowerCase())
+ : string;
+ });
+ }
+
+ /**
+ * Converts a Unicode string representing a domain name or an email address to
+ * Punycode. Only the non-ASCII parts of the domain name will be converted,
+ * i.e. it doesn't matter if you call it with a domain that's already in
+ * ASCII.
+ * @memberOf punycode
+ * @param {String} input The domain name or email address to convert, as a
+ * Unicode string.
+ * @returns {String} The Punycode representation of the given domain name or
+ * email address.
+ */
+ function toASCII(input) {
+ return mapDomain(input, function(string) {
+ return regexNonASCII.test(string)
+ ? 'xn--' + encode(string)
+ : string;
+ });
+ }
+
+ /*--------------------------------------------------------------------------*/
+
+ /** Define the public API */
+ punycode = {
+ /**
+ * A string representing the current Punycode.js version number.
+ * @memberOf punycode
+ * @type String
+ */
+ 'version': '1.3.2',
+ /**
+ * An object of methods to convert from JavaScript's internal character
+ * representation (UCS-2) to Unicode code points, and back.
+ * @see
+ * @memberOf punycode
+ * @type Object
+ */
+ 'ucs2': {
+ 'decode': ucs2decode,
+ 'encode': ucs2encode
+ },
+ 'decode': decode,
+ 'encode': encode,
+ 'toASCII': toASCII,
+ 'toUnicode': toUnicode
+ };
+
+ /** Expose `punycode` */
+ // Some AMD build optimizers, like r.js, check for specific condition patterns
+ // like the following:
+ if (
+ typeof undefined == 'function' &&
+ typeof undefined.amd == 'object' &&
+ undefined.amd
+ ) {
+ undefined('punycode', function() {
+ return punycode;
+ });
+ } else if (freeExports && freeModule) {
+ if (module.exports == freeExports) { // in Node.js or RingoJS v0.8.0+
+ freeModule.exports = punycode;
+ } else { // in Narwhal or RingoJS v0.7.0-
+ for (key in punycode) {
+ punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]);
+ }
+ }
+ } else { // in Rhino or a web browser
+ root.punycode = punycode;
+ }
+
+ }(commonjsGlobal));
+ });
+
+ 'use strict';
+
+ var util = {
+ isString: function(arg) {
+ return typeof(arg) === 'string';
+ },
+ isObject: function(arg) {
+ return typeof(arg) === 'object' && arg !== null;
+ },
+ isNull: function(arg) {
+ return arg === null;
+ },
+ isNullOrUndefined: function(arg) {
+ return arg == null;
+ }
+ };
+ var util_1 = util.isString;
+ var util_2 = util.isObject;
+ var util_3 = util.isNull;
+ var util_4 = util.isNullOrUndefined;
+
+ // Copyright Joyent, Inc. and other Node contributors.
+ //
+ // Permission is hereby granted, free of charge, to any person obtaining a
+ // copy of this software and associated documentation files (the
+ // "Software"), to deal in the Software without restriction, including
+ // without limitation the rights to use, copy, modify, merge, publish,
+ // distribute, sublicense, and/or sell copies of the Software, and to permit
+ // persons to whom the Software is furnished to do so, subject to the
+ // following conditions:
+ //
+ // The above copyright notice and this permission notice shall be included
+ // in all copies or substantial portions of the Software.
+ //
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ // USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ 'use strict';
+
+ // If obj.hasOwnProperty has been overridden, then calling
+ // obj.hasOwnProperty(prop) will break.
+ // See: https://github.com/joyent/node/issues/1707
+ function hasOwnProperty$1(obj, prop) {
+ return Object.prototype.hasOwnProperty.call(obj, prop);
+ }
+
+ var decode = function(qs, sep, eq, options) {
+ sep = sep || '&';
+ eq = eq || '=';
+ var obj = {};
+
+ if (typeof qs !== 'string' || qs.length === 0) {
+ return obj;
+ }
+
+ var regexp = /\+/g;
+ qs = qs.split(sep);
+
+ var maxKeys = 1000;
+ if (options && typeof options.maxKeys === 'number') {
+ maxKeys = options.maxKeys;
+ }
+
+ var len = qs.length;
+ // maxKeys <= 0 means that we should not limit keys count
+ if (maxKeys > 0 && len > maxKeys) {
+ len = maxKeys;
+ }
+
+ for (var i = 0; i < len; ++i) {
+ var x = qs[i].replace(regexp, '%20'),
+ idx = x.indexOf(eq),
+ kstr, vstr, k, v;
+
+ if (idx >= 0) {
+ kstr = x.substr(0, idx);
+ vstr = x.substr(idx + 1);
+ } else {
+ kstr = x;
+ vstr = '';
+ }
+
+ k = decodeURIComponent(kstr);
+ v = decodeURIComponent(vstr);
+
+ if (!hasOwnProperty$1(obj, k)) {
+ obj[k] = v;
+ } else if (Array.isArray(obj[k])) {
+ obj[k].push(v);
+ } else {
+ obj[k] = [obj[k], v];
+ }
+ }
+
+ return obj;
+ };
+
+ // Copyright Joyent, Inc. and other Node contributors.
+ //
+ // Permission is hereby granted, free of charge, to any person obtaining a
+ // copy of this software and associated documentation files (the
+ // "Software"), to deal in the Software without restriction, including
+ // without limitation the rights to use, copy, modify, merge, publish,
+ // distribute, sublicense, and/or sell copies of the Software, and to permit
+ // persons to whom the Software is furnished to do so, subject to the
+ // following conditions:
+ //
+ // The above copyright notice and this permission notice shall be included
+ // in all copies or substantial portions of the Software.
+ //
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ // USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ 'use strict';
+
+ var stringifyPrimitive = function(v) {
+ switch (typeof v) {
+ case 'string':
+ return v;
+
+ case 'boolean':
+ return v ? 'true' : 'false';
+
+ case 'number':
+ return isFinite(v) ? v : '';
+
+ default:
+ return '';
+ }
+ };
+
+ var encode = function(obj, sep, eq, name) {
+ sep = sep || '&';
+ eq = eq || '=';
+ if (obj === null) {
+ obj = undefined;
+ }
+
+ if (typeof obj === 'object') {
+ return Object.keys(obj).map(function(k) {
+ var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;
+ if (Array.isArray(obj[k])) {
+ return obj[k].map(function(v) {
+ return ks + encodeURIComponent(stringifyPrimitive(v));
+ }).join(sep);
+ } else {
+ return ks + encodeURIComponent(stringifyPrimitive(obj[k]));
+ }
+ }).join(sep);
+
+ }
+
+ if (!name) { return ''; }
+ return encodeURIComponent(stringifyPrimitive(name)) + eq +
+ encodeURIComponent(stringifyPrimitive(obj));
+ };
+
+ var querystring = createCommonjsModule(function (module, exports) {
+ 'use strict';
+
+ exports.decode = exports.parse = decode;
+ exports.encode = exports.stringify = encode;
+ });
+ var querystring_1 = querystring.decode;
+ var querystring_2 = querystring.parse;
+ var querystring_3 = querystring.encode;
+ var querystring_4 = querystring.stringify;
+
+ // Copyright Joyent, Inc. and other Node contributors.
+ //
+ // Permission is hereby granted, free of charge, to any person obtaining a
+ // copy of this software and associated documentation files (the
+ // "Software"), to deal in the Software without restriction, including
+ // without limitation the rights to use, copy, modify, merge, publish,
+ // distribute, sublicense, and/or sell copies of the Software, and to permit
+ // persons to whom the Software is furnished to do so, subject to the
+ // following conditions:
+ //
+ // The above copyright notice and this permission notice shall be included
+ // in all copies or substantial portions of the Software.
+ //
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ // USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ 'use strict';
+
+
+
+
+ var parse = urlParse;
+ var resolve = urlResolve;
+ var resolveObject = urlResolveObject;
+ var format = urlFormat;
+
+ var Url_1 = Url;
+
+ function Url() {
+ this.protocol = null;
+ this.slashes = null;
+ this.auth = null;
+ this.host = null;
+ this.port = null;
+ this.hostname = null;
+ this.hash = null;
+ this.search = null;
+ this.query = null;
+ this.pathname = null;
+ this.path = null;
+ this.href = null;
+ }
+
+ // Reference: RFC 3986, RFC 1808, RFC 2396
+
+ // define these here so at least they only have to be
+ // compiled once on the first module load.
+ var protocolPattern = /^([a-z0-9.+-]+:)/i,
+ portPattern = /:[0-9]*$/,
+
+ // Special case for a simple path URL
+ simplePathPattern = /^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,
+
+ // RFC 2396: characters reserved for delimiting URLs.
+ // We actually just auto-escape these.
+ delims = ['<', '>', '"', '`', ' ', '\r', '\n', '\t'],
+
+ // RFC 2396: characters not allowed for various reasons.
+ unwise = ['{', '}', '|', '\\', '^', '`'].concat(delims),
+
+ // Allowed by RFCs, but cause of XSS attacks. Always escape these.
+ autoEscape = ['\''].concat(unwise),
+ // Characters that are never ever allowed in a hostname.
+ // Note that any invalid chars are also handled, but these
+ // are the ones that are *expected* to be seen, so we fast-path
+ // them.
+ nonHostChars = ['%', '/', '?', ';', '#'].concat(autoEscape),
+ hostEndingChars = ['/', '?', '#'],
+ hostnameMaxLen = 255,
+ hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/,
+ hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/,
+ // protocols that can allow "unsafe" and "unwise" chars.
+ unsafeProtocol = {
+ 'javascript': true,
+ 'javascript:': true
+ },
+ // protocols that never have a hostname.
+ hostlessProtocol = {
+ 'javascript': true,
+ 'javascript:': true
+ },
+ // protocols that always contain a // bit.
+ slashedProtocol = {
+ 'http': true,
+ 'https': true,
+ 'ftp': true,
+ 'gopher': true,
+ 'file': true,
+ 'http:': true,
+ 'https:': true,
+ 'ftp:': true,
+ 'gopher:': true,
+ 'file:': true
+ };
+
+ function urlParse(url, parseQueryString, slashesDenoteHost) {
+ if (url && util.isObject(url) && url instanceof Url) { return url; }
+
+ var u = new Url;
+ u.parse(url, parseQueryString, slashesDenoteHost);
+ return u;
+ }
+
+ Url.prototype.parse = function(url, parseQueryString, slashesDenoteHost) {
+ if (!util.isString(url)) {
+ throw new TypeError("Parameter 'url' must be a string, not " + typeof url);
+ }
+
+ // Copy chrome, IE, opera backslash-handling behavior.
+ // Back slashes before the query string get converted to forward slashes
+ // See: https://code.google.com/p/chromium/issues/detail?id=25916
+ var queryIndex = url.indexOf('?'),
+ splitter =
+ (queryIndex !== -1 && queryIndex < url.indexOf('#')) ? '?' : '#',
+ uSplit = url.split(splitter),
+ slashRegex = /\\/g;
+ uSplit[0] = uSplit[0].replace(slashRegex, '/');
+ url = uSplit.join(splitter);
+
+ var rest = url;
+
+ // trim before proceeding.
+ // This is to support parse stuff like " http://foo.com \n"
+ rest = rest.trim();
+
+ if (!slashesDenoteHost && url.split('#').length === 1) {
+ // Try fast path regexp
+ var simplePath = simplePathPattern.exec(rest);
+ if (simplePath) {
+ this.path = rest;
+ this.href = rest;
+ this.pathname = simplePath[1];
+ if (simplePath[2]) {
+ this.search = simplePath[2];
+ if (parseQueryString) {
+ this.query = querystring.parse(this.search.substr(1));
+ } else {
+ this.query = this.search.substr(1);
+ }
+ } else if (parseQueryString) {
+ this.search = '';
+ this.query = {};
+ }
+ return this;
+ }
+ }
+
+ var proto = protocolPattern.exec(rest);
+ if (proto) {
+ proto = proto[0];
+ var lowerProto = proto.toLowerCase();
+ this.protocol = lowerProto;
+ rest = rest.substr(proto.length);
+ }
+
+ // figure out if it's got a host
+ // user@server is *always* interpreted as a hostname, and url
+ // resolution will treat //foo/bar as host=foo,path=bar because that's
+ // how the browser resolves relative URLs.
+ if (slashesDenoteHost || proto || rest.match(/^\/\/[^@\/]+@[^@\/]+/)) {
+ var slashes = rest.substr(0, 2) === '//';
+ if (slashes && !(proto && hostlessProtocol[proto])) {
+ rest = rest.substr(2);
+ this.slashes = true;
+ }
+ }
+
+ if (!hostlessProtocol[proto] &&
+ (slashes || (proto && !slashedProtocol[proto]))) {
+
+ // there's a hostname.
+ // the first instance of /, ?, ;, or # ends the host.
+ //
+ // If there is an @ in the hostname, then non-host chars *are* allowed
+ // to the left of the last @ sign, unless some host-ending character
+ // comes *before* the @-sign.
+ // URLs are obnoxious.
+ //
+ // ex:
+ // http://a@b@c/ => user:a@b host:c
+ // http://a@b?@c => user:a host:c path:/?@c
+
+ // v0.12 TODO(isaacs): This is not quite how Chrome does things.
+ // Review our test case against browsers more comprehensively.
+
+ // find the first instance of any hostEndingChars
+ var hostEnd = -1;
+ for (var i = 0; i < hostEndingChars.length; i++) {
+ var hec = rest.indexOf(hostEndingChars[i]);
+ if (hec !== -1 && (hostEnd === -1 || hec < hostEnd))
+ { hostEnd = hec; }
+ }
+
+ // at this point, either we have an explicit point where the
+ // auth portion cannot go past, or the last @ char is the decider.
+ var auth, atSign;
+ if (hostEnd === -1) {
+ // atSign can be anywhere.
+ atSign = rest.lastIndexOf('@');
+ } else {
+ // atSign must be in auth portion.
+ // http://a@b/c@d => host:b auth:a path:/c@d
+ atSign = rest.lastIndexOf('@', hostEnd);
+ }
+
+ // Now we have a portion which is definitely the auth.
+ // Pull that off.
+ if (atSign !== -1) {
+ auth = rest.slice(0, atSign);
+ rest = rest.slice(atSign + 1);
+ this.auth = decodeURIComponent(auth);
+ }
+
+ // the host is the remaining to the left of the first non-host char
+ hostEnd = -1;
+ for (var i = 0; i < nonHostChars.length; i++) {
+ var hec = rest.indexOf(nonHostChars[i]);
+ if (hec !== -1 && (hostEnd === -1 || hec < hostEnd))
+ { hostEnd = hec; }
+ }
+ // if we still have not hit it, then the entire thing is a host.
+ if (hostEnd === -1)
+ { hostEnd = rest.length; }
+
+ this.host = rest.slice(0, hostEnd);
+ rest = rest.slice(hostEnd);
+
+ // pull out port.
+ this.parseHost();
+
+ // we've indicated that there is a hostname,
+ // so even if it's empty, it has to be present.
+ this.hostname = this.hostname || '';
+
+ // if hostname begins with [ and ends with ]
+ // assume that it's an IPv6 address.
+ var ipv6Hostname = this.hostname[0] === '[' &&
+ this.hostname[this.hostname.length - 1] === ']';
+
+ // validate a little.
+ if (!ipv6Hostname) {
+ var hostparts = this.hostname.split(/\./);
+ for (var i = 0, l = hostparts.length; i < l; i++) {
+ var part = hostparts[i];
+ if (!part) { continue; }
+ if (!part.match(hostnamePartPattern)) {
+ var newpart = '';
+ for (var j = 0, k = part.length; j < k; j++) {
+ if (part.charCodeAt(j) > 127) {
+ // we replace non-ASCII char with a temporary placeholder
+ // we need this to make sure size of hostname is not
+ // broken by replacing non-ASCII by nothing
+ newpart += 'x';
+ } else {
+ newpart += part[j];
+ }
+ }
+ // we test again with ASCII char only
+ if (!newpart.match(hostnamePartPattern)) {
+ var validParts = hostparts.slice(0, i);
+ var notHost = hostparts.slice(i + 1);
+ var bit = part.match(hostnamePartStart);
+ if (bit) {
+ validParts.push(bit[1]);
+ notHost.unshift(bit[2]);
+ }
+ if (notHost.length) {
+ rest = '/' + notHost.join('.') + rest;
+ }
+ this.hostname = validParts.join('.');
+ break;
+ }
+ }
+ }
+ }
+
+ if (this.hostname.length > hostnameMaxLen) {
+ this.hostname = '';
+ } else {
+ // hostnames are always lower case.
+ this.hostname = this.hostname.toLowerCase();
+ }
+
+ if (!ipv6Hostname) {
+ // IDNA Support: Returns a punycoded representation of "domain".
+ // It only converts parts of the domain name that
+ // have non-ASCII characters, i.e. it doesn't matter if
+ // you call it with a domain that already is ASCII-only.
+ this.hostname = punycode.toASCII(this.hostname);
+ }
+
+ var p = this.port ? ':' + this.port : '';
+ var h = this.hostname || '';
+ this.host = h + p;
+ this.href += this.host;
+
+ // strip [ and ] from the hostname
+ // the host field still retains them, though
+ if (ipv6Hostname) {
+ this.hostname = this.hostname.substr(1, this.hostname.length - 2);
+ if (rest[0] !== '/') {
+ rest = '/' + rest;
+ }
+ }
+ }
+
+ // now rest is set to the post-host stuff.
+ // chop off any delim chars.
+ if (!unsafeProtocol[lowerProto]) {
+
+ // First, make 100% sure that any "autoEscape" chars get
+ // escaped, even if encodeURIComponent doesn't think they
+ // need to be.
+ for (var i = 0, l = autoEscape.length; i < l; i++) {
+ var ae = autoEscape[i];
+ if (rest.indexOf(ae) === -1)
+ { continue; }
+ var esc = encodeURIComponent(ae);
+ if (esc === ae) {
+ esc = escape(ae);
+ }
+ rest = rest.split(ae).join(esc);
+ }
+ }
+
+
+ // chop off from the tail first.
+ var hash = rest.indexOf('#');
+ if (hash !== -1) {
+ // got a fragment string.
+ this.hash = rest.substr(hash);
+ rest = rest.slice(0, hash);
+ }
+ var qm = rest.indexOf('?');
+ if (qm !== -1) {
+ this.search = rest.substr(qm);
+ this.query = rest.substr(qm + 1);
+ if (parseQueryString) {
+ this.query = querystring.parse(this.query);
+ }
+ rest = rest.slice(0, qm);
+ } else if (parseQueryString) {
+ // no query string, but parseQueryString still requested
+ this.search = '';
+ this.query = {};
+ }
+ if (rest) { this.pathname = rest; }
+ if (slashedProtocol[lowerProto] &&
+ this.hostname && !this.pathname) {
+ this.pathname = '/';
+ }
+
+ //to support http.request
+ if (this.pathname || this.search) {
+ var p = this.pathname || '';
+ var s = this.search || '';
+ this.path = p + s;
+ }
+
+ // finally, reconstruct the href based on what has been validated.
+ this.href = this.format();
+ return this;
+ };
+
+ // format a parsed object into a url string
+ function urlFormat(obj) {
+ // ensure it's an object, and not a string url.
+ // If it's an obj, this is a no-op.
+ // this way, you can call url_format() on strings
+ // to clean up potentially wonky urls.
+ if (util.isString(obj)) { obj = urlParse(obj); }
+ if (!(obj instanceof Url)) { return Url.prototype.format.call(obj); }
+ return obj.format();
+ }
+
+ Url.prototype.format = function() {
+ var auth = this.auth || '';
+ if (auth) {
+ auth = encodeURIComponent(auth);
+ auth = auth.replace(/%3A/i, ':');
+ auth += '@';
+ }
+
+ var protocol = this.protocol || '',
+ pathname = this.pathname || '',
+ hash = this.hash || '',
+ host = false,
+ query = '';
+
+ if (this.host) {
+ host = auth + this.host;
+ } else if (this.hostname) {
+ host = auth + (this.hostname.indexOf(':') === -1 ?
+ this.hostname :
+ '[' + this.hostname + ']');
+ if (this.port) {
+ host += ':' + this.port;
+ }
+ }
+
+ if (this.query &&
+ util.isObject(this.query) &&
+ Object.keys(this.query).length) {
+ query = querystring.stringify(this.query);
+ }
+
+ var search = this.search || (query && ('?' + query)) || '';
+
+ if (protocol && protocol.substr(-1) !== ':') { protocol += ':'; }
+
+ // only the slashedProtocols get the //. Not mailto:, xmpp:, etc.
+ // unless they had them to begin with.
+ if (this.slashes ||
+ (!protocol || slashedProtocol[protocol]) && host !== false) {
+ host = '//' + (host || '');
+ if (pathname && pathname.charAt(0) !== '/') { pathname = '/' + pathname; }
+ } else if (!host) {
+ host = '';
+ }
+
+ if (hash && hash.charAt(0) !== '#') { hash = '#' + hash; }
+ if (search && search.charAt(0) !== '?') { search = '?' + search; }
+
+ pathname = pathname.replace(/[?#]/g, function(match) {
+ return encodeURIComponent(match);
+ });
+ search = search.replace('#', '%23');
+
+ return protocol + host + pathname + search + hash;
+ };
+
+ function urlResolve(source, relative) {
+ return urlParse(source, false, true).resolve(relative);
+ }
+
+ Url.prototype.resolve = function(relative) {
+ return this.resolveObject(urlParse(relative, false, true)).format();
+ };
+
+ function urlResolveObject(source, relative) {
+ if (!source) { return relative; }
+ return urlParse(source, false, true).resolveObject(relative);
+ }
+
+ Url.prototype.resolveObject = function(relative) {
+ if (util.isString(relative)) {
+ var rel = new Url();
+ rel.parse(relative, false, true);
+ relative = rel;
+ }
+
+ var result = new Url();
+ var tkeys = Object.keys(this);
+ for (var tk = 0; tk < tkeys.length; tk++) {
+ var tkey = tkeys[tk];
+ result[tkey] = this[tkey];
+ }
+
+ // hash is always overridden, no matter what.
+ // even href="" will remove it.
+ result.hash = relative.hash;
+
+ // if the relative url is empty, then there's nothing left to do here.
+ if (relative.href === '') {
+ result.href = result.format();
+ return result;
+ }
+
+ // hrefs like //foo/bar always cut to the protocol.
+ if (relative.slashes && !relative.protocol) {
+ // take everything except the protocol from relative
+ var rkeys = Object.keys(relative);
+ for (var rk = 0; rk < rkeys.length; rk++) {
+ var rkey = rkeys[rk];
+ if (rkey !== 'protocol')
+ { result[rkey] = relative[rkey]; }
+ }
+
+ //urlParse appends trailing / to urls like http://www.example.com
+ if (slashedProtocol[result.protocol] &&
+ result.hostname && !result.pathname) {
+ result.path = result.pathname = '/';
+ }
+
+ result.href = result.format();
+ return result;
+ }
+
+ if (relative.protocol && relative.protocol !== result.protocol) {
+ // if it's a known url protocol, then changing
+ // the protocol does weird things
+ // first, if it's not file:, then we MUST have a host,
+ // and if there was a path
+ // to begin with, then we MUST have a path.
+ // if it is file:, then the host is dropped,
+ // because that's known to be hostless.
+ // anything else is assumed to be absolute.
+ if (!slashedProtocol[relative.protocol]) {
+ var keys = Object.keys(relative);
+ for (var v = 0; v < keys.length; v++) {
+ var k = keys[v];
+ result[k] = relative[k];
+ }
+ result.href = result.format();
+ return result;
+ }
+
+ result.protocol = relative.protocol;
+ if (!relative.host && !hostlessProtocol[relative.protocol]) {
+ var relPath = (relative.pathname || '').split('/');
+ while (relPath.length && !(relative.host = relPath.shift())){ ; }
+ if (!relative.host) { relative.host = ''; }
+ if (!relative.hostname) { relative.hostname = ''; }
+ if (relPath[0] !== '') { relPath.unshift(''); }
+ if (relPath.length < 2) { relPath.unshift(''); }
+ result.pathname = relPath.join('/');
+ } else {
+ result.pathname = relative.pathname;
+ }
+ result.search = relative.search;
+ result.query = relative.query;
+ result.host = relative.host || '';
+ result.auth = relative.auth;
+ result.hostname = relative.hostname || relative.host;
+ result.port = relative.port;
+ // to support http.request
+ if (result.pathname || result.search) {
+ var p = result.pathname || '';
+ var s = result.search || '';
+ result.path = p + s;
+ }
+ result.slashes = result.slashes || relative.slashes;
+ result.href = result.format();
+ return result;
+ }
+
+ var isSourceAbs = (result.pathname && result.pathname.charAt(0) === '/'),
+ isRelAbs = (
+ relative.host ||
+ relative.pathname && relative.pathname.charAt(0) === '/'
+ ),
+ mustEndAbs = (isRelAbs || isSourceAbs ||
+ (result.host && relative.pathname)),
+ removeAllDots = mustEndAbs,
+ srcPath = result.pathname && result.pathname.split('/') || [],
+ relPath = relative.pathname && relative.pathname.split('/') || [],
+ psychotic = result.protocol && !slashedProtocol[result.protocol];
+
+ // if the url is a non-slashed url, then relative
+ // links like ../.. should be able
+ // to crawl up to the hostname, as well. This is strange.
+ // result.protocol has already been set by now.
+ // Later on, put the first path part into the host field.
+ if (psychotic) {
+ result.hostname = '';
+ result.port = null;
+ if (result.host) {
+ if (srcPath[0] === '') { srcPath[0] = result.host; }
+ else { srcPath.unshift(result.host); }
+ }
+ result.host = '';
+ if (relative.protocol) {
+ relative.hostname = null;
+ relative.port = null;
+ if (relative.host) {
+ if (relPath[0] === '') { relPath[0] = relative.host; }
+ else { relPath.unshift(relative.host); }
+ }
+ relative.host = null;
+ }
+ mustEndAbs = mustEndAbs && (relPath[0] === '' || srcPath[0] === '');
+ }
+
+ if (isRelAbs) {
+ // it's absolute.
+ result.host = (relative.host || relative.host === '') ?
+ relative.host : result.host;
+ result.hostname = (relative.hostname || relative.hostname === '') ?
+ relative.hostname : result.hostname;
+ result.search = relative.search;
+ result.query = relative.query;
+ srcPath = relPath;
+ // fall through to the dot-handling below.
+ } else if (relPath.length) {
+ // it's relative
+ // throw away the existing file, and take the new path instead.
+ if (!srcPath) { srcPath = []; }
+ srcPath.pop();
+ srcPath = srcPath.concat(relPath);
+ result.search = relative.search;
+ result.query = relative.query;
+ } else if (!util.isNullOrUndefined(relative.search)) {
+ // just pull out the search.
+ // like href='?foo'.
+ // Put this after the other two cases because it simplifies the booleans
+ if (psychotic) {
+ result.hostname = result.host = srcPath.shift();
+ //occationaly the auth can get stuck only in host
+ //this especially happens in cases like
+ //url.resolveObject('mailto:local1@domain1', 'local2@domain2')
+ var authInHost = result.host && result.host.indexOf('@') > 0 ?
+ result.host.split('@') : false;
+ if (authInHost) {
+ result.auth = authInHost.shift();
+ result.host = result.hostname = authInHost.shift();
+ }
+ }
+ result.search = relative.search;
+ result.query = relative.query;
+ //to support http.request
+ if (!util.isNull(result.pathname) || !util.isNull(result.search)) {
+ result.path = (result.pathname ? result.pathname : '') +
+ (result.search ? result.search : '');
+ }
+ result.href = result.format();
+ return result;
+ }
+
+ if (!srcPath.length) {
+ // no path at all. easy.
+ // we've already handled the other stuff above.
+ result.pathname = null;
+ //to support http.request
+ if (result.search) {
+ result.path = '/' + result.search;
+ } else {
+ result.path = null;
+ }
+ result.href = result.format();
+ return result;
+ }
+
+ // if a url ENDs in . or .., then it must get a trailing slash.
+ // however, if it ends in anything else non-slashy,
+ // then it must NOT get a trailing slash.
+ var last = srcPath.slice(-1)[0];
+ var hasTrailingSlash = (
+ (result.host || relative.host || srcPath.length > 1) &&
+ (last === '.' || last === '..') || last === '');
+
+ // strip single dots, resolve double dots to parent dir
+ // if the path tries to go above the root, `up` ends up > 0
+ var up = 0;
+ for (var i = srcPath.length; i >= 0; i--) {
+ last = srcPath[i];
+ if (last === '.') {
+ srcPath.splice(i, 1);
+ } else if (last === '..') {
+ srcPath.splice(i, 1);
+ up++;
+ } else if (up) {
+ srcPath.splice(i, 1);
+ up--;
+ }
+ }
+
+ // if the path is allowed to go above the root, restore leading ..s
+ if (!mustEndAbs && !removeAllDots) {
+ for (; up--; up) {
+ srcPath.unshift('..');
+ }
+ }
+
+ if (mustEndAbs && srcPath[0] !== '' &&
+ (!srcPath[0] || srcPath[0].charAt(0) !== '/')) {
+ srcPath.unshift('');
+ }
+
+ if (hasTrailingSlash && (srcPath.join('/').substr(-1) !== '/')) {
+ srcPath.push('');
+ }
+
+ var isAbsolute = srcPath[0] === '' ||
+ (srcPath[0] && srcPath[0].charAt(0) === '/');
+
+ // put the host back
+ if (psychotic) {
+ result.hostname = result.host = isAbsolute ? '' :
+ srcPath.length ? srcPath.shift() : '';
+ //occationaly the auth can get stuck only in host
+ //this especially happens in cases like
+ //url.resolveObject('mailto:local1@domain1', 'local2@domain2')
+ var authInHost = result.host && result.host.indexOf('@') > 0 ?
+ result.host.split('@') : false;
+ if (authInHost) {
+ result.auth = authInHost.shift();
+ result.host = result.hostname = authInHost.shift();
+ }
+ }
+
+ mustEndAbs = mustEndAbs || (result.host && srcPath.length);
+
+ if (mustEndAbs && !isAbsolute) {
+ srcPath.unshift('');
+ }
+
+ if (!srcPath.length) {
+ result.pathname = null;
+ result.path = null;
+ } else {
+ result.pathname = srcPath.join('/');
+ }
+
+ //to support request.http
+ if (!util.isNull(result.pathname) || !util.isNull(result.search)) {
+ result.path = (result.pathname ? result.pathname : '') +
+ (result.search ? result.search : '');
+ }
+ result.auth = relative.auth || result.auth;
+ result.slashes = result.slashes || relative.slashes;
+ result.href = result.format();
+ return result;
+ };
+
+ Url.prototype.parseHost = function() {
+ var host = this.host;
+ var port = portPattern.exec(host);
+ if (port) {
+ port = port[0];
+ if (port !== ':') {
+ this.port = port.substr(1);
+ }
+ host = host.substr(0, host.length - port.length);
+ }
+ if (host) { this.hostname = host; }
+ };
+
+ var url = {
+ parse: parse,
+ resolve: resolve,
+ resolveObject: resolveObject,
+ format: format,
+ Url: Url_1
+ };
+
+ /*!
+ * @pixi/constants - v5.3.12
+ * Compiled Wed, 23 Mar 2022 18:38:07 UTC
+ *
+ * @pixi/constants is licensed under the MIT License.
+ * http://www.opensource.org/licenses/mit-license
+ */
+ /**
+ * Different types of environments for WebGL.
+ *
+ * @static
+ * @memberof PIXI
+ * @name ENV
+ * @enum {number}
+ * @property {number} WEBGL_LEGACY - Used for older v1 WebGL devices. PixiJS will aim to ensure compatibility
+ * with older / less advanced devices. If you experience unexplained flickering prefer this environment.
+ * @property {number} WEBGL - Version 1 of WebGL
+ * @property {number} WEBGL2 - Version 2 of WebGL
+ */
+
+ (function (ENV) {
+ ENV[ENV["WEBGL_LEGACY"] = 0] = "WEBGL_LEGACY";
+ ENV[ENV["WEBGL"] = 1] = "WEBGL";
+ ENV[ENV["WEBGL2"] = 2] = "WEBGL2";
+ })(exports.ENV || (exports.ENV = {}));
+ /**
+ * Constant to identify the Renderer Type.
+ *
+ * @static
+ * @memberof PIXI
+ * @name RENDERER_TYPE
+ * @enum {number}
+ * @property {number} UNKNOWN - Unknown render type.
+ * @property {number} WEBGL - WebGL render type.
+ * @property {number} CANVAS - Canvas render type.
+ */
+
+ (function (RENDERER_TYPE) {
+ RENDERER_TYPE[RENDERER_TYPE["UNKNOWN"] = 0] = "UNKNOWN";
+ RENDERER_TYPE[RENDERER_TYPE["WEBGL"] = 1] = "WEBGL";
+ RENDERER_TYPE[RENDERER_TYPE["CANVAS"] = 2] = "CANVAS";
+ })(exports.RENDERER_TYPE || (exports.RENDERER_TYPE = {}));
+ /**
+ * Bitwise OR of masks that indicate the buffers to be cleared.
+ *
+ * @static
+ * @memberof PIXI
+ * @name BUFFER_BITS
+ * @enum {number}
+ * @property {number} COLOR - Indicates the buffers currently enabled for color writing.
+ * @property {number} DEPTH - Indicates the depth buffer.
+ * @property {number} STENCIL - Indicates the stencil buffer.
+ */
+
+ (function (BUFFER_BITS) {
+ BUFFER_BITS[BUFFER_BITS["COLOR"] = 16384] = "COLOR";
+ BUFFER_BITS[BUFFER_BITS["DEPTH"] = 256] = "DEPTH";
+ BUFFER_BITS[BUFFER_BITS["STENCIL"] = 1024] = "STENCIL";
+ })(exports.BUFFER_BITS || (exports.BUFFER_BITS = {}));
+ /**
+ * Various blend modes supported by PIXI.
+ *
+ * IMPORTANT - The WebGL renderer only supports the NORMAL, ADD, MULTIPLY and SCREEN blend modes.
+ * Anything else will silently act like NORMAL.
+ *
+ * @memberof PIXI
+ * @name BLEND_MODES
+ * @enum {number}
+ * @property {number} NORMAL
+ * @property {number} ADD
+ * @property {number} MULTIPLY
+ * @property {number} SCREEN
+ * @property {number} OVERLAY
+ * @property {number} DARKEN
+ * @property {number} LIGHTEN
+ * @property {number} COLOR_DODGE
+ * @property {number} COLOR_BURN
+ * @property {number} HARD_LIGHT
+ * @property {number} SOFT_LIGHT
+ * @property {number} DIFFERENCE
+ * @property {number} EXCLUSION
+ * @property {number} HUE
+ * @property {number} SATURATION
+ * @property {number} COLOR
+ * @property {number} LUMINOSITY
+ * @property {number} NORMAL_NPM
+ * @property {number} ADD_NPM
+ * @property {number} SCREEN_NPM
+ * @property {number} NONE
+ * @property {number} SRC_IN
+ * @property {number} SRC_OUT
+ * @property {number} SRC_ATOP
+ * @property {number} DST_OVER
+ * @property {number} DST_IN
+ * @property {number} DST_OUT
+ * @property {number} DST_ATOP
+ * @property {number} SUBTRACT
+ * @property {number} SRC_OVER
+ * @property {number} ERASE
+ * @property {number} XOR
+ */
+
+ (function (BLEND_MODES) {
+ BLEND_MODES[BLEND_MODES["NORMAL"] = 0] = "NORMAL";
+ BLEND_MODES[BLEND_MODES["ADD"] = 1] = "ADD";
+ BLEND_MODES[BLEND_MODES["MULTIPLY"] = 2] = "MULTIPLY";
+ BLEND_MODES[BLEND_MODES["SCREEN"] = 3] = "SCREEN";
+ BLEND_MODES[BLEND_MODES["OVERLAY"] = 4] = "OVERLAY";
+ BLEND_MODES[BLEND_MODES["DARKEN"] = 5] = "DARKEN";
+ BLEND_MODES[BLEND_MODES["LIGHTEN"] = 6] = "LIGHTEN";
+ BLEND_MODES[BLEND_MODES["COLOR_DODGE"] = 7] = "COLOR_DODGE";
+ BLEND_MODES[BLEND_MODES["COLOR_BURN"] = 8] = "COLOR_BURN";
+ BLEND_MODES[BLEND_MODES["HARD_LIGHT"] = 9] = "HARD_LIGHT";
+ BLEND_MODES[BLEND_MODES["SOFT_LIGHT"] = 10] = "SOFT_LIGHT";
+ BLEND_MODES[BLEND_MODES["DIFFERENCE"] = 11] = "DIFFERENCE";
+ BLEND_MODES[BLEND_MODES["EXCLUSION"] = 12] = "EXCLUSION";
+ BLEND_MODES[BLEND_MODES["HUE"] = 13] = "HUE";
+ BLEND_MODES[BLEND_MODES["SATURATION"] = 14] = "SATURATION";
+ BLEND_MODES[BLEND_MODES["COLOR"] = 15] = "COLOR";
+ BLEND_MODES[BLEND_MODES["LUMINOSITY"] = 16] = "LUMINOSITY";
+ BLEND_MODES[BLEND_MODES["NORMAL_NPM"] = 17] = "NORMAL_NPM";
+ BLEND_MODES[BLEND_MODES["ADD_NPM"] = 18] = "ADD_NPM";
+ BLEND_MODES[BLEND_MODES["SCREEN_NPM"] = 19] = "SCREEN_NPM";
+ BLEND_MODES[BLEND_MODES["NONE"] = 20] = "NONE";
+ BLEND_MODES[BLEND_MODES["SRC_OVER"] = 0] = "SRC_OVER";
+ BLEND_MODES[BLEND_MODES["SRC_IN"] = 21] = "SRC_IN";
+ BLEND_MODES[BLEND_MODES["SRC_OUT"] = 22] = "SRC_OUT";
+ BLEND_MODES[BLEND_MODES["SRC_ATOP"] = 23] = "SRC_ATOP";
+ BLEND_MODES[BLEND_MODES["DST_OVER"] = 24] = "DST_OVER";
+ BLEND_MODES[BLEND_MODES["DST_IN"] = 25] = "DST_IN";
+ BLEND_MODES[BLEND_MODES["DST_OUT"] = 26] = "DST_OUT";
+ BLEND_MODES[BLEND_MODES["DST_ATOP"] = 27] = "DST_ATOP";
+ BLEND_MODES[BLEND_MODES["ERASE"] = 26] = "ERASE";
+ BLEND_MODES[BLEND_MODES["SUBTRACT"] = 28] = "SUBTRACT";
+ BLEND_MODES[BLEND_MODES["XOR"] = 29] = "XOR";
+ })(exports.BLEND_MODES || (exports.BLEND_MODES = {}));
+ /**
+ * Various webgl draw modes. These can be used to specify which GL drawMode to use
+ * under certain situations and renderers.
+ *
+ * @memberof PIXI
+ * @static
+ * @name DRAW_MODES
+ * @enum {number}
+ * @property {number} POINTS
+ * @property {number} LINES
+ * @property {number} LINE_LOOP
+ * @property {number} LINE_STRIP
+ * @property {number} TRIANGLES
+ * @property {number} TRIANGLE_STRIP
+ * @property {number} TRIANGLE_FAN
+ */
+
+ (function (DRAW_MODES) {
+ DRAW_MODES[DRAW_MODES["POINTS"] = 0] = "POINTS";
+ DRAW_MODES[DRAW_MODES["LINES"] = 1] = "LINES";
+ DRAW_MODES[DRAW_MODES["LINE_LOOP"] = 2] = "LINE_LOOP";
+ DRAW_MODES[DRAW_MODES["LINE_STRIP"] = 3] = "LINE_STRIP";
+ DRAW_MODES[DRAW_MODES["TRIANGLES"] = 4] = "TRIANGLES";
+ DRAW_MODES[DRAW_MODES["TRIANGLE_STRIP"] = 5] = "TRIANGLE_STRIP";
+ DRAW_MODES[DRAW_MODES["TRIANGLE_FAN"] = 6] = "TRIANGLE_FAN";
+ })(exports.DRAW_MODES || (exports.DRAW_MODES = {}));
+ /**
+ * Various GL texture/resources formats.
+ *
+ * @memberof PIXI
+ * @static
+ * @name FORMATS
+ * @enum {number}
+ * @property {number} RGBA=6408
+ * @property {number} RGB=6407
+ * @property {number} ALPHA=6406
+ * @property {number} LUMINANCE=6409
+ * @property {number} LUMINANCE_ALPHA=6410
+ * @property {number} DEPTH_COMPONENT=6402
+ * @property {number} DEPTH_STENCIL=34041
+ */
+
+ (function (FORMATS) {
+ FORMATS[FORMATS["RGBA"] = 6408] = "RGBA";
+ FORMATS[FORMATS["RGB"] = 6407] = "RGB";
+ FORMATS[FORMATS["ALPHA"] = 6406] = "ALPHA";
+ FORMATS[FORMATS["LUMINANCE"] = 6409] = "LUMINANCE";
+ FORMATS[FORMATS["LUMINANCE_ALPHA"] = 6410] = "LUMINANCE_ALPHA";
+ FORMATS[FORMATS["DEPTH_COMPONENT"] = 6402] = "DEPTH_COMPONENT";
+ FORMATS[FORMATS["DEPTH_STENCIL"] = 34041] = "DEPTH_STENCIL";
+ })(exports.FORMATS || (exports.FORMATS = {}));
+ /**
+ * Various GL target types.
+ *
+ * @memberof PIXI
+ * @static
+ * @name TARGETS
+ * @enum {number}
+ * @property {number} TEXTURE_2D=3553
+ * @property {number} TEXTURE_CUBE_MAP=34067
+ * @property {number} TEXTURE_2D_ARRAY=35866
+ * @property {number} TEXTURE_CUBE_MAP_POSITIVE_X=34069
+ * @property {number} TEXTURE_CUBE_MAP_NEGATIVE_X=34070
+ * @property {number} TEXTURE_CUBE_MAP_POSITIVE_Y=34071
+ * @property {number} TEXTURE_CUBE_MAP_NEGATIVE_Y=34072
+ * @property {number} TEXTURE_CUBE_MAP_POSITIVE_Z=34073
+ * @property {number} TEXTURE_CUBE_MAP_NEGATIVE_Z=34074
+ */
+
+ (function (TARGETS) {
+ TARGETS[TARGETS["TEXTURE_2D"] = 3553] = "TEXTURE_2D";
+ TARGETS[TARGETS["TEXTURE_CUBE_MAP"] = 34067] = "TEXTURE_CUBE_MAP";
+ TARGETS[TARGETS["TEXTURE_2D_ARRAY"] = 35866] = "TEXTURE_2D_ARRAY";
+ TARGETS[TARGETS["TEXTURE_CUBE_MAP_POSITIVE_X"] = 34069] = "TEXTURE_CUBE_MAP_POSITIVE_X";
+ TARGETS[TARGETS["TEXTURE_CUBE_MAP_NEGATIVE_X"] = 34070] = "TEXTURE_CUBE_MAP_NEGATIVE_X";
+ TARGETS[TARGETS["TEXTURE_CUBE_MAP_POSITIVE_Y"] = 34071] = "TEXTURE_CUBE_MAP_POSITIVE_Y";
+ TARGETS[TARGETS["TEXTURE_CUBE_MAP_NEGATIVE_Y"] = 34072] = "TEXTURE_CUBE_MAP_NEGATIVE_Y";
+ TARGETS[TARGETS["TEXTURE_CUBE_MAP_POSITIVE_Z"] = 34073] = "TEXTURE_CUBE_MAP_POSITIVE_Z";
+ TARGETS[TARGETS["TEXTURE_CUBE_MAP_NEGATIVE_Z"] = 34074] = "TEXTURE_CUBE_MAP_NEGATIVE_Z";
+ })(exports.TARGETS || (exports.TARGETS = {}));
+ /**
+ * Various GL data format types.
+ *
+ * @memberof PIXI
+ * @static
+ * @name TYPES
+ * @enum {number}
+ * @property {number} UNSIGNED_BYTE=5121
+ * @property {number} UNSIGNED_SHORT=5123
+ * @property {number} UNSIGNED_SHORT_5_6_5=33635
+ * @property {number} UNSIGNED_SHORT_4_4_4_4=32819
+ * @property {number} UNSIGNED_SHORT_5_5_5_1=32820
+ * @property {number} FLOAT=5126
+ * @property {number} HALF_FLOAT=36193
+ */
+
+ (function (TYPES) {
+ TYPES[TYPES["UNSIGNED_BYTE"] = 5121] = "UNSIGNED_BYTE";
+ TYPES[TYPES["UNSIGNED_SHORT"] = 5123] = "UNSIGNED_SHORT";
+ TYPES[TYPES["UNSIGNED_SHORT_5_6_5"] = 33635] = "UNSIGNED_SHORT_5_6_5";
+ TYPES[TYPES["UNSIGNED_SHORT_4_4_4_4"] = 32819] = "UNSIGNED_SHORT_4_4_4_4";
+ TYPES[TYPES["UNSIGNED_SHORT_5_5_5_1"] = 32820] = "UNSIGNED_SHORT_5_5_5_1";
+ TYPES[TYPES["FLOAT"] = 5126] = "FLOAT";
+ TYPES[TYPES["HALF_FLOAT"] = 36193] = "HALF_FLOAT";
+ })(exports.TYPES || (exports.TYPES = {}));
+ /**
+ * The scale modes that are supported by pixi.
+ *
+ * The {@link PIXI.settings.SCALE_MODE} scale mode affects the default scaling mode of future operations.
+ * It can be re-assigned to either LINEAR or NEAREST, depending upon suitability.
+ *
+ * @memberof PIXI
+ * @static
+ * @name SCALE_MODES
+ * @enum {number}
+ * @property {number} LINEAR Smooth scaling
+ * @property {number} NEAREST Pixelating scaling
+ */
+
+ (function (SCALE_MODES) {
+ SCALE_MODES[SCALE_MODES["NEAREST"] = 0] = "NEAREST";
+ SCALE_MODES[SCALE_MODES["LINEAR"] = 1] = "LINEAR";
+ })(exports.SCALE_MODES || (exports.SCALE_MODES = {}));
+ /**
+ * The wrap modes that are supported by pixi.
+ *
+ * The {@link PIXI.settings.WRAP_MODE} wrap mode affects the default wrapping mode of future operations.
+ * It can be re-assigned to either CLAMP or REPEAT, depending upon suitability.
+ * If the texture is non power of two then clamp will be used regardless as WebGL can
+ * only use REPEAT if the texture is po2.
+ *
+ * This property only affects WebGL.
+ *
+ * @name WRAP_MODES
+ * @memberof PIXI
+ * @static
+ * @enum {number}
+ * @property {number} CLAMP - The textures uvs are clamped
+ * @property {number} REPEAT - The texture uvs tile and repeat
+ * @property {number} MIRRORED_REPEAT - The texture uvs tile and repeat with mirroring
+ */
+
+ (function (WRAP_MODES) {
+ WRAP_MODES[WRAP_MODES["CLAMP"] = 33071] = "CLAMP";
+ WRAP_MODES[WRAP_MODES["REPEAT"] = 10497] = "REPEAT";
+ WRAP_MODES[WRAP_MODES["MIRRORED_REPEAT"] = 33648] = "MIRRORED_REPEAT";
+ })(exports.WRAP_MODES || (exports.WRAP_MODES = {}));
+ /**
+ * Mipmap filtering modes that are supported by pixi.
+ *
+ * The {@link PIXI.settings.MIPMAP_TEXTURES} affects default texture filtering.
+ * Mipmaps are generated for a baseTexture if its `mipmap` field is `ON`,
+ * or its `POW2` and texture dimensions are powers of 2.
+ * Due to platform restriction, `ON` option will work like `POW2` for webgl-1.
+ *
+ * This property only affects WebGL.
+ *
+ * @name MIPMAP_MODES
+ * @memberof PIXI
+ * @static
+ * @enum {number}
+ * @property {number} OFF - No mipmaps
+ * @property {number} POW2 - Generate mipmaps if texture dimensions are pow2
+ * @property {number} ON - Always generate mipmaps
+ */
+
+ (function (MIPMAP_MODES) {
+ MIPMAP_MODES[MIPMAP_MODES["OFF"] = 0] = "OFF";
+ MIPMAP_MODES[MIPMAP_MODES["POW2"] = 1] = "POW2";
+ MIPMAP_MODES[MIPMAP_MODES["ON"] = 2] = "ON";
+ })(exports.MIPMAP_MODES || (exports.MIPMAP_MODES = {}));
+ /**
+ * How to treat textures with premultiplied alpha
+ *
+ * @name ALPHA_MODES
+ * @memberof PIXI
+ * @static
+ * @enum {number}
+ * @property {number} NO_PREMULTIPLIED_ALPHA - Source is not premultiplied, leave it like that.
+ * Option for compressed and data textures that are created from typed arrays.
+ * @property {number} PREMULTIPLY_ON_UPLOAD - Source is not premultiplied, premultiply on upload.
+ * Default option, used for all loaded images.
+ * @property {number} PREMULTIPLIED_ALPHA - Source is already premultiplied
+ * Example: spine atlases with `_pma` suffix.
+ * @property {number} NPM - Alias for NO_PREMULTIPLIED_ALPHA.
+ * @property {number} UNPACK - Default option, alias for PREMULTIPLY_ON_UPLOAD.
+ * @property {number} PMA - Alias for PREMULTIPLIED_ALPHA.
+ */
+
+ (function (ALPHA_MODES) {
+ ALPHA_MODES[ALPHA_MODES["NPM"] = 0] = "NPM";
+ ALPHA_MODES[ALPHA_MODES["UNPACK"] = 1] = "UNPACK";
+ ALPHA_MODES[ALPHA_MODES["PMA"] = 2] = "PMA";
+ ALPHA_MODES[ALPHA_MODES["NO_PREMULTIPLIED_ALPHA"] = 0] = "NO_PREMULTIPLIED_ALPHA";
+ ALPHA_MODES[ALPHA_MODES["PREMULTIPLY_ON_UPLOAD"] = 1] = "PREMULTIPLY_ON_UPLOAD";
+ ALPHA_MODES[ALPHA_MODES["PREMULTIPLY_ALPHA"] = 2] = "PREMULTIPLY_ALPHA";
+ })(exports.ALPHA_MODES || (exports.ALPHA_MODES = {}));
+ /**
+ * How to clear renderTextures in filter
+ *
+ * @name CLEAR_MODES
+ * @memberof PIXI
+ * @static
+ * @enum {number}
+ * @property {number} BLEND - Preserve the information in the texture, blend above
+ * @property {number} CLEAR - Must use `gl.clear` operation
+ * @property {number} BLIT - Clear or blit it, depends on device and level of paranoia
+ * @property {number} NO - Alias for BLEND, same as `false` in earlier versions
+ * @property {number} YES - Alias for CLEAR, same as `true` in earlier versions
+ * @property {number} AUTO - Alias for BLIT
+ */
+
+ (function (CLEAR_MODES) {
+ CLEAR_MODES[CLEAR_MODES["NO"] = 0] = "NO";
+ CLEAR_MODES[CLEAR_MODES["YES"] = 1] = "YES";
+ CLEAR_MODES[CLEAR_MODES["AUTO"] = 2] = "AUTO";
+ CLEAR_MODES[CLEAR_MODES["BLEND"] = 0] = "BLEND";
+ CLEAR_MODES[CLEAR_MODES["CLEAR"] = 1] = "CLEAR";
+ CLEAR_MODES[CLEAR_MODES["BLIT"] = 2] = "BLIT";
+ })(exports.CLEAR_MODES || (exports.CLEAR_MODES = {}));
+ /**
+ * The gc modes that are supported by pixi.
+ *
+ * The {@link PIXI.settings.GC_MODE} Garbage Collection mode for PixiJS textures is AUTO
+ * If set to GC_MODE, the renderer will occasionally check textures usage. If they are not
+ * used for a specified period of time they will be removed from the GPU. They will of course
+ * be uploaded again when they are required. This is a silent behind the scenes process that
+ * should ensure that the GPU does not get filled up.
+ *
+ * Handy for mobile devices!
+ * This property only affects WebGL.
+ *
+ * @name GC_MODES
+ * @enum {number}
+ * @static
+ * @memberof PIXI
+ * @property {number} AUTO - Garbage collection will happen periodically automatically
+ * @property {number} MANUAL - Garbage collection will need to be called manually
+ */
+
+ (function (GC_MODES) {
+ GC_MODES[GC_MODES["AUTO"] = 0] = "AUTO";
+ GC_MODES[GC_MODES["MANUAL"] = 1] = "MANUAL";
+ })(exports.GC_MODES || (exports.GC_MODES = {}));
+ /**
+ * Constants that specify float precision in shaders.
+ *
+ * @name PRECISION
+ * @memberof PIXI
+ * @constant
+ * @static
+ * @enum {string}
+ * @property {string} LOW='lowp'
+ * @property {string} MEDIUM='mediump'
+ * @property {string} HIGH='highp'
+ */
+
+ (function (PRECISION) {
+ PRECISION["LOW"] = "lowp";
+ PRECISION["MEDIUM"] = "mediump";
+ PRECISION["HIGH"] = "highp";
+ })(exports.PRECISION || (exports.PRECISION = {}));
+ /**
+ * Constants for mask implementations.
+ * We use `type` suffix because it leads to very different behaviours
+ *
+ * @name MASK_TYPES
+ * @memberof PIXI
+ * @static
+ * @enum {number}
+ * @property {number} NONE - Mask is ignored
+ * @property {number} SCISSOR - Scissor mask, rectangle on screen, cheap
+ * @property {number} STENCIL - Stencil mask, 1-bit, medium, works only if renderer supports stencil
+ * @property {number} SPRITE - Mask that uses SpriteMaskFilter, uses temporary RenderTexture
+ */
+
+ (function (MASK_TYPES) {
+ MASK_TYPES[MASK_TYPES["NONE"] = 0] = "NONE";
+ MASK_TYPES[MASK_TYPES["SCISSOR"] = 1] = "SCISSOR";
+ MASK_TYPES[MASK_TYPES["STENCIL"] = 2] = "STENCIL";
+ MASK_TYPES[MASK_TYPES["SPRITE"] = 3] = "SPRITE";
+ })(exports.MASK_TYPES || (exports.MASK_TYPES = {}));
+ /**
+ * Constants for multi-sampling antialiasing.
+ *
+ * @see PIXI.Framebuffer#multisample
+ *
+ * @name MSAA_QUALITY
+ * @memberof PIXI
+ * @static
+ * @enum {number}
+ * @property {number} NONE - No multisampling for this renderTexture
+ * @property {number} LOW - Try 2 samples
+ * @property {number} MEDIUM - Try 4 samples
+ * @property {number} HIGH - Try 8 samples
+ */
+
+ (function (MSAA_QUALITY) {
+ MSAA_QUALITY[MSAA_QUALITY["NONE"] = 0] = "NONE";
+ MSAA_QUALITY[MSAA_QUALITY["LOW"] = 2] = "LOW";
+ MSAA_QUALITY[MSAA_QUALITY["MEDIUM"] = 4] = "MEDIUM";
+ MSAA_QUALITY[MSAA_QUALITY["HIGH"] = 8] = "HIGH";
+ })(exports.MSAA_QUALITY || (exports.MSAA_QUALITY = {}));
+
+ /*!
+ * @pixi/utils - v5.3.12
+ * Compiled Wed, 23 Mar 2022 18:38:07 UTC
+ *
+ * @pixi/utils is licensed under the MIT License.
+ * http://www.opensource.org/licenses/mit-license
+ */
+
+ /**
+ * The prefix that denotes a URL is for a retina asset.
+ *
+ * @static
+ * @name RETINA_PREFIX
+ * @memberof PIXI.settings
+ * @type {RegExp}
+ * @default /@([0-9\.]+)x/
+ * @example `@2x`
+ */
+ settings.RETINA_PREFIX = /@([0-9\.]+)x/;
+ /**
+ * Should the `failIfMajorPerformanceCaveat` flag be enabled as a context option used in the `isWebGLSupported` function.
+ * For most scenarios this should be left as true, as otherwise the user may have a poor experience.
+ * However, it can be useful to disable under certain scenarios, such as headless unit tests.
+ *
+ * @static
+ * @name FAIL_IF_MAJOR_PERFORMANCE_CAVEAT
+ * @memberof PIXI.settings
+ * @type {boolean}
+ * @default true
+ */
+ settings.FAIL_IF_MAJOR_PERFORMANCE_CAVEAT = true;
+
+ var saidHello = false;
+ var VERSION = '5.3.12';
+ /**
+ * Skips the hello message of renderers that are created after this is run.
+ *
+ * @function skipHello
+ * @memberof PIXI.utils
+ */
+ function skipHello() {
+ saidHello = true;
+ }
+ /**
+ * Logs out the version and renderer information for this running instance of PIXI.
+ * If you don't want to see this message you can run `PIXI.utils.skipHello()` before
+ * creating your renderer. Keep in mind that doing that will forever make you a jerk face.
+ *
+ * @static
+ * @function sayHello
+ * @memberof PIXI.utils
+ * @param {string} type - The string renderer type to log.
+ */
+ function sayHello(type) {
+ var _a;
+ if (saidHello) {
+ return;
+ }
+ if (navigator.userAgent.toLowerCase().indexOf('chrome') > -1) {
+ var args = [
+ "\n %c %c %c PixiJS " + VERSION + " - \u2730 " + type + " \u2730 %c %c http://www.pixijs.com/ %c %c \u2665%c\u2665%c\u2665 \n\n",
+ 'background: #ff66a5; padding:5px 0;',
+ 'background: #ff66a5; padding:5px 0;',
+ 'color: #ff66a5; background: #030307; padding:5px 0;',
+ 'background: #ff66a5; padding:5px 0;',
+ 'background: #ffc3dc; padding:5px 0;',
+ 'background: #ff66a5; padding:5px 0;',
+ 'color: #ff2424; background: #fff; padding:5px 0;',
+ 'color: #ff2424; background: #fff; padding:5px 0;',
+ 'color: #ff2424; background: #fff; padding:5px 0;' ];
+ (_a = window.console).log.apply(_a, args);
+ }
+ else if (window.console) {
+ window.console.log("PixiJS " + VERSION + " - " + type + " - http://www.pixijs.com/");
+ }
+ saidHello = true;
+ }
+
+ var supported;
+ /**
+ * Helper for checking for WebGL support.
+ *
+ * @memberof PIXI.utils
+ * @function isWebGLSupported
+ * @return {boolean} Is WebGL supported.
+ */
+ function isWebGLSupported() {
+ if (typeof supported === 'undefined') {
+ supported = (function supported() {
+ var contextOptions = {
+ stencil: true,
+ failIfMajorPerformanceCaveat: settings.FAIL_IF_MAJOR_PERFORMANCE_CAVEAT,
+ };
+ try {
+ if (!window.WebGLRenderingContext) {
+ return false;
+ }
+ var canvas = document.createElement('canvas');
+ var gl = (canvas.getContext('webgl', contextOptions)
+ || canvas.getContext('experimental-webgl', contextOptions));
+ var success = !!(gl && gl.getContextAttributes().stencil);
+ if (gl) {
+ var loseContext = gl.getExtension('WEBGL_lose_context');
+ if (loseContext) {
+ loseContext.loseContext();
+ }
+ }
+ gl = null;
+ return success;
+ }
+ catch (e) {
+ return false;
+ }
+ })();
+ }
+ return supported;
+ }
+
+ /**
+ * Converts a hexadecimal color number to an [R, G, B] array of normalized floats (numbers from 0.0 to 1.0).
+ *
+ * @example
+ * PIXI.utils.hex2rgb(0xffffff); // returns [1, 1, 1]
+ * @memberof PIXI.utils
+ * @function hex2rgb
+ * @param {number} hex - The hexadecimal number to convert
+ * @param {number[]} [out=[]] - If supplied, this array will be used rather than returning a new one
+ * @return {number[]} An array representing the [R, G, B] of the color where all values are floats.
+ */
+ function hex2rgb(hex, out) {
+ if (out === void 0) { out = []; }
+ out[0] = ((hex >> 16) & 0xFF) / 255;
+ out[1] = ((hex >> 8) & 0xFF) / 255;
+ out[2] = (hex & 0xFF) / 255;
+ return out;
+ }
+ /**
+ * Converts a hexadecimal color number to a string.
+ *
+ * @example
+ * PIXI.utils.hex2string(0xffffff); // returns "#ffffff"
+ * @memberof PIXI.utils
+ * @function hex2string
+ * @param {number} hex - Number in hex (e.g., `0xffffff`)
+ * @return {string} The string color (e.g., `"#ffffff"`).
+ */
+ function hex2string(hex) {
+ var hexString = hex.toString(16);
+ hexString = '000000'.substr(0, 6 - hexString.length) + hexString;
+ return "#" + hexString;
+ }
+ /**
+ * Converts a hexadecimal string to a hexadecimal color number.
+ *
+ * @example
+ * PIXI.utils.string2hex("#ffffff"); // returns 0xffffff
+ * @memberof PIXI.utils
+ * @function string2hex
+ * @param {string} string - The string color (e.g., `"#ffffff"`)
+ * @return {number} Number in hexadecimal.
+ */
+ function string2hex(string) {
+ if (typeof string === 'string' && string[0] === '#') {
+ string = string.substr(1);
+ }
+ return parseInt(string, 16);
+ }
+ /**
+ * Converts a color as an [R, G, B] array of normalized floats to a hexadecimal number.
+ *
+ * @example
+ * PIXI.utils.rgb2hex([1, 1, 1]); // returns 0xffffff
+ * @memberof PIXI.utils
+ * @function rgb2hex
+ * @param {number[]} rgb - Array of numbers where all values are normalized floats from 0.0 to 1.0.
+ * @return {number} Number in hexadecimal.
+ */
+ function rgb2hex(rgb) {
+ return (((rgb[0] * 255) << 16) + ((rgb[1] * 255) << 8) + (rgb[2] * 255 | 0));
+ }
+
+ /**
+ * Corrects PixiJS blend, takes premultiplied alpha into account
+ *
+ * @memberof PIXI.utils
+ * @function mapPremultipliedBlendModes
+ * @private
+ * @return {Array} Mapped modes.
+ */
+ function mapPremultipliedBlendModes() {
+ var pm = [];
+ var npm = [];
+ for (var i = 0; i < 32; i++) {
+ pm[i] = i;
+ npm[i] = i;
+ }
+ pm[exports.BLEND_MODES.NORMAL_NPM] = exports.BLEND_MODES.NORMAL;
+ pm[exports.BLEND_MODES.ADD_NPM] = exports.BLEND_MODES.ADD;
+ pm[exports.BLEND_MODES.SCREEN_NPM] = exports.BLEND_MODES.SCREEN;
+ npm[exports.BLEND_MODES.NORMAL] = exports.BLEND_MODES.NORMAL_NPM;
+ npm[exports.BLEND_MODES.ADD] = exports.BLEND_MODES.ADD_NPM;
+ npm[exports.BLEND_MODES.SCREEN] = exports.BLEND_MODES.SCREEN_NPM;
+ var array = [];
+ array.push(npm);
+ array.push(pm);
+ return array;
+ }
+ /**
+ * maps premultiply flag and blendMode to adjusted blendMode
+ * @memberof PIXI.utils
+ * @const premultiplyBlendMode
+ * @type {Array}
+ */
+ var premultiplyBlendMode = mapPremultipliedBlendModes();
+ /**
+ * changes blendMode according to texture format
+ *
+ * @memberof PIXI.utils
+ * @function correctBlendMode
+ * @param {number} blendMode - supposed blend mode
+ * @param {boolean} premultiplied - whether source is premultiplied
+ * @returns {number} true blend mode for this texture
+ */
+ function correctBlendMode(blendMode, premultiplied) {
+ return premultiplyBlendMode[premultiplied ? 1 : 0][blendMode];
+ }
+ /**
+ * combines rgb and alpha to out array
+ *
+ * @memberof PIXI.utils
+ * @function premultiplyRgba
+ * @param {Float32Array|number[]} rgb - input rgb
+ * @param {number} alpha - alpha param
+ * @param {Float32Array} [out] - output
+ * @param {boolean} [premultiply=true] - do premultiply it
+ * @returns {Float32Array} vec4 rgba
+ */
+ function premultiplyRgba(rgb, alpha, out, premultiply) {
+ out = out || new Float32Array(4);
+ if (premultiply || premultiply === undefined) {
+ out[0] = rgb[0] * alpha;
+ out[1] = rgb[1] * alpha;
+ out[2] = rgb[2] * alpha;
+ }
+ else {
+ out[0] = rgb[0];
+ out[1] = rgb[1];
+ out[2] = rgb[2];
+ }
+ out[3] = alpha;
+ return out;
+ }
+ /**
+ * premultiplies tint
+ *
+ * @memberof PIXI.utils
+ * @function premultiplyTint
+ * @param {number} tint - integer RGB
+ * @param {number} alpha - floating point alpha (0.0-1.0)
+ * @returns {number} tint multiplied by alpha
+ */
+ function premultiplyTint(tint, alpha) {
+ if (alpha === 1.0) {
+ return (alpha * 255 << 24) + tint;
+ }
+ if (alpha === 0.0) {
+ return 0;
+ }
+ var R = ((tint >> 16) & 0xFF);
+ var G = ((tint >> 8) & 0xFF);
+ var B = (tint & 0xFF);
+ R = ((R * alpha) + 0.5) | 0;
+ G = ((G * alpha) + 0.5) | 0;
+ B = ((B * alpha) + 0.5) | 0;
+ return (alpha * 255 << 24) + (R << 16) + (G << 8) + B;
+ }
+ /**
+ * converts integer tint and float alpha to vec4 form, premultiplies by default
+ *
+ * @memberof PIXI.utils
+ * @function premultiplyTintToRgba
+ * @param {number} tint - input tint
+ * @param {number} alpha - alpha param
+ * @param {Float32Array} [out] output
+ * @param {boolean} [premultiply=true] - do premultiply it
+ * @returns {Float32Array} vec4 rgba
+ */
+ function premultiplyTintToRgba(tint, alpha, out, premultiply) {
+ out = out || new Float32Array(4);
+ out[0] = ((tint >> 16) & 0xFF) / 255.0;
+ out[1] = ((tint >> 8) & 0xFF) / 255.0;
+ out[2] = (tint & 0xFF) / 255.0;
+ if (premultiply || premultiply === undefined) {
+ out[0] *= alpha;
+ out[1] *= alpha;
+ out[2] *= alpha;
+ }
+ out[3] = alpha;
+ return out;
+ }
+
+ /**
+ * Generic Mask Stack data structure
+ *
+ * @memberof PIXI.utils
+ * @function createIndicesForQuads
+ * @param {number} size - Number of quads
+ * @param {Uint16Array|Uint32Array} [outBuffer] - Buffer for output, length has to be `6 * size`
+ * @return {Uint16Array|Uint32Array} - Resulting index buffer
+ */
+ function createIndicesForQuads(size, outBuffer) {
+ if (outBuffer === void 0) { outBuffer = null; }
+ // the total number of indices in our array, there are 6 points per quad.
+ var totalIndices = size * 6;
+ outBuffer = outBuffer || new Uint16Array(totalIndices);
+ if (outBuffer.length !== totalIndices) {
+ throw new Error("Out buffer length is incorrect, got " + outBuffer.length + " and expected " + totalIndices);
+ }
+ // fill the indices with the quads to draw
+ for (var i = 0, j = 0; i < totalIndices; i += 6, j += 4) {
+ outBuffer[i + 0] = j + 0;
+ outBuffer[i + 1] = j + 1;
+ outBuffer[i + 2] = j + 2;
+ outBuffer[i + 3] = j + 0;
+ outBuffer[i + 4] = j + 2;
+ outBuffer[i + 5] = j + 3;
+ }
+ return outBuffer;
+ }
+
+ function getBufferType(array) {
+ if (array.BYTES_PER_ELEMENT === 4) {
+ if (array instanceof Float32Array) {
+ return 'Float32Array';
+ }
+ else if (array instanceof Uint32Array) {
+ return 'Uint32Array';
+ }
+ return 'Int32Array';
+ }
+ else if (array.BYTES_PER_ELEMENT === 2) {
+ if (array instanceof Uint16Array) {
+ return 'Uint16Array';
+ }
+ }
+ else if (array.BYTES_PER_ELEMENT === 1) {
+ if (array instanceof Uint8Array) {
+ return 'Uint8Array';
+ }
+ }
+ // TODO map out the rest of the array elements!
+ return null;
+ }
+
+ /* eslint-disable object-shorthand */
+ var map = { Float32Array: Float32Array, Uint32Array: Uint32Array, Int32Array: Int32Array, Uint8Array: Uint8Array };
+ function interleaveTypedArrays(arrays, sizes) {
+ var outSize = 0;
+ var stride = 0;
+ var views = {};
+ for (var i = 0; i < arrays.length; i++) {
+ stride += sizes[i];
+ outSize += arrays[i].length;
+ }
+ var buffer = new ArrayBuffer(outSize * 4);
+ var out = null;
+ var littleOffset = 0;
+ for (var i = 0; i < arrays.length; i++) {
+ var size = sizes[i];
+ var array = arrays[i];
+ /*
+ @todo This is unsafe casting but consistent with how the code worked previously. Should it stay this way
+ or should and `getBufferTypeUnsafe` function be exposed that throws an Error if unsupported type is passed?
+ */
+ var type = getBufferType(array);
+ if (!views[type]) {
+ views[type] = new map[type](buffer);
+ }
+ out = views[type];
+ for (var j = 0; j < array.length; j++) {
+ var indexStart = ((j / size | 0) * stride) + littleOffset;
+ var index = j % size;
+ out[indexStart + index] = array[j];
+ }
+ littleOffset += size;
+ }
+ return new Float32Array(buffer);
+ }
+
+ // Taken from the bit-twiddle package
+ /**
+ * Rounds to next power of two.
+ *
+ * @function nextPow2
+ * @memberof PIXI.utils
+ * @param {number} v - input value
+ * @return {number}
+ */
+ function nextPow2(v) {
+ v += v === 0 ? 1 : 0;
+ --v;
+ v |= v >>> 1;
+ v |= v >>> 2;
+ v |= v >>> 4;
+ v |= v >>> 8;
+ v |= v >>> 16;
+ return v + 1;
+ }
+ /**
+ * Checks if a number is a power of two.
+ *
+ * @function isPow2
+ * @memberof PIXI.utils
+ * @param {number} v - input value
+ * @return {boolean} `true` if value is power of two
+ */
+ function isPow2(v) {
+ return !(v & (v - 1)) && (!!v);
+ }
+ /**
+ * Computes ceil of log base 2
+ *
+ * @function log2
+ * @memberof PIXI.utils
+ * @param {number} v - input value
+ * @return {number} logarithm base 2
+ */
+ function log2(v) {
+ var r = (v > 0xFFFF ? 1 : 0) << 4;
+ v >>>= r;
+ var shift = (v > 0xFF ? 1 : 0) << 3;
+ v >>>= shift;
+ r |= shift;
+ shift = (v > 0xF ? 1 : 0) << 2;
+ v >>>= shift;
+ r |= shift;
+ shift = (v > 0x3 ? 1 : 0) << 1;
+ v >>>= shift;
+ r |= shift;
+ return r | (v >> 1);
+ }
+
+ /**
+ * Remove items from a javascript array without generating garbage
+ *
+ * @function removeItems
+ * @memberof PIXI.utils
+ * @param {Array} arr - Array to remove elements from
+ * @param {number} startIdx - starting index
+ * @param {number} removeCount - how many to remove
+ */
+ function removeItems(arr, startIdx, removeCount) {
+ var length = arr.length;
+ var i;
+ if (startIdx >= length || removeCount === 0) {
+ return;
+ }
+ removeCount = (startIdx + removeCount > length ? length - startIdx : removeCount);
+ var len = length - removeCount;
+ for (i = startIdx; i < len; ++i) {
+ arr[i] = arr[i + removeCount];
+ }
+ arr.length = len;
+ }
+
+ /**
+ * Returns sign of number
+ *
+ * @memberof PIXI.utils
+ * @function sign
+ * @param {number} n - the number to check the sign of
+ * @returns {number} 0 if `n` is 0, -1 if `n` is negative, 1 if `n` is positive
+ */
+ function sign$1(n) {
+ if (n === 0)
+ { return 0; }
+ return n < 0 ? -1 : 1;
+ }
+
+ var nextUid = 0;
+ /**
+ * Gets the next unique identifier
+ *
+ * @memberof PIXI.utils
+ * @function uid
+ * @return {number} The next unique identifier to use.
+ */
+ function uid() {
+ return ++nextUid;
+ }
+
+ // A map of warning messages already fired
+ var warnings = {};
+ /**
+ * Helper for warning developers about deprecated features & settings.
+ * A stack track for warnings is given; useful for tracking-down where
+ * deprecated methods/properties/classes are being used within the code.
+ *
+ * @memberof PIXI.utils
+ * @function deprecation
+ * @param {string} version - The version where the feature became deprecated
+ * @param {string} message - Message should include what is deprecated, where, and the new solution
+ * @param {number} [ignoreDepth=3] - The number of steps to ignore at the top of the error stack
+ * this is mostly to ignore internal deprecation calls.
+ */
+ function deprecation(version, message, ignoreDepth) {
+ if (ignoreDepth === void 0) { ignoreDepth = 3; }
+ // Ignore duplicat
+ if (warnings[message]) {
+ return;
+ }
+ /* eslint-disable no-console */
+ var stack = new Error().stack;
+ // Handle IE < 10 and Safari < 6
+ if (typeof stack === 'undefined') {
+ console.warn('PixiJS Deprecation Warning: ', message + "\nDeprecated since v" + version);
+ }
+ else {
+ // chop off the stack trace which includes PixiJS internal calls
+ stack = stack.split('\n').splice(ignoreDepth).join('\n');
+ if (console.groupCollapsed) {
+ console.groupCollapsed('%cPixiJS Deprecation Warning: %c%s', 'color:#614108;background:#fffbe6', 'font-weight:normal;color:#614108;background:#fffbe6', message + "\nDeprecated since v" + version);
+ console.warn(stack);
+ console.groupEnd();
+ }
+ else {
+ console.warn('PixiJS Deprecation Warning: ', message + "\nDeprecated since v" + version);
+ console.warn(stack);
+ }
+ }
+ /* eslint-enable no-console */
+ warnings[message] = true;
+ }
+
+ /**
+ * @todo Describe property usage
+ *
+ * @static
+ * @name ProgramCache
+ * @memberof PIXI.utils
+ * @type {Object}
+ */
+ var ProgramCache = {};
+ /**
+ * @todo Describe property usage
+ *
+ * @static
+ * @name TextureCache
+ * @memberof PIXI.utils
+ * @type {Object}
+ */
+ var TextureCache = Object.create(null);
+ /**
+ * @todo Describe property usage
+ *
+ * @static
+ * @name BaseTextureCache
+ * @memberof PIXI.utils
+ * @type {Object}
+ */
+ var BaseTextureCache = Object.create(null);
+ /**
+ * Destroys all texture in the cache
+ *
+ * @memberof PIXI.utils
+ * @function destroyTextureCache
+ */
+ function destroyTextureCache() {
+ var key;
+ for (key in TextureCache) {
+ TextureCache[key].destroy();
+ }
+ for (key in BaseTextureCache) {
+ BaseTextureCache[key].destroy();
+ }
+ }
+ /**
+ * Removes all textures from cache, but does not destroy them
+ *
+ * @memberof PIXI.utils
+ * @function clearTextureCache
+ */
+ function clearTextureCache() {
+ var key;
+ for (key in TextureCache) {
+ delete TextureCache[key];
+ }
+ for (key in BaseTextureCache) {
+ delete BaseTextureCache[key];
+ }
+ }
+
+ /**
+ * Creates a Canvas element of the given size to be used as a target for rendering to.
+ *
+ * @class
+ * @memberof PIXI.utils
+ */
+ var CanvasRenderTarget = /** @class */ (function () {
+ /**
+ * @param {number} width - the width for the newly created canvas
+ * @param {number} height - the height for the newly created canvas
+ * @param {number} [resolution=1] - The resolution / device pixel ratio of the canvas
+ */
+ function CanvasRenderTarget(width, height, resolution) {
+ /**
+ * The Canvas object that belongs to this CanvasRenderTarget.
+ *
+ * @member {HTMLCanvasElement}
+ */
+ this.canvas = document.createElement('canvas');
+ /**
+ * A CanvasRenderingContext2D object representing a two-dimensional rendering context.
+ *
+ * @member {CanvasRenderingContext2D}
+ */
+ this.context = this.canvas.getContext('2d');
+ this.resolution = resolution || settings.RESOLUTION;
+ this.resize(width, height);
+ }
+ /**
+ * Clears the canvas that was created by the CanvasRenderTarget class.
+ *
+ * @private
+ */
+ CanvasRenderTarget.prototype.clear = function () {
+ this.context.setTransform(1, 0, 0, 1, 0, 0);
+ this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);
+ };
+ /**
+ * Resizes the canvas to the specified width and height.
+ *
+ * @param {number} width - the new width of the canvas
+ * @param {number} height - the new height of the canvas
+ */
+ CanvasRenderTarget.prototype.resize = function (width, height) {
+ this.canvas.width = width * this.resolution;
+ this.canvas.height = height * this.resolution;
+ };
+ /**
+ * Destroys this canvas.
+ *
+ */
+ CanvasRenderTarget.prototype.destroy = function () {
+ this.context = null;
+ this.canvas = null;
+ };
+ Object.defineProperty(CanvasRenderTarget.prototype, "width", {
+ /**
+ * The width of the canvas buffer in pixels.
+ *
+ * @member {number}
+ */
+ get: function () {
+ return this.canvas.width;
+ },
+ set: function (val) {
+ this.canvas.width = val;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(CanvasRenderTarget.prototype, "height", {
+ /**
+ * The height of the canvas buffer in pixels.
+ *
+ * @member {number}
+ */
+ get: function () {
+ return this.canvas.height;
+ },
+ set: function (val) {
+ this.canvas.height = val;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ return CanvasRenderTarget;
+ }());
+
+ /**
+ * Trim transparent borders from a canvas
+ *
+ * @memberof PIXI.utils
+ * @function trimCanvas
+ * @param {HTMLCanvasElement} canvas - the canvas to trim
+ * @returns {object} Trim data
+ */
+ function trimCanvas(canvas) {
+ // https://gist.github.com/remy/784508
+ var width = canvas.width;
+ var height = canvas.height;
+ var context = canvas.getContext('2d');
+ var imageData = context.getImageData(0, 0, width, height);
+ var pixels = imageData.data;
+ var len = pixels.length;
+ var bound = {
+ top: null,
+ left: null,
+ right: null,
+ bottom: null,
+ };
+ var data = null;
+ var i;
+ var x;
+ var y;
+ for (i = 0; i < len; i += 4) {
+ if (pixels[i + 3] !== 0) {
+ x = (i / 4) % width;
+ y = ~~((i / 4) / width);
+ if (bound.top === null) {
+ bound.top = y;
+ }
+ if (bound.left === null) {
+ bound.left = x;
+ }
+ else if (x < bound.left) {
+ bound.left = x;
+ }
+ if (bound.right === null) {
+ bound.right = x + 1;
+ }
+ else if (bound.right < x) {
+ bound.right = x + 1;
+ }
+ if (bound.bottom === null) {
+ bound.bottom = y;
+ }
+ else if (bound.bottom < y) {
+ bound.bottom = y;
+ }
+ }
+ }
+ if (bound.top !== null) {
+ width = bound.right - bound.left;
+ height = bound.bottom - bound.top + 1;
+ data = context.getImageData(bound.left, bound.top, width, height);
+ }
+ return {
+ height: height,
+ width: width,
+ data: data,
+ };
+ }
+
+ /**
+ * Regexp for data URI.
+ * Based on: {@link https://github.com/ragingwind/data-uri-regex}
+ *
+ * @static
+ * @constant {RegExp|string} DATA_URI
+ * @memberof PIXI
+ * @example data:image/png;base64
+ */
+ var DATA_URI = /^\s*data:(?:([\w-]+)\/([\w+.-]+))?(?:;charset=([\w-]+))?(?:;(base64))?,(.*)/i;
+
+ /**
+ * @memberof PIXI.utils
+ * @interface DecomposedDataUri
+ */
+ /**
+ * type, eg. `image`
+ * @memberof PIXI.utils.DecomposedDataUri#
+ * @member {string} mediaType
+ */
+ /**
+ * Sub type, eg. `png`
+ * @memberof PIXI.utils.DecomposedDataUri#
+ * @member {string} subType
+ */
+ /**
+ * @memberof PIXI.utils.DecomposedDataUri#
+ * @member {string} charset
+ */
+ /**
+ * Data encoding, eg. `base64`
+ * @memberof PIXI.utils.DecomposedDataUri#
+ * @member {string} encoding
+ */
+ /**
+ * The actual data
+ * @memberof PIXI.utils.DecomposedDataUri#
+ * @member {string} data
+ */
+ /**
+ * Split a data URI into components. Returns undefined if
+ * parameter `dataUri` is not a valid data URI.
+ *
+ * @memberof PIXI.utils
+ * @function decomposeDataUri
+ * @param {string} dataUri - the data URI to check
+ * @return {PIXI.utils.DecomposedDataUri|undefined} The decomposed data uri or undefined
+ */
+ function decomposeDataUri(dataUri) {
+ var dataUriMatch = DATA_URI.exec(dataUri);
+ if (dataUriMatch) {
+ return {
+ mediaType: dataUriMatch[1] ? dataUriMatch[1].toLowerCase() : undefined,
+ subType: dataUriMatch[2] ? dataUriMatch[2].toLowerCase() : undefined,
+ charset: dataUriMatch[3] ? dataUriMatch[3].toLowerCase() : undefined,
+ encoding: dataUriMatch[4] ? dataUriMatch[4].toLowerCase() : undefined,
+ data: dataUriMatch[5],
+ };
+ }
+ return undefined;
+ }
+
+ var tempAnchor;
+ /**
+ * Sets the `crossOrigin` property for this resource based on if the url
+ * for this resource is cross-origin. If crossOrigin was manually set, this
+ * function does nothing.
+ * Nipped from the resource loader!
+ *
+ * @ignore
+ * @param {string} url - The url to test.
+ * @param {object} [loc=window.location] - The location object to test against.
+ * @return {string} The crossOrigin value to use (or empty string for none).
+ */
+ function determineCrossOrigin(url, loc) {
+ if (loc === void 0) { loc = window.location; }
+ // data: and javascript: urls are considered same-origin
+ if (url.indexOf('data:') === 0) {
+ return '';
+ }
+ // default is window.location
+ loc = loc || window.location;
+ if (!tempAnchor) {
+ tempAnchor = document.createElement('a');
+ }
+ // let the browser determine the full href for the url of this resource and then
+ // parse with the node url lib, we can't use the properties of the anchor element
+ // because they don't work in IE9 :(
+ tempAnchor.href = url;
+ var parsedUrl = parse(tempAnchor.href);
+ var samePort = (!parsedUrl.port && loc.port === '') || (parsedUrl.port === loc.port);
+ // if cross origin
+ if (parsedUrl.hostname !== loc.hostname || !samePort || parsedUrl.protocol !== loc.protocol) {
+ return 'anonymous';
+ }
+ return '';
+ }
+
+ /**
+ * get the resolution / device pixel ratio of an asset by looking for the prefix
+ * used by spritesheets and image urls
+ *
+ * @memberof PIXI.utils
+ * @function getResolutionOfUrl
+ * @param {string} url - the image path
+ * @param {number} [defaultValue=1] - the defaultValue if no filename prefix is set.
+ * @return {number} resolution / device pixel ratio of an asset
+ */
+ function getResolutionOfUrl(url, defaultValue) {
+ var resolution = settings.RETINA_PREFIX.exec(url);
+ if (resolution) {
+ return parseFloat(resolution[1]);
+ }
+ return defaultValue !== undefined ? defaultValue : 1;
+ }
+
+ var utils_es = ({
+ BaseTextureCache: BaseTextureCache,
+ CanvasRenderTarget: CanvasRenderTarget,
+ DATA_URI: DATA_URI,
+ ProgramCache: ProgramCache,
+ TextureCache: TextureCache,
+ clearTextureCache: clearTextureCache,
+ correctBlendMode: correctBlendMode,
+ createIndicesForQuads: createIndicesForQuads,
+ decomposeDataUri: decomposeDataUri,
+ deprecation: deprecation,
+ destroyTextureCache: destroyTextureCache,
+ determineCrossOrigin: determineCrossOrigin,
+ getBufferType: getBufferType,
+ getResolutionOfUrl: getResolutionOfUrl,
+ hex2rgb: hex2rgb,
+ hex2string: hex2string,
+ interleaveTypedArrays: interleaveTypedArrays,
+ isPow2: isPow2,
+ isWebGLSupported: isWebGLSupported,
+ log2: log2,
+ nextPow2: nextPow2,
+ premultiplyBlendMode: premultiplyBlendMode,
+ premultiplyRgba: premultiplyRgba,
+ premultiplyTint: premultiplyTint,
+ premultiplyTintToRgba: premultiplyTintToRgba,
+ removeItems: removeItems,
+ rgb2hex: rgb2hex,
+ sayHello: sayHello,
+ sign: sign$1,
+ skipHello: skipHello,
+ string2hex: string2hex,
+ trimCanvas: trimCanvas,
+ uid: uid,
+ isMobile: isMobile$1,
+ EventEmitter: eventemitter3,
+ earcut: earcut_1,
+ url: url
+ });
+
+ /*!
+ * @pixi/math - v5.3.12
+ * Compiled Wed, 23 Mar 2022 18:38:07 UTC
+ *
+ * @pixi/math is licensed under the MIT License.
+ * http://www.opensource.org/licenses/mit-license
+ */
+ /**
+ * Two Pi.
+ *
+ * @static
+ * @constant {number} PI_2
+ * @memberof PIXI
+ */
+ var PI_2 = Math.PI * 2;
+ /**
+ * Conversion factor for converting radians to degrees.
+ *
+ * @static
+ * @constant {number} RAD_TO_DEG
+ * @memberof PIXI
+ */
+ var RAD_TO_DEG = 180 / Math.PI;
+ /**
+ * Conversion factor for converting degrees to radians.
+ *
+ * @static
+ * @constant {number} DEG_TO_RAD
+ * @memberof PIXI
+ */
+ var DEG_TO_RAD = Math.PI / 180;
+
+ (function (SHAPES) {
+ SHAPES[SHAPES["POLY"] = 0] = "POLY";
+ SHAPES[SHAPES["RECT"] = 1] = "RECT";
+ SHAPES[SHAPES["CIRC"] = 2] = "CIRC";
+ SHAPES[SHAPES["ELIP"] = 3] = "ELIP";
+ SHAPES[SHAPES["RREC"] = 4] = "RREC";
+ })(exports.SHAPES || (exports.SHAPES = {}));
+ /**
+ * Constants that identify shapes, mainly to prevent `instanceof` calls.
+ *
+ * @static
+ * @constant
+ * @name SHAPES
+ * @memberof PIXI
+ * @type {enum}
+ * @property {number} POLY Polygon
+ * @property {number} RECT Rectangle
+ * @property {number} CIRC Circle
+ * @property {number} ELIP Ellipse
+ * @property {number} RREC Rounded Rectangle
+ * @enum {number}
+ */
+
+ /**
+ * Size object, contains width and height
+ *
+ * @memberof PIXI
+ * @typedef {object} ISize
+ * @property {number} width - Width component
+ * @property {number} height - Height component
+ */
+ /**
+ * Rectangle object is an area defined by its position, as indicated by its top-left corner
+ * point (x, y) and by its width and its height.
+ *
+ * @class
+ * @memberof PIXI
+ */
+ var Rectangle = /** @class */ (function () {
+ /**
+ * @param {number} [x=0] - The X coordinate of the upper-left corner of the rectangle
+ * @param {number} [y=0] - The Y coordinate of the upper-left corner of the rectangle
+ * @param {number} [width=0] - The overall width of this rectangle
+ * @param {number} [height=0] - The overall height of this rectangle
+ */
+ function Rectangle(x, y, width, height) {
+ if (x === void 0) { x = 0; }
+ if (y === void 0) { y = 0; }
+ if (width === void 0) { width = 0; }
+ if (height === void 0) { height = 0; }
+ /**
+ * @member {number}
+ * @default 0
+ */
+ this.x = Number(x);
+ /**
+ * @member {number}
+ * @default 0
+ */
+ this.y = Number(y);
+ /**
+ * @member {number}
+ * @default 0
+ */
+ this.width = Number(width);
+ /**
+ * @member {number}
+ * @default 0
+ */
+ this.height = Number(height);
+ /**
+ * The type of the object, mainly used to avoid `instanceof` checks
+ *
+ * @member {number}
+ * @readOnly
+ * @default PIXI.SHAPES.RECT
+ * @see PIXI.SHAPES
+ */
+ this.type = exports.SHAPES.RECT;
+ }
+ Object.defineProperty(Rectangle.prototype, "left", {
+ /**
+ * returns the left edge of the rectangle
+ *
+ * @member {number}
+ */
+ get: function () {
+ return this.x;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(Rectangle.prototype, "right", {
+ /**
+ * returns the right edge of the rectangle
+ *
+ * @member {number}
+ */
+ get: function () {
+ return this.x + this.width;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(Rectangle.prototype, "top", {
+ /**
+ * returns the top edge of the rectangle
+ *
+ * @member {number}
+ */
+ get: function () {
+ return this.y;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(Rectangle.prototype, "bottom", {
+ /**
+ * returns the bottom edge of the rectangle
+ *
+ * @member {number}
+ */
+ get: function () {
+ return this.y + this.height;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(Rectangle, "EMPTY", {
+ /**
+ * A constant empty rectangle.
+ *
+ * @static
+ * @constant
+ * @member {PIXI.Rectangle}
+ * @return {PIXI.Rectangle} An empty rectangle
+ */
+ get: function () {
+ return new Rectangle(0, 0, 0, 0);
+ },
+ enumerable: false,
+ configurable: true
+ });
+ /**
+ * Creates a clone of this Rectangle
+ *
+ * @return {PIXI.Rectangle} a copy of the rectangle
+ */
+ Rectangle.prototype.clone = function () {
+ return new Rectangle(this.x, this.y, this.width, this.height);
+ };
+ /**
+ * Copies another rectangle to this one.
+ *
+ * @param {PIXI.Rectangle} rectangle - The rectangle to copy from.
+ * @return {PIXI.Rectangle} Returns itself.
+ */
+ Rectangle.prototype.copyFrom = function (rectangle) {
+ this.x = rectangle.x;
+ this.y = rectangle.y;
+ this.width = rectangle.width;
+ this.height = rectangle.height;
+ return this;
+ };
+ /**
+ * Copies this rectangle to another one.
+ *
+ * @param {PIXI.Rectangle} rectangle - The rectangle to copy to.
+ * @return {PIXI.Rectangle} Returns given parameter.
+ */
+ Rectangle.prototype.copyTo = function (rectangle) {
+ rectangle.x = this.x;
+ rectangle.y = this.y;
+ rectangle.width = this.width;
+ rectangle.height = this.height;
+ return rectangle;
+ };
+ /**
+ * Checks whether the x and y coordinates given are contained within this Rectangle
+ *
+ * @param {number} x - The X coordinate of the point to test
+ * @param {number} y - The Y coordinate of the point to test
+ * @return {boolean} Whether the x/y coordinates are within this Rectangle
+ */
+ Rectangle.prototype.contains = function (x, y) {
+ if (this.width <= 0 || this.height <= 0) {
+ return false;
+ }
+ if (x >= this.x && x < this.x + this.width) {
+ if (y >= this.y && y < this.y + this.height) {
+ return true;
+ }
+ }
+ return false;
+ };
+ /**
+ * Pads the rectangle making it grow in all directions.
+ * If paddingY is omitted, both paddingX and paddingY will be set to paddingX.
+ *
+ * @param {number} [paddingX=0] - The horizontal padding amount.
+ * @param {number} [paddingY=0] - The vertical padding amount.
+ * @return {PIXI.Rectangle} Returns itself.
+ */
+ Rectangle.prototype.pad = function (paddingX, paddingY) {
+ if (paddingX === void 0) { paddingX = 0; }
+ if (paddingY === void 0) { paddingY = paddingX; }
+ this.x -= paddingX;
+ this.y -= paddingY;
+ this.width += paddingX * 2;
+ this.height += paddingY * 2;
+ return this;
+ };
+ /**
+ * Fits this rectangle around the passed one.
+ *
+ * @param {PIXI.Rectangle} rectangle - The rectangle to fit.
+ * @return {PIXI.Rectangle} Returns itself.
+ */
+ Rectangle.prototype.fit = function (rectangle) {
+ var x1 = Math.max(this.x, rectangle.x);
+ var x2 = Math.min(this.x + this.width, rectangle.x + rectangle.width);
+ var y1 = Math.max(this.y, rectangle.y);
+ var y2 = Math.min(this.y + this.height, rectangle.y + rectangle.height);
+ this.x = x1;
+ this.width = Math.max(x2 - x1, 0);
+ this.y = y1;
+ this.height = Math.max(y2 - y1, 0);
+ return this;
+ };
+ /**
+ * Enlarges rectangle that way its corners lie on grid
+ *
+ * @param {number} [resolution=1] resolution
+ * @param {number} [eps=0.001] precision
+ * @return {PIXI.Rectangle} Returns itself.
+ */
+ Rectangle.prototype.ceil = function (resolution, eps) {
+ if (resolution === void 0) { resolution = 1; }
+ if (eps === void 0) { eps = 0.001; }
+ var x2 = Math.ceil((this.x + this.width - eps) * resolution) / resolution;
+ var y2 = Math.ceil((this.y + this.height - eps) * resolution) / resolution;
+ this.x = Math.floor((this.x + eps) * resolution) / resolution;
+ this.y = Math.floor((this.y + eps) * resolution) / resolution;
+ this.width = x2 - this.x;
+ this.height = y2 - this.y;
+ return this;
+ };
+ /**
+ * Enlarges this rectangle to include the passed rectangle.
+ *
+ * @param {PIXI.Rectangle} rectangle - The rectangle to include.
+ * @return {PIXI.Rectangle} Returns itself.
+ */
+ Rectangle.prototype.enlarge = function (rectangle) {
+ var x1 = Math.min(this.x, rectangle.x);
+ var x2 = Math.max(this.x + this.width, rectangle.x + rectangle.width);
+ var y1 = Math.min(this.y, rectangle.y);
+ var y2 = Math.max(this.y + this.height, rectangle.y + rectangle.height);
+ this.x = x1;
+ this.width = x2 - x1;
+ this.y = y1;
+ this.height = y2 - y1;
+ return this;
+ };
+ return Rectangle;
+ }());
+
+ /**
+ * The Circle object is used to help draw graphics and can also be used to specify a hit area for displayObjects.
+ *
+ * @class
+ * @memberof PIXI
+ */
+ var Circle = /** @class */ (function () {
+ /**
+ * @param {number} [x=0] - The X coordinate of the center of this circle
+ * @param {number} [y=0] - The Y coordinate of the center of this circle
+ * @param {number} [radius=0] - The radius of the circle
+ */
+ function Circle(x, y, radius) {
+ if (x === void 0) { x = 0; }
+ if (y === void 0) { y = 0; }
+ if (radius === void 0) { radius = 0; }
+ /**
+ * @member {number}
+ * @default 0
+ */
+ this.x = x;
+ /**
+ * @member {number}
+ * @default 0
+ */
+ this.y = y;
+ /**
+ * @member {number}
+ * @default 0
+ */
+ this.radius = radius;
+ /**
+ * The type of the object, mainly used to avoid `instanceof` checks
+ *
+ * @member {number}
+ * @readOnly
+ * @default PIXI.SHAPES.CIRC
+ * @see PIXI.SHAPES
+ */
+ this.type = exports.SHAPES.CIRC;
+ }
+ /**
+ * Creates a clone of this Circle instance
+ *
+ * @return {PIXI.Circle} a copy of the Circle
+ */
+ Circle.prototype.clone = function () {
+ return new Circle(this.x, this.y, this.radius);
+ };
+ /**
+ * Checks whether the x and y coordinates given are contained within this circle
+ *
+ * @param {number} x - The X coordinate of the point to test
+ * @param {number} y - The Y coordinate of the point to test
+ * @return {boolean} Whether the x/y coordinates are within this Circle
+ */
+ Circle.prototype.contains = function (x, y) {
+ if (this.radius <= 0) {
+ return false;
+ }
+ var r2 = this.radius * this.radius;
+ var dx = (this.x - x);
+ var dy = (this.y - y);
+ dx *= dx;
+ dy *= dy;
+ return (dx + dy <= r2);
+ };
+ /**
+ * Returns the framing rectangle of the circle as a Rectangle object
+ *
+ * @return {PIXI.Rectangle} the framing rectangle
+ */
+ Circle.prototype.getBounds = function () {
+ return new Rectangle(this.x - this.radius, this.y - this.radius, this.radius * 2, this.radius * 2);
+ };
+ return Circle;
+ }());
+
+ /**
+ * The Ellipse object is used to help draw graphics and can also be used to specify a hit area for displayObjects.
+ *
+ * @class
+ * @memberof PIXI
+ */
+ var Ellipse = /** @class */ (function () {
+ /**
+ * @param {number} [x=0] - The X coordinate of the center of this ellipse
+ * @param {number} [y=0] - The Y coordinate of the center of this ellipse
+ * @param {number} [halfWidth=0] - The half width of this ellipse
+ * @param {number} [halfHeight=0] - The half height of this ellipse
+ */
+ function Ellipse(x, y, halfWidth, halfHeight) {
+ if (x === void 0) { x = 0; }
+ if (y === void 0) { y = 0; }
+ if (halfWidth === void 0) { halfWidth = 0; }
+ if (halfHeight === void 0) { halfHeight = 0; }
+ /**
+ * @member {number}
+ * @default 0
+ */
+ this.x = x;
+ /**
+ * @member {number}
+ * @default 0
+ */
+ this.y = y;
+ /**
+ * @member {number}
+ * @default 0
+ */
+ this.width = halfWidth;
+ /**
+ * @member {number}
+ * @default 0
+ */
+ this.height = halfHeight;
+ /**
+ * The type of the object, mainly used to avoid `instanceof` checks
+ *
+ * @member {number}
+ * @readOnly
+ * @default PIXI.SHAPES.ELIP
+ * @see PIXI.SHAPES
+ */
+ this.type = exports.SHAPES.ELIP;
+ }
+ /**
+ * Creates a clone of this Ellipse instance
+ *
+ * @return {PIXI.Ellipse} a copy of the ellipse
+ */
+ Ellipse.prototype.clone = function () {
+ return new Ellipse(this.x, this.y, this.width, this.height);
+ };
+ /**
+ * Checks whether the x and y coordinates given are contained within this ellipse
+ *
+ * @param {number} x - The X coordinate of the point to test
+ * @param {number} y - The Y coordinate of the point to test
+ * @return {boolean} Whether the x/y coords are within this ellipse
+ */
+ Ellipse.prototype.contains = function (x, y) {
+ if (this.width <= 0 || this.height <= 0) {
+ return false;
+ }
+ // normalize the coords to an ellipse with center 0,0
+ var normx = ((x - this.x) / this.width);
+ var normy = ((y - this.y) / this.height);
+ normx *= normx;
+ normy *= normy;
+ return (normx + normy <= 1);
+ };
+ /**
+ * Returns the framing rectangle of the ellipse as a Rectangle object
+ *
+ * @return {PIXI.Rectangle} the framing rectangle
+ */
+ Ellipse.prototype.getBounds = function () {
+ return new Rectangle(this.x - this.width, this.y - this.height, this.width, this.height);
+ };
+ return Ellipse;
+ }());
+
+ /**
+ * A class to define a shape via user defined co-orinates.
+ *
+ * @class
+ * @memberof PIXI
+ */
+ var Polygon = /** @class */ (function () {
+ /**
+ * @param {PIXI.IPoint[]|number[]} points - This can be an array of Points
+ * that form the polygon, a flat array of numbers that will be interpreted as [x,y, x,y, ...], or
+ * the arguments passed can be all the points of the polygon e.g.
+ * `new PIXI.Polygon(new PIXI.Point(), new PIXI.Point(), ...)`, or the arguments passed can be flat
+ * x,y values e.g. `new Polygon(x,y, x,y, x,y, ...)` where `x` and `y` are Numbers.
+ */
+ function Polygon() {
+ var arguments$1 = arguments;
+
+ var points = [];
+ for (var _i = 0; _i < arguments.length; _i++) {
+ points[_i] = arguments$1[_i];
+ }
+ var flat = Array.isArray(points[0]) ? points[0] : points;
+ // if this is an array of points, convert it to a flat array of numbers
+ if (typeof flat[0] !== 'number') {
+ var p = [];
+ for (var i = 0, il = flat.length; i < il; i++) {
+ p.push(flat[i].x, flat[i].y);
+ }
+ flat = p;
+ }
+ /**
+ * An array of the points of this polygon
+ *
+ * @member {number[]}
+ */
+ this.points = flat;
+ /**
+ * The type of the object, mainly used to avoid `instanceof` checks
+ *
+ * @member {number}
+ * @readOnly
+ * @default PIXI.SHAPES.POLY
+ * @see PIXI.SHAPES
+ */
+ this.type = exports.SHAPES.POLY;
+ /**
+ * `false` after moveTo, `true` after `closePath`. In all other cases it is `true`.
+ * @member {boolean}
+ * @default true
+ */
+ this.closeStroke = true;
+ }
+ /**
+ * Creates a clone of this polygon
+ *
+ * @return {PIXI.Polygon} a copy of the polygon
+ */
+ Polygon.prototype.clone = function () {
+ var points = this.points.slice();
+ var polygon = new Polygon(points);
+ polygon.closeStroke = this.closeStroke;
+ return polygon;
+ };
+ /**
+ * Checks whether the x and y coordinates passed to this function are contained within this polygon
+ *
+ * @param {number} x - The X coordinate of the point to test
+ * @param {number} y - The Y coordinate of the point to test
+ * @return {boolean} Whether the x/y coordinates are within this polygon
+ */
+ Polygon.prototype.contains = function (x, y) {
+ var inside = false;
+ // use some raycasting to test hits
+ // https://github.com/substack/point-in-polygon/blob/master/index.js
+ var length = this.points.length / 2;
+ for (var i = 0, j = length - 1; i < length; j = i++) {
+ var xi = this.points[i * 2];
+ var yi = this.points[(i * 2) + 1];
+ var xj = this.points[j * 2];
+ var yj = this.points[(j * 2) + 1];
+ var intersect = ((yi > y) !== (yj > y)) && (x < ((xj - xi) * ((y - yi) / (yj - yi))) + xi);
+ if (intersect) {
+ inside = !inside;
+ }
+ }
+ return inside;
+ };
+ return Polygon;
+ }());
+
+ /**
+ * The Rounded Rectangle object is an area that has nice rounded corners, as indicated by its
+ * top-left corner point (x, y) and by its width and its height and its radius.
+ *
+ * @class
+ * @memberof PIXI
+ */
+ var RoundedRectangle = /** @class */ (function () {
+ /**
+ * @param {number} [x=0] - The X coordinate of the upper-left corner of the rounded rectangle
+ * @param {number} [y=0] - The Y coordinate of the upper-left corner of the rounded rectangle
+ * @param {number} [width=0] - The overall width of this rounded rectangle
+ * @param {number} [height=0] - The overall height of this rounded rectangle
+ * @param {number} [radius=20] - Controls the radius of the rounded corners
+ */
+ function RoundedRectangle(x, y, width, height, radius) {
+ if (x === void 0) { x = 0; }
+ if (y === void 0) { y = 0; }
+ if (width === void 0) { width = 0; }
+ if (height === void 0) { height = 0; }
+ if (radius === void 0) { radius = 20; }
+ /**
+ * @member {number}
+ * @default 0
+ */
+ this.x = x;
+ /**
+ * @member {number}
+ * @default 0
+ */
+ this.y = y;
+ /**
+ * @member {number}
+ * @default 0
+ */
+ this.width = width;
+ /**
+ * @member {number}
+ * @default 0
+ */
+ this.height = height;
+ /**
+ * @member {number}
+ * @default 20
+ */
+ this.radius = radius;
+ /**
+ * The type of the object, mainly used to avoid `instanceof` checks
+ *
+ * @member {number}
+ * @readonly
+ * @default PIXI.SHAPES.RREC
+ * @see PIXI.SHAPES
+ */
+ this.type = exports.SHAPES.RREC;
+ }
+ /**
+ * Creates a clone of this Rounded Rectangle
+ *
+ * @return {PIXI.RoundedRectangle} a copy of the rounded rectangle
+ */
+ RoundedRectangle.prototype.clone = function () {
+ return new RoundedRectangle(this.x, this.y, this.width, this.height, this.radius);
+ };
+ /**
+ * Checks whether the x and y coordinates given are contained within this Rounded Rectangle
+ *
+ * @param {number} x - The X coordinate of the point to test
+ * @param {number} y - The Y coordinate of the point to test
+ * @return {boolean} Whether the x/y coordinates are within this Rounded Rectangle
+ */
+ RoundedRectangle.prototype.contains = function (x, y) {
+ if (this.width <= 0 || this.height <= 0) {
+ return false;
+ }
+ if (x >= this.x && x <= this.x + this.width) {
+ if (y >= this.y && y <= this.y + this.height) {
+ if ((y >= this.y + this.radius && y <= this.y + this.height - this.radius)
+ || (x >= this.x + this.radius && x <= this.x + this.width - this.radius)) {
+ return true;
+ }
+ var dx = x - (this.x + this.radius);
+ var dy = y - (this.y + this.radius);
+ var radius2 = this.radius * this.radius;
+ if ((dx * dx) + (dy * dy) <= radius2) {
+ return true;
+ }
+ dx = x - (this.x + this.width - this.radius);
+ if ((dx * dx) + (dy * dy) <= radius2) {
+ return true;
+ }
+ dy = y - (this.y + this.height - this.radius);
+ if ((dx * dx) + (dy * dy) <= radius2) {
+ return true;
+ }
+ dx = x - (this.x + this.radius);
+ if ((dx * dx) + (dy * dy) <= radius2) {
+ return true;
+ }
+ }
+ }
+ return false;
+ };
+ return RoundedRectangle;
+ }());
+
+ /**
+ * Common interface for points. Both Point and ObservablePoint implement it
+ * @memberof PIXI
+ * @interface IPointData
+ */
+ /**
+ * X coord
+ * @memberof PIXI.IPointData#
+ * @member {number} x
+ */
+ /**
+ * Y coord
+ * @memberof PIXI.IPointData#
+ * @member {number} y
+ */
+
+ /**
+ * Common interface for points. Both Point and ObservablePoint implement it
+ * @memberof PIXI
+ * @interface IPoint
+ * @extends PIXI.IPointData
+ */
+ /**
+ * Sets the point to a new x and y position.
+ * If y is omitted, both x and y will be set to x.
+ *
+ * @method set
+ * @memberof PIXI.IPoint#
+ * @param {number} [x=0] - position of the point on the x axis
+ * @param {number} [y=x] - position of the point on the y axis
+ */
+ /**
+ * Copies x and y from the given point
+ * @method copyFrom
+ * @memberof PIXI.IPoint#
+ * @param {PIXI.IPointData} p - The point to copy from
+ * @returns {this} Returns itself.
+ */
+ /**
+ * Copies x and y into the given point
+ * @method copyTo
+ * @memberof PIXI.IPoint#
+ * @param {PIXI.IPoint} p - The point to copy.
+ * @returns {PIXI.IPoint} Given point with values updated
+ */
+ /**
+ * Returns true if the given point is equal to this point
+ *
+ * @method equals
+ * @memberof PIXI.IPoint#
+ * @param {PIXI.IPointData} p - The point to check
+ * @returns {boolean} Whether the given point equal to this point
+ */
+
+ /**
+ * The Point object represents a location in a two-dimensional coordinate system, where x represents
+ * the horizontal axis and y represents the vertical axis.
+ *
+ * @class
+ * @memberof PIXI
+ * @implements IPoint
+ */
+ var Point = /** @class */ (function () {
+ /**
+ * @param {number} [x=0] - position of the point on the x axis
+ * @param {number} [y=0] - position of the point on the y axis
+ */
+ function Point(x, y) {
+ if (x === void 0) { x = 0; }
+ if (y === void 0) { y = 0; }
+ /**
+ * @member {number}
+ * @default 0
+ */
+ this.x = x;
+ /**
+ * @member {number}
+ * @default 0
+ */
+ this.y = y;
+ }
+ /**
+ * Creates a clone of this point
+ *
+ * @return {PIXI.Point} a copy of the point
+ */
+ Point.prototype.clone = function () {
+ return new Point(this.x, this.y);
+ };
+ /**
+ * Copies x and y from the given point
+ *
+ * @param {PIXI.IPointData} p - The point to copy from
+ * @returns {this} Returns itself.
+ */
+ Point.prototype.copyFrom = function (p) {
+ this.set(p.x, p.y);
+ return this;
+ };
+ /**
+ * Copies x and y into the given point
+ *
+ * @param {PIXI.IPoint} p - The point to copy.
+ * @returns {PIXI.IPoint} Given point with values updated
+ */
+ Point.prototype.copyTo = function (p) {
+ p.set(this.x, this.y);
+ return p;
+ };
+ /**
+ * Returns true if the given point is equal to this point
+ *
+ * @param {PIXI.IPointData} p - The point to check
+ * @returns {boolean} Whether the given point equal to this point
+ */
+ Point.prototype.equals = function (p) {
+ return (p.x === this.x) && (p.y === this.y);
+ };
+ /**
+ * Sets the point to a new x and y position.
+ * If y is omitted, both x and y will be set to x.
+ *
+ * @param {number} [x=0] - position of the point on the x axis
+ * @param {number} [y=x] - position of the point on the y axis
+ * @returns {this} Returns itself.
+ */
+ Point.prototype.set = function (x, y) {
+ if (x === void 0) { x = 0; }
+ if (y === void 0) { y = x; }
+ this.x = x;
+ this.y = y;
+ return this;
+ };
+ return Point;
+ }());
+
+ /**
+ * The Point object represents a location in a two-dimensional coordinate system, where x represents
+ * the horizontal axis and y represents the vertical axis.
+ *
+ * An ObservablePoint is a point that triggers a callback when the point's position is changed.
+ *
+ * @class
+ * @memberof PIXI
+ * @implements IPoint
+ */
+ var ObservablePoint = /** @class */ (function () {
+ /**
+ * @param {Function} cb - callback when changed
+ * @param {object} scope - owner of callback
+ * @param {number} [x=0] - position of the point on the x axis
+ * @param {number} [y=0] - position of the point on the y axis
+ */
+ function ObservablePoint(cb, scope, x, y) {
+ if (x === void 0) { x = 0; }
+ if (y === void 0) { y = 0; }
+ this._x = x;
+ this._y = y;
+ this.cb = cb;
+ this.scope = scope;
+ }
+ /**
+ * Creates a clone of this point.
+ * The callback and scope params can be overidden otherwise they will default
+ * to the clone object's values.
+ *
+ * @override
+ * @param {Function} [cb=null] - callback when changed
+ * @param {object} [scope=null] - owner of callback
+ * @return {PIXI.ObservablePoint} a copy of the point
+ */
+ ObservablePoint.prototype.clone = function (cb, scope) {
+ if (cb === void 0) { cb = this.cb; }
+ if (scope === void 0) { scope = this.scope; }
+ return new ObservablePoint(cb, scope, this._x, this._y);
+ };
+ /**
+ * Sets the point to a new x and y position.
+ * If y is omitted, both x and y will be set to x.
+ *
+ * @param {number} [x=0] - position of the point on the x axis
+ * @param {number} [y=x] - position of the point on the y axis
+ * @returns {this} Returns itself.
+ */
+ ObservablePoint.prototype.set = function (x, y) {
+ if (x === void 0) { x = 0; }
+ if (y === void 0) { y = x; }
+ if (this._x !== x || this._y !== y) {
+ this._x = x;
+ this._y = y;
+ this.cb.call(this.scope);
+ }
+ return this;
+ };
+ /**
+ * Copies x and y from the given point
+ *
+ * @param {PIXI.IPointData} p - The point to copy from.
+ * @returns {this} Returns itself.
+ */
+ ObservablePoint.prototype.copyFrom = function (p) {
+ if (this._x !== p.x || this._y !== p.y) {
+ this._x = p.x;
+ this._y = p.y;
+ this.cb.call(this.scope);
+ }
+ return this;
+ };
+ /**
+ * Copies x and y into the given point
+ *
+ * @param {PIXI.IPoint} p - The point to copy.
+ * @returns {PIXI.IPoint} Given point with values updated
+ */
+ ObservablePoint.prototype.copyTo = function (p) {
+ p.set(this._x, this._y);
+ return p;
+ };
+ /**
+ * Returns true if the given point is equal to this point
+ *
+ * @param {PIXI.IPointData} p - The point to check
+ * @returns {boolean} Whether the given point equal to this point
+ */
+ ObservablePoint.prototype.equals = function (p) {
+ return (p.x === this._x) && (p.y === this._y);
+ };
+ Object.defineProperty(ObservablePoint.prototype, "x", {
+ /**
+ * The position of the displayObject on the x axis relative to the local coordinates of the parent.
+ *
+ * @member {number}
+ */
+ get: function () {
+ return this._x;
+ },
+ set: function (value) {
+ if (this._x !== value) {
+ this._x = value;
+ this.cb.call(this.scope);
+ }
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(ObservablePoint.prototype, "y", {
+ /**
+ * The position of the displayObject on the x axis relative to the local coordinates of the parent.
+ *
+ * @member {number}
+ */
+ get: function () {
+ return this._y;
+ },
+ set: function (value) {
+ if (this._y !== value) {
+ this._y = value;
+ this.cb.call(this.scope);
+ }
+ },
+ enumerable: false,
+ configurable: true
+ });
+ return ObservablePoint;
+ }());
+
+ /**
+ * The PixiJS Matrix as a class makes it a lot faster.
+ *
+ * Here is a representation of it:
+ * ```js
+ * | a | c | tx|
+ * | b | d | ty|
+ * | 0 | 0 | 1 |
+ * ```
+ * @class
+ * @memberof PIXI
+ */
+ var Matrix = /** @class */ (function () {
+ /**
+ * @param {number} [a=1] - x scale
+ * @param {number} [b=0] - x skew
+ * @param {number} [c=0] - y skew
+ * @param {number} [d=1] - y scale
+ * @param {number} [tx=0] - x translation
+ * @param {number} [ty=0] - y translation
+ */
+ function Matrix(a, b, c, d, tx, ty) {
+ if (a === void 0) { a = 1; }
+ if (b === void 0) { b = 0; }
+ if (c === void 0) { c = 0; }
+ if (d === void 0) { d = 1; }
+ if (tx === void 0) { tx = 0; }
+ if (ty === void 0) { ty = 0; }
+ this.array = null;
+ /**
+ * @member {number}
+ * @default 1
+ */
+ this.a = a;
+ /**
+ * @member {number}
+ * @default 0
+ */
+ this.b = b;
+ /**
+ * @member {number}
+ * @default 0
+ */
+ this.c = c;
+ /**
+ * @member {number}
+ * @default 1
+ */
+ this.d = d;
+ /**
+ * @member {number}
+ * @default 0
+ */
+ this.tx = tx;
+ /**
+ * @member {number}
+ * @default 0
+ */
+ this.ty = ty;
+ }
+ /**
+ * Creates a Matrix object based on the given array. The Element to Matrix mapping order is as follows:
+ *
+ * a = array[0]
+ * b = array[1]
+ * c = array[3]
+ * d = array[4]
+ * tx = array[2]
+ * ty = array[5]
+ *
+ * @param {number[]} array - The array that the matrix will be populated from.
+ */
+ Matrix.prototype.fromArray = function (array) {
+ this.a = array[0];
+ this.b = array[1];
+ this.c = array[3];
+ this.d = array[4];
+ this.tx = array[2];
+ this.ty = array[5];
+ };
+ /**
+ * sets the matrix properties
+ *
+ * @param {number} a - Matrix component
+ * @param {number} b - Matrix component
+ * @param {number} c - Matrix component
+ * @param {number} d - Matrix component
+ * @param {number} tx - Matrix component
+ * @param {number} ty - Matrix component
+ *
+ * @return {PIXI.Matrix} This matrix. Good for chaining method calls.
+ */
+ Matrix.prototype.set = function (a, b, c, d, tx, ty) {
+ this.a = a;
+ this.b = b;
+ this.c = c;
+ this.d = d;
+ this.tx = tx;
+ this.ty = ty;
+ return this;
+ };
+ /**
+ * Creates an array from the current Matrix object.
+ *
+ * @param {boolean} transpose - Whether we need to transpose the matrix or not
+ * @param {Float32Array} [out=new Float32Array(9)] - If provided the array will be assigned to out
+ * @return {number[]} the newly created array which contains the matrix
+ */
+ Matrix.prototype.toArray = function (transpose, out) {
+ if (!this.array) {
+ this.array = new Float32Array(9);
+ }
+ var array = out || this.array;
+ if (transpose) {
+ array[0] = this.a;
+ array[1] = this.b;
+ array[2] = 0;
+ array[3] = this.c;
+ array[4] = this.d;
+ array[5] = 0;
+ array[6] = this.tx;
+ array[7] = this.ty;
+ array[8] = 1;
+ }
+ else {
+ array[0] = this.a;
+ array[1] = this.c;
+ array[2] = this.tx;
+ array[3] = this.b;
+ array[4] = this.d;
+ array[5] = this.ty;
+ array[6] = 0;
+ array[7] = 0;
+ array[8] = 1;
+ }
+ return array;
+ };
+ /**
+ * Get a new position with the current transformation applied.
+ * Can be used to go from a child's coordinate space to the world coordinate space. (e.g. rendering)
+ *
+ * @param {PIXI.IPointData} pos - The origin
+ * @param {PIXI.Point} [newPos] - The point that the new position is assigned to (allowed to be same as input)
+ * @return {PIXI.Point} The new point, transformed through this matrix
+ */
+ Matrix.prototype.apply = function (pos, newPos) {
+ newPos = (newPos || new Point());
+ var x = pos.x;
+ var y = pos.y;
+ newPos.x = (this.a * x) + (this.c * y) + this.tx;
+ newPos.y = (this.b * x) + (this.d * y) + this.ty;
+ return newPos;
+ };
+ /**
+ * Get a new position with the inverse of the current transformation applied.
+ * Can be used to go from the world coordinate space to a child's coordinate space. (e.g. input)
+ *
+ * @param {PIXI.IPointData} pos - The origin
+ * @param {PIXI.Point} [newPos] - The point that the new position is assigned to (allowed to be same as input)
+ * @return {PIXI.Point} The new point, inverse-transformed through this matrix
+ */
+ Matrix.prototype.applyInverse = function (pos, newPos) {
+ newPos = (newPos || new Point());
+ var id = 1 / ((this.a * this.d) + (this.c * -this.b));
+ var x = pos.x;
+ var y = pos.y;
+ newPos.x = (this.d * id * x) + (-this.c * id * y) + (((this.ty * this.c) - (this.tx * this.d)) * id);
+ newPos.y = (this.a * id * y) + (-this.b * id * x) + (((-this.ty * this.a) + (this.tx * this.b)) * id);
+ return newPos;
+ };
+ /**
+ * Translates the matrix on the x and y.
+ *
+ * @param {number} x - How much to translate x by
+ * @param {number} y - How much to translate y by
+ * @return {PIXI.Matrix} This matrix. Good for chaining method calls.
+ */
+ Matrix.prototype.translate = function (x, y) {
+ this.tx += x;
+ this.ty += y;
+ return this;
+ };
+ /**
+ * Applies a scale transformation to the matrix.
+ *
+ * @param {number} x - The amount to scale horizontally
+ * @param {number} y - The amount to scale vertically
+ * @return {PIXI.Matrix} This matrix. Good for chaining method calls.
+ */
+ Matrix.prototype.scale = function (x, y) {
+ this.a *= x;
+ this.d *= y;
+ this.c *= x;
+ this.b *= y;
+ this.tx *= x;
+ this.ty *= y;
+ return this;
+ };
+ /**
+ * Applies a rotation transformation to the matrix.
+ *
+ * @param {number} angle - The angle in radians.
+ * @return {PIXI.Matrix} This matrix. Good for chaining method calls.
+ */
+ Matrix.prototype.rotate = function (angle) {
+ var cos = Math.cos(angle);
+ var sin = Math.sin(angle);
+ var a1 = this.a;
+ var c1 = this.c;
+ var tx1 = this.tx;
+ this.a = (a1 * cos) - (this.b * sin);
+ this.b = (a1 * sin) + (this.b * cos);
+ this.c = (c1 * cos) - (this.d * sin);
+ this.d = (c1 * sin) + (this.d * cos);
+ this.tx = (tx1 * cos) - (this.ty * sin);
+ this.ty = (tx1 * sin) + (this.ty * cos);
+ return this;
+ };
+ /**
+ * Appends the given Matrix to this Matrix.
+ *
+ * @param {PIXI.Matrix} matrix - The matrix to append.
+ * @return {PIXI.Matrix} This matrix. Good for chaining method calls.
+ */
+ Matrix.prototype.append = function (matrix) {
+ var a1 = this.a;
+ var b1 = this.b;
+ var c1 = this.c;
+ var d1 = this.d;
+ this.a = (matrix.a * a1) + (matrix.b * c1);
+ this.b = (matrix.a * b1) + (matrix.b * d1);
+ this.c = (matrix.c * a1) + (matrix.d * c1);
+ this.d = (matrix.c * b1) + (matrix.d * d1);
+ this.tx = (matrix.tx * a1) + (matrix.ty * c1) + this.tx;
+ this.ty = (matrix.tx * b1) + (matrix.ty * d1) + this.ty;
+ return this;
+ };
+ /**
+ * Sets the matrix based on all the available properties
+ *
+ * @param {number} x - Position on the x axis
+ * @param {number} y - Position on the y axis
+ * @param {number} pivotX - Pivot on the x axis
+ * @param {number} pivotY - Pivot on the y axis
+ * @param {number} scaleX - Scale on the x axis
+ * @param {number} scaleY - Scale on the y axis
+ * @param {number} rotation - Rotation in radians
+ * @param {number} skewX - Skew on the x axis
+ * @param {number} skewY - Skew on the y axis
+ * @return {PIXI.Matrix} This matrix. Good for chaining method calls.
+ */
+ Matrix.prototype.setTransform = function (x, y, pivotX, pivotY, scaleX, scaleY, rotation, skewX, skewY) {
+ this.a = Math.cos(rotation + skewY) * scaleX;
+ this.b = Math.sin(rotation + skewY) * scaleX;
+ this.c = -Math.sin(rotation - skewX) * scaleY;
+ this.d = Math.cos(rotation - skewX) * scaleY;
+ this.tx = x - ((pivotX * this.a) + (pivotY * this.c));
+ this.ty = y - ((pivotX * this.b) + (pivotY * this.d));
+ return this;
+ };
+ /**
+ * Prepends the given Matrix to this Matrix.
+ *
+ * @param {PIXI.Matrix} matrix - The matrix to prepend
+ * @return {PIXI.Matrix} This matrix. Good for chaining method calls.
+ */
+ Matrix.prototype.prepend = function (matrix) {
+ var tx1 = this.tx;
+ if (matrix.a !== 1 || matrix.b !== 0 || matrix.c !== 0 || matrix.d !== 1) {
+ var a1 = this.a;
+ var c1 = this.c;
+ this.a = (a1 * matrix.a) + (this.b * matrix.c);
+ this.b = (a1 * matrix.b) + (this.b * matrix.d);
+ this.c = (c1 * matrix.a) + (this.d * matrix.c);
+ this.d = (c1 * matrix.b) + (this.d * matrix.d);
+ }
+ this.tx = (tx1 * matrix.a) + (this.ty * matrix.c) + matrix.tx;
+ this.ty = (tx1 * matrix.b) + (this.ty * matrix.d) + matrix.ty;
+ return this;
+ };
+ /**
+ * Decomposes the matrix (x, y, scaleX, scaleY, and rotation) and sets the properties on to a transform.
+ *
+ * @param {PIXI.Transform} transform - The transform to apply the properties to.
+ * @return {PIXI.Transform} The transform with the newly applied properties
+ */
+ Matrix.prototype.decompose = function (transform) {
+ // sort out rotation / skew..
+ var a = this.a;
+ var b = this.b;
+ var c = this.c;
+ var d = this.d;
+ var skewX = -Math.atan2(-c, d);
+ var skewY = Math.atan2(b, a);
+ var delta = Math.abs(skewX + skewY);
+ if (delta < 0.00001 || Math.abs(PI_2 - delta) < 0.00001) {
+ transform.rotation = skewY;
+ transform.skew.x = transform.skew.y = 0;
+ }
+ else {
+ transform.rotation = 0;
+ transform.skew.x = skewX;
+ transform.skew.y = skewY;
+ }
+ // next set scale
+ transform.scale.x = Math.sqrt((a * a) + (b * b));
+ transform.scale.y = Math.sqrt((c * c) + (d * d));
+ // next set position
+ transform.position.x = this.tx;
+ transform.position.y = this.ty;
+ return transform;
+ };
+ /**
+ * Inverts this matrix
+ *
+ * @return {PIXI.Matrix} This matrix. Good for chaining method calls.
+ */
+ Matrix.prototype.invert = function () {
+ var a1 = this.a;
+ var b1 = this.b;
+ var c1 = this.c;
+ var d1 = this.d;
+ var tx1 = this.tx;
+ var n = (a1 * d1) - (b1 * c1);
+ this.a = d1 / n;
+ this.b = -b1 / n;
+ this.c = -c1 / n;
+ this.d = a1 / n;
+ this.tx = ((c1 * this.ty) - (d1 * tx1)) / n;
+ this.ty = -((a1 * this.ty) - (b1 * tx1)) / n;
+ return this;
+ };
+ /**
+ * Resets this Matrix to an identity (default) matrix.
+ *
+ * @return {PIXI.Matrix} This matrix. Good for chaining method calls.
+ */
+ Matrix.prototype.identity = function () {
+ this.a = 1;
+ this.b = 0;
+ this.c = 0;
+ this.d = 1;
+ this.tx = 0;
+ this.ty = 0;
+ return this;
+ };
+ /**
+ * Creates a new Matrix object with the same values as this one.
+ *
+ * @return {PIXI.Matrix} A copy of this matrix. Good for chaining method calls.
+ */
+ Matrix.prototype.clone = function () {
+ var matrix = new Matrix();
+ matrix.a = this.a;
+ matrix.b = this.b;
+ matrix.c = this.c;
+ matrix.d = this.d;
+ matrix.tx = this.tx;
+ matrix.ty = this.ty;
+ return matrix;
+ };
+ /**
+ * Changes the values of the given matrix to be the same as the ones in this matrix
+ *
+ * @param {PIXI.Matrix} matrix - The matrix to copy to.
+ * @return {PIXI.Matrix} The matrix given in parameter with its values updated.
+ */
+ Matrix.prototype.copyTo = function (matrix) {
+ matrix.a = this.a;
+ matrix.b = this.b;
+ matrix.c = this.c;
+ matrix.d = this.d;
+ matrix.tx = this.tx;
+ matrix.ty = this.ty;
+ return matrix;
+ };
+ /**
+ * Changes the values of the matrix to be the same as the ones in given matrix
+ *
+ * @param {PIXI.Matrix} matrix - The matrix to copy from.
+ * @return {PIXI.Matrix} this
+ */
+ Matrix.prototype.copyFrom = function (matrix) {
+ this.a = matrix.a;
+ this.b = matrix.b;
+ this.c = matrix.c;
+ this.d = matrix.d;
+ this.tx = matrix.tx;
+ this.ty = matrix.ty;
+ return this;
+ };
+ Object.defineProperty(Matrix, "IDENTITY", {
+ /**
+ * A default (identity) matrix
+ *
+ * @static
+ * @const
+ * @member {PIXI.Matrix}
+ */
+ get: function () {
+ return new Matrix();
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(Matrix, "TEMP_MATRIX", {
+ /**
+ * A temp matrix
+ *
+ * @static
+ * @const
+ * @member {PIXI.Matrix}
+ */
+ get: function () {
+ return new Matrix();
+ },
+ enumerable: false,
+ configurable: true
+ });
+ return Matrix;
+ }());
+
+ // Your friendly neighbour https://en.wikipedia.org/wiki/Dihedral_group
+ /*
+ * Transform matrix for operation n is:
+ * | ux | vx |
+ * | uy | vy |
+ */
+ var ux = [1, 1, 0, -1, -1, -1, 0, 1, 1, 1, 0, -1, -1, -1, 0, 1];
+ var uy = [0, 1, 1, 1, 0, -1, -1, -1, 0, 1, 1, 1, 0, -1, -1, -1];
+ var vx = [0, -1, -1, -1, 0, 1, 1, 1, 0, 1, 1, 1, 0, -1, -1, -1];
+ var vy = [1, 1, 0, -1, -1, -1, 0, 1, -1, -1, 0, 1, 1, 1, 0, -1];
+ /**
+ * [Cayley Table]{@link https://en.wikipedia.org/wiki/Cayley_table}
+ * for the composition of each rotation in the dihederal group D8.
+ *
+ * @type number[][]
+ * @private
+ */
+ var rotationCayley = [];
+ /**
+ * Matrices for each `GD8Symmetry` rotation.
+ *
+ * @type Matrix[]
+ * @private
+ */
+ var rotationMatrices = [];
+ /*
+ * Alias for {@code Math.sign}.
+ */
+ var signum = Math.sign;
+ /*
+ * Initializes `rotationCayley` and `rotationMatrices`. It is called
+ * only once below.
+ */
+ function init() {
+ for (var i = 0; i < 16; i++) {
+ var row = [];
+ rotationCayley.push(row);
+ for (var j = 0; j < 16; j++) {
+ /* Multiplies rotation matrices i and j. */
+ var _ux = signum((ux[i] * ux[j]) + (vx[i] * uy[j]));
+ var _uy = signum((uy[i] * ux[j]) + (vy[i] * uy[j]));
+ var _vx = signum((ux[i] * vx[j]) + (vx[i] * vy[j]));
+ var _vy = signum((uy[i] * vx[j]) + (vy[i] * vy[j]));
+ /* Finds rotation matrix matching the product and pushes it. */
+ for (var k = 0; k < 16; k++) {
+ if (ux[k] === _ux && uy[k] === _uy
+ && vx[k] === _vx && vy[k] === _vy) {
+ row.push(k);
+ break;
+ }
+ }
+ }
+ }
+ for (var i = 0; i < 16; i++) {
+ var mat = new Matrix();
+ mat.set(ux[i], uy[i], vx[i], vy[i], 0, 0);
+ rotationMatrices.push(mat);
+ }
+ }
+ init();
+ /**
+ * @memberof PIXI
+ * @typedef {number} GD8Symmetry
+ * @see PIXI.groupD8
+ */
+ /**
+ * Implements the dihedral group D8, which is similar to
+ * [group D4]{@link http://mathworld.wolfram.com/DihedralGroupD4.html};
+ * D8 is the same but with diagonals, and it is used for texture
+ * rotations.
+ *
+ * The directions the U- and V- axes after rotation
+ * of an angle of `a: GD8Constant` are the vectors `(uX(a), uY(a))`
+ * and `(vX(a), vY(a))`. These aren't necessarily unit vectors.
+ *
+ * **Origin:**
+ * This is the small part of gameofbombs.com portal system. It works.
+ *
+ * @see PIXI.groupD8.E
+ * @see PIXI.groupD8.SE
+ * @see PIXI.groupD8.S
+ * @see PIXI.groupD8.SW
+ * @see PIXI.groupD8.W
+ * @see PIXI.groupD8.NW
+ * @see PIXI.groupD8.N
+ * @see PIXI.groupD8.NE
+ * @author Ivan @ivanpopelyshev
+ * @namespace PIXI.groupD8
+ * @memberof PIXI
+ */
+ var groupD8 = {
+ /**
+ * | Rotation | Direction |
+ * |----------|-----------|
+ * | 0° | East |
+ *
+ * @memberof PIXI.groupD8
+ * @constant {PIXI.GD8Symmetry}
+ */
+ E: 0,
+ /**
+ * | Rotation | Direction |
+ * |----------|-----------|
+ * | 45°↻ | Southeast |
+ *
+ * @memberof PIXI.groupD8
+ * @constant {PIXI.GD8Symmetry}
+ */
+ SE: 1,
+ /**
+ * | Rotation | Direction |
+ * |----------|-----------|
+ * | 90°↻ | South |
+ *
+ * @memberof PIXI.groupD8
+ * @constant {PIXI.GD8Symmetry}
+ */
+ S: 2,
+ /**
+ * | Rotation | Direction |
+ * |----------|-----------|
+ * | 135°↻ | Southwest |
+ *
+ * @memberof PIXI.groupD8
+ * @constant {PIXI.GD8Symmetry}
+ */
+ SW: 3,
+ /**
+ * | Rotation | Direction |
+ * |----------|-----------|
+ * | 180° | West |
+ *
+ * @memberof PIXI.groupD8
+ * @constant {PIXI.GD8Symmetry}
+ */
+ W: 4,
+ /**
+ * | Rotation | Direction |
+ * |-------------|--------------|
+ * | -135°/225°↻ | Northwest |
+ *
+ * @memberof PIXI.groupD8
+ * @constant {PIXI.GD8Symmetry}
+ */
+ NW: 5,
+ /**
+ * | Rotation | Direction |
+ * |-------------|--------------|
+ * | -90°/270°↻ | North |
+ *
+ * @memberof PIXI.groupD8
+ * @constant {PIXI.GD8Symmetry}
+ */
+ N: 6,
+ /**
+ * | Rotation | Direction |
+ * |-------------|--------------|
+ * | -45°/315°↻ | Northeast |
+ *
+ * @memberof PIXI.groupD8
+ * @constant {PIXI.GD8Symmetry}
+ */
+ NE: 7,
+ /**
+ * Reflection about Y-axis.
+ *
+ * @memberof PIXI.groupD8
+ * @constant {PIXI.GD8Symmetry}
+ */
+ MIRROR_VERTICAL: 8,
+ /**
+ * Reflection about the main diagonal.
+ *
+ * @memberof PIXI.groupD8
+ * @constant {PIXI.GD8Symmetry}
+ */
+ MAIN_DIAGONAL: 10,
+ /**
+ * Reflection about X-axis.
+ *
+ * @memberof PIXI.groupD8
+ * @constant {PIXI.GD8Symmetry}
+ */
+ MIRROR_HORIZONTAL: 12,
+ /**
+ * Reflection about reverse diagonal.
+ *
+ * @memberof PIXI.groupD8
+ * @constant {PIXI.GD8Symmetry}
+ */
+ REVERSE_DIAGONAL: 14,
+ /**
+ * @memberof PIXI.groupD8
+ * @param {PIXI.GD8Symmetry} ind - sprite rotation angle.
+ * @return {PIXI.GD8Symmetry} The X-component of the U-axis
+ * after rotating the axes.
+ */
+ uX: function (ind) { return ux[ind]; },
+ /**
+ * @memberof PIXI.groupD8
+ * @param {PIXI.GD8Symmetry} ind - sprite rotation angle.
+ * @return {PIXI.GD8Symmetry} The Y-component of the U-axis
+ * after rotating the axes.
+ */
+ uY: function (ind) { return uy[ind]; },
+ /**
+ * @memberof PIXI.groupD8
+ * @param {PIXI.GD8Symmetry} ind - sprite rotation angle.
+ * @return {PIXI.GD8Symmetry} The X-component of the V-axis
+ * after rotating the axes.
+ */
+ vX: function (ind) { return vx[ind]; },
+ /**
+ * @memberof PIXI.groupD8
+ * @param {PIXI.GD8Symmetry} ind - sprite rotation angle.
+ * @return {PIXI.GD8Symmetry} The Y-component of the V-axis
+ * after rotating the axes.
+ */
+ vY: function (ind) { return vy[ind]; },
+ /**
+ * @memberof PIXI.groupD8
+ * @param {PIXI.GD8Symmetry} rotation - symmetry whose opposite
+ * is needed. Only rotations have opposite symmetries while
+ * reflections don't.
+ * @return {PIXI.GD8Symmetry} The opposite symmetry of `rotation`
+ */
+ inv: function (rotation) {
+ if (rotation & 8) // true only if between 8 & 15 (reflections)
+ {
+ return rotation & 15; // or rotation % 16
+ }
+ return (-rotation) & 7; // or (8 - rotation) % 8
+ },
+ /**
+ * Composes the two D8 operations.
+ *
+ * Taking `^` as reflection:
+ *
+ * | | E=0 | S=2 | W=4 | N=6 | E^=8 | S^=10 | W^=12 | N^=14 |
+ * |-------|-----|-----|-----|-----|------|-------|-------|-------|
+ * | E=0 | E | S | W | N | E^ | S^ | W^ | N^ |
+ * | S=2 | S | W | N | E | S^ | W^ | N^ | E^ |
+ * | W=4 | W | N | E | S | W^ | N^ | E^ | S^ |
+ * | N=6 | N | E | S | W | N^ | E^ | S^ | W^ |
+ * | E^=8 | E^ | N^ | W^ | S^ | E | N | W | S |
+ * | S^=10 | S^ | E^ | N^ | W^ | S | E | N | W |
+ * | W^=12 | W^ | S^ | E^ | N^ | W | S | E | N |
+ * | N^=14 | N^ | W^ | S^ | E^ | N | W | S | E |
+ *
+ * [This is a Cayley table]{@link https://en.wikipedia.org/wiki/Cayley_table}
+ * @memberof PIXI.groupD8
+ * @param {PIXI.GD8Symmetry} rotationSecond - Second operation, which
+ * is the row in the above cayley table.
+ * @param {PIXI.GD8Symmetry} rotationFirst - First operation, which
+ * is the column in the above cayley table.
+ * @return {PIXI.GD8Symmetry} Composed operation
+ */
+ add: function (rotationSecond, rotationFirst) { return (rotationCayley[rotationSecond][rotationFirst]); },
+ /**
+ * Reverse of `add`.
+ *
+ * @memberof PIXI.groupD8
+ * @param {PIXI.GD8Symmetry} rotationSecond - Second operation
+ * @param {PIXI.GD8Symmetry} rotationFirst - First operation
+ * @return {PIXI.GD8Symmetry} Result
+ */
+ sub: function (rotationSecond, rotationFirst) { return (rotationCayley[rotationSecond][groupD8.inv(rotationFirst)]); },
+ /**
+ * Adds 180 degrees to rotation, which is a commutative
+ * operation.
+ *
+ * @memberof PIXI.groupD8
+ * @param {number} rotation - The number to rotate.
+ * @returns {number} Rotated number
+ */
+ rotate180: function (rotation) { return rotation ^ 4; },
+ /**
+ * Checks if the rotation angle is vertical, i.e. south
+ * or north. It doesn't work for reflections.
+ *
+ * @memberof PIXI.groupD8
+ * @param {PIXI.GD8Symmetry} rotation - The number to check.
+ * @returns {boolean} Whether or not the direction is vertical
+ */
+ isVertical: function (rotation) { return (rotation & 3) === 2; },
+ /**
+ * Approximates the vector `V(dx,dy)` into one of the
+ * eight directions provided by `groupD8`.
+ *
+ * @memberof PIXI.groupD8
+ * @param {number} dx - X-component of the vector
+ * @param {number} dy - Y-component of the vector
+ * @return {PIXI.GD8Symmetry} Approximation of the vector into
+ * one of the eight symmetries.
+ */
+ byDirection: function (dx, dy) {
+ if (Math.abs(dx) * 2 <= Math.abs(dy)) {
+ if (dy >= 0) {
+ return groupD8.S;
+ }
+ return groupD8.N;
+ }
+ else if (Math.abs(dy) * 2 <= Math.abs(dx)) {
+ if (dx > 0) {
+ return groupD8.E;
+ }
+ return groupD8.W;
+ }
+ else if (dy > 0) {
+ if (dx > 0) {
+ return groupD8.SE;
+ }
+ return groupD8.SW;
+ }
+ else if (dx > 0) {
+ return groupD8.NE;
+ }
+ return groupD8.NW;
+ },
+ /**
+ * Helps sprite to compensate texture packer rotation.
+ *
+ * @memberof PIXI.groupD8
+ * @param {PIXI.Matrix} matrix - sprite world matrix
+ * @param {PIXI.GD8Symmetry} rotation - The rotation factor to use.
+ * @param {number} tx - sprite anchoring
+ * @param {number} ty - sprite anchoring
+ */
+ matrixAppendRotationInv: function (matrix, rotation, tx, ty) {
+ if (tx === void 0) { tx = 0; }
+ if (ty === void 0) { ty = 0; }
+ // Packer used "rotation", we use "inv(rotation)"
+ var mat = rotationMatrices[groupD8.inv(rotation)];
+ mat.tx = tx;
+ mat.ty = ty;
+ matrix.append(mat);
+ },
+ };
+
+ /**
+ * Transform that takes care about its versions
+ *
+ * @class
+ * @memberof PIXI
+ */
+ var Transform = /** @class */ (function () {
+ function Transform() {
+ /**
+ * The world transformation matrix.
+ *
+ * @member {PIXI.Matrix}
+ */
+ this.worldTransform = new Matrix();
+ /**
+ * The local transformation matrix.
+ *
+ * @member {PIXI.Matrix}
+ */
+ this.localTransform = new Matrix();
+ /**
+ * The coordinate of the object relative to the local coordinates of the parent.
+ *
+ * @member {PIXI.ObservablePoint}
+ */
+ this.position = new ObservablePoint(this.onChange, this, 0, 0);
+ /**
+ * The scale factor of the object.
+ *
+ * @member {PIXI.ObservablePoint}
+ */
+ this.scale = new ObservablePoint(this.onChange, this, 1, 1);
+ /**
+ * The pivot point of the displayObject that it rotates around.
+ *
+ * @member {PIXI.ObservablePoint}
+ */
+ this.pivot = new ObservablePoint(this.onChange, this, 0, 0);
+ /**
+ * The skew amount, on the x and y axis.
+ *
+ * @member {PIXI.ObservablePoint}
+ */
+ this.skew = new ObservablePoint(this.updateSkew, this, 0, 0);
+ /**
+ * The rotation amount.
+ *
+ * @protected
+ * @member {number}
+ */
+ this._rotation = 0;
+ /**
+ * The X-coordinate value of the normalized local X axis,
+ * the first column of the local transformation matrix without a scale.
+ *
+ * @protected
+ * @member {number}
+ */
+ this._cx = 1;
+ /**
+ * The Y-coordinate value of the normalized local X axis,
+ * the first column of the local transformation matrix without a scale.
+ *
+ * @protected
+ * @member {number}
+ */
+ this._sx = 0;
+ /**
+ * The X-coordinate value of the normalized local Y axis,
+ * the second column of the local transformation matrix without a scale.
+ *
+ * @protected
+ * @member {number}
+ */
+ this._cy = 0;
+ /**
+ * The Y-coordinate value of the normalized local Y axis,
+ * the second column of the local transformation matrix without a scale.
+ *
+ * @protected
+ * @member {number}
+ */
+ this._sy = 1;
+ /**
+ * The locally unique ID of the local transform.
+ *
+ * @protected
+ * @member {number}
+ */
+ this._localID = 0;
+ /**
+ * The locally unique ID of the local transform
+ * used to calculate the current local transformation matrix.
+ *
+ * @protected
+ * @member {number}
+ */
+ this._currentLocalID = 0;
+ /**
+ * The locally unique ID of the world transform.
+ *
+ * @protected
+ * @member {number}
+ */
+ this._worldID = 0;
+ /**
+ * The locally unique ID of the parent's world transform
+ * used to calculate the current world transformation matrix.
+ *
+ * @protected
+ * @member {number}
+ */
+ this._parentID = 0;
+ }
+ /**
+ * Called when a value changes.
+ *
+ * @protected
+ */
+ Transform.prototype.onChange = function () {
+ this._localID++;
+ };
+ /**
+ * Called when the skew or the rotation changes.
+ *
+ * @protected
+ */
+ Transform.prototype.updateSkew = function () {
+ this._cx = Math.cos(this._rotation + this.skew.y);
+ this._sx = Math.sin(this._rotation + this.skew.y);
+ this._cy = -Math.sin(this._rotation - this.skew.x); // cos, added PI/2
+ this._sy = Math.cos(this._rotation - this.skew.x); // sin, added PI/2
+ this._localID++;
+ };
+ /**
+ * Updates the local transformation matrix.
+ */
+ Transform.prototype.updateLocalTransform = function () {
+ var lt = this.localTransform;
+ if (this._localID !== this._currentLocalID) {
+ // get the matrix values of the displayobject based on its transform properties..
+ lt.a = this._cx * this.scale.x;
+ lt.b = this._sx * this.scale.x;
+ lt.c = this._cy * this.scale.y;
+ lt.d = this._sy * this.scale.y;
+ lt.tx = this.position.x - ((this.pivot.x * lt.a) + (this.pivot.y * lt.c));
+ lt.ty = this.position.y - ((this.pivot.x * lt.b) + (this.pivot.y * lt.d));
+ this._currentLocalID = this._localID;
+ // force an update..
+ this._parentID = -1;
+ }
+ };
+ /**
+ * Updates the local and the world transformation matrices.
+ *
+ * @param {PIXI.Transform} parentTransform - The parent transform
+ */
+ Transform.prototype.updateTransform = function (parentTransform) {
+ var lt = this.localTransform;
+ if (this._localID !== this._currentLocalID) {
+ // get the matrix values of the displayobject based on its transform properties..
+ lt.a = this._cx * this.scale.x;
+ lt.b = this._sx * this.scale.x;
+ lt.c = this._cy * this.scale.y;
+ lt.d = this._sy * this.scale.y;
+ lt.tx = this.position.x - ((this.pivot.x * lt.a) + (this.pivot.y * lt.c));
+ lt.ty = this.position.y - ((this.pivot.x * lt.b) + (this.pivot.y * lt.d));
+ this._currentLocalID = this._localID;
+ // force an update..
+ this._parentID = -1;
+ }
+ if (this._parentID !== parentTransform._worldID) {
+ // concat the parent matrix with the objects transform.
+ var pt = parentTransform.worldTransform;
+ var wt = this.worldTransform;
+ wt.a = (lt.a * pt.a) + (lt.b * pt.c);
+ wt.b = (lt.a * pt.b) + (lt.b * pt.d);
+ wt.c = (lt.c * pt.a) + (lt.d * pt.c);
+ wt.d = (lt.c * pt.b) + (lt.d * pt.d);
+ wt.tx = (lt.tx * pt.a) + (lt.ty * pt.c) + pt.tx;
+ wt.ty = (lt.tx * pt.b) + (lt.ty * pt.d) + pt.ty;
+ this._parentID = parentTransform._worldID;
+ // update the id of the transform..
+ this._worldID++;
+ }
+ };
+ /**
+ * Decomposes a matrix and sets the transforms properties based on it.
+ *
+ * @param {PIXI.Matrix} matrix - The matrix to decompose
+ */
+ Transform.prototype.setFromMatrix = function (matrix) {
+ matrix.decompose(this);
+ this._localID++;
+ };
+ Object.defineProperty(Transform.prototype, "rotation", {
+ /**
+ * The rotation of the object in radians.
+ *
+ * @member {number}
+ */
+ get: function () {
+ return this._rotation;
+ },
+ set: function (value) {
+ if (this._rotation !== value) {
+ this._rotation = value;
+ this.updateSkew();
+ }
+ },
+ enumerable: false,
+ configurable: true
+ });
+ /**
+ * A default (identity) transform
+ *
+ * @static
+ * @constant
+ * @member {PIXI.Transform}
+ */
+ Transform.IDENTITY = new Transform();
+ return Transform;
+ }());
+
+ /*!
+ * @pixi/display - v5.3.12
+ * Compiled Wed, 23 Mar 2022 18:38:07 UTC
+ *
+ * @pixi/display is licensed under the MIT License.
+ * http://www.opensource.org/licenses/mit-license
+ */
+
+ /**
+ * Sets the default value for the container property 'sortableChildren'.
+ * If set to true, the container will sort its children by zIndex value
+ * when updateTransform() is called, or manually if sortChildren() is called.
+ *
+ * This actually changes the order of elements in the array, so should be treated
+ * as a basic solution that is not performant compared to other solutions,
+ * such as @link https://github.com/pixijs/pixi-display
+ *
+ * Also be aware of that this may not work nicely with the addChildAt() function,
+ * as the zIndex sorting may cause the child to automatically sorted to another position.
+ *
+ * @static
+ * @constant
+ * @name SORTABLE_CHILDREN
+ * @memberof PIXI.settings
+ * @type {boolean}
+ * @default false
+ */
+ settings.SORTABLE_CHILDREN = false;
+
+ /**
+ * 'Builder' pattern for bounds rectangles.
+ *
+ * This could be called an Axis-Aligned Bounding Box.
+ * It is not an actual shape. It is a mutable thing; no 'EMPTY' or those kind of problems.
+ *
+ * @class
+ * @memberof PIXI
+ */
+ var Bounds = /** @class */ (function () {
+ function Bounds() {
+ /**
+ * @member {number}
+ * @default 0
+ */
+ this.minX = Infinity;
+ /**
+ * @member {number}
+ * @default 0
+ */
+ this.minY = Infinity;
+ /**
+ * @member {number}
+ * @default 0
+ */
+ this.maxX = -Infinity;
+ /**
+ * @member {number}
+ * @default 0
+ */
+ this.maxY = -Infinity;
+ this.rect = null;
+ /**
+ * It is updated to _boundsID of corresponding object to keep bounds in sync with content.
+ * Updated from outside, thus public modifier.
+ *
+ * @member {number}
+ * @public
+ */
+ this.updateID = -1;
+ }
+ /**
+ * Checks if bounds are empty.
+ *
+ * @return {boolean} True if empty.
+ */
+ Bounds.prototype.isEmpty = function () {
+ return this.minX > this.maxX || this.minY > this.maxY;
+ };
+ /**
+ * Clears the bounds and resets.
+ *
+ */
+ Bounds.prototype.clear = function () {
+ this.minX = Infinity;
+ this.minY = Infinity;
+ this.maxX = -Infinity;
+ this.maxY = -Infinity;
+ };
+ /**
+ * Can return Rectangle.EMPTY constant, either construct new rectangle, either use your rectangle
+ * It is not guaranteed that it will return tempRect
+ *
+ * @param {PIXI.Rectangle} rect - temporary object will be used if AABB is not empty
+ * @returns {PIXI.Rectangle} A rectangle of the bounds
+ */
+ Bounds.prototype.getRectangle = function (rect) {
+ if (this.minX > this.maxX || this.minY > this.maxY) {
+ return Rectangle.EMPTY;
+ }
+ rect = rect || new Rectangle(0, 0, 1, 1);
+ rect.x = this.minX;
+ rect.y = this.minY;
+ rect.width = this.maxX - this.minX;
+ rect.height = this.maxY - this.minY;
+ return rect;
+ };
+ /**
+ * This function should be inlined when its possible.
+ *
+ * @param {PIXI.IPointData} point - The point to add.
+ */
+ Bounds.prototype.addPoint = function (point) {
+ this.minX = Math.min(this.minX, point.x);
+ this.maxX = Math.max(this.maxX, point.x);
+ this.minY = Math.min(this.minY, point.y);
+ this.maxY = Math.max(this.maxY, point.y);
+ };
+ /**
+ * Adds a quad, not transformed
+ *
+ * @param {Float32Array} vertices - The verts to add.
+ */
+ Bounds.prototype.addQuad = function (vertices) {
+ var minX = this.minX;
+ var minY = this.minY;
+ var maxX = this.maxX;
+ var maxY = this.maxY;
+ var x = vertices[0];
+ var y = vertices[1];
+ minX = x < minX ? x : minX;
+ minY = y < minY ? y : minY;
+ maxX = x > maxX ? x : maxX;
+ maxY = y > maxY ? y : maxY;
+ x = vertices[2];
+ y = vertices[3];
+ minX = x < minX ? x : minX;
+ minY = y < minY ? y : minY;
+ maxX = x > maxX ? x : maxX;
+ maxY = y > maxY ? y : maxY;
+ x = vertices[4];
+ y = vertices[5];
+ minX = x < minX ? x : minX;
+ minY = y < minY ? y : minY;
+ maxX = x > maxX ? x : maxX;
+ maxY = y > maxY ? y : maxY;
+ x = vertices[6];
+ y = vertices[7];
+ minX = x < minX ? x : minX;
+ minY = y < minY ? y : minY;
+ maxX = x > maxX ? x : maxX;
+ maxY = y > maxY ? y : maxY;
+ this.minX = minX;
+ this.minY = minY;
+ this.maxX = maxX;
+ this.maxY = maxY;
+ };
+ /**
+ * Adds sprite frame, transformed.
+ *
+ * @param {PIXI.Transform} transform - transform to apply
+ * @param {number} x0 - left X of frame
+ * @param {number} y0 - top Y of frame
+ * @param {number} x1 - right X of frame
+ * @param {number} y1 - bottom Y of frame
+ */
+ Bounds.prototype.addFrame = function (transform, x0, y0, x1, y1) {
+ this.addFrameMatrix(transform.worldTransform, x0, y0, x1, y1);
+ };
+ /**
+ * Adds sprite frame, multiplied by matrix
+ *
+ * @param {PIXI.Matrix} matrix - matrix to apply
+ * @param {number} x0 - left X of frame
+ * @param {number} y0 - top Y of frame
+ * @param {number} x1 - right X of frame
+ * @param {number} y1 - bottom Y of frame
+ */
+ Bounds.prototype.addFrameMatrix = function (matrix, x0, y0, x1, y1) {
+ var a = matrix.a;
+ var b = matrix.b;
+ var c = matrix.c;
+ var d = matrix.d;
+ var tx = matrix.tx;
+ var ty = matrix.ty;
+ var minX = this.minX;
+ var minY = this.minY;
+ var maxX = this.maxX;
+ var maxY = this.maxY;
+ var x = (a * x0) + (c * y0) + tx;
+ var y = (b * x0) + (d * y0) + ty;
+ minX = x < minX ? x : minX;
+ minY = y < minY ? y : minY;
+ maxX = x > maxX ? x : maxX;
+ maxY = y > maxY ? y : maxY;
+ x = (a * x1) + (c * y0) + tx;
+ y = (b * x1) + (d * y0) + ty;
+ minX = x < minX ? x : minX;
+ minY = y < minY ? y : minY;
+ maxX = x > maxX ? x : maxX;
+ maxY = y > maxY ? y : maxY;
+ x = (a * x0) + (c * y1) + tx;
+ y = (b * x0) + (d * y1) + ty;
+ minX = x < minX ? x : minX;
+ minY = y < minY ? y : minY;
+ maxX = x > maxX ? x : maxX;
+ maxY = y > maxY ? y : maxY;
+ x = (a * x1) + (c * y1) + tx;
+ y = (b * x1) + (d * y1) + ty;
+ minX = x < minX ? x : minX;
+ minY = y < minY ? y : minY;
+ maxX = x > maxX ? x : maxX;
+ maxY = y > maxY ? y : maxY;
+ this.minX = minX;
+ this.minY = minY;
+ this.maxX = maxX;
+ this.maxY = maxY;
+ };
+ /**
+ * Adds screen vertices from array
+ *
+ * @param {Float32Array} vertexData - calculated vertices
+ * @param {number} beginOffset - begin offset
+ * @param {number} endOffset - end offset, excluded
+ */
+ Bounds.prototype.addVertexData = function (vertexData, beginOffset, endOffset) {
+ var minX = this.minX;
+ var minY = this.minY;
+ var maxX = this.maxX;
+ var maxY = this.maxY;
+ for (var i = beginOffset; i < endOffset; i += 2) {
+ var x = vertexData[i];
+ var y = vertexData[i + 1];
+ minX = x < minX ? x : minX;
+ minY = y < minY ? y : minY;
+ maxX = x > maxX ? x : maxX;
+ maxY = y > maxY ? y : maxY;
+ }
+ this.minX = minX;
+ this.minY = minY;
+ this.maxX = maxX;
+ this.maxY = maxY;
+ };
+ /**
+ * Add an array of mesh vertices
+ *
+ * @param {PIXI.Transform} transform - mesh transform
+ * @param {Float32Array} vertices - mesh coordinates in array
+ * @param {number} beginOffset - begin offset
+ * @param {number} endOffset - end offset, excluded
+ */
+ Bounds.prototype.addVertices = function (transform, vertices, beginOffset, endOffset) {
+ this.addVerticesMatrix(transform.worldTransform, vertices, beginOffset, endOffset);
+ };
+ /**
+ * Add an array of mesh vertices.
+ *
+ * @param {PIXI.Matrix} matrix - mesh matrix
+ * @param {Float32Array} vertices - mesh coordinates in array
+ * @param {number} beginOffset - begin offset
+ * @param {number} endOffset - end offset, excluded
+ * @param {number} [padX=0] - x padding
+ * @param {number} [padY=0] - y padding
+ */
+ Bounds.prototype.addVerticesMatrix = function (matrix, vertices, beginOffset, endOffset, padX, padY) {
+ if (padX === void 0) { padX = 0; }
+ if (padY === void 0) { padY = padX; }
+ var a = matrix.a;
+ var b = matrix.b;
+ var c = matrix.c;
+ var d = matrix.d;
+ var tx = matrix.tx;
+ var ty = matrix.ty;
+ var minX = this.minX;
+ var minY = this.minY;
+ var maxX = this.maxX;
+ var maxY = this.maxY;
+ for (var i = beginOffset; i < endOffset; i += 2) {
+ var rawX = vertices[i];
+ var rawY = vertices[i + 1];
+ var x = (a * rawX) + (c * rawY) + tx;
+ var y = (d * rawY) + (b * rawX) + ty;
+ minX = Math.min(minX, x - padX);
+ maxX = Math.max(maxX, x + padX);
+ minY = Math.min(minY, y - padY);
+ maxY = Math.max(maxY, y + padY);
+ }
+ this.minX = minX;
+ this.minY = minY;
+ this.maxX = maxX;
+ this.maxY = maxY;
+ };
+ /**
+ * Adds other Bounds.
+ *
+ * @param {PIXI.Bounds} bounds - The Bounds to be added
+ */
+ Bounds.prototype.addBounds = function (bounds) {
+ var minX = this.minX;
+ var minY = this.minY;
+ var maxX = this.maxX;
+ var maxY = this.maxY;
+ this.minX = bounds.minX < minX ? bounds.minX : minX;
+ this.minY = bounds.minY < minY ? bounds.minY : minY;
+ this.maxX = bounds.maxX > maxX ? bounds.maxX : maxX;
+ this.maxY = bounds.maxY > maxY ? bounds.maxY : maxY;
+ };
+ /**
+ * Adds other Bounds, masked with Bounds.
+ *
+ * @param {PIXI.Bounds} bounds - The Bounds to be added.
+ * @param {PIXI.Bounds} mask - TODO
+ */
+ Bounds.prototype.addBoundsMask = function (bounds, mask) {
+ var _minX = bounds.minX > mask.minX ? bounds.minX : mask.minX;
+ var _minY = bounds.minY > mask.minY ? bounds.minY : mask.minY;
+ var _maxX = bounds.maxX < mask.maxX ? bounds.maxX : mask.maxX;
+ var _maxY = bounds.maxY < mask.maxY ? bounds.maxY : mask.maxY;
+ if (_minX <= _maxX && _minY <= _maxY) {
+ var minX = this.minX;
+ var minY = this.minY;
+ var maxX = this.maxX;
+ var maxY = this.maxY;
+ this.minX = _minX < minX ? _minX : minX;
+ this.minY = _minY < minY ? _minY : minY;
+ this.maxX = _maxX > maxX ? _maxX : maxX;
+ this.maxY = _maxY > maxY ? _maxY : maxY;
+ }
+ };
+ /**
+ * Adds other Bounds, multiplied by matrix. Bounds shouldn't be empty.
+ *
+ * @param {PIXI.Bounds} bounds - other bounds
+ * @param {PIXI.Matrix} matrix - multiplicator
+ */
+ Bounds.prototype.addBoundsMatrix = function (bounds, matrix) {
+ this.addFrameMatrix(matrix, bounds.minX, bounds.minY, bounds.maxX, bounds.maxY);
+ };
+ /**
+ * Adds other Bounds, masked with Rectangle.
+ *
+ * @param {PIXI.Bounds} bounds - TODO
+ * @param {PIXI.Rectangle} area - TODO
+ */
+ Bounds.prototype.addBoundsArea = function (bounds, area) {
+ var _minX = bounds.minX > area.x ? bounds.minX : area.x;
+ var _minY = bounds.minY > area.y ? bounds.minY : area.y;
+ var _maxX = bounds.maxX < area.x + area.width ? bounds.maxX : (area.x + area.width);
+ var _maxY = bounds.maxY < area.y + area.height ? bounds.maxY : (area.y + area.height);
+ if (_minX <= _maxX && _minY <= _maxY) {
+ var minX = this.minX;
+ var minY = this.minY;
+ var maxX = this.maxX;
+ var maxY = this.maxY;
+ this.minX = _minX < minX ? _minX : minX;
+ this.minY = _minY < minY ? _minY : minY;
+ this.maxX = _maxX > maxX ? _maxX : maxX;
+ this.maxY = _maxY > maxY ? _maxY : maxY;
+ }
+ };
+ /**
+ * Pads bounds object, making it grow in all directions.
+ * If paddingY is omitted, both paddingX and paddingY will be set to paddingX.
+ *
+ * @param {number} [paddingX=0] - The horizontal padding amount.
+ * @param {number} [paddingY=0] - The vertical padding amount.
+ */
+ Bounds.prototype.pad = function (paddingX, paddingY) {
+ if (paddingX === void 0) { paddingX = 0; }
+ if (paddingY === void 0) { paddingY = paddingX; }
+ if (!this.isEmpty()) {
+ this.minX -= paddingX;
+ this.maxX += paddingX;
+ this.minY -= paddingY;
+ this.maxY += paddingY;
+ }
+ };
+ /**
+ * Adds padded frame. (x0, y0) should be strictly less than (x1, y1)
+ *
+ * @param {number} x0 - left X of frame
+ * @param {number} y0 - top Y of frame
+ * @param {number} x1 - right X of frame
+ * @param {number} y1 - bottom Y of frame
+ * @param {number} padX - padding X
+ * @param {number} padY - padding Y
+ */
+ Bounds.prototype.addFramePad = function (x0, y0, x1, y1, padX, padY) {
+ x0 -= padX;
+ y0 -= padY;
+ x1 += padX;
+ y1 += padY;
+ this.minX = this.minX < x0 ? this.minX : x0;
+ this.maxX = this.maxX > x1 ? this.maxX : x1;
+ this.minY = this.minY < y0 ? this.minY : y0;
+ this.maxY = this.maxY > y1 ? this.maxY : y1;
+ };
+ return Bounds;
+ }());
+
+ /*! *****************************************************************************
+ Copyright (c) Microsoft Corporation. All rights reserved.
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+ this file except in compliance with the License. You may obtain a copy of the
+ License at http://www.apache.org/licenses/LICENSE-2.0
+
+ THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+ WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+ MERCHANTABLITY OR NON-INFRINGEMENT.
+
+ See the Apache Version 2.0 License for specific language governing permissions
+ and limitations under the License.
+ ***************************************************************************** */
+ /* global Reflect, Promise */
+
+ var extendStatics = function(d, b) {
+ extendStatics = Object.setPrototypeOf ||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+ function (d, b) { for (var p in b) { if (b.hasOwnProperty(p)) { d[p] = b[p]; } } };
+ return extendStatics(d, b);
+ };
+
+ function __extends(d, b) {
+ extendStatics(d, b);
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+ }
+
+ /**
+ * The base class for all objects that are rendered on the screen.
+ *
+ * This is an abstract class and should not be used on its own; rather it should b e extended.
+ *
+ * @class
+ * @extends PIXI.utils.EventEmitter
+ * @memberof PIXI
+ */
+ var DisplayObject = /** @class */ (function (_super) {
+ __extends(DisplayObject, _super);
+ function DisplayObject() {
+ var _this = _super.call(this) || this;
+ _this.tempDisplayObjectParent = null;
+ // TODO: need to create Transform from factory
+ /**
+ * World transform and local transform of this object.
+ * This will become read-only later, please do not assign anything there unless you know what are you doing.
+ *
+ * @member {PIXI.Transform}
+ */
+ _this.transform = new Transform();
+ /**
+ * The opacity of the object.
+ *
+ * @member {number}
+ */
+ _this.alpha = 1;
+ /**
+ * The visibility of the object. If false the object will not be drawn, and
+ * the updateTransform function will not be called.
+ *
+ * Only affects recursive calls from parent. You can ask for bounds or call updateTransform manually.
+ *
+ * @member {boolean}
+ */
+ _this.visible = true;
+ /**
+ * Can this object be rendered, if false the object will not be drawn but the updateTransform
+ * methods will still be called.
+ *
+ * Only affects recursive calls from parent. You can ask for bounds manually.
+ *
+ * @member {boolean}
+ */
+ _this.renderable = true;
+ /**
+ * The display object container that contains this display object.
+ *
+ * @member {PIXI.Container}
+ */
+ _this.parent = null;
+ /**
+ * The multiplied alpha of the displayObject.
+ *
+ * @member {number}
+ * @readonly
+ */
+ _this.worldAlpha = 1;
+ /**
+ * Which index in the children array the display component was before the previous zIndex sort.
+ * Used by containers to help sort objects with the same zIndex, by using previous array index as the decider.
+ *
+ * @member {number}
+ * @protected
+ */
+ _this._lastSortedIndex = 0;
+ /**
+ * The zIndex of the displayObject.
+ * A higher value will mean it will be rendered on top of other displayObjects within the same container.
+ *
+ * @member {number}
+ * @protected
+ */
+ _this._zIndex = 0;
+ /**
+ * The area the filter is applied to. This is used as more of an optimization
+ * rather than figuring out the dimensions of the displayObject each frame you can set this rectangle.
+ *
+ * Also works as an interaction mask.
+ *
+ * @member {?PIXI.Rectangle}
+ */
+ _this.filterArea = null;
+ /**
+ * Sets the filters for the displayObject.
+ * * IMPORTANT: This is a WebGL only feature and will be ignored by the canvas renderer.
+ * To remove filters simply set this property to `'null'`.
+ *
+ * @member {?PIXI.Filter[]}
+ */
+ _this.filters = null;
+ /**
+ * Currently enabled filters
+ * @member {PIXI.Filter[]}
+ * @protected
+ */
+ _this._enabledFilters = null;
+ /**
+ * The bounds object, this is used to calculate and store the bounds of the displayObject.
+ *
+ * @member {PIXI.Bounds}
+ */
+ _this._bounds = new Bounds();
+ /**
+ * Local bounds object, swapped with `_bounds` when using `getLocalBounds()`.
+ *
+ * @member {PIXI.Bounds}
+ */
+ _this._localBounds = null;
+ /**
+ * Flags the cached bounds as dirty.
+ *
+ * @member {number}
+ * @protected
+ */
+ _this._boundsID = 0;
+ /**
+ * Cache of this display-object's bounds-rectangle.
+ *
+ * @member {PIXI.Bounds}
+ * @protected
+ */
+ _this._boundsRect = null;
+ /**
+ * Cache of this display-object's local-bounds rectangle.
+ *
+ * @member {PIXI.Bounds}
+ * @protected
+ */
+ _this._localBoundsRect = null;
+ /**
+ * The original, cached mask of the object.
+ *
+ * @member {PIXI.Container|PIXI.MaskData|null}
+ * @protected
+ */
+ _this._mask = null;
+ /**
+ * Fired when this DisplayObject is added to a Container.
+ *
+ * @event PIXI.DisplayObject#added
+ * @param {PIXI.Container} container - The container added to.
+ */
+ /**
+ * Fired when this DisplayObject is removed from a Container.
+ *
+ * @event PIXI.DisplayObject#removed
+ * @param {PIXI.Container} container - The container removed from.
+ */
+ /**
+ * If the object has been destroyed via destroy(). If true, it should not be used.
+ *
+ * @member {boolean}
+ * @protected
+ */
+ _this._destroyed = false;
+ /**
+ * used to fast check if a sprite is.. a sprite!
+ * @member {boolean}
+ */
+ _this.isSprite = false;
+ /**
+ * Does any other displayObject use this object as a mask?
+ * @member {boolean}
+ */
+ _this.isMask = false;
+ return _this;
+ }
+ /**
+ * Mixes all enumerable properties and methods from a source object to DisplayObject.
+ *
+ * @param {object} source - The source of properties and methods to mix in.
+ */
+ DisplayObject.mixin = function (source) {
+ // in ES8/ES2017, this would be really easy:
+ // Object.defineProperties(DisplayObject.prototype, Object.getOwnPropertyDescriptors(source));
+ // get all the enumerable property keys
+ var keys = Object.keys(source);
+ // loop through properties
+ for (var i = 0; i < keys.length; ++i) {
+ var propertyName = keys[i];
+ // Set the property using the property descriptor - this works for accessors and normal value properties
+ Object.defineProperty(DisplayObject.prototype, propertyName, Object.getOwnPropertyDescriptor(source, propertyName));
+ }
+ };
+ /**
+ * Recursively updates transform of all objects from the root to this one
+ * internal function for toLocal()
+ */
+ DisplayObject.prototype._recursivePostUpdateTransform = function () {
+ if (this.parent) {
+ this.parent._recursivePostUpdateTransform();
+ this.transform.updateTransform(this.parent.transform);
+ }
+ else {
+ this.transform.updateTransform(this._tempDisplayObjectParent.transform);
+ }
+ };
+ /**
+ * Updates the object transform for rendering.
+ *
+ * TODO - Optimization pass!
+ */
+ DisplayObject.prototype.updateTransform = function () {
+ this._boundsID++;
+ this.transform.updateTransform(this.parent.transform);
+ // multiply the alphas..
+ this.worldAlpha = this.alpha * this.parent.worldAlpha;
+ };
+ /**
+ * Retrieves the bounds of the displayObject as a rectangle object.
+ *
+ * @param {boolean} [skipUpdate] - Setting to `true` will stop the transforms of the scene graph from
+ * being updated. This means the calculation returned MAY be out of date BUT will give you a
+ * nice performance boost.
+ * @param {PIXI.Rectangle} [rect] - Optional rectangle to store the result of the bounds calculation.
+ * @return {PIXI.Rectangle} The rectangular bounding area.
+ */
+ DisplayObject.prototype.getBounds = function (skipUpdate, rect) {
+ if (!skipUpdate) {
+ if (!this.parent) {
+ this.parent = this._tempDisplayObjectParent;
+ this.updateTransform();
+ this.parent = null;
+ }
+ else {
+ this._recursivePostUpdateTransform();
+ this.updateTransform();
+ }
+ }
+ if (this._bounds.updateID !== this._boundsID) {
+ this.calculateBounds();
+ this._bounds.updateID = this._boundsID;
+ }
+ if (!rect) {
+ if (!this._boundsRect) {
+ this._boundsRect = new Rectangle();
+ }
+ rect = this._boundsRect;
+ }
+ return this._bounds.getRectangle(rect);
+ };
+ /**
+ * Retrieves the local bounds of the displayObject as a rectangle object.
+ *
+ * @param {PIXI.Rectangle} [rect] - Optional rectangle to store the result of the bounds calculation.
+ * @return {PIXI.Rectangle} The rectangular bounding area.
+ */
+ DisplayObject.prototype.getLocalBounds = function (rect) {
+ if (!rect) {
+ if (!this._localBoundsRect) {
+ this._localBoundsRect = new Rectangle();
+ }
+ rect = this._localBoundsRect;
+ }
+ if (!this._localBounds) {
+ this._localBounds = new Bounds();
+ }
+ var transformRef = this.transform;
+ var parentRef = this.parent;
+ this.parent = null;
+ this.transform = this._tempDisplayObjectParent.transform;
+ var worldBounds = this._bounds;
+ var worldBoundsID = this._boundsID;
+ this._bounds = this._localBounds;
+ var bounds = this.getBounds(false, rect);
+ this.parent = parentRef;
+ this.transform = transformRef;
+ this._bounds = worldBounds;
+ this._bounds.updateID += this._boundsID - worldBoundsID; // reflect side-effects
+ return bounds;
+ };
+ /**
+ * Calculates the global position of the display object.
+ *
+ * @param {PIXI.IPointData} position - The world origin to calculate from.
+ * @param {PIXI.Point} [point] - A Point object in which to store the value, optional
+ * (otherwise will create a new Point).
+ * @param {boolean} [skipUpdate=false] - Should we skip the update transform.
+ * @return {PIXI.Point} A point object representing the position of this object.
+ */
+ DisplayObject.prototype.toGlobal = function (position, point, skipUpdate) {
+ if (skipUpdate === void 0) { skipUpdate = false; }
+ if (!skipUpdate) {
+ this._recursivePostUpdateTransform();
+ // this parent check is for just in case the item is a root object.
+ // If it is we need to give it a temporary parent so that displayObjectUpdateTransform works correctly
+ // this is mainly to avoid a parent check in the main loop. Every little helps for performance :)
+ if (!this.parent) {
+ this.parent = this._tempDisplayObjectParent;
+ this.displayObjectUpdateTransform();
+ this.parent = null;
+ }
+ else {
+ this.displayObjectUpdateTransform();
+ }
+ }
+ // don't need to update the lot
+ return this.worldTransform.apply(position, point);
+ };
+ /**
+ * Calculates the local position of the display object relative to another point.
+ *
+ * @param {PIXI.IPointData} position - The world origin to calculate from.
+ * @param {PIXI.DisplayObject} [from] - The DisplayObject to calculate the global position from.
+ * @param {PIXI.Point} [point] - A Point object in which to store the value, optional
+ * (otherwise will create a new Point).
+ * @param {boolean} [skipUpdate=false] - Should we skip the update transform
+ * @return {PIXI.Point} A point object representing the position of this object
+ */
+ DisplayObject.prototype.toLocal = function (position, from, point, skipUpdate) {
+ if (from) {
+ position = from.toGlobal(position, point, skipUpdate);
+ }
+ if (!skipUpdate) {
+ this._recursivePostUpdateTransform();
+ // this parent check is for just in case the item is a root object.
+ // If it is we need to give it a temporary parent so that displayObjectUpdateTransform works correctly
+ // this is mainly to avoid a parent check in the main loop. Every little helps for performance :)
+ if (!this.parent) {
+ this.parent = this._tempDisplayObjectParent;
+ this.displayObjectUpdateTransform();
+ this.parent = null;
+ }
+ else {
+ this.displayObjectUpdateTransform();
+ }
+ }
+ // simply apply the matrix..
+ return this.worldTransform.applyInverse(position, point);
+ };
+ /**
+ * Set the parent Container of this DisplayObject.
+ *
+ * @param {PIXI.Container} container - The Container to add this DisplayObject to.
+ * @return {PIXI.Container} The Container that this DisplayObject was added to.
+ */
+ DisplayObject.prototype.setParent = function (container) {
+ if (!container || !container.addChild) {
+ throw new Error('setParent: Argument must be a Container');
+ }
+ container.addChild(this);
+ return container;
+ };
+ /**
+ * Convenience function to set the position, scale, skew and pivot at once.
+ *
+ * @param {number} [x=0] - The X position
+ * @param {number} [y=0] - The Y position
+ * @param {number} [scaleX=1] - The X scale value
+ * @param {number} [scaleY=1] - The Y scale value
+ * @param {number} [rotation=0] - The rotation
+ * @param {number} [skewX=0] - The X skew value
+ * @param {number} [skewY=0] - The Y skew value
+ * @param {number} [pivotX=0] - The X pivot value
+ * @param {number} [pivotY=0] - The Y pivot value
+ * @return {PIXI.DisplayObject} The DisplayObject instance
+ */
+ DisplayObject.prototype.setTransform = function (x, y, scaleX, scaleY, rotation, skewX, skewY, pivotX, pivotY) {
+ if (x === void 0) { x = 0; }
+ if (y === void 0) { y = 0; }
+ if (scaleX === void 0) { scaleX = 1; }
+ if (scaleY === void 0) { scaleY = 1; }
+ if (rotation === void 0) { rotation = 0; }
+ if (skewX === void 0) { skewX = 0; }
+ if (skewY === void 0) { skewY = 0; }
+ if (pivotX === void 0) { pivotX = 0; }
+ if (pivotY === void 0) { pivotY = 0; }
+ this.position.x = x;
+ this.position.y = y;
+ this.scale.x = !scaleX ? 1 : scaleX;
+ this.scale.y = !scaleY ? 1 : scaleY;
+ this.rotation = rotation;
+ this.skew.x = skewX;
+ this.skew.y = skewY;
+ this.pivot.x = pivotX;
+ this.pivot.y = pivotY;
+ return this;
+ };
+ /**
+ * Base destroy method for generic display objects. This will automatically
+ * remove the display object from its parent Container as well as remove
+ * all current event listeners and internal references. Do not use a DisplayObject
+ * after calling `destroy()`.
+ *
+ */
+ DisplayObject.prototype.destroy = function (_options) {
+ if (this.parent) {
+ this.parent.removeChild(this);
+ }
+ this.removeAllListeners();
+ this.transform = null;
+ this.parent = null;
+ this._bounds = null;
+ this._mask = null;
+ this.filters = null;
+ this.filterArea = null;
+ this.hitArea = null;
+ this.interactive = false;
+ this.interactiveChildren = false;
+ this._destroyed = true;
+ };
+ Object.defineProperty(DisplayObject.prototype, "_tempDisplayObjectParent", {
+ /**
+ * @protected
+ * @member {PIXI.Container}
+ */
+ get: function () {
+ if (this.tempDisplayObjectParent === null) {
+ // eslint-disable-next-line no-use-before-define
+ this.tempDisplayObjectParent = new TemporaryDisplayObject();
+ }
+ return this.tempDisplayObjectParent;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ /**
+ * Used in Renderer, cacheAsBitmap and other places where you call an `updateTransform` on root
+ *
+ * ```
+ * const cacheParent = elem.enableTempParent();
+ * elem.updateTransform();
+ * elem.disableTempParent(cacheParent);
+ * ```
+ *
+ * @returns {PIXI.DisplayObject} current parent
+ */
+ DisplayObject.prototype.enableTempParent = function () {
+ var myParent = this.parent;
+ this.parent = this._tempDisplayObjectParent;
+ return myParent;
+ };
+ /**
+ * Pair method for `enableTempParent`
+ * @param {PIXI.DisplayObject} cacheParent actual parent of element
+ */
+ DisplayObject.prototype.disableTempParent = function (cacheParent) {
+ this.parent = cacheParent;
+ };
+ Object.defineProperty(DisplayObject.prototype, "x", {
+ /**
+ * The position of the displayObject on the x axis relative to the local coordinates of the parent.
+ * An alias to position.x
+ *
+ * @member {number}
+ */
+ get: function () {
+ return this.position.x;
+ },
+ set: function (value) {
+ this.transform.position.x = value;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(DisplayObject.prototype, "y", {
+ /**
+ * The position of the displayObject on the y axis relative to the local coordinates of the parent.
+ * An alias to position.y
+ *
+ * @member {number}
+ */
+ get: function () {
+ return this.position.y;
+ },
+ set: function (value) {
+ this.transform.position.y = value;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(DisplayObject.prototype, "worldTransform", {
+ /**
+ * Current transform of the object based on world (parent) factors.
+ *
+ * @member {PIXI.Matrix}
+ * @readonly
+ */
+ get: function () {
+ return this.transform.worldTransform;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(DisplayObject.prototype, "localTransform", {
+ /**
+ * Current transform of the object based on local factors: position, scale, other stuff.
+ *
+ * @member {PIXI.Matrix}
+ * @readonly
+ */
+ get: function () {
+ return this.transform.localTransform;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(DisplayObject.prototype, "position", {
+ /**
+ * The coordinate of the object relative to the local coordinates of the parent.
+ * Assignment by value since pixi-v4.
+ *
+ * @member {PIXI.ObservablePoint}
+ */
+ get: function () {
+ return this.transform.position;
+ },
+ set: function (value) {
+ this.transform.position.copyFrom(value);
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(DisplayObject.prototype, "scale", {
+ /**
+ * The scale factor of the object.
+ * Assignment by value since pixi-v4.
+ *
+ * @member {PIXI.ObservablePoint}
+ */
+ get: function () {
+ return this.transform.scale;
+ },
+ set: function (value) {
+ this.transform.scale.copyFrom(value);
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(DisplayObject.prototype, "pivot", {
+ /**
+ * The pivot point of the displayObject that it rotates around.
+ * Assignment by value since pixi-v4.
+ *
+ * @member {PIXI.ObservablePoint}
+ */
+ get: function () {
+ return this.transform.pivot;
+ },
+ set: function (value) {
+ this.transform.pivot.copyFrom(value);
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(DisplayObject.prototype, "skew", {
+ /**
+ * The skew factor for the object in radians.
+ * Assignment by value since pixi-v4.
+ *
+ * @member {PIXI.ObservablePoint}
+ */
+ get: function () {
+ return this.transform.skew;
+ },
+ set: function (value) {
+ this.transform.skew.copyFrom(value);
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(DisplayObject.prototype, "rotation", {
+ /**
+ * The rotation of the object in radians.
+ * 'rotation' and 'angle' have the same effect on a display object; rotation is in radians, angle is in degrees.
+ *
+ * @member {number}
+ */
+ get: function () {
+ return this.transform.rotation;
+ },
+ set: function (value) {
+ this.transform.rotation = value;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(DisplayObject.prototype, "angle", {
+ /**
+ * The angle of the object in degrees.
+ * 'rotation' and 'angle' have the same effect on a display object; rotation is in radians, angle is in degrees.
+ *
+ * @member {number}
+ */
+ get: function () {
+ return this.transform.rotation * RAD_TO_DEG;
+ },
+ set: function (value) {
+ this.transform.rotation = value * DEG_TO_RAD;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(DisplayObject.prototype, "zIndex", {
+ /**
+ * The zIndex of the displayObject.
+ * If a container has the sortableChildren property set to true, children will be automatically
+ * sorted by zIndex value; a higher value will mean it will be moved towards the end of the array,
+ * and thus rendered on top of other displayObjects within the same container.
+ *
+ * @member {number}
+ */
+ get: function () {
+ return this._zIndex;
+ },
+ set: function (value) {
+ this._zIndex = value;
+ if (this.parent) {
+ this.parent.sortDirty = true;
+ }
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(DisplayObject.prototype, "worldVisible", {
+ /**
+ * Indicates if the object is globally visible.
+ *
+ * @member {boolean}
+ * @readonly
+ */
+ get: function () {
+ var item = this;
+ do {
+ if (!item.visible) {
+ return false;
+ }
+ item = item.parent;
+ } while (item);
+ return true;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(DisplayObject.prototype, "mask", {
+ /**
+ * Sets a mask for the displayObject. A mask is an object that limits the visibility of an
+ * object to the shape of the mask applied to it. In PixiJS a regular mask must be a
+ * {@link PIXI.Graphics} or a {@link PIXI.Sprite} object. This allows for much faster masking in canvas as it
+ * utilities shape clipping. To remove a mask, set this property to `null`.
+ *
+ * For sprite mask both alpha and red channel are used. Black mask is the same as transparent mask.
+ * @example
+ * const graphics = new PIXI.Graphics();
+ * graphics.beginFill(0xFF3300);
+ * graphics.drawRect(50, 250, 100, 100);
+ * graphics.endFill();
+ *
+ * const sprite = new PIXI.Sprite(texture);
+ * sprite.mask = graphics;
+ * @todo At the moment, PIXI.CanvasRenderer doesn't support PIXI.Sprite as mask.
+ *
+ * @member {PIXI.Container|PIXI.MaskData|null}
+ */
+ get: function () {
+ return this._mask;
+ },
+ set: function (value) {
+ if (this._mask) {
+ var maskObject = (this._mask.maskObject || this._mask);
+ maskObject.renderable = true;
+ maskObject.isMask = false;
+ }
+ this._mask = value;
+ if (this._mask) {
+ var maskObject = (this._mask.maskObject || this._mask);
+ maskObject.renderable = false;
+ maskObject.isMask = true;
+ }
+ },
+ enumerable: false,
+ configurable: true
+ });
+ return DisplayObject;
+ }(eventemitter3));
+ var TemporaryDisplayObject = /** @class */ (function (_super) {
+ __extends(TemporaryDisplayObject, _super);
+ function TemporaryDisplayObject() {
+ var _this = _super !== null && _super.apply(this, arguments) || this;
+ _this.sortDirty = null;
+ return _this;
+ }
+ return TemporaryDisplayObject;
+ }(DisplayObject));
+ /**
+ * DisplayObject default updateTransform, does not update children of container.
+ * Will crash if there's no parent element.
+ *
+ * @memberof PIXI.DisplayObject#
+ * @function displayObjectUpdateTransform
+ */
+ DisplayObject.prototype.displayObjectUpdateTransform = DisplayObject.prototype.updateTransform;
+
+ function sortChildren(a, b) {
+ if (a.zIndex === b.zIndex) {
+ return a._lastSortedIndex - b._lastSortedIndex;
+ }
+ return a.zIndex - b.zIndex;
+ }
+ /**
+ * A Container represents a collection of display objects.
+ *
+ * It is the base class of all display objects that act as a container for other objects (like Sprites).
+ *
+ *```js
+ * let container = new PIXI.Container();
+ * container.addChild(sprite);
+ * ```
+ *
+ * @class
+ * @extends PIXI.DisplayObject
+ * @memberof PIXI
+ */
+ var Container = /** @class */ (function (_super) {
+ __extends(Container, _super);
+ function Container() {
+ var _this = _super.call(this) || this;
+ /**
+ * The array of children of this container.
+ *
+ * @member {PIXI.DisplayObject[]}
+ * @readonly
+ */
+ _this.children = [];
+ /**
+ * If set to true, the container will sort its children by zIndex value
+ * when updateTransform() is called, or manually if sortChildren() is called.
+ *
+ * This actually changes the order of elements in the array, so should be treated
+ * as a basic solution that is not performant compared to other solutions,
+ * such as @link https://github.com/pixijs/pixi-display
+ *
+ * Also be aware of that this may not work nicely with the addChildAt() function,
+ * as the zIndex sorting may cause the child to automatically sorted to another position.
+ *
+ * @see PIXI.settings.SORTABLE_CHILDREN
+ *
+ * @member {boolean}
+ */
+ _this.sortableChildren = settings.SORTABLE_CHILDREN;
+ /**
+ * Should children be sorted by zIndex at the next updateTransform call.
+ * Will get automatically set to true if a new child is added, or if a child's zIndex changes.
+ *
+ * @member {boolean}
+ */
+ _this.sortDirty = false;
+ return _this;
+ /**
+ * Fired when a DisplayObject is added to this Container.
+ *
+ * @event PIXI.Container#childAdded
+ * @param {PIXI.DisplayObject} child - The child added to the Container.
+ * @param {PIXI.Container} container - The container that added the child.
+ * @param {number} index - The children's index of the added child.
+ */
+ /**
+ * Fired when a DisplayObject is removed from this Container.
+ *
+ * @event PIXI.DisplayObject#removedFrom
+ * @param {PIXI.DisplayObject} child - The child removed from the Container.
+ * @param {PIXI.Container} container - The container that removed removed the child.
+ * @param {number} index - The former children's index of the removed child
+ */
+ }
+ /**
+ * Overridable method that can be used by Container subclasses whenever the children array is modified
+ *
+ * @protected
+ */
+ Container.prototype.onChildrenChange = function (_length) {
+ /* empty */
+ };
+ /**
+ * Adds one or more children to the container.
+ *
+ * Multiple items can be added like so: `myContainer.addChild(thingOne, thingTwo, thingThree)`
+ *
+ * @param {...PIXI.DisplayObject} children - The DisplayObject(s) to add to the container
+ * @return {PIXI.DisplayObject} The first child that was added.
+ */
+ Container.prototype.addChild = function () {
+ var arguments$1 = arguments;
+
+ var children = [];
+ for (var _i = 0; _i < arguments.length; _i++) {
+ children[_i] = arguments$1[_i];
+ }
+ // if there is only one argument we can bypass looping through the them
+ if (children.length > 1) {
+ // loop through the array and add all children
+ for (var i = 0; i < children.length; i++) {
+ // eslint-disable-next-line prefer-rest-params
+ this.addChild(children[i]);
+ }
+ }
+ else {
+ var child = children[0];
+ // if the child has a parent then lets remove it as PixiJS objects can only exist in one place
+ if (child.parent) {
+ child.parent.removeChild(child);
+ }
+ child.parent = this;
+ this.sortDirty = true;
+ // ensure child transform will be recalculated
+ child.transform._parentID = -1;
+ this.children.push(child);
+ // ensure bounds will be recalculated
+ this._boundsID++;
+ // TODO - lets either do all callbacks or all events.. not both!
+ this.onChildrenChange(this.children.length - 1);
+ this.emit('childAdded', child, this, this.children.length - 1);
+ child.emit('added', this);
+ }
+ return children[0];
+ };
+ /**
+ * Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown
+ *
+ * @param {PIXI.DisplayObject} child - The child to add
+ * @param {number} index - The index to place the child in
+ * @return {PIXI.DisplayObject} The child that was added.
+ */
+ Container.prototype.addChildAt = function (child, index) {
+ if (index < 0 || index > this.children.length) {
+ throw new Error(child + "addChildAt: The index " + index + " supplied is out of bounds " + this.children.length);
+ }
+ if (child.parent) {
+ child.parent.removeChild(child);
+ }
+ child.parent = this;
+ this.sortDirty = true;
+ // ensure child transform will be recalculated
+ child.transform._parentID = -1;
+ this.children.splice(index, 0, child);
+ // ensure bounds will be recalculated
+ this._boundsID++;
+ // TODO - lets either do all callbacks or all events.. not both!
+ this.onChildrenChange(index);
+ child.emit('added', this);
+ this.emit('childAdded', child, this, index);
+ return child;
+ };
+ /**
+ * Swaps the position of 2 Display Objects within this container.
+ *
+ * @param {PIXI.DisplayObject} child - First display object to swap
+ * @param {PIXI.DisplayObject} child2 - Second display object to swap
+ */
+ Container.prototype.swapChildren = function (child, child2) {
+ if (child === child2) {
+ return;
+ }
+ var index1 = this.getChildIndex(child);
+ var index2 = this.getChildIndex(child2);
+ this.children[index1] = child2;
+ this.children[index2] = child;
+ this.onChildrenChange(index1 < index2 ? index1 : index2);
+ };
+ /**
+ * Returns the index position of a child DisplayObject instance
+ *
+ * @param {PIXI.DisplayObject} child - The DisplayObject instance to identify
+ * @return {number} The index position of the child display object to identify
+ */
+ Container.prototype.getChildIndex = function (child) {
+ var index = this.children.indexOf(child);
+ if (index === -1) {
+ throw new Error('The supplied DisplayObject must be a child of the caller');
+ }
+ return index;
+ };
+ /**
+ * Changes the position of an existing child in the display object container
+ *
+ * @param {PIXI.DisplayObject} child - The child DisplayObject instance for which you want to change the index number
+ * @param {number} index - The resulting index number for the child display object
+ */
+ Container.prototype.setChildIndex = function (child, index) {
+ if (index < 0 || index >= this.children.length) {
+ throw new Error("The index " + index + " supplied is out of bounds " + this.children.length);
+ }
+ var currentIndex = this.getChildIndex(child);
+ removeItems(this.children, currentIndex, 1); // remove from old position
+ this.children.splice(index, 0, child); // add at new position
+ this.onChildrenChange(index);
+ };
+ /**
+ * Returns the child at the specified index
+ *
+ * @param {number} index - The index to get the child at
+ * @return {PIXI.DisplayObject} The child at the given index, if any.
+ */
+ Container.prototype.getChildAt = function (index) {
+ if (index < 0 || index >= this.children.length) {
+ throw new Error("getChildAt: Index (" + index + ") does not exist.");
+ }
+ return this.children[index];
+ };
+ /**
+ * Removes one or more children from the container.
+ *
+ * @param {...PIXI.DisplayObject} children - The DisplayObject(s) to remove
+ * @return {PIXI.DisplayObject} The first child that was removed.
+ */
+ Container.prototype.removeChild = function () {
+ var arguments$1 = arguments;
+
+ var children = [];
+ for (var _i = 0; _i < arguments.length; _i++) {
+ children[_i] = arguments$1[_i];
+ }
+ // if there is only one argument we can bypass looping through the them
+ if (children.length > 1) {
+ // loop through the arguments property and remove all children
+ for (var i = 0; i < children.length; i++) {
+ this.removeChild(children[i]);
+ }
+ }
+ else {
+ var child = children[0];
+ var index = this.children.indexOf(child);
+ if (index === -1)
+ { return null; }
+ child.parent = null;
+ // ensure child transform will be recalculated
+ child.transform._parentID = -1;
+ removeItems(this.children, index, 1);
+ // ensure bounds will be recalculated
+ this._boundsID++;
+ // TODO - lets either do all callbacks or all events.. not both!
+ this.onChildrenChange(index);
+ child.emit('removed', this);
+ this.emit('childRemoved', child, this, index);
+ }
+ return children[0];
+ };
+ /**
+ * Removes a child from the specified index position.
+ *
+ * @param {number} index - The index to get the child from
+ * @return {PIXI.DisplayObject} The child that was removed.
+ */
+ Container.prototype.removeChildAt = function (index) {
+ var child = this.getChildAt(index);
+ // ensure child transform will be recalculated..
+ child.parent = null;
+ child.transform._parentID = -1;
+ removeItems(this.children, index, 1);
+ // ensure bounds will be recalculated
+ this._boundsID++;
+ // TODO - lets either do all callbacks or all events.. not both!
+ this.onChildrenChange(index);
+ child.emit('removed', this);
+ this.emit('childRemoved', child, this, index);
+ return child;
+ };
+ /**
+ * Removes all children from this container that are within the begin and end indexes.
+ *
+ * @param {number} [beginIndex=0] - The beginning position.
+ * @param {number} [endIndex=this.children.length] - The ending position. Default value is size of the container.
+ * @returns {PIXI.DisplayObject[]} List of removed children
+ */
+ Container.prototype.removeChildren = function (beginIndex, endIndex) {
+ if (beginIndex === void 0) { beginIndex = 0; }
+ if (endIndex === void 0) { endIndex = this.children.length; }
+ var begin = beginIndex;
+ var end = endIndex;
+ var range = end - begin;
+ var removed;
+ if (range > 0 && range <= end) {
+ removed = this.children.splice(begin, range);
+ for (var i = 0; i < removed.length; ++i) {
+ removed[i].parent = null;
+ if (removed[i].transform) {
+ removed[i].transform._parentID = -1;
+ }
+ }
+ this._boundsID++;
+ this.onChildrenChange(beginIndex);
+ for (var i = 0; i < removed.length; ++i) {
+ removed[i].emit('removed', this);
+ this.emit('childRemoved', removed[i], this, i);
+ }
+ return removed;
+ }
+ else if (range === 0 && this.children.length === 0) {
+ return [];
+ }
+ throw new RangeError('removeChildren: numeric values are outside the acceptable range.');
+ };
+ /**
+ * Sorts children by zIndex. Previous order is mantained for 2 children with the same zIndex.
+ */
+ Container.prototype.sortChildren = function () {
+ var sortRequired = false;
+ for (var i = 0, j = this.children.length; i < j; ++i) {
+ var child = this.children[i];
+ child._lastSortedIndex = i;
+ if (!sortRequired && child.zIndex !== 0) {
+ sortRequired = true;
+ }
+ }
+ if (sortRequired && this.children.length > 1) {
+ this.children.sort(sortChildren);
+ }
+ this.sortDirty = false;
+ };
+ /**
+ * Updates the transform on all children of this container for rendering
+ */
+ Container.prototype.updateTransform = function () {
+ if (this.sortableChildren && this.sortDirty) {
+ this.sortChildren();
+ }
+ this._boundsID++;
+ this.transform.updateTransform(this.parent.transform);
+ // TODO: check render flags, how to process stuff here
+ this.worldAlpha = this.alpha * this.parent.worldAlpha;
+ for (var i = 0, j = this.children.length; i < j; ++i) {
+ var child = this.children[i];
+ if (child.visible) {
+ child.updateTransform();
+ }
+ }
+ };
+ /**
+ * Recalculates the bounds of the container.
+ *
+ */
+ Container.prototype.calculateBounds = function () {
+ this._bounds.clear();
+ this._calculateBounds();
+ for (var i = 0; i < this.children.length; i++) {
+ var child = this.children[i];
+ if (!child.visible || !child.renderable) {
+ continue;
+ }
+ child.calculateBounds();
+ // TODO: filter+mask, need to mask both somehow
+ if (child._mask) {
+ var maskObject = (child._mask.maskObject || child._mask);
+ maskObject.calculateBounds();
+ this._bounds.addBoundsMask(child._bounds, maskObject._bounds);
+ }
+ else if (child.filterArea) {
+ this._bounds.addBoundsArea(child._bounds, child.filterArea);
+ }
+ else {
+ this._bounds.addBounds(child._bounds);
+ }
+ }
+ this._bounds.updateID = this._boundsID;
+ };
+ /**
+ * Retrieves the local bounds of the displayObject as a rectangle object.
+ *
+ * @param {PIXI.Rectangle} [rect] - Optional rectangle to store the result of the bounds calculation.
+ * @param {boolean} [skipChildrenUpdate=false] - Setting to `true` will stop re-calculation of children transforms,
+ * it was default behaviour of pixi 4.0-5.2 and caused many problems to users.
+ * @return {PIXI.Rectangle} The rectangular bounding area.
+ */
+ Container.prototype.getLocalBounds = function (rect, skipChildrenUpdate) {
+ if (skipChildrenUpdate === void 0) { skipChildrenUpdate = false; }
+ var result = _super.prototype.getLocalBounds.call(this, rect);
+ if (!skipChildrenUpdate) {
+ for (var i = 0, j = this.children.length; i < j; ++i) {
+ var child = this.children[i];
+ if (child.visible) {
+ child.updateTransform();
+ }
+ }
+ }
+ return result;
+ };
+ /**
+ * Recalculates the bounds of the object. Override this to
+ * calculate the bounds of the specific object (not including children).
+ *
+ * @protected
+ */
+ Container.prototype._calculateBounds = function () {
+ // FILL IN//
+ };
+ /**
+ * Renders the object using the WebGL renderer
+ *
+ * @param {PIXI.Renderer} renderer - The renderer
+ */
+ Container.prototype.render = function (renderer) {
+ // if the object is not visible or the alpha is 0 then no need to render this element
+ if (!this.visible || this.worldAlpha <= 0 || !this.renderable) {
+ return;
+ }
+ // do a quick check to see if this element has a mask or a filter.
+ if (this._mask || (this.filters && this.filters.length)) {
+ this.renderAdvanced(renderer);
+ }
+ else {
+ this._render(renderer);
+ // simple render children!
+ for (var i = 0, j = this.children.length; i < j; ++i) {
+ this.children[i].render(renderer);
+ }
+ }
+ };
+ /**
+ * Render the object using the WebGL renderer and advanced features.
+ *
+ * @protected
+ * @param {PIXI.Renderer} renderer - The renderer
+ */
+ Container.prototype.renderAdvanced = function (renderer) {
+ renderer.batch.flush();
+ var filters = this.filters;
+ var mask = this._mask;
+ // push filter first as we need to ensure the stencil buffer is correct for any masking
+ if (filters) {
+ if (!this._enabledFilters) {
+ this._enabledFilters = [];
+ }
+ this._enabledFilters.length = 0;
+ for (var i = 0; i < filters.length; i++) {
+ if (filters[i].enabled) {
+ this._enabledFilters.push(filters[i]);
+ }
+ }
+ if (this._enabledFilters.length) {
+ renderer.filter.push(this, this._enabledFilters);
+ }
+ }
+ if (mask) {
+ renderer.mask.push(this, this._mask);
+ }
+ // add this object to the batch, only rendered if it has a texture.
+ this._render(renderer);
+ // now loop through the children and make sure they get rendered
+ for (var i = 0, j = this.children.length; i < j; i++) {
+ this.children[i].render(renderer);
+ }
+ renderer.batch.flush();
+ if (mask) {
+ renderer.mask.pop(this);
+ }
+ if (filters && this._enabledFilters && this._enabledFilters.length) {
+ renderer.filter.pop();
+ }
+ };
+ /**
+ * To be overridden by the subclasses.
+ *
+ * @protected
+ * @param {PIXI.Renderer} renderer - The renderer
+ */
+ Container.prototype._render = function (_renderer) {
+ // this is where content itself gets rendered...
+ };
+ /**
+ * Removes all internal references and listeners as well as removes children from the display list.
+ * Do not use a Container after calling `destroy`.
+ *
+ * @param {object|boolean} [options] - Options parameter. A boolean will act as if all options
+ * have been set to that value
+ * @param {boolean} [options.children=false] - if set to true, all the children will have their destroy
+ * method called as well. 'options' will be passed on to those calls.
+ * @param {boolean} [options.texture=false] - Only used for child Sprites if options.children is set to true
+ * Should it destroy the texture of the child sprite
+ * @param {boolean} [options.baseTexture=false] - Only used for child Sprites if options.children is set to true
+ * Should it destroy the base texture of the child sprite
+ */
+ Container.prototype.destroy = function (options) {
+ _super.prototype.destroy.call(this);
+ this.sortDirty = false;
+ var destroyChildren = typeof options === 'boolean' ? options : options && options.children;
+ var oldChildren = this.removeChildren(0, this.children.length);
+ if (destroyChildren) {
+ for (var i = 0; i < oldChildren.length; ++i) {
+ oldChildren[i].destroy(options);
+ }
+ }
+ };
+ Object.defineProperty(Container.prototype, "width", {
+ /**
+ * The width of the Container, setting this will actually modify the scale to achieve the value set
+ *
+ * @member {number}
+ */
+ get: function () {
+ return this.scale.x * this.getLocalBounds().width;
+ },
+ set: function (value) {
+ var width = this.getLocalBounds().width;
+ if (width !== 0) {
+ this.scale.x = value / width;
+ }
+ else {
+ this.scale.x = 1;
+ }
+ this._width = value;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(Container.prototype, "height", {
+ /**
+ * The height of the Container, setting this will actually modify the scale to achieve the value set
+ *
+ * @member {number}
+ */
+ get: function () {
+ return this.scale.y * this.getLocalBounds().height;
+ },
+ set: function (value) {
+ var height = this.getLocalBounds().height;
+ if (height !== 0) {
+ this.scale.y = value / height;
+ }
+ else {
+ this.scale.y = 1;
+ }
+ this._height = value;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ return Container;
+ }(DisplayObject));
+ /**
+ * Container default updateTransform, does update children of container.
+ * Will crash if there's no parent element.
+ *
+ * @memberof PIXI.Container#
+ * @function containerUpdateTransform
+ */
+ Container.prototype.containerUpdateTransform = Container.prototype.updateTransform;
+
+ /*!
+ * @pixi/accessibility - v5.3.12
+ * Compiled Wed, 23 Mar 2022 18:38:07 UTC
+ *
+ * @pixi/accessibility is licensed under the MIT License.
+ * http://www.opensource.org/licenses/mit-license
+ */
+
+ /**
+ * Default property values of accessible objects
+ * used by {@link PIXI.AccessibilityManager}.
+ *
+ * @private
+ * @function accessibleTarget
+ * @memberof PIXI
+ * @type {Object}
+ * @example
+ * function MyObject() {}
+ *
+ * Object.assign(
+ * MyObject.prototype,
+ * PIXI.accessibleTarget
+ * );
+ */
+ var accessibleTarget = {
+ /**
+ * Flag for if the object is accessible. If true AccessibilityManager will overlay a
+ * shadow div with attributes set
+ *
+ * @member {boolean}
+ * @memberof PIXI.DisplayObject#
+ */
+ accessible: false,
+ /**
+ * Sets the title attribute of the shadow div
+ * If accessibleTitle AND accessibleHint has not been this will default to 'displayObject [tabIndex]'
+ *
+ * @member {?string}
+ * @memberof PIXI.DisplayObject#
+ */
+ accessibleTitle: null,
+ /**
+ * Sets the aria-label attribute of the shadow div
+ *
+ * @member {string}
+ * @memberof PIXI.DisplayObject#
+ */
+ accessibleHint: null,
+ /**
+ * @member {number}
+ * @memberof PIXI.DisplayObject#
+ * @private
+ * @todo Needs docs.
+ */
+ tabIndex: 0,
+ /**
+ * @member {boolean}
+ * @memberof PIXI.DisplayObject#
+ * @todo Needs docs.
+ */
+ _accessibleActive: false,
+ /**
+ * @member {boolean}
+ * @memberof PIXI.DisplayObject#
+ * @todo Needs docs.
+ */
+ _accessibleDiv: null,
+ /**
+ * Specify the type of div the accessible layer is. Screen readers treat the element differently
+ * depending on this type. Defaults to button.
+ *
+ * @member {string}
+ * @memberof PIXI.DisplayObject#
+ * @default 'button'
+ */
+ accessibleType: 'button',
+ /**
+ * Specify the pointer-events the accessible div will use
+ * Defaults to auto.
+ *
+ * @member {string}
+ * @memberof PIXI.DisplayObject#
+ * @default 'auto'
+ */
+ accessiblePointerEvents: 'auto',
+ /**
+ * Setting to false will prevent any children inside this container to
+ * be accessible. Defaults to true.
+ *
+ * @member {boolean}
+ * @memberof PIXI.DisplayObject#
+ * @default true
+ */
+ accessibleChildren: true,
+ renderId: -1,
+ };
+
+ // add some extra variables to the container..
+ DisplayObject.mixin(accessibleTarget);
+ var KEY_CODE_TAB = 9;
+ var DIV_TOUCH_SIZE = 100;
+ var DIV_TOUCH_POS_X = 0;
+ var DIV_TOUCH_POS_Y = 0;
+ var DIV_TOUCH_ZINDEX = 2;
+ var DIV_HOOK_SIZE = 1;
+ var DIV_HOOK_POS_X = -1000;
+ var DIV_HOOK_POS_Y = -1000;
+ var DIV_HOOK_ZINDEX = 2;
+ /**
+ * The Accessibility manager recreates the ability to tab and have content read by screen readers.
+ * This is very important as it can possibly help people with disabilities access PixiJS content.
+ *
+ * A DisplayObject can be made accessible just like it can be made interactive. This manager will map the
+ * events as if the mouse was being used, minimizing the effort required to implement.
+ *
+ * An instance of this class is automatically created by default, and can be found at `renderer.plugins.accessibility`
+ *
+ * @class
+ * @memberof PIXI
+ */
+ var AccessibilityManager = /** @class */ (function () {
+ /**
+ * @param {PIXI.CanvasRenderer|PIXI.Renderer} renderer - A reference to the current renderer
+ */
+ function AccessibilityManager(renderer) {
+ /**
+ * @type {?HTMLElement}
+ * @private
+ */
+ this._hookDiv = null;
+ if (isMobile$1.tablet || isMobile$1.phone) {
+ this.createTouchHook();
+ }
+ // first we create a div that will sit over the PixiJS element. This is where the div overlays will go.
+ var div = document.createElement('div');
+ div.style.width = DIV_TOUCH_SIZE + "px";
+ div.style.height = DIV_TOUCH_SIZE + "px";
+ div.style.position = 'absolute';
+ div.style.top = DIV_TOUCH_POS_X + "px";
+ div.style.left = DIV_TOUCH_POS_Y + "px";
+ div.style.zIndex = DIV_TOUCH_ZINDEX.toString();
+ /**
+ * This is the dom element that will sit over the PixiJS element. This is where the div overlays will go.
+ *
+ * @type {HTMLElement}
+ * @private
+ */
+ this.div = div;
+ /**
+ * A simple pool for storing divs.
+ *
+ * @type {*}
+ * @private
+ */
+ this.pool = [];
+ /**
+ * This is a tick used to check if an object is no longer being rendered.
+ *
+ * @type {Number}
+ * @private
+ */
+ this.renderId = 0;
+ /**
+ * Setting this to true will visually show the divs.
+ *
+ * @type {boolean}
+ */
+ this.debug = false;
+ /**
+ * The renderer this accessibility manager works for.
+ *
+ * @member {PIXI.AbstractRenderer}
+ */
+ this.renderer = renderer;
+ /**
+ * The array of currently active accessible items.
+ *
+ * @member {Array<*>}
+ * @private
+ */
+ this.children = [];
+ /**
+ * pre-bind the functions
+ *
+ * @type {Function}
+ * @private
+ */
+ this._onKeyDown = this._onKeyDown.bind(this);
+ /**
+ * pre-bind the functions
+ *
+ * @type {Function}
+ * @private
+ */
+ this._onMouseMove = this._onMouseMove.bind(this);
+ this._isActive = false;
+ this._isMobileAccessibility = false;
+ /**
+ * count to throttle div updates on android devices
+ * @type number
+ * @private
+ */
+ this.androidUpdateCount = 0;
+ /**
+ * the frequency to update the div elements ()
+ * @private
+ */
+ this.androidUpdateFrequency = 500; // 2fps
+ // let listen for tab.. once pressed we can fire up and show the accessibility layer
+ window.addEventListener('keydown', this._onKeyDown, false);
+ }
+ Object.defineProperty(AccessibilityManager.prototype, "isActive", {
+ /**
+ * A flag
+ * @member {boolean}
+ * @readonly
+ */
+ get: function () {
+ return this._isActive;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(AccessibilityManager.prototype, "isMobileAccessibility", {
+ /**
+ * A flag
+ * @member {boolean}
+ * @readonly
+ */
+ get: function () {
+ return this._isMobileAccessibility;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ /**
+ * Creates the touch hooks.
+ *
+ * @private
+ */
+ AccessibilityManager.prototype.createTouchHook = function () {
+ var _this = this;
+ var hookDiv = document.createElement('button');
+ hookDiv.style.width = DIV_HOOK_SIZE + "px";
+ hookDiv.style.height = DIV_HOOK_SIZE + "px";
+ hookDiv.style.position = 'absolute';
+ hookDiv.style.top = DIV_HOOK_POS_X + "px";
+ hookDiv.style.left = DIV_HOOK_POS_Y + "px";
+ hookDiv.style.zIndex = DIV_HOOK_ZINDEX.toString();
+ hookDiv.style.backgroundColor = '#FF0000';
+ hookDiv.title = 'select to enable accessability for this content';
+ hookDiv.addEventListener('focus', function () {
+ _this._isMobileAccessibility = true;
+ _this.activate();
+ _this.destroyTouchHook();
+ });
+ document.body.appendChild(hookDiv);
+ this._hookDiv = hookDiv;
+ };
+ /**
+ * Destroys the touch hooks.
+ *
+ * @private
+ */
+ AccessibilityManager.prototype.destroyTouchHook = function () {
+ if (!this._hookDiv) {
+ return;
+ }
+ document.body.removeChild(this._hookDiv);
+ this._hookDiv = null;
+ };
+ /**
+ * Activating will cause the Accessibility layer to be shown.
+ * This is called when a user presses the tab key.
+ *
+ * @private
+ */
+ AccessibilityManager.prototype.activate = function () {
+ if (this._isActive) {
+ return;
+ }
+ this._isActive = true;
+ window.document.addEventListener('mousemove', this._onMouseMove, true);
+ window.removeEventListener('keydown', this._onKeyDown, false);
+ // TODO: Remove casting when CanvasRenderer is converted
+ this.renderer.on('postrender', this.update, this);
+ if (this.renderer.view.parentNode) {
+ this.renderer.view.parentNode.appendChild(this.div);
+ }
+ };
+ /**
+ * Deactivating will cause the Accessibility layer to be hidden.
+ * This is called when a user moves the mouse.
+ *
+ * @private
+ */
+ AccessibilityManager.prototype.deactivate = function () {
+ if (!this._isActive || this._isMobileAccessibility) {
+ return;
+ }
+ this._isActive = false;
+ window.document.removeEventListener('mousemove', this._onMouseMove, true);
+ window.addEventListener('keydown', this._onKeyDown, false);
+ // TODO: Remove casting when CanvasRenderer is converted
+ this.renderer.off('postrender', this.update);
+ if (this.div.parentNode) {
+ this.div.parentNode.removeChild(this.div);
+ }
+ };
+ /**
+ * This recursive function will run through the scene graph and add any new accessible objects to the DOM layer.
+ *
+ * @private
+ * @param {PIXI.Container} displayObject - The DisplayObject to check.
+ */
+ AccessibilityManager.prototype.updateAccessibleObjects = function (displayObject) {
+ if (!displayObject.visible || !displayObject.accessibleChildren) {
+ return;
+ }
+ if (displayObject.accessible && displayObject.interactive) {
+ if (!displayObject._accessibleActive) {
+ this.addChild(displayObject);
+ }
+ displayObject.renderId = this.renderId;
+ }
+ var children = displayObject.children;
+ for (var i = 0; i < children.length; i++) {
+ this.updateAccessibleObjects(children[i]);
+ }
+ };
+ /**
+ * Before each render this function will ensure that all divs are mapped correctly to their DisplayObjects.
+ *
+ * @private
+ */
+ AccessibilityManager.prototype.update = function () {
+ /* On Android default web browser, tab order seems to be calculated by position rather than tabIndex,
+ * moving buttons can cause focus to flicker between two buttons making it hard/impossible to navigate,
+ * so I am just running update every half a second, seems to fix it.
+ */
+ var now = performance.now();
+ if (isMobile$1.android.device && now < this.androidUpdateCount) {
+ return;
+ }
+ this.androidUpdateCount = now + this.androidUpdateFrequency;
+ if (!this.renderer.renderingToScreen) {
+ return;
+ }
+ // update children...
+ if (this.renderer._lastObjectRendered) {
+ this.updateAccessibleObjects(this.renderer._lastObjectRendered);
+ }
+ // TODO: Remove casting when CanvasRenderer is converted
+ var rect = this.renderer.view.getBoundingClientRect();
+ var resolution = this.renderer.resolution;
+ var sx = (rect.width / this.renderer.width) * resolution;
+ var sy = (rect.height / this.renderer.height) * resolution;
+ var div = this.div;
+ div.style.left = rect.left + "px";
+ div.style.top = rect.top + "px";
+ div.style.width = this.renderer.width + "px";
+ div.style.height = this.renderer.height + "px";
+ for (var i = 0; i < this.children.length; i++) {
+ var child = this.children[i];
+ if (child.renderId !== this.renderId) {
+ child._accessibleActive = false;
+ removeItems(this.children, i, 1);
+ this.div.removeChild(child._accessibleDiv);
+ this.pool.push(child._accessibleDiv);
+ child._accessibleDiv = null;
+ i--;
+ }
+ else {
+ // map div to display..
+ div = child._accessibleDiv;
+ var hitArea = child.hitArea;
+ var wt = child.worldTransform;
+ if (child.hitArea) {
+ div.style.left = (wt.tx + (hitArea.x * wt.a)) * sx + "px";
+ div.style.top = (wt.ty + (hitArea.y * wt.d)) * sy + "px";
+ div.style.width = hitArea.width * wt.a * sx + "px";
+ div.style.height = hitArea.height * wt.d * sy + "px";
+ }
+ else {
+ hitArea = child.getBounds();
+ this.capHitArea(hitArea);
+ div.style.left = hitArea.x * sx + "px";
+ div.style.top = hitArea.y * sy + "px";
+ div.style.width = hitArea.width * sx + "px";
+ div.style.height = hitArea.height * sy + "px";
+ // update button titles and hints if they exist and they've changed
+ if (div.title !== child.accessibleTitle && child.accessibleTitle !== null) {
+ div.title = child.accessibleTitle;
+ }
+ if (div.getAttribute('aria-label') !== child.accessibleHint
+ && child.accessibleHint !== null) {
+ div.setAttribute('aria-label', child.accessibleHint);
+ }
+ }
+ // the title or index may have changed, if so lets update it!
+ if (child.accessibleTitle !== div.title || child.tabIndex !== div.tabIndex) {
+ div.title = child.accessibleTitle;
+ div.tabIndex = child.tabIndex;
+ if (this.debug)
+ { this.updateDebugHTML(div); }
+ }
+ }
+ }
+ // increment the render id..
+ this.renderId++;
+ };
+ /**
+ * private function that will visually add the information to the
+ * accessability div
+ *
+ * @param {HTMLElement} div
+ */
+ AccessibilityManager.prototype.updateDebugHTML = function (div) {
+ div.innerHTML = "type: " + div.type + " title : " + div.title + " tabIndex: " + div.tabIndex;
+ };
+ /**
+ * Adjust the hit area based on the bounds of a display object
+ *
+ * @param {PIXI.Rectangle} hitArea - Bounds of the child
+ */
+ AccessibilityManager.prototype.capHitArea = function (hitArea) {
+ if (hitArea.x < 0) {
+ hitArea.width += hitArea.x;
+ hitArea.x = 0;
+ }
+ if (hitArea.y < 0) {
+ hitArea.height += hitArea.y;
+ hitArea.y = 0;
+ }
+ // TODO: Remove casting when CanvasRenderer is converted
+ if (hitArea.x + hitArea.width > this.renderer.width) {
+ hitArea.width = this.renderer.width - hitArea.x;
+ }
+ if (hitArea.y + hitArea.height > this.renderer.height) {
+ hitArea.height = this.renderer.height - hitArea.y;
+ }
+ };
+ /**
+ * Adds a DisplayObject to the accessibility manager
+ *
+ * @private
+ * @param {PIXI.DisplayObject} displayObject - The child to make accessible.
+ */
+ AccessibilityManager.prototype.addChild = function (displayObject) {
+ // this.activate();
+ var div = this.pool.pop();
+ if (!div) {
+ div = document.createElement('button');
+ div.style.width = DIV_TOUCH_SIZE + "px";
+ div.style.height = DIV_TOUCH_SIZE + "px";
+ div.style.backgroundColor = this.debug ? 'rgba(255,255,255,0.5)' : 'transparent';
+ div.style.position = 'absolute';
+ div.style.zIndex = DIV_TOUCH_ZINDEX.toString();
+ div.style.borderStyle = 'none';
+ // ARIA attributes ensure that button title and hint updates are announced properly
+ if (navigator.userAgent.toLowerCase().indexOf('chrome') > -1) {
+ // Chrome doesn't need aria-live to work as intended; in fact it just gets more confused.
+ div.setAttribute('aria-live', 'off');
+ }
+ else {
+ div.setAttribute('aria-live', 'polite');
+ }
+ if (navigator.userAgent.match(/rv:.*Gecko\//)) {
+ // FireFox needs this to announce only the new button name
+ div.setAttribute('aria-relevant', 'additions');
+ }
+ else {
+ // required by IE, other browsers don't much care
+ div.setAttribute('aria-relevant', 'text');
+ }
+ div.addEventListener('click', this._onClick.bind(this));
+ div.addEventListener('focus', this._onFocus.bind(this));
+ div.addEventListener('focusout', this._onFocusOut.bind(this));
+ }
+ // set pointer events
+ div.style.pointerEvents = displayObject.accessiblePointerEvents;
+ // set the type, this defaults to button!
+ div.type = displayObject.accessibleType;
+ if (displayObject.accessibleTitle && displayObject.accessibleTitle !== null) {
+ div.title = displayObject.accessibleTitle;
+ }
+ else if (!displayObject.accessibleHint
+ || displayObject.accessibleHint === null) {
+ div.title = "displayObject " + displayObject.tabIndex;
+ }
+ if (displayObject.accessibleHint
+ && displayObject.accessibleHint !== null) {
+ div.setAttribute('aria-label', displayObject.accessibleHint);
+ }
+ if (this.debug)
+ { this.updateDebugHTML(div); }
+ displayObject._accessibleActive = true;
+ displayObject._accessibleDiv = div;
+ div.displayObject = displayObject;
+ this.children.push(displayObject);
+ this.div.appendChild(displayObject._accessibleDiv);
+ displayObject._accessibleDiv.tabIndex = displayObject.tabIndex;
+ };
+ /**
+ * Maps the div button press to pixi's InteractionManager (click)
+ *
+ * @private
+ * @param {MouseEvent} e - The click event.
+ */
+ AccessibilityManager.prototype._onClick = function (e) {
+ // TODO: Remove casting when CanvasRenderer is converted
+ var interactionManager = this.renderer.plugins.interaction;
+ interactionManager.dispatchEvent(e.target.displayObject, 'click', interactionManager.eventData);
+ interactionManager.dispatchEvent(e.target.displayObject, 'pointertap', interactionManager.eventData);
+ interactionManager.dispatchEvent(e.target.displayObject, 'tap', interactionManager.eventData);
+ };
+ /**
+ * Maps the div focus events to pixi's InteractionManager (mouseover)
+ *
+ * @private
+ * @param {FocusEvent} e - The focus event.
+ */
+ AccessibilityManager.prototype._onFocus = function (e) {
+ if (!e.target.getAttribute('aria-live')) {
+ e.target.setAttribute('aria-live', 'assertive');
+ }
+ // TODO: Remove casting when CanvasRenderer is converted
+ var interactionManager = this.renderer.plugins.interaction;
+ interactionManager.dispatchEvent(e.target.displayObject, 'mouseover', interactionManager.eventData);
+ };
+ /**
+ * Maps the div focus events to pixi's InteractionManager (mouseout)
+ *
+ * @private
+ * @param {FocusEvent} e - The focusout event.
+ */
+ AccessibilityManager.prototype._onFocusOut = function (e) {
+ if (!e.target.getAttribute('aria-live')) {
+ e.target.setAttribute('aria-live', 'polite');
+ }
+ // TODO: Remove casting when CanvasRenderer is converted
+ var interactionManager = this.renderer.plugins.interaction;
+ interactionManager.dispatchEvent(e.target.displayObject, 'mouseout', interactionManager.eventData);
+ };
+ /**
+ * Is called when a key is pressed
+ *
+ * @private
+ * @param {KeyboardEvent} e - The keydown event.
+ */
+ AccessibilityManager.prototype._onKeyDown = function (e) {
+ if (e.keyCode !== KEY_CODE_TAB) {
+ return;
+ }
+ this.activate();
+ };
+ /**
+ * Is called when the mouse moves across the renderer element
+ *
+ * @private
+ * @param {MouseEvent} e - The mouse event.
+ */
+ AccessibilityManager.prototype._onMouseMove = function (e) {
+ if (e.movementX === 0 && e.movementY === 0) {
+ return;
+ }
+ this.deactivate();
+ };
+ /**
+ * Destroys the accessibility manager
+ *
+ */
+ AccessibilityManager.prototype.destroy = function () {
+ this.destroyTouchHook();
+ this.div = null;
+ window.document.removeEventListener('mousemove', this._onMouseMove, true);
+ window.removeEventListener('keydown', this._onKeyDown);
+ this.pool = null;
+ this.children = null;
+ this.renderer = null;
+ };
+ return AccessibilityManager;
+ }());
+
+ /*!
+ * @pixi/ticker - v5.3.12
+ * Compiled Wed, 23 Mar 2022 18:38:07 UTC
+ *
+ * @pixi/ticker is licensed under the MIT License.
+ * http://www.opensource.org/licenses/mit-license
+ */
+
+ /**
+ * Target frames per millisecond.
+ *
+ * @static
+ * @name TARGET_FPMS
+ * @memberof PIXI.settings
+ * @type {number}
+ * @default 0.06
+ */
+ settings.TARGET_FPMS = 0.06;
+
+ /**
+ * Represents the update priorities used by internal PIXI classes when registered with
+ * the {@link PIXI.Ticker} object. Higher priority items are updated first and lower
+ * priority items, such as render, should go later.
+ *
+ * @static
+ * @constant
+ * @name UPDATE_PRIORITY
+ * @memberof PIXI
+ * @enum {number}
+ * @property {number} INTERACTION=50 Highest priority, used for {@link PIXI.InteractionManager}
+ * @property {number} HIGH=25 High priority updating, {@link PIXI.VideoBaseTexture} and {@link PIXI.AnimatedSprite}
+ * @property {number} NORMAL=0 Default priority for ticker events, see {@link PIXI.Ticker#add}.
+ * @property {number} LOW=-25 Low priority used for {@link PIXI.Application} rendering.
+ * @property {number} UTILITY=-50 Lowest priority used for {@link PIXI.BasePrepare} utility.
+ */
+
+ (function (UPDATE_PRIORITY) {
+ UPDATE_PRIORITY[UPDATE_PRIORITY["INTERACTION"] = 50] = "INTERACTION";
+ UPDATE_PRIORITY[UPDATE_PRIORITY["HIGH"] = 25] = "HIGH";
+ UPDATE_PRIORITY[UPDATE_PRIORITY["NORMAL"] = 0] = "NORMAL";
+ UPDATE_PRIORITY[UPDATE_PRIORITY["LOW"] = -25] = "LOW";
+ UPDATE_PRIORITY[UPDATE_PRIORITY["UTILITY"] = -50] = "UTILITY";
+ })(exports.UPDATE_PRIORITY || (exports.UPDATE_PRIORITY = {}));
+
+ /**
+ * Internal class for handling the priority sorting of ticker handlers.
+ *
+ * @private
+ * @class
+ * @memberof PIXI
+ */
+ var TickerListener = /** @class */ (function () {
+ /**
+ * Constructor
+ * @private
+ * @param {Function} fn - The listener function to be added for one update
+ * @param {*} [context=null] - The listener context
+ * @param {number} [priority=0] - The priority for emitting
+ * @param {boolean} [once=false] - If the handler should fire once
+ */
+ function TickerListener(fn, context, priority, once) {
+ if (context === void 0) { context = null; }
+ if (priority === void 0) { priority = 0; }
+ if (once === void 0) { once = false; }
+ /**
+ * The handler function to execute.
+ * @private
+ * @member {Function}
+ */
+ this.fn = fn;
+ /**
+ * The calling to execute.
+ * @private
+ * @member {*}
+ */
+ this.context = context;
+ /**
+ * The current priority.
+ * @private
+ * @member {number}
+ */
+ this.priority = priority;
+ /**
+ * If this should only execute once.
+ * @private
+ * @member {boolean}
+ */
+ this.once = once;
+ /**
+ * The next item in chain.
+ * @private
+ * @member {TickerListener}
+ */
+ this.next = null;
+ /**
+ * The previous item in chain.
+ * @private
+ * @member {TickerListener}
+ */
+ this.previous = null;
+ /**
+ * `true` if this listener has been destroyed already.
+ * @member {boolean}
+ * @private
+ */
+ this._destroyed = false;
+ }
+ /**
+ * Simple compare function to figure out if a function and context match.
+ * @private
+ * @param {Function} fn - The listener function to be added for one update
+ * @param {any} [context] - The listener context
+ * @return {boolean} `true` if the listener match the arguments
+ */
+ TickerListener.prototype.match = function (fn, context) {
+ if (context === void 0) { context = null; }
+ return this.fn === fn && this.context === context;
+ };
+ /**
+ * Emit by calling the current function.
+ * @private
+ * @param {number} deltaTime - time since the last emit.
+ * @return {TickerListener} Next ticker
+ */
+ TickerListener.prototype.emit = function (deltaTime) {
+ if (this.fn) {
+ if (this.context) {
+ this.fn.call(this.context, deltaTime);
+ }
+ else {
+ this.fn(deltaTime);
+ }
+ }
+ var redirect = this.next;
+ if (this.once) {
+ this.destroy(true);
+ }
+ // Soft-destroying should remove
+ // the next reference
+ if (this._destroyed) {
+ this.next = null;
+ }
+ return redirect;
+ };
+ /**
+ * Connect to the list.
+ * @private
+ * @param {TickerListener} previous - Input node, previous listener
+ */
+ TickerListener.prototype.connect = function (previous) {
+ this.previous = previous;
+ if (previous.next) {
+ previous.next.previous = this;
+ }
+ this.next = previous.next;
+ previous.next = this;
+ };
+ /**
+ * Destroy and don't use after this.
+ * @private
+ * @param {boolean} [hard = false] `true` to remove the `next` reference, this
+ * is considered a hard destroy. Soft destroy maintains the next reference.
+ * @return {TickerListener} The listener to redirect while emitting or removing.
+ */
+ TickerListener.prototype.destroy = function (hard) {
+ if (hard === void 0) { hard = false; }
+ this._destroyed = true;
+ this.fn = null;
+ this.context = null;
+ // Disconnect, hook up next and previous
+ if (this.previous) {
+ this.previous.next = this.next;
+ }
+ if (this.next) {
+ this.next.previous = this.previous;
+ }
+ // Redirect to the next item
+ var redirect = this.next;
+ // Remove references
+ this.next = hard ? null : redirect;
+ this.previous = null;
+ return redirect;
+ };
+ return TickerListener;
+ }());
+
+ /**
+ * A Ticker class that runs an update loop that other objects listen to.
+ *
+ * This class is composed around listeners meant for execution on the next requested animation frame.
+ * Animation frames are requested only when necessary, e.g. When the ticker is started and the emitter has listeners.
+ *
+ * @class
+ * @memberof PIXI
+ */
+ var Ticker = /** @class */ (function () {
+ function Ticker() {
+ var _this = this;
+ /**
+ * The first listener. All new listeners added are chained on this.
+ * @private
+ * @type {TickerListener}
+ */
+ this._head = new TickerListener(null, null, Infinity);
+ /**
+ * Internal current frame request ID
+ * @type {?number}
+ * @private
+ */
+ this._requestId = null;
+ /**
+ * Internal value managed by minFPS property setter and getter.
+ * This is the maximum allowed milliseconds between updates.
+ * @type {number}
+ * @private
+ */
+ this._maxElapsedMS = 100;
+ /**
+ * Internal value managed by maxFPS property setter and getter.
+ * This is the minimum allowed milliseconds between updates.
+ * @type {number}
+ * @private
+ */
+ this._minElapsedMS = 0;
+ /**
+ * Whether or not this ticker should invoke the method
+ * {@link PIXI.Ticker#start} automatically
+ * when a listener is added.
+ *
+ * @member {boolean}
+ * @default false
+ */
+ this.autoStart = false;
+ /**
+ * Scalar time value from last frame to this frame.
+ * This value is capped by setting {@link PIXI.Ticker#minFPS}
+ * and is scaled with {@link PIXI.Ticker#speed}.
+ * **Note:** The cap may be exceeded by scaling.
+ *
+ * @member {number}
+ * @default 1
+ */
+ this.deltaTime = 1;
+ /**
+ * Scaler time elapsed in milliseconds from last frame to this frame.
+ * This value is capped by setting {@link PIXI.Ticker#minFPS}
+ * and is scaled with {@link PIXI.Ticker#speed}.
+ * **Note:** The cap may be exceeded by scaling.
+ * If the platform supports DOMHighResTimeStamp,
+ * this value will have a precision of 1 µs.
+ * Defaults to target frame time
+ *
+ * @member {number}
+ * @default 16.66
+ */
+ this.deltaMS = 1 / settings.TARGET_FPMS;
+ /**
+ * Time elapsed in milliseconds from last frame to this frame.
+ * Opposed to what the scalar {@link PIXI.Ticker#deltaTime}
+ * is based, this value is neither capped nor scaled.
+ * If the platform supports DOMHighResTimeStamp,
+ * this value will have a precision of 1 µs.
+ * Defaults to target frame time
+ *
+ * @member {number}
+ * @default 16.66
+ */
+ this.elapsedMS = 1 / settings.TARGET_FPMS;
+ /**
+ * The last time {@link PIXI.Ticker#update} was invoked.
+ * This value is also reset internally outside of invoking
+ * update, but only when a new animation frame is requested.
+ * If the platform supports DOMHighResTimeStamp,
+ * this value will have a precision of 1 µs.
+ *
+ * @member {number}
+ * @default -1
+ */
+ this.lastTime = -1;
+ /**
+ * Factor of current {@link PIXI.Ticker#deltaTime}.
+ * @example
+ * // Scales ticker.deltaTime to what would be
+ * // the equivalent of approximately 120 FPS
+ * ticker.speed = 2;
+ *
+ * @member {number}
+ * @default 1
+ */
+ this.speed = 1;
+ /**
+ * Whether or not this ticker has been started.
+ * `true` if {@link PIXI.Ticker#start} has been called.
+ * `false` if {@link PIXI.Ticker#stop} has been called.
+ * While `false`, this value may change to `true` in the
+ * event of {@link PIXI.Ticker#autoStart} being `true`
+ * and a listener is added.
+ *
+ * @member {boolean}
+ * @default false
+ */
+ this.started = false;
+ /**
+ * If enabled, deleting is disabled.
+ * @member {boolean}
+ * @default false
+ * @private
+ */
+ this._protected = false;
+ /**
+ * The last time keyframe was executed.
+ * Maintains a relatively fixed interval with the previous value.
+ * @member {number}
+ * @default -1
+ * @private
+ */
+ this._lastFrame = -1;
+ /**
+ * Internal tick method bound to ticker instance.
+ * This is because in early 2015, Function.bind
+ * is still 60% slower in high performance scenarios.
+ * Also separating frame requests from update method
+ * so listeners may be called at any time and with
+ * any animation API, just invoke ticker.update(time).
+ *
+ * @private
+ * @param {number} time - Time since last tick.
+ */
+ this._tick = function (time) {
+ _this._requestId = null;
+ if (_this.started) {
+ // Invoke listeners now
+ _this.update(time);
+ // Listener side effects may have modified ticker state.
+ if (_this.started && _this._requestId === null && _this._head.next) {
+ _this._requestId = requestAnimationFrame(_this._tick);
+ }
+ }
+ };
+ }
+ /**
+ * Conditionally requests a new animation frame.
+ * If a frame has not already been requested, and if the internal
+ * emitter has listeners, a new frame is requested.
+ *
+ * @private
+ */
+ Ticker.prototype._requestIfNeeded = function () {
+ if (this._requestId === null && this._head.next) {
+ // ensure callbacks get correct delta
+ this.lastTime = performance.now();
+ this._lastFrame = this.lastTime;
+ this._requestId = requestAnimationFrame(this._tick);
+ }
+ };
+ /**
+ * Conditionally cancels a pending animation frame.
+ *
+ * @private
+ */
+ Ticker.prototype._cancelIfNeeded = function () {
+ if (this._requestId !== null) {
+ cancelAnimationFrame(this._requestId);
+ this._requestId = null;
+ }
+ };
+ /**
+ * Conditionally requests a new animation frame.
+ * If the ticker has been started it checks if a frame has not already
+ * been requested, and if the internal emitter has listeners. If these
+ * conditions are met, a new frame is requested. If the ticker has not
+ * been started, but autoStart is `true`, then the ticker starts now,
+ * and continues with the previous conditions to request a new frame.
+ *
+ * @private
+ */
+ Ticker.prototype._startIfPossible = function () {
+ if (this.started) {
+ this._requestIfNeeded();
+ }
+ else if (this.autoStart) {
+ this.start();
+ }
+ };
+ /**
+ * Register a handler for tick events. Calls continuously unless
+ * it is removed or the ticker is stopped.
+ *
+ * @param {Function} fn - The listener function to be added for updates
+ * @param {*} [context] - The listener context
+ * @param {number} [priority=PIXI.UPDATE_PRIORITY.NORMAL] - The priority for emitting
+ * @returns {PIXI.Ticker} This instance of a ticker
+ */
+ Ticker.prototype.add = function (fn, context, priority) {
+ if (priority === void 0) { priority = exports.UPDATE_PRIORITY.NORMAL; }
+ return this._addListener(new TickerListener(fn, context, priority));
+ };
+ /**
+ * Add a handler for the tick event which is only execute once.
+ *
+ * @param {Function} fn - The listener function to be added for one update
+ * @param {*} [context] - The listener context
+ * @param {number} [priority=PIXI.UPDATE_PRIORITY.NORMAL] - The priority for emitting
+ * @returns {PIXI.Ticker} This instance of a ticker
+ */
+ Ticker.prototype.addOnce = function (fn, context, priority) {
+ if (priority === void 0) { priority = exports.UPDATE_PRIORITY.NORMAL; }
+ return this._addListener(new TickerListener(fn, context, priority, true));
+ };
+ /**
+ * Internally adds the event handler so that it can be sorted by priority.
+ * Priority allows certain handler (user, AnimatedSprite, Interaction) to be run
+ * before the rendering.
+ *
+ * @private
+ * @param {TickerListener} listener - Current listener being added.
+ * @returns {PIXI.Ticker} This instance of a ticker
+ */
+ Ticker.prototype._addListener = function (listener) {
+ // For attaching to head
+ var current = this._head.next;
+ var previous = this._head;
+ // Add the first item
+ if (!current) {
+ listener.connect(previous);
+ }
+ else {
+ // Go from highest to lowest priority
+ while (current) {
+ if (listener.priority > current.priority) {
+ listener.connect(previous);
+ break;
+ }
+ previous = current;
+ current = current.next;
+ }
+ // Not yet connected
+ if (!listener.previous) {
+ listener.connect(previous);
+ }
+ }
+ this._startIfPossible();
+ return this;
+ };
+ /**
+ * Removes any handlers matching the function and context parameters.
+ * If no handlers are left after removing, then it cancels the animation frame.
+ *
+ * @param {Function} fn - The listener function to be removed
+ * @param {*} [context] - The listener context to be removed
+ * @returns {PIXI.Ticker} This instance of a ticker
+ */
+ Ticker.prototype.remove = function (fn, context) {
+ var listener = this._head.next;
+ while (listener) {
+ // We found a match, lets remove it
+ // no break to delete all possible matches
+ // incase a listener was added 2+ times
+ if (listener.match(fn, context)) {
+ listener = listener.destroy();
+ }
+ else {
+ listener = listener.next;
+ }
+ }
+ if (!this._head.next) {
+ this._cancelIfNeeded();
+ }
+ return this;
+ };
+ Object.defineProperty(Ticker.prototype, "count", {
+ /**
+ * The number of listeners on this ticker, calculated by walking through linked list
+ *
+ * @readonly
+ * @member {number}
+ */
+ get: function () {
+ if (!this._head) {
+ return 0;
+ }
+ var count = 0;
+ var current = this._head;
+ while ((current = current.next)) {
+ count++;
+ }
+ return count;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ /**
+ * Starts the ticker. If the ticker has listeners
+ * a new animation frame is requested at this point.
+ */
+ Ticker.prototype.start = function () {
+ if (!this.started) {
+ this.started = true;
+ this._requestIfNeeded();
+ }
+ };
+ /**
+ * Stops the ticker. If the ticker has requested
+ * an animation frame it is canceled at this point.
+ */
+ Ticker.prototype.stop = function () {
+ if (this.started) {
+ this.started = false;
+ this._cancelIfNeeded();
+ }
+ };
+ /**
+ * Destroy the ticker and don't use after this. Calling
+ * this method removes all references to internal events.
+ */
+ Ticker.prototype.destroy = function () {
+ if (!this._protected) {
+ this.stop();
+ var listener = this._head.next;
+ while (listener) {
+ listener = listener.destroy(true);
+ }
+ this._head.destroy();
+ this._head = null;
+ }
+ };
+ /**
+ * Triggers an update. An update entails setting the
+ * current {@link PIXI.Ticker#elapsedMS},
+ * the current {@link PIXI.Ticker#deltaTime},
+ * invoking all listeners with current deltaTime,
+ * and then finally setting {@link PIXI.Ticker#lastTime}
+ * with the value of currentTime that was provided.
+ * This method will be called automatically by animation
+ * frame callbacks if the ticker instance has been started
+ * and listeners are added.
+ *
+ * @param {number} [currentTime=performance.now()] - the current time of execution
+ */
+ Ticker.prototype.update = function (currentTime) {
+ if (currentTime === void 0) { currentTime = performance.now(); }
+ var elapsedMS;
+ // If the difference in time is zero or negative, we ignore most of the work done here.
+ // If there is no valid difference, then should be no reason to let anyone know about it.
+ // A zero delta, is exactly that, nothing should update.
+ //
+ // The difference in time can be negative, and no this does not mean time traveling.
+ // This can be the result of a race condition between when an animation frame is requested
+ // on the current JavaScript engine event loop, and when the ticker's start method is invoked
+ // (which invokes the internal _requestIfNeeded method). If a frame is requested before
+ // _requestIfNeeded is invoked, then the callback for the animation frame the ticker requests,
+ // can receive a time argument that can be less than the lastTime value that was set within
+ // _requestIfNeeded. This difference is in microseconds, but this is enough to cause problems.
+ //
+ // This check covers this browser engine timing issue, as well as if consumers pass an invalid
+ // currentTime value. This may happen if consumers opt-out of the autoStart, and update themselves.
+ if (currentTime > this.lastTime) {
+ // Save uncapped elapsedMS for measurement
+ elapsedMS = this.elapsedMS = currentTime - this.lastTime;
+ // cap the milliseconds elapsed used for deltaTime
+ if (elapsedMS > this._maxElapsedMS) {
+ elapsedMS = this._maxElapsedMS;
+ }
+ elapsedMS *= this.speed;
+ // If not enough time has passed, exit the function.
+ // Get ready for next frame by setting _lastFrame, but based on _minElapsedMS
+ // adjustment to ensure a relatively stable interval.
+ if (this._minElapsedMS) {
+ var delta = currentTime - this._lastFrame | 0;
+ if (delta < this._minElapsedMS) {
+ return;
+ }
+ this._lastFrame = currentTime - (delta % this._minElapsedMS);
+ }
+ this.deltaMS = elapsedMS;
+ this.deltaTime = this.deltaMS * settings.TARGET_FPMS;
+ // Cache a local reference, in-case ticker is destroyed
+ // during the emit, we can still check for head.next
+ var head = this._head;
+ // Invoke listeners added to internal emitter
+ var listener = head.next;
+ while (listener) {
+ listener = listener.emit(this.deltaTime);
+ }
+ if (!head.next) {
+ this._cancelIfNeeded();
+ }
+ }
+ else {
+ this.deltaTime = this.deltaMS = this.elapsedMS = 0;
+ }
+ this.lastTime = currentTime;
+ };
+ Object.defineProperty(Ticker.prototype, "FPS", {
+ /**
+ * The frames per second at which this ticker is running.
+ * The default is approximately 60 in most modern browsers.
+ * **Note:** This does not factor in the value of
+ * {@link PIXI.Ticker#speed}, which is specific
+ * to scaling {@link PIXI.Ticker#deltaTime}.
+ *
+ * @member {number}
+ * @readonly
+ */
+ get: function () {
+ return 1000 / this.elapsedMS;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(Ticker.prototype, "minFPS", {
+ /**
+ * Manages the maximum amount of milliseconds allowed to
+ * elapse between invoking {@link PIXI.Ticker#update}.
+ * This value is used to cap {@link PIXI.Ticker#deltaTime},
+ * but does not effect the measured value of {@link PIXI.Ticker#FPS}.
+ * When setting this property it is clamped to a value between
+ * `0` and `PIXI.settings.TARGET_FPMS * 1000`.
+ *
+ * @member {number}
+ * @default 10
+ */
+ get: function () {
+ return 1000 / this._maxElapsedMS;
+ },
+ set: function (fps) {
+ // Minimum must be below the maxFPS
+ var minFPS = Math.min(this.maxFPS, fps);
+ // Must be at least 0, but below 1 / settings.TARGET_FPMS
+ var minFPMS = Math.min(Math.max(0, minFPS) / 1000, settings.TARGET_FPMS);
+ this._maxElapsedMS = 1 / minFPMS;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(Ticker.prototype, "maxFPS", {
+ /**
+ * Manages the minimum amount of milliseconds required to
+ * elapse between invoking {@link PIXI.Ticker#update}.
+ * This will effect the measured value of {@link PIXI.Ticker#FPS}.
+ * If it is set to `0`, then there is no limit; PixiJS will render as many frames as it can.
+ * Otherwise it will be at least `minFPS`
+ *
+ * @member {number}
+ * @default 0
+ */
+ get: function () {
+ if (this._minElapsedMS) {
+ return Math.round(1000 / this._minElapsedMS);
+ }
+ return 0;
+ },
+ set: function (fps) {
+ if (fps === 0) {
+ this._minElapsedMS = 0;
+ }
+ else {
+ // Max must be at least the minFPS
+ var maxFPS = Math.max(this.minFPS, fps);
+ this._minElapsedMS = 1 / (maxFPS / 1000);
+ }
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(Ticker, "shared", {
+ /**
+ * The shared ticker instance used by {@link PIXI.AnimatedSprite} and by
+ * {@link PIXI.VideoResource} to update animation frames / video textures.
+ *
+ * It may also be used by {@link PIXI.Application} if created with the `sharedTicker` option property set to true.
+ *
+ * The property {@link PIXI.Ticker#autoStart} is set to `true` for this instance.
+ * Please follow the examples for usage, including how to opt-out of auto-starting the shared ticker.
+ *
+ * @example
+ * let ticker = PIXI.Ticker.shared;
+ * // Set this to prevent starting this ticker when listeners are added.
+ * // By default this is true only for the PIXI.Ticker.shared instance.
+ * ticker.autoStart = false;
+ * // FYI, call this to ensure the ticker is stopped. It should be stopped
+ * // if you have not attempted to render anything yet.
+ * ticker.stop();
+ * // Call this when you are ready for a running shared ticker.
+ * ticker.start();
+ *
+ * @example
+ * // You may use the shared ticker to render...
+ * let renderer = PIXI.autoDetectRenderer();
+ * let stage = new PIXI.Container();
+ * document.body.appendChild(renderer.view);
+ * ticker.add(function (time) {
+ * renderer.render(stage);
+ * });
+ *
+ * @example
+ * // Or you can just update it manually.
+ * ticker.autoStart = false;
+ * ticker.stop();
+ * function animate(time) {
+ * ticker.update(time);
+ * renderer.render(stage);
+ * requestAnimationFrame(animate);
+ * }
+ * animate(performance.now());
+ *
+ * @member {PIXI.Ticker}
+ * @static
+ */
+ get: function () {
+ if (!Ticker._shared) {
+ var shared = Ticker._shared = new Ticker();
+ shared.autoStart = true;
+ shared._protected = true;
+ }
+ return Ticker._shared;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(Ticker, "system", {
+ /**
+ * The system ticker instance used by {@link PIXI.InteractionManager} and by
+ * {@link PIXI.BasePrepare} for core timing functionality that shouldn't usually need to be paused,
+ * unlike the `shared` ticker which drives visual animations and rendering which may want to be paused.
+ *
+ * The property {@link PIXI.Ticker#autoStart} is set to `true` for this instance.
+ *
+ * @member {PIXI.Ticker}
+ * @static
+ */
+ get: function () {
+ if (!Ticker._system) {
+ var system = Ticker._system = new Ticker();
+ system.autoStart = true;
+ system._protected = true;
+ }
+ return Ticker._system;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ return Ticker;
+ }());
+
+ /**
+ * Middleware for for Application Ticker.
+ *
+ * @example
+ * import {TickerPlugin} from '@pixi/ticker';
+ * import {Application} from '@pixi/app';
+ * Application.registerPlugin(TickerPlugin);
+ *
+ * @class
+ * @memberof PIXI
+ */
+ var TickerPlugin = /** @class */ (function () {
+ function TickerPlugin() {
+ }
+ /**
+ * Initialize the plugin with scope of application instance
+ *
+ * @static
+ * @private
+ * @param {object} [options] - See application options
+ */
+ TickerPlugin.init = function (options) {
+ var _this = this;
+ // Set default
+ options = Object.assign({
+ autoStart: true,
+ sharedTicker: false,
+ }, options);
+ // Create ticker setter
+ Object.defineProperty(this, 'ticker', {
+ set: function (ticker) {
+ if (this._ticker) {
+ this._ticker.remove(this.render, this);
+ }
+ this._ticker = ticker;
+ if (ticker) {
+ ticker.add(this.render, this, exports.UPDATE_PRIORITY.LOW);
+ }
+ },
+ get: function () {
+ return this._ticker;
+ },
+ });
+ /**
+ * Convenience method for stopping the render.
+ *
+ * @method PIXI.Application#stop
+ */
+ this.stop = function () {
+ _this._ticker.stop();
+ };
+ /**
+ * Convenience method for starting the render.
+ *
+ * @method PIXI.Application#start
+ */
+ this.start = function () {
+ _this._ticker.start();
+ };
+ /**
+ * Internal reference to the ticker.
+ *
+ * @type {PIXI.Ticker}
+ * @name _ticker
+ * @memberof PIXI.Application#
+ * @private
+ */
+ this._ticker = null;
+ /**
+ * Ticker for doing render updates.
+ *
+ * @type {PIXI.Ticker}
+ * @name ticker
+ * @memberof PIXI.Application#
+ * @default PIXI.Ticker.shared
+ */
+ this.ticker = options.sharedTicker ? Ticker.shared : new Ticker();
+ // Start the rendering
+ if (options.autoStart) {
+ this.start();
+ }
+ };
+ /**
+ * Clean up the ticker, scoped to application.
+ *
+ * @static
+ * @private
+ */
+ TickerPlugin.destroy = function () {
+ if (this._ticker) {
+ var oldTicker = this._ticker;
+ this.ticker = null;
+ oldTicker.destroy();
+ }
+ };
+ return TickerPlugin;
+ }());
+
+ /*!
+ * @pixi/interaction - v5.3.12
+ * Compiled Wed, 23 Mar 2022 18:38:07 UTC
+ *
+ * @pixi/interaction is licensed under the MIT License.
+ * http://www.opensource.org/licenses/mit-license
+ */
+
+ /**
+ * Holds all information related to an Interaction event
+ *
+ * @class
+ * @memberof PIXI
+ */
+ var InteractionData = /** @class */ (function () {
+ function InteractionData() {
+ this.pressure = 0;
+ this.rotationAngle = 0;
+ this.twist = 0;
+ this.tangentialPressure = 0;
+ /**
+ * This point stores the global coords of where the touch/mouse event happened
+ *
+ * @member {PIXI.Point}
+ */
+ this.global = new Point();
+ /**
+ * The target Sprite that was interacted with
+ *
+ * @member {PIXI.Sprite}
+ */
+ this.target = null;
+ /**
+ * When passed to an event handler, this will be the original DOM Event that was captured
+ *
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent
+ * @member {MouseEvent|TouchEvent|PointerEvent}
+ */
+ this.originalEvent = null;
+ /**
+ * Unique identifier for this interaction
+ *
+ * @member {number}
+ */
+ this.identifier = null;
+ /**
+ * Indicates whether or not the pointer device that created the event is the primary pointer.
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/isPrimary
+ * @type {Boolean}
+ */
+ this.isPrimary = false;
+ /**
+ * Indicates which button was pressed on the mouse or pointer device to trigger the event.
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button
+ * @type {number}
+ */
+ this.button = 0;
+ /**
+ * Indicates which buttons are pressed on the mouse or pointer device when the event is triggered.
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons
+ * @type {number}
+ */
+ this.buttons = 0;
+ /**
+ * The width of the pointer's contact along the x-axis, measured in CSS pixels.
+ * radiusX of TouchEvents will be represented by this value.
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/width
+ * @type {number}
+ */
+ this.width = 0;
+ /**
+ * The height of the pointer's contact along the y-axis, measured in CSS pixels.
+ * radiusY of TouchEvents will be represented by this value.
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/height
+ * @type {number}
+ */
+ this.height = 0;
+ /**
+ * The angle, in degrees, between the pointer device and the screen.
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/tiltX
+ * @type {number}
+ */
+ this.tiltX = 0;
+ /**
+ * The angle, in degrees, between the pointer device and the screen.
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/tiltY
+ * @type {number}
+ */
+ this.tiltY = 0;
+ /**
+ * The type of pointer that triggered the event.
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/pointerType
+ * @type {string}
+ */
+ this.pointerType = null;
+ /**
+ * Pressure applied by the pointing device during the event. A Touch's force property
+ * will be represented by this value.
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/pressure
+ * @type {number}
+ */
+ this.pressure = 0;
+ /**
+ * From TouchEvents (not PointerEvents triggered by touches), the rotationAngle of the Touch.
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/Touch/rotationAngle
+ * @type {number}
+ */
+ this.rotationAngle = 0;
+ /**
+ * Twist of a stylus pointer.
+ * @see https://w3c.github.io/pointerevents/#pointerevent-interface
+ * @type {number}
+ */
+ this.twist = 0;
+ /**
+ * Barrel pressure on a stylus pointer.
+ * @see https://w3c.github.io/pointerevents/#pointerevent-interface
+ * @type {number}
+ */
+ this.tangentialPressure = 0;
+ }
+ Object.defineProperty(InteractionData.prototype, "pointerId", {
+ /**
+ * The unique identifier of the pointer. It will be the same as `identifier`.
+ * @readonly
+ * @member {number}
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/pointerId
+ */
+ get: function () {
+ return this.identifier;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ /**
+ * This will return the local coordinates of the specified displayObject for this InteractionData
+ *
+ * @param {PIXI.DisplayObject} displayObject - The DisplayObject that you would like the local
+ * coords off
+ * @param {PIXI.Point} [point] - A Point object in which to store the value, optional (otherwise
+ * will create a new point)
+ * @param {PIXI.Point} [globalPos] - A Point object containing your custom global coords, optional
+ * (otherwise will use the current global coords)
+ * @return {PIXI.Point} A point containing the coordinates of the InteractionData position relative
+ * to the DisplayObject
+ */
+ InteractionData.prototype.getLocalPosition = function (displayObject, point, globalPos) {
+ return displayObject.worldTransform.applyInverse(globalPos || this.global, point);
+ };
+ /**
+ * Copies properties from normalized event data.
+ *
+ * @param {Touch|MouseEvent|PointerEvent} event - The normalized event data
+ */
+ InteractionData.prototype.copyEvent = function (event) {
+ // isPrimary should only change on touchstart/pointerdown, so we don't want to overwrite
+ // it with "false" on later events when our shim for it on touch events might not be
+ // accurate
+ if ('isPrimary' in event && event.isPrimary) {
+ this.isPrimary = true;
+ }
+ this.button = 'button' in event && event.button;
+ // event.buttons is not available in all browsers (ie. Safari), but it does have a non-standard
+ // event.which property instead, which conveys the same information.
+ var buttons = 'buttons' in event && event.buttons;
+ this.buttons = Number.isInteger(buttons) ? buttons : 'which' in event && event.which;
+ this.width = 'width' in event && event.width;
+ this.height = 'height' in event && event.height;
+ this.tiltX = 'tiltX' in event && event.tiltX;
+ this.tiltY = 'tiltY' in event && event.tiltY;
+ this.pointerType = 'pointerType' in event && event.pointerType;
+ this.pressure = 'pressure' in event && event.pressure;
+ this.rotationAngle = 'rotationAngle' in event && event.rotationAngle;
+ this.twist = ('twist' in event && event.twist) || 0;
+ this.tangentialPressure = ('tangentialPressure' in event && event.tangentialPressure) || 0;
+ };
+ /**
+ * Resets the data for pooling.
+ */
+ InteractionData.prototype.reset = function () {
+ // isPrimary is the only property that we really need to reset - everything else is
+ // guaranteed to be overwritten
+ this.isPrimary = false;
+ };
+ return InteractionData;
+ }());
+
+ /*! *****************************************************************************
+ Copyright (c) Microsoft Corporation. All rights reserved.
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+ this file except in compliance with the License. You may obtain a copy of the
+ License at http://www.apache.org/licenses/LICENSE-2.0
+
+ THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+ WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+ MERCHANTABLITY OR NON-INFRINGEMENT.
+
+ See the Apache Version 2.0 License for specific language governing permissions
+ and limitations under the License.
+ ***************************************************************************** */
+ /* global Reflect, Promise */
+
+ var extendStatics$1 = function(d, b) {
+ extendStatics$1 = Object.setPrototypeOf ||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+ function (d, b) { for (var p in b) { if (b.hasOwnProperty(p)) { d[p] = b[p]; } } };
+ return extendStatics$1(d, b);
+ };
+
+ function __extends$1(d, b) {
+ extendStatics$1(d, b);
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+ }
+
+ /**
+ * Event class that mimics native DOM events.
+ *
+ * @class
+ * @memberof PIXI
+ */
+ var InteractionEvent = /** @class */ (function () {
+ function InteractionEvent() {
+ /**
+ * Whether this event will continue propagating in the tree.
+ *
+ * Remaining events for the {@link stopsPropagatingAt} object
+ * will still be dispatched.
+ *
+ * @member {boolean}
+ */
+ this.stopped = false;
+ /**
+ * At which object this event stops propagating.
+ *
+ * @private
+ * @member {PIXI.DisplayObject}
+ */
+ this.stopsPropagatingAt = null;
+ /**
+ * Whether we already reached the element we want to
+ * stop propagating at. This is important for delayed events,
+ * where we start over deeper in the tree again.
+ *
+ * @private
+ * @member {boolean}
+ */
+ this.stopPropagationHint = false;
+ /**
+ * The object which caused this event to be dispatched.
+ * For listener callback see {@link PIXI.InteractionEvent.currentTarget}.
+ *
+ * @member {PIXI.DisplayObject}
+ */
+ this.target = null;
+ /**
+ * The object whose event listener’s callback is currently being invoked.
+ *
+ * @member {PIXI.DisplayObject}
+ */
+ this.currentTarget = null;
+ /**
+ * Type of the event
+ *
+ * @member {string}
+ */
+ this.type = null;
+ /**
+ * InteractionData related to this event
+ *
+ * @member {PIXI.InteractionData}
+ */
+ this.data = null;
+ }
+ /**
+ * Prevents event from reaching any objects other than the current object.
+ *
+ */
+ InteractionEvent.prototype.stopPropagation = function () {
+ this.stopped = true;
+ this.stopPropagationHint = true;
+ this.stopsPropagatingAt = this.currentTarget;
+ };
+ /**
+ * Resets the event.
+ */
+ InteractionEvent.prototype.reset = function () {
+ this.stopped = false;
+ this.stopsPropagatingAt = null;
+ this.stopPropagationHint = false;
+ this.currentTarget = null;
+ this.target = null;
+ };
+ return InteractionEvent;
+ }());
+
+ /**
+ * DisplayObjects with the {@link PIXI.interactiveTarget} mixin use this class to track interactions
+ *
+ * @class
+ * @private
+ * @memberof PIXI
+ */
+ var InteractionTrackingData = /** @class */ (function () {
+ /**
+ * @param {number} pointerId - Unique pointer id of the event
+ * @private
+ */
+ function InteractionTrackingData(pointerId) {
+ this._pointerId = pointerId;
+ this._flags = InteractionTrackingData.FLAGS.NONE;
+ }
+ /**
+ *
+ * @private
+ * @param {number} flag - The interaction flag to set
+ * @param {boolean} yn - Should the flag be set or unset
+ */
+ InteractionTrackingData.prototype._doSet = function (flag, yn) {
+ if (yn) {
+ this._flags = this._flags | flag;
+ }
+ else {
+ this._flags = this._flags & (~flag);
+ }
+ };
+ Object.defineProperty(InteractionTrackingData.prototype, "pointerId", {
+ /**
+ * Unique pointer id of the event
+ *
+ * @readonly
+ * @private
+ * @member {number}
+ */
+ get: function () {
+ return this._pointerId;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(InteractionTrackingData.prototype, "flags", {
+ /**
+ * State of the tracking data, expressed as bit flags
+ *
+ * @private
+ * @member {number}
+ */
+ get: function () {
+ return this._flags;
+ },
+ set: function (flags) {
+ this._flags = flags;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(InteractionTrackingData.prototype, "none", {
+ /**
+ * Is the tracked event inactive (not over or down)?
+ *
+ * @private
+ * @member {number}
+ */
+ get: function () {
+ return this._flags === InteractionTrackingData.FLAGS.NONE;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(InteractionTrackingData.prototype, "over", {
+ /**
+ * Is the tracked event over the DisplayObject?
+ *
+ * @private
+ * @member {boolean}
+ */
+ get: function () {
+ return (this._flags & InteractionTrackingData.FLAGS.OVER) !== 0;
+ },
+ set: function (yn) {
+ this._doSet(InteractionTrackingData.FLAGS.OVER, yn);
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(InteractionTrackingData.prototype, "rightDown", {
+ /**
+ * Did the right mouse button come down in the DisplayObject?
+ *
+ * @private
+ * @member {boolean}
+ */
+ get: function () {
+ return (this._flags & InteractionTrackingData.FLAGS.RIGHT_DOWN) !== 0;
+ },
+ set: function (yn) {
+ this._doSet(InteractionTrackingData.FLAGS.RIGHT_DOWN, yn);
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(InteractionTrackingData.prototype, "leftDown", {
+ /**
+ * Did the left mouse button come down in the DisplayObject?
+ *
+ * @private
+ * @member {boolean}
+ */
+ get: function () {
+ return (this._flags & InteractionTrackingData.FLAGS.LEFT_DOWN) !== 0;
+ },
+ set: function (yn) {
+ this._doSet(InteractionTrackingData.FLAGS.LEFT_DOWN, yn);
+ },
+ enumerable: false,
+ configurable: true
+ });
+ InteractionTrackingData.FLAGS = Object.freeze({
+ NONE: 0,
+ OVER: 1 << 0,
+ LEFT_DOWN: 1 << 1,
+ RIGHT_DOWN: 1 << 2,
+ });
+ return InteractionTrackingData;
+ }());
+
+ /**
+ * Strategy how to search through stage tree for interactive objects
+ *
+ * @private
+ * @class
+ * @memberof PIXI
+ */
+ var TreeSearch = /** @class */ (function () {
+ function TreeSearch() {
+ this._tempPoint = new Point();
+ }
+ /**
+ * Recursive implementation for findHit
+ *
+ * @private
+ * @param {PIXI.InteractionEvent} interactionEvent - event containing the point that
+ * is tested for collision
+ * @param {PIXI.Container|PIXI.Sprite|PIXI.TilingSprite} displayObject - the displayObject
+ * that will be hit test (recursively crawls its children)
+ * @param {Function} [func] - the function that will be called on each interactive object. The
+ * interactionEvent, displayObject and hit will be passed to the function
+ * @param {boolean} [hitTest] - this indicates if the objects inside should be hit test against the point
+ * @param {boolean} [interactive] - Whether the displayObject is interactive
+ * @return {boolean} returns true if the displayObject hit the point
+ */
+ TreeSearch.prototype.recursiveFindHit = function (interactionEvent, displayObject, func, hitTest, interactive) {
+ if (!displayObject || !displayObject.visible) {
+ return false;
+ }
+ var point = interactionEvent.data.global;
+ // Took a little while to rework this function correctly! But now it is done and nice and optimized! ^_^
+ //
+ // This function will now loop through all objects and then only hit test the objects it HAS
+ // to, not all of them. MUCH faster..
+ // An object will be hit test if the following is true:
+ //
+ // 1: It is interactive.
+ // 2: It belongs to a parent that is interactive AND one of the parents children have not already been hit.
+ //
+ // As another little optimization once an interactive object has been hit we can carry on
+ // through the scenegraph, but we know that there will be no more hits! So we can avoid extra hit tests
+ // A final optimization is that an object is not hit test directly if a child has already been hit.
+ interactive = displayObject.interactive || interactive;
+ var hit = false;
+ var interactiveParent = interactive;
+ // Flag here can set to false if the event is outside the parents hitArea or mask
+ var hitTestChildren = true;
+ // If there is a hitArea, no need to test against anything else if the pointer is not within the hitArea
+ // There is also no longer a need to hitTest children.
+ if (displayObject.hitArea) {
+ if (hitTest) {
+ displayObject.worldTransform.applyInverse(point, this._tempPoint);
+ if (!displayObject.hitArea.contains(this._tempPoint.x, this._tempPoint.y)) {
+ hitTest = false;
+ hitTestChildren = false;
+ }
+ else {
+ hit = true;
+ }
+ }
+ interactiveParent = false;
+ }
+ // If there is a mask, no need to hitTest against anything else if the pointer is not within the mask.
+ // We still want to hitTestChildren, however, to ensure a mouseout can still be generated.
+ // https://github.com/pixijs/pixi.js/issues/5135
+ else if (displayObject._mask) {
+ if (hitTest) {
+ if (!(displayObject._mask.containsPoint && displayObject._mask.containsPoint(point))) {
+ hitTest = false;
+ }
+ }
+ }
+ // ** FREE TIP **! If an object is not interactive or has no buttons in it
+ // (such as a game scene!) set interactiveChildren to false for that displayObject.
+ // This will allow PixiJS to completely ignore and bypass checking the displayObjects children.
+ if (hitTestChildren && displayObject.interactiveChildren && displayObject.children) {
+ var children = displayObject.children;
+ for (var i = children.length - 1; i >= 0; i--) {
+ var child = children[i];
+ // time to get recursive.. if this function will return if something is hit..
+ var childHit = this.recursiveFindHit(interactionEvent, child, func, hitTest, interactiveParent);
+ if (childHit) {
+ // its a good idea to check if a child has lost its parent.
+ // this means it has been removed whilst looping so its best
+ if (!child.parent) {
+ continue;
+ }
+ // we no longer need to hit test any more objects in this container as we we
+ // now know the parent has been hit
+ interactiveParent = false;
+ // If the child is interactive , that means that the object hit was actually
+ // interactive and not just the child of an interactive object.
+ // This means we no longer need to hit test anything else. We still need to run
+ // through all objects, but we don't need to perform any hit tests.
+ if (childHit) {
+ if (interactionEvent.target) {
+ hitTest = false;
+ }
+ hit = true;
+ }
+ }
+ }
+ }
+ // no point running this if the item is not interactive or does not have an interactive parent.
+ if (interactive) {
+ // if we are hit testing (as in we have no hit any objects yet)
+ // We also don't need to worry about hit testing if once of the displayObjects children
+ // has already been hit - but only if it was interactive, otherwise we need to keep
+ // looking for an interactive child, just in case we hit one
+ if (hitTest && !interactionEvent.target) {
+ // already tested against hitArea if it is defined
+ if (!displayObject.hitArea && displayObject.containsPoint) {
+ if (displayObject.containsPoint(point)) {
+ hit = true;
+ }
+ }
+ }
+ if (displayObject.interactive) {
+ if (hit && !interactionEvent.target) {
+ interactionEvent.target = displayObject;
+ }
+ if (func) {
+ func(interactionEvent, displayObject, !!hit);
+ }
+ }
+ }
+ return hit;
+ };
+ /**
+ * This function is provides a neat way of crawling through the scene graph and running a
+ * specified function on all interactive objects it finds. It will also take care of hit
+ * testing the interactive objects and passes the hit across in the function.
+ *
+ * @private
+ * @param {PIXI.InteractionEvent} interactionEvent - event containing the point that
+ * is tested for collision
+ * @param {PIXI.Container|PIXI.Sprite|PIXI.TilingSprite} displayObject - the displayObject
+ * that will be hit test (recursively crawls its children)
+ * @param {Function} [func] - the function that will be called on each interactive object. The
+ * interactionEvent, displayObject and hit will be passed to the function
+ * @param {boolean} [hitTest] - this indicates if the objects inside should be hit test against the point
+ * @return {boolean} returns true if the displayObject hit the point
+ */
+ TreeSearch.prototype.findHit = function (interactionEvent, displayObject, func, hitTest) {
+ this.recursiveFindHit(interactionEvent, displayObject, func, hitTest, false);
+ };
+ return TreeSearch;
+ }());
+
+ /**
+ * Interface for classes that represent a hit area.
+ *
+ * It is implemented by the following classes:
+ * - {@link PIXI.Circle}
+ * - {@link PIXI.Ellipse}
+ * - {@link PIXI.Polygon}
+ * - {@link PIXI.RoundedRectangle}
+ *
+ * @interface IHitArea
+ * @memberof PIXI
+ */
+ /**
+ * Checks whether the x and y coordinates given are contained within this area
+ *
+ * @method
+ * @name contains
+ * @memberof PIXI.IHitArea#
+ * @param {number} x - The X coordinate of the point to test
+ * @param {number} y - The Y coordinate of the point to test
+ * @return {boolean} Whether the x/y coordinates are within this area
+ */
+ /**
+ * Default property values of interactive objects
+ * Used by {@link PIXI.InteractionManager} to automatically give all DisplayObjects these properties
+ *
+ * @private
+ * @name interactiveTarget
+ * @type {Object}
+ * @memberof PIXI
+ * @example
+ * function MyObject() {}
+ *
+ * Object.assign(
+ * DisplayObject.prototype,
+ * PIXI.interactiveTarget
+ * );
+ */
+ var interactiveTarget = {
+ /**
+ * Enable interaction events for the DisplayObject. Touch, pointer and mouse
+ * events will not be emitted unless `interactive` is set to `true`.
+ *
+ * @example
+ * const sprite = new PIXI.Sprite(texture);
+ * sprite.interactive = true;
+ * sprite.on('tap', (event) => {
+ * //handle event
+ * });
+ * @member {boolean}
+ * @memberof PIXI.DisplayObject#
+ */
+ interactive: false,
+ /**
+ * Determines if the children to the displayObject can be clicked/touched
+ * Setting this to false allows PixiJS to bypass a recursive `hitTest` function
+ *
+ * @member {boolean}
+ * @memberof PIXI.Container#
+ */
+ interactiveChildren: true,
+ /**
+ * Interaction shape. Children will be hit first, then this shape will be checked.
+ * Setting this will cause this shape to be checked in hit tests rather than the displayObject's bounds.
+ *
+ * @example
+ * const sprite = new PIXI.Sprite(texture);
+ * sprite.interactive = true;
+ * sprite.hitArea = new PIXI.Rectangle(0, 0, 100, 100);
+ * @member {PIXI.IHitArea}
+ * @memberof PIXI.DisplayObject#
+ */
+ hitArea: null,
+ /**
+ * If enabled, the mouse cursor use the pointer behavior when hovered over the displayObject if it is interactive
+ * Setting this changes the 'cursor' property to `'pointer'`.
+ *
+ * @example
+ * const sprite = new PIXI.Sprite(texture);
+ * sprite.interactive = true;
+ * sprite.buttonMode = true;
+ * @member {boolean}
+ * @memberof PIXI.DisplayObject#
+ */
+ get buttonMode() {
+ return this.cursor === 'pointer';
+ },
+ set buttonMode(value) {
+ if (value) {
+ this.cursor = 'pointer';
+ }
+ else if (this.cursor === 'pointer') {
+ this.cursor = null;
+ }
+ },
+ /**
+ * This defines what cursor mode is used when the mouse cursor
+ * is hovered over the displayObject.
+ *
+ * @example
+ * const sprite = new PIXI.Sprite(texture);
+ * sprite.interactive = true;
+ * sprite.cursor = 'wait';
+ * @see https://developer.mozilla.org/en/docs/Web/CSS/cursor
+ *
+ * @member {string}
+ * @memberof PIXI.DisplayObject#
+ */
+ cursor: null,
+ /**
+ * Internal set of all active pointers, by identifier
+ *
+ * @member {Map}
+ * @memberof PIXI.DisplayObject#
+ * @private
+ */
+ get trackedPointers() {
+ if (this._trackedPointers === undefined)
+ { this._trackedPointers = {}; }
+ return this._trackedPointers;
+ },
+ /**
+ * Map of all tracked pointers, by identifier. Use trackedPointers to access.
+ *
+ * @private
+ * @type {Map}
+ */
+ _trackedPointers: undefined,
+ };
+
+ // Mix interactiveTarget into DisplayObject.prototype,
+ // after deprecation has been handled
+ DisplayObject.mixin(interactiveTarget);
+ var MOUSE_POINTER_ID = 1;
+ // helpers for hitTest() - only used inside hitTest()
+ var hitTestEvent = {
+ target: null,
+ data: {
+ global: null,
+ },
+ };
+ /**
+ * The interaction manager deals with mouse, touch and pointer events.
+ *
+ * Any DisplayObject can be interactive if its `interactive` property is set to true.
+ *
+ * This manager also supports multitouch.
+ *
+ * An instance of this class is automatically created by default, and can be found at `renderer.plugins.interaction`
+ *
+ * @class
+ * @extends PIXI.utils.EventEmitter
+ * @memberof PIXI
+ */
+ var InteractionManager = /** @class */ (function (_super) {
+ __extends$1(InteractionManager, _super);
+ /**
+ * @param {PIXI.CanvasRenderer|PIXI.Renderer} renderer - A reference to the current renderer
+ * @param {object} [options] - The options for the manager.
+ * @param {boolean} [options.autoPreventDefault=true] - Should the manager automatically prevent default browser actions.
+ * @param {number} [options.interactionFrequency=10] - Maximum requency (ms) at pointer over/out states will be checked.
+ * @param {number} [options.useSystemTicker=true] - Whether to add {@link tickerUpdate} to {@link PIXI.Ticker.system}.
+ */
+ function InteractionManager(renderer, options) {
+ var _this = _super.call(this) || this;
+ options = options || {};
+ /**
+ * The renderer this interaction manager works for.
+ *
+ * @member {PIXI.AbstractRenderer}
+ */
+ _this.renderer = renderer;
+ /**
+ * Should default browser actions automatically be prevented.
+ * Does not apply to pointer events for backwards compatibility
+ * preventDefault on pointer events stops mouse events from firing
+ * Thus, for every pointer event, there will always be either a mouse of touch event alongside it.
+ *
+ * @member {boolean}
+ * @default true
+ */
+ _this.autoPreventDefault = options.autoPreventDefault !== undefined ? options.autoPreventDefault : true;
+ /**
+ * Maximum requency in milliseconds at which pointer over/out states will be checked by {@link tickerUpdate}.
+ *
+ * @member {number}
+ * @default 10
+ */
+ _this.interactionFrequency = options.interactionFrequency || 10;
+ /**
+ * The mouse data
+ *
+ * @member {PIXI.InteractionData}
+ */
+ _this.mouse = new InteractionData();
+ _this.mouse.identifier = MOUSE_POINTER_ID;
+ // setting the mouse to start off far off screen will mean that mouse over does
+ // not get called before we even move the mouse.
+ _this.mouse.global.set(-999999);
+ /**
+ * Actively tracked InteractionData
+ *
+ * @private
+ * @member {Object.}
+ */
+ _this.activeInteractionData = {};
+ _this.activeInteractionData[MOUSE_POINTER_ID] = _this.mouse;
+ /**
+ * Pool of unused InteractionData
+ *
+ * @private
+ * @member {PIXI.InteractionData[]}
+ */
+ _this.interactionDataPool = [];
+ /**
+ * An event data object to handle all the event tracking/dispatching
+ *
+ * @member {object}
+ */
+ _this.eventData = new InteractionEvent();
+ /**
+ * The DOM element to bind to.
+ *
+ * @protected
+ * @member {HTMLElement}
+ */
+ _this.interactionDOMElement = null;
+ /**
+ * This property determines if mousemove and touchmove events are fired only when the cursor
+ * is over the object.
+ * Setting to true will make things work more in line with how the DOM version works.
+ * Setting to false can make things easier for things like dragging
+ * It is currently set to false as this is how PixiJS used to work. This will be set to true in
+ * future versions of pixi.
+ *
+ * @member {boolean}
+ * @default false
+ */
+ _this.moveWhenInside = false;
+ /**
+ * Have events been attached to the dom element?
+ *
+ * @protected
+ * @member {boolean}
+ */
+ _this.eventsAdded = false;
+ /**
+ * Has the system ticker been added?
+ *
+ * @protected
+ * @member {boolean}
+ */
+ _this.tickerAdded = false;
+ /**
+ * Is the mouse hovering over the renderer?
+ *
+ * @protected
+ * @member {boolean}
+ */
+ _this.mouseOverRenderer = false;
+ /**
+ * Does the device support touch events
+ * https://www.w3.org/TR/touch-events/
+ *
+ * @readonly
+ * @member {boolean}
+ */
+ _this.supportsTouchEvents = 'ontouchstart' in window;
+ /**
+ * Does the device support pointer events
+ * https://www.w3.org/Submission/pointer-events/
+ *
+ * @readonly
+ * @member {boolean}
+ */
+ _this.supportsPointerEvents = !!window.PointerEvent;
+ // this will make it so that you don't have to call bind all the time
+ /**
+ * @private
+ * @member {Function}
+ */
+ _this.onPointerUp = _this.onPointerUp.bind(_this);
+ _this.processPointerUp = _this.processPointerUp.bind(_this);
+ /**
+ * @private
+ * @member {Function}
+ */
+ _this.onPointerCancel = _this.onPointerCancel.bind(_this);
+ _this.processPointerCancel = _this.processPointerCancel.bind(_this);
+ /**
+ * @private
+ * @member {Function}
+ */
+ _this.onPointerDown = _this.onPointerDown.bind(_this);
+ _this.processPointerDown = _this.processPointerDown.bind(_this);
+ /**
+ * @private
+ * @member {Function}
+ */
+ _this.onPointerMove = _this.onPointerMove.bind(_this);
+ _this.processPointerMove = _this.processPointerMove.bind(_this);
+ /**
+ * @private
+ * @member {Function}
+ */
+ _this.onPointerOut = _this.onPointerOut.bind(_this);
+ _this.processPointerOverOut = _this.processPointerOverOut.bind(_this);
+ /**
+ * @private
+ * @member {Function}
+ */
+ _this.onPointerOver = _this.onPointerOver.bind(_this);
+ /**
+ * Dictionary of how different cursor modes are handled. Strings are handled as CSS cursor
+ * values, objects are handled as dictionaries of CSS values for interactionDOMElement,
+ * and functions are called instead of changing the CSS.
+ * Default CSS cursor values are provided for 'default' and 'pointer' modes.
+ * @member {Object.}
+ */
+ _this.cursorStyles = {
+ default: 'inherit',
+ pointer: 'pointer',
+ };
+ /**
+ * The mode of the cursor that is being used.
+ * The value of this is a key from the cursorStyles dictionary.
+ *
+ * @member {string}
+ */
+ _this.currentCursorMode = null;
+ /**
+ * Internal cached let.
+ *
+ * @private
+ * @member {string}
+ */
+ _this.cursor = null;
+ /**
+ * The current resolution / device pixel ratio.
+ *
+ * @member {number}
+ * @default 1
+ */
+ _this.resolution = 1;
+ /**
+ * Delayed pointer events. Used to guarantee correct ordering of over/out events.
+ *
+ * @private
+ * @member {Array}
+ */
+ _this.delayedEvents = [];
+ /**
+ * TreeSearch component that is used to hitTest stage tree
+ *
+ * @private
+ * @member {PIXI.TreeSearch}
+ */
+ _this.search = new TreeSearch();
+ /**
+ * Used as a last rendered object in case renderer doesnt have _lastObjectRendered
+ * @member {DisplayObject}
+ * @private
+ */
+ _this._tempDisplayObject = new TemporaryDisplayObject();
+ /**
+ * Fired when a pointer device button (usually a mouse left-button) is pressed on the display
+ * object.
+ *
+ * @event PIXI.InteractionManager#mousedown
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a pointer device secondary button (usually a mouse right-button) is pressed
+ * on the display object.
+ *
+ * @event PIXI.InteractionManager#rightdown
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a pointer device button (usually a mouse left-button) is released over the display
+ * object.
+ *
+ * @event PIXI.InteractionManager#mouseup
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a pointer device secondary button (usually a mouse right-button) is released
+ * over the display object.
+ *
+ * @event PIXI.InteractionManager#rightup
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a pointer device button (usually a mouse left-button) is pressed and released on
+ * the display object.
+ *
+ * @event PIXI.InteractionManager#click
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a pointer device secondary button (usually a mouse right-button) is pressed
+ * and released on the display object.
+ *
+ * @event PIXI.InteractionManager#rightclick
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a pointer device button (usually a mouse left-button) is released outside the
+ * display object that initially registered a
+ * [mousedown]{@link PIXI.InteractionManager#event:mousedown}.
+ *
+ * @event PIXI.InteractionManager#mouseupoutside
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a pointer device secondary button (usually a mouse right-button) is released
+ * outside the display object that initially registered a
+ * [rightdown]{@link PIXI.InteractionManager#event:rightdown}.
+ *
+ * @event PIXI.InteractionManager#rightupoutside
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a pointer device (usually a mouse) is moved while over the display object
+ *
+ * @event PIXI.InteractionManager#mousemove
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a pointer device (usually a mouse) is moved onto the display object
+ *
+ * @event PIXI.InteractionManager#mouseover
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a pointer device (usually a mouse) is moved off the display object
+ *
+ * @event PIXI.InteractionManager#mouseout
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a pointer device button is pressed on the display object.
+ *
+ * @event PIXI.InteractionManager#pointerdown
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a pointer device button is released over the display object.
+ * Not always fired when some buttons are held down while others are released. In those cases,
+ * use [mousedown]{@link PIXI.InteractionManager#event:mousedown} and
+ * [mouseup]{@link PIXI.InteractionManager#event:mouseup} instead.
+ *
+ * @event PIXI.InteractionManager#pointerup
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when the operating system cancels a pointer event
+ *
+ * @event PIXI.InteractionManager#pointercancel
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a pointer device button is pressed and released on the display object.
+ *
+ * @event PIXI.InteractionManager#pointertap
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a pointer device button is released outside the display object that initially
+ * registered a [pointerdown]{@link PIXI.InteractionManager#event:pointerdown}.
+ *
+ * @event PIXI.InteractionManager#pointerupoutside
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a pointer device is moved while over the display object
+ *
+ * @event PIXI.InteractionManager#pointermove
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a pointer device is moved onto the display object
+ *
+ * @event PIXI.InteractionManager#pointerover
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a pointer device is moved off the display object
+ *
+ * @event PIXI.InteractionManager#pointerout
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a touch point is placed on the display object.
+ *
+ * @event PIXI.InteractionManager#touchstart
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a touch point is removed from the display object.
+ *
+ * @event PIXI.InteractionManager#touchend
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when the operating system cancels a touch
+ *
+ * @event PIXI.InteractionManager#touchcancel
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a touch point is placed and removed from the display object.
+ *
+ * @event PIXI.InteractionManager#tap
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a touch point is removed outside of the display object that initially
+ * registered a [touchstart]{@link PIXI.InteractionManager#event:touchstart}.
+ *
+ * @event PIXI.InteractionManager#touchendoutside
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a touch point is moved along the display object.
+ *
+ * @event PIXI.InteractionManager#touchmove
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a pointer device button (usually a mouse left-button) is pressed on the display.
+ * object. DisplayObject's `interactive` property must be set to `true` to fire event.
+ *
+ * @event PIXI.DisplayObject#mousedown
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a pointer device secondary button (usually a mouse right-button) is pressed
+ * on the display object. DisplayObject's `interactive` property must be set to `true` to fire event.
+ *
+ * @event PIXI.DisplayObject#rightdown
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a pointer device button (usually a mouse left-button) is released over the display
+ * object. DisplayObject's `interactive` property must be set to `true` to fire event.
+ *
+ * @event PIXI.DisplayObject#mouseup
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a pointer device secondary button (usually a mouse right-button) is released
+ * over the display object. DisplayObject's `interactive` property must be set to `true` to fire event.
+ *
+ * @event PIXI.DisplayObject#rightup
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a pointer device button (usually a mouse left-button) is pressed and released on
+ * the display object. DisplayObject's `interactive` property must be set to `true` to fire event.
+ *
+ * @event PIXI.DisplayObject#click
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a pointer device secondary button (usually a mouse right-button) is pressed
+ * and released on the display object. DisplayObject's `interactive` property must be set to `true` to fire event.
+ *
+ * @event PIXI.DisplayObject#rightclick
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a pointer device button (usually a mouse left-button) is released outside the
+ * display object that initially registered a
+ * [mousedown]{@link PIXI.DisplayObject#event:mousedown}.
+ * DisplayObject's `interactive` property must be set to `true` to fire event.
+ *
+ * @event PIXI.DisplayObject#mouseupoutside
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a pointer device secondary button (usually a mouse right-button) is released
+ * outside the display object that initially registered a
+ * [rightdown]{@link PIXI.DisplayObject#event:rightdown}.
+ * DisplayObject's `interactive` property must be set to `true` to fire event.
+ *
+ * @event PIXI.DisplayObject#rightupoutside
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a pointer device (usually a mouse) is moved while over the display object.
+ * DisplayObject's `interactive` property must be set to `true` to fire event.
+ *
+ * @event PIXI.DisplayObject#mousemove
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a pointer device (usually a mouse) is moved onto the display object.
+ * DisplayObject's `interactive` property must be set to `true` to fire event.
+ *
+ * @event PIXI.DisplayObject#mouseover
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a pointer device (usually a mouse) is moved off the display object.
+ * DisplayObject's `interactive` property must be set to `true` to fire event.
+ *
+ * @event PIXI.DisplayObject#mouseout
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a pointer device button is pressed on the display object.
+ * DisplayObject's `interactive` property must be set to `true` to fire event.
+ *
+ * @event PIXI.DisplayObject#pointerdown
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a pointer device button is released over the display object.
+ * DisplayObject's `interactive` property must be set to `true` to fire event.
+ *
+ * @event PIXI.DisplayObject#pointerup
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when the operating system cancels a pointer event.
+ * DisplayObject's `interactive` property must be set to `true` to fire event.
+ *
+ * @event PIXI.DisplayObject#pointercancel
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a pointer device button is pressed and released on the display object.
+ * DisplayObject's `interactive` property must be set to `true` to fire event.
+ *
+ * @event PIXI.DisplayObject#pointertap
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a pointer device button is released outside the display object that initially
+ * registered a [pointerdown]{@link PIXI.DisplayObject#event:pointerdown}.
+ * DisplayObject's `interactive` property must be set to `true` to fire event.
+ *
+ * @event PIXI.DisplayObject#pointerupoutside
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a pointer device is moved while over the display object.
+ * DisplayObject's `interactive` property must be set to `true` to fire event.
+ *
+ * @event PIXI.DisplayObject#pointermove
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a pointer device is moved onto the display object.
+ * DisplayObject's `interactive` property must be set to `true` to fire event.
+ *
+ * @event PIXI.DisplayObject#pointerover
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a pointer device is moved off the display object.
+ * DisplayObject's `interactive` property must be set to `true` to fire event.
+ *
+ * @event PIXI.DisplayObject#pointerout
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a touch point is placed on the display object.
+ * DisplayObject's `interactive` property must be set to `true` to fire event.
+ *
+ * @event PIXI.DisplayObject#touchstart
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a touch point is removed from the display object.
+ * DisplayObject's `interactive` property must be set to `true` to fire event.
+ *
+ * @event PIXI.DisplayObject#touchend
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when the operating system cancels a touch.
+ * DisplayObject's `interactive` property must be set to `true` to fire event.
+ *
+ * @event PIXI.DisplayObject#touchcancel
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a touch point is placed and removed from the display object.
+ * DisplayObject's `interactive` property must be set to `true` to fire event.
+ *
+ * @event PIXI.DisplayObject#tap
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a touch point is removed outside of the display object that initially
+ * registered a [touchstart]{@link PIXI.DisplayObject#event:touchstart}.
+ * DisplayObject's `interactive` property must be set to `true` to fire event.
+ *
+ * @event PIXI.DisplayObject#touchendoutside
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ /**
+ * Fired when a touch point is moved along the display object.
+ * DisplayObject's `interactive` property must be set to `true` to fire event.
+ *
+ * @event PIXI.DisplayObject#touchmove
+ * @param {PIXI.InteractionEvent} event - Interaction event
+ */
+ _this._useSystemTicker = options.useSystemTicker !== undefined ? options.useSystemTicker : true;
+ _this.setTargetElement(_this.renderer.view, _this.renderer.resolution);
+ return _this;
+ }
+ Object.defineProperty(InteractionManager.prototype, "useSystemTicker", {
+ /**
+ * Should the InteractionManager automatically add {@link tickerUpdate} to {@link PIXI.Ticker.system}.
+ *
+ * @member {boolean}
+ * @default true
+ */
+ get: function () {
+ return this._useSystemTicker;
+ },
+ set: function (useSystemTicker) {
+ this._useSystemTicker = useSystemTicker;
+ if (useSystemTicker) {
+ this.addTickerListener();
+ }
+ else {
+ this.removeTickerListener();
+ }
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(InteractionManager.prototype, "lastObjectRendered", {
+ /**
+ * Last rendered object or temp object
+ * @readonly
+ * @protected
+ * @member {PIXI.DisplayObject}
+ */
+ get: function () {
+ return this.renderer._lastObjectRendered || this._tempDisplayObject;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ /**
+ * Hit tests a point against the display tree, returning the first interactive object that is hit.
+ *
+ * @param {PIXI.Point} globalPoint - A point to hit test with, in global space.
+ * @param {PIXI.Container} [root] - The root display object to start from. If omitted, defaults
+ * to the last rendered root of the associated renderer.
+ * @return {PIXI.DisplayObject} The hit display object, if any.
+ */
+ InteractionManager.prototype.hitTest = function (globalPoint, root) {
+ // clear the target for our hit test
+ hitTestEvent.target = null;
+ // assign the global point
+ hitTestEvent.data.global = globalPoint;
+ // ensure safety of the root
+ if (!root) {
+ root = this.lastObjectRendered;
+ }
+ // run the hit test
+ this.processInteractive(hitTestEvent, root, null, true);
+ // return our found object - it'll be null if we didn't hit anything
+ return hitTestEvent.target;
+ };
+ /**
+ * Sets the DOM element which will receive mouse/touch events. This is useful for when you have
+ * other DOM elements on top of the renderers Canvas element. With this you'll be bale to delegate
+ * another DOM element to receive those events.
+ *
+ * @param {HTMLElement} element - the DOM element which will receive mouse and touch events.
+ * @param {number} [resolution=1] - The resolution / device pixel ratio of the new element (relative to the canvas).
+ */
+ InteractionManager.prototype.setTargetElement = function (element, resolution) {
+ if (resolution === void 0) { resolution = 1; }
+ this.removeTickerListener();
+ this.removeEvents();
+ this.interactionDOMElement = element;
+ this.resolution = resolution;
+ this.addEvents();
+ this.addTickerListener();
+ };
+ /**
+ * Add the ticker listener
+ *
+ * @private
+ */
+ InteractionManager.prototype.addTickerListener = function () {
+ if (this.tickerAdded || !this.interactionDOMElement || !this._useSystemTicker) {
+ return;
+ }
+ Ticker.system.add(this.tickerUpdate, this, exports.UPDATE_PRIORITY.INTERACTION);
+ this.tickerAdded = true;
+ };
+ /**
+ * Remove the ticker listener
+ *
+ * @private
+ */
+ InteractionManager.prototype.removeTickerListener = function () {
+ if (!this.tickerAdded) {
+ return;
+ }
+ Ticker.system.remove(this.tickerUpdate, this);
+ this.tickerAdded = false;
+ };
+ /**
+ * Registers all the DOM events
+ *
+ * @private
+ */
+ InteractionManager.prototype.addEvents = function () {
+ if (this.eventsAdded || !this.interactionDOMElement) {
+ return;
+ }
+ var style = this.interactionDOMElement.style;
+ if (window.navigator.msPointerEnabled) {
+ style.msContentZooming = 'none';
+ style.msTouchAction = 'none';
+ }
+ else if (this.supportsPointerEvents) {
+ style.touchAction = 'none';
+ }
+ /**
+ * These events are added first, so that if pointer events are normalized, they are fired
+ * in the same order as non-normalized events. ie. pointer event 1st, mouse / touch 2nd
+ */
+ if (this.supportsPointerEvents) {
+ window.document.addEventListener('pointermove', this.onPointerMove, true);
+ this.interactionDOMElement.addEventListener('pointerdown', this.onPointerDown, true);
+ // pointerout is fired in addition to pointerup (for touch events) and pointercancel
+ // we already handle those, so for the purposes of what we do in onPointerOut, we only
+ // care about the pointerleave event
+ this.interactionDOMElement.addEventListener('pointerleave', this.onPointerOut, true);
+ this.interactionDOMElement.addEventListener('pointerover', this.onPointerOver, true);
+ window.addEventListener('pointercancel', this.onPointerCancel, true);
+ window.addEventListener('pointerup', this.onPointerUp, true);
+ }
+ else {
+ window.document.addEventListener('mousemove', this.onPointerMove, true);
+ this.interactionDOMElement.addEventListener('mousedown', this.onPointerDown, true);
+ this.interactionDOMElement.addEventListener('mouseout', this.onPointerOut, true);
+ this.interactionDOMElement.addEventListener('mouseover', this.onPointerOver, true);
+ window.addEventListener('mouseup', this.onPointerUp, true);
+ }
+ // always look directly for touch events so that we can provide original data
+ // In a future version we should change this to being just a fallback and rely solely on
+ // PointerEvents whenever available
+ if (this.supportsTouchEvents) {
+ this.interactionDOMElement.addEventListener('touchstart', this.onPointerDown, true);
+ this.interactionDOMElement.addEventListener('touchcancel', this.onPointerCancel, true);
+ this.interactionDOMElement.addEventListener('touchend', this.onPointerUp, true);
+ this.interactionDOMElement.addEventListener('touchmove', this.onPointerMove, true);
+ }
+ this.eventsAdded = true;
+ };
+ /**
+ * Removes all the DOM events that were previously registered
+ *
+ * @private
+ */
+ InteractionManager.prototype.removeEvents = function () {
+ if (!this.eventsAdded || !this.interactionDOMElement) {
+ return;
+ }
+ var style = this.interactionDOMElement.style;
+ if (window.navigator.msPointerEnabled) {
+ style.msContentZooming = '';
+ style.msTouchAction = '';
+ }
+ else if (this.supportsPointerEvents) {
+ style.touchAction = '';
+ }
+ if (this.supportsPointerEvents) {
+ window.document.removeEventListener('pointermove', this.onPointerMove, true);
+ this.interactionDOMElement.removeEventListener('pointerdown', this.onPointerDown, true);
+ this.interactionDOMElement.removeEventListener('pointerleave', this.onPointerOut, true);
+ this.interactionDOMElement.removeEventListener('pointerover', this.onPointerOver, true);
+ window.removeEventListener('pointercancel', this.onPointerCancel, true);
+ window.removeEventListener('pointerup', this.onPointerUp, true);
+ }
+ else {
+ window.document.removeEventListener('mousemove', this.onPointerMove, true);
+ this.interactionDOMElement.removeEventListener('mousedown', this.onPointerDown, true);
+ this.interactionDOMElement.removeEventListener('mouseout', this.onPointerOut, true);
+ this.interactionDOMElement.removeEventListener('mouseover', this.onPointerOver, true);
+ window.removeEventListener('mouseup', this.onPointerUp, true);
+ }
+ if (this.supportsTouchEvents) {
+ this.interactionDOMElement.removeEventListener('touchstart', this.onPointerDown, true);
+ this.interactionDOMElement.removeEventListener('touchcancel', this.onPointerCancel, true);
+ this.interactionDOMElement.removeEventListener('touchend', this.onPointerUp, true);
+ this.interactionDOMElement.removeEventListener('touchmove', this.onPointerMove, true);
+ }
+ this.interactionDOMElement = null;
+ this.eventsAdded = false;
+ };
+ /**
+ * Updates the state of interactive objects if at least {@link interactionFrequency}
+ * milliseconds have passed since the last invocation.
+ *
+ * Invoked by a throttled ticker update from {@link PIXI.Ticker.system}.
+ *
+ * @param {number} deltaTime - time delta since the last call
+ */
+ InteractionManager.prototype.tickerUpdate = function (deltaTime) {
+ this._deltaTime += deltaTime;
+ if (this._deltaTime < this.interactionFrequency) {
+ return;
+ }
+ this._deltaTime = 0;
+ this.update();
+ };
+ /**
+ * Updates the state of interactive objects.
+ */
+ InteractionManager.prototype.update = function () {
+ if (!this.interactionDOMElement) {
+ return;
+ }
+ // if the user move the mouse this check has already been done using the mouse move!
+ if (this._didMove) {
+ this._didMove = false;
+ return;
+ }
+ this.cursor = null;
+ // Resets the flag as set by a stopPropagation call. This flag is usually reset by a user interaction of any kind,
+ // but there was a scenario of a display object moving under a static mouse cursor.
+ // In this case, mouseover and mouseevents would not pass the flag test in dispatchEvent function
+ for (var k in this.activeInteractionData) {
+ // eslint-disable-next-line no-prototype-builtins
+ if (this.activeInteractionData.hasOwnProperty(k)) {
+ var interactionData = this.activeInteractionData[k];
+ if (interactionData.originalEvent && interactionData.pointerType !== 'touch') {
+ var interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, interactionData.originalEvent, interactionData);
+ this.processInteractive(interactionEvent, this.lastObjectRendered, this.processPointerOverOut, true);
+ }
+ }
+ }
+ this.setCursorMode(this.cursor);
+ };
+ /**
+ * Sets the current cursor mode, handling any callbacks or CSS style changes.
+ *
+ * @param {string} mode - cursor mode, a key from the cursorStyles dictionary
+ */
+ InteractionManager.prototype.setCursorMode = function (mode) {
+ mode = mode || 'default';
+ // if the mode didn't actually change, bail early
+ if (this.currentCursorMode === mode) {
+ return;
+ }
+ this.currentCursorMode = mode;
+ var style = this.cursorStyles[mode];
+ // only do things if there is a cursor style for it
+ if (style) {
+ switch (typeof style) {
+ case 'string':
+ // string styles are handled as cursor CSS
+ this.interactionDOMElement.style.cursor = style;
+ break;
+ case 'function':
+ // functions are just called, and passed the cursor mode
+ style(mode);
+ break;
+ case 'object':
+ // if it is an object, assume that it is a dictionary of CSS styles,
+ // apply it to the interactionDOMElement
+ Object.assign(this.interactionDOMElement.style, style);
+ break;
+ }
+ }
+ else if (typeof mode === 'string' && !Object.prototype.hasOwnProperty.call(this.cursorStyles, mode)) {
+ // if it mode is a string (not a Symbol) and cursorStyles doesn't have any entry
+ // for the mode, then assume that the dev wants it to be CSS for the cursor.
+ this.interactionDOMElement.style.cursor = mode;
+ }
+ };
+ /**
+ * Dispatches an event on the display object that was interacted with
+ *
+ * @param {PIXI.Container|PIXI.Sprite|PIXI.TilingSprite} displayObject - the display object in question
+ * @param {string} eventString - the name of the event (e.g, mousedown)
+ * @param {PIXI.InteractionEvent} eventData - the event data object
+ * @private
+ */
+ InteractionManager.prototype.dispatchEvent = function (displayObject, eventString, eventData) {
+ // Even if the event was stopped, at least dispatch any remaining events
+ // for the same display object.
+ if (!eventData.stopPropagationHint || displayObject === eventData.stopsPropagatingAt) {
+ eventData.currentTarget = displayObject;
+ eventData.type = eventString;
+ displayObject.emit(eventString, eventData);
+ if (displayObject[eventString]) {
+ displayObject[eventString](eventData);
+ }
+ }
+ };
+ /**
+ * Puts a event on a queue to be dispatched later. This is used to guarantee correct
+ * ordering of over/out events.
+ *
+ * @param {PIXI.Container|PIXI.Sprite|PIXI.TilingSprite} displayObject - the display object in question
+ * @param {string} eventString - the name of the event (e.g, mousedown)
+ * @param {object} eventData - the event data object
+ * @private
+ */
+ InteractionManager.prototype.delayDispatchEvent = function (displayObject, eventString, eventData) {
+ this.delayedEvents.push({ displayObject: displayObject, eventString: eventString, eventData: eventData });
+ };
+ /**
+ * Maps x and y coords from a DOM object and maps them correctly to the PixiJS view. The
+ * resulting value is stored in the point. This takes into account the fact that the DOM
+ * element could be scaled and positioned anywhere on the screen.
+ *
+ * @param {PIXI.IPointData} point - the point that the result will be stored in
+ * @param {number} x - the x coord of the position to map
+ * @param {number} y - the y coord of the position to map
+ */
+ InteractionManager.prototype.mapPositionToPoint = function (point, x, y) {
+ var rect;
+ // IE 11 fix
+ if (!this.interactionDOMElement.parentElement) {
+ rect = { x: 0, y: 0, width: 0, height: 0 };
+ }
+ else {
+ rect = this.interactionDOMElement.getBoundingClientRect();
+ }
+ var resolutionMultiplier = 1.0 / this.resolution;
+ point.x = ((x - rect.left) * (this.interactionDOMElement.width / rect.width)) * resolutionMultiplier;
+ point.y = ((y - rect.top) * (this.interactionDOMElement.height / rect.height)) * resolutionMultiplier;
+ };
+ /**
+ * This function is provides a neat way of crawling through the scene graph and running a
+ * specified function on all interactive objects it finds. It will also take care of hit
+ * testing the interactive objects and passes the hit across in the function.
+ *
+ * @protected
+ * @param {PIXI.InteractionEvent} interactionEvent - event containing the point that
+ * is tested for collision
+ * @param {PIXI.Container|PIXI.Sprite|PIXI.TilingSprite} displayObject - the displayObject
+ * that will be hit test (recursively crawls its children)
+ * @param {Function} [func] - the function that will be called on each interactive object. The
+ * interactionEvent, displayObject and hit will be passed to the function
+ * @param {boolean} [hitTest] - indicates whether we want to calculate hits
+ * or just iterate through all interactive objects
+ */
+ InteractionManager.prototype.processInteractive = function (interactionEvent, displayObject, func, hitTest) {
+ var hit = this.search.findHit(interactionEvent, displayObject, func, hitTest);
+ var delayedEvents = this.delayedEvents;
+ if (!delayedEvents.length) {
+ return hit;
+ }
+ // Reset the propagation hint, because we start deeper in the tree again.
+ interactionEvent.stopPropagationHint = false;
+ var delayedLen = delayedEvents.length;
+ this.delayedEvents = [];
+ for (var i = 0; i < delayedLen; i++) {
+ var _a = delayedEvents[i], displayObject_1 = _a.displayObject, eventString = _a.eventString, eventData = _a.eventData;
+ // When we reach the object we wanted to stop propagating at,
+ // set the propagation hint.
+ if (eventData.stopsPropagatingAt === displayObject_1) {
+ eventData.stopPropagationHint = true;
+ }
+ this.dispatchEvent(displayObject_1, eventString, eventData);
+ }
+ return hit;
+ };
+ /**
+ * Is called when the pointer button is pressed down on the renderer element
+ *
+ * @private
+ * @param {PointerEvent} originalEvent - The DOM event of a pointer button being pressed down
+ */
+ InteractionManager.prototype.onPointerDown = function (originalEvent) {
+ // if we support touch events, then only use those for touch events, not pointer events
+ if (this.supportsTouchEvents && originalEvent.pointerType === 'touch')
+ { return; }
+ var events = this.normalizeToPointerData(originalEvent);
+ /**
+ * No need to prevent default on natural pointer events, as there are no side effects
+ * Normalized events, however, may have the double mousedown/touchstart issue on the native android browser,
+ * so still need to be prevented.
+ */
+ // Guaranteed that there will be at least one event in events, and all events must have the same pointer type
+ if (this.autoPreventDefault && events[0].isNormalized) {
+ var cancelable = originalEvent.cancelable || !('cancelable' in originalEvent);
+ if (cancelable) {
+ originalEvent.preventDefault();
+ }
+ }
+ var eventLen = events.length;
+ for (var i = 0; i < eventLen; i++) {
+ var event = events[i];
+ var interactionData = this.getInteractionDataForPointerId(event);
+ var interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);
+ interactionEvent.data.originalEvent = originalEvent;
+ this.processInteractive(interactionEvent, this.lastObjectRendered, this.processPointerDown, true);
+ this.emit('pointerdown', interactionEvent);
+ if (event.pointerType === 'touch') {
+ this.emit('touchstart', interactionEvent);
+ }
+ // emit a mouse event for "pen" pointers, the way a browser would emit a fallback event
+ else if (event.pointerType === 'mouse' || event.pointerType === 'pen') {
+ var isRightButton = event.button === 2;
+ this.emit(isRightButton ? 'rightdown' : 'mousedown', this.eventData);
+ }
+ }
+ };
+ /**
+ * Processes the result of the pointer down check and dispatches the event if need be
+ *
+ * @private
+ * @param {PIXI.InteractionEvent} interactionEvent - The interaction event wrapping the DOM event
+ * @param {PIXI.Container|PIXI.Sprite|PIXI.TilingSprite} displayObject - The display object that was tested
+ * @param {boolean} hit - the result of the hit test on the display object
+ */
+ InteractionManager.prototype.processPointerDown = function (interactionEvent, displayObject, hit) {
+ var data = interactionEvent.data;
+ var id = interactionEvent.data.identifier;
+ if (hit) {
+ if (!displayObject.trackedPointers[id]) {
+ displayObject.trackedPointers[id] = new InteractionTrackingData(id);
+ }
+ this.dispatchEvent(displayObject, 'pointerdown', interactionEvent);
+ if (data.pointerType === 'touch') {
+ this.dispatchEvent(displayObject, 'touchstart', interactionEvent);
+ }
+ else if (data.pointerType === 'mouse' || data.pointerType === 'pen') {
+ var isRightButton = data.button === 2;
+ if (isRightButton) {
+ displayObject.trackedPointers[id].rightDown = true;
+ }
+ else {
+ displayObject.trackedPointers[id].leftDown = true;
+ }
+ this.dispatchEvent(displayObject, isRightButton ? 'rightdown' : 'mousedown', interactionEvent);
+ }
+ }
+ };
+ /**
+ * Is called when the pointer button is released on the renderer element
+ *
+ * @private
+ * @param {PointerEvent} originalEvent - The DOM event of a pointer button being released
+ * @param {boolean} cancelled - true if the pointer is cancelled
+ * @param {Function} func - Function passed to {@link processInteractive}
+ */
+ InteractionManager.prototype.onPointerComplete = function (originalEvent, cancelled, func) {
+ var events = this.normalizeToPointerData(originalEvent);
+ var eventLen = events.length;
+ // if the event wasn't targeting our canvas, then consider it to be pointerupoutside
+ // in all cases (unless it was a pointercancel)
+ var eventAppend = originalEvent.target !== this.interactionDOMElement ? 'outside' : '';
+ for (var i = 0; i < eventLen; i++) {
+ var event = events[i];
+ var interactionData = this.getInteractionDataForPointerId(event);
+ var interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);
+ interactionEvent.data.originalEvent = originalEvent;
+ // perform hit testing for events targeting our canvas or cancel events
+ this.processInteractive(interactionEvent, this.lastObjectRendered, func, cancelled || !eventAppend);
+ this.emit(cancelled ? 'pointercancel' : "pointerup" + eventAppend, interactionEvent);
+ if (event.pointerType === 'mouse' || event.pointerType === 'pen') {
+ var isRightButton = event.button === 2;
+ this.emit(isRightButton ? "rightup" + eventAppend : "mouseup" + eventAppend, interactionEvent);
+ }
+ else if (event.pointerType === 'touch') {
+ this.emit(cancelled ? 'touchcancel' : "touchend" + eventAppend, interactionEvent);
+ this.releaseInteractionDataForPointerId(event.pointerId);
+ }
+ }
+ };
+ /**
+ * Is called when the pointer button is cancelled
+ *
+ * @private
+ * @param {PointerEvent} event - The DOM event of a pointer button being released
+ */
+ InteractionManager.prototype.onPointerCancel = function (event) {
+ // if we support touch events, then only use those for touch events, not pointer events
+ if (this.supportsTouchEvents && event.pointerType === 'touch')
+ { return; }
+ this.onPointerComplete(event, true, this.processPointerCancel);
+ };
+ /**
+ * Processes the result of the pointer cancel check and dispatches the event if need be
+ *
+ * @private
+ * @param {PIXI.InteractionEvent} interactionEvent - The interaction event wrapping the DOM event
+ * @param {PIXI.Container|PIXI.Sprite|PIXI.TilingSprite} displayObject - The display object that was tested
+ */
+ InteractionManager.prototype.processPointerCancel = function (interactionEvent, displayObject) {
+ var data = interactionEvent.data;
+ var id = interactionEvent.data.identifier;
+ if (displayObject.trackedPointers[id] !== undefined) {
+ delete displayObject.trackedPointers[id];
+ this.dispatchEvent(displayObject, 'pointercancel', interactionEvent);
+ if (data.pointerType === 'touch') {
+ this.dispatchEvent(displayObject, 'touchcancel', interactionEvent);
+ }
+ }
+ };
+ /**
+ * Is called when the pointer button is released on the renderer element
+ *
+ * @private
+ * @param {PointerEvent} event - The DOM event of a pointer button being released
+ */
+ InteractionManager.prototype.onPointerUp = function (event) {
+ // if we support touch events, then only use those for touch events, not pointer events
+ if (this.supportsTouchEvents && event.pointerType === 'touch')
+ { return; }
+ this.onPointerComplete(event, false, this.processPointerUp);
+ };
+ /**
+ * Processes the result of the pointer up check and dispatches the event if need be
+ *
+ * @private
+ * @param {PIXI.InteractionEvent} interactionEvent - The interaction event wrapping the DOM event
+ * @param {PIXI.Container|PIXI.Sprite|PIXI.TilingSprite} displayObject - The display object that was tested
+ * @param {boolean} hit - the result of the hit test on the display object
+ */
+ InteractionManager.prototype.processPointerUp = function (interactionEvent, displayObject, hit) {
+ var data = interactionEvent.data;
+ var id = interactionEvent.data.identifier;
+ var trackingData = displayObject.trackedPointers[id];
+ var isTouch = data.pointerType === 'touch';
+ var isMouse = (data.pointerType === 'mouse' || data.pointerType === 'pen');
+ // need to track mouse down status in the mouse block so that we can emit
+ // event in a later block
+ var isMouseTap = false;
+ // Mouse only
+ if (isMouse) {
+ var isRightButton = data.button === 2;
+ var flags = InteractionTrackingData.FLAGS;
+ var test = isRightButton ? flags.RIGHT_DOWN : flags.LEFT_DOWN;
+ var isDown = trackingData !== undefined && (trackingData.flags & test);
+ if (hit) {
+ this.dispatchEvent(displayObject, isRightButton ? 'rightup' : 'mouseup', interactionEvent);
+ if (isDown) {
+ this.dispatchEvent(displayObject, isRightButton ? 'rightclick' : 'click', interactionEvent);
+ // because we can confirm that the mousedown happened on this object, flag for later emit of pointertap
+ isMouseTap = true;
+ }
+ }
+ else if (isDown) {
+ this.dispatchEvent(displayObject, isRightButton ? 'rightupoutside' : 'mouseupoutside', interactionEvent);
+ }
+ // update the down state of the tracking data
+ if (trackingData) {
+ if (isRightButton) {
+ trackingData.rightDown = false;
+ }
+ else {
+ trackingData.leftDown = false;
+ }
+ }
+ }
+ // Pointers and Touches, and Mouse
+ if (hit) {
+ this.dispatchEvent(displayObject, 'pointerup', interactionEvent);
+ if (isTouch)
+ { this.dispatchEvent(displayObject, 'touchend', interactionEvent); }
+ if (trackingData) {
+ // emit pointertap if not a mouse, or if the mouse block decided it was a tap
+ if (!isMouse || isMouseTap) {
+ this.dispatchEvent(displayObject, 'pointertap', interactionEvent);
+ }
+ if (isTouch) {
+ this.dispatchEvent(displayObject, 'tap', interactionEvent);
+ // touches are no longer over (if they ever were) when we get the touchend
+ // so we should ensure that we don't keep pretending that they are
+ trackingData.over = false;
+ }
+ }
+ }
+ else if (trackingData) {
+ this.dispatchEvent(displayObject, 'pointerupoutside', interactionEvent);
+ if (isTouch)
+ { this.dispatchEvent(displayObject, 'touchendoutside', interactionEvent); }
+ }
+ // Only remove the tracking data if there is no over/down state still associated with it
+ if (trackingData && trackingData.none) {
+ delete displayObject.trackedPointers[id];
+ }
+ };
+ /**
+ * Is called when the pointer moves across the renderer element
+ *
+ * @private
+ * @param {PointerEvent} originalEvent - The DOM event of a pointer moving
+ */
+ InteractionManager.prototype.onPointerMove = function (originalEvent) {
+ // if we support touch events, then only use those for touch events, not pointer events
+ if (this.supportsTouchEvents && originalEvent.pointerType === 'touch')
+ { return; }
+ var events = this.normalizeToPointerData(originalEvent);
+ if (events[0].pointerType === 'mouse' || events[0].pointerType === 'pen') {
+ this._didMove = true;
+ this.cursor = null;
+ }
+ var eventLen = events.length;
+ for (var i = 0; i < eventLen; i++) {
+ var event = events[i];
+ var interactionData = this.getInteractionDataForPointerId(event);
+ var interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);
+ interactionEvent.data.originalEvent = originalEvent;
+ this.processInteractive(interactionEvent, this.lastObjectRendered, this.processPointerMove, true);
+ this.emit('pointermove', interactionEvent);
+ if (event.pointerType === 'touch')
+ { this.emit('touchmove', interactionEvent); }
+ if (event.pointerType === 'mouse' || event.pointerType === 'pen')
+ { this.emit('mousemove', interactionEvent); }
+ }
+ if (events[0].pointerType === 'mouse') {
+ this.setCursorMode(this.cursor);
+ // TODO BUG for parents interactive object (border order issue)
+ }
+ };
+ /**
+ * Processes the result of the pointer move check and dispatches the event if need be
+ *
+ * @private
+ * @param {PIXI.InteractionEvent} interactionEvent - The interaction event wrapping the DOM event
+ * @param {PIXI.Container|PIXI.Sprite|PIXI.TilingSprite} displayObject - The display object that was tested
+ * @param {boolean} hit - the result of the hit test on the display object
+ */
+ InteractionManager.prototype.processPointerMove = function (interactionEvent, displayObject, hit) {
+ var data = interactionEvent.data;
+ var isTouch = data.pointerType === 'touch';
+ var isMouse = (data.pointerType === 'mouse' || data.pointerType === 'pen');
+ if (isMouse) {
+ this.processPointerOverOut(interactionEvent, displayObject, hit);
+ }
+ if (!this.moveWhenInside || hit) {
+ this.dispatchEvent(displayObject, 'pointermove', interactionEvent);
+ if (isTouch)
+ { this.dispatchEvent(displayObject, 'touchmove', interactionEvent); }
+ if (isMouse)
+ { this.dispatchEvent(displayObject, 'mousemove', interactionEvent); }
+ }
+ };
+ /**
+ * Is called when the pointer is moved out of the renderer element
+ *
+ * @private
+ * @param {PointerEvent} originalEvent - The DOM event of a pointer being moved out
+ */
+ InteractionManager.prototype.onPointerOut = function (originalEvent) {
+ // if we support touch events, then only use those for touch events, not pointer events
+ if (this.supportsTouchEvents && originalEvent.pointerType === 'touch')
+ { return; }
+ var events = this.normalizeToPointerData(originalEvent);
+ // Only mouse and pointer can call onPointerOut, so events will always be length 1
+ var event = events[0];
+ if (event.pointerType === 'mouse') {
+ this.mouseOverRenderer = false;
+ this.setCursorMode(null);
+ }
+ var interactionData = this.getInteractionDataForPointerId(event);
+ var interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);
+ interactionEvent.data.originalEvent = event;
+ this.processInteractive(interactionEvent, this.lastObjectRendered, this.processPointerOverOut, false);
+ this.emit('pointerout', interactionEvent);
+ if (event.pointerType === 'mouse' || event.pointerType === 'pen') {
+ this.emit('mouseout', interactionEvent);
+ }
+ else {
+ // we can get touchleave events after touchend, so we want to make sure we don't
+ // introduce memory leaks
+ this.releaseInteractionDataForPointerId(interactionData.identifier);
+ }
+ };
+ /**
+ * Processes the result of the pointer over/out check and dispatches the event if need be
+ *
+ * @private
+ * @param {PIXI.InteractionEvent} interactionEvent - The interaction event wrapping the DOM event
+ * @param {PIXI.Container|PIXI.Sprite|PIXI.TilingSprite} displayObject - The display object that was tested
+ * @param {boolean} hit - the result of the hit test on the display object
+ */
+ InteractionManager.prototype.processPointerOverOut = function (interactionEvent, displayObject, hit) {
+ var data = interactionEvent.data;
+ var id = interactionEvent.data.identifier;
+ var isMouse = (data.pointerType === 'mouse' || data.pointerType === 'pen');
+ var trackingData = displayObject.trackedPointers[id];
+ // if we just moused over the display object, then we need to track that state
+ if (hit && !trackingData) {
+ trackingData = displayObject.trackedPointers[id] = new InteractionTrackingData(id);
+ }
+ if (trackingData === undefined)
+ { return; }
+ if (hit && this.mouseOverRenderer) {
+ if (!trackingData.over) {
+ trackingData.over = true;
+ this.delayDispatchEvent(displayObject, 'pointerover', interactionEvent);
+ if (isMouse) {
+ this.delayDispatchEvent(displayObject, 'mouseover', interactionEvent);
+ }
+ }
+ // only change the cursor if it has not already been changed (by something deeper in the
+ // display tree)
+ if (isMouse && this.cursor === null) {
+ this.cursor = displayObject.cursor;
+ }
+ }
+ else if (trackingData.over) {
+ trackingData.over = false;
+ this.dispatchEvent(displayObject, 'pointerout', this.eventData);
+ if (isMouse) {
+ this.dispatchEvent(displayObject, 'mouseout', interactionEvent);
+ }
+ // if there is no mouse down information for the pointer, then it is safe to delete
+ if (trackingData.none) {
+ delete displayObject.trackedPointers[id];
+ }
+ }
+ };
+ /**
+ * Is called when the pointer is moved into the renderer element
+ *
+ * @private
+ * @param {PointerEvent} originalEvent - The DOM event of a pointer button being moved into the renderer view
+ */
+ InteractionManager.prototype.onPointerOver = function (originalEvent) {
+ var events = this.normalizeToPointerData(originalEvent);
+ // Only mouse and pointer can call onPointerOver, so events will always be length 1
+ var event = events[0];
+ var interactionData = this.getInteractionDataForPointerId(event);
+ var interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);
+ interactionEvent.data.originalEvent = event;
+ if (event.pointerType === 'mouse') {
+ this.mouseOverRenderer = true;
+ }
+ this.emit('pointerover', interactionEvent);
+ if (event.pointerType === 'mouse' || event.pointerType === 'pen') {
+ this.emit('mouseover', interactionEvent);
+ }
+ };
+ /**
+ * Get InteractionData for a given pointerId. Store that data as well
+ *
+ * @private
+ * @param {PointerEvent} event - Normalized pointer event, output from normalizeToPointerData
+ * @return {PIXI.InteractionData} - Interaction data for the given pointer identifier
+ */
+ InteractionManager.prototype.getInteractionDataForPointerId = function (event) {
+ var pointerId = event.pointerId;
+ var interactionData;
+ if (pointerId === MOUSE_POINTER_ID || event.pointerType === 'mouse') {
+ interactionData = this.mouse;
+ }
+ else if (this.activeInteractionData[pointerId]) {
+ interactionData = this.activeInteractionData[pointerId];
+ }
+ else {
+ interactionData = this.interactionDataPool.pop() || new InteractionData();
+ interactionData.identifier = pointerId;
+ this.activeInteractionData[pointerId] = interactionData;
+ }
+ // copy properties from the event, so that we can make sure that touch/pointer specific
+ // data is available
+ interactionData.copyEvent(event);
+ return interactionData;
+ };
+ /**
+ * Return unused InteractionData to the pool, for a given pointerId
+ *
+ * @private
+ * @param {number} pointerId - Identifier from a pointer event
+ */
+ InteractionManager.prototype.releaseInteractionDataForPointerId = function (pointerId) {
+ var interactionData = this.activeInteractionData[pointerId];
+ if (interactionData) {
+ delete this.activeInteractionData[pointerId];
+ interactionData.reset();
+ this.interactionDataPool.push(interactionData);
+ }
+ };
+ /**
+ * Configure an InteractionEvent to wrap a DOM PointerEvent and InteractionData
+ *
+ * @private
+ * @param {PIXI.InteractionEvent} interactionEvent - The event to be configured
+ * @param {PointerEvent} pointerEvent - The DOM event that will be paired with the InteractionEvent
+ * @param {PIXI.InteractionData} interactionData - The InteractionData that will be paired
+ * with the InteractionEvent
+ * @return {PIXI.InteractionEvent} the interaction event that was passed in
+ */
+ InteractionManager.prototype.configureInteractionEventForDOMEvent = function (interactionEvent, pointerEvent, interactionData) {
+ interactionEvent.data = interactionData;
+ this.mapPositionToPoint(interactionData.global, pointerEvent.clientX, pointerEvent.clientY);
+ // Not really sure why this is happening, but it's how a previous version handled things
+ if (pointerEvent.pointerType === 'touch') {
+ pointerEvent.globalX = interactionData.global.x;
+ pointerEvent.globalY = interactionData.global.y;
+ }
+ interactionData.originalEvent = pointerEvent;
+ interactionEvent.reset();
+ return interactionEvent;
+ };
+ /**
+ * Ensures that the original event object contains all data that a regular pointer event would have
+ *
+ * @private
+ * @param {TouchEvent|MouseEvent|PointerEvent} event - The original event data from a touch or mouse event
+ * @return {PointerEvent[]} An array containing a single normalized pointer event, in the case of a pointer
+ * or mouse event, or a multiple normalized pointer events if there are multiple changed touches
+ */
+ InteractionManager.prototype.normalizeToPointerData = function (event) {
+ var normalizedEvents = [];
+ if (this.supportsTouchEvents && event instanceof TouchEvent) {
+ for (var i = 0, li = event.changedTouches.length; i < li; i++) {
+ var touch = event.changedTouches[i];
+ if (typeof touch.button === 'undefined')
+ { touch.button = event.touches.length ? 1 : 0; }
+ if (typeof touch.buttons === 'undefined')
+ { touch.buttons = event.touches.length ? 1 : 0; }
+ if (typeof touch.isPrimary === 'undefined') {
+ touch.isPrimary = event.touches.length === 1 && event.type === 'touchstart';
+ }
+ if (typeof touch.width === 'undefined')
+ { touch.width = touch.radiusX || 1; }
+ if (typeof touch.height === 'undefined')
+ { touch.height = touch.radiusY || 1; }
+ if (typeof touch.tiltX === 'undefined')
+ { touch.tiltX = 0; }
+ if (typeof touch.tiltY === 'undefined')
+ { touch.tiltY = 0; }
+ if (typeof touch.pointerType === 'undefined')
+ { touch.pointerType = 'touch'; }
+ if (typeof touch.pointerId === 'undefined')
+ { touch.pointerId = touch.identifier || 0; }
+ if (typeof touch.pressure === 'undefined')
+ { touch.pressure = touch.force || 0.5; }
+ if (typeof touch.twist === 'undefined')
+ { touch.twist = 0; }
+ if (typeof touch.tangentialPressure === 'undefined')
+ { touch.tangentialPressure = 0; }
+ // TODO: Remove these, as layerX/Y is not a standard, is deprecated, has uneven
+ // support, and the fill ins are not quite the same
+ // offsetX/Y might be okay, but is not the same as clientX/Y when the canvas's top
+ // left is not 0,0 on the page
+ if (typeof touch.layerX === 'undefined')
+ { touch.layerX = touch.offsetX = touch.clientX; }
+ if (typeof touch.layerY === 'undefined')
+ { touch.layerY = touch.offsetY = touch.clientY; }
+ // mark the touch as normalized, just so that we know we did it
+ touch.isNormalized = true;
+ normalizedEvents.push(touch);
+ }
+ }
+ // apparently PointerEvent subclasses MouseEvent, so yay
+ else if (event instanceof MouseEvent && (!this.supportsPointerEvents || !(event instanceof window.PointerEvent))) {
+ var tempEvent = event;
+ if (typeof tempEvent.isPrimary === 'undefined')
+ { tempEvent.isPrimary = true; }
+ if (typeof tempEvent.width === 'undefined')
+ { tempEvent.width = 1; }
+ if (typeof tempEvent.height === 'undefined')
+ { tempEvent.height = 1; }
+ if (typeof tempEvent.tiltX === 'undefined')
+ { tempEvent.tiltX = 0; }
+ if (typeof tempEvent.tiltY === 'undefined')
+ { tempEvent.tiltY = 0; }
+ if (typeof tempEvent.pointerType === 'undefined')
+ { tempEvent.pointerType = 'mouse'; }
+ if (typeof tempEvent.pointerId === 'undefined')
+ { tempEvent.pointerId = MOUSE_POINTER_ID; }
+ if (typeof tempEvent.pressure === 'undefined')
+ { tempEvent.pressure = 0.5; }
+ if (typeof tempEvent.twist === 'undefined')
+ { tempEvent.twist = 0; }
+ if (typeof tempEvent.tangentialPressure === 'undefined')
+ { tempEvent.tangentialPressure = 0; }
+ // mark the mouse event as normalized, just so that we know we did it
+ tempEvent.isNormalized = true;
+ normalizedEvents.push(tempEvent);
+ }
+ else {
+ normalizedEvents.push(event);
+ }
+ return normalizedEvents;
+ };
+ /**
+ * Destroys the interaction manager
+ *
+ */
+ InteractionManager.prototype.destroy = function () {
+ this.removeEvents();
+ this.removeTickerListener();
+ this.removeAllListeners();
+ this.renderer = null;
+ this.mouse = null;
+ this.eventData = null;
+ this.interactionDOMElement = null;
+ this.onPointerDown = null;
+ this.processPointerDown = null;
+ this.onPointerUp = null;
+ this.processPointerUp = null;
+ this.onPointerCancel = null;
+ this.processPointerCancel = null;
+ this.onPointerMove = null;
+ this.processPointerMove = null;
+ this.onPointerOut = null;
+ this.processPointerOverOut = null;
+ this.onPointerOver = null;
+ this.search = null;
+ };
+ return InteractionManager;
+ }(eventemitter3));
+
+ /*!
+ * @pixi/runner - v5.3.12
+ * Compiled Wed, 23 Mar 2022 18:38:07 UTC
+ *
+ * @pixi/runner is licensed under the MIT License.
+ * http://www.opensource.org/licenses/mit-license
+ */
+ /**
+ * A Runner is a highly performant and simple alternative to signals. Best used in situations
+ * where events are dispatched to many objects at high frequency (say every frame!)
+ *
+ *
+ * like a signal..
+ * ```
+ * import { Runner } from '@pixi/runner';
+ *
+ * const myObject = {
+ * loaded: new Runner('loaded')
+ * }
+ *
+ * const listener = {
+ * loaded: function(){
+ * // thin
+ * }
+ * }
+ *
+ * myObject.update.add(listener);
+ *
+ * myObject.loaded.emit();
+ * ```
+ *
+ * Or for handling calling the same function on many items
+ * ```
+ * import { Runner } from '@pixi/runner';
+ *
+ * const myGame = {
+ * update: new Runner('update')
+ * }
+ *
+ * const gameObject = {
+ * update: function(time){
+ * // update my gamey state
+ * }
+ * }
+ *
+ * myGame.update.add(gameObject1);
+ *
+ * myGame.update.emit(time);
+ * ```
+ * @class
+ * @memberof PIXI
+ */
+ var Runner = /** @class */ (function () {
+ /**
+ * @param {string} name - the function name that will be executed on the listeners added to this Runner.
+ */
+ function Runner(name) {
+ this.items = [];
+ this._name = name;
+ this._aliasCount = 0;
+ }
+ /**
+ * Dispatch/Broadcast Runner to all listeners added to the queue.
+ * @param {...any} params - optional parameters to pass to each listener
+ * @return {PIXI.Runner}
+ */
+ Runner.prototype.emit = function (a0, a1, a2, a3, a4, a5, a6, a7) {
+ if (arguments.length > 8) {
+ throw new Error('max arguments reached');
+ }
+ var _a = this, name = _a.name, items = _a.items;
+ this._aliasCount++;
+ for (var i = 0, len = items.length; i < len; i++) {
+ items[i][name](a0, a1, a2, a3, a4, a5, a6, a7);
+ }
+ if (items === this.items) {
+ this._aliasCount--;
+ }
+ return this;
+ };
+ Runner.prototype.ensureNonAliasedItems = function () {
+ if (this._aliasCount > 0 && this.items.length > 1) {
+ this._aliasCount = 0;
+ this.items = this.items.slice(0);
+ }
+ };
+ /**
+ * Add a listener to the Runner
+ *
+ * Runners do not need to have scope or functions passed to them.
+ * All that is required is to pass the listening object and ensure that it has contains a function that has the same name
+ * as the name provided to the Runner when it was created.
+ *
+ * Eg A listener passed to this Runner will require a 'complete' function.
+ *
+ * ```
+ * import { Runner } from '@pixi/runner';
+ *
+ * const complete = new Runner('complete');
+ * ```
+ *
+ * The scope used will be the object itself.
+ *
+ * @param {any} item - The object that will be listening.
+ * @return {PIXI.Runner}
+ */
+ Runner.prototype.add = function (item) {
+ if (item[this._name]) {
+ this.ensureNonAliasedItems();
+ this.remove(item);
+ this.items.push(item);
+ }
+ return this;
+ };
+ /**
+ * Remove a single listener from the dispatch queue.
+ * @param {any} item - The listenr that you would like to remove.
+ * @return {PIXI.Runner}
+ */
+ Runner.prototype.remove = function (item) {
+ var index = this.items.indexOf(item);
+ if (index !== -1) {
+ this.ensureNonAliasedItems();
+ this.items.splice(index, 1);
+ }
+ return this;
+ };
+ /**
+ * Check to see if the listener is already in the Runner
+ * @param {any} item - The listener that you would like to check.
+ */
+ Runner.prototype.contains = function (item) {
+ return this.items.indexOf(item) !== -1;
+ };
+ /**
+ * Remove all listeners from the Runner
+ * @return {PIXI.Runner}
+ */
+ Runner.prototype.removeAll = function () {
+ this.ensureNonAliasedItems();
+ this.items.length = 0;
+ return this;
+ };
+ /**
+ * Remove all references, don't use after this.
+ */
+ Runner.prototype.destroy = function () {
+ this.removeAll();
+ this.items = null;
+ this._name = null;
+ };
+ Object.defineProperty(Runner.prototype, "empty", {
+ /**
+ * `true` if there are no this Runner contains no listeners
+ *
+ * @member {boolean}
+ * @readonly
+ */
+ get: function () {
+ return this.items.length === 0;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(Runner.prototype, "name", {
+ /**
+ * The name of the runner.
+ *
+ * @member {string}
+ * @readonly
+ */
+ get: function () {
+ return this._name;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ return Runner;
+ }());
+ Object.defineProperties(Runner.prototype, {
+ /**
+ * Alias for `emit`
+ * @memberof PIXI.Runner#
+ * @method dispatch
+ * @see PIXI.Runner#emit
+ */
+ dispatch: { value: Runner.prototype.emit },
+ /**
+ * Alias for `emit`
+ * @memberof PIXI.Runner#
+ * @method run
+ * @see PIXI.Runner#emit
+ */
+ run: { value: Runner.prototype.emit },
+ });
+
+ /*!
+ * @pixi/core - v5.3.12
+ * Compiled Wed, 23 Mar 2022 18:38:07 UTC
+ *
+ * @pixi/core is licensed under the MIT License.
+ * http://www.opensource.org/licenses/mit-license
+ */
+
+ /**
+ * The maximum support for using WebGL. If a device does not
+ * support WebGL version, for instance WebGL 2, it will still
+ * attempt to fallback support to WebGL 1. If you want to
+ * explicitly remove feature support to target a more stable
+ * baseline, prefer a lower environment.
+ *
+ * Due to {@link https://bugs.chromium.org/p/chromium/issues/detail?id=934823|bug in chromium}
+ * we disable webgl2 by default for all non-apple mobile devices.
+ *
+ * @static
+ * @name PREFER_ENV
+ * @memberof PIXI.settings
+ * @type {number}
+ * @default PIXI.ENV.WEBGL2
+ */
+ settings.PREFER_ENV = isMobile$1.any ? exports.ENV.WEBGL : exports.ENV.WEBGL2;
+ /**
+ * If set to `true`, *only* Textures and BaseTexture objects stored
+ * in the caches ({@link PIXI.utils.TextureCache TextureCache} and
+ * {@link PIXI.utils.BaseTextureCache BaseTextureCache}) can be
+ * used when calling {@link PIXI.Texture.from Texture.from} or
+ * {@link PIXI.BaseTexture.from BaseTexture.from}.
+ * Otherwise, these `from` calls throw an exception. Using this property
+ * can be useful if you want to enforce preloading all assets with
+ * {@link PIXI.Loader Loader}.
+ *
+ * @static
+ * @name STRICT_TEXTURE_CACHE
+ * @memberof PIXI.settings
+ * @type {boolean}
+ * @default false
+ */
+ settings.STRICT_TEXTURE_CACHE = false;
+
+ /**
+ * Collection of installed resource types, class must extend {@link PIXI.resources.Resource}.
+ * @example
+ * class CustomResource extends PIXI.resources.Resource {
+ * // MUST have source, options constructor signature
+ * // for auto-detected resources to be created.
+ * constructor(source, options) {
+ * super();
+ * }
+ * upload(renderer, baseTexture, glTexture) {
+ * // upload with GL
+ * return true;
+ * }
+ * // used to auto-detect resource
+ * static test(source, extension) {
+ * return extension === 'xyz'|| source instanceof SomeClass;
+ * }
+ * }
+ * // Install the new resource type
+ * PIXI.resources.INSTALLED.push(CustomResource);
+ *
+ * @name PIXI.resources.INSTALLED
+ * @type {Array<*>}
+ * @static
+ * @readonly
+ */
+ var INSTALLED = [];
+ /**
+ * Create a resource element from a single source element. This
+ * auto-detects which type of resource to create. All resources that
+ * are auto-detectable must have a static `test` method and a constructor
+ * with the arguments `(source, options?)`. Currently, the supported
+ * resources for auto-detection include:
+ * - {@link PIXI.resources.ImageResource}
+ * - {@link PIXI.resources.CanvasResource}
+ * - {@link PIXI.resources.VideoResource}
+ * - {@link PIXI.resources.SVGResource}
+ * - {@link PIXI.resources.BufferResource}
+ * @static
+ * @function PIXI.resources.autoDetectResource
+ * @param {string|*} source - Resource source, this can be the URL to the resource,
+ * a typed-array (for BufferResource), HTMLVideoElement, SVG data-uri
+ * or any other resource that can be auto-detected. If not resource is
+ * detected, it's assumed to be an ImageResource.
+ * @param {object} [options] - Pass-through options to use for Resource
+ * @param {number} [options.width] - Width of BufferResource or SVG rasterization
+ * @param {number} [options.height] - Height of BufferResource or SVG rasterization
+ * @param {boolean} [options.autoLoad=true] - Image, SVG and Video flag to start loading
+ * @param {number} [options.scale=1] - SVG source scale. Overridden by width, height
+ * @param {boolean} [options.createBitmap=PIXI.settings.CREATE_IMAGE_BITMAP] - Image option to create Bitmap object
+ * @param {boolean} [options.crossorigin=true] - Image and Video option to set crossOrigin
+ * @param {boolean} [options.autoPlay=true] - Video option to start playing video immediately
+ * @param {number} [options.updateFPS=0] - Video option to update how many times a second the
+ * texture should be updated from the video. Leave at 0 to update at every render
+ * @return {PIXI.resources.Resource} The created resource.
+ */
+ function autoDetectResource(source, options) {
+ if (!source) {
+ return null;
+ }
+ var extension = '';
+ if (typeof source === 'string') {
+ // search for file extension: period, 3-4 chars, then ?, # or EOL
+ var result = (/\.(\w{3,4})(?:$|\?|#)/i).exec(source);
+ if (result) {
+ extension = result[1].toLowerCase();
+ }
+ }
+ for (var i = INSTALLED.length - 1; i >= 0; --i) {
+ var ResourcePlugin = INSTALLED[i];
+ if (ResourcePlugin.test && ResourcePlugin.test(source, extension)) {
+ return new ResourcePlugin(source, options);
+ }
+ }
+ throw new Error('Unrecognized source type to auto-detect Resource');
+ }
+
+ /*! *****************************************************************************
+ Copyright (c) Microsoft Corporation. All rights reserved.
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+ this file except in compliance with the License. You may obtain a copy of the
+ License at http://www.apache.org/licenses/LICENSE-2.0
+
+ THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+ WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+ MERCHANTABLITY OR NON-INFRINGEMENT.
+
+ See the Apache Version 2.0 License for specific language governing permissions
+ and limitations under the License.
+ ***************************************************************************** */
+ /* global Reflect, Promise */
+
+ var extendStatics$2 = function(d, b) {
+ extendStatics$2 = Object.setPrototypeOf ||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+ function (d, b) { for (var p in b) { if (b.hasOwnProperty(p)) { d[p] = b[p]; } } };
+ return extendStatics$2(d, b);
+ };
+
+ function __extends$2(d, b) {
+ extendStatics$2(d, b);
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+ }
+
+ /**
+ * Base resource class for textures that manages validation and uploading, depending on its type.
+ *
+ * Uploading of a base texture to the GPU is required.
+ *
+ * @class
+ * @memberof PIXI.resources
+ */
+ var Resource = /** @class */ (function () {
+ /**
+ * @param {number} [width=0] - Width of the resource
+ * @param {number} [height=0] - Height of the resource
+ */
+ function Resource(width, height) {
+ if (width === void 0) { width = 0; }
+ if (height === void 0) { height = 0; }
+ /**
+ * Internal width of the resource
+ * @member {number}
+ * @protected
+ */
+ this._width = width;
+ /**
+ * Internal height of the resource
+ * @member {number}
+ * @protected
+ */
+ this._height = height;
+ /**
+ * If resource has been destroyed
+ * @member {boolean}
+ * @readonly
+ * @default false
+ */
+ this.destroyed = false;
+ /**
+ * `true` if resource is created by BaseTexture
+ * useful for doing cleanup with BaseTexture destroy
+ * and not cleaning up resources that were created
+ * externally.
+ * @member {boolean}
+ * @protected
+ */
+ this.internal = false;
+ /**
+ * Mini-runner for handling resize events
+ * accepts 2 parameters: width, height
+ *
+ * @member {Runner}
+ * @private
+ */
+ this.onResize = new Runner('setRealSize');
+ /**
+ * Mini-runner for handling update events
+ *
+ * @member {Runner}
+ * @private
+ */
+ this.onUpdate = new Runner('update');
+ /**
+ * Handle internal errors, such as loading errors
+ * accepts 1 param: error
+ *
+ * @member {Runner}
+ * @private
+ */
+ this.onError = new Runner('onError');
+ }
+ /**
+ * Bind to a parent BaseTexture
+ *
+ * @param {PIXI.BaseTexture} baseTexture - Parent texture
+ */
+ Resource.prototype.bind = function (baseTexture) {
+ this.onResize.add(baseTexture);
+ this.onUpdate.add(baseTexture);
+ this.onError.add(baseTexture);
+ // Call a resize immediate if we already
+ // have the width and height of the resource
+ if (this._width || this._height) {
+ this.onResize.emit(this._width, this._height);
+ }
+ };
+ /**
+ * Unbind to a parent BaseTexture
+ *
+ * @param {PIXI.BaseTexture} baseTexture - Parent texture
+ */
+ Resource.prototype.unbind = function (baseTexture) {
+ this.onResize.remove(baseTexture);
+ this.onUpdate.remove(baseTexture);
+ this.onError.remove(baseTexture);
+ };
+ /**
+ * Trigger a resize event
+ * @param {number} width - X dimension
+ * @param {number} height - Y dimension
+ */
+ Resource.prototype.resize = function (width, height) {
+ if (width !== this._width || height !== this._height) {
+ this._width = width;
+ this._height = height;
+ this.onResize.emit(width, height);
+ }
+ };
+ Object.defineProperty(Resource.prototype, "valid", {
+ /**
+ * Has been validated
+ * @readonly
+ * @member {boolean}
+ */
+ get: function () {
+ return !!this._width && !!this._height;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ /**
+ * Has been updated trigger event
+ */
+ Resource.prototype.update = function () {
+ if (!this.destroyed) {
+ this.onUpdate.emit();
+ }
+ };
+ /**
+ * This can be overridden to start preloading a resource
+ * or do any other prepare step.
+ * @protected
+ * @return {Promise} Handle the validate event
+ */
+ Resource.prototype.load = function () {
+ return Promise.resolve(this);
+ };
+ Object.defineProperty(Resource.prototype, "width", {
+ /**
+ * The width of the resource.
+ *
+ * @member {number}
+ * @readonly
+ */
+ get: function () {
+ return this._width;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(Resource.prototype, "height", {
+ /**
+ * The height of the resource.
+ *
+ * @member {number}
+ * @readonly
+ */
+ get: function () {
+ return this._height;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ /**
+ * Set the style, optional to override
+ *
+ * @param {PIXI.Renderer} renderer - yeah, renderer!
+ * @param {PIXI.BaseTexture} baseTexture - the texture
+ * @param {PIXI.GLTexture} glTexture - texture instance for this webgl context
+ * @returns {boolean} `true` is success
+ */
+ Resource.prototype.style = function (_renderer, _baseTexture, _glTexture) {
+ return false;
+ };
+ /**
+ * Clean up anything, this happens when destroying is ready.
+ *
+ * @protected
+ */
+ Resource.prototype.dispose = function () {
+ // override
+ };
+ /**
+ * Call when destroying resource, unbind any BaseTexture object
+ * before calling this method, as reference counts are maintained
+ * internally.
+ */
+ Resource.prototype.destroy = function () {
+ if (!this.destroyed) {
+ this.destroyed = true;
+ this.dispose();
+ this.onError.removeAll();
+ this.onError = null;
+ this.onResize.removeAll();
+ this.onResize = null;
+ this.onUpdate.removeAll();
+ this.onUpdate = null;
+ }
+ };
+ /**
+ * Abstract, used to auto-detect resource type
+ *
+ * @static
+ * @param {*} source - The source object
+ * @param {string} extension - The extension of source, if set
+ */
+ Resource.test = function (_source, _extension) {
+ return false;
+ };
+ return Resource;
+ }());
+
+ /**
+ * @interface SharedArrayBuffer
+ */
+ /**
+ * Buffer resource with data of typed array.
+ * @class
+ * @extends PIXI.resources.Resource
+ * @memberof PIXI.resources
+ */
+ var BufferResource = /** @class */ (function (_super) {
+ __extends$2(BufferResource, _super);
+ /**
+ * @param {Float32Array|Uint8Array|Uint32Array} source - Source buffer
+ * @param {object} options - Options
+ * @param {number} options.width - Width of the texture
+ * @param {number} options.height - Height of the texture
+ */
+ function BufferResource(source, options) {
+ var _this = this;
+ var _a = options || {}, width = _a.width, height = _a.height;
+ if (!width || !height) {
+ throw new Error('BufferResource width or height invalid');
+ }
+ _this = _super.call(this, width, height) || this;
+ /**
+ * Source array
+ * Cannot be ClampedUint8Array because it cant be uploaded to WebGL
+ *
+ * @member {Float32Array|Uint8Array|Uint32Array}
+ */
+ _this.data = source;
+ return _this;
+ }
+ /**
+ * Upload the texture to the GPU.
+ * @param {PIXI.Renderer} renderer - Upload to the renderer
+ * @param {PIXI.BaseTexture} baseTexture - Reference to parent texture
+ * @param {PIXI.GLTexture} glTexture - glTexture
+ * @returns {boolean} true is success
+ */
+ BufferResource.prototype.upload = function (renderer, baseTexture, glTexture) {
+ var gl = renderer.gl;
+ gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, baseTexture.alphaMode === exports.ALPHA_MODES.UNPACK);
+ if (glTexture.width === baseTexture.width && glTexture.height === baseTexture.height) {
+ gl.texSubImage2D(baseTexture.target, 0, 0, 0, baseTexture.width, baseTexture.height, baseTexture.format, baseTexture.type, this.data);
+ }
+ else {
+ glTexture.width = baseTexture.width;
+ glTexture.height = baseTexture.height;
+ gl.texImage2D(baseTexture.target, 0, glTexture.internalFormat, baseTexture.width, baseTexture.height, 0, baseTexture.format, glTexture.type, this.data);
+ }
+ return true;
+ };
+ /**
+ * Destroy and don't use after this
+ * @override
+ */
+ BufferResource.prototype.dispose = function () {
+ this.data = null;
+ };
+ /**
+ * Used to auto-detect the type of resource.
+ *
+ * @static
+ * @param {*} source - The source object
+ * @return {boolean} `true` if