::;;;;;:lodddxxxxkkkkkkOkkkxxxxddooooldkxxxxxxx
:;;;;;;cloddddxxxxxxdollcccloddddooooodkxxxxxxx
::;;;;;cloddddo;,,'...'''',;;;cloooooookxxxxxxx
::;;;;;clodl'............',''''',:looooxxxxxxxx
::;;;;;lol,.....,............'....';codkxxxxxxx
::;;;;;ll....,coollc:;,,'',,'..'c;'.';dkxxxxxxx
::;;;;:c..';loodxkOOOOO0000Oxlcokkd:,.:xxxxxxxx
::;;;;:,'':lllooxkO000KKKKK00Okkkkkx,..dxxxxxxx
::;;;;:..'cccllodxO0000KKKK0OOkkkkkxl'.oxxxxxxx
:::;;;:'..;ccloodxO0KKKKKKKK0OOOkxxdc'.oxxxxxxx
:::;;;c,..,::ldxxxxkkO00OOkkkkkkkxxo;.'dxxxxxxx
:::;;;c:..'::c::;'.',ckOx:,...,;cdxo'.;xxxxxxxx
:::;;;cl...::;;,;,::;:k0Ol:l:locloxo':ckxxxxxxx
:::;;;cl,'.:lodooooddod0OkkkxxxkOOkdcdkkxxxxxxx
:::;;;llc:,;ldxOO00Odod00OOO0KKK0Oxlokkkxxxxxxx
:::;;:locc:,codkOkxdlldOOxoddxkOkkxdxkxkkxxxxxx
:::;;:looc:;;:llllol:'',',cdxdoododdoodkkxxxxxx
:::;;:lodddd,::llcc:::::cooolcoddodooodkkxxxxxx
:::;;:loddxx:;;cddc;:loodddlcdxxoolloodkkxxxxxx
:::;;:loddxxd,,;:oddlooooddxkOxocc:ooodkkxxxxxx
:::;;clodxxxkc'',;ldxddddxkOOxoc;;:coodkkkxxxxx
:::;;clodxd:.,''.',cdxkkkOkkdc,',:o.'cdkkkkxxxx
:::;;clodc.  xl,,''',;cllc:;,'',cxNd...;::cldxk
:::;;cll;  ,oOK0o;,,,''...''',;dXWW0 ..........
::,'...   c0O0XXXKd;,,,,''',;oKWWWN0...........
..        o00KXXNNNXkc,'',:dKWWWWWWK......  ...
          d0KXNNNNNXko:;:ckXWWWWWWWX.....  ....
          xXNXNNXOd'  .....,lOKXWMWN.......... 
          xXNNX0O0KOc. ...'XXNNXXXXK..   ....  
          kXNNNNNNNXKx. ..,WWWWWWWWX'.   ....  
          xKXNWWWWWWNX.....KNWNNNNNK'.. .'...  
          xNNWWWWWWWWk ....lNNWWWWWN,.. :kx:   
         .dNWWWWWWWWW; ....,WWWWWWWN,.. .',.   
         .lNWWWWWWWWN.......NWWWWWWN,..   ..