********+++++++++++;+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+?S%%%?%%%%%%SSS##SSS
********+++++++++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+*?****?*?????%%SS%%%
*******++++++++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++****************?*??
****+++++++++++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+%;;;;;;;;;;;;;;;;;;;;;;;;++++++++++*******???%%
******++++++++;;;;;;;;;;;;;;;;;;;;;;;;;;:;;;;;;;;;;+S@?;;;;;;;:;;;;;;;;;;;;;;+****++***?%%%??%%%%%%%
***+++++++++;;;;;;;;;;;;;;;;;;;;;;;;;;;;:;;;;;;;::;S###*::::::::::::::;;;;;;*?????????*?????????????
*****+++++++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;S##S%%*;;::::::::::;;;;;;;++++++++++++++++++******
*****++++++++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+S####SSS%+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+++++++*****
**+*+++++++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;*#@@@@###S*;;;;;;;;;;;;;;;;;;;;;;;;;;;;++++++++++***
+*++++++++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;?%?%S##@@@%*;:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+++++++**
*++++++++;+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+?*?*%###@S;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+++++++**
*++++++++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:;*???%SS?+:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+;+++++++**
++++++++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+??????;:::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++++++*
+++++++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+*+;;;;+*??%%%%%??*+;:::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+++++++
+++++++;;;;;;;;;;;;;;;;;;;++;;;;++*?%%SSSSSSSSSSS%SSS%%%%??*+;::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+++++++
++++++;;;;;;;;;;;;;;;;;;;;++++++?%**%S#S########S##SSSSSS%%%??*;;::;;;;;;;;;;;;;;;;;;;;;;;;;;;++++++
++++++;;;;;;;;;;;;;;;;;;;;;:;;;;;?S****+++;+%#########SSSSS%%%%?*+;:;;;;;;;;;;;;;;;;;;;;;;;;;;++++++
++++++;;;;;;;;;;;;;;;;;;;;;;:::;::;;:::::::::+%####S##SSSSSS%%%%??+::;;;;;;;;;;;;;;;;;;;;;;;;;;+++++
+++++;;;;;;;;;;;;;;;:;:::::::::;:::::;:::::::::%#####SSSSSSSS%%%%%+::;;;;;;;;;;;;;;;;;;;;;;;;;;+++++
+++++;;;;;;;;;;;;:;:;;:::::;;::;;::::::::::::::;%SS##SSSSSSSSS%%%%*::;;:;;;;;;;;;;;;;;;;;;;+++++++++
++++++;;;;;;;;;;;;:;;::::;;:::;;;:::::::::::::::;%SSSS#SSSSSSSSS%S?::;;;;;:::;;;;;;;;;;;;;+**+++++++
++++++;;;;;;;;;;;;;;;:;::;::::::::;::::::::::::::;%S%%SSSSSSSSSS%S?;:;;;;;:;;:::::;;;;;;;;+***++++++
++++++;;;;;;;;;;;;:;:::::::::;:::::::::::;::::::::+%%%%SSSSSSSSSSS?::;;;;::;:;;;::::;;;;;;;+*?%??*++
+++++;;;;;;;;;;;;;:::::::::;:;:::::::;;:;::::::::::*%%SSSSSS%%SSSS%+:::;;::::;;:::::;;;;;;;;;?%?***+
++++;;;;;;;;;;;;;::::::::::;;:::::::::::::::::::;::;%SSSSSSS%%%%SSS*:;:::;:::::::::::;;;;;;;;*??**+*
++++;;;;;;;;;;;;::;:::::::::;:::::;:::::::;::::::::;%SS%SSSSSSSSSSS?::::::::::::::::::;;;;;;;+???**+
+++++++;;;;;;;;;;;;;:::::::::::::::::::::::::::::::;SSSSSSSSSS####S?;::::::::::::::;;;;;;;;;;+*???**
++++++;;;;;;;;;;:;::::::::::::::::;::::::::::::::::?##SSSSSS####S#S%+:::::::::::::::::;;;;;;;+**????
++++;;;;;;;;:;;::;:::::::::;;::::::::;:::::::::::::;S#####S#######S?*;:::::::::::::::::;;;;;;;+**?%?
+++;;;;;;;;;:::::::::::::::::::::::::::::::::::::::+S############S%++*+::::::::::::::::;;;;;;;;***%%
++++;;;;;;;;;;::::::::::::::::::::::::::::::::::::::*############?;::;;::::::::::::::::;;;;;;;;*?+**
+++++;;;;;;;;;::::::::::::::::::::::::::::::::::::::*############%::::::::::::::::::::;;;;;;;;;+?*++
++++;;;;;;;;::::::::::::::::::::::::::::::::::::::::*######S####S?::::::::::::::::::::;:;;;;;;;+?*++
+++;;;;;;;;;;:::::::::::::::::::::::::::::::::::::::?#####SS#####*:::::::::::::::::::::;;;;;;;;+??*+
+++;;;;;;;;;;;::::::::::::::::::::::::::::::::::::::%#S###SS####?::::::::::::::::::::::;;;;;;;++???*
++++;;;;;;;;;::::::::::::::::::::::::::::::::::::::;%SSSSSS####?:::::::::::::::::::::;;;;;;;;;++??%?
++++;+;;;;;;;;;:::::::::::::::::::::::::::::::::::::;S########S;::::::::::::::::::::;;;;;;;;;;+++*?*
+++;;;;;;;;;;::::::::::::::::::::::::::::::::::::::::?#SSSSS#SS?;:::::::::::::::::::::;;;;;;;;+;;+*+
++++;;;;;;;;;;:::::::::::::::::::::::::::::::::::::::;SSS%%S##SS+:::::::::::::::::::::;;;;;;;;+;++++
+++++++;;;;;;;::::::::::::::::::::::::::::::::::::::::?#S%?**###*:::::::::::::::::::::;;;;;;;;++++++
+++++;;;;;;;;;;;;:::::::::::::::::::::::::::::::::::::;*?*;;;?%*;:::::::::::::::::::::;;;;;;;;;;++++
++++++++;;;;;;;;::::::::::::::::::::::::::::::::::::::::;*+;;;*;;:::::::::::::::::::;;;;;;;;;;;+++++
+++++++;;;;;;;;;:::::::::::::::::::::::::::::::::::::::::;++;;++;;:::::::::::::::::::;;:;;;;;;;+++++
++++++;;;;;;;;;;:;::::::::::::::::::::::::::::::::::::::::*+;;++;;::::::::::::::::::::;;;;;;;;;;+*%S
+++++++;;;;;;;;;;:::::::::::::;;;;;;;;;;::::::::::::::::::+++;+*+;::::::::::::::::::;;;;;;;;;;+?S#@@
+++++++++;;;;;;;;;;:::::::::::;+***++++++++++++;;;;;;;;;;;;;;;+?*+;:::::::::::::::;:;;;;;;;;+?S@@#@@
+++++++;;;;;;;;;;;;:::::::::::::;+**????**??*******+++++*++++++***++;;;;::::::::;;;;;;;;;;;*S#@##@@@
+++++++;;;;;;;;;;;;::::::::::::::::+%%?%*?%%?*%%*?%%?*?%???**+***+**+++;;;;;::::;++++;;;;+%#@@@@@@#S
*+++++++++;;;;;;;;;:;;::::::::::::::;?%???????????%%??%%?*%%?*%%?*%?*??????*****++++++++%#@@@@@@#%?*
*++++++++;;;;;;;;;;;;;;::::::::::::::;*?????????????%%?%%?%%%%?%%%%??S%%%%%%%%%%%%*+***?S@@@@#S%S%%%
**++++++++;;;;;;;;;;;;;:::::::::::::::::;;;++****???????????????%%%%%%SS%S%SS%%%%%?+*?%%%S#SSS%S%SSS
**+++++++++;;;;;;;;;;;::::::::::::::::::::::::::::::;;;;++***????%%%%%%%%%%%SSS%%%%?*?%%SSSSS%SSS%S#
****++++++++;;;;;;;;;;;;;::::::::::::::::::::::::::::::::::::::;;;;;++***??%%%%%SSSS%%S%%SSSSSSSS###
****+++++++++;;;;;;;;;;;;;;;;;;::::::;::::::;:;:::;;:;;::;::;;::::::::::;;;;++++**???%%%%%????%%%%%%
*****++++++++;;;;;;;;;;;;;;;:;;;;;;:;;;;;;;;;:;;:;:;:;;:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;++*********????