diff --git a/.gitignore b/.gitignore
index 2527dec..bfb3dac 100644
--- a/.gitignore
+++ b/.gitignore
@@ -362,4 +362,6 @@ MigrationBackup/
# Fody - auto-generated XML schema
FodyWeavers.xsd
-/db
\ No newline at end of file
+/db
+*.db
+*.db*
\ No newline at end of file
diff --git a/Assets/sledgemapper.drawio b/Assets/sledgemapper.drawio
new file mode 100644
index 0000000..d445036
--- /dev/null
+++ b/Assets/sledgemapper.drawio
@@ -0,0 +1 @@
+7Vvbdto4FP0aHpPlC7c8gnNpO2mGljSZV4EFaJAtRhYh9OvnyJZvKICd4DohrMUDOpZlS3vraGvbbtiO93zD0WL2nbmYNizDfW7Ylw3LMpuW1ZA/w11HkU5bBaacuKpSGhiS31gFDRVdEhcHuYqCMSrIIh8cM9/HY5GLIc7ZKl9twmj+qgs0xVpgOEZUjz4SV8yiaNfqpPEvmExn8ZXN9kV0xENxZdWTYIZctsqE7KuG7XDGRPTPe3YwlYMXj8vj1/UjvZ23b779CP5Dv/p/3d89nEWNXZc5JekCx754ddO/55PrLw/Nf/9ZDK5/rIyb3ujbmTrFeEJ0qcbLQd4Ckamv+izW8UAGK+JR5EOpP2G+GKojMAx9ROUJ9uUY7g9zCDxhLghg0FMHBFtAdDwj1L1Fa7aUvQgEGs/jUn/GOPkNzSIKh0wIwGEuFJ2sdq7GUJ4JYQOiHAdQZxAPjZmEblEgVJ0xoxQtAjIKb1hW8RCfEr/PhGBe3BBb+i52VSnBOiwIzuYJe+T5BQFRwMnRwM8ZOiqAbjDzsOBrqKKOJlxTk82My6uUumZbxWZZ2tpdNWXUdJkmbSeX+wnTC/lTGIT0evbG9ZoFrweI5C6HKADvI4H7chiDLBHhT6araSikZwmqmhpV75CHNZrCSIsMJSmeiK2EDBZoTPzpbVjnsplGfqqeyhCDcyc0JMOMuC72Q7IIJFDEJ8mQBSO+CIei1YcfDJhjnLcaLbghB8pmWoafrM6Fw3zgFSIhgTCQdYUlYV+g1s6Ju59a6zxiZZHNEikHaVn8LD3VcAyMcfvrXwFkjWMDckdCmQmPqr9Vwd2yaobb1uC+8hCRp/VcF1J0cAL8oIB3ujUD3tQA1xCmJJQPajTMF5fWPfB7AKRsLsb7XtLh8szUOGHrnLBfwJ+iEaYDFhBBmGyfR3U3eFFX0jaNZjFUd6z+bwK1pYE6WPLxDAVSRIDqmsPwhv+OcD5XBqpZd25ua6gOxdKV3Swo+o2T6D+c6Dc3RL/drlb0mxui3+6+X9Hf2c5U427pjY5QNxZMO+3CNHsvG4CuhmUP7l7aN5bxHZaSo0PyoIKwNN617wAuToLw4KAWVflV6UFTNwy/QuI3rgANMkLhMnPPZMDnTDZ3ZFM6K4KaVYHcrTtTm7rXdoPlkjvEHvERl4jfoznWTeKPjm9VkNav+eMb2JWOse/25CMXKI0ok3K7DyGlx00jKl4TGi9dewRzfv3D7hTHUwfTEVtdpYF+GIADMVNKy+2Awb4U74cMNhhTXGA7J+92J7AvAckxRYI85Z887RDnA0ncVJhbRl6YW4adbyLqpDor+6inbEPRKGgNHcyq182/AWcTHARM1+unLWb1W0x7c8tXdIvZMfaS+IUdpt0ssMPsvI8dpqn7lkNEkcq4n3BtSybvx9lZmrpNqaH32bca5WEtuoGsbK+h25SfSrHEiL1ryWJuZPrOKyWLvdGQ1dm4l6oli+40bntOeRIs1QuWltHN0aHwizCWuWOR2a5YWq0P9CKMbqQOBcdYf3rzWRRLpzC93o1i0c1Rh4jj05wHtcDL41y7B27pfikkbXF8r63VDHTtb79YumUKyl6u4pbhMPcE+IEBL/xmTHWI64aqA2MijtA5qBtr+5Vi7HBY64amBvKnNxjK49oqKMOqchgs3ft7AIjcY1ygq0OxXXsm1u2/v5disZT2Qk8+q7yV8+CEaGFEL2rPt+WsP7YIx7qcuZf4gmb9Vp8a271OX4zlXqtP4SyplLU1muqG3uj6Jc9zEsJY+SaKun6t5p6Gtrh+WkNnm0+cNtphk0mAKzEOLd04NM7PY+BTuoZmXCYR7Ek7I2XJRWt4H43n05C/DqOMw3GfpQakcrut4jkhnl/qo0t1W43k87PiRt3ZGxkVE/OPwaWbZ8WxivXTRwXrMLM/fin3j0One2YUeiEXeLTV+8zI8U1UdRVcxMFPNPpurEu56G8khkaAbVwpvk5cHIYpdt7Fj5P0W7gCxfST66h6+uG6ffU/
\ No newline at end of file
diff --git a/External tools/Myra.1.2.1.0/AssetManagementBase.dll b/External tools/Myra.1.2.1.0/AssetManagementBase.dll
deleted file mode 100644
index f49a1cc..0000000
Binary files a/External tools/Myra.1.2.1.0/AssetManagementBase.dll and /dev/null differ
diff --git a/External tools/Myra.1.2.1.0/Assets/fonts/arial64.fnt b/External tools/Myra.1.2.1.0/Assets/fonts/arial64.fnt
deleted file mode 100644
index 108850f..0000000
--- a/External tools/Myra.1.2.1.0/Assets/fonts/arial64.fnt
+++ /dev/null
@@ -1,288 +0,0 @@
-info face="Arial" size=64 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
-common lineHeight=63 base=51 scaleW=512 scaleH=512 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
-page id=0 file="arial64_0.png"
-chars count=191
-char id=32 x=508 y=2 width=3 height=1 xoffset=-1 yoffset=62 xadvance=15 page=0 chnl=15
-char id=33 x=497 y=270 width=7 height=40 xoffset=5 yoffset=11 xadvance=17 page=0 chnl=15
-char id=34 x=445 y=382 width=16 height=14 xoffset=2 yoffset=11 xadvance=20 page=0 chnl=15
-char id=35 x=453 y=229 width=31 height=40 xoffset=0 yoffset=11 xadvance=31 page=0 chnl=15
-char id=36 x=188 y=105 width=28 height=46 xoffset=1 yoffset=10 xadvance=31 page=0 chnl=15
-char id=37 x=346 y=190 width=44 height=40 xoffset=2 yoffset=11 xadvance=49 page=0 chnl=15
-char id=38 x=147 y=238 width=34 height=40 xoffset=2 yoffset=11 xadvance=37 page=0 chnl=15
-char id=39 x=462 y=382 width=7 height=14 xoffset=2 yoffset=11 xadvance=11 page=0 chnl=15
-char id=40 x=287 y=53 width=14 height=51 xoffset=3 yoffset=11 xadvance=18 page=0 chnl=15
-char id=41 x=272 y=53 width=14 height=51 xoffset=3 yoffset=11 xadvance=18 page=0 chnl=15
-char id=42 x=379 y=384 width=19 height=17 xoffset=1 yoffset=11 xadvance=21 page=0 chnl=15
-char id=43 x=26 y=400 width=28 height=27 xoffset=2 yoffset=19 xadvance=32 page=0 chnl=15
-char id=44 x=470 y=380 width=7 height=13 xoffset=4 yoffset=46 xadvance=15 page=0 chnl=15
-char id=45 x=128 y=419 width=16 height=5 xoffset=1 yoffset=34 xadvance=18 page=0 chnl=15
-char id=46 x=162 y=419 width=7 height=5 xoffset=4 yoffset=46 xadvance=15 page=0 chnl=15
-char id=47 x=62 y=321 width=17 height=40 xoffset=-1 yoffset=11 xadvance=15 page=0 chnl=15
-char id=48 x=341 y=314 width=27 height=39 xoffset=2 yoffset=12 xadvance=31 page=0 chnl=15
-char id=49 x=369 y=313 width=16 height=39 xoffset=5 yoffset=12 xadvance=31 page=0 chnl=15
-char id=50 x=200 y=320 width=28 height=39 xoffset=1 yoffset=12 xadvance=31 page=0 chnl=15
-char id=51 x=229 y=320 width=27 height=39 xoffset=2 yoffset=12 xadvance=31 page=0 chnl=15
-char id=52 x=112 y=321 width=29 height=39 xoffset=0 yoffset=12 xadvance=31 page=0 chnl=15
-char id=53 x=171 y=320 width=28 height=39 xoffset=2 yoffset=12 xadvance=31 page=0 chnl=15
-char id=54 x=142 y=320 width=28 height=39 xoffset=1 yoffset=12 xadvance=31 page=0 chnl=15
-char id=55 x=313 y=315 width=27 height=39 xoffset=2 yoffset=12 xadvance=31 page=0 chnl=15
-char id=56 x=257 y=320 width=27 height=39 xoffset=2 yoffset=12 xadvance=31 page=0 chnl=15
-char id=57 x=285 y=315 width=27 height=39 xoffset=2 yoffset=12 xadvance=31 page=0 chnl=15
-char id=58 x=491 y=350 width=7 height=29 xoffset=4 yoffset=22 xadvance=15 page=0 chnl=15
-char id=59 x=26 y=362 width=7 height=37 xoffset=4 yoffset=22 xadvance=15 page=0 chnl=15
-char id=60 x=84 y=395 width=28 height=27 xoffset=2 yoffset=18 xadvance=32 page=0 chnl=15
-char id=61 x=350 y=385 width=28 height=17 xoffset=2 yoffset=23 xadvance=32 page=0 chnl=15
-char id=62 x=55 y=396 width=28 height=27 xoffset=2 yoffset=18 xadvance=32 page=0 chnl=15
-char id=63 x=333 y=273 width=27 height=40 xoffset=2 yoffset=11 xadvance=31 page=0 chnl=15
-char id=64 x=0 y=0 width=52 height=52 xoffset=2 yoffset=11 xadvance=56 page=0 chnl=15
-char id=65 x=471 y=188 width=38 height=40 xoffset=-1 yoffset=11 xadvance=37 page=0 chnl=15
-char id=66 x=387 y=231 width=32 height=40 xoffset=3 yoffset=11 xadvance=37 page=0 chnl=15
-char id=67 x=406 y=103 width=36 height=42 xoffset=2 yoffset=10 xadvance=40 page=0 chnl=15
-char id=68 x=182 y=238 width=34 height=40 xoffset=4 yoffset=11 xadvance=40 page=0 chnl=15
-char id=69 x=0 y=280 width=31 height=40 xoffset=4 yoffset=11 xadvance=37 page=0 chnl=15
-char id=70 x=247 y=279 width=28 height=40 xoffset=4 yoffset=11 xadvance=34 page=0 chnl=15
-char id=71 x=367 y=103 width=38 height=42 xoffset=2 yoffset=10 xadvance=43 page=0 chnl=15
-char id=72 x=420 y=229 width=32 height=40 xoffset=4 yoffset=11 xadvance=40 page=0 chnl=15
-char id=73 x=88 y=321 width=7 height=40 xoffset=4 yoffset=11 xadvance=15 page=0 chnl=15
-char id=74 x=189 y=196 width=23 height=41 xoffset=1 yoffset=11 xadvance=28 page=0 chnl=15
-char id=75 x=217 y=238 width=34 height=40 xoffset=3 yoffset=11 xadvance=37 page=0 chnl=15
-char id=76 x=417 y=272 width=27 height=40 xoffset=3 yoffset=11 xadvance=31 page=0 chnl=15
-char id=77 x=391 y=188 width=39 height=40 xoffset=3 yoffset=11 xadvance=45 page=0 chnl=15
-char id=78 x=252 y=233 width=33 height=40 xoffset=3 yoffset=11 xadvance=40 page=0 chnl=15
-char id=79 x=327 y=105 width=39 height=42 xoffset=2 yoffset=10 xadvance=43 page=0 chnl=15
-char id=80 x=32 y=280 width=31 height=40 xoffset=4 yoffset=11 xadvance=37 page=0 chnl=15
-char id=81 x=217 y=105 width=39 height=44 xoffset=2 yoffset=10 xadvance=43 page=0 chnl=15
-char id=82 x=38 y=239 width=36 height=40 xoffset=4 yoffset=11 xadvance=40 page=0 chnl=15
-char id=83 x=443 y=103 width=33 height=42 xoffset=2 yoffset=10 xadvance=37 page=0 chnl=15
-char id=84 x=286 y=233 width=33 height=40 xoffset=0 yoffset=11 xadvance=33 page=0 chnl=15
-char id=85 x=477 y=102 width=32 height=41 xoffset=4 yoffset=11 xadvance=40 page=0 chnl=15
-char id=86 x=0 y=239 width=37 height=40 xoffset=0 yoffset=11 xadvance=37 page=0 chnl=15
-char id=87 x=291 y=191 width=54 height=40 xoffset=0 yoffset=11 xadvance=54 page=0 chnl=15
-char id=88 x=111 y=238 width=35 height=40 xoffset=0 yoffset=11 xadvance=35 page=0 chnl=15
-char id=89 x=75 y=239 width=35 height=40 xoffset=0 yoffset=11 xadvance=35 page=0 chnl=15
-char id=90 x=320 y=232 width=33 height=40 xoffset=0 yoffset=11 xadvance=34 page=0 chnl=15
-char id=91 x=329 y=53 width=12 height=51 xoffset=3 yoffset=11 xadvance=15 page=0 chnl=15
-char id=92 x=44 y=321 width=17 height=40 xoffset=-1 yoffset=11 xadvance=15 page=0 chnl=15
-char id=93 x=316 y=53 width=12 height=51 xoffset=0 yoffset=11 xadvance=15 page=0 chnl=15
-char id=94 x=248 y=391 width=22 height=21 xoffset=1 yoffset=11 xadvance=24 page=0 chnl=15
-char id=95 x=76 y=424 width=34 height=5 xoffset=-2 yoffset=57 xadvance=31 page=0 chnl=15
-char id=96 x=29 y=428 width=11 height=8 xoffset=2 yoffset=11 xadvance=18 page=0 chnl=15
-char id=97 x=241 y=360 width=28 height=30 xoffset=1 yoffset=21 xadvance=31 page=0 chnl=15
-char id=98 x=389 y=272 width=27 height=40 xoffset=3 yoffset=11 xadvance=31 page=0 chnl=15
-char id=99 x=297 y=355 width=26 height=30 xoffset=2 yoffset=21 xadvance=28 page=0 chnl=15
-char id=100 x=305 y=274 width=27 height=40 xoffset=1 yoffset=11 xadvance=31 page=0 chnl=15
-char id=101 x=212 y=360 width=28 height=30 xoffset=1 yoffset=21 xadvance=31 page=0 chnl=15
-char id=102 x=25 y=321 width=18 height=40 xoffset=0 yoffset=11 xadvance=15 page=0 chnl=15
-char id=103 x=56 y=197 width=27 height=41 xoffset=1 yoffset=21 xadvance=31 page=0 chnl=15
-char id=104 x=471 y=270 width=25 height=40 xoffset=3 yoffset=11 xadvance=31 page=0 chnl=15
-char id=105 x=96 y=321 width=7 height=40 xoffset=2 yoffset=11 xadvance=11 page=0 chnl=15
-char id=106 x=302 y=53 width=13 height=51 xoffset=-3 yoffset=11 xadvance=13 page=0 chnl=15
-char id=107 x=485 y=229 width=25 height=40 xoffset=3 yoffset=11 xadvance=28 page=0 chnl=15
-char id=108 x=80 y=321 width=7 height=40 xoffset=2 yoffset=11 xadvance=11 page=0 chnl=15
-char id=109 x=140 y=361 width=41 height=30 xoffset=3 yoffset=21 xadvance=47 page=0 chnl=15
-char id=110 x=324 y=355 width=25 height=30 xoffset=3 yoffset=21 xadvance=31 page=0 chnl=15
-char id=111 x=182 y=360 width=29 height=30 xoffset=1 yoffset=21 xadvance=31 page=0 chnl=15
-char id=112 x=0 y=197 width=27 height=41 xoffset=3 yoffset=21 xadvance=31 page=0 chnl=15
-char id=113 x=28 y=197 width=27 height=41 xoffset=1 yoffset=21 xadvance=31 page=0 chnl=15
-char id=114 x=350 y=354 width=16 height=30 xoffset=3 yoffset=21 xadvance=18 page=0 chnl=15
-char id=115 x=270 y=360 width=26 height=30 xoffset=1 yoffset=21 xadvance=28 page=0 chnl=15
-char id=116 x=386 y=313 width=15 height=39 xoffset=0 yoffset=12 xadvance=15 page=0 chnl=15
-char id=117 x=0 y=401 width=25 height=29 xoffset=3 yoffset=22 xadvance=31 page=0 chnl=15
-char id=118 x=435 y=352 width=27 height=29 xoffset=1 yoffset=22 xadvance=29 page=0 chnl=15
-char id=119 x=367 y=354 width=39 height=29 xoffset=0 yoffset=22 xadvance=39 page=0 chnl=15
-char id=120 x=463 y=350 width=27 height=29 xoffset=0 yoffset=22 xadvance=27 page=0 chnl=15
-char id=121 x=361 y=272 width=27 height=40 xoffset=0 yoffset=22 xadvance=27 page=0 chnl=15
-char id=122 x=407 y=352 width=27 height=29 xoffset=0 yoffset=22 xadvance=27 page=0 chnl=15
-char id=123 x=254 y=53 width=17 height=51 xoffset=1 yoffset=11 xadvance=18 page=0 chnl=15
-char id=124 x=337 y=0 width=6 height=52 xoffset=4 yoffset=11 xadvance=14 page=0 chnl=15
-char id=125 x=236 y=53 width=17 height=51 xoffset=0 yoffset=11 xadvance=18 page=0 chnl=15
-char id=126 x=0 y=431 width=28 height=10 xoffset=2 yoffset=27 xadvance=32 page=0 chnl=15
-char id=160 x=508 y=0 width=3 height=1 xoffset=-1 yoffset=62 xadvance=15 page=0 chnl=15
-char id=161 x=104 y=321 width=7 height=40 xoffset=5 yoffset=22 xadvance=17 page=0 chnl=15
-char id=162 x=161 y=53 width=27 height=51 xoffset=2 yoffset=11 xadvance=31 page=0 chnl=15
-char id=163 x=127 y=279 width=30 height=40 xoffset=0 yoffset=11 xadvance=31 page=0 chnl=15
-char id=164 x=165 y=392 width=28 height=24 xoffset=1 yoffset=20 xadvance=31 page=0 chnl=15
-char id=165 x=354 y=231 width=32 height=40 xoffset=-1 yoffset=11 xadvance=31 page=0 chnl=15
-char id=166 x=344 y=0 width=6 height=52 xoffset=4 yoffset=11 xadvance=14 page=0 chnl=15
-char id=167 x=189 y=53 width=27 height=51 xoffset=2 yoffset=11 xadvance=31 page=0 chnl=15
-char id=168 x=111 y=423 width=16 height=5 xoffset=1 yoffset=11 xadvance=18 page=0 chnl=15
-char id=169 x=137 y=154 width=43 height=41 xoffset=-1 yoffset=10 xadvance=41 page=0 chnl=15
-char id=170 x=292 y=391 width=19 height=20 xoffset=0 yoffset=11 xadvance=20 page=0 chnl=15
-char id=171 x=113 y=393 width=25 height=25 xoffset=3 yoffset=24 xadvance=31 page=0 chnl=15
-char id=172 x=399 y=384 width=28 height=16 xoffset=2 yoffset=24 xadvance=32 page=0 chnl=15
-char id=173 x=145 y=419 width=16 height=5 xoffset=1 yoffset=34 xadvance=18 page=0 chnl=15
-char id=174 x=181 y=154 width=43 height=41 xoffset=-1 yoffset=10 xadvance=41 page=0 chnl=15
-char id=175 x=41 y=428 width=34 height=5 xoffset=-2 yoffset=4 xadvance=30 page=0 chnl=15
-char id=176 x=428 y=382 width=16 height=15 xoffset=3 yoffset=11 xadvance=22 page=0 chnl=15
-char id=177 x=34 y=362 width=28 height=33 xoffset=1 yoffset=18 xadvance=30 page=0 chnl=15
-char id=178 x=312 y=386 width=18 height=20 xoffset=0 yoffset=11 xadvance=18 page=0 chnl=15
-char id=179 x=331 y=386 width=18 height=20 xoffset=0 yoffset=11 xadvance=18 page=0 chnl=15
-char id=180 x=492 y=380 width=11 height=8 xoffset=5 yoffset=12 xadvance=18 page=0 chnl=15
-char id=181 x=0 y=321 width=24 height=40 xoffset=4 yoffset=22 xadvance=32 page=0 chnl=15
-char id=182 x=439 y=52 width=32 height=50 xoffset=-1 yoffset=11 xadvance=30 page=0 chnl=15
-char id=183 x=504 y=371 width=7 height=5 xoffset=5 yoffset=29 xadvance=18 page=0 chnl=15
-char id=184 x=478 y=380 width=13 height=11 xoffset=2 yoffset=51 xadvance=18 page=0 chnl=15
-char id=185 x=499 y=350 width=12 height=20 xoffset=2 yoffset=11 xadvance=18 page=0 chnl=15
-char id=186 x=271 y=391 width=20 height=20 xoffset=0 yoffset=11 xadvance=20 page=0 chnl=15
-char id=187 x=139 y=393 width=25 height=25 xoffset=3 yoffset=24 xadvance=31 page=0 chnl=15
-char id=188 x=47 y=155 width=44 height=41 xoffset=2 yoffset=11 xadvance=46 page=0 chnl=15
-char id=189 x=92 y=154 width=44 height=41 xoffset=2 yoffset=11 xadvance=46 page=0 chnl=15
-char id=190 x=0 y=155 width=46 height=41 xoffset=0 yoffset=11 xadvance=46 page=0 chnl=15
-char id=191 x=276 y=274 width=28 height=40 xoffset=3 yoffset=22 xadvance=34 page=0 chnl=15
-char id=192 x=469 y=0 width=38 height=51 xoffset=-1 yoffset=0 xadvance=37 page=0 chnl=15
-char id=193 x=430 y=0 width=38 height=51 xoffset=-1 yoffset=0 xadvance=37 page=0 chnl=15
-char id=194 x=391 y=0 width=38 height=51 xoffset=-1 yoffset=0 xadvance=37 page=0 chnl=15
-char id=195 x=366 y=52 width=38 height=50 xoffset=-1 yoffset=1 xadvance=37 page=0 chnl=15
-char id=196 x=61 y=105 width=38 height=48 xoffset=-1 yoffset=3 xadvance=37 page=0 chnl=15
-char id=197 x=100 y=105 width=38 height=48 xoffset=-1 yoffset=3 xadvance=37 page=0 chnl=15
-char id=198 x=236 y=192 width=54 height=40 xoffset=-1 yoffset=11 xadvance=55 page=0 chnl=15
-char id=199 x=173 y=0 width=36 height=52 xoffset=2 yoffset=10 xadvance=40 page=0 chnl=15
-char id=200 x=37 y=53 width=31 height=51 xoffset=4 yoffset=0 xadvance=37 page=0 chnl=15
-char id=201 x=69 y=53 width=31 height=51 xoffset=4 yoffset=0 xadvance=37 page=0 chnl=15
-char id=202 x=101 y=53 width=31 height=51 xoffset=4 yoffset=0 xadvance=37 page=0 chnl=15
-char id=203 x=139 y=105 width=31 height=48 xoffset=4 yoffset=3 xadvance=37 page=0 chnl=15
-char id=204 x=354 y=52 width=11 height=51 xoffset=1 yoffset=0 xadvance=15 page=0 chnl=15
-char id=205 x=342 y=53 width=11 height=51 xoffset=3 yoffset=0 xadvance=15 page=0 chnl=15
-char id=206 x=217 y=53 width=18 height=51 xoffset=-1 yoffset=0 xadvance=15 page=0 chnl=15
-char id=207 x=171 y=105 width=16 height=48 xoffset=0 yoffset=3 xadvance=15 page=0 chnl=15
-char id=208 x=431 y=188 width=39 height=40 xoffset=-1 yoffset=11 xadvance=40 page=0 chnl=15
-char id=209 x=405 y=52 width=33 height=50 xoffset=3 yoffset=1 xadvance=40 page=0 chnl=15
-char id=210 x=53 y=0 width=39 height=52 xoffset=2 yoffset=0 xadvance=43 page=0 chnl=15
-char id=211 x=93 y=0 width=39 height=52 xoffset=2 yoffset=0 xadvance=43 page=0 chnl=15
-char id=212 x=133 y=0 width=39 height=52 xoffset=2 yoffset=0 xadvance=43 page=0 chnl=15
-char id=213 x=351 y=0 width=39 height=51 xoffset=2 yoffset=1 xadvance=43 page=0 chnl=15
-char id=214 x=472 y=52 width=39 height=49 xoffset=2 yoffset=3 xadvance=43 page=0 chnl=15
-char id=215 x=194 y=391 width=24 height=23 xoffset=4 yoffset=20 xadvance=32 page=0 chnl=15
-char id=216 x=257 y=105 width=40 height=43 xoffset=2 yoffset=10 xadvance=43 page=0 chnl=15
-char id=217 x=243 y=0 width=32 height=52 xoffset=4 yoffset=0 xadvance=40 page=0 chnl=15
-char id=218 x=276 y=0 width=32 height=52 xoffset=4 yoffset=0 xadvance=40 page=0 chnl=15
-char id=219 x=210 y=0 width=32 height=52 xoffset=4 yoffset=0 xadvance=40 page=0 chnl=15
-char id=220 x=0 y=105 width=32 height=49 xoffset=4 yoffset=3 xadvance=40 page=0 chnl=15
-char id=221 x=0 y=53 width=36 height=51 xoffset=-1 yoffset=0 xadvance=37 page=0 chnl=15
-char id=222 x=64 y=280 width=31 height=40 xoffset=4 yoffset=11 xadvance=37 page=0 chnl=15
-char id=223 x=96 y=280 width=30 height=40 xoffset=3 yoffset=11 xadvance=34 page=0 chnl=15
-char id=224 x=460 y=146 width=28 height=41 xoffset=1 yoffset=10 xadvance=31 page=0 chnl=15
-char id=225 x=315 y=149 width=28 height=41 xoffset=1 yoffset=10 xadvance=31 page=0 chnl=15
-char id=226 x=344 y=148 width=28 height=41 xoffset=1 yoffset=10 xadvance=31 page=0 chnl=15
-char id=227 x=218 y=279 width=28 height=40 xoffset=1 yoffset=11 xadvance=31 page=0 chnl=15
-char id=228 x=432 y=313 width=28 height=38 xoffset=1 yoffset=13 xadvance=31 page=0 chnl=15
-char id=229 x=298 y=105 width=28 height=43 xoffset=1 yoffset=8 xadvance=31 page=0 chnl=15
-char id=230 x=92 y=362 width=47 height=30 xoffset=1 yoffset=21 xadvance=49 page=0 chnl=15
-char id=231 x=84 y=197 width=26 height=41 xoffset=2 yoffset=21 xadvance=28 page=0 chnl=15
-char id=232 x=402 y=146 width=28 height=41 xoffset=1 yoffset=10 xadvance=31 page=0 chnl=15
-char id=233 x=373 y=146 width=28 height=41 xoffset=1 yoffset=10 xadvance=31 page=0 chnl=15
-char id=234 x=431 y=146 width=28 height=41 xoffset=1 yoffset=10 xadvance=31 page=0 chnl=15
-char id=235 x=461 y=311 width=28 height=38 xoffset=1 yoffset=13 xadvance=31 page=0 chnl=15
-char id=236 x=225 y=192 width=10 height=41 xoffset=1 yoffset=10 xadvance=15 page=0 chnl=15
-char id=237 x=213 y=196 width=11 height=41 xoffset=4 yoffset=10 xadvance=15 page=0 chnl=15
-char id=238 x=489 y=144 width=18 height=41 xoffset=-1 yoffset=10 xadvance=15 page=0 chnl=15
-char id=239 x=490 y=311 width=16 height=38 xoffset=0 yoffset=13 xadvance=15 page=0 chnl=15
-char id=240 x=158 y=279 width=29 height=40 xoffset=1 yoffset=11 xadvance=31 page=0 chnl=15
-char id=241 x=445 y=270 width=25 height=40 xoffset=3 yoffset=11 xadvance=31 page=0 chnl=15
-char id=242 x=285 y=149 width=29 height=41 xoffset=1 yoffset=10 xadvance=31 page=0 chnl=15
-char id=243 x=225 y=150 width=29 height=41 xoffset=1 yoffset=10 xadvance=31 page=0 chnl=15
-char id=244 x=255 y=150 width=29 height=41 xoffset=1 yoffset=10 xadvance=31 page=0 chnl=15
-char id=245 x=188 y=279 width=29 height=40 xoffset=1 yoffset=11 xadvance=31 page=0 chnl=15
-char id=246 x=402 y=313 width=29 height=38 xoffset=1 yoffset=13 xadvance=31 page=0 chnl=15
-char id=247 x=219 y=391 width=28 height=21 xoffset=1 yoffset=21 xadvance=30 page=0 chnl=15
-char id=248 x=63 y=362 width=28 height=32 xoffset=3 yoffset=20 xadvance=34 page=0 chnl=15
-char id=249 x=163 y=196 width=25 height=41 xoffset=3 yoffset=10 xadvance=31 page=0 chnl=15
-char id=250 x=137 y=196 width=25 height=41 xoffset=3 yoffset=10 xadvance=31 page=0 chnl=15
-char id=251 x=111 y=196 width=25 height=41 xoffset=3 yoffset=10 xadvance=31 page=0 chnl=15
-char id=252 x=0 y=362 width=25 height=38 xoffset=3 yoffset=13 xadvance=31 page=0 chnl=15
-char id=253 x=309 y=0 width=27 height=52 xoffset=0 yoffset=10 xadvance=28 page=0 chnl=15
-char id=254 x=133 y=53 width=27 height=51 xoffset=3 yoffset=11 xadvance=31 page=0 chnl=15
-char id=255 x=33 y=105 width=27 height=49 xoffset=0 yoffset=13 xadvance=28 page=0 chnl=15
-kernings count=92
-kerning first=32 second=65 amount=-3
-kerning first=32 second=84 amount=-1
-kerning first=32 second=89 amount=-1
-kerning first=121 second=46 amount=-4
-kerning first=121 second=44 amount=-4
-kerning first=119 second=46 amount=-3
-kerning first=119 second=44 amount=-3
-kerning first=118 second=46 amount=-4
-kerning first=118 second=44 amount=-4
-kerning first=114 second=46 amount=-3
-kerning first=49 second=49 amount=-4
-kerning first=65 second=32 amount=-3
-kerning first=65 second=84 amount=-4
-kerning first=65 second=86 amount=-4
-kerning first=65 second=87 amount=-2
-kerning first=65 second=89 amount=-4
-kerning first=65 second=118 amount=-1
-kerning first=65 second=119 amount=-1
-kerning first=65 second=121 amount=-1
-kerning first=114 second=44 amount=-3
-kerning first=70 second=44 amount=-6
-kerning first=70 second=46 amount=-6
-kerning first=70 second=65 amount=-3
-kerning first=76 second=32 amount=-2
-kerning first=76 second=84 amount=-4
-kerning first=76 second=86 amount=-4
-kerning first=76 second=87 amount=-4
-kerning first=76 second=89 amount=-4
-kerning first=76 second=121 amount=-2
-kerning first=102 second=102 amount=-1
-kerning first=80 second=32 amount=-1
-kerning first=80 second=44 amount=-7
-kerning first=80 second=46 amount=-7
-kerning first=80 second=65 amount=-4
-kerning first=82 second=84 amount=-1
-kerning first=82 second=86 amount=-1
-kerning first=82 second=87 amount=-1
-kerning first=82 second=89 amount=-1
-kerning first=84 second=32 amount=-1
-kerning first=84 second=44 amount=-6
-kerning first=84 second=45 amount=-3
-kerning first=84 second=46 amount=-6
-kerning first=84 second=58 amount=-6
-kerning first=89 second=118 amount=-3
-kerning first=84 second=65 amount=-4
-kerning first=84 second=79 amount=-1
-kerning first=84 second=97 amount=-6
-kerning first=84 second=99 amount=-6
-kerning first=84 second=101 amount=-6
-kerning first=84 second=105 amount=-2
-kerning first=84 second=111 amount=-6
-kerning first=84 second=114 amount=-2
-kerning first=84 second=115 amount=-6
-kerning first=84 second=117 amount=-2
-kerning first=84 second=119 amount=-3
-kerning first=84 second=121 amount=-3
-kerning first=86 second=44 amount=-5
-kerning first=86 second=45 amount=-3
-kerning first=86 second=46 amount=-5
-kerning first=86 second=58 amount=-2
-kerning first=89 second=117 amount=-3
-kerning first=86 second=65 amount=-4
-kerning first=86 second=97 amount=-4
-kerning first=86 second=101 amount=-3
-kerning first=86 second=105 amount=-1
-kerning first=86 second=111 amount=-3
-kerning first=86 second=114 amount=-2
-kerning first=86 second=117 amount=-2
-kerning first=86 second=121 amount=-2
-kerning first=87 second=44 amount=-3
-kerning first=87 second=45 amount=-1
-kerning first=87 second=46 amount=-3
-kerning first=87 second=58 amount=-1
-kerning first=89 second=113 amount=-5
-kerning first=87 second=65 amount=-2
-kerning first=87 second=97 amount=-2
-kerning first=87 second=101 amount=-1
-kerning first=89 second=112 amount=-4
-kerning first=87 second=111 amount=-1
-kerning first=87 second=114 amount=-1
-kerning first=87 second=117 amount=-1
-kerning first=87 second=121 amount=-1
-kerning first=89 second=32 amount=-1
-kerning first=89 second=44 amount=-7
-kerning first=89 second=45 amount=-5
-kerning first=89 second=46 amount=-7
-kerning first=89 second=58 amount=-3
-kerning first=89 second=111 amount=-5
-kerning first=89 second=65 amount=-4
-kerning first=89 second=97 amount=-4
-kerning first=89 second=101 amount=-5
-kerning first=89 second=105 amount=-2
diff --git a/External tools/Myra.1.2.1.0/Assets/fonts/arial64_0.png b/External tools/Myra.1.2.1.0/Assets/fonts/arial64_0.png
deleted file mode 100644
index ddb24df..0000000
Binary files a/External tools/Myra.1.2.1.0/Assets/fonts/arial64_0.png and /dev/null differ
diff --git a/External tools/Myra.1.2.1.0/Assets/fonts/calibri32.fnt b/External tools/Myra.1.2.1.0/Assets/fonts/calibri32.fnt
deleted file mode 100644
index 32e8475..0000000
--- a/External tools/Myra.1.2.1.0/Assets/fonts/calibri32.fnt
+++ /dev/null
@@ -1,985 +0,0 @@
-info face="Calibri" size=32 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
-common lineHeight=32 base=25 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
-page id=0 file="calibri32_0.png"
-chars count=193
-char id=0 x=254 y=0 width=0 height=1 xoffset=0 yoffset=31 xadvance=0 page=0 chnl=15
-char id=13 x=253 y=0 width=0 height=1 xoffset=0 yoffset=31 xadvance=0 page=0 chnl=15
-char id=32 x=247 y=41 width=3 height=1 xoffset=-1 yoffset=31 xadvance=6 page=0 chnl=15
-char id=33 x=216 y=62 width=4 height=18 xoffset=3 yoffset=7 xadvance=8 page=0 chnl=15
-char id=34 x=202 y=146 width=8 height=7 xoffset=1 yoffset=7 xadvance=10 page=0 chnl=15
-char id=35 x=238 y=97 width=13 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15
-char id=36 x=79 y=0 width=12 height=22 xoffset=1 yoffset=6 xadvance=13 page=0 chnl=15
-char id=37 x=226 y=62 width=18 height=17 xoffset=0 yoffset=8 xadvance=19 page=0 chnl=15
-char id=38 x=112 y=45 width=16 height=18 xoffset=1 yoffset=7 xadvance=18 page=0 chnl=15
-char id=39 x=217 y=146 width=4 height=7 xoffset=1 yoffset=7 xadvance=6 page=0 chnl=15
-char id=40 x=39 y=0 width=6 height=23 xoffset=1 yoffset=7 xadvance=8 page=0 chnl=15
-char id=41 x=46 y=0 width=6 height=23 xoffset=1 yoffset=7 xadvance=8 page=0 chnl=15
-char id=42 x=126 y=148 width=11 height=10 xoffset=1 yoffset=7 xadvance=13 page=0 chnl=15
-char id=43 x=181 y=133 width=13 height=12 xoffset=0 yoffset=12 xadvance=13 page=0 chnl=15
-char id=44 x=211 y=146 width=5 height=7 xoffset=0 yoffset=22 xadvance=6 page=0 chnl=15
-char id=45 x=68 y=166 width=8 height=2 xoffset=0 yoffset=17 xadvance=8 page=0 chnl=15
-char id=46 x=29 y=168 width=4 height=3 xoffset=1 yoffset=22 xadvance=7 page=0 chnl=15
-char id=47 x=26 y=0 width=12 height=23 xoffset=-1 yoffset=6 xadvance=10 page=0 chnl=15
-char id=48 x=210 y=99 width=13 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15
-char id=49 x=209 y=116 width=11 height=16 xoffset=1 yoffset=9 xadvance=13 page=0 chnl=15
-char id=50 x=185 y=116 width=11 height=16 xoffset=1 yoffset=9 xadvance=13 page=0 chnl=15
-char id=51 x=233 y=116 width=11 height=16 xoffset=1 yoffset=9 xadvance=13 page=0 chnl=15
-char id=52 x=196 y=99 width=13 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15
-char id=53 x=81 y=120 width=12 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15
-char id=54 x=42 y=121 width=12 height=16 xoffset=1 yoffset=9 xadvance=13 page=0 chnl=15
-char id=55 x=94 y=120 width=12 height=16 xoffset=1 yoffset=9 xadvance=13 page=0 chnl=15
-char id=56 x=140 y=100 width=13 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15
-char id=57 x=107 y=118 width=12 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15
-char id=58 x=84 y=151 width=4 height=12 xoffset=2 yoffset=13 xadvance=7 page=0 chnl=15
-char id=59 x=248 y=79 width=6 height=16 xoffset=0 yoffset=13 xadvance=7 page=0 chnl=15
-char id=60 x=221 y=133 width=12 height=12 xoffset=0 yoffset=12 xadvance=13 page=0 chnl=15
-char id=61 x=189 y=146 width=12 height=7 xoffset=0 yoffset=14 xadvance=13 page=0 chnl=15
-char id=62 x=208 y=133 width=12 height=12 xoffset=1 yoffset=12 xadvance=13 page=0 chnl=15
-char id=63 x=103 y=64 width=11 height=18 xoffset=1 yoffset=7 xadvance=12 page=0 chnl=15
-char id=64 x=37 y=46 width=21 height=19 xoffset=1 yoffset=9 xadvance=23 page=0 chnl=15
-char id=65 x=232 y=80 width=15 height=16 xoffset=0 yoffset=9 xadvance=15 page=0 chnl=15
-char id=66 x=14 y=121 width=13 height=16 xoffset=1 yoffset=9 xadvance=14 page=0 chnl=15
-char id=67 x=0 y=121 width=13 height=16 xoffset=1 yoffset=9 xadvance=14 page=0 chnl=15
-char id=68 x=64 y=103 width=15 height=16 xoffset=1 yoffset=9 xadvance=16 page=0 chnl=15
-char id=69 x=0 y=138 width=10 height=16 xoffset=2 yoffset=9 xadvance=13 page=0 chnl=15
-char id=70 x=197 y=116 width=11 height=16 xoffset=1 yoffset=9 xadvance=12 page=0 chnl=15
-char id=71 x=48 y=104 width=15 height=16 xoffset=0 yoffset=9 xadvance=16 page=0 chnl=15
-char id=72 x=95 y=101 width=14 height=16 xoffset=1 yoffset=9 xadvance=16 page=0 chnl=15
-char id=73 x=252 y=96 width=3 height=16 xoffset=2 yoffset=9 xadvance=7 page=0 chnl=15
-char id=74 x=20 y=138 width=8 height=16 xoffset=-1 yoffset=9 xadvance=8 page=0 chnl=15
-char id=75 x=120 y=118 width=12 height=16 xoffset=2 yoffset=9 xadvance=14 page=0 chnl=15
-char id=76 x=245 y=62 width=10 height=16 xoffset=1 yoffset=9 xadvance=11 page=0 chnl=15
-char id=77 x=177 y=82 width=20 height=16 xoffset=1 yoffset=9 xadvance=22 page=0 chnl=15
-char id=78 x=0 y=104 width=15 height=16 xoffset=1 yoffset=9 xadvance=17 page=0 chnl=15
-char id=79 x=215 y=82 width=16 height=16 xoffset=0 yoffset=9 xadvance=17 page=0 chnl=15
-char id=80 x=146 y=117 width=12 height=16 xoffset=1 yoffset=9 xadvance=13 page=0 chnl=15
-char id=81 x=93 y=45 width=18 height=18 xoffset=1 yoffset=9 xadvance=18 page=0 chnl=15
-char id=82 x=224 y=99 width=13 height=16 xoffset=1 yoffset=9 xadvance=14 page=0 chnl=15
-char id=83 x=159 y=117 width=12 height=16 xoffset=0 yoffset=9 xadvance=12 page=0 chnl=15
-char id=84 x=168 y=99 width=13 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15
-char id=85 x=32 y=104 width=15 height=16 xoffset=1 yoffset=9 xadvance=17 page=0 chnl=15
-char id=86 x=16 y=104 width=15 height=16 xoffset=0 yoffset=9 xadvance=15 page=0 chnl=15
-char id=87 x=132 y=83 width=23 height=16 xoffset=0 yoffset=9 xadvance=23 page=0 chnl=15
-char id=88 x=80 y=103 width=14 height=16 xoffset=0 yoffset=9 xadvance=14 page=0 chnl=15
-char id=89 x=28 y=121 width=13 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15
-char id=90 x=172 y=116 width=12 height=16 xoffset=0 yoffset=9 xadvance=12 page=0 chnl=15
-char id=91 x=123 y=0 width=6 height=22 xoffset=2 yoffset=7 xadvance=8 page=0 chnl=15
-char id=92 x=92 y=0 width=12 height=22 xoffset=-1 yoffset=6 xadvance=10 page=0 chnl=15
-char id=93 x=130 y=0 width=6 height=22 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=15
-char id=94 x=177 y=147 width=11 height=9 xoffset=1 yoffset=9 xadvance=13 page=0 chnl=15
-char id=95 x=34 y=168 width=15 height=2 xoffset=-1 yoffset=28 xadvance=13 page=0 chnl=15
-char id=96 x=15 y=168 width=6 height=4 xoffset=1 yoffset=7 xadvance=8 page=0 chnl=15
-char id=97 x=26 y=155 width=11 height=12 xoffset=0 yoffset=13 xadvance=12 page=0 chnl=15
-char id=98 x=216 y=43 width=12 height=18 xoffset=1 yoffset=7 xadvance=14 page=0 chnl=15
-char id=99 x=50 y=154 width=11 height=12 xoffset=0 yoffset=13 xadvance=11 page=0 chnl=15
-char id=100 x=229 y=43 width=12 height=18 xoffset=1 yoffset=7 xadvance=14 page=0 chnl=15
-char id=101 x=0 y=155 width=12 height=12 xoffset=0 yoffset=13 xadvance=13 page=0 chnl=15
-char id=102 x=187 y=63 width=9 height=18 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=15
-char id=103 x=107 y=83 width=12 height=17 xoffset=0 yoffset=13 xadvance=12 page=0 chnl=15
-char id=104 x=52 y=66 width=12 height=18 xoffset=1 yoffset=7 xadvance=14 page=0 chnl=15
-char id=105 x=29 y=138 width=4 height=16 xoffset=1 yoffset=9 xadvance=6 page=0 chnl=15
-char id=106 x=193 y=22 width=6 height=21 xoffset=-1 yoffset=9 xadvance=6 page=0 chnl=15
-char id=107 x=127 y=64 width=11 height=18 xoffset=1 yoffset=7 xadvance=12 page=0 chnl=15
-char id=108 x=211 y=63 width=4 height=18 xoffset=1 yoffset=7 xadvance=6 page=0 chnl=15
-char id=109 x=112 y=135 width=19 height=12 xoffset=1 yoffset=13 xadvance=21 page=0 chnl=15
-char id=110 x=13 y=155 width=12 height=12 xoffset=1 yoffset=13 xadvance=14 page=0 chnl=15
-char id=111 x=152 y=134 width=14 height=12 xoffset=0 yoffset=13 xadvance=14 page=0 chnl=15
-char id=112 x=81 y=83 width=12 height=17 xoffset=1 yoffset=13 xadvance=14 page=0 chnl=15
-char id=113 x=94 y=83 width=12 height=17 xoffset=1 yoffset=13 xadvance=14 page=0 chnl=15
-char id=114 x=247 y=131 width=8 height=12 xoffset=1 yoffset=13 xadvance=9 page=0 chnl=15
-char id=115 x=73 y=151 width=10 height=12 xoffset=0 yoffset=13 xadvance=10 page=0 chnl=15
-char id=116 x=48 y=138 width=9 height=15 xoffset=0 yoffset=10 xadvance=9 page=0 chnl=15
-char id=117 x=234 y=133 width=12 height=12 xoffset=1 yoffset=13 xadvance=14 page=0 chnl=15
-char id=118 x=195 y=133 width=12 height=12 xoffset=0 yoffset=13 xadvance=12 page=0 chnl=15
-char id=119 x=132 y=135 width=19 height=12 xoffset=0 yoffset=13 xadvance=19 page=0 chnl=15
-char id=120 x=38 y=154 width=11 height=12 xoffset=0 yoffset=13 xadvance=11 page=0 chnl=15
-char id=121 x=68 y=85 width=12 height=17 xoffset=0 yoffset=13 xadvance=12 page=0 chnl=15
-char id=122 x=62 y=153 width=10 height=12 xoffset=0 yoffset=13 xadvance=10 page=0 chnl=15
-char id=123 x=114 y=0 width=8 height=22 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=15
-char id=124 x=53 y=0 width=4 height=23 xoffset=4 yoffset=7 xadvance=12 page=0 chnl=15
-char id=125 x=105 y=0 width=8 height=22 xoffset=1 yoffset=7 xadvance=8 page=0 chnl=15
-char id=126 x=236 y=146 width=13 height=5 xoffset=0 yoffset=10 xadvance=13 page=0 chnl=15
-char id=160 x=251 y=41 width=3 height=1 xoffset=-1 yoffset=31 xadvance=6 page=0 chnl=15
-char id=161 x=221 y=62 width=4 height=18 xoffset=2 yoffset=10 xadvance=8 page=0 chnl=15
-char id=162 x=245 y=114 width=10 height=16 xoffset=2 yoffset=9 xadvance=13 page=0 chnl=15
-char id=163 x=154 y=100 width=13 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15
-char id=164 x=58 y=138 width=13 height=14 xoffset=0 yoffset=11 xadvance=13 page=0 chnl=15
-char id=165 x=182 y=99 width=13 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15
-char id=166 x=58 y=0 width=3 height=23 xoffset=5 yoffset=7 xadvance=13 page=0 chnl=15
-char id=167 x=137 y=22 width=11 height=21 xoffset=1 yoffset=7 xadvance=13 page=0 chnl=15
-char id=168 x=77 y=164 width=8 height=2 xoffset=1 yoffset=9 xadvance=10 page=0 chnl=15
-char id=169 x=73 y=45 width=19 height=18 xoffset=1 yoffset=7 xadvance=22 page=0 chnl=15
-char id=170 x=82 y=137 width=8 height=13 xoffset=1 yoffset=9 xadvance=10 page=0 chnl=15
-char id=171 x=114 y=148 width=11 height=11 xoffset=1 yoffset=13 xadvance=13 page=0 chnl=15
-char id=172 x=222 y=146 width=13 height=5 xoffset=0 yoffset=17 xadvance=13 page=0 chnl=15
-char id=173 x=50 y=167 width=8 height=2 xoffset=0 yoffset=17 xadvance=8 page=0 chnl=15
-char id=174 x=138 y=148 width=11 height=10 xoffset=1 yoffset=7 xadvance=13 page=0 chnl=15
-char id=175 x=59 y=167 width=8 height=2 xoffset=1 yoffset=8 xadvance=10 page=0 chnl=15
-char id=176 x=0 y=168 width=7 height=5 xoffset=1 yoffset=8 xadvance=9 page=0 chnl=15
-char id=177 x=34 y=138 width=13 height=15 xoffset=0 yoffset=10 xadvance=13 page=0 chnl=15
-char id=178 x=150 y=148 width=9 height=10 xoffset=0 yoffset=6 xadvance=9 page=0 chnl=15
-char id=179 x=160 y=147 width=9 height=10 xoffset=0 yoffset=6 xadvance=9 page=0 chnl=15
-char id=180 x=22 y=168 width=6 height=4 xoffset=1 yoffset=7 xadvance=8 page=0 chnl=15
-char id=181 x=53 y=85 width=14 height=17 xoffset=1 yoffset=13 xadvance=14 page=0 chnl=15
-char id=182 x=59 y=46 width=13 height=19 xoffset=1 yoffset=9 xadvance=15 page=0 chnl=15
-char id=183 x=250 y=144 width=5 height=3 xoffset=1 yoffset=16 xadvance=7 page=0 chnl=15
-char id=184 x=8 y=168 width=6 height=5 xoffset=1 yoffset=25 xadvance=8 page=0 chnl=15
-char id=185 x=170 y=147 width=6 height=10 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=15
-char id=186 x=72 y=137 width=9 height=13 xoffset=1 yoffset=9 xadvance=11 page=0 chnl=15
-char id=187 x=89 y=151 width=12 height=11 xoffset=1 yoffset=13 xadvance=13 page=0 chnl=15
-char id=188 x=36 y=86 width=16 height=17 xoffset=0 yoffset=8 xadvance=17 page=0 chnl=15
-char id=189 x=18 y=86 width=17 height=17 xoffset=0 yoffset=8 xadvance=17 page=0 chnl=15
-char id=190 x=0 y=86 width=17 height=17 xoffset=0 yoffset=8 xadvance=18 page=0 chnl=15
-char id=191 x=91 y=64 width=11 height=18 xoffset=0 yoffset=10 xadvance=12 page=0 chnl=15
-char id=192 x=48 y=24 width=15 height=21 xoffset=0 yoffset=4 xadvance=15 page=0 chnl=15
-char id=193 x=64 y=23 width=15 height=21 xoffset=0 yoffset=4 xadvance=15 page=0 chnl=15
-char id=194 x=32 y=24 width=15 height=21 xoffset=0 yoffset=4 xadvance=15 page=0 chnl=15
-char id=195 x=16 y=24 width=15 height=21 xoffset=0 yoffset=4 xadvance=15 page=0 chnl=15
-char id=196 x=0 y=46 width=15 height=20 xoffset=0 yoffset=5 xadvance=15 page=0 chnl=15
-char id=197 x=0 y=24 width=15 height=21 xoffset=0 yoffset=4 xadvance=15 page=0 chnl=15
-char id=198 x=156 y=82 width=20 height=16 xoffset=-1 yoffset=9 xadvance=20 page=0 chnl=15
-char id=199 x=110 y=23 width=13 height=21 xoffset=1 yoffset=9 xadvance=14 page=0 chnl=15
-char id=200 x=149 y=22 width=10 height=21 xoffset=2 yoffset=4 xadvance=13 page=0 chnl=15
-char id=201 x=182 y=22 width=10 height=21 xoffset=2 yoffset=4 xadvance=13 page=0 chnl=15
-char id=202 x=171 y=22 width=10 height=21 xoffset=2 yoffset=4 xadvance=13 page=0 chnl=15
-char id=203 x=16 y=46 width=10 height=20 xoffset=2 yoffset=5 xadvance=13 page=0 chnl=15
-char id=204 x=207 y=22 width=6 height=21 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=15
-char id=205 x=200 y=22 width=6 height=21 xoffset=2 yoffset=4 xadvance=7 page=0 chnl=15
-char id=206 x=160 y=22 width=10 height=21 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=15
-char id=207 x=27 y=46 width=9 height=20 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=15
-char id=208 x=198 y=82 width=16 height=16 xoffset=0 yoffset=9 xadvance=16 page=0 chnl=15
-char id=209 x=237 y=0 width=15 height=21 xoffset=1 yoffset=4 xadvance=17 page=0 chnl=15
-char id=210 x=171 y=0 width=16 height=21 xoffset=0 yoffset=4 xadvance=17 page=0 chnl=15
-char id=211 x=154 y=0 width=16 height=21 xoffset=0 yoffset=4 xadvance=17 page=0 chnl=15
-char id=212 x=137 y=0 width=16 height=21 xoffset=0 yoffset=4 xadvance=17 page=0 chnl=15
-char id=213 x=188 y=0 width=16 height=21 xoffset=0 yoffset=4 xadvance=17 page=0 chnl=15
-char id=214 x=214 y=22 width=16 height=20 xoffset=0 yoffset=5 xadvance=17 page=0 chnl=15
-char id=215 x=102 y=150 width=11 height=11 xoffset=1 yoffset=12 xadvance=13 page=0 chnl=15
-char id=216 x=62 y=0 width=16 height=22 xoffset=1 yoffset=6 xadvance=17 page=0 chnl=15
-char id=217 x=221 y=0 width=15 height=21 xoffset=1 yoffset=4 xadvance=17 page=0 chnl=15
-char id=218 x=80 y=23 width=15 height=21 xoffset=1 yoffset=4 xadvance=17 page=0 chnl=15
-char id=219 x=205 y=0 width=15 height=21 xoffset=1 yoffset=4 xadvance=17 page=0 chnl=15
-char id=220 x=231 y=22 width=15 height=20 xoffset=1 yoffset=5 xadvance=17 page=0 chnl=15
-char id=221 x=96 y=23 width=13 height=21 xoffset=0 yoffset=4 xadvance=13 page=0 chnl=15
-char id=222 x=55 y=121 width=12 height=16 xoffset=1 yoffset=9 xadvance=13 page=0 chnl=15
-char id=223 x=189 y=44 width=13 height=18 xoffset=1 yoffset=7 xadvance=14 page=0 chnl=15
-char id=224 x=115 y=64 width=11 height=18 xoffset=0 yoffset=7 xadvance=12 page=0 chnl=15
-char id=225 x=175 y=63 width=11 height=18 xoffset=0 yoffset=7 xadvance=12 page=0 chnl=15
-char id=226 x=163 y=63 width=11 height=18 xoffset=0 yoffset=7 xadvance=12 page=0 chnl=15
-char id=227 x=151 y=63 width=11 height=18 xoffset=0 yoffset=7 xadvance=12 page=0 chnl=15
-char id=228 x=221 y=116 width=11 height=16 xoffset=0 yoffset=9 xadvance=12 page=0 chnl=15
-char id=229 x=139 y=64 width=11 height=18 xoffset=0 yoffset=7 xadvance=12 page=0 chnl=15
-char id=230 x=91 y=137 width=20 height=12 xoffset=0 yoffset=13 xadvance=20 page=0 chnl=15
-char id=231 x=120 y=83 width=11 height=17 xoffset=0 yoffset=13 xadvance=11 page=0 chnl=15
-char id=232 x=0 y=67 width=12 height=18 xoffset=0 yoffset=7 xadvance=13 page=0 chnl=15
-char id=233 x=13 y=67 width=12 height=18 xoffset=0 yoffset=7 xadvance=13 page=0 chnl=15
-char id=234 x=26 y=67 width=12 height=18 xoffset=0 yoffset=7 xadvance=13 page=0 chnl=15
-char id=235 x=68 y=120 width=12 height=16 xoffset=0 yoffset=9 xadvance=13 page=0 chnl=15
-char id=236 x=197 y=63 width=6 height=18 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=15
-char id=237 x=204 y=63 width=6 height=18 xoffset=1 yoffset=7 xadvance=6 page=0 chnl=15
-char id=238 x=247 y=22 width=8 height=18 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=15
-char id=239 x=11 y=138 width=8 height=16 xoffset=-1 yoffset=9 xadvance=6 page=0 chnl=15
-char id=240 x=39 y=66 width=12 height=18 xoffset=1 yoffset=7 xadvance=14 page=0 chnl=15
-char id=241 x=242 y=43 width=12 height=18 xoffset=1 yoffset=7 xadvance=14 page=0 chnl=15
-char id=242 x=144 y=44 width=14 height=18 xoffset=0 yoffset=7 xadvance=14 page=0 chnl=15
-char id=243 x=129 y=45 width=14 height=18 xoffset=0 yoffset=7 xadvance=14 page=0 chnl=15
-char id=244 x=174 y=44 width=14 height=18 xoffset=0 yoffset=7 xadvance=14 page=0 chnl=15
-char id=245 x=159 y=44 width=14 height=18 xoffset=0 yoffset=7 xadvance=14 page=0 chnl=15
-char id=246 x=110 y=101 width=14 height=16 xoffset=0 yoffset=9 xadvance=14 page=0 chnl=15
-char id=247 x=167 y=134 width=13 height=12 xoffset=0 yoffset=12 xadvance=13 page=0 chnl=15
-char id=248 x=125 y=101 width=14 height=16 xoffset=0 yoffset=11 xadvance=14 page=0 chnl=15
-char id=249 x=65 y=66 width=12 height=18 xoffset=1 yoffset=7 xadvance=14 page=0 chnl=15
-char id=250 x=78 y=64 width=12 height=18 xoffset=1 yoffset=7 xadvance=14 page=0 chnl=15
-char id=251 x=203 y=44 width=12 height=18 xoffset=1 yoffset=7 xadvance=14 page=0 chnl=15
-char id=252 x=133 y=118 width=12 height=16 xoffset=1 yoffset=9 xadvance=14 page=0 chnl=15
-char id=253 x=0 y=0 width=12 height=23 xoffset=0 yoffset=7 xadvance=12 page=0 chnl=15
-char id=254 x=13 y=0 width=12 height=23 xoffset=1 yoffset=7 xadvance=14 page=0 chnl=15
-char id=255 x=124 y=23 width=12 height=21 xoffset=0 yoffset=9 xadvance=12 page=0 chnl=15
-kernings count=787
-kerning first=179 second=47 amount=-4
-kerning first=178 second=47 amount=-4
-kerning first=185 second=47 amount=-4
-kerning first=40 second=106 amount=1
-kerning first=47 second=179 amount=-3
-kerning first=47 second=178 amount=-3
-kerning first=47 second=185 amount=-2
-kerning first=47 second=198 amount=-1
-kerning first=47 second=197 amount=-1
-kerning first=47 second=196 amount=-1
-kerning first=47 second=195 amount=-1
-kerning first=47 second=194 amount=-1
-kerning first=47 second=193 amount=-1
-kerning first=47 second=192 amount=-1
-kerning first=47 second=65 amount=-1
-kerning first=46 second=255 amount=-1
-kerning first=46 second=253 amount=-1
-kerning first=46 second=121 amount=-1
-kerning first=46 second=119 amount=-1
-kerning first=46 second=118 amount=-1
-kerning first=46 second=116 amount=-1
-kerning first=46 second=102 amount=-1
-kerning first=46 second=221 amount=-2
-kerning first=46 second=89 amount=-2
-kerning first=65 second=84 amount=-2
-kerning first=46 second=87 amount=-2
-kerning first=46 second=86 amount=-2
-kerning first=46 second=84 amount=-2
-kerning first=44 second=116 amount=-1
-kerning first=44 second=221 amount=-2
-kerning first=44 second=89 amount=-2
-kerning first=44 second=87 amount=-2
-kerning first=44 second=86 amount=-2
-kerning first=44 second=84 amount=-2
-kerning first=191 second=255 amount=-1
-kerning first=191 second=253 amount=-1
-kerning first=191 second=121 amount=-1
-kerning first=191 second=119 amount=-1
-kerning first=65 second=86 amount=-1
-kerning first=65 second=87 amount=-1
-kerning first=191 second=118 amount=-1
-kerning first=191 second=102 amount=-1
-kerning first=191 second=221 amount=-1
-kerning first=191 second=89 amount=-1
-kerning first=65 second=89 amount=-2
-kerning first=191 second=86 amount=-1
-kerning first=65 second=221 amount=-2
-kerning first=191 second=84 amount=-1
-kerning first=122 second=113 amount=-1
-kerning first=65 second=116 amount=-1
-kerning first=122 second=248 amount=-1
-kerning first=122 second=246 amount=-1
-kerning first=122 second=245 amount=-1
-kerning first=65 second=121 amount=-1
-kerning first=122 second=244 amount=-1
-kerning first=65 second=253 amount=-1
-kerning first=122 second=243 amount=-1
-kerning first=65 second=255 amount=-1
-kerning first=65 second=63 amount=-1
-kerning first=122 second=242 amount=-1
-kerning first=122 second=111 amount=-1
-kerning first=122 second=235 amount=-1
-kerning first=122 second=234 amount=-1
-kerning first=122 second=233 amount=-1
-kerning first=122 second=232 amount=-1
-kerning first=122 second=101 amount=-1
-kerning first=122 second=100 amount=-1
-kerning first=122 second=231 amount=-1
-kerning first=122 second=99 amount=-1
-kerning first=255 second=46 amount=-2
-kerning first=255 second=44 amount=-2
-kerning first=253 second=46 amount=-2
-kerning first=253 second=44 amount=-2
-kerning first=121 second=46 amount=-2
-kerning first=121 second=44 amount=-2
-kerning first=120 second=113 amount=-1
-kerning first=120 second=248 amount=-1
-kerning first=120 second=246 amount=-1
-kerning first=120 second=245 amount=-1
-kerning first=120 second=244 amount=-1
-kerning first=120 second=243 amount=-1
-kerning first=120 second=242 amount=-1
-kerning first=120 second=111 amount=-1
-kerning first=120 second=235 amount=-1
-kerning first=120 second=234 amount=-1
-kerning first=120 second=233 amount=-1
-kerning first=120 second=232 amount=-1
-kerning first=120 second=101 amount=-1
-kerning first=120 second=100 amount=-1
-kerning first=120 second=231 amount=-1
-kerning first=120 second=99 amount=-1
-kerning first=119 second=46 amount=-2
-kerning first=119 second=44 amount=-2
-kerning first=118 second=46 amount=-2
-kerning first=118 second=44 amount=-2
-kerning first=223 second=255 amount=-1
-kerning first=223 second=253 amount=-1
-kerning first=223 second=121 amount=-1
-kerning first=114 second=46 amount=-3
-kerning first=114 second=44 amount=-2
-kerning first=114 second=230 amount=-1
-kerning first=114 second=229 amount=-1
-kerning first=114 second=228 amount=-1
-kerning first=114 second=227 amount=-1
-kerning first=114 second=226 amount=-1
-kerning first=114 second=225 amount=-1
-kerning first=114 second=224 amount=-1
-kerning first=114 second=97 amount=-1
-kerning first=254 second=120 amount=-1
-kerning first=112 second=120 amount=-1
-kerning first=248 second=120 amount=-1
-kerning first=246 second=120 amount=-1
-kerning first=245 second=120 amount=-1
-kerning first=244 second=120 amount=-1
-kerning first=243 second=120 amount=-1
-kerning first=242 second=120 amount=-1
-kerning first=111 second=120 amount=-1
-kerning first=192 second=84 amount=-2
-kerning first=107 second=113 amount=-1
-kerning first=107 second=248 amount=-1
-kerning first=107 second=246 amount=-1
-kerning first=107 second=245 amount=-1
-kerning first=107 second=244 amount=-1
-kerning first=107 second=243 amount=-1
-kerning first=107 second=242 amount=-1
-kerning first=107 second=111 amount=-1
-kerning first=107 second=235 amount=-1
-kerning first=107 second=234 amount=-1
-kerning first=107 second=233 amount=-1
-kerning first=107 second=232 amount=-1
-kerning first=107 second=101 amount=-1
-kerning first=192 second=86 amount=-1
-kerning first=192 second=87 amount=-1
-kerning first=107 second=100 amount=-1
-kerning first=107 second=231 amount=-1
-kerning first=107 second=99 amount=-1
-kerning first=103 second=47 amount=1
-kerning first=192 second=89 amount=-2
-kerning first=102 second=46 amount=-2
-kerning first=192 second=221 amount=-2
-kerning first=102 second=44 amount=-2
-kerning first=102 second=113 amount=-1
-kerning first=192 second=116 amount=-1
-kerning first=102 second=248 amount=-1
-kerning first=102 second=246 amount=-1
-kerning first=102 second=245 amount=-1
-kerning first=192 second=121 amount=-1
-kerning first=102 second=244 amount=-1
-kerning first=192 second=253 amount=-1
-kerning first=102 second=243 amount=-1
-kerning first=192 second=255 amount=-1
-kerning first=192 second=63 amount=-1
-kerning first=102 second=242 amount=-1
-kerning first=102 second=111 amount=-1
-kerning first=102 second=103 amount=-1
-kerning first=102 second=235 amount=-1
-kerning first=102 second=234 amount=-1
-kerning first=102 second=233 amount=-1
-kerning first=102 second=232 amount=-1
-kerning first=102 second=101 amount=-1
-kerning first=102 second=100 amount=-1
-kerning first=102 second=231 amount=-1
-kerning first=102 second=99 amount=-1
-kerning first=102 second=230 amount=-1
-kerning first=102 second=229 amount=-1
-kerning first=102 second=228 amount=-1
-kerning first=102 second=227 amount=-1
-kerning first=102 second=226 amount=-1
-kerning first=102 second=225 amount=-1
-kerning first=102 second=224 amount=-1
-kerning first=102 second=97 amount=-1
-kerning first=98 second=120 amount=-1
-kerning first=90 second=118 amount=-1
-kerning first=90 second=239 amount=1
-kerning first=90 second=238 amount=1
-kerning first=221 second=47 amount=-2
-kerning first=221 second=46 amount=-3
-kerning first=221 second=58 amount=-2
-kerning first=221 second=59 amount=-2
-kerning first=221 second=44 amount=-3
-kerning first=221 second=122 amount=-1
-kerning first=221 second=255 amount=-1
-kerning first=221 second=253 amount=-1
-kerning first=221 second=121 amount=-1
-kerning first=221 second=120 amount=-1
-kerning first=221 second=119 amount=-1
-kerning first=221 second=118 amount=-1
-kerning first=221 second=252 amount=-1
-kerning first=221 second=251 amount=-1
-kerning first=221 second=250 amount=-1
-kerning first=221 second=249 amount=-1
-kerning first=221 second=117 amount=-1
-kerning first=221 second=116 amount=-1
-kerning first=221 second=223 amount=-1
-kerning first=221 second=115 amount=-1
-kerning first=221 second=114 amount=-1
-kerning first=221 second=113 amount=-2
-kerning first=221 second=112 amount=-1
-kerning first=221 second=248 amount=-2
-kerning first=221 second=246 amount=-2
-kerning first=221 second=245 amount=-2
-kerning first=221 second=244 amount=-2
-kerning first=221 second=243 amount=-2
-kerning first=221 second=242 amount=-2
-kerning first=221 second=111 amount=-2
-kerning first=221 second=241 amount=-1
-kerning first=221 second=110 amount=-1
-kerning first=221 second=109 amount=-1
-kerning first=221 second=106 amount=-1
-kerning first=221 second=239 amount=1
-kerning first=193 second=84 amount=-2
-kerning first=221 second=238 amount=1
-kerning first=221 second=237 amount=-1
-kerning first=221 second=236 amount=1
-kerning first=221 second=103 amount=-2
-kerning first=221 second=102 amount=-1
-kerning first=221 second=235 amount=-2
-kerning first=221 second=234 amount=-2
-kerning first=221 second=233 amount=-2
-kerning first=221 second=232 amount=-2
-kerning first=221 second=101 amount=-2
-kerning first=221 second=100 amount=-2
-kerning first=221 second=231 amount=-2
-kerning first=221 second=99 amount=-2
-kerning first=193 second=86 amount=-1
-kerning first=193 second=87 amount=-1
-kerning first=221 second=230 amount=-2
-kerning first=221 second=229 amount=-2
-kerning first=221 second=228 amount=-2
-kerning first=221 second=227 amount=-2
-kerning first=193 second=89 amount=-2
-kerning first=221 second=226 amount=-2
-kerning first=193 second=221 amount=-2
-kerning first=221 second=225 amount=-2
-kerning first=221 second=224 amount=-2
-kerning first=193 second=116 amount=-1
-kerning first=221 second=97 amount=-2
-kerning first=221 second=81 amount=-1
-kerning first=221 second=214 amount=-1
-kerning first=193 second=121 amount=-1
-kerning first=221 second=213 amount=-1
-kerning first=193 second=253 amount=-1
-kerning first=221 second=212 amount=-1
-kerning first=193 second=255 amount=-1
-kerning first=193 second=63 amount=-1
-kerning first=221 second=211 amount=-1
-kerning first=221 second=210 amount=-1
-kerning first=221 second=79 amount=-1
-kerning first=221 second=74 amount=-1
-kerning first=221 second=71 amount=-1
-kerning first=221 second=199 amount=-1
-kerning first=221 second=67 amount=-1
-kerning first=221 second=198 amount=-2
-kerning first=221 second=197 amount=-2
-kerning first=221 second=196 amount=-2
-kerning first=221 second=195 amount=-2
-kerning first=221 second=194 amount=-2
-kerning first=221 second=193 amount=-2
-kerning first=221 second=192 amount=-2
-kerning first=221 second=65 amount=-2
-kerning first=89 second=47 amount=-2
-kerning first=89 second=46 amount=-3
-kerning first=89 second=58 amount=-2
-kerning first=89 second=59 amount=-2
-kerning first=89 second=44 amount=-3
-kerning first=89 second=122 amount=-1
-kerning first=89 second=255 amount=-1
-kerning first=89 second=253 amount=-1
-kerning first=89 second=121 amount=-1
-kerning first=89 second=120 amount=-1
-kerning first=89 second=119 amount=-1
-kerning first=89 second=118 amount=-1
-kerning first=89 second=252 amount=-1
-kerning first=89 second=251 amount=-1
-kerning first=89 second=250 amount=-1
-kerning first=89 second=249 amount=-1
-kerning first=89 second=117 amount=-1
-kerning first=89 second=116 amount=-1
-kerning first=89 second=223 amount=-1
-kerning first=89 second=115 amount=-1
-kerning first=89 second=114 amount=-1
-kerning first=89 second=113 amount=-2
-kerning first=89 second=112 amount=-1
-kerning first=89 second=248 amount=-2
-kerning first=89 second=246 amount=-2
-kerning first=89 second=245 amount=-2
-kerning first=89 second=244 amount=-2
-kerning first=89 second=243 amount=-2
-kerning first=89 second=242 amount=-2
-kerning first=89 second=111 amount=-2
-kerning first=89 second=241 amount=-1
-kerning first=89 second=110 amount=-1
-kerning first=89 second=109 amount=-1
-kerning first=89 second=106 amount=-1
-kerning first=89 second=239 amount=1
-kerning first=89 second=238 amount=1
-kerning first=89 second=237 amount=-1
-kerning first=89 second=236 amount=1
-kerning first=89 second=103 amount=-2
-kerning first=89 second=102 amount=-1
-kerning first=89 second=235 amount=-2
-kerning first=89 second=234 amount=-2
-kerning first=89 second=233 amount=-2
-kerning first=194 second=84 amount=-2
-kerning first=89 second=232 amount=-2
-kerning first=89 second=101 amount=-2
-kerning first=89 second=100 amount=-2
-kerning first=89 second=231 amount=-2
-kerning first=89 second=99 amount=-2
-kerning first=89 second=230 amount=-2
-kerning first=89 second=229 amount=-2
-kerning first=89 second=228 amount=-2
-kerning first=89 second=227 amount=-2
-kerning first=89 second=226 amount=-2
-kerning first=89 second=225 amount=-2
-kerning first=89 second=224 amount=-2
-kerning first=89 second=97 amount=-2
-kerning first=194 second=86 amount=-1
-kerning first=194 second=87 amount=-1
-kerning first=89 second=81 amount=-1
-kerning first=89 second=214 amount=-1
-kerning first=89 second=213 amount=-1
-kerning first=89 second=212 amount=-1
-kerning first=194 second=89 amount=-2
-kerning first=89 second=211 amount=-1
-kerning first=194 second=221 amount=-2
-kerning first=89 second=210 amount=-1
-kerning first=89 second=79 amount=-1
-kerning first=194 second=116 amount=-1
-kerning first=89 second=74 amount=-1
-kerning first=89 second=71 amount=-1
-kerning first=89 second=199 amount=-1
-kerning first=194 second=121 amount=-1
-kerning first=89 second=67 amount=-1
-kerning first=194 second=253 amount=-1
-kerning first=89 second=198 amount=-2
-kerning first=194 second=255 amount=-1
-kerning first=194 second=63 amount=-1
-kerning first=89 second=197 amount=-2
-kerning first=89 second=196 amount=-2
-kerning first=89 second=195 amount=-2
-kerning first=89 second=194 amount=-2
-kerning first=89 second=193 amount=-2
-kerning first=89 second=192 amount=-2
-kerning first=89 second=65 amount=-2
-kerning first=88 second=255 amount=-1
-kerning first=88 second=253 amount=-1
-kerning first=88 second=121 amount=-1
-kerning first=88 second=119 amount=-1
-kerning first=88 second=118 amount=-1
-kerning first=88 second=113 amount=-1
-kerning first=88 second=100 amount=-1
-kerning first=88 second=81 amount=-1
-kerning first=88 second=214 amount=-1
-kerning first=88 second=213 amount=-1
-kerning first=88 second=212 amount=-1
-kerning first=88 second=211 amount=-1
-kerning first=88 second=210 amount=-1
-kerning first=88 second=79 amount=-1
-kerning first=88 second=71 amount=-1
-kerning first=88 second=199 amount=-1
-kerning first=88 second=67 amount=-1
-kerning first=87 second=46 amount=-3
-kerning first=87 second=59 amount=-2
-kerning first=87 second=44 amount=-3
-kerning first=87 second=255 amount=-1
-kerning first=87 second=253 amount=-1
-kerning first=87 second=121 amount=-1
-kerning first=87 second=252 amount=-1
-kerning first=87 second=251 amount=-1
-kerning first=87 second=250 amount=-1
-kerning first=87 second=249 amount=-1
-kerning first=87 second=117 amount=-1
-kerning first=87 second=115 amount=-1
-kerning first=87 second=114 amount=-1
-kerning first=87 second=113 amount=-1
-kerning first=87 second=112 amount=-1
-kerning first=87 second=248 amount=-1
-kerning first=87 second=246 amount=-1
-kerning first=87 second=245 amount=-1
-kerning first=87 second=244 amount=-1
-kerning first=87 second=243 amount=-1
-kerning first=87 second=242 amount=-1
-kerning first=87 second=111 amount=-1
-kerning first=87 second=241 amount=-1
-kerning first=87 second=110 amount=-1
-kerning first=87 second=109 amount=-1
-kerning first=87 second=239 amount=1
-kerning first=87 second=103 amount=-1
-kerning first=87 second=235 amount=-1
-kerning first=87 second=234 amount=-1
-kerning first=87 second=233 amount=-1
-kerning first=87 second=232 amount=-1
-kerning first=87 second=101 amount=-1
-kerning first=87 second=100 amount=-1
-kerning first=87 second=231 amount=-1
-kerning first=195 second=84 amount=-2
-kerning first=87 second=99 amount=-1
-kerning first=87 second=230 amount=-1
-kerning first=87 second=229 amount=-1
-kerning first=87 second=228 amount=-1
-kerning first=87 second=227 amount=-1
-kerning first=87 second=226 amount=-1
-kerning first=87 second=225 amount=-1
-kerning first=87 second=224 amount=-1
-kerning first=87 second=97 amount=-1
-kerning first=87 second=74 amount=-1
-kerning first=87 second=198 amount=-2
-kerning first=87 second=197 amount=-1
-kerning first=87 second=196 amount=-1
-kerning first=195 second=86 amount=-1
-kerning first=195 second=87 amount=-1
-kerning first=87 second=195 amount=-1
-kerning first=87 second=194 amount=-1
-kerning first=87 second=193 amount=-1
-kerning first=87 second=192 amount=-1
-kerning first=195 second=89 amount=-2
-kerning first=87 second=65 amount=-1
-kerning first=195 second=221 amount=-2
-kerning first=86 second=47 amount=-1
-kerning first=86 second=46 amount=-3
-kerning first=195 second=116 amount=-1
-kerning first=86 second=58 amount=-1
-kerning first=86 second=59 amount=-1
-kerning first=86 second=44 amount=-2
-kerning first=195 second=121 amount=-1
-kerning first=86 second=122 amount=-1
-kerning first=195 second=253 amount=-1
-kerning first=86 second=252 amount=-1
-kerning first=195 second=255 amount=-1
-kerning first=195 second=63 amount=-1
-kerning first=86 second=251 amount=-1
-kerning first=86 second=250 amount=-1
-kerning first=86 second=249 amount=-1
-kerning first=86 second=117 amount=-1
-kerning first=86 second=115 amount=-1
-kerning first=86 second=114 amount=-1
-kerning first=86 second=113 amount=-1
-kerning first=86 second=112 amount=-1
-kerning first=86 second=248 amount=-1
-kerning first=86 second=246 amount=-1
-kerning first=86 second=245 amount=-1
-kerning first=86 second=244 amount=-1
-kerning first=86 second=243 amount=-1
-kerning first=86 second=242 amount=-1
-kerning first=86 second=111 amount=-1
-kerning first=86 second=241 amount=-1
-kerning first=86 second=110 amount=-1
-kerning first=86 second=109 amount=-1
-kerning first=86 second=239 amount=1
-kerning first=86 second=238 amount=1
-kerning first=86 second=236 amount=1
-kerning first=86 second=103 amount=-1
-kerning first=86 second=235 amount=-1
-kerning first=86 second=234 amount=-1
-kerning first=86 second=233 amount=-1
-kerning first=86 second=232 amount=-1
-kerning first=86 second=101 amount=-1
-kerning first=86 second=100 amount=-1
-kerning first=86 second=231 amount=-1
-kerning first=86 second=99 amount=-1
-kerning first=86 second=230 amount=-1
-kerning first=86 second=229 amount=-1
-kerning first=86 second=228 amount=-1
-kerning first=86 second=227 amount=-1
-kerning first=86 second=226 amount=-1
-kerning first=86 second=225 amount=-1
-kerning first=86 second=224 amount=-1
-kerning first=86 second=97 amount=-1
-kerning first=86 second=74 amount=-1
-kerning first=86 second=198 amount=-2
-kerning first=86 second=197 amount=-1
-kerning first=86 second=196 amount=-1
-kerning first=86 second=195 amount=-1
-kerning first=86 second=194 amount=-1
-kerning first=86 second=193 amount=-1
-kerning first=86 second=192 amount=-1
-kerning first=86 second=65 amount=-1
-kerning first=220 second=74 amount=-1
-kerning first=220 second=197 amount=-1
-kerning first=220 second=196 amount=-1
-kerning first=220 second=195 amount=-1
-kerning first=220 second=194 amount=-1
-kerning first=220 second=193 amount=-1
-kerning first=220 second=192 amount=-1
-kerning first=220 second=65 amount=-1
-kerning first=219 second=74 amount=-1
-kerning first=219 second=197 amount=-1
-kerning first=219 second=196 amount=-1
-kerning first=196 second=84 amount=-2
-kerning first=219 second=195 amount=-1
-kerning first=219 second=194 amount=-1
-kerning first=219 second=193 amount=-1
-kerning first=219 second=192 amount=-1
-kerning first=219 second=65 amount=-1
-kerning first=218 second=74 amount=-1
-kerning first=218 second=197 amount=-1
-kerning first=218 second=196 amount=-1
-kerning first=218 second=195 amount=-1
-kerning first=218 second=194 amount=-1
-kerning first=218 second=193 amount=-1
-kerning first=218 second=192 amount=-1
-kerning first=218 second=65 amount=-1
-kerning first=196 second=86 amount=-1
-kerning first=196 second=87 amount=-1
-kerning first=217 second=74 amount=-1
-kerning first=217 second=197 amount=-1
-kerning first=217 second=196 amount=-1
-kerning first=217 second=195 amount=-1
-kerning first=196 second=89 amount=-2
-kerning first=217 second=194 amount=-1
-kerning first=196 second=221 amount=-2
-kerning first=217 second=193 amount=-1
-kerning first=217 second=192 amount=-1
-kerning first=196 second=116 amount=-1
-kerning first=217 second=65 amount=-1
-kerning first=85 second=74 amount=-1
-kerning first=85 second=197 amount=-1
-kerning first=196 second=121 amount=-1
-kerning first=85 second=196 amount=-1
-kerning first=196 second=253 amount=-1
-kerning first=85 second=195 amount=-1
-kerning first=196 second=255 amount=-1
-kerning first=196 second=63 amount=-1
-kerning first=85 second=194 amount=-1
-kerning first=85 second=193 amount=-1
-kerning first=85 second=192 amount=-1
-kerning first=85 second=65 amount=-1
-kerning first=84 second=47 amount=-1
-kerning first=84 second=46 amount=-3
-kerning first=84 second=58 amount=-2
-kerning first=84 second=59 amount=-1
-kerning first=84 second=44 amount=-3
-kerning first=84 second=122 amount=-2
-kerning first=84 second=255 amount=-1
-kerning first=84 second=253 amount=-1
-kerning first=84 second=121 amount=-1
-kerning first=84 second=120 amount=-1
-kerning first=84 second=119 amount=-1
-kerning first=84 second=118 amount=-1
-kerning first=84 second=252 amount=-2
-kerning first=84 second=251 amount=-2
-kerning first=84 second=250 amount=-2
-kerning first=84 second=249 amount=-2
-kerning first=84 second=117 amount=-2
-kerning first=84 second=115 amount=-2
-kerning first=84 second=114 amount=-2
-kerning first=84 second=113 amount=-2
-kerning first=84 second=112 amount=-2
-kerning first=84 second=248 amount=-2
-kerning first=84 second=246 amount=-2
-kerning first=84 second=245 amount=-2
-kerning first=84 second=244 amount=-2
-kerning first=84 second=243 amount=-2
-kerning first=84 second=242 amount=-2
-kerning first=84 second=111 amount=-2
-kerning first=84 second=241 amount=-2
-kerning first=84 second=110 amount=-2
-kerning first=84 second=109 amount=-2
-kerning first=84 second=239 amount=1
-kerning first=84 second=238 amount=1
-kerning first=84 second=103 amount=-2
-kerning first=84 second=235 amount=-2
-kerning first=84 second=234 amount=-2
-kerning first=84 second=233 amount=-2
-kerning first=84 second=232 amount=-2
-kerning first=84 second=101 amount=-2
-kerning first=84 second=100 amount=-2
-kerning first=84 second=231 amount=-2
-kerning first=84 second=99 amount=-2
-kerning first=84 second=230 amount=-2
-kerning first=84 second=229 amount=-2
-kerning first=84 second=228 amount=-2
-kerning first=84 second=227 amount=-2
-kerning first=84 second=226 amount=-2
-kerning first=84 second=225 amount=-2
-kerning first=84 second=224 amount=-2
-kerning first=84 second=97 amount=-2
-kerning first=84 second=81 amount=-1
-kerning first=84 second=214 amount=-1
-kerning first=84 second=213 amount=-1
-kerning first=84 second=212 amount=-1
-kerning first=84 second=211 amount=-1
-kerning first=84 second=210 amount=-1
-kerning first=84 second=79 amount=-1
-kerning first=84 second=74 amount=-1
-kerning first=84 second=71 amount=-1
-kerning first=84 second=199 amount=-1
-kerning first=84 second=67 amount=-1
-kerning first=84 second=198 amount=-2
-kerning first=84 second=197 amount=-2
-kerning first=84 second=196 amount=-2
-kerning first=84 second=195 amount=-2
-kerning first=84 second=194 amount=-2
-kerning first=84 second=193 amount=-2
-kerning first=84 second=192 amount=-2
-kerning first=84 second=65 amount=-2
-kerning first=82 second=248 amount=-1
-kerning first=82 second=246 amount=-1
-kerning first=82 second=245 amount=-1
-kerning first=82 second=244 amount=-1
-kerning first=82 second=243 amount=-1
-kerning first=82 second=242 amount=-1
-kerning first=82 second=111 amount=-1
-kerning first=81 second=47 amount=2
-kerning first=81 second=59 amount=1
-kerning first=81 second=44 amount=1
-kerning first=81 second=106 amount=1
-kerning first=81 second=103 amount=1
-kerning first=81 second=221 amount=-1
-kerning first=81 second=89 amount=-1
-kerning first=81 second=84 amount=-1
-kerning first=81 second=74 amount=1
-kerning first=81 second=198 amount=1
-kerning first=80 second=47 amount=-1
-kerning first=80 second=46 amount=-3
-kerning first=80 second=44 amount=-3
-kerning first=80 second=248 amount=-1
-kerning first=80 second=246 amount=-1
-kerning first=80 second=245 amount=-1
-kerning first=80 second=244 amount=-1
-kerning first=80 second=243 amount=-1
-kerning first=80 second=242 amount=-1
-kerning first=80 second=111 amount=-1
-kerning first=80 second=235 amount=-1
-kerning first=80 second=234 amount=-1
-kerning first=80 second=233 amount=-1
-kerning first=80 second=232 amount=-1
-kerning first=80 second=101 amount=-1
-kerning first=80 second=231 amount=-1
-kerning first=80 second=99 amount=-1
-kerning first=80 second=230 amount=-1
-kerning first=80 second=229 amount=-1
-kerning first=80 second=228 amount=-1
-kerning first=80 second=227 amount=-1
-kerning first=80 second=226 amount=-1
-kerning first=80 second=225 amount=-1
-kerning first=80 second=224 amount=-1
-kerning first=80 second=97 amount=-1
-kerning first=80 second=74 amount=-2
-kerning first=80 second=198 amount=-2
-kerning first=80 second=197 amount=-2
-kerning first=80 second=196 amount=-2
-kerning first=80 second=195 amount=-2
-kerning first=80 second=194 amount=-2
-kerning first=80 second=193 amount=-2
-kerning first=80 second=192 amount=-2
-kerning first=80 second=65 amount=-2
-kerning first=214 second=44 amount=-1
-kerning first=214 second=221 amount=-1
-kerning first=214 second=89 amount=-1
-kerning first=214 second=88 amount=-1
-kerning first=214 second=84 amount=-1
-kerning first=213 second=44 amount=-1
-kerning first=213 second=221 amount=-1
-kerning first=213 second=89 amount=-1
-kerning first=213 second=88 amount=-1
-kerning first=213 second=84 amount=-1
-kerning first=212 second=44 amount=-1
-kerning first=212 second=221 amount=-1
-kerning first=212 second=89 amount=-1
-kerning first=212 second=88 amount=-1
-kerning first=212 second=84 amount=-1
-kerning first=211 second=44 amount=-1
-kerning first=211 second=221 amount=-1
-kerning first=211 second=89 amount=-1
-kerning first=211 second=88 amount=-1
-kerning first=211 second=84 amount=-1
-kerning first=210 second=44 amount=-1
-kerning first=210 second=221 amount=-1
-kerning first=210 second=89 amount=-1
-kerning first=210 second=88 amount=-1
-kerning first=210 second=84 amount=-1
-kerning first=79 second=44 amount=-1
-kerning first=79 second=221 amount=-1
-kerning first=79 second=89 amount=-1
-kerning first=79 second=88 amount=-1
-kerning first=79 second=84 amount=-1
-kerning first=76 second=255 amount=-1
-kerning first=76 second=253 amount=-1
-kerning first=76 second=121 amount=-1
-kerning first=76 second=119 amount=-1
-kerning first=76 second=118 amount=-1
-kerning first=76 second=221 amount=-2
-kerning first=76 second=89 amount=-2
-kerning first=76 second=87 amount=-2
-kerning first=76 second=86 amount=-2
-kerning first=76 second=220 amount=-1
-kerning first=76 second=219 amount=-1
-kerning first=76 second=218 amount=-1
-kerning first=76 second=217 amount=-1
-kerning first=76 second=85 amount=-1
-kerning first=76 second=84 amount=-2
-kerning first=76 second=81 amount=-1
-kerning first=76 second=214 amount=-1
-kerning first=76 second=213 amount=-1
-kerning first=76 second=212 amount=-1
-kerning first=76 second=211 amount=-1
-kerning first=76 second=210 amount=-1
-kerning first=76 second=79 amount=-1
-kerning first=76 second=71 amount=-1
-kerning first=76 second=198 amount=1
-kerning first=75 second=255 amount=-1
-kerning first=75 second=253 amount=-1
-kerning first=75 second=121 amount=-1
-kerning first=75 second=119 amount=-1
-kerning first=75 second=118 amount=-1
-kerning first=75 second=231 amount=-1
-kerning first=75 second=99 amount=-1
-kerning first=75 second=81 amount=-1
-kerning first=75 second=214 amount=-1
-kerning first=75 second=213 amount=-1
-kerning first=75 second=212 amount=-1
-kerning first=75 second=211 amount=-1
-kerning first=75 second=210 amount=-1
-kerning first=75 second=79 amount=-1
-kerning first=75 second=71 amount=-1
-kerning first=75 second=199 amount=-1
-kerning first=75 second=67 amount=-1
-kerning first=70 second=47 amount=-1
-kerning first=70 second=46 amount=-2
-kerning first=70 second=44 amount=-3
-kerning first=70 second=230 amount=-1
-kerning first=70 second=229 amount=-1
-kerning first=70 second=228 amount=-1
-kerning first=70 second=227 amount=-1
-kerning first=70 second=226 amount=-1
-kerning first=70 second=225 amount=-1
-kerning first=70 second=224 amount=-1
-kerning first=70 second=97 amount=-1
-kerning first=70 second=74 amount=-1
-kerning first=70 second=198 amount=-1
-kerning first=70 second=197 amount=-1
-kerning first=70 second=196 amount=-1
-kerning first=70 second=195 amount=-1
-kerning first=70 second=194 amount=-1
-kerning first=70 second=193 amount=-1
-kerning first=70 second=192 amount=-1
-kerning first=70 second=65 amount=-1
-kerning first=203 second=255 amount=-1
-kerning first=203 second=253 amount=-1
-kerning first=203 second=121 amount=-1
-kerning first=203 second=118 amount=-1
-kerning first=203 second=102 amount=-1
-kerning first=202 second=255 amount=-1
-kerning first=202 second=253 amount=-1
-kerning first=202 second=121 amount=-1
-kerning first=202 second=118 amount=-1
-kerning first=202 second=102 amount=-1
-kerning first=201 second=255 amount=-1
-kerning first=201 second=253 amount=-1
-kerning first=201 second=121 amount=-1
-kerning first=201 second=118 amount=-1
-kerning first=201 second=102 amount=-1
-kerning first=200 second=255 amount=-1
-kerning first=200 second=253 amount=-1
-kerning first=200 second=121 amount=-1
-kerning first=200 second=118 amount=-1
-kerning first=200 second=102 amount=-1
-kerning first=69 second=255 amount=-1
-kerning first=69 second=253 amount=-1
-kerning first=69 second=121 amount=-1
-kerning first=69 second=118 amount=-1
-kerning first=69 second=102 amount=-1
-kerning first=208 second=46 amount=-1
-kerning first=208 second=44 amount=-1
-kerning first=68 second=46 amount=-1
-kerning first=68 second=44 amount=-1
-kerning first=197 second=84 amount=-2
-kerning first=66 second=221 amount=-1
-kerning first=66 second=89 amount=-1
-kerning first=66 second=88 amount=-1
-kerning first=66 second=84 amount=-1
-kerning first=198 second=255 amount=-1
-kerning first=198 second=253 amount=-1
-kerning first=198 second=121 amount=-1
-kerning first=198 second=118 amount=-1
-kerning first=198 second=102 amount=-1
-kerning first=197 second=63 amount=-1
-kerning first=197 second=255 amount=-1
-kerning first=197 second=253 amount=-1
-kerning first=197 second=121 amount=-1
-kerning first=197 second=86 amount=-1
-kerning first=197 second=87 amount=-1
-kerning first=197 second=116 amount=-1
-kerning first=197 second=221 amount=-2
-kerning first=197 second=89 amount=-2
diff --git a/External tools/Myra.1.2.1.0/Assets/fonts/calibri32_0.png b/External tools/Myra.1.2.1.0/Assets/fonts/calibri32_0.png
deleted file mode 100644
index 686ae0f..0000000
Binary files a/External tools/Myra.1.2.1.0/Assets/fonts/calibri32_0.png and /dev/null differ
diff --git a/External tools/Myra.1.2.1.0/Assets/fonts/comicSans48.fnt b/External tools/Myra.1.2.1.0/Assets/fonts/comicSans48.fnt
deleted file mode 100644
index 0ba8894..0000000
--- a/External tools/Myra.1.2.1.0/Assets/fonts/comicSans48.fnt
+++ /dev/null
@@ -1,195 +0,0 @@
-info face="Comic Sans MS" size=48 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
-common lineHeight=47 base=37 scaleW=512 scaleH=512 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
-page id=0 file="comicSans48_0.png"
-chars count=191
-char id=32 x=507 y=30 width=3 height=1 xoffset=-1 yoffset=46 xadvance=10 page=0 chnl=15
-char id=33 x=341 y=67 width=5 height=28 xoffset=1 yoffset=10 xadvance=8 page=0 chnl=15
-char id=34 x=269 y=172 width=11 height=11 xoffset=1 yoffset=11 xadvance=14 page=0 chnl=15
-char id=35 x=293 y=97 width=29 height=26 xoffset=0 yoffset=11 xadvance=29 page=0 chnl=15
-char id=36 x=441 y=0 width=20 height=34 xoffset=1 yoffset=9 xadvance=24 page=0 chnl=15
-char id=37 x=439 y=65 width=26 height=27 xoffset=2 yoffset=10 xadvance=28 page=0 chnl=15
-char id=38 x=49 y=74 width=22 height=28 xoffset=0 yoffset=11 xadvance=22 page=0 chnl=15
-char id=39 x=308 y=170 width=5 height=9 xoffset=4 yoffset=9 xadvance=13 page=0 chnl=15
-char id=40 x=82 y=38 width=11 height=34 xoffset=1 yoffset=10 xadvance=12 page=0 chnl=15
-char id=41 x=94 y=38 width=11 height=34 xoffset=1 yoffset=10 xadvance=12 page=0 chnl=15
-char id=42 x=110 y=181 width=17 height=14 xoffset=0 yoffset=10 xadvance=18 page=0 chnl=15
-char id=43 x=175 y=179 width=16 height=13 xoffset=0 yoffset=20 xadvance=16 page=0 chnl=15
-char id=44 x=370 y=168 width=6 height=8 xoffset=3 yoffset=35 xadvance=9 page=0 chnl=15
-char id=45 x=465 y=165 width=12 height=3 xoffset=1 yoffset=26 xadvance=13 page=0 chnl=15
-char id=46 x=383 y=168 width=5 height=4 xoffset=2 yoffset=35 xadvance=8 page=0 chnl=15
-char id=47 x=284 y=68 width=16 height=28 xoffset=1 yoffset=11 xadvance=17 page=0 chnl=15
-char id=48 x=112 y=130 width=21 height=26 xoffset=0 yoffset=11 xadvance=21 page=0 chnl=15
-char id=49 x=497 y=93 width=12 height=26 xoffset=2 yoffset=11 xadvance=15 page=0 chnl=15
-char id=50 x=330 y=123 width=17 height=26 xoffset=2 yoffset=11 xadvance=21 page=0 chnl=15
-char id=51 x=348 y=123 width=17 height=26 xoffset=2 yoffset=11 xadvance=21 page=0 chnl=15
-char id=52 x=134 y=128 width=21 height=26 xoffset=0 yoffset=11 xadvance=21 page=0 chnl=15
-char id=53 x=177 y=128 width=19 height=26 xoffset=1 yoffset=11 xadvance=21 page=0 chnl=15
-char id=54 x=255 y=125 width=18 height=26 xoffset=1 yoffset=11 xadvance=21 page=0 chnl=15
-char id=55 x=90 y=130 width=21 height=26 xoffset=0 yoffset=11 xadvance=21 page=0 chnl=15
-char id=56 x=197 y=127 width=19 height=26 xoffset=1 yoffset=11 xadvance=21 page=0 chnl=15
-char id=57 x=115 y=71 width=19 height=28 xoffset=1 yoffset=11 xadvance=21 page=0 chnl=15
-char id=58 x=32 y=185 width=6 height=17 xoffset=2 yoffset=18 xadvance=10 page=0 chnl=15
-char id=59 x=202 y=154 width=7 height=22 xoffset=1 yoffset=18 xadvance=10 page=0 chnl=15
-char id=60 x=140 y=181 width=11 height=14 xoffset=0 yoffset=20 xadvance=13 page=0 chnl=15
-char id=61 x=239 y=174 width=14 height=12 xoffset=1 yoffset=20 xadvance=17 page=0 chnl=15
-char id=62 x=56 y=184 width=13 height=16 xoffset=0 yoffset=18 xadvance=13 page=0 chnl=15
-char id=63 x=456 y=120 width=16 height=26 xoffset=0 yoffset=12 xadvance=17 page=0 chnl=15
-char id=64 x=423 y=35 width=27 height=29 xoffset=1 yoffset=10 xadvance=30 page=0 chnl=15
-char id=65 x=0 y=132 width=22 height=26 xoffset=1 yoffset=11 xadvance=24 page=0 chnl=15
-char id=66 x=19 y=104 width=18 height=27 xoffset=2 yoffset=11 xadvance=21 page=0 chnl=15
-char id=67 x=466 y=65 width=20 height=27 xoffset=1 yoffset=10 xadvance=20 page=0 chnl=15
-char id=68 x=26 y=75 width=22 height=28 xoffset=2 yoffset=11 xadvance=25 page=0 chnl=15
-char id=69 x=95 y=73 width=19 height=28 xoffset=2 yoffset=11 xadvance=21 page=0 chnl=15
-char id=70 x=135 y=71 width=19 height=28 xoffset=2 yoffset=11 xadvance=21 page=0 chnl=15
-char id=71 x=23 y=132 width=22 height=26 xoffset=1 yoffset=11 xadvance=23 page=0 chnl=15
-char id=72 x=450 y=93 width=23 height=26 xoffset=2 yoffset=11 xadvance=26 page=0 chnl=15
-char id=73 x=402 y=121 width=17 height=26 xoffset=1 yoffset=11 xadvance=19 page=0 chnl=15
-char id=74 x=72 y=73 width=22 height=28 xoffset=1 yoffset=11 xadvance=23 page=0 chnl=15
-char id=75 x=174 y=70 width=18 height=28 xoffset=3 yoffset=11 xadvance=21 page=0 chnl=15
-char id=76 x=212 y=69 width=18 height=28 xoffset=1 yoffset=11 xadvance=19 page=0 chnl=15
-char id=77 x=382 y=66 width=28 height=27 xoffset=1 yoffset=11 xadvance=29 page=0 chnl=15
-char id=78 x=349 y=94 width=25 height=26 xoffset=1 yoffset=11 xadvance=27 page=0 chnl=15
-char id=79 x=323 y=96 width=25 height=26 xoffset=1 yoffset=11 xadvance=27 page=0 chnl=15
-char id=80 x=420 y=121 width=17 height=26 xoffset=1 yoffset=11 xadvance=18 page=0 chnl=15
-char id=81 x=106 y=37 width=29 height=33 xoffset=1 yoffset=11 xadvance=30 page=0 chnl=15
-char id=82 x=156 y=128 width=20 height=26 xoffset=1 yoffset=11 xadvance=21 page=0 chnl=15
-char id=83 x=473 y=120 width=21 height=25 xoffset=2 yoffset=13 xadvance=24 page=0 chnl=15
-char id=84 x=375 y=94 width=24 height=26 xoffset=1 yoffset=11 xadvance=23 page=0 chnl=15
-char id=85 x=474 y=93 width=22 height=26 xoffset=2 yoffset=11 xadvance=25 page=0 chnl=15
-char id=86 x=46 y=132 width=21 height=26 xoffset=2 yoffset=11 xadvance=22 page=0 chnl=15
-char id=87 x=347 y=66 width=34 height=27 xoffset=2 yoffset=11 xadvance=35 page=0 chnl=15
-char id=88 x=425 y=93 width=24 height=26 xoffset=0 yoffset=11 xadvance=25 page=0 chnl=15
-char id=89 x=68 y=131 width=21 height=26 xoffset=0 yoffset=12 xadvance=22 page=0 chnl=15
-char id=90 x=400 y=94 width=24 height=26 xoffset=0 yoffset=11 xadvance=24 page=0 chnl=15
-char id=91 x=238 y=36 width=11 height=32 xoffset=2 yoffset=12 xadvance=13 page=0 chnl=15
-char id=92 x=318 y=67 width=16 height=28 xoffset=2 yoffset=11 xadvance=19 page=0 chnl=15
-char id=93 x=226 y=36 width=11 height=32 xoffset=2 yoffset=12 xadvance=13 page=0 chnl=15
-char id=94 x=281 y=171 width=15 height=9 xoffset=3 yoffset=10 xadvance=19 page=0 chnl=15
-char id=95 x=413 y=166 width=23 height=3 xoffset=-1 yoffset=40 xadvance=21 page=0 chnl=15
-char id=96 x=361 y=169 width=8 height=8 xoffset=2 yoffset=10 xadvance=19 page=0 chnl=15
-char id=97 x=460 y=147 width=17 height=17 xoffset=0 yoffset=20 xadvance=17 page=0 chnl=15
-char id=98 x=114 y=102 width=17 height=27 xoffset=2 yoffset=10 xadvance=20 page=0 chnl=15
-char id=99 x=0 y=185 width=15 height=17 xoffset=1 yoffset=20 xadvance=17 page=0 chnl=15
-char id=100 x=38 y=104 width=18 height=27 xoffset=1 yoffset=10 xadvance=20 page=0 chnl=15
-char id=101 x=405 y=148 width=18 height=17 xoffset=1 yoffset=20 xadvance=19 page=0 chnl=15
-char id=102 x=494 y=35 width=16 height=29 xoffset=0 yoffset=10 xadvance=17 page=0 chnl=15
-char id=103 x=366 y=121 width=17 height=26 xoffset=0 yoffset=20 xadvance=18 page=0 chnl=15
-char id=104 x=132 y=100 width=17 height=27 xoffset=2 yoffset=10 xadvance=20 page=0 chnl=15
-char id=105 x=101 y=157 width=6 height=24 xoffset=2 yoffset=13 xadvance=10 page=0 chnl=15
-char id=106 x=40 y=39 width=13 height=34 xoffset=-1 yoffset=13 xadvance=14 page=0 chnl=15
-char id=107 x=150 y=100 width=17 height=27 xoffset=2 yoffset=11 xadvance=18 page=0 chnl=15
-char id=108 x=335 y=67 width=5 height=28 xoffset=2 yoffset=10 xadvance=9 page=0 chnl=15
-char id=109 x=276 y=152 width=25 height=18 xoffset=1 yoffset=20 xadvance=26 page=0 chnl=15
-char id=110 x=442 y=147 width=17 height=17 xoffset=1 yoffset=20 xadvance=18 page=0 chnl=15
-char id=111 x=495 y=146 width=16 height=17 xoffset=1 yoffset=20 xadvance=18 page=0 chnl=15
-char id=112 x=301 y=68 width=16 height=28 xoffset=1 yoffset=19 xadvance=18 page=0 chnl=15
-char id=113 x=312 y=124 width=17 height=26 xoffset=0 yoffset=20 xadvance=18 page=0 chnl=15
-char id=114 x=16 y=185 width=15 height=17 xoffset=1 yoffset=20 xadvance=16 page=0 chnl=15
-char id=115 x=227 y=154 width=16 height=19 xoffset=0 yoffset=18 xadvance=17 page=0 chnl=15
-char id=116 x=145 y=155 width=16 height=23 xoffset=0 yoffset=14 xadvance=16 page=0 chnl=15
-char id=117 x=478 y=146 width=16 height=17 xoffset=1 yoffset=20 xadvance=18 page=0 chnl=15
-char id=118 x=345 y=150 width=17 height=18 xoffset=0 yoffset=20 xadvance=17 page=0 chnl=15
-char id=119 x=363 y=150 width=22 height=17 xoffset=1 yoffset=20 xadvance=23 page=0 chnl=15
-char id=120 x=324 y=151 width=20 height=18 xoffset=0 yoffset=20 xadvance=20 page=0 chnl=15
-char id=121 x=487 y=65 width=19 height=27 xoffset=-1 yoffset=20 xadvance=18 page=0 chnl=15
-char id=122 x=424 y=148 width=17 height=17 xoffset=1 yoffset=20 xadvance=18 page=0 chnl=15
-char id=123 x=68 y=38 width=13 height=34 xoffset=-1 yoffset=10 xadvance=12 page=0 chnl=15
-char id=124 x=502 y=0 width=4 height=34 xoffset=5 yoffset=9 xadvance=14 page=0 chnl=15
-char id=125 x=54 y=39 width=13 height=34 xoffset=-1 yoffset=10 xadvance=12 page=0 chnl=15
-char id=126 x=314 y=170 width=19 height=8 xoffset=1 yoffset=21 xadvance=19 page=0 chnl=15
-char id=160 x=507 y=28 width=3 height=1 xoffset=-1 yoffset=46 xadvance=10 page=0 chnl=15
-char id=161 x=287 y=97 width=5 height=27 xoffset=1 yoffset=11 xadvance=8 page=0 chnl=15
-char id=162 x=193 y=70 width=18 height=28 xoffset=1 yoffset=8 xadvance=21 page=0 chnl=15
-char id=163 x=317 y=36 width=25 height=30 xoffset=0 yoffset=10 xadvance=27 page=0 chnl=15
-char id=164 x=302 y=151 width=21 height=18 xoffset=0 yoffset=16 xadvance=21 page=0 chnl=15
-char id=165 x=81 y=158 width=19 height=24 xoffset=2 yoffset=13 xadvance=22 page=0 chnl=15
-char id=166 x=507 y=0 width=4 height=27 xoffset=5 yoffset=10 xadvance=14 page=0 chnl=15
-char id=167 x=236 y=126 width=18 height=26 xoffset=1 yoffset=11 xadvance=22 page=0 chnl=15
-char id=168 x=437 y=166 width=14 height=3 xoffset=3 yoffset=14 xadvance=19 page=0 chnl=15
-char id=169 x=177 y=155 width=24 height=22 xoffset=1 yoffset=10 xadvance=26 page=0 chnl=15
-char id=170 x=225 y=174 width=13 height=13 xoffset=1 yoffset=9 xadvance=16 page=0 chnl=15
-char id=171 x=90 y=183 width=19 height=14 xoffset=0 yoffset=20 xadvance=20 page=0 chnl=15
-char id=172 x=334 y=170 width=16 height=8 xoffset=0 yoffset=25 xadvance=16 page=0 chnl=15
-char id=173 x=452 y=165 width=12 height=3 xoffset=1 yoffset=26 xadvance=13 page=0 chnl=15
-char id=174 x=35 y=159 width=24 height=24 xoffset=1 yoffset=10 xadvance=26 page=0 chnl=15
-char id=175 x=389 y=166 width=23 height=3 xoffset=-1 yoffset=6 xadvance=21 page=0 chnl=15
-char id=176 x=254 y=172 width=14 height=12 xoffset=0 yoffset=9 xadvance=14 page=0 chnl=15
-char id=177 x=210 y=154 width=16 height=19 xoffset=0 yoffset=20 xadvance=16 page=0 chnl=15
-char id=178 x=128 y=181 width=11 height=14 xoffset=6 yoffset=8 xadvance=22 page=0 chnl=15
-char id=179 x=164 y=179 width=10 height=14 xoffset=6 yoffset=9 xadvance=22 page=0 chnl=15
-char id=180 x=351 y=169 width=9 height=8 xoffset=3 yoffset=10 xadvance=17 page=0 chnl=15
-char id=181 x=60 y=159 width=20 height=24 xoffset=0 yoffset=20 xadvance=18 page=0 chnl=15
-char id=182 x=451 y=35 width=23 height=29 xoffset=0 yoffset=11 xadvance=24 page=0 chnl=15
-char id=183 x=377 y=168 width=5 height=4 xoffset=2 yoffset=24 xadvance=8 page=0 chnl=15
-char id=184 x=297 y=171 width=10 height=9 xoffset=5 yoffset=35 xadvance=19 page=0 chnl=15
-char id=185 x=152 y=179 width=11 height=14 xoffset=6 yoffset=8 xadvance=22 page=0 chnl=15
-char id=186 x=192 y=178 width=16 height=13 xoffset=0 yoffset=9 xadvance=16 page=0 chnl=15
-char id=187 x=70 y=184 width=19 height=14 xoffset=0 yoffset=20 xadvance=20 page=0 chnl=15
-char id=188 x=20 y=40 width=19 height=34 xoffset=2 yoffset=9 xadvance=22 page=0 chnl=15
-char id=189 x=0 y=40 width=19 height=34 xoffset=2 yoffset=9 xadvance=22 page=0 chnl=15
-char id=190 x=482 y=0 width=19 height=34 xoffset=2 yoffset=9 xadvance=22 page=0 chnl=15
-char id=191 x=438 y=120 width=17 height=26 xoffset=0 yoffset=12 xadvance=17 page=0 chnl=15
-char id=192 x=241 y=0 width=22 height=35 xoffset=1 yoffset=2 xadvance=24 page=0 chnl=15
-char id=193 x=418 y=0 width=22 height=34 xoffset=1 yoffset=3 xadvance=24 page=0 chnl=15
-char id=194 x=218 y=0 width=22 height=35 xoffset=1 yoffset=2 xadvance=24 page=0 chnl=15
-char id=195 x=136 y=37 width=24 height=33 xoffset=1 yoffset=4 xadvance=24 page=0 chnl=15
-char id=196 x=343 y=35 width=22 height=30 xoffset=1 yoffset=7 xadvance=24 page=0 chnl=15
-char id=197 x=161 y=36 width=22 height=33 xoffset=1 yoffset=4 xadvance=24 page=0 chnl=15
-char id=198 x=383 y=35 width=39 height=29 xoffset=0 yoffset=10 xadvance=38 page=0 chnl=15
-char id=199 x=205 y=36 width=20 height=32 xoffset=1 yoffset=11 xadvance=20 page=0 chnl=15
-char id=200 x=40 y=0 width=19 height=38 xoffset=2 yoffset=1 xadvance=21 page=0 chnl=15
-char id=201 x=20 y=0 width=19 height=39 xoffset=2 yoffset=0 xadvance=21 page=0 chnl=15
-char id=202 x=0 y=0 width=19 height=39 xoffset=2 yoffset=0 xadvance=21 page=0 chnl=15
-char id=203 x=462 y=0 width=19 height=34 xoffset=2 yoffset=5 xadvance=21 page=0 chnl=15
-char id=204 x=287 y=0 width=17 height=35 xoffset=1 yoffset=2 xadvance=19 page=0 chnl=15
-char id=205 x=305 y=0 width=17 height=35 xoffset=1 yoffset=2 xadvance=19 page=0 chnl=15
-char id=206 x=125 y=0 width=17 height=36 xoffset=1 yoffset=1 xadvance=19 page=0 chnl=15
-char id=207 x=299 y=36 width=17 height=31 xoffset=1 yoffset=6 xadvance=19 page=0 chnl=15
-char id=208 x=0 y=75 width=25 height=28 xoffset=-1 yoffset=11 xadvance=25 page=0 chnl=15
-char id=209 x=340 y=0 width=25 height=34 xoffset=1 yoffset=3 xadvance=27 page=0 chnl=15
-char id=210 x=169 y=0 width=25 height=35 xoffset=1 yoffset=2 xadvance=27 page=0 chnl=15
-char id=211 x=392 y=0 width=25 height=34 xoffset=1 yoffset=3 xadvance=27 page=0 chnl=15
-char id=212 x=143 y=0 width=25 height=35 xoffset=1 yoffset=2 xadvance=27 page=0 chnl=15
-char id=213 x=366 y=0 width=25 height=34 xoffset=1 yoffset=3 xadvance=27 page=0 chnl=15
-char id=214 x=250 y=36 width=25 height=31 xoffset=1 yoffset=6 xadvance=27 page=0 chnl=15
-char id=215 x=209 y=177 width=15 height=13 xoffset=0 yoffset=20 xadvance=16 page=0 chnl=15
-char id=216 x=411 y=65 width=27 height=27 xoffset=1 yoffset=11 xadvance=27 page=0 chnl=15
-char id=217 x=195 y=0 width=22 height=35 xoffset=2 yoffset=2 xadvance=25 page=0 chnl=15
-char id=218 x=264 y=0 width=22 height=35 xoffset=2 yoffset=2 xadvance=25 page=0 chnl=15
-char id=219 x=102 y=0 width=22 height=36 xoffset=2 yoffset=1 xadvance=25 page=0 chnl=15
-char id=220 x=276 y=36 width=22 height=31 xoffset=2 yoffset=6 xadvance=25 page=0 chnl=15
-char id=221 x=60 y=0 width=21 height=37 xoffset=0 yoffset=1 xadvance=22 page=0 chnl=15
-char id=222 x=384 y=121 width=17 height=26 xoffset=1 yoffset=11 xadvance=18 page=0 chnl=15
-char id=223 x=366 y=35 width=16 height=30 xoffset=0 yoffset=10 xadvance=16 page=0 chnl=15
-char id=224 x=0 y=104 width=18 height=27 xoffset=0 yoffset=10 xadvance=17 page=0 chnl=15
-char id=225 x=76 y=102 width=18 height=27 xoffset=0 yoffset=10 xadvance=17 page=0 chnl=15
-char id=226 x=231 y=69 width=18 height=28 xoffset=0 yoffset=9 xadvance=17 page=0 chnl=15
-char id=227 x=217 y=127 width=18 height=26 xoffset=0 yoffset=11 xadvance=17 page=0 chnl=15
-char id=228 x=108 y=157 width=18 height=23 xoffset=0 yoffset=14 xadvance=17 page=0 chnl=15
-char id=229 x=475 y=35 width=18 height=29 xoffset=0 yoffset=8 xadvance=17 page=0 chnl=15
-char id=230 x=244 y=153 width=31 height=18 xoffset=0 yoffset=20 xadvance=31 page=0 chnl=15
-char id=231 x=19 y=159 width=15 height=25 xoffset=1 yoffset=20 xadvance=17 page=0 chnl=15
-char id=232 x=57 y=103 width=18 height=27 xoffset=1 yoffset=10 xadvance=19 page=0 chnl=15
-char id=233 x=95 y=102 width=18 height=27 xoffset=1 yoffset=10 xadvance=19 page=0 chnl=15
-char id=234 x=155 y=71 width=18 height=28 xoffset=1 yoffset=9 xadvance=19 page=0 chnl=15
-char id=235 x=0 y=159 width=18 height=25 xoffset=1 yoffset=12 xadvance=19 page=0 chnl=15
-char id=236 x=278 y=97 width=8 height=27 xoffset=0 yoffset=10 xadvance=10 page=0 chnl=15
-char id=237 x=268 y=97 width=9 height=27 xoffset=1 yoffset=10 xadvance=10 page=0 chnl=15
-char id=238 x=252 y=97 width=15 height=27 xoffset=-3 yoffset=10 xadvance=10 page=0 chnl=15
-char id=239 x=162 y=155 width=14 height=23 xoffset=-2 yoffset=14 xadvance=10 page=0 chnl=15
-char id=240 x=236 y=98 width=15 height=27 xoffset=2 yoffset=10 xadvance=17 page=0 chnl=15
-char id=241 x=274 y=125 width=18 height=26 xoffset=1 yoffset=11 xadvance=18 page=0 chnl=15
-char id=242 x=168 y=100 width=16 height=27 xoffset=1 yoffset=10 xadvance=18 page=0 chnl=15
-char id=243 x=185 y=99 width=16 height=27 xoffset=1 yoffset=10 xadvance=18 page=0 chnl=15
-char id=244 x=267 y=68 width=16 height=28 xoffset=1 yoffset=9 xadvance=18 page=0 chnl=15
-char id=245 x=293 y=124 width=18 height=26 xoffset=1 yoffset=11 xadvance=18 page=0 chnl=15
-char id=246 x=127 y=157 width=17 height=23 xoffset=1 yoffset=14 xadvance=18 page=0 chnl=15
-char id=247 x=39 y=184 width=16 height=16 xoffset=0 yoffset=18 xadvance=16 page=0 chnl=15
-char id=248 x=386 y=148 width=18 height=17 xoffset=0 yoffset=20 xadvance=18 page=0 chnl=15
-char id=249 x=219 y=98 width=16 height=27 xoffset=1 yoffset=10 xadvance=18 page=0 chnl=15
-char id=250 x=202 y=99 width=16 height=27 xoffset=1 yoffset=10 xadvance=18 page=0 chnl=15
-char id=251 x=250 y=68 width=16 height=28 xoffset=1 yoffset=9 xadvance=18 page=0 chnl=15
-char id=252 x=495 y=120 width=16 height=25 xoffset=1 yoffset=12 xadvance=18 page=0 chnl=15
-char id=253 x=82 y=0 width=19 height=37 xoffset=-1 yoffset=10 xadvance=18 page=0 chnl=15
-char id=254 x=323 y=0 width=16 height=35 xoffset=1 yoffset=12 xadvance=18 page=0 chnl=15
-char id=255 x=184 y=36 width=20 height=33 xoffset=-1 yoffset=14 xadvance=18 page=0 chnl=15
diff --git a/External tools/Myra.1.2.1.0/Assets/fonts/comicSans48_0.png b/External tools/Myra.1.2.1.0/Assets/fonts/comicSans48_0.png
deleted file mode 100644
index c34875b..0000000
Binary files a/External tools/Myra.1.2.1.0/Assets/fonts/comicSans48_0.png and /dev/null differ
diff --git a/External tools/Myra.1.2.1.0/Assets/images/LogoOnly_64px.png b/External tools/Myra.1.2.1.0/Assets/images/LogoOnly_64px.png
deleted file mode 100644
index f772cea..0000000
Binary files a/External tools/Myra.1.2.1.0/Assets/images/LogoOnly_64px.png and /dev/null differ
diff --git a/External tools/Myra.1.2.1.0/Cyotek.Drawing.BitmapFont.dll b/External tools/Myra.1.2.1.0/Cyotek.Drawing.BitmapFont.dll
deleted file mode 100644
index c1ac309..0000000
Binary files a/External tools/Myra.1.2.1.0/Cyotek.Drawing.BitmapFont.dll and /dev/null differ
diff --git a/External tools/Myra.1.2.1.0/FontStashSharp.MonoGame.dll b/External tools/Myra.1.2.1.0/FontStashSharp.MonoGame.dll
deleted file mode 100644
index 726576c..0000000
Binary files a/External tools/Myra.1.2.1.0/FontStashSharp.MonoGame.dll and /dev/null differ
diff --git a/External tools/Myra.1.2.1.0/MonoGame.Framework.dll b/External tools/Myra.1.2.1.0/MonoGame.Framework.dll
deleted file mode 100644
index 9625655..0000000
Binary files a/External tools/Myra.1.2.1.0/MonoGame.Framework.dll and /dev/null differ
diff --git a/External tools/Myra.1.2.1.0/MonoGame.Framework.dll.config b/External tools/Myra.1.2.1.0/MonoGame.Framework.dll.config
deleted file mode 100644
index 09710ae..0000000
--- a/External tools/Myra.1.2.1.0/MonoGame.Framework.dll.config
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/External tools/Myra.1.2.1.0/Myra.Samples.AllWidgets.exe b/External tools/Myra.1.2.1.0/Myra.Samples.AllWidgets.exe
deleted file mode 100644
index 76d1d54..0000000
Binary files a/External tools/Myra.1.2.1.0/Myra.Samples.AllWidgets.exe and /dev/null differ
diff --git a/External tools/Myra.1.2.1.0/Myra.Samples.AssetManagement.exe b/External tools/Myra.1.2.1.0/Myra.Samples.AssetManagement.exe
deleted file mode 100644
index d3fe2c1..0000000
Binary files a/External tools/Myra.1.2.1.0/Myra.Samples.AssetManagement.exe and /dev/null differ
diff --git a/External tools/Myra.1.2.1.0/Myra.Samples.CustomUIStylesheet.exe b/External tools/Myra.1.2.1.0/Myra.Samples.CustomUIStylesheet.exe
deleted file mode 100644
index a07c836..0000000
Binary files a/External tools/Myra.1.2.1.0/Myra.Samples.CustomUIStylesheet.exe and /dev/null differ
diff --git a/External tools/Myra.1.2.1.0/Myra.Samples.CustomWidgets.exe b/External tools/Myra.1.2.1.0/Myra.Samples.CustomWidgets.exe
deleted file mode 100644
index f9e4116..0000000
Binary files a/External tools/Myra.1.2.1.0/Myra.Samples.CustomWidgets.exe and /dev/null differ
diff --git a/External tools/Myra.1.2.1.0/Myra.Samples.DebugConsole.exe b/External tools/Myra.1.2.1.0/Myra.Samples.DebugConsole.exe
deleted file mode 100644
index 676ed3c..0000000
Binary files a/External tools/Myra.1.2.1.0/Myra.Samples.DebugConsole.exe and /dev/null differ
diff --git a/External tools/Myra.1.2.1.0/Myra.Samples.GridContainer.exe b/External tools/Myra.1.2.1.0/Myra.Samples.GridContainer.exe
deleted file mode 100644
index 3c75f3f..0000000
Binary files a/External tools/Myra.1.2.1.0/Myra.Samples.GridContainer.exe and /dev/null differ
diff --git a/External tools/Myra.1.2.1.0/Myra.Samples.NonModalWindows.exe b/External tools/Myra.1.2.1.0/Myra.Samples.NonModalWindows.exe
deleted file mode 100644
index b86c9b5..0000000
Binary files a/External tools/Myra.1.2.1.0/Myra.Samples.NonModalWindows.exe and /dev/null differ
diff --git a/External tools/Myra.1.2.1.0/Myra.Samples.Notepad.exe b/External tools/Myra.1.2.1.0/Myra.Samples.Notepad.exe
deleted file mode 100644
index ff20055..0000000
Binary files a/External tools/Myra.1.2.1.0/Myra.Samples.Notepad.exe and /dev/null differ
diff --git a/External tools/Myra.1.2.1.0/Myra.Samples.ObjectEditor.exe b/External tools/Myra.1.2.1.0/Myra.Samples.ObjectEditor.exe
deleted file mode 100644
index 379de96..0000000
Binary files a/External tools/Myra.1.2.1.0/Myra.Samples.ObjectEditor.exe and /dev/null differ
diff --git a/External tools/Myra.1.2.1.0/Myra.Samples.SplitPaneContainer.exe b/External tools/Myra.1.2.1.0/Myra.Samples.SplitPaneContainer.exe
deleted file mode 100644
index 9e117cb..0000000
Binary files a/External tools/Myra.1.2.1.0/Myra.Samples.SplitPaneContainer.exe and /dev/null differ
diff --git a/External tools/Myra.1.2.1.0/Myra.dll b/External tools/Myra.1.2.1.0/Myra.dll
deleted file mode 100644
index 6681c3b..0000000
Binary files a/External tools/Myra.1.2.1.0/Myra.dll and /dev/null differ
diff --git a/External tools/Myra.1.2.1.0/MyraPad.exe b/External tools/Myra.1.2.1.0/MyraPad.exe
deleted file mode 100644
index a30dbf1..0000000
Binary files a/External tools/Myra.1.2.1.0/MyraPad.exe and /dev/null differ
diff --git a/External tools/Myra.1.2.1.0/StbImageSharp.dll b/External tools/Myra.1.2.1.0/StbImageSharp.dll
deleted file mode 100644
index 2e60d67..0000000
Binary files a/External tools/Myra.1.2.1.0/StbImageSharp.dll and /dev/null differ
diff --git a/External tools/Myra.1.2.1.0/StbTrueTypeSharp.dll b/External tools/Myra.1.2.1.0/StbTrueTypeSharp.dll
deleted file mode 100644
index a3a030e..0000000
Binary files a/External tools/Myra.1.2.1.0/StbTrueTypeSharp.dll and /dev/null differ
diff --git a/External tools/Myra.1.2.1.0/Stylesheets/allControls.xmmp b/External tools/Myra.1.2.1.0/Stylesheets/allControls.xmmp
deleted file mode 100644
index 3d9ffaa..0000000
--- a/External tools/Myra.1.2.1.0/Stylesheets/allControls.xmmp
+++ /dev/null
@@ -1,66 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/External tools/Myra.1.2.1.0/Stylesheets/commodore-64/commodore-64.fnt b/External tools/Myra.1.2.1.0/Stylesheets/commodore-64/commodore-64.fnt
deleted file mode 100644
index b6cec83..0000000
--- a/External tools/Myra.1.2.1.0/Stylesheets/commodore-64/commodore-64.fnt
+++ /dev/null
@@ -1,101 +0,0 @@
-info face="Commodore 64 Pixelized" size=20 bold=0 italic=0 charset="" unicode=0 stretchH=100 smooth=1 aa=1 padding=1,1,1,1 spacing=-2,-2
-common lineHeight=20 base=18 scaleW=512 scaleH=64 pages=1 packed=0
-page id=0 file="ui_stylesheet.atlas:commodore-64"
-chars count=96
-char id=10 x=0 y=0 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=0
-char id=32 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=17 xadvance=16 page=0 chnl=0
-char id=33 x=502 y=0 width=6 height=16 xoffset=5 yoffset=3 xadvance=16 page=0 chnl=0
-char id=34 x=188 y=34 width=14 height=6 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=35 x=248 y=18 width=18 height=16 xoffset=-1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=36 x=220 y=18 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=37 x=234 y=18 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=38 x=266 y=18 width=16 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=39 x=142 y=34 width=10 height=8 xoffset=5 yoffset=3 xadvance=16 page=0 chnl=0
-char id=40 x=90 y=18 width=10 height=16 xoffset=3 yoffset=3 xadvance=16 page=0 chnl=0
-char id=41 x=100 y=18 width=10 height=16 xoffset=3 yoffset=3 xadvance=16 page=0 chnl=0
-char id=42 x=114 y=34 width=18 height=12 xoffset=-1 yoffset=5 xadvance=16 page=0 chnl=0
-char id=43 x=100 y=34 width=14 height=12 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=0
-char id=44 x=152 y=34 width=8 height=8 xoffset=3 yoffset=13 xadvance=16 page=0 chnl=0
-char id=45 x=208 y=34 width=14 height=4 xoffset=1 yoffset=9 xadvance=16 page=0 chnl=0
-char id=46 x=202 y=34 width=6 height=6 xoffset=5 yoffset=13 xadvance=16 page=0 chnl=0
-char id=47 x=392 y=18 width=16 height=14 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=0
-char id=48 x=56 y=18 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=49 x=430 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=50 x=444 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=51 x=458 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=52 x=472 y=0 width=16 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=53 x=488 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=54 x=0 y=18 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=55 x=14 y=18 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=56 x=28 y=18 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=57 x=42 y=18 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=58 x=84 y=18 width=6 height=16 xoffset=5 yoffset=3 xadvance=16 page=0 chnl=0
-char id=59 x=0 y=0 width=8 height=18 xoffset=3 yoffset=3 xadvance=16 page=0 chnl=0
-char id=60 x=158 y=18 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=61 x=160 y=34 width=14 height=8 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=0
-char id=62 x=172 y=18 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=63 x=70 y=18 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=64 x=192 y=18 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=65 x=8 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=66 x=22 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=67 x=36 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=68 x=50 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=69 x=64 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=15 page=0 chnl=0
-char id=70 x=78 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=15 page=0 chnl=0
-char id=71 x=92 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=72 x=106 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=73 x=120 y=0 width=10 height=16 xoffset=3 yoffset=3 xadvance=16 page=0 chnl=0
-char id=74 x=130 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=75 x=144 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=76 x=158 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=15 page=0 chnl=0
-char id=77 x=172 y=0 width=16 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=78 x=188 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=79 x=202 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=80 x=216 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=81 x=230 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=82 x=244 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=83 x=258 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=84 x=272 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=85 x=286 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=86 x=300 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=87 x=314 y=0 width=16 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=88 x=330 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=89 x=344 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=90 x=358 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=91 x=110 y=18 width=10 height=16 xoffset=3 yoffset=3 xadvance=16 page=0 chnl=0
-char id=92 x=408 y=18 width=16 height=14 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=0
-char id=93 x=120 y=18 width=10 height=16 xoffset=3 yoffset=3 xadvance=16 page=0 chnl=0
-char id=94 x=206 y=18 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=95 x=222 y=34 width=18 height=4 xoffset=-1 yoffset=15 xadvance=16 page=0 chnl=0
-char id=96 x=132 y=34 width=10 height=8 xoffset=5 yoffset=3 xadvance=16 page=0 chnl=0
-char id=97 x=424 y=18 width=14 height=12 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=0
-char id=98 x=282 y=18 width=14 height=14 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=0
-char id=99 x=438 y=18 width=12 height=12 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=0
-char id=100 x=296 y=18 width=14 height=14 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=0
-char id=101 x=450 y=18 width=14 height=12 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=0
-char id=102 x=310 y=18 width=12 height=14 xoffset=3 yoffset=5 xadvance=16 page=0 chnl=0
-char id=103 x=322 y=18 width=14 height=14 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=0
-char id=104 x=372 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=105 x=386 y=0 width=10 height=16 xoffset=3 yoffset=3 xadvance=16 page=0 chnl=0
-char id=106 x=396 y=0 width=10 height=16 xoffset=3 yoffset=5 xadvance=16 page=0 chnl=0
-char id=107 x=406 y=0 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=108 x=420 y=0 width=10 height=16 xoffset=3 yoffset=3 xadvance=16 page=0 chnl=0
-char id=109 x=464 y=18 width=16 height=12 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=0
-char id=110 x=480 y=18 width=14 height=12 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=0
-char id=111 x=494 y=18 width=14 height=12 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=0
-char id=112 x=336 y=18 width=14 height=14 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=0
-char id=113 x=350 y=18 width=14 height=14 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=0
-char id=114 x=0 y=34 width=14 height=12 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=0
-char id=115 x=14 y=34 width=14 height=12 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=0
-char id=116 x=364 y=18 width=14 height=14 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=0
-char id=117 x=28 y=34 width=14 height=12 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=0
-char id=118 x=42 y=34 width=14 height=12 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=0
-char id=119 x=56 y=34 width=16 height=12 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=0
-char id=120 x=72 y=34 width=14 height=12 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=0
-char id=121 x=378 y=18 width=14 height=14 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=0
-char id=122 x=86 y=34 width=14 height=12 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=0
-char id=123 x=130 y=18 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=124 x=186 y=18 width=6 height=16 xoffset=5 yoffset=3 xadvance=16 page=0 chnl=0
-char id=125 x=144 y=18 width=14 height=16 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-char id=126 x=174 y=34 width=14 height=8 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0
-kernings count=0
diff --git a/External tools/Myra.1.2.1.0/Stylesheets/commodore-64/ui_stylesheet.atlas b/External tools/Myra.1.2.1.0/Stylesheets/commodore-64/ui_stylesheet.atlas
deleted file mode 100644
index 28ec4b0..0000000
--- a/External tools/Myra.1.2.1.0/Stylesheets/commodore-64/ui_stylesheet.atlas
+++ /dev/null
@@ -1,274 +0,0 @@
-
-ui_stylesheet_atlas.png
-size: 860,229
-format: RGBA8888
-filter: Nearest,Nearest
-repeat: none
-blue
- rotate: false
- xy: 106, 137
- size: 2, 2
- orig: 2, 2
- offset: 0, 0
- index: -1
-button
- rotate: false
- xy: 715, 139
- size: 36, 24
- split: 18, 17, 11, 12
- pad: 14, 14, 4, 4
- orig: 36, 24
- offset: 0, 0
- index: -1
-button-down
- rotate: false
- xy: 106, 140
- size: 36, 24
- split: 18, 17, 12, 11
- pad: 14, 14, 4, 4
- orig: 36, 24
- offset: 0, 0
- index: -1
-check-box
- rotate: false
- xy: 162, 152
- size: 12, 12
- orig: 12, 12
- offset: 0, 0
- index: -1
-check-box-off
- rotate: false
- xy: 715, 109
- size: 12, 12
- orig: 12, 12
- offset: 0, 0
- index: -1
-commodore-64
- rotate: false
- xy: 1, 165
- size: 512, 64
- orig: 512, 64
- offset: 0, 0
- index: -1
-cursor
- rotate: false
- xy: 143, 148
- size: 18, 16
- split: 9, 8, 7, 8
- pad: 2, 0, 0, 0
- orig: 18, 16
- offset: 0, 0
- index: -1
-cursor-black
- rotate: false
- xy: 1, 14
- size: 18, 16
- split: 9, 8, 7, 8
- pad: 2, 0, 0, 0
- orig: 18, 16
- offset: 0, 0
- index: -1
-dialog
- rotate: false
- xy: 1, 31
- size: 38, 38
- split: 19, 18, 18, 19
- pad: 13, 13, 24, 13
- orig: 38, 38
- offset: 0, 0
- index: -1
-grey
- rotate: false
- xy: 752, 161
- size: 2, 2
- orig: 2, 2
- offset: 0, 0
- index: -1
-horizontal-split-pane
- rotate: false
- xy: 732, 128
- size: 14, 10
- split: 6, 6, 0, 0
- pad: 0, 0, 0, 0
- orig: 14, 10
- offset: 0, 0
- index: -1
-light-blue
- rotate: false
- xy: 143, 145
- size: 2, 2
- orig: 2, 2
- offset: 0, 0
- index: -1
-list
- rotate: false
- xy: 821, 215
- size: 22, 14
- split: 0, 21, 0, 13
- pad: 0, 17, 0, 2
- orig: 22, 14
- offset: 0, 0
- index: -1
-minus
- rotate: false
- xy: 78, 117
- size: 14, 14
- orig: 14, 14
- offset: 0, 0
- index: -1
-music
- rotate: false
- xy: 715, 164
- size: 46, 32
- orig: 46, 32
- offset: 0, 0
- index: -1
-music-off
- rotate: false
- xy: 774, 197
- size: 46, 32
- orig: 46, 32
- offset: 0, 0
- index: -1
-plus
- rotate: false
- xy: 821, 200
- size: 14, 14
- orig: 14, 14
- offset: 0, 0
- index: -1
-progress-bar
- rotate: false
- xy: 777, 180
- size: 16, 16
- split: 7, 8, 7, 8
- pad: 2, 2, 2, 2
- orig: 16, 16
- offset: 0, 0
- index: -1
-progress-bar-knob
- rotate: false
- xy: 715, 122
- size: 16, 16
- split: 4, 4, 4, 4
- pad: 0, 0, 0, 0
- orig: 16, 16
- offset: 0, 0
- index: -1
-radio-button
- rotate: false
- xy: 844, 217
- size: 16, 12
- orig: 16, 12
- offset: 0, 0
- index: -1
-radio-button
- rotate: false
- xy: 844, 217
- size: 16, 12
- split: 14, 0, 5, 5
- pad: 13, 0, 0, 0
- orig: 16, 12
- offset: 0, 0
- index: -1
-radio-button-off
- rotate: false
- xy: 1, 1
- size: 16, 12
- orig: 16, 12
- offset: 0, 0
- index: -1
-scroll-bar
- rotate: false
- xy: 20, 16
- size: 14, 14
- split: 6, 6, 6, 6
- pad: 0, 0, 0, 0
- orig: 14, 14
- offset: 0, 0
- index: -1
-scroll-bar-horizontal-knob
- rotate: false
- xy: 47, 117
- size: 30, 14
- split: 15, 14, 7, 6
- pad: 0, 0, 0, 0
- orig: 30, 14
- offset: 0, 0
- index: -1
-scroll-bar-vertical-knob
- rotate: false
- xy: 762, 166
- size: 14, 30
- split: 7, 6, 16, 13
- pad: 0, 0, 0, 0
- orig: 14, 30
- offset: 0, 0
- index: -1
-slider
- rotate: false
- xy: 40, 65
- size: 4, 4
- orig: 4, 4
- offset: 0, 0
- index: -1
-slider-knob
- rotate: false
- xy: 777, 167
- size: 10, 12
- orig: 10, 12
- offset: 0, 0
- index: -1
-sound
- rotate: false
- xy: 715, 197
- size: 58, 32
- orig: 58, 32
- offset: 0, 0
- index: -1
-sound-off
- rotate: false
- xy: 47, 132
- size: 58, 32
- orig: 58, 32
- offset: 0, 0
- index: -1
-touchpad
- rotate: false
- xy: 514, 29
- size: 200, 200
- orig: 200, 200
- offset: 0, 0
- index: -1
-touchpad-knob
- rotate: false
- xy: 1, 70
- size: 44, 44
- orig: 44, 44
- offset: 0, 0
- index: -1
-vertical-split-pane
- rotate: false
- xy: 794, 182
- size: 10, 14
- split: 0, 0, 6, 6
- pad: 0, 1, 0, 0
- orig: 10, 14
- offset: 0, 0
- index: -1
-white
- rotate: false
- xy: 93, 129
- size: 2, 2
- orig: 2, 2
- offset: 0, 0
- index: -1
-window
- rotate: false
- xy: 1, 115
- size: 45, 49
- split: 20, 20, 22, 22
- pad: 22, 22, 24, 24
- orig: 45, 49
- offset: 0, 0
- index: -1
diff --git a/External tools/Myra.1.2.1.0/Stylesheets/commodore-64/ui_stylesheet.xmms b/External tools/Myra.1.2.1.0/Stylesheets/commodore-64/ui_stylesheet.xmms
deleted file mode 100644
index 33906fa..0000000
--- a/External tools/Myra.1.2.1.0/Stylesheets/commodore-64/ui_stylesheet.xmms
+++ /dev/null
@@ -1,87 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/External tools/Myra.1.2.1.0/Stylesheets/commodore-64/ui_stylesheet_atlas.png b/External tools/Myra.1.2.1.0/Stylesheets/commodore-64/ui_stylesheet_atlas.png
deleted file mode 100644
index 04554a5..0000000
Binary files a/External tools/Myra.1.2.1.0/Stylesheets/commodore-64/ui_stylesheet_atlas.png and /dev/null differ
diff --git a/External tools/Myra.1.2.1.0/Stylesheets/libgdx/ui_font.fnt b/External tools/Myra.1.2.1.0/Stylesheets/libgdx/ui_font.fnt
deleted file mode 100644
index 60ea417..0000000
--- a/External tools/Myra.1.2.1.0/Stylesheets/libgdx/ui_font.fnt
+++ /dev/null
@@ -1,101 +0,0 @@
-info face="Droid Sans" size=17 bold=0 italic=0 charset="" unicode=0 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1
-common lineHeight=20 base=18 scaleW=256 scaleH=128 pages=1 packed=0
-page id=0 file="ui_stylesheet.atlas:default"
-chars count=95
-char id=32 x=0 y=0 width=0 height=0 xoffset=0 yoffset=16 xadvance=4 page=0 chnl=0
-char id=124 x=0 y=0 width=6 height=20 xoffset=1 yoffset=3 xadvance=9 page=0 chnl=0
-char id=106 x=6 y=0 width=9 height=20 xoffset=-4 yoffset=3 xadvance=4 page=0 chnl=0
-char id=81 x=15 y=0 width=15 height=19 xoffset=-2 yoffset=3 xadvance=12 page=0 chnl=0
-char id=74 x=30 y=0 width=11 height=19 xoffset=-5 yoffset=3 xadvance=4 page=0 chnl=0
-char id=125 x=41 y=0 width=10 height=18 xoffset=-3 yoffset=3 xadvance=6 page=0 chnl=0
-char id=123 x=51 y=0 width=10 height=18 xoffset=-3 yoffset=3 xadvance=6 page=0 chnl=0
-char id=93 x=61 y=0 width=8 height=18 xoffset=-3 yoffset=3 xadvance=5 page=0 chnl=0
-char id=91 x=69 y=0 width=8 height=18 xoffset=-2 yoffset=3 xadvance=5 page=0 chnl=0
-char id=41 x=77 y=0 width=9 height=18 xoffset=-3 yoffset=3 xadvance=5 page=0 chnl=0
-char id=40 x=86 y=0 width=9 height=18 xoffset=-3 yoffset=3 xadvance=5 page=0 chnl=0
-char id=64 x=95 y=0 width=18 height=17 xoffset=-3 yoffset=3 xadvance=14 page=0 chnl=0
-char id=121 x=113 y=0 width=13 height=17 xoffset=-3 yoffset=6 xadvance=8 page=0 chnl=0
-char id=113 x=126 y=0 width=13 height=17 xoffset=-3 yoffset=6 xadvance=9 page=0 chnl=0
-char id=112 x=139 y=0 width=13 height=17 xoffset=-2 yoffset=6 xadvance=9 page=0 chnl=0
-char id=103 x=152 y=0 width=13 height=17 xoffset=-3 yoffset=6 xadvance=8 page=0 chnl=0
-char id=38 x=165 y=0 width=16 height=16 xoffset=-3 yoffset=3 xadvance=11 page=0 chnl=0
-char id=37 x=181 y=0 width=18 height=16 xoffset=-3 yoffset=3 xadvance=14 page=0 chnl=0
-char id=36 x=199 y=0 width=12 height=16 xoffset=-2 yoffset=3 xadvance=9 page=0 chnl=0
-char id=63 x=211 y=0 width=11 height=16 xoffset=-3 yoffset=3 xadvance=7 page=0 chnl=0
-char id=33 x=222 y=0 width=7 height=16 xoffset=-2 yoffset=3 xadvance=4 page=0 chnl=0
-char id=48 x=229 y=0 width=13 height=16 xoffset=-3 yoffset=3 xadvance=9 page=0 chnl=0
-char id=57 x=242 y=0 width=13 height=16 xoffset=-3 yoffset=3 xadvance=9 page=0 chnl=0
-char id=56 x=0 y=20 width=13 height=16 xoffset=-3 yoffset=3 xadvance=9 page=0 chnl=0
-char id=54 x=13 y=20 width=13 height=16 xoffset=-3 yoffset=3 xadvance=9 page=0 chnl=0
-char id=53 x=26 y=20 width=12 height=16 xoffset=-2 yoffset=3 xadvance=9 page=0 chnl=0
-char id=51 x=38 y=20 width=13 height=16 xoffset=-3 yoffset=3 xadvance=9 page=0 chnl=0
-char id=100 x=51 y=20 width=13 height=16 xoffset=-3 yoffset=3 xadvance=9 page=0 chnl=0
-char id=98 x=64 y=20 width=13 height=16 xoffset=-2 yoffset=3 xadvance=9 page=0 chnl=0
-char id=85 x=77 y=20 width=14 height=16 xoffset=-2 yoffset=3 xadvance=11 page=0 chnl=0
-char id=83 x=91 y=20 width=13 height=16 xoffset=-3 yoffset=3 xadvance=8 page=0 chnl=0
-char id=79 x=104 y=20 width=15 height=16 xoffset=-2 yoffset=3 xadvance=12 page=0 chnl=0
-char id=71 x=119 y=20 width=14 height=16 xoffset=-2 yoffset=3 xadvance=11 page=0 chnl=0
-char id=67 x=133 y=20 width=13 height=16 xoffset=-2 yoffset=3 xadvance=10 page=0 chnl=0
-char id=127 x=146 y=20 width=12 height=15 xoffset=-2 yoffset=3 xadvance=10 page=0 chnl=0
-char id=35 x=158 y=20 width=15 height=15 xoffset=-3 yoffset=3 xadvance=10 page=0 chnl=0
-char id=92 x=173 y=20 width=11 height=15 xoffset=-3 yoffset=3 xadvance=6 page=0 chnl=0
-char id=47 x=184 y=20 width=11 height=15 xoffset=-3 yoffset=3 xadvance=6 page=0 chnl=0
-char id=59 x=195 y=20 width=8 height=15 xoffset=-3 yoffset=6 xadvance=4 page=0 chnl=0
-char id=55 x=203 y=20 width=13 height=15 xoffset=-3 yoffset=3 xadvance=9 page=0 chnl=0
-char id=52 x=216 y=20 width=14 height=15 xoffset=-3 yoffset=3 xadvance=9 page=0 chnl=0
-char id=50 x=230 y=20 width=13 height=15 xoffset=-3 yoffset=3 xadvance=9 page=0 chnl=0
-char id=49 x=243 y=20 width=9 height=15 xoffset=-2 yoffset=3 xadvance=9 page=0 chnl=0
-char id=116 x=0 y=36 width=10 height=15 xoffset=-3 yoffset=4 xadvance=5 page=0 chnl=0
-char id=108 x=10 y=36 width=6 height=15 xoffset=-2 yoffset=3 xadvance=4 page=0 chnl=0
-char id=107 x=16 y=36 width=12 height=15 xoffset=-2 yoffset=3 xadvance=8 page=0 chnl=0
-char id=105 x=28 y=36 width=7 height=15 xoffset=-2 yoffset=3 xadvance=4 page=0 chnl=0
-char id=104 x=35 y=36 width=12 height=15 xoffset=-2 yoffset=3 xadvance=10 page=0 chnl=0
-char id=102 x=47 y=36 width=11 height=15 xoffset=-3 yoffset=3 xadvance=5 page=0 chnl=0
-char id=90 x=58 y=36 width=13 height=15 xoffset=-3 yoffset=3 xadvance=9 page=0 chnl=0
-char id=89 x=71 y=36 width=13 height=15 xoffset=-3 yoffset=3 xadvance=8 page=0 chnl=0
-char id=88 x=84 y=36 width=14 height=15 xoffset=-3 yoffset=3 xadvance=9 page=0 chnl=0
-char id=87 x=98 y=36 width=19 height=15 xoffset=-3 yoffset=3 xadvance=15 page=0 chnl=0
-char id=86 x=117 y=36 width=14 height=15 xoffset=-3 yoffset=3 xadvance=9 page=0 chnl=0
-char id=84 x=131 y=36 width=13 height=15 xoffset=-3 yoffset=3 xadvance=8 page=0 chnl=0
-char id=82 x=144 y=36 width=13 height=15 xoffset=-2 yoffset=3 xadvance=10 page=0 chnl=0
-char id=80 x=157 y=36 width=12 height=15 xoffset=-2 yoffset=3 xadvance=9 page=0 chnl=0
-char id=78 x=169 y=36 width=14 height=15 xoffset=-2 yoffset=3 xadvance=12 page=0 chnl=0
-char id=77 x=183 y=36 width=17 height=15 xoffset=-2 yoffset=3 xadvance=14 page=0 chnl=0
-char id=76 x=200 y=36 width=11 height=15 xoffset=-2 yoffset=3 xadvance=8 page=0 chnl=0
-char id=75 x=211 y=36 width=13 height=15 xoffset=-2 yoffset=3 xadvance=9 page=0 chnl=0
-char id=73 x=224 y=36 width=10 height=15 xoffset=-3 yoffset=3 xadvance=5 page=0 chnl=0
-char id=72 x=234 y=36 width=14 height=15 xoffset=-2 yoffset=3 xadvance=11 page=0 chnl=0
-char id=70 x=0 y=51 width=11 height=15 xoffset=-2 yoffset=3 xadvance=8 page=0 chnl=0
-char id=69 x=11 y=51 width=11 height=15 xoffset=-2 yoffset=3 xadvance=8 page=0 chnl=0
-char id=68 x=22 y=51 width=14 height=15 xoffset=-2 yoffset=3 xadvance=11 page=0 chnl=0
-char id=66 x=36 y=51 width=13 height=15 xoffset=-2 yoffset=3 xadvance=10 page=0 chnl=0
-char id=65 x=49 y=51 width=15 height=15 xoffset=-3 yoffset=3 xadvance=10 page=0 chnl=0
-char id=58 x=64 y=51 width=7 height=13 xoffset=-2 yoffset=6 xadvance=4 page=0 chnl=0
-char id=117 x=71 y=51 width=12 height=13 xoffset=-2 yoffset=6 xadvance=10 page=0 chnl=0
-char id=115 x=83 y=51 width=11 height=13 xoffset=-3 yoffset=6 xadvance=7 page=0 chnl=0
-char id=111 x=94 y=51 width=13 height=13 xoffset=-3 yoffset=6 xadvance=9 page=0 chnl=0
-char id=101 x=107 y=51 width=13 height=13 xoffset=-3 yoffset=6 xadvance=9 page=0 chnl=0
-char id=99 x=120 y=51 width=12 height=13 xoffset=-3 yoffset=6 xadvance=7 page=0 chnl=0
-char id=97 x=132 y=51 width=12 height=13 xoffset=-3 yoffset=6 xadvance=9 page=0 chnl=0
-char id=60 x=144 y=51 width=13 height=12 xoffset=-3 yoffset=5 xadvance=9 page=0 chnl=0
-char id=122 x=157 y=51 width=11 height=12 xoffset=-3 yoffset=6 xadvance=7 page=0 chnl=0
-char id=120 x=168 y=51 width=13 height=12 xoffset=-3 yoffset=6 xadvance=8 page=0 chnl=0
-char id=119 x=181 y=51 width=17 height=12 xoffset=-3 yoffset=6 xadvance=12 page=0 chnl=0
-char id=118 x=198 y=51 width=13 height=12 xoffset=-3 yoffset=6 xadvance=8 page=0 chnl=0
-char id=114 x=211 y=51 width=10 height=12 xoffset=-2 yoffset=6 xadvance=6 page=0 chnl=0
-char id=110 x=221 y=51 width=12 height=12 xoffset=-2 yoffset=6 xadvance=10 page=0 chnl=0
-char id=109 x=233 y=51 width=17 height=12 xoffset=-2 yoffset=6 xadvance=15 page=0 chnl=0
-char id=94 x=0 y=66 width=13 height=11 xoffset=-3 yoffset=3 xadvance=9 page=0 chnl=0
-char id=62 x=13 y=66 width=13 height=11 xoffset=-3 yoffset=5 xadvance=9 page=0 chnl=0
-char id=42 x=26 y=66 width=13 height=10 xoffset=-3 yoffset=3 xadvance=9 page=0 chnl=0
-char id=43 x=39 y=66 width=13 height=10 xoffset=-3 yoffset=6 xadvance=9 page=0 chnl=0
-char id=61 x=52 y=66 width=13 height=8 xoffset=-3 yoffset=7 xadvance=9 page=0 chnl=0
-char id=39 x=65 y=66 width=6 height=8 xoffset=-2 yoffset=3 xadvance=3 page=0 chnl=0
-char id=34 x=71 y=66 width=9 height=8 xoffset=-2 yoffset=3 xadvance=6 page=0 chnl=0
-char id=44 x=80 y=66 width=8 height=7 xoffset=-3 yoffset=14 xadvance=4 page=0 chnl=0
-char id=126 x=88 y=66 width=13 height=6 xoffset=-3 yoffset=8 xadvance=9 page=0 chnl=0
-char id=46 x=101 y=66 width=7 height=6 xoffset=-2 yoffset=13 xadvance=4 page=0 chnl=0
-char id=96 x=108 y=66 width=8 height=6 xoffset=0 yoffset=2 xadvance=9 page=0 chnl=0
-char id=45 x=116 y=66 width=9 height=5 xoffset=-3 yoffset=10 xadvance=5 page=0 chnl=0
-char id=95 x=125 y=66 width=13 height=4 xoffset=-4 yoffset=17 xadvance=6 page=0 chnl=0
-kernings count=-1
diff --git a/External tools/Myra.1.2.1.0/Stylesheets/libgdx/ui_stylesheet.atlas b/External tools/Myra.1.2.1.0/Stylesheets/libgdx/ui_stylesheet.atlas
deleted file mode 100644
index 32d78c1..0000000
--- a/External tools/Myra.1.2.1.0/Stylesheets/libgdx/ui_stylesheet.atlas
+++ /dev/null
@@ -1,201 +0,0 @@
-
-ui_stylesheet_atlas.png
-size: 256,128
-format: RGBA8888
-filter: Linear,Linear
-repeat: none
-check-off
- rotate: false
- xy: 11, 5
- size: 14, 14
- orig: 14, 14
- offset: 0, 0
- index: -1
-textfield
- rotate: false
- xy: 11, 5
- size: 14, 14
- split: 3, 3, 3, 3
- orig: 14, 14
- offset: 0, 0
- index: -1
-check-on
- rotate: false
- xy: 125, 35
- size: 14, 14
- orig: 14, 14
- offset: 0, 0
- index: -1
-cursor
- rotate: false
- xy: 23, 1
- size: 3, 3
- split: 1, 1, 1, 1
- orig: 3, 3
- offset: 0, 0
- index: -1
-default
- rotate: false
- xy: 1, 50
- size: 254, 77
- orig: 254, 77
- offset: 0, 0
- index: -1
-default-pane
- rotate: false
- xy: 11, 1
- size: 5, 3
- split: 1, 1, 1, 1
- orig: 5, 3
- offset: 0, 0
- index: -1
-default-rect-pad
- rotate: false
- xy: 11, 1
- size: 5, 3
- split: 1, 1, 1, 1
- orig: 5, 3
- offset: 0, 0
- index: -1
-default-pane-noborder
- rotate: false
- xy: 170, 44
- size: 1, 1
- split: 0, 0, 0, 0
- orig: 1, 1
- offset: 0, 0
- index: -1
-default-rect
- rotate: false
- xy: 38, 25
- size: 3, 3
- split: 1, 1, 1, 1
- orig: 3, 3
- offset: 0, 0
- index: -1
-default-rect-down
- rotate: false
- xy: 170, 46
- size: 3, 3
- split: 1, 1, 1, 1
- orig: 3, 3
- offset: 0, 0
- index: -1
-default-round
- rotate: false
- xy: 112, 29
- size: 12, 20
- split: 5, 5, 5, 4
- pad: 4, 4, 1, 1
- orig: 12, 20
- offset: 0, 0
- index: -1
-default-round-down
- rotate: false
- xy: 99, 29
- size: 12, 20
- split: 5, 5, 5, 4
- pad: 4, 4, 1, 1
- orig: 12, 20
- offset: 0, 0
- index: -1
-default-round-large
- rotate: false
- xy: 57, 29
- size: 20, 20
- split: 5, 5, 5, 4
- orig: 20, 20
- offset: 0, 0
- index: -1
-default-scroll
- rotate: false
- xy: 78, 29
- size: 20, 20
- split: 2, 2, 2, 2
- orig: 20, 20
- offset: 0, 0
- index: -1
-default-select
- rotate: false
- xy: 29, 29
- size: 27, 20
- split: 4, 14, 4, 4
- orig: 27, 20
- offset: 0, 0
- index: -1
-default-select-selection
- rotate: false
- xy: 26, 16
- size: 3, 3
- split: 1, 1, 1, 1
- orig: 3, 3
- offset: 0, 0
- index: -1
-default-slider
- rotate: false
- xy: 29, 20
- size: 8, 8
- split: 2, 2, 2, 2
- orig: 8, 8
- offset: 0, 0
- index: -1
-default-slider-knob
- rotate: false
- xy: 1, 1
- size: 9, 18
- orig: 9, 18
- offset: 0, 0
- index: -1
-default-splitpane
- rotate: false
- xy: 17, 1
- size: 5, 3
- split: 0, 5, 0, 0
- orig: 5, 3
- offset: 0, 0
- index: -1
-default-splitpane-vertical
- rotate: false
- xy: 125, 29
- size: 3, 5
- split: 0, 0, 0, 5
- orig: 3, 5
- offset: 0, 0
- index: -1
-default-window
- rotate: false
- xy: 1, 20
- size: 27, 29
- split: 4, 3, 20, 3
- orig: 27, 29
- offset: 0, 0
- index: -1
-selection
- rotate: false
- xy: 174, 48
- size: 1, 1
- orig: 1, 1
- offset: 0, 0
- index: -1
-tree-minus
- rotate: false
- xy: 140, 35
- size: 14, 14
- orig: 14, 14
- offset: 0, 0
- index: -1
-tree-plus
- rotate: false
- xy: 155, 35
- size: 14, 14
- orig: 14, 14
- offset: 0, 0
- index: -1
-white
- rotate: false
- xy: 129, 31
- size: 3, 3
- orig: 3, 3
- offset: 0, 0
- index: -1
-
diff --git a/External tools/Myra.1.2.1.0/Stylesheets/libgdx/ui_stylesheet.xmms b/External tools/Myra.1.2.1.0/Stylesheets/libgdx/ui_stylesheet.xmms
deleted file mode 100644
index 16c1204..0000000
--- a/External tools/Myra.1.2.1.0/Stylesheets/libgdx/ui_stylesheet.xmms
+++ /dev/null
@@ -1,112 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/External tools/Myra.1.2.1.0/Stylesheets/libgdx/ui_stylesheet_atlas.png b/External tools/Myra.1.2.1.0/Stylesheets/libgdx/ui_stylesheet_atlas.png
deleted file mode 100644
index f51c5bd..0000000
Binary files a/External tools/Myra.1.2.1.0/Stylesheets/libgdx/ui_stylesheet_atlas.png and /dev/null differ
diff --git a/External tools/Myra.1.2.1.0/image.png b/External tools/Myra.1.2.1.0/image.png
deleted file mode 100644
index 2567fe7..0000000
Binary files a/External tools/Myra.1.2.1.0/image.png and /dev/null differ
diff --git a/External tools/Myra.1.2.1.0/info.lundin.math.dll b/External tools/Myra.1.2.1.0/info.lundin.math.dll
deleted file mode 100644
index 45cad3a..0000000
Binary files a/External tools/Myra.1.2.1.0/info.lundin.math.dll and /dev/null differ
diff --git a/External tools/Myra.1.2.1.0/libSDL2-2.0.0.dylib b/External tools/Myra.1.2.1.0/libSDL2-2.0.0.dylib
deleted file mode 100644
index 221b678..0000000
Binary files a/External tools/Myra.1.2.1.0/libSDL2-2.0.0.dylib and /dev/null differ
diff --git a/External tools/Myra.1.2.1.0/libopenal.1.dylib b/External tools/Myra.1.2.1.0/libopenal.1.dylib
deleted file mode 100644
index 883af95..0000000
Binary files a/External tools/Myra.1.2.1.0/libopenal.1.dylib and /dev/null differ
diff --git a/README.md b/README.md
index df28940..a4a586e 100644
--- a/README.md
+++ b/README.md
@@ -4,4 +4,35 @@ to start the container run:
```
docker run --name= -p:5000:80 -v /home/michele/sledgemapper/:/app/db -d privateregistry.michelescandura.com/michele/sledgemapper:
+```
+
+Curl
+
+Register user
+```
+ curl -i -X POST -H "Content-Type: application/json" http://localhost:5000/users/register -d '{\"FirstName\":\"Michele\",\"LastName\":\"Scandura\", \"Username\":\"michele.scandura@outlook.com\", \"Password\":\"password1\", \"Initials\":\"MS\"}'
+```
+
+Login
+```
+ curl -i -X POST -H "Content-Type: application/json" http://localhost:5000/users/authenticate -d '{\"Username\":\"michele.scandura@outlook.com\", \"Password\":\"password1\"}'
+```
+
+New Campaign
+```
+curl -i -X POST -H "Content-Type: application/json" -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6IjEiLCJuYmYiOjE2MTM3MjgzMjksImV4cCI6MTYxNDMzMzEyOCwiaWF0IjoxNjEzNzI4MzI5fQ.VEsDbYUTnnvpgWnB5buE88JyGx_cg3TJb5ybC3eLvmc" http://localhost:5000/campaign/highfell -d '""'
+```
+
+Get Campaigns
+```
+curl -i -X GET -H "Content-Type: application/json" -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6IjEiLCJuYmYiOjE2MTM3MjgzMjksImV4cCI6MTYxNDMzMzEyOCwiaWF0IjoxNjEzNzI4MzI5fQ.VEsDbYUTnnvpgWnB5buE88JyGx_cg3TJb5ybC3eLvmc" http://localhost:5000/campaign -d '""'
+```
+
+
+```
+curl -i -X POST -H "Content-Type: application/json" http://localhost:5000/AuthManagement/register -d '{\"FirstName\":\"Michele\",\"LastName\":\"Scandura\", \"UserName\":\"michele\", \"Password\":\"Password1!\", \"Initials\":\"MS\", \"Email\":\"michele.scandura@outlook.com\"}'
+```
+
+```
+curl -i -X POST -H "Content-Type: application/json" http://localhost:5000/AuthManagement/login -d '{ \"Password\":\"Password1!\", \"Email\":\"michele.scandura@outlook.com\"}'
```
\ No newline at end of file
diff --git a/Sledgemapper.Api/Commands/BaseCommand.cs b/Sledgemapper.Api/Commands/BaseCommand.cs
index ec640ea..08d526b 100644
--- a/Sledgemapper.Api/Commands/BaseCommand.cs
+++ b/Sledgemapper.Api/Commands/BaseCommand.cs
@@ -7,13 +7,31 @@ namespace Sledgemapper.Api.Commands
{
public double Timestamp { get; private set; }
public string SessionName { get; private set; }
- public int UserId { get; private set; }
+ public Guid SessionId { get; private set; }
+ public Guid Campaign { get; private set; }
+ public string UserId { get; private set; }
- public BaseCommand(string sessionName, int userId)
+ public BaseCommand(string sessionName, string userId)
{
Timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds();
SessionName = sessionName;
UserId = userId;
}
+
+ public BaseCommand(string campaign, string sessionName, string userId)
+ {
+ Timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds();
+ SessionName = sessionName;
+ Campaign = new Guid(campaign);
+ UserId = userId;
+ }
+
+ public BaseCommand(Guid campaign, Guid sessionId, string userId)
+ {
+ Timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds();
+ SessionId = sessionId;
+ Campaign = campaign;
+ UserId = userId;
+ }
}
}
diff --git a/Sledgemapper.Api/Commands/DeleteNoteCommand.cs b/Sledgemapper.Api/Commands/DeleteNoteCommand.cs
index f1a0e9e..c60bfb0 100644
--- a/Sledgemapper.Api/Commands/DeleteNoteCommand.cs
+++ b/Sledgemapper.Api/Commands/DeleteNoteCommand.cs
@@ -1,3 +1,4 @@
+using System;
using Sledgemapper.Shared.Entities;
namespace Sledgemapper.Api.Commands
@@ -6,7 +7,7 @@ namespace Sledgemapper.Api.Commands
{
public Note Note { get; private set; }
- public DeleteNoteCommand(string sessionName, Note note, int userId) : base(sessionName, userId)
+ public DeleteNoteCommand(Guid campaign, Guid mapName, Note note, string userId) : base(campaign, mapName, userId)
{
Note = note;
}
diff --git a/Sledgemapper.Api/Commands/DeleteOverlayCommand.cs b/Sledgemapper.Api/Commands/DeleteOverlayCommand.cs
index e3731d5..abd504d 100644
--- a/Sledgemapper.Api/Commands/DeleteOverlayCommand.cs
+++ b/Sledgemapper.Api/Commands/DeleteOverlayCommand.cs
@@ -1,12 +1,13 @@
+using System;
using Sledgemapper.Shared.Entities;
namespace Sledgemapper.Api.Commands
{
- public class DeleteOverlayCommand : BaseCommand
+ public class DeleteOverlayCommand : BaseCommand
{
public Overlay Overlay { get; private set; }
- public DeleteOverlayCommand(string sessionName, Overlay overlay, int userId) : base(sessionName, userId)
+ public DeleteOverlayCommand(Guid campaign, Guid mapName, Overlay overlay, string userId) : base(campaign, mapName, userId)
{
Overlay = overlay;
}
diff --git a/Sledgemapper.Api/Commands/DeleteTileCommand.cs b/Sledgemapper.Api/Commands/DeleteTileCommand.cs
index 491a7a2..e55f1dc 100644
--- a/Sledgemapper.Api/Commands/DeleteTileCommand.cs
+++ b/Sledgemapper.Api/Commands/DeleteTileCommand.cs
@@ -6,7 +6,7 @@ namespace Sledgemapper.Api.Commands
{
public Tile Tile { get; private set; }
- public DeleteTileCommand(string sessionName, Tile tile, int userId) : base(sessionName, userId)
+ public DeleteTileCommand(string sessionName, Tile tile, string userId) : base(sessionName, userId)
{
Tile = tile;
}
diff --git a/Sledgemapper.Api/Commands/DeleteWallCommand.cs b/Sledgemapper.Api/Commands/DeleteWallCommand.cs
index f04edcf..4b38b77 100644
--- a/Sledgemapper.Api/Commands/DeleteWallCommand.cs
+++ b/Sledgemapper.Api/Commands/DeleteWallCommand.cs
@@ -1,3 +1,4 @@
+using System;
using Sledgemapper.Shared.Entities;
namespace Sledgemapper.Api.Commands
@@ -6,7 +7,7 @@ namespace Sledgemapper.Api.Commands
{
public Wall Wall { get; private set; }
- public DeleteWallCommand(string sessionName, Wall wall, int userId) : base(sessionName, userId)
+ public DeleteWallCommand(Guid campaign, Guid mapName, Wall wall, string userId) : base(campaign, mapName, userId)
{
Wall = wall;
}
diff --git a/Sledgemapper.Api/Commands/GetCampaignMapsCommand.cs b/Sledgemapper.Api/Commands/GetCampaignMapsCommand.cs
new file mode 100644
index 0000000..ac420d1
--- /dev/null
+++ b/Sledgemapper.Api/Commands/GetCampaignMapsCommand.cs
@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+using MediatR;
+using Sledgemapper.Shared.Entities;
+
+namespace Sledgemapper.Api.Commands
+{
+ public class GetCampaignMapsCommand : IRequest>
+ {
+ public double Timestamp { get; private set; }
+ public Guid CampaignId { get; private set; }
+ public string UserId { get; private set; }
+
+ public GetCampaignMapsCommand(Guid campaignId, string userId)
+ {
+ Timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds();
+ CampaignId = campaignId;
+ UserId = userId;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Commands/GetCampaignPlayersCommand.cs b/Sledgemapper.Api/Commands/GetCampaignPlayersCommand.cs
new file mode 100644
index 0000000..01fa504
--- /dev/null
+++ b/Sledgemapper.Api/Commands/GetCampaignPlayersCommand.cs
@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+using MediatR;
+using Sledgemapper.Shared.Entities;
+
+namespace Sledgemapper.Api.Commands
+{
+ public class GetCampaignPlayersCommand : IRequest>
+ {
+ public double Timestamp { get; private set; }
+ public string CampaignName { get; private set; }
+ public string UserId { get; private set; }
+
+ public GetCampaignPlayersCommand(string campaingName, string userId)
+ {
+ Timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds();
+ CampaignName = campaingName;
+ UserId = userId;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Commands/GetCampaignsCommand.cs b/Sledgemapper.Api/Commands/GetCampaignsCommand.cs
new file mode 100644
index 0000000..520717d
--- /dev/null
+++ b/Sledgemapper.Api/Commands/GetCampaignsCommand.cs
@@ -0,0 +1,16 @@
+using System.Collections.Generic;
+using MediatR;
+using Sledgemapper.Shared.Entities;
+
+namespace Sledgemapper.Api.Commands
+{
+ public class GetCampaignsCommand : IRequest>
+ {
+ public string UserId { get; private set; }
+ public GetCampaignsCommand(string userId)
+ {
+ UserId = userId;
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Commands/GetMapSnapshotCommand.cs b/Sledgemapper.Api/Commands/GetMapSnapshotCommand.cs
index 74047a8..228d855 100644
--- a/Sledgemapper.Api/Commands/GetMapSnapshotCommand.cs
+++ b/Sledgemapper.Api/Commands/GetMapSnapshotCommand.cs
@@ -1,14 +1,18 @@
using MediatR;
using Sledgemapper.Shared.Entities;
+using System;
namespace Sledgemapper.Api.Commands
{
public class GetMapSnapshotCommand : IRequest
{
- public string SessionName { get; private set; }
- public GetMapSnapshotCommand(string sessionName)
+ public Guid MapId { get; private set; }
+ public Guid CampaignId { get; private set;
+ }
+ public GetMapSnapshotCommand(Guid campaignId, Guid mapId)
{
- SessionName = sessionName;
+ MapId = mapId;
+ CampaignId = campaignId;
}
}
}
diff --git a/Sledgemapper.Api/Commands/InvitePlayerToCampaignCommand.cs b/Sledgemapper.Api/Commands/InvitePlayerToCampaignCommand.cs
new file mode 100644
index 0000000..8ecc338
--- /dev/null
+++ b/Sledgemapper.Api/Commands/InvitePlayerToCampaignCommand.cs
@@ -0,0 +1,21 @@
+using System;
+using MediatR;
+
+namespace Sledgemapper.Api.Commands
+{
+ public class InvitePlayerToCampaignCommand : IRequest
+ {
+ public double Timestamp { get; private set; }
+ public string CampaignName { get; private set; }
+ public string Email { get; private set; }
+ public string UserId { get; private set; }
+ public InvitePlayerToCampaignCommand(string campaingName, string email, string userId)
+ {
+ Timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds();
+ CampaignName = campaingName;
+ UserId = userId;
+ Email = email;
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Commands/NewCampaignCommand.cs b/Sledgemapper.Api/Commands/NewCampaignCommand.cs
new file mode 100644
index 0000000..26399bf
--- /dev/null
+++ b/Sledgemapper.Api/Commands/NewCampaignCommand.cs
@@ -0,0 +1,19 @@
+using System;
+using MediatR;
+
+namespace Sledgemapper.Api.Commands
+{
+ public class NewCampaignCommand : IRequest
+ {
+ public double Timestamp { get; private set; }
+ public string CampaignName { get; private set; }
+ public string UserId { get; private set; }
+ public NewCampaignCommand(string campaingName, string userId)
+ {
+ Timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds();
+ CampaignName = campaingName;
+ UserId = userId;
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Commands/NewLineCommand.cs b/Sledgemapper.Api/Commands/NewLineCommand.cs
index 3bfe3cf..ce98c1a 100644
--- a/Sledgemapper.Api/Commands/NewLineCommand.cs
+++ b/Sledgemapper.Api/Commands/NewLineCommand.cs
@@ -1,4 +1,5 @@
using Sledgemapper.Shared.Entities;
+using System;
namespace Sledgemapper.Api.Commands
{
@@ -6,7 +7,7 @@ namespace Sledgemapper.Api.Commands
{
public Line Line { get; private set; }
- public NewLineCommand(string sessionName, Line line, int userId) : base(sessionName, userId)
+ public NewLineCommand(Guid campaign, Guid mapName, Line line, string userId) : base(campaign, mapName, userId)
{
Line = line;
}
diff --git a/Sledgemapper.Api/Commands/NewNoteCommand.cs b/Sledgemapper.Api/Commands/NewNoteCommand.cs
index 5c2dfb6..97a9b31 100644
--- a/Sledgemapper.Api/Commands/NewNoteCommand.cs
+++ b/Sledgemapper.Api/Commands/NewNoteCommand.cs
@@ -1,4 +1,5 @@
using Sledgemapper.Shared.Entities;
+using System;
namespace Sledgemapper.Api.Commands
{
@@ -6,7 +7,7 @@ namespace Sledgemapper.Api.Commands
{
public Note Note { get; private set; }
- public NewNoteCommand(string sessionName, Note note, int userId) : base(sessionName, userId)
+ public NewNoteCommand(Guid campaignId, Guid mapId, Note note, string userId) : base(campaignId, mapId, userId)
{
Note = note;
}
diff --git a/Sledgemapper.Api/Commands/NewOverlayCommand.cs b/Sledgemapper.Api/Commands/NewOverlayCommand.cs
index 0aa4078..8d2d659 100644
--- a/Sledgemapper.Api/Commands/NewOverlayCommand.cs
+++ b/Sledgemapper.Api/Commands/NewOverlayCommand.cs
@@ -1,4 +1,5 @@
using Sledgemapper.Shared.Entities;
+using System;
namespace Sledgemapper.Api.Commands
{
@@ -6,7 +7,7 @@ namespace Sledgemapper.Api.Commands
{
public Overlay Overlay { get; private set; }
- public NewOverlayCommand(string sessionName, Overlay overlay, int userId) : base(sessionName, userId)
+ public NewOverlayCommand(Guid campaignId, Guid mapId, Overlay overlay, string userId) : base(campaignId, mapId, userId)
{
Overlay = overlay;
}
diff --git a/Sledgemapper.Api/Commands/NewRoomCommand.cs b/Sledgemapper.Api/Commands/NewRoomCommand.cs
index 5b7619e..a44c836 100644
--- a/Sledgemapper.Api/Commands/NewRoomCommand.cs
+++ b/Sledgemapper.Api/Commands/NewRoomCommand.cs
@@ -1,4 +1,5 @@
using Sledgemapper.Shared.Entities;
+using System;
namespace Sledgemapper.Api.Commands
{
@@ -6,7 +7,7 @@ namespace Sledgemapper.Api.Commands
{
public Room Room { get; private set; }
- public NewRoomCommand(string sessionName, Room room, int userId) : base(sessionName, userId)
+ public NewRoomCommand(Guid campaignId, Guid mapId, Room room, string userId) : base(campaignId, mapId, userId)
{
Room = room;
}
diff --git a/Sledgemapper.Api/Commands/NewSessionCommand.cs b/Sledgemapper.Api/Commands/NewSessionCommand.cs
index 4b184cb..ab42380 100644
--- a/Sledgemapper.Api/Commands/NewSessionCommand.cs
+++ b/Sledgemapper.Api/Commands/NewSessionCommand.cs
@@ -1,9 +1,12 @@
+using System;
+
namespace Sledgemapper.Api.Commands
{
- public class NewSessionCommand : BaseCommand
+ public class NewSessionCommand : BaseCommand
{
- public NewSessionCommand(string sessionName, int userId):base(sessionName, userId)
+ public NewSessionCommand(string campaign, string sessionName, string userId) : base(campaign, sessionName, userId)
{
}
}
+
}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Commands/NewSnapshotCommand.cs b/Sledgemapper.Api/Commands/NewSnapshotCommand.cs
index 8ec87b1..057ec88 100644
--- a/Sledgemapper.Api/Commands/NewSnapshotCommand.cs
+++ b/Sledgemapper.Api/Commands/NewSnapshotCommand.cs
@@ -5,7 +5,7 @@ namespace Sledgemapper.Api.Commands
public class NewSnapshotCommand : BaseCommand
{
public Session Session { get; private set; }
- public NewSnapshotCommand(string sessionName, Session session, int userId) : base(sessionName, userId)
+ public NewSnapshotCommand(string sessionName, Session session, string userId) : base(sessionName, userId)
{
Session = session;
}
diff --git a/Sledgemapper.Api/Commands/NewTileCommand.cs b/Sledgemapper.Api/Commands/NewTileCommand.cs
index 4fbd5f3..522adf6 100644
--- a/Sledgemapper.Api/Commands/NewTileCommand.cs
+++ b/Sledgemapper.Api/Commands/NewTileCommand.cs
@@ -5,7 +5,7 @@ namespace Sledgemapper.Api.Commands
public class NewTileCommand : BaseCommand
{
public Tile Tile { get; private set; }
- public NewTileCommand(string sessionName, Tile tile, int userId) : base(sessionName, userId)
+ public NewTileCommand(string sessionName, Tile tile, string userId) : base(sessionName, userId)
{
Tile = tile;
}
diff --git a/Sledgemapper.Api/Commands/NewWallCommand.cs b/Sledgemapper.Api/Commands/NewWallCommand.cs
index c8c72fd..f9682fb 100644
--- a/Sledgemapper.Api/Commands/NewWallCommand.cs
+++ b/Sledgemapper.Api/Commands/NewWallCommand.cs
@@ -1,4 +1,5 @@
using Sledgemapper.Shared.Entities;
+using System;
namespace Sledgemapper.Api.Commands
{
@@ -6,7 +7,7 @@ namespace Sledgemapper.Api.Commands
{
public Wall Wall { get; private set; }
- public NewWallCommand(string sessionName, Wall wall, int userId) : base(sessionName, userId)
+ public NewWallCommand(Guid campaignId, Guid mapId, Wall wall, string userId) : base(campaignId, mapId, userId)
{
Wall = wall;
}
diff --git a/Sledgemapper.Api/Controllers/AuthManagementController.cs b/Sledgemapper.Api/Controllers/AuthManagementController.cs
new file mode 100644
index 0000000..33b088c
--- /dev/null
+++ b/Sledgemapper.Api/Controllers/AuthManagementController.cs
@@ -0,0 +1,185 @@
+using AutoMapper;
+using Microsoft.AspNetCore.Identity;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Options;
+using Microsoft.IdentityModel.Tokens;
+using System;
+using System.Collections.Generic;
+using System.IdentityModel.Tokens.Jwt;
+using System.Linq;
+using System.Security.Claims;
+using System.Text;
+using System.Threading.Tasks;
+using Sledgemapper.Api.Core.Entities;
+using Sledgemapper.Api.Models;
+
+namespace Sledgemapper.Api.Controllers
+{
+ [Route("[controller]")] // api/authmanagement
+ [ApiController]
+ public class AuthManagementController : ControllerBase
+ {
+ private readonly UserManager _userManager;
+ private readonly JwtConfig _jwtConfig;
+ private readonly IMapper _mapper;
+
+ public AuthManagementController(UserManager userManager,
+ IOptionsMonitor optionsMonitor,
+ IMapper mapper)
+ {
+ _userManager = userManager;
+ _jwtConfig = optionsMonitor.CurrentValue;
+ _mapper = mapper;
+ }
+
+ [HttpPost]
+ [Route("Register")]
+ public async Task Register([FromBody] RegisterModel user)
+ {
+ // Check if the incoming request is valid
+ if (ModelState.IsValid)
+ {
+ // check i the user with the same email exist
+ var existingUser = await _userManager.FindByEmailAsync(user.Email);
+
+ if (existingUser != null)
+ {
+ return BadRequest(new RegistrationResponse()
+ {
+ Result = false,
+ Errors = new List(){
+ "Email already exist"
+ }
+ });
+ }
+
+ var newUser = _mapper.Map(user);
+ // var newUser = new User() { Email = user.Email, UserName = user.UserName };
+ var isCreated = await _userManager.CreateAsync(newUser, user.Password);
+ if (isCreated.Succeeded)
+ {
+ var jwtToken = GenerateJwtToken(newUser);
+
+ return Ok(new RegistrationResponse()
+ {
+ Result = true,
+ Token = jwtToken
+ });
+ }
+
+ return new JsonResult(new RegistrationResponse()
+ {
+ Result = false,
+ Errors = isCreated.Errors.Select(x => x.Description).ToList()
+ }
+ )
+ { StatusCode = 500 };
+ }
+
+ return BadRequest(new RegistrationResponse()
+ {
+ Result = false,
+ Errors = new List(){
+ "Invalid payload"
+ }
+ });
+ }
+
+ [HttpPost]
+ [Route("Login")]
+ public async Task Login([FromBody] UserLoginRequest user)
+ {
+ if (ModelState.IsValid)
+ {
+ // check if the user with the same email exist
+ var existingUser = await _userManager.FindByEmailAsync(user.Email);
+
+ if (existingUser == null)
+ {
+ // We dont want to give to much information on why the request has failed for security reasons
+ return BadRequest(new RegistrationResponse()
+ {
+ Result = false,
+ Errors = new List(){
+ "Invalid authentication request"
+ }
+ });
+ }
+
+ // Now we need to check if the user has inputed the right password
+ var isCorrect = await _userManager.CheckPasswordAsync(existingUser, user.Password);
+
+ if (isCorrect)
+ {
+ var jwtToken = GenerateJwtToken(existingUser);
+
+ return Ok(new LoginResponse()
+ {
+ Result = true,
+ Token = jwtToken,
+ Username = existingUser.Email,
+ Initials = existingUser.Initials,
+ Id = existingUser.Id
+ });
+ }
+ else
+ {
+ // We dont want to give to much information on why the request has failed for security reasons
+ return BadRequest(new RegistrationResponse()
+ {
+ Result = false,
+ Errors = new List(){
+ "Invalid authentication request"
+ }
+ });
+ }
+ }
+
+ return BadRequest(new RegistrationResponse()
+ {
+ Result = false,
+ Errors = new List(){
+ "Invalid payload"
+ }
+ });
+ }
+
+ private string GenerateJwtToken(User user)
+ {
+ // Now its ime to define the jwt token which will be responsible of creating our tokens
+ var jwtTokenHandler = new JwtSecurityTokenHandler();
+
+ // We get our secret from the appsettings
+ var key = Encoding.ASCII.GetBytes(_jwtConfig.Secret);
+
+ // we define our token descriptor
+ // We need to utilise claims which are properties in our token which gives information about the token
+ // which belong to the specific user who it belongs to
+ // so it could contain their id, name, email the good part is that these information
+ // are generated by our server and identity framework which is valid and trusted
+ var tokenDescriptor = new SecurityTokenDescriptor
+ {
+
+ Subject = new ClaimsIdentity(new[]
+ {
+ new Claim("Id", user.Id),
+ new Claim(JwtRegisteredClaimNames.Sub, user.Email),
+ new Claim(JwtRegisteredClaimNames.Email, user.Email),
+ // the JTI is used for our refresh token which we will be convering in the next video
+ new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
+ }),
+ // the life span of the token needs to be shorter and utilise refresh token to keep the user signedin
+ // but since this is a demo app we can extend it to fit our current need
+ Expires = DateTime.UtcNow.AddHours(6),
+ // here we are adding the encryption alogorithim information which will be used to decrypt our token
+ SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha512Signature)
+ };
+
+ var token = jwtTokenHandler.CreateToken(tokenDescriptor);
+
+ var jwtToken = jwtTokenHandler.WriteToken(token);
+
+ return jwtToken;
+ }
+ }
+}
diff --git a/Sledgemapper.Api/Controllers/CampaignController.cs b/Sledgemapper.Api/Controllers/CampaignController.cs
new file mode 100644
index 0000000..6c0313f
--- /dev/null
+++ b/Sledgemapper.Api/Controllers/CampaignController.cs
@@ -0,0 +1,76 @@
+using MediatR;
+using Microsoft.AspNetCore.Authentication.JwtBearer;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+using Sledgemapper.Api.Commands;
+using Sledgemapper.Shared.Entities;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace Sledgemapper.Api.Controllers
+{
+ [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
+ [Route("[controller]")]
+ public class CampaignController : ControllerBase
+ {
+ private readonly IMediator _mediator;
+ private string UserId => HttpContext.User.Claims.FirstOrDefault(m => m.Type == "Id").Value;
+
+ public CampaignController(IMediator mediator) => _mediator = mediator;
+
+ [HttpPost]
+ [Route("{campaignName}")]
+ public async Task> Post(string campaignName)
+ {
+ var result = await _mediator.Send(new NewCampaignCommand(campaignName, UserId));
+ if (!result)
+ {
+ return BadRequest();
+ }
+ return result;
+ }
+
+ //[HttpPost]
+ //[Route("{campaignName}")]
+ //public async Task Get(string campaignName)
+ //{
+ // var result = await _mediator.Send(new GetCampaignCommand(campaignName, UserId.ToString()));
+ // return result;
+ //}
+
+ [HttpGet]
+ public async Task> Get()
+ {
+ var result = await _mediator.Send(new GetCampaignsCommand(UserId));
+ return result;
+ }
+
+ [HttpPost]
+ [Route("{campaignName}/players/{email}")]
+ public async Task Invite(string campaignName, string email)
+ {
+ var result = await _mediator.Send(new InvitePlayerToCampaignCommand(campaignName, email, UserId));
+ return result;
+ }
+
+ [HttpGet]
+ [Route("{campaignName}/players")]
+ public async Task> GetPlayers(string campaignName)
+ {
+ var result = await _mediator.Send(new GetCampaignPlayersCommand(campaignName, UserId));
+ return result;
+ }
+
+
+ [HttpGet]
+ [Route("{campaignName}/maps")]
+ public async Task> GetMaps(Guid campaignName)
+ {
+ var result = await _mediator.Send(new GetCampaignMapsCommand(campaignName, UserId));
+ return result;
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Controllers/MapController.cs b/Sledgemapper.Api/Controllers/MapController.cs
new file mode 100644
index 0000000..683f84a
--- /dev/null
+++ b/Sledgemapper.Api/Controllers/MapController.cs
@@ -0,0 +1,93 @@
+using System;
+using System.Linq;
+using System.Threading.Tasks;
+using MediatR;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+using Sledgemapper.Api.Commands;
+using Sledgemapper.Shared.Entities;
+
+namespace Sledgemapper.Api.Controllers
+{
+ [Authorize]
+ [Route("[controller]/{campaign}/{mapName}")]
+ public class MapController : ControllerBase
+ {
+ private readonly IMediator _mediator;
+
+ public MapController(IMediator mediator)
+ {
+ _mediator = mediator;
+ }
+
+ private string UserId => HttpContext.User.Claims.FirstOrDefault(m => m.Type == "Id").Value;
+
+ [HttpDelete("overlay")]
+ public async Task Delete(Guid campaign, Guid mapName, [FromBody] Overlay overlay)
+ {
+ await _mediator.Send(new DeleteOverlayCommand(campaign, mapName, overlay, UserId));
+ }
+
+ [HttpDelete("wall")]
+ public async Task Delete(Guid campaign, Guid mapName, [FromBody] Wall wall)
+ {
+ await _mediator.Send(new DeleteWallCommand(campaign, mapName, wall, UserId));
+ }
+
+ [HttpDelete("note")]
+ public async Task Delete(Guid campaign, Guid mapName, [FromBody] Note note)
+ {
+ await _mediator.Send(new DeleteNoteCommand(campaign, mapName, note, UserId));
+ }
+
+ [HttpGet]
+ public async Task Get(Guid campaign, Guid mapName)
+ {
+ var result = await _mediator.Send(new GetMapSnapshotCommand(campaign, mapName));
+ return result;
+ }
+
+ [HttpPost]
+ public async Task Post(string campaign, string mapName)
+ {
+ var result = await _mediator.Send(new NewSessionCommand(campaign, mapName, UserId));
+ return result;
+ }
+
+ [HttpPost("snapshot")]
+ public async Task Post(string campaign, string mapName, [FromBody] Session session)
+ {
+ await _mediator.Send(new NewSnapshotCommand(mapName, session, UserId));
+ }
+
+ [HttpPost("overlay")]
+ public async Task Post(Guid campaign, Guid mapName, [FromBody] Overlay overlay)
+ {
+ await _mediator.Send(new NewOverlayCommand(campaign, mapName, overlay, UserId));
+ }
+
+ [HttpPost("wall")]
+ public async Task Post(Guid campaign, Guid mapName, [FromBody] Wall wall)
+ {
+ await _mediator.Send(new NewWallCommand(campaign, mapName, wall, UserId));
+ }
+
+ [HttpPost("note")]
+ public async Task Post(Guid campaign, Guid mapName, [FromBody] Note note)
+ {
+ await _mediator.Send(new NewNoteCommand(campaign, mapName, note, UserId));
+ }
+
+ [HttpPost("room")]
+ public async Task Post(Guid campaign, Guid mapName, [FromBody] Room room)
+ {
+ await _mediator.Send(new NewRoomCommand(campaign, mapName, room, UserId));
+ }
+
+ [HttpPost("line")]
+ public async Task Post(Guid campaign, Guid mapName, [FromBody] Line line)
+ {
+ await _mediator.Send(new NewLineCommand(campaign, mapName, line, UserId));
+ }
+ }
+}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Controllers/SessionController.cs b/Sledgemapper.Api/Controllers/SessionController.cs
deleted file mode 100644
index 4926ba2..0000000
--- a/Sledgemapper.Api/Controllers/SessionController.cs
+++ /dev/null
@@ -1,106 +0,0 @@
-using MediatR;
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Mvc;
-using Sledgemapper.Api.Commands;
-using Sledgemapper.Api.Notifications;
-using Sledgemapper.Shared.Entities;
-using System.Threading.Tasks;
-
-namespace Sledgemapper.Api.Controllers
-{
- [Authorize]
- [Route("[controller]/{sessionName}")]
- public class SessionController : ControllerBase
- {
- private readonly IMediator _mediator;
- private int UserId => int.Parse(HttpContext.User.Identity.Name);
-
- public SessionController(IMediator mediator) => _mediator = mediator;
-
- [HttpPost]
- public async Task Post(string sessionName)
- {
- var result = await _mediator.Send(new NewSessionCommand(sessionName, UserId));
- return result;
- }
-
- [HttpGet]
- public async Task Get(string sessionName)
- {
- var result = await _mediator.Send(new GetMapSnapshotCommand(sessionName));
- return result;
- }
-
- // [HttpPost("ping")]
- // public async Task Post(string sessionName, [FromBody] Ping pingLocation)
- // {
- // await _mediator.Send(new PingCommand(sessionName, pingLocation, UserId));
- // }
-
- [HttpPost("snapshot")]
- public async Task Post(string sessionName, [FromBody] Session session)
- {
- await _mediator.Send(new NewSnapshotCommand(sessionName, session, UserId));
- }
-
- [HttpPost("tile")]
- public async Task Post(string sessionName, [FromBody] Tile tile)
- {
- await _mediator.Send(new NewTileCommand(sessionName, tile, UserId));
- }
-
- [HttpPost("overlay")]
- public async Task Post(string sessionName, [FromBody] Overlay overlay)
- {
- await _mediator.Send(new NewOverlayCommand(sessionName, overlay, UserId));
- }
-
- [HttpPost("wall")]
- public async Task Post(string sessionName, [FromBody] Wall wall)
- {
- await _mediator.Send(new NewWallCommand(sessionName, wall, UserId));
- }
-
- [HttpPost("note")]
- public async Task Post(string sessionName, [FromBody] Note note)
- {
- await _mediator.Send(new NewNoteCommand(sessionName, note, UserId));
- }
-
- [HttpPost("room")]
- public async Task Post(string sessionName, [FromBody] Room room)
- {
- await _mediator.Send(new NewRoomCommand(sessionName, room, UserId));
- }
-
- [HttpPost("line")]
- public async Task Post(string sessionName, [FromBody] Line line)
- {
- await _mediator.Send(new NewLineCommand(sessionName, line, UserId));
- }
-
- [HttpDelete("tile")]
- public async Task Delete(string sessionName, [FromBody] Tile tile)
- {
- await _mediator.Send(new DeleteTileCommand(sessionName, tile, UserId));
- }
-
- [HttpDelete("overlay")]
- public async Task Delete(string sessionName, [FromBody] Overlay overlay)
- {
- await _mediator.Send(new DeleteOverlayCommand(sessionName, overlay, UserId));
- }
-
- [HttpDelete("wall")]
- public async Task Delete(string sessionName, [FromBody] Wall wall)
- {
- await _mediator.Send(new DeleteWallCommand(sessionName, wall, UserId));
- }
-
- [HttpDelete("note")]
- public async Task Delete(string sessionName, [FromBody] Note note)
- {
- await _mediator.Send(new DeleteNoteCommand(sessionName, note, UserId));
- }
- }
-}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Controllers/UsersController.cs b/Sledgemapper.Api/Controllers/UsersController.cs
deleted file mode 100644
index 7988025..0000000
--- a/Sledgemapper.Api/Controllers/UsersController.cs
+++ /dev/null
@@ -1,136 +0,0 @@
-using System;
-using System.Collections.Generic;
-using Microsoft.AspNetCore.Mvc;
-using AutoMapper;
-using System.IdentityModel.Tokens.Jwt;
-
-using Microsoft.Extensions.Options;
-using System.Text;
-using Microsoft.IdentityModel.Tokens;
-using System.Security.Claims;
-using Microsoft.AspNetCore.Authorization;
-using Sledgemapper.Services;
-using Sledgemapper.Entities;
-using Sledgemapper.Models.Users;
-using Sledgemapper.Helpers;
-
-namespace Sledgemapper.Controllers
-{
- [Authorize]
- [ApiController]
- [Route("[controller]")]
- public class UsersController : ControllerBase
- {
- private IUserService _userService;
- private IMapper _mapper;
- private readonly AppSettings _appSettings;
-
- public UsersController(
- IUserService userService,
- IMapper mapper,
- IOptions appSettings)
- {
- _userService = userService;
- _mapper = mapper;
- _appSettings = appSettings.Value;
- }
-
- [AllowAnonymous]
- [HttpPost("authenticate")]
- public IActionResult Authenticate([FromBody]AuthenticateModel model)
- {
- var user = _userService.Authenticate(model.Username, model.Password);
-
- if (user == null)
- return BadRequest(new { message = "Username or password is incorrect" });
-
- var tokenHandler = new JwtSecurityTokenHandler();
- var key = Encoding.ASCII.GetBytes(_appSettings.Secret);
- var tokenDescriptor = new SecurityTokenDescriptor
- {
- Subject = new ClaimsIdentity(new Claim[]
- {
- new Claim(ClaimTypes.Name, user.Id.ToString())
- }),
- Expires = DateTime.UtcNow.AddDays(7),
- SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
- };
- var token = tokenHandler.CreateToken(tokenDescriptor);
- var tokenString = tokenHandler.WriteToken(token);
-
- // return basic user info and authentication token
- return Ok(new
- {
- Id = user.Id,
- Username = user.Username,
- FirstName = user.FirstName,
- LastName = user.LastName,
- Initials = user.Initials,
- Token = tokenString
- });
- }
-
- [AllowAnonymous]
- [HttpPost("register")]
- public IActionResult Register([FromBody]RegisterModel model)
- {
- // map model to entity
- var user = _mapper.Map(model);
-
- try
- {
- // create user
- _userService.Create(user, model.Password);
- return Ok();
- }
- catch (AppException ex)
- {
- // return error message if there was an exception
- return BadRequest(new { message = ex.Message });
- }
- }
-
- [HttpGet]
- public IActionResult GetAll()
- {
- var users = _userService.GetAll();
- var model = _mapper.Map>(users);
- return Ok(model);
- }
-
- [HttpGet("{id}")]
- public IActionResult GetById(int id)
- {
- var user = _userService.GetById(id);
- var model = _mapper.Map(user);
- return Ok(model);
- }
-
- [HttpPut("{id}")]
- public IActionResult Update(int id, [FromBody]UpdateModel model)
- {
- // map model to entity and set id
- var user = _mapper.Map(model);
- user.Id = id;
-
- try
- {
- // update user
- _userService.Update(user, model.Password);
- return Ok();
- }
- catch (AppException ex)
- {
- // return error message if there was an exception
- return BadRequest(new { message = ex.Message });
- }
- }
-
- [HttpDelete("{id}")]
- public IActionResult Delete(int id)
- {
- _userService.Delete(id);
- return Ok();
- }
- }
-}
diff --git a/Sledgemapper.Api/Core/Entities/BaseEntity.cs b/Sledgemapper.Api/Core/Entities/BaseEntity.cs
new file mode 100644
index 0000000..5196c35
--- /dev/null
+++ b/Sledgemapper.Api/Core/Entities/BaseEntity.cs
@@ -0,0 +1,7 @@
+using System.ComponentModel.DataAnnotations;
+
+public abstract class BaseEntity
+{
+ [Key]
+ public int Id { get; set; }
+}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Core/Entities/Campaign.cs b/Sledgemapper.Api/Core/Entities/Campaign.cs
new file mode 100644
index 0000000..04a18de
--- /dev/null
+++ b/Sledgemapper.Api/Core/Entities/Campaign.cs
@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations.Schema;
+using Microsoft.EntityFrameworkCore;
+using Sledgemapper.Api.Models;
+
+namespace Sledgemapper.Api.Core.Entities
+{
+ [Index(nameof(CampaignName), nameof(OwnerId), IsUnique = true)]
+ public class Campaign
+ {
+ [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
+ public Guid CampaignId { get; set; }
+
+ public string CampaignName { get; set; }
+
+ public string OwnerId { get; set; }
+
+ public User Owner { get; set; }
+
+ public ICollection InvitedUsers { get; set; }
+
+ public ICollection Maps { get; set; }
+ }
+}
diff --git a/Sledgemapper.Api/Core/Entities/Map.cs b/Sledgemapper.Api/Core/Entities/Map.cs
new file mode 100644
index 0000000..b46a373
--- /dev/null
+++ b/Sledgemapper.Api/Core/Entities/Map.cs
@@ -0,0 +1,17 @@
+using System.ComponentModel.DataAnnotations;
+
+namespace Sledgemapper.Api.Core.Entities
+{
+ public class Map
+ {
+ [Key]
+ public int MapId { get; set; }
+
+ [Required]
+ public string MapName { get; set; }
+
+ [Required]
+ public int CampaignId { get; set; }
+
+ }
+}
diff --git a/Sledgemapper.Api/Models/MapLog.cs b/Sledgemapper.Api/Core/Entities/MapLog.cs
similarity index 78%
rename from Sledgemapper.Api/Models/MapLog.cs
rename to Sledgemapper.Api/Core/Entities/MapLog.cs
index d519df8..4d004f6 100644
--- a/Sledgemapper.Api/Models/MapLog.cs
+++ b/Sledgemapper.Api/Core/Entities/MapLog.cs
@@ -1,6 +1,7 @@
+using System;
using System.ComponentModel.DataAnnotations;
-namespace Sledgemapper.Api.Models
+namespace Sledgemapper.Api.Core.Entities
{
public class MapLog
@@ -9,10 +10,10 @@ namespace Sledgemapper.Api.Models
public int MapLogId { get; set; }
[Required]
- public int UserId{get;set;}
+ public string UserId { get; set; }
[Required]
- public int SessionId { get; set; }
+ public Guid SessionId { get; set; }
[Required]
[MaxLength(1)]
diff --git a/Sledgemapper.Api/Core/Entities/Session.cs b/Sledgemapper.Api/Core/Entities/Session.cs
new file mode 100644
index 0000000..52029db
--- /dev/null
+++ b/Sledgemapper.Api/Core/Entities/Session.cs
@@ -0,0 +1,24 @@
+using Microsoft.EntityFrameworkCore;
+using System;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Sledgemapper.Api.Core.Entities
+{
+ [Index(nameof(CampaignId), nameof(SessionName), IsUnique = true)]
+ public class Session
+ {
+ [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
+ [Key]
+ public Guid SessionId { get; set; }
+
+ [Required]
+ public Guid CampaignId { get; set; }
+
+ [Required]
+ public string SessionName { get; set; }
+
+ [Required]
+ public string OwnerUserId { get; set; }
+ }
+}
diff --git a/Sledgemapper.Api/Models/SessionUser.cs b/Sledgemapper.Api/Core/Entities/SessionUser.cs
similarity index 57%
rename from Sledgemapper.Api/Models/SessionUser.cs
rename to Sledgemapper.Api/Core/Entities/SessionUser.cs
index 86ba520..b2136c0 100644
--- a/Sledgemapper.Api/Models/SessionUser.cs
+++ b/Sledgemapper.Api/Core/Entities/SessionUser.cs
@@ -1,6 +1,7 @@
+using System;
using System.ComponentModel.DataAnnotations;
-namespace Sledgemapper.Api.Models
+namespace Sledgemapper.Api.Core.Entities
{
public class SessionUser
{
@@ -8,9 +9,9 @@ namespace Sledgemapper.Api.Models
public int SessionUserId { get; set; }
[Required]
- public int SessionId { get; set; }
+ public Guid SessionId { get; set; }
[Required]
- public int UserId { get; set; }
+ public Guid UserId { get; set; }
}
}
diff --git a/Sledgemapper.Api/Models/Snapshot.cs b/Sledgemapper.Api/Core/Entities/Snapshot.cs
similarity index 74%
rename from Sledgemapper.Api/Models/Snapshot.cs
rename to Sledgemapper.Api/Core/Entities/Snapshot.cs
index 31b5e55..2a577e2 100644
--- a/Sledgemapper.Api/Models/Snapshot.cs
+++ b/Sledgemapper.Api/Core/Entities/Snapshot.cs
@@ -1,6 +1,7 @@
+using System;
using System.ComponentModel.DataAnnotations;
-namespace Sledgemapper.Api.Models
+namespace Sledgemapper.Api.Core.Entities
{
public class Snapshot
@@ -9,8 +10,7 @@ namespace Sledgemapper.Api.Models
public int SnapshotId { get; set; }
[Required]
- public int SessionId { get; set; }
-
+ public Guid SessionId { get; set; }
[Required]
public string Object { get; set; }
diff --git a/Sledgemapper.Api/Core/Entities/User.cs b/Sledgemapper.Api/Core/Entities/User.cs
new file mode 100644
index 0000000..bc29784
--- /dev/null
+++ b/Sledgemapper.Api/Core/Entities/User.cs
@@ -0,0 +1,18 @@
+using System.Collections.Generic;
+using Microsoft.AspNetCore.Identity;
+
+namespace Sledgemapper.Api.Core.Entities
+{
+ public class User : IdentityUser
+ {
+ // public int Id { get; set; }
+ public string FirstName { get; set; }
+ public string LastName { get; set; }
+ // public string Email { get; set; }
+ // public string Username { get; set; }
+ public string Initials { get; set; }
+ // public byte[] PasswordHash { get; set; }
+ public byte[] PasswordSalt { get; set; }
+ public ICollection Campaigns { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Models/UserConnection.cs b/Sledgemapper.Api/Core/Entities/UserConnection.cs
similarity index 57%
rename from Sledgemapper.Api/Models/UserConnection.cs
rename to Sledgemapper.Api/Core/Entities/UserConnection.cs
index ea32a9c..17e34a3 100644
--- a/Sledgemapper.Api/Models/UserConnection.cs
+++ b/Sledgemapper.Api/Core/Entities/UserConnection.cs
@@ -1,15 +1,16 @@
+using System;
using System.ComponentModel.DataAnnotations;
-namespace Sledgemapper.Api.Models
+namespace Sledgemapper.Api.Core.Entities
{
public class UserConnection
{
[Key]
public int UserConnectionId { get; set; }
[Required]
- public int UserId { get; set; }
+ public Guid UserId { get; set; }
[Required]
- public string ConnectionId{get;set;}
+ public string ConnectionId { get; set; }
}
}
diff --git a/Sledgemapper.Api/Data/MyDbContext.cs b/Sledgemapper.Api/Data/MyDbContext.cs
deleted file mode 100644
index aca62cd..0000000
--- a/Sledgemapper.Api/Data/MyDbContext.cs
+++ /dev/null
@@ -1,81 +0,0 @@
-using Microsoft.EntityFrameworkCore;
-using Sledgemapper.Api.Models;
-namespace Sledgemapper.Api.Data
-{
- public static class DbInitializer
- {
- public static void Initialize(MyDbContext context)
- {
- context.Database.EnsureCreated();
- }
- }
-
- public class MyDbContext : DbContext
- {
- public DbSet MapLogs { get; set; }
- public DbSet Sessions { get; set; }
- public DbSet UserConnections { get; set; }
- public DbSet SessionUsers { get; set; }
- public DbSet Snapshots { get; set; }
-
- public MyDbContext(DbContextOptions options) : base(options)
- {
-
- }
-
- // protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
- // {
- // // optionsBuilder.
- // // options.MigrationsAssembly(Assembly.GetExecutingAssembly().FullName);
- // // optionsBuilder.UseSqlite("Filename=SledgemapperDatabase.db", options =>
- // // {
- // // options.MigrationsAssembly(Assembly.GetExecutingAssembly().FullName);
- // // });
- // optionsBuilder.UseSqlite("Filename=MyDatabase.db").UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking);
-
- // base.OnConfiguring(optionsBuilder);
- // }
-
- protected override void OnModelCreating(ModelBuilder modelBuilder)
- {
- // Map table names
- modelBuilder.Entity().ToTable("MapLog", "dbo");
- modelBuilder.Entity(entity =>
- {
- entity.HasKey(e => e.MapLogId);
- });
-
- modelBuilder.Entity().ToTable("Session", "dbo");
- modelBuilder.Entity(entity =>
- {
- entity.HasKey(e => e.SessionId);
- entity.HasIndex(e => e.SessionName).IsUnique();
- });
-
-
- modelBuilder.Entity().ToTable("UserConnection", "dbo");
- modelBuilder.Entity(entity =>
- {
- entity.HasKey(e => e.UserConnectionId);
- entity.HasIndex(e => e.UserId);
-
- });
-
- modelBuilder.Entity().ToTable("SessionUser", "dbo");
- modelBuilder.Entity(entity =>
- {
- entity.HasKey(e => e.SessionUserId);
- entity.HasIndex(e => e.SessionId);
-
- });
-
- modelBuilder.Entity().ToTable("Snapshot", "dbo");
- modelBuilder.Entity(entity =>
- {
- entity.HasKey(e => e.SnapshotId);
- });
-
- base.OnModelCreating(modelBuilder);
- }
- }
-}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Entities/User.cs b/Sledgemapper.Api/Entities/User.cs
deleted file mode 100644
index 00eb6d7..0000000
--- a/Sledgemapper.Api/Entities/User.cs
+++ /dev/null
@@ -1,13 +0,0 @@
-namespace Sledgemapper.Entities
-{
- public class User
- {
- public int Id { get; set; }
- public string FirstName { get; set; }
- public string LastName { get; set; }
- public string Username { get; set; }
- public string Initials { get; set; }
- public byte[] PasswordHash { get; set; }
- public byte[] PasswordSalt { get; set; }
- }
-}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Handlers/BaseCommandHandler.cs b/Sledgemapper.Api/Handlers/BaseCommandHandler.cs
new file mode 100644
index 0000000..f9a8dea
--- /dev/null
+++ b/Sledgemapper.Api/Handlers/BaseCommandHandler.cs
@@ -0,0 +1,76 @@
+using MediatR;
+using Sledgemapper.Api.Commands;
+using Sledgemapper.Api.Infrastructure.Data;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+using System;
+using Microsoft.EntityFrameworkCore;
+using Sledgemapper.Api.Models;
+using Sledgemapper.Api.Core.Entities;
+
+namespace Sledgemapper.Api.Handlers
+{
+ public abstract class BaseCommandHandler : IRequestHandler where TRequest : BaseCommand
+ {
+ protected SledgemapperDbContext DbContext { get; }
+
+ protected IMediator Mediator { get; }
+
+
+ public abstract Task Handle(TRequest request, CancellationToken cancellationToken);
+
+ protected BaseCommandHandler(IMediator mediator, SledgemapperDbContext dbContext)
+ {
+ DbContext = dbContext;
+ Mediator = mediator;
+ }
+
+ protected async Task CheckAuthorization(TRequest command)
+ {
+ var user = await DbContext.Users.FindAsync(command.UserId);
+ DbContext.Attach(user);
+
+
+ var campaign = await GetCampaignForUser(command);
+
+ var maps = campaign.Maps.Any(s => s.SessionId == command.SessionId);
+
+ if (!maps)
+ {
+ throw new Exception("Unauthorized");
+ }
+ }
+
+ protected async Task GetCampaignForUser(TRequest command)
+ {
+ var user = await DbContext.Users.FindAsync(command.UserId);
+ DbContext.Attach(user);
+ var campaign = await DbContext
+ .Campaigns
+ .Where(campaign => campaign.CampaignId == command.Campaign)
+ .Include(c => c.InvitedUsers)
+ .Include(c => c.Maps)
+ .Include(c => c.Owner)
+ .Where(campaign => campaign.OwnerId == command.UserId || campaign.InvitedUsers.Contains(user)).FirstAsync();
+ return campaign;
+ }
+
+ protected async Task SaveLog(TRequest command, string operation, string type, string data, CancellationToken cancellationToken)
+ {
+ var session = DbContext.Sessions.First(m => m.SessionId == command.SessionId);
+ DbContext.MapLogs.Add(new MapLog
+ {
+ Operation = operation,
+ SessionId = session.SessionId,
+ Type = type,
+ Timestamp = command.Timestamp,
+ Object = data,
+ UserId = command.UserId,
+ });
+ await DbContext.SaveChangesAsync(cancellationToken);
+ return session;
+ }
+
+ }
+}
diff --git a/Sledgemapper.Api/Handlers/DeleteNoteCommandHandler.cs b/Sledgemapper.Api/Handlers/DeleteNoteCommandHandler.cs
index dc8223b..e2d55c3 100644
--- a/Sledgemapper.Api/Handlers/DeleteNoteCommandHandler.cs
+++ b/Sledgemapper.Api/Handlers/DeleteNoteCommandHandler.cs
@@ -1,42 +1,25 @@
using MediatR;
-using Sledgemapper.Api.Data;
+using Sledgemapper.Api.Infrastructure.Data;
using Sledgemapper.Api.Commands;
using Sledgemapper.Api.Notifications;
-using Sledgemapper.Shared.Entities;
-using System.Linq;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
namespace Sledgemapper.Api.Handlers
{
-
- public class DeleteNoteCommandHandler : IRequestHandler
+ public class DeleteNoteCommandHandler : BaseCommandHandler
{
- private readonly MyDbContext _dbcontext;
-
- private readonly IMediator _mediator;
-
- public DeleteNoteCommandHandler(IMediator mediator, MyDbContext dbcontext) { _dbcontext = dbcontext; _mediator = mediator; }
-
-
- public async Task Handle(DeleteNoteCommand notification, CancellationToken cancellationToken)
+ public DeleteNoteCommandHandler(IMediator mediator, SledgemapperDbContext dbcontext) : base(mediator, dbcontext)
{
- var jsonString = JsonSerializer.Serialize(notification.Note);
- var session = _dbcontext.Sessions.First(m => m.SessionName == notification.SessionName);
-
- _dbcontext.MapLogs.Add(new Sledgemapper.Api.Models.MapLog
- {
- Operation = "D",
- SessionId = session.SessionId,
- Type = "N",
- Timestamp = notification.Timestamp,
- Object = jsonString,
- UserId = notification.UserId
- });
- await _dbcontext.SaveChangesAsync();
- await _mediator.Publish(new DeleteNoteNotification(session, notification.Note, notification.UserId));
+ }
+ public override async Task Handle(DeleteNoteCommand command, CancellationToken cancellationToken)
+ {
+ await CheckAuthorization(command);
+ var jsonString = JsonSerializer.Serialize(command.Note);
+ var session = await SaveLog(command, "D", "N", jsonString, cancellationToken);
+ await Mediator.Publish(new DeleteNoteNotification(session, command.Note, command.UserId), cancellationToken);
return true;
}
}
diff --git a/Sledgemapper.Api/Handlers/DeleteOverlayCommandHandler.cs b/Sledgemapper.Api/Handlers/DeleteOverlayCommandHandler.cs
index 5069970..a6b2956 100644
--- a/Sledgemapper.Api/Handlers/DeleteOverlayCommandHandler.cs
+++ b/Sledgemapper.Api/Handlers/DeleteOverlayCommandHandler.cs
@@ -1,40 +1,25 @@
using MediatR;
using Sledgemapper.Api.Commands;
-using Sledgemapper.Api.Data;
-using Sledgemapper.Shared.Entities;
+using Sledgemapper.Api.Infrastructure.Data;
using Sledgemapper.Api.Notifications;
-using System.Linq;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
namespace Sledgemapper.Api.Handlers
{
- public class DeleteOverlayCommandHandler : IRequestHandler
+ public class DeleteOverlayCommandHandler : BaseCommandHandler
{
- private readonly MyDbContext _dbcontext;
-
- private readonly IMediator _mediator;
-
- public DeleteOverlayCommandHandler(IMediator mediator, MyDbContext dbcontext) { _dbcontext = dbcontext; _mediator = mediator; }
-
- public async Task Handle(DeleteOverlayCommand notification, CancellationToken cancellationToken)
+ public DeleteOverlayCommandHandler(IMediator mediator, SledgemapperDbContext dbcontext) : base(mediator, dbcontext)
{
- var jsonString = JsonSerializer.Serialize(notification.Overlay);
- var session = _dbcontext.Sessions.First(m=>m.SessionName== notification.SessionName);
+ }
- _dbcontext.MapLogs.Add(new Sledgemapper.Api.Models.MapLog
- {
- Operation = "D",
- SessionId = session.SessionId,
- Type = "O",
- Timestamp = notification.Timestamp,
- Object = jsonString,
- UserId=notification.UserId
- });
-
- await _dbcontext.SaveChangesAsync();
- await _mediator.Publish(new DeleteOverlayNotification(session, notification.Overlay, notification.UserId));
+ public override async Task Handle(DeleteOverlayCommand command, CancellationToken cancellationToken)
+ {
+ await CheckAuthorization(command);
+ var jsonString = JsonSerializer.Serialize(command.Overlay);
+ var session = await SaveLog(command, "D", "O", jsonString, cancellationToken);
+ await Mediator.Publish(new DeleteOverlayNotification(session, command.Overlay, command.UserId), cancellationToken);
return true;
}
}
diff --git a/Sledgemapper.Api/Handlers/DeleteTileCommandHandler.cs b/Sledgemapper.Api/Handlers/DeleteTileCommandHandler.cs
index 40e9858..5c1cd1d 100644
--- a/Sledgemapper.Api/Handlers/DeleteTileCommandHandler.cs
+++ b/Sledgemapper.Api/Handlers/DeleteTileCommandHandler.cs
@@ -1,39 +1,25 @@
using MediatR;
using Sledgemapper.Api.Commands;
using Sledgemapper.Api.Notifications;
-using Sledgemapper.Api.Data;
-using Sledgemapper.Shared.Entities;
-using System.Linq;
+using Sledgemapper.Api.Infrastructure.Data;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
namespace Sledgemapper.Api.Handlers
{
- public class DeleteTileCommandHandler : IRequestHandler
+ public class DeleteTileCommandHandler : BaseCommandHandler
{
- private readonly MyDbContext _dbcontext;
-
- private readonly IMediator _mediator;
-
- public DeleteTileCommandHandler(IMediator mediator, MyDbContext dbcontext) { _dbcontext = dbcontext; _mediator = mediator; }
-
- public async Task Handle(DeleteTileCommand notification, CancellationToken cancellationToken)
+ public DeleteTileCommandHandler(IMediator mediator, SledgemapperDbContext dbcontext) : base(mediator, dbcontext)
{
- var jsonString = JsonSerializer.Serialize(notification.Tile);
- var session = _dbcontext.Sessions.First(m=>m.SessionName== notification.SessionName);
+ }
- _dbcontext.MapLogs.Add(new Sledgemapper.Api.Models.MapLog
- {
- Operation = "D",
- SessionId = session.SessionId,
- Type = "T",
- Timestamp = notification.Timestamp,
- Object = jsonString,
- UserId = notification.UserId
- });
- await _dbcontext.SaveChangesAsync();
- await _mediator.Publish(new DeleteTileNotification(session, notification.Tile, notification.UserId));
+ public override async Task Handle(DeleteTileCommand command, CancellationToken cancellationToken)
+ {
+ await CheckAuthorization(command);
+ var jsonString = JsonSerializer.Serialize(command.Tile);
+ var session = await SaveLog(command, "D", "T", jsonString, cancellationToken);
+ await Mediator.Publish(new DeleteTileNotification(session, command.Tile, command.UserId), cancellationToken);
return true;
}
}
diff --git a/Sledgemapper.Api/Handlers/DeleteWallCommandHandler.cs b/Sledgemapper.Api/Handlers/DeleteWallCommandHandler.cs
index 5fdb16a..aeb0f30 100644
--- a/Sledgemapper.Api/Handlers/DeleteWallCommandHandler.cs
+++ b/Sledgemapper.Api/Handlers/DeleteWallCommandHandler.cs
@@ -1,42 +1,25 @@
using MediatR;
-using Sledgemapper.Api.Data;
+using Sledgemapper.Api.Infrastructure.Data;
using Sledgemapper.Api.Commands;
using Sledgemapper.Api.Notifications;
-using Sledgemapper.Shared.Entities;
-using System.Linq;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
namespace Sledgemapper.Api.Handlers
{
-
- public class DeleteWallCommandHandler : IRequestHandler
+ public class DeleteWallCommandHandler : BaseCommandHandler
{
- private readonly MyDbContext _dbcontext;
-
- private readonly IMediator _mediator;
-
- public DeleteWallCommandHandler(IMediator mediator, MyDbContext dbcontext) { _dbcontext = dbcontext; _mediator = mediator; }
-
-
- public async Task Handle(DeleteWallCommand notification, CancellationToken cancellationToken)
+ public DeleteWallCommandHandler(IMediator mediator, SledgemapperDbContext dbcontext) : base(mediator, dbcontext)
{
- var jsonString = JsonSerializer.Serialize(notification.Wall);
- var session = _dbcontext.Sessions.First(m => m.SessionName == notification.SessionName);
-
- _dbcontext.MapLogs.Add(new Sledgemapper.Api.Models.MapLog
- {
- Operation = "D",
- SessionId = session.SessionId,
- Type = "W",
- Timestamp = notification.Timestamp,
- Object = jsonString,
- UserId = notification.UserId
- });
- await _dbcontext.SaveChangesAsync();
- await _mediator.Publish(new DeleteWallNotification(session, notification.Wall, notification.UserId));
+ }
+ public override async Task Handle(DeleteWallCommand command, CancellationToken cancellationToken)
+ {
+ await CheckAuthorization(command);
+ var jsonString = JsonSerializer.Serialize(command.Wall);
+ var session = await SaveLog(command, "D", "W", jsonString, cancellationToken);
+ await Mediator.Publish(new DeleteWallNotification(session, command.Wall, command.UserId), cancellationToken);
return true;
}
}
diff --git a/Sledgemapper.Api/Handlers/GetCampaignMapsCommandHandler.cs b/Sledgemapper.Api/Handlers/GetCampaignMapsCommandHandler.cs
new file mode 100644
index 0000000..289b8e1
--- /dev/null
+++ b/Sledgemapper.Api/Handlers/GetCampaignMapsCommandHandler.cs
@@ -0,0 +1,56 @@
+using MediatR;
+using Microsoft.EntityFrameworkCore;
+using Sledgemapper.Api.Commands;
+using Sledgemapper.Api.Infrastructure.Data;
+using Sledgemapper.Shared.Entities;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Sledgemapper.Api.Handlers
+{
+ public class GetCampaignMapsCommandHandler : IRequestHandler>
+ {
+ private readonly IMediator _mediator;
+ private readonly SledgemapperDbContext _dbcontext;
+
+ public GetCampaignMapsCommandHandler(IMediator mediator, SledgemapperDbContext dbcontext)
+ {
+ _mediator = mediator;
+ _dbcontext = dbcontext;
+ }
+
+ public async Task> Handle(GetCampaignMapsCommand command, CancellationToken cancellationToken)
+ {
+ try
+ {
+ var user = await _dbcontext.Users.FindAsync(command.UserId);
+ _dbcontext.Attach(user);
+
+
+
+ var campaign = await _dbcontext
+ .Campaigns
+ .Where(campaign => campaign.CampaignId == command.CampaignId)
+ .Include(c => c.InvitedUsers)
+ .Include(c => c.Maps)
+ .Include(c => c.Owner)
+ .Where(campaign => campaign.OwnerId == command.UserId || campaign.InvitedUsers.Contains(user)).FirstAsync();
+
+
+
+
+ //var campaign = await _dbcontext.Campaigns.Where(campaign => campaign.CampaignId == command.CampaignId && campaign.OwnerId == command.UserId).Include(campaign => campaign.Maps).FirstAsync();
+
+ var maps = campaign.Maps.Select(session => new Session { SessionName = session.SessionName, SessionId = session.SessionId }).ToList();
+ return maps;
+ }
+ catch (Exception ex)
+ {
+ }
+ return null;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Handlers/GetCampaignPlayersCommandHandler.cs b/Sledgemapper.Api/Handlers/GetCampaignPlayersCommandHandler.cs
new file mode 100644
index 0000000..7b606c5
--- /dev/null
+++ b/Sledgemapper.Api/Handlers/GetCampaignPlayersCommandHandler.cs
@@ -0,0 +1,43 @@
+using MediatR;
+using Microsoft.EntityFrameworkCore;
+using Sledgemapper.Api.Commands;
+using Sledgemapper.Api.Infrastructure.Data;
+using Sledgemapper.Shared.Entities;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Sledgemapper.Api.Handlers
+{
+ public class GetCampaignPlayersCommandHandler : IRequestHandler>
+ {
+ private readonly IMediator _mediator;
+ private readonly SledgemapperDbContext _dbcontext;
+
+ public GetCampaignPlayersCommandHandler(IMediator mediator, SledgemapperDbContext dbcontext)
+ {
+ _mediator = mediator;
+ _dbcontext = dbcontext;
+ }
+
+ public async Task> Handle(GetCampaignPlayersCommand command, CancellationToken cancellationToken)
+ {
+ try
+ {
+ var user = await _dbcontext.Users.FindAsync(command.UserId);
+ _dbcontext.Attach(user);
+
+ var campaign = await _dbcontext.Campaigns.Where(campaign => campaign.CampaignName == command.CampaignName && campaign.OwnerId == command.UserId).Include(campaign => campaign.InvitedUsers).FirstAsync();
+
+ var players = campaign.InvitedUsers.Select(user => new Player { Initials = user.Initials, UserName = user.UserName }).ToList();
+ return players;
+ }
+ catch (Exception ex)
+ {
+ }
+ return null;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Handlers/GetCampaignsCommandHandler.cs b/Sledgemapper.Api/Handlers/GetCampaignsCommandHandler.cs
new file mode 100644
index 0000000..12b226f
--- /dev/null
+++ b/Sledgemapper.Api/Handlers/GetCampaignsCommandHandler.cs
@@ -0,0 +1,43 @@
+using MediatR;
+using Microsoft.EntityFrameworkCore;
+using Sledgemapper.Api.Commands;
+using Sledgemapper.Api.Infrastructure.Data;
+using Sledgemapper.Shared.Entities;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Sledgemapper.Api.Handlers
+{
+ public class GetCampaignsCommandHandler : IRequestHandler>
+ {
+ private readonly IMediator _mediator;
+ private readonly SledgemapperDbContext _dbcontext;
+
+ public GetCampaignsCommandHandler(IMediator mediator, SledgemapperDbContext dbcontext)
+ {
+ _mediator = mediator;
+ _dbcontext = dbcontext;
+ }
+
+ public async Task> Handle(GetCampaignsCommand command, CancellationToken cancellationToken)
+ {
+ try
+ {
+ var user = await _dbcontext.Users.FindAsync(command.UserId);
+ _dbcontext.Attach(user);
+ var campaigns = _dbcontext.Campaigns.Include(c => c.InvitedUsers).Include(c => c.Maps).Include(c => c.Owner).Where(campaign => campaign.OwnerId == command.UserId || campaign.InvitedUsers.Contains(user));
+
+ return campaigns.
+ Select(c => new Campaign { Id = c.CampaignId, Name = c.CampaignName, Maps = c.Maps.Select(m => new Map { SessionName = m.SessionName }).ToList() })
+ .ToList();
+ }
+ catch (Exception ex)
+ {
+ }
+ return new List();
+ }
+ }
+}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Handlers/GetMapSnapshotCommandHandler.cs b/Sledgemapper.Api/Handlers/GetMapSnapshotCommandHandler.cs
index 6b542c1..e304fa0 100644
--- a/Sledgemapper.Api/Handlers/GetMapSnapshotCommandHandler.cs
+++ b/Sledgemapper.Api/Handlers/GetMapSnapshotCommandHandler.cs
@@ -1,36 +1,39 @@
using MediatR;
-using Sledgemapper.Api.Data;
+using Sledgemapper.Api.Infrastructure.Data;
using Sledgemapper.Shared.Entities;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
using System.Linq;
using Sledgemapper.Api.Models;
+using Sledgemapper.Api.Commands;
+using Sledgemapper.Api.Core.Entities;
+using Session = Sledgemapper.Shared.Entities.Session;
-namespace Sledgemapper.Api.Commands
+namespace Sledgemapper.Api.Handlers
{
- public class GetMapSnapshotCommandHandler : IRequestHandler
+ public class GetMapSnapshotCommandHandler : IRequestHandler
{
- private readonly MyDbContext _dbcontext;
+ private readonly SledgemapperDbContext _dbcontext;
- public GetMapSnapshotCommandHandler(MyDbContext dbcontext) { _dbcontext = dbcontext; }
+ public GetMapSnapshotCommandHandler(SledgemapperDbContext dbcontext) { _dbcontext = dbcontext; }
- public async Task Handle(GetMapSnapshotCommand notification, CancellationToken cancellationToken)
+ public async Task Handle(GetMapSnapshotCommand notification, CancellationToken cancellationToken)
{
Snapshot snapshot;
double timestamp;
- Sledgemapper.Shared.Entities.Session mapSession;
- var session = _dbcontext.Sessions.First(m => m.SessionName == notification.SessionName);
+ Session mapSession;
+ var session = _dbcontext.Sessions.First(m => m.SessionId == notification.MapId);
snapshot = _dbcontext.Snapshots.OrderByDescending(s => s.Timestamp).FirstOrDefault(m => m.SessionId == session.SessionId);
if (snapshot is null)
{
timestamp = 0;
- mapSession = new Shared.Entities.Session();
+ mapSession = new Session();
}
else
{
- mapSession = JsonSerializer.Deserialize(snapshot.Object);
+ mapSession = JsonSerializer.Deserialize(snapshot.Object);
timestamp = snapshot.Timestamp;
}
@@ -57,7 +60,7 @@ namespace Sledgemapper.Api.Commands
var note = JsonSerializer.Deserialize(mapUpdate.Object);
mapSession.NewNote(note);
break;
- case "L":
+ case "L":
var line = JsonSerializer.Deserialize(mapUpdate.Object);
mapSession.NewLine(line);
break;
@@ -65,9 +68,9 @@ namespace Sledgemapper.Api.Commands
var room = JsonSerializer.Deserialize(mapUpdate.Object);
mapSession.NewRoom(room);
break;
-
-
-
+
+
+
}
@@ -101,10 +104,10 @@ namespace Sledgemapper.Api.Commands
{
SessionId = session.SessionId,
Timestamp = mapUpdates.Max(mapSession => mapSession.Timestamp),
- Object = JsonSerializer.Serialize(mapSession)
+ Object = JsonSerializer.Serialize(mapSession)
};
- await _dbcontext.Snapshots.AddAsync(newSnapshot);
- await _dbcontext.SaveChangesAsync();
+ await _dbcontext.Snapshots.AddAsync(newSnapshot, cancellationToken);
+ await _dbcontext.SaveChangesAsync(cancellationToken);
}
return mapSession;
}
diff --git a/Sledgemapper.Api/Handlers/InvitePlayerToCampaignCommandHandler.cs b/Sledgemapper.Api/Handlers/InvitePlayerToCampaignCommandHandler.cs
new file mode 100644
index 0000000..c6c6a28
--- /dev/null
+++ b/Sledgemapper.Api/Handlers/InvitePlayerToCampaignCommandHandler.cs
@@ -0,0 +1,44 @@
+using MediatR;
+using Microsoft.EntityFrameworkCore;
+using Sledgemapper.Api.Commands;
+using Sledgemapper.Api.Infrastructure.Data;
+using System;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Sledgemapper.Api.Handlers
+{
+ public class InvitePlayerToCampaignCommandHandler : IRequestHandler
+ {
+ private readonly IMediator _mediator;
+ private readonly SledgemapperDbContext _dbcontext;
+
+ public InvitePlayerToCampaignCommandHandler(IMediator mediator, SledgemapperDbContext dbcontext)
+ {
+ _mediator = mediator;
+ _dbcontext = dbcontext;
+ }
+
+ public async Task Handle(InvitePlayerToCampaignCommand command, CancellationToken cancellationToken)
+ {
+ try
+ {
+ var user = await _dbcontext.Users.FindAsync(command.UserId);
+
+ var campaign = await _dbcontext.Campaigns.Where(campaign=>campaign.CampaignName==command.CampaignName && campaign.OwnerId==command.UserId).Include(campaign=>campaign.InvitedUsers).FirstAsync();
+ var invitedUser = await _dbcontext.Users.FirstOrDefaultAsync(user=>user.Email==command.Email);
+ _dbcontext.Attach(invitedUser);
+ _dbcontext.Attach(campaign);
+ campaign.InvitedUsers.Add(invitedUser);
+ _dbcontext.Campaigns.Update(campaign);
+ await _dbcontext.SaveChangesAsync();
+ return true;
+ }
+ catch (Exception ex)
+ {
+ }
+ return false;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Handlers/NewCampaignCommandHandler.cs b/Sledgemapper.Api/Handlers/NewCampaignCommandHandler.cs
new file mode 100644
index 0000000..0c61334
--- /dev/null
+++ b/Sledgemapper.Api/Handlers/NewCampaignCommandHandler.cs
@@ -0,0 +1,48 @@
+using MediatR;
+using Sledgemapper.Api.Commands;
+using Sledgemapper.Api.Infrastructure.Data;
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+using Sledgemapper.Api.Core.Entities;
+
+namespace Sledgemapper.Api.Handlers
+{
+ public class NewCampaignCommandHandler : IRequestHandler
+ {
+ private readonly IMediator _mediator;
+ private readonly SledgemapperDbContext _dbcontext;
+
+ public NewCampaignCommandHandler(IMediator mediator, SledgemapperDbContext dbcontext)
+ {
+ _mediator = mediator;
+ _dbcontext = dbcontext;
+ }
+
+ public async Task Handle(NewCampaignCommand notification, CancellationToken cancellationToken)
+ {
+ try
+ {
+ var user = await _dbcontext.Users.FindAsync(notification.UserId, cancellationToken);
+ _dbcontext.Attach(user);
+ var campaign = new Core.Entities.Campaign
+ {
+ CampaignName = notification.CampaignName,
+ OwnerId = user.Id,
+ InvitedUsers = new System.Collections.Generic.List { user }
+ };
+
+ _dbcontext.Campaigns.Add(campaign);
+
+ await _dbcontext.SaveChangesAsync(cancellationToken);
+ return true;
+ }
+ catch (Exception ex)
+ {
+
+
+ }
+ return false;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Handlers/NewLineCommandHandler.cs b/Sledgemapper.Api/Handlers/NewLineCommandHandler.cs
index 4901dae..c499145 100644
--- a/Sledgemapper.Api/Handlers/NewLineCommandHandler.cs
+++ b/Sledgemapper.Api/Handlers/NewLineCommandHandler.cs
@@ -1,8 +1,6 @@
using MediatR;
-using Sledgemapper.Api.Data;
-using Sledgemapper.Shared.Entities;
+using Sledgemapper.Api.Infrastructure.Data;
using Sledgemapper.Api.Commands;
-using System.Linq;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
@@ -10,29 +8,18 @@ using Sledgemapper.Api.Notifications;
namespace Sledgemapper.Api.Handlers
{
- public class NewLineCommandHandler : IRequestHandler
+ public class NewLineCommandHandler : BaseCommandHandler
{
- private readonly MyDbContext _dbcontext;
-
- private readonly IMediator _mediator;
-
- public NewLineCommandHandler(IMediator mediator, MyDbContext dbcontext) { _dbcontext = dbcontext; _mediator = mediator; }
-
- public async Task Handle(NewLineCommand notification, CancellationToken cancellationToken)
+ public NewLineCommandHandler(IMediator mediator, SledgemapperDbContext dbContext) : base(mediator, dbContext)
{
- var jsonString = JsonSerializer.Serialize(notification.Line);
- var session = _dbcontext.Sessions.First(m => m.SessionName == notification.SessionName);
- _dbcontext.MapLogs.Add(new Sledgemapper.Api.Models.MapLog
- {
- Operation = "N",
- SessionId = session.SessionId,
- Type = "L",
- Timestamp = notification.Timestamp,
- Object = jsonString,
- UserId = notification.UserId,
- });
- await _dbcontext.SaveChangesAsync();
- await _mediator.Publish(new NewLineNotification(session, notification.Line, notification.UserId));
+ }
+
+ public override async Task Handle(NewLineCommand command, CancellationToken cancellationToken)
+ {
+ await CheckAuthorization(command);
+ var jsonString = JsonSerializer.Serialize(command.Line);
+ var session = await SaveLog(command, "N", "L", jsonString, cancellationToken);
+ await Mediator.Publish(new NewLineNotification(session, command.Line, command.UserId), cancellationToken);
return true;
}
}
diff --git a/Sledgemapper.Api/Handlers/NewNoteCommandHandler.cs b/Sledgemapper.Api/Handlers/NewNoteCommandHandler.cs
index 5a50e45..6390422 100644
--- a/Sledgemapper.Api/Handlers/NewNoteCommandHandler.cs
+++ b/Sledgemapper.Api/Handlers/NewNoteCommandHandler.cs
@@ -1,38 +1,25 @@
using MediatR;
-using Sledgemapper.Api.Data;
-using Sledgemapper.Shared.Entities;
+using Sledgemapper.Api.Infrastructure.Data;
using Sledgemapper.Api.Commands;
using Sledgemapper.Api.Notifications;
-using System.Linq;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
namespace Sledgemapper.Api.Handlers
{
- public class NewNoteCommandHandler : IRequestHandler
+ public class NewNoteCommandHandler : BaseCommandHandler
{
- private readonly MyDbContext _dbcontext;
-
- private readonly IMediator _mediator;
-
- public NewNoteCommandHandler(IMediator mediator, MyDbContext dbcontext) { _dbcontext = dbcontext; _mediator = mediator; }
-
- public async Task Handle(NewNoteCommand notification, CancellationToken cancellationToken)
+ public NewNoteCommandHandler(IMediator mediator, SledgemapperDbContext dbcontext) : base(mediator, dbcontext)
{
- var jsonString = JsonSerializer.Serialize(notification.Note);
- var session = _dbcontext.Sessions.First(m => m.SessionName == notification.SessionName);
- _dbcontext.MapLogs.Add(new Sledgemapper.Api.Models.MapLog
- {
- Operation = "N",
- SessionId = session.SessionId,
- Type = "N",
- Timestamp = notification.Timestamp,
- Object = jsonString,
- UserId = notification.UserId,
- });
- await _dbcontext.SaveChangesAsync();
- await _mediator.Publish(new NewNoteNotification(session, notification.Note, notification.UserId));
+ }
+
+ public override async Task Handle(NewNoteCommand command, CancellationToken cancellationToken)
+ {
+ await CheckAuthorization(command);
+ var jsonString = JsonSerializer.Serialize(command.Note);
+ var session = await SaveLog(command, "N", "W", jsonString, cancellationToken);
+ await Mediator.Publish(new NewNoteNotification(session, command.Note, command.UserId), cancellationToken);
return true;
}
}
diff --git a/Sledgemapper.Api/Handlers/NewOverlayCommandHandler.cs b/Sledgemapper.Api/Handlers/NewOverlayCommandHandler.cs
index 817a37f..68a6793 100644
--- a/Sledgemapper.Api/Handlers/NewOverlayCommandHandler.cs
+++ b/Sledgemapper.Api/Handlers/NewOverlayCommandHandler.cs
@@ -1,38 +1,26 @@
using MediatR;
using Sledgemapper.Api.Commands;
+using Sledgemapper.Api.Infrastructure.Data;
using Sledgemapper.Api.Notifications;
-using Sledgemapper.Api.Data;
-using Sledgemapper.Shared.Entities;
-using System.Linq;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
namespace Sledgemapper.Api.Handlers
{
- public class NewOverlayCommandHandler : IRequestHandler
+
+ public class NewOverlayCommandHandler : BaseCommandHandler
{
- private readonly MyDbContext _dbcontext;
-
- private readonly IMediator _mediator;
-
- public NewOverlayCommandHandler(IMediator mediator, MyDbContext dbcontext) { _dbcontext = dbcontext; _mediator = mediator; }
-
- public async Task Handle(NewOverlayCommand notification, CancellationToken cancellationToken)
+ public NewOverlayCommandHandler(IMediator mediator, SledgemapperDbContext dbcontext) : base(mediator, dbcontext)
{
- var jsonString = JsonSerializer.Serialize(notification.Overlay);
- var session = _dbcontext.Sessions.First(m => m.SessionName == notification.SessionName);
- _dbcontext.MapLogs.Add(new Sledgemapper.Api.Models.MapLog
- {
- Operation = "N",
- SessionId = session.SessionId,
- Type = "O",
- Timestamp = notification.Timestamp,
- Object = jsonString,
- UserId = notification.UserId,
- });
- await _dbcontext.SaveChangesAsync();
- await _mediator.Publish(new NewOverlayNotification(session, notification.Overlay, notification.UserId));
+ }
+
+ public override async Task Handle(NewOverlayCommand command, CancellationToken cancellationToken)
+ {
+ await CheckAuthorization(command);
+ var jsonString = JsonSerializer.Serialize(command.Overlay);
+ var session = await SaveLog(command, "N", "O", jsonString, cancellationToken);
+ await Mediator.Publish(new NewOverlayNotification(session, command.Overlay, command.UserId), cancellationToken);
return true;
}
}
diff --git a/Sledgemapper.Api/Handlers/NewRoomCommandHandler.cs b/Sledgemapper.Api/Handlers/NewRoomCommandHandler.cs
index 73561a1..f5093ba 100644
--- a/Sledgemapper.Api/Handlers/NewRoomCommandHandler.cs
+++ b/Sledgemapper.Api/Handlers/NewRoomCommandHandler.cs
@@ -1,8 +1,6 @@
using MediatR;
-using Sledgemapper.Api.Data;
-using Sledgemapper.Shared.Entities;
+using Sledgemapper.Api.Infrastructure.Data;
using Sledgemapper.Api.Commands;
-using System.Linq;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
@@ -10,29 +8,17 @@ using Sledgemapper.Api.Notifications;
namespace Sledgemapper.Api.Handlers
{
- public class NewRoomCommandHandler : IRequestHandler
+ public class NewRoomCommandHandler : BaseCommandHandler
{
- private readonly MyDbContext _dbcontext;
+ public NewRoomCommandHandler(IMediator mediator, SledgemapperDbContext dbcontext) : base(mediator, dbcontext)
+ { }
- private readonly IMediator _mediator;
-
- public NewRoomCommandHandler(IMediator mediator, MyDbContext dbcontext) { _dbcontext = dbcontext; _mediator = mediator; }
-
- public async Task Handle(NewRoomCommand notification, CancellationToken cancellationToken)
+ public override async Task Handle(NewRoomCommand command, CancellationToken cancellationToken)
{
- var jsonString = JsonSerializer.Serialize(notification.Room);
- var session = _dbcontext.Sessions.First(m => m.SessionName == notification.SessionName);
- _dbcontext.MapLogs.Add(new Sledgemapper.Api.Models.MapLog
- {
- Operation = "N",
- SessionId = session.SessionId,
- Type = "R",
- Timestamp = notification.Timestamp,
- Object = jsonString,
- UserId = notification.UserId,
- });
- await _dbcontext.SaveChangesAsync();
- await _mediator.Publish(new NewRoomNotification(session, notification.Room, notification.UserId));
+ await CheckAuthorization(command);
+ var jsonString = JsonSerializer.Serialize(command.Room);
+ var session = await SaveLog(command, "N", "R", jsonString, cancellationToken);
+ await Mediator.Publish(new NewRoomNotification(session, command.Room, command.UserId), cancellationToken);
return true;
}
}
diff --git a/Sledgemapper.Api/Handlers/NewSnapshotCommandHandler.cs b/Sledgemapper.Api/Handlers/NewSnapshotCommandHandler.cs
index e6d88e0..941fbb6 100644
--- a/Sledgemapper.Api/Handlers/NewSnapshotCommandHandler.cs
+++ b/Sledgemapper.Api/Handlers/NewSnapshotCommandHandler.cs
@@ -1,34 +1,37 @@
using MediatR;
-using Sledgemapper.Api.Data;
+using Sledgemapper.Api.Infrastructure.Data;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
using System.Linq;
+using Sledgemapper.Api.Commands;
+using Sledgemapper.Api.Core.Entities;
-namespace Sledgemapper.Api.Commands
+namespace Sledgemapper.Api.Handlers
{
public class NewSnapshotCommandHandler : IRequestHandler
{
- private readonly MyDbContext _dbcontext;
+ private readonly SledgemapperDbContext _dbcontext;
private readonly IMediator _mediator;
- public NewSnapshotCommandHandler(IMediator mediator, MyDbContext dbcontext) { _dbcontext = dbcontext; _mediator = mediator; }
+ public NewSnapshotCommandHandler(IMediator mediator, SledgemapperDbContext dbcontext) { _dbcontext = dbcontext; _mediator = mediator; }
public async Task Handle(NewSnapshotCommand notification, CancellationToken cancellationToken)
{
-
+
var session = _dbcontext.Sessions.First(m => m.SessionName == notification.SessionName);
- var newSnapshot = new Sledgemapper.Api.Models.Snapshot{
- SessionId=session.SessionId,
- Timestamp=notification.Timestamp,
- Object = JsonSerializer.Serialize(notification.Session)
+ var newSnapshot = new Snapshot
+ {
+ SessionId = session.SessionId,
+ Timestamp = notification.Timestamp,
+ Object = JsonSerializer.Serialize(notification.Session)
+
+ };
+ await _dbcontext.Snapshots.AddAsync(newSnapshot, cancellationToken);
+ await _dbcontext.SaveChangesAsync(cancellationToken);
-};
-await _dbcontext.Snapshots.AddAsync(newSnapshot);
- await _dbcontext.SaveChangesAsync();
-
return true;
}
diff --git a/Sledgemapper.Api/Handlers/NewTileCommandHandler.cs b/Sledgemapper.Api/Handlers/NewTileCommandHandler.cs
index 6b0a55c..5db3d32 100644
--- a/Sledgemapper.Api/Handlers/NewTileCommandHandler.cs
+++ b/Sledgemapper.Api/Handlers/NewTileCommandHandler.cs
@@ -1,38 +1,25 @@
using MediatR;
-using Sledgemapper.Api.Data;
-
+using Sledgemapper.Api.Infrastructure.Data;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
using Sledgemapper.Api.Notifications;
-using System.Linq;
-using Sledgemapper.Shared.Entities;
+using Sledgemapper.Api.Commands;
-namespace Sledgemapper.Api.Commands
+namespace Sledgemapper.Api.Handlers
{
- public class NewTileCommandHandler : IRequestHandler
+ public class NewTileCommandHandler : BaseCommandHandler
{
- private readonly MyDbContext _dbcontext;
- private readonly IMediator _mediator;
-
- public NewTileCommandHandler(IMediator mediator, MyDbContext dbcontext) { _dbcontext = dbcontext; _mediator = mediator; }
-
- public async Task Handle(NewTileCommand notification, CancellationToken cancellationToken)
+ public NewTileCommandHandler(IMediator mediator, SledgemapperDbContext dbContext) : base(mediator, dbContext)
{
- var jsonString = JsonSerializer.Serialize(notification.Tile);
- var session = _dbcontext.Sessions.First(m => m.SessionName == notification.SessionName);
+ }
- _dbcontext.MapLogs.Add(new Sledgemapper.Api.Models.MapLog
- {
- Operation = "N",
- SessionId = session.SessionId,
- Type = "T",
- Timestamp = notification.Timestamp,
- Object = jsonString,
- UserId = notification.UserId
- });
- await _dbcontext.SaveChangesAsync();
- await _mediator.Publish(new NewTileNotification(session, notification.Tile, notification.UserId));
+ public override async Task Handle(NewTileCommand command, CancellationToken cancellationToken)
+ {
+ await CheckAuthorization(command);
+ var jsonString = JsonSerializer.Serialize(command.Tile);
+ var session = await SaveLog(command, "N", "T", jsonString, cancellationToken);
+ await Mediator.Publish(new NewTileNotification(session, command.Tile, command.UserId), cancellationToken);
return true;
}
}
diff --git a/Sledgemapper.Api/Handlers/NewWallCommandHandler.cs b/Sledgemapper.Api/Handlers/NewWallCommandHandler.cs
index af69b69..c2c480d 100644
--- a/Sledgemapper.Api/Handlers/NewWallCommandHandler.cs
+++ b/Sledgemapper.Api/Handlers/NewWallCommandHandler.cs
@@ -1,38 +1,25 @@
using MediatR;
-using Sledgemapper.Api.Data;
-using Sledgemapper.Shared.Entities;
+using Sledgemapper.Api.Infrastructure.Data;
using Sledgemapper.Api.Commands;
using Sledgemapper.Api.Notifications;
-using System.Linq;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
namespace Sledgemapper.Api.Handlers
{
- public class NewWallCommandHandler : IRequestHandler
+ public class NewWallCommandHandler : BaseCommandHandler
{
- private readonly MyDbContext _dbcontext;
-
- private readonly IMediator _mediator;
-
- public NewWallCommandHandler(IMediator mediator, MyDbContext dbcontext) { _dbcontext = dbcontext; _mediator = mediator; }
-
- public async Task Handle(NewWallCommand notification, CancellationToken cancellationToken)
+ public NewWallCommandHandler(IMediator mediator, SledgemapperDbContext dbContext) : base(mediator, dbContext)
{
- var jsonString = JsonSerializer.Serialize(notification.Wall);
- var session = _dbcontext.Sessions.First(m => m.SessionName == notification.SessionName);
- _dbcontext.MapLogs.Add(new Sledgemapper.Api.Models.MapLog
- {
- Operation = "N",
- SessionId = session.SessionId,
- Type = "W",
- Timestamp = notification.Timestamp,
- Object = jsonString,
- UserId = notification.UserId,
- });
- await _dbcontext.SaveChangesAsync();
- await _mediator.Publish(new NewWallNotification(session, notification.Wall, notification.UserId));
+ }
+
+ public override async Task Handle(NewWallCommand command, CancellationToken cancellationToken)
+ {
+ await CheckAuthorization(command);
+ var jsonString = JsonSerializer.Serialize(command.Wall);
+ var session = await SaveLog(command, "N", "W", jsonString, cancellationToken);
+ await Mediator.Publish(new NewWallNotification(session, command.Wall, command.UserId), cancellationToken);
return true;
}
}
diff --git a/Sledgemapper.Api/Handlers/PingCommandHandler.cs b/Sledgemapper.Api/Handlers/PingCommandHandler.cs
deleted file mode 100644
index efc9325..0000000
--- a/Sledgemapper.Api/Handlers/PingCommandHandler.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-// using MediatR;
-// using Sledgemapper.Api.Data;
-// using System.Threading;
-// using System.Threading.Tasks;
-// using Sledgemapper.Api.Notifications;
-// using System.Linq;
-
-// namespace Sledgemapper.Api.Commands
-// {
-// public class PingCommandHandler : IRequestHandler
-// {
-// private readonly MyDbContext _dbcontext;
-// private readonly IMediator _mediator;
-
-// public PingCommandHandler(IMediator mediator, MyDbContext dbcontext) { _dbcontext = dbcontext; _mediator = mediator; }
-
-// public async Task Handle(PingCommand notification, CancellationToken cancellationToken)
-// {
-// var session = _dbcontext.Sessions.First(m => m.SessionName == notification.SessionName);
-
-
-// await _mediator.Publish(new PingNotification(session, notification.Location, notification.UserId));
-// return true;
-// }
-
-
-// }
-// }
diff --git a/Sledgemapper.Api/Handlers/SendDeleteNoteMessage.cs b/Sledgemapper.Api/Handlers/SendDeleteNoteMessage.cs
index 1f6a112..1c66299 100644
--- a/Sledgemapper.Api/Handlers/SendDeleteNoteMessage.cs
+++ b/Sledgemapper.Api/Handlers/SendDeleteNoteMessage.cs
@@ -1,6 +1,6 @@
using MediatR;
using Microsoft.AspNetCore.SignalR;
-using Sledgemapper.Clients;
+using Sledgemapper.Shared.Clients;
using System.Threading;
using System.Threading.Tasks;
using Sledgemapper.Api.Hubs;
@@ -16,7 +16,7 @@ namespace Sledgemapper.Api.Handlers
public async Task Handle(DeleteNoteNotification notification, CancellationToken cancellationToken)
{
- await _hub.Clients.Groups(notification.Session.SessionName).DeleteNote(notification.Note);
+ await _hub.Clients.Groups(notification.Session.SessionId.ToString()).DeleteNote(notification.Note);
}
}
}
diff --git a/Sledgemapper.Api/Handlers/SendDeleteOverlayMessage.cs b/Sledgemapper.Api/Handlers/SendDeleteOverlayMessage.cs
index cb0b922..35b07aa 100644
--- a/Sledgemapper.Api/Handlers/SendDeleteOverlayMessage.cs
+++ b/Sledgemapper.Api/Handlers/SendDeleteOverlayMessage.cs
@@ -2,9 +2,9 @@ using MediatR;
using Microsoft.AspNetCore.SignalR;
using Sledgemapper.Api.Hubs;
using Sledgemapper.Api.Notifications;
-using Sledgemapper.Clients;
using System.Threading;
using System.Threading.Tasks;
+using Sledgemapper.Shared.Clients;
namespace Sledgemapper.Api.Handlers
{
@@ -16,7 +16,7 @@ namespace Sledgemapper.Api.Handlers
public async Task Handle(DeleteOverlayNotification notification, CancellationToken cancellationToken)
{
- await _hub.Clients.Groups(notification.Session.SessionName).DeleteOverlay(notification.Overlay);
+ await _hub.Clients.Groups(notification.Session.SessionId.ToString()).DeleteOverlay(notification.Overlay);
}
}
}
diff --git a/Sledgemapper.Api/Handlers/SendDeleteTileMessage.cs b/Sledgemapper.Api/Handlers/SendDeleteTileMessage.cs
index 75c0c03..78f07ee 100644
--- a/Sledgemapper.Api/Handlers/SendDeleteTileMessage.cs
+++ b/Sledgemapper.Api/Handlers/SendDeleteTileMessage.cs
@@ -2,9 +2,9 @@ using MediatR;
using Microsoft.AspNetCore.SignalR;
using Sledgemapper.Api.Hubs;
using Sledgemapper.Api.Notifications;
-using Sledgemapper.Clients;
using System.Threading;
using System.Threading.Tasks;
+using Sledgemapper.Shared.Clients;
namespace Sledgemapper.Api.Handlers
{
@@ -16,7 +16,7 @@ namespace Sledgemapper.Api.Handlers
public async Task Handle(DeleteTileNotification notification, CancellationToken cancellationToken)
{
- await _hub.Clients.Groups(notification.Session.SessionName).DeleteTile(notification.Tile);
+ await _hub.Clients.Groups(notification.Session.SessionId.ToString()).DeleteTile(notification.Tile);
}
}
}
diff --git a/Sledgemapper.Api/Handlers/SendDeleteWallMessage.cs b/Sledgemapper.Api/Handlers/SendDeleteWallMessage.cs
index e853012..99f4e2a 100644
--- a/Sledgemapper.Api/Handlers/SendDeleteWallMessage.cs
+++ b/Sledgemapper.Api/Handlers/SendDeleteWallMessage.cs
@@ -1,10 +1,10 @@
using MediatR;
using Microsoft.AspNetCore.SignalR;
using Sledgemapper.Api.Notifications;
-using Sledgemapper.Clients;
using System.Threading;
using System.Threading.Tasks;
using Sledgemapper.Api.Hubs;
+using Sledgemapper.Shared.Clients;
namespace Sledgemapper.Api.Handlers
{
@@ -16,7 +16,7 @@ namespace Sledgemapper.Api.Handlers
public async Task Handle(DeleteWallNotification notification, CancellationToken cancellationToken)
{
- await _hub.Clients.Groups(notification.Session.SessionName).DeleteWall(notification.Wall);
+ await _hub.Clients.Groups(notification.Session.SessionId.ToString()).DeleteWall(notification.Wall);
}
}
}
diff --git a/Sledgemapper.Api/Handlers/SendNewLineMessage.cs b/Sledgemapper.Api/Handlers/SendNewLineMessage.cs
index e0e9c86..1447351 100644
--- a/Sledgemapper.Api/Handlers/SendNewLineMessage.cs
+++ b/Sledgemapper.Api/Handlers/SendNewLineMessage.cs
@@ -1,10 +1,10 @@
using MediatR;
using Microsoft.AspNetCore.SignalR;
using Sledgemapper.Api.Notifications;
-using Sledgemapper.Clients;
using System.Threading;
using System.Threading.Tasks;
using Sledgemapper.Api.Hubs;
+using Sledgemapper.Shared.Clients;
namespace Sledgemapper.Api.Handlers
{
@@ -16,7 +16,7 @@ namespace Sledgemapper.Api.Handlers
public async Task Handle(NewLineNotification notification, CancellationToken cancellationToken)
{
- await _hub.Clients.Groups(notification.Session.SessionName).NewLine(notification.Line);
+ await _hub.Clients.Groups(notification.Session.SessionId.ToString()).NewLine(notification.Line);
}
}
}
diff --git a/Sledgemapper.Api/Handlers/SendNewNoteMessage.cs b/Sledgemapper.Api/Handlers/SendNewNoteMessage.cs
index 37e9f5a..88eafe6 100644
--- a/Sledgemapper.Api/Handlers/SendNewNoteMessage.cs
+++ b/Sledgemapper.Api/Handlers/SendNewNoteMessage.cs
@@ -1,10 +1,10 @@
using MediatR;
using Microsoft.AspNetCore.SignalR;
using Sledgemapper.Api.Notifications;
-using Sledgemapper.Clients;
using System.Threading;
using System.Threading.Tasks;
using Sledgemapper.Api.Hubs;
+using Sledgemapper.Shared.Clients;
namespace Sledgemapper.Api.Handlers
{
@@ -16,7 +16,7 @@ namespace Sledgemapper.Api.Handlers
public async Task Handle(NewNoteNotification notification, CancellationToken cancellationToken)
{
- await _hub.Clients.Groups(notification.Session.SessionName).NewNote(notification.Note);
+ await _hub.Clients.Groups(notification.Session.SessionId.ToString()).NewNote(notification.Note);
}
}
}
diff --git a/Sledgemapper.Api/Handlers/SendNewOverlayMessage.cs b/Sledgemapper.Api/Handlers/SendNewOverlayMessage.cs
index 6cfe0ef..782742e 100644
--- a/Sledgemapper.Api/Handlers/SendNewOverlayMessage.cs
+++ b/Sledgemapper.Api/Handlers/SendNewOverlayMessage.cs
@@ -2,9 +2,9 @@ using MediatR;
using Microsoft.AspNetCore.SignalR;
using Sledgemapper.Api.Hubs;
using Sledgemapper.Api.Notifications;
-using Sledgemapper.Clients;
using System.Threading;
using System.Threading.Tasks;
+using Sledgemapper.Shared.Clients;
namespace Sledgemapper.Api.Handlers
{
@@ -16,7 +16,7 @@ namespace Sledgemapper.Api.Handlers
public async Task Handle(NewOverlayNotification notification, CancellationToken cancellationToken)
{
- await _hub.Clients.Groups(notification.Session.SessionName).NewOverlay(notification.Overlay);
+ await _hub.Clients.Groups(notification.Session.SessionId.ToString()).NewOverlay(notification.Overlay);
}
}
}
diff --git a/Sledgemapper.Api/Handlers/SendNewRoomMessage.cs b/Sledgemapper.Api/Handlers/SendNewRoomMessage.cs
index adbf4ec..e8dcd7e 100644
--- a/Sledgemapper.Api/Handlers/SendNewRoomMessage.cs
+++ b/Sledgemapper.Api/Handlers/SendNewRoomMessage.cs
@@ -1,10 +1,10 @@
using MediatR;
using Microsoft.AspNetCore.SignalR;
using Sledgemapper.Api.Notifications;
-using Sledgemapper.Clients;
using System.Threading;
using System.Threading.Tasks;
using Sledgemapper.Api.Hubs;
+using Sledgemapper.Shared.Clients;
namespace Sledgemapper.Api.Handlers
{
@@ -16,7 +16,7 @@ namespace Sledgemapper.Api.Handlers
public async Task Handle(NewRoomNotification notification, CancellationToken cancellationToken)
{
- await _hub.Clients.Groups(notification.Session.SessionName).NewRoom(notification.Room);
+ await _hub.Clients.Groups(notification.Session.SessionId.ToString()).NewRoom(notification.Room);
}
}
}
diff --git a/Sledgemapper.Api/Handlers/SendNewTileMessage.cs b/Sledgemapper.Api/Handlers/SendNewTileMessage.cs
index 7fa2541..268bc99 100644
--- a/Sledgemapper.Api/Handlers/SendNewTileMessage.cs
+++ b/Sledgemapper.Api/Handlers/SendNewTileMessage.cs
@@ -1,10 +1,10 @@
using MediatR;
using Microsoft.AspNetCore.SignalR;
using Sledgemapper.Api.Notifications;
-using Sledgemapper.Clients;
using System.Threading;
using System.Threading.Tasks;
using Sledgemapper.Api.Hubs;
+using Sledgemapper.Shared.Clients;
namespace Sledgemapper.Api.Handlers
{
@@ -17,7 +17,7 @@ namespace Sledgemapper.Api.Handlers
public async Task Handle(NewTileNotification notification, CancellationToken cancellationToken)
{
- await _hub.Clients.Groups(notification.Session.SessionName).NewTile(notification.Tile);
+ await _hub.Clients.Groups(notification.Session.SessionId.ToString()).NewTile(notification.Tile);
}
}
}
diff --git a/Sledgemapper.Api/Handlers/SendNewWallMessage.cs b/Sledgemapper.Api/Handlers/SendNewWallMessage.cs
index 34d5567..0ed117a 100644
--- a/Sledgemapper.Api/Handlers/SendNewWallMessage.cs
+++ b/Sledgemapper.Api/Handlers/SendNewWallMessage.cs
@@ -1,10 +1,10 @@
using MediatR;
using Microsoft.AspNetCore.SignalR;
using Sledgemapper.Api.Notifications;
-using Sledgemapper.Clients;
using System.Threading;
using System.Threading.Tasks;
using Sledgemapper.Api.Hubs;
+using Sledgemapper.Shared.Clients;
namespace Sledgemapper.Api.Handlers
{
@@ -16,7 +16,7 @@ namespace Sledgemapper.Api.Handlers
public async Task Handle(NewWallNotification notification, CancellationToken cancellationToken)
{
- await _hub.Clients.Groups(notification.Session.SessionName).NewWall(notification.Wall);
+ await _hub.Clients.Groups(notification.Session.SessionId.ToString()).NewWall(notification.Wall);
}
}
}
diff --git a/Sledgemapper.Api/Handlers/SendPingMessage.cs b/Sledgemapper.Api/Handlers/SendPingMessage.cs
deleted file mode 100644
index 9b7f0d9..0000000
--- a/Sledgemapper.Api/Handlers/SendPingMessage.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-// using MediatR;
-// using Microsoft.AspNetCore.SignalR;
-// using Sledgemapper.Api.Notifications;
-// using Sledgemapper.Clients;
-// using System.Threading;
-// using System.Threading.Tasks;
-// using Sledgemapper.Api.Hubs;
-
-// namespace Sledgemapper.Api.Handlers
-// {
-// public class SendPingMessage : INotificationHandler
-// {
-// private readonly IHubContext _hub;
-
-// public SendPingMessage(IHubContext hub) => _hub = hub;
-
-// public async Task Handle(PingNotification notification, CancellationToken cancellationToken)
-// {
-
-// await _hub.Clients.Groups(notification.Session.SessionName).Ping(notification.Location, notification.UserId);
-// }
-// }
-// }
diff --git a/Sledgemapper.Api/Handlers/StartNewSessionHandler.cs b/Sledgemapper.Api/Handlers/StartNewSessionHandler.cs
index 211b019..a9d687e 100644
--- a/Sledgemapper.Api/Handlers/StartNewSessionHandler.cs
+++ b/Sledgemapper.Api/Handlers/StartNewSessionHandler.cs
@@ -1,32 +1,37 @@
using MediatR;
using Sledgemapper.Api.Commands;
-using Sledgemapper.Api.Data;
+using Sledgemapper.Api.Infrastructure.Data;
using Sledgemapper.Api.Models;
+using System;
using System.Threading;
using System.Threading.Tasks;
+using Sledgemapper.Api.Core.Entities;
namespace Sledgemapper.Api.Handlers
{
- public class StartNewSessionHandler : IRequestHandler
+ public class StartNewSessionHandler : BaseCommandHandler
{
- private readonly IMediator _mediator;
- private readonly MyDbContext _dbcontext;
+
- public StartNewSessionHandler(IMediator mediator, MyDbContext dbcontext)
+ public StartNewSessionHandler(IMediator mediator, SledgemapperDbContext dbcontext):base(mediator, dbcontext)
{
- _mediator = mediator;
- _dbcontext = dbcontext;
+
}
- public async Task Handle(NewSessionCommand notification, CancellationToken cancellationToken)
+ public override async Task Handle(NewSessionCommand command, CancellationToken cancellationToken)
{
- _dbcontext.Sessions.Add(new Session
+ var campaign = await GetCampaignForUser(command);
+
+ var session = new Session
{
- SessionName = notification.SessionName,
- OwnerUserId = notification.UserId
- });
- await _dbcontext.SaveChangesAsync();
- return true;
+ SessionName = command.SessionName,
+ OwnerUserId = command.UserId,
+ CampaignId = campaign.CampaignId
+
+ };
+ DbContext.Sessions.Add(session);
+ await DbContext.SaveChangesAsync(cancellationToken);
+ return session.SessionId;
}
}
}
diff --git a/Sledgemapper.Api/Helpers/AppException.cs b/Sledgemapper.Api/Helpers/AppException.cs
index c9601e5..957826f 100644
--- a/Sledgemapper.Api/Helpers/AppException.cs
+++ b/Sledgemapper.Api/Helpers/AppException.cs
@@ -1,17 +1,17 @@
using System;
using System.Globalization;
-namespace Sledgemapper.Helpers
+namespace Sledgemapper.Api.Helpers
{
// Custom exception class for throwing application specific exceptions (e.g. for validation)
// that can be caught and handled within the application
public class AppException : Exception
{
- public AppException() : base() {}
+ public AppException() : base() { }
public AppException(string message) : base(message) { }
- public AppException(string message, params object[] args)
+ public AppException(string message, params object[] args)
: base(string.Format(CultureInfo.CurrentCulture, message, args))
{
}
diff --git a/Sledgemapper.Api/Helpers/AppSettings.cs b/Sledgemapper.Api/Helpers/AppSettings.cs
deleted file mode 100644
index bcf36f3..0000000
--- a/Sledgemapper.Api/Helpers/AppSettings.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-namespace Sledgemapper.Helpers
-{
- public class AppSettings
- {
- public string Secret { get; set; }
- }
-}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Helpers/AutoMapperProfile.cs b/Sledgemapper.Api/Helpers/AutoMapperProfile.cs
index fe86397..1fc8edb 100644
--- a/Sledgemapper.Api/Helpers/AutoMapperProfile.cs
+++ b/Sledgemapper.Api/Helpers/AutoMapperProfile.cs
@@ -1,16 +1,14 @@
using AutoMapper;
-using Sledgemapper.Entities;
-using Sledgemapper.Models.Users;
+using Sledgemapper.Api.Core.Entities;
+using Sledgemapper.Api.Models;
-namespace Sledgemapper.Helpers
+namespace Sledgemapper.Api.Helpers
{
public class AutoMapperProfile : Profile
{
public AutoMapperProfile()
{
- CreateMap();
CreateMap();
- CreateMap();
}
}
}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Helpers/DataContext.cs b/Sledgemapper.Api/Helpers/DataContext.cs
deleted file mode 100644
index 905b1b2..0000000
--- a/Sledgemapper.Api/Helpers/DataContext.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using Microsoft.EntityFrameworkCore;
-using Microsoft.Extensions.Configuration;
-using Sledgemapper.Entities;
-
-namespace Sledgemapper.Helpers
-{
- public class DataContext : DbContext
- {
- protected readonly IConfiguration Configuration;
-
- public DataContext(IConfiguration configuration)
- {
- Configuration = configuration;
- }
-
- protected override void OnConfiguring(DbContextOptionsBuilder options)
- {
- // connect to sql server database
- options.UseSqlServer(Configuration.GetConnectionString("WebApiDatabase"));
- }
-
- public DbSet Users { get; set; }
- }
-}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Helpers/SqliteDataContext.cs b/Sledgemapper.Api/Helpers/SqliteDataContext.cs
deleted file mode 100644
index 5b799b9..0000000
--- a/Sledgemapper.Api/Helpers/SqliteDataContext.cs
+++ /dev/null
@@ -1,16 +0,0 @@
-using Microsoft.EntityFrameworkCore;
-using Microsoft.Extensions.Configuration;
-
-namespace Sledgemapper.Helpers
-{
- public class SqliteDataContext : DataContext
- {
- public SqliteDataContext(IConfiguration configuration) : base(configuration) { }
-
- protected override void OnConfiguring(DbContextOptionsBuilder options)
- {
- // connect to sqlite database
- options.UseSqlite(Configuration.GetConnectionString("WebApiDatabase"));
- }
- }
-}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Hubs/SledgemapperHub.cs b/Sledgemapper.Api/Hubs/SledgemapperHub.cs
index 235af86..847e221 100644
--- a/Sledgemapper.Api/Hubs/SledgemapperHub.cs
+++ b/Sledgemapper.Api/Hubs/SledgemapperHub.cs
@@ -4,26 +4,24 @@ using System.Linq;
using System.Threading.Tasks;
using System.Collections.Concurrent;
using Sledgemapper.Shared.Entities;
-using Sledgemapper.Clients;
using System;
-using Sledgemapper.Api.Data;
+using Sledgemapper.Api.Infrastructure.Data;
using Microsoft.AspNetCore.Authorization;
+using Sledgemapper.Api.Core.Entities;
using Sledgemapper.Api.Models;
-using Sledgemapper.Helpers;
+using Sledgemapper.Shared.Clients;
namespace Sledgemapper.Api.Hubs
{
[Authorize]
public class SledgemapperHub : Hub
{
- private static readonly ConcurrentDictionary UserColors = new();
- private readonly MyDbContext _dbContext;
- private readonly DataContext _datacontext;
+ private static readonly ConcurrentDictionary UserColors = new();
+ private readonly SledgemapperDbContext _dbContext;
- public SledgemapperHub(MyDbContext dbContext, DataContext datacontext)
+ public SledgemapperHub(SledgemapperDbContext dbContext/*, DataContext datacontext*/)
{
_dbContext = dbContext;
- _datacontext = datacontext;
}
// other colors
@@ -61,9 +59,9 @@ namespace Sledgemapper.Api.Hubs
await Clients.Group(sessionName).NewWall(tile);
}
- public async Task NewOverlay(string sessionName, Overlay tile)
+ public async Task NewOverlay(Guid mapId, Overlay tile)
{
- await Clients.Group(sessionName).NewOverlay(tile);
+ await Clients.Group(mapId.ToString()).NewOverlay(tile);
}
public async Task NewNote(string sessionName, Note note)
@@ -88,61 +86,68 @@ namespace Sledgemapper.Api.Hubs
public async Task Ping(string sessionName, Tile location)
{
- var userId = int.Parse(Context.User.Identity.Name);
- var user = _datacontext.Users.First(u => u.Id == userId);
+ var userId = new Guid(Context.User.Claims.FirstOrDefault(m => m.Type == "Id").Value);
+
+ var user = _dbContext.Users.First(u => u.Id == userId.ToString());
var player = new Player { UserId = userId, Initials = user.Initials, Position = new Tile { X = 0, Y = 0 }, Color = UserColors[userId] };
- await Clients.Group(sessionName).Ping(new Ping{X=location.X, Y=location.Y, Player=player});
+ await Clients.Group(sessionName).Ping(new Ping { X = location.X, Y = location.Y, Player = player });
}
- public async Task JoinSession(string sessionName)
+ public async Task JoinSession(Guid mapId)
{
- var session = _dbContext.Sessions.FirstOrDefault(s => s.SessionName == sessionName);
- var userId = int.Parse(Context.User.Identity.Name);
+ var session = _dbContext.Sessions.FirstOrDefault(s => s.SessionId == mapId);
+
+ var userId = new Guid(Context.User.Claims.FirstOrDefault(m => m.Type == "Id").Value);
if (session != null)
{
var userSession = new SessionUser { SessionId = session.SessionId, UserId = userId };
_dbContext.SessionUsers.Add(userSession);
await _dbContext.SaveChangesAsync();
- await Groups.AddToGroupAsync(Context.ConnectionId, session.SessionName);
- var user = _datacontext.Users.First(u => u.Id == userId);
+ await Groups.AddToGroupAsync(Context.ConnectionId, session.SessionId.ToString());
+ var user = _dbContext.Users.First(u => u.Id == userId.ToString());
var player = new Player { UserId = userId, Initials = user.Initials, Position = new Tile { X = 0, Y = 0 }, Color = UserColors[userId] };
- await Clients.Group(session.SessionName).NewPlayer(player);
- await Clients.Group(session.SessionName).RefreshPlayers();
+ await Clients.Group(session.SessionId.ToString()).NewPlayer(player);
+ await Clients.Group(session.SessionId.ToString()).RefreshPlayers();
- var newSession = new Sledgemapper.Shared.Entities.Session
- {
- SessionName = session.SessionName,
- SessionId = session.SessionId
- };
- return newSession;
+
+ return true;
}
else
{
- return null;
+ return false;
}
}
- public async Task UpdatePosition(string sessionName, int sessionId, Tile tile)
+ //public async Task UpdatePosition(string sessionName, int sessionId, Tile tile)
+ //{
+ // //var userId = int.Parse(Context.User.Identity.Name);
+ // //var SessionUsers = _dbContext.SessionUsers.Where(m => m.SessionId == sessionId).OrderBy(m => m.UserId).ToList();
+ // //var user = _dbContext.Users.First(u => u.Id == Context.User.Identity.Name);
+ // //var player = new Player { UserId = userId, Initials = user.Initials, Position = tile, Color = UserColors[userId] };
+ // //await Clients.Group(sessionName).PlayerUpdate(player);
+ //}
+
+ public async Task UpdatePosition(string sessionName, Guid sessionId, Tile tile)
{
- var userId = int.Parse(Context.User.Identity.Name);
- var SessionUsers = _dbContext.SessionUsers.Where(m => m.SessionId == sessionId).OrderBy(m => m.UserId).ToList();
- var user = _datacontext.Users.First(u => u.Id == userId);
+ var userId = new Guid(Context.User.Claims.FirstOrDefault(m => m.Type == "Id").Value);
+ var sessionUsers = _dbContext.SessionUsers.Where(m => m.SessionId == sessionId).OrderBy(m => m.UserId).ToList();
+ var user = _dbContext.Users.First(u => u.Id == userId.ToString());
var player = new Player { UserId = userId, Initials = user.Initials, Position = tile, Color = UserColors[userId] };
- await Clients.Group(sessionName).PlayerUpdate(player);
+ await Clients.Group(sessionId.ToString()).PlayerUpdate(player);
}
public override async Task OnConnectedAsync()
{
- var userId = int.Parse(Context.User.Identity.Name);
+ var userId = new Guid(Context.User.Claims.FirstOrDefault(m => m.Type == "Id").Value);
var userConnection = new UserConnection { ConnectionId = Context.ConnectionId, UserId = userId };
_dbContext.UserConnections.Add(userConnection);
await _dbContext.SaveChangesAsync();
- var availableColor = Colors.Where(m => !UserColors.Values.Contains(m)).First();
+ var availableColor = Colors.First(m => !UserColors.Values.Contains(m));
UserColors.AddOrUpdate(userId, availableColor, (key, oldValue) => availableColor);
await base.OnConnectedAsync();
}
@@ -150,26 +155,26 @@ namespace Sledgemapper.Api.Hubs
public override async Task OnDisconnectedAsync(Exception exception)
{
var userConnection = _dbContext.UserConnections.FirstOrDefault(m => m.ConnectionId == Context.ConnectionId);
- var userId = userConnection.UserId;
if (userConnection != null)
{
+ var userId = userConnection.UserId;
+
_dbContext.UserConnections.Remove(userConnection);
- }
- var userSessions = _dbContext.SessionUsers.Where(m => m.UserId == userId).ToList();
- {
- foreach (var userSession in userSessions)
+ var userSessions = _dbContext.SessionUsers.Where(m => m.UserId == userId).ToList();
{
- var session = _dbContext.Sessions.FirstOrDefault(m => m.SessionId == userSession.SessionId);
+ foreach (var userSession in userSessions)
+ {
+ var session = _dbContext.Sessions.FirstOrDefault(m => m.SessionId == userSession.SessionId);
- await Clients.Group(session.SessionName).RemovePlayer(new Player { UserId = userId }); //send remove player
- _dbContext.SessionUsers.Remove(userSession);
+ await Clients.Group(session.SessionName).RemovePlayer(new Player { UserId = userId }); //send remove player
+ _dbContext.SessionUsers.Remove(userSession);
+ }
}
+ await _dbContext.SaveChangesAsync();
+
+ await base.OnDisconnectedAsync(exception);
}
- await _dbContext.SaveChangesAsync();
-
- await base.OnDisconnectedAsync(exception);
-
}
}
}
\ No newline at end of file
diff --git a/Sledgemapper.Api/Infrastructure/Data/SledgemapperDbContext.cs b/Sledgemapper.Api/Infrastructure/Data/SledgemapperDbContext.cs
new file mode 100644
index 0000000..265d446
--- /dev/null
+++ b/Sledgemapper.Api/Infrastructure/Data/SledgemapperDbContext.cs
@@ -0,0 +1,94 @@
+using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore;
+using Sledgemapper.Api.Core.Entities;
+
+namespace Sledgemapper.Api.Infrastructure.Data
+{
+ // public static class DbInitializer
+ // {
+ // public static void Initialize(SledgemapperDbContext context)
+ // {
+ // context.Database.EnsureCreated();
+ // }
+ // }
+
+ public class SledgemapperDbContext : IdentityDbContext
+ {
+ public DbSet Campaigns { get; set; }
+ public DbSet MapLogs { get; set; }
+ public DbSet