::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::=-::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::==+****++==-:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::::::-*+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::=====**====-:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::***+:=::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::===++*#***+==-::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::::::=##*-::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::=+##+:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::-=********=-::::.:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::+**########*=::::::.::.::::::::::::::::::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::.:::-*#########*-:::.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::::+########*::::::.::.:::::::::::::::::::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::::=**#####**-::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::=+***####*-+++*#==*+=====-=======-*#+=-::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::-=*#*##############%#%#%###%%###%##%####%%##**+***+++*=+**+-::::::::::::::::::
::::::::::::.::.:::++**##%##%%#####%%%%#**#%%%%%%%%%%%%%%%%%%%%%%%%%%############*-*=:::::::::::::::
::::::::::.::::::::::::--*##%#**#************#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%###+::::::::::::::::
::.::.:..::.:.......:..::.::=*#%####*****++*#%*%%%%%%%%%%%%%%%%%%%%%%%%%*:::::::::::::::::::::::::::
.::.........................::=**%%%*###***+=*+++%%%%%%%%%%%%%%%%%%%%#=:::::::::::::::::::::::::::::
..:.::.::..:.::..:.:..:..:....::-**#**++*+**++*==*%%%%%%%%#####%%%%##-::::::::::::::::::::::::::::::
::.::.::.:::.:::::::.:.::.:::.:.::::*+++*****+===*#%%%%%%#####**#*-::::::::::::::::::::::::-=:::::::
:::::::::::::+*+::::::::::::::::::::==****#****===*%%%%%%%%%%%%%#*----::-:-:-:---:-:-:-::::=*-::::::
++++**+++++++++*+**++**********##***#**####*******#%%%%%%%%%%%%%%%%#####*###********+++++++++++*+***
++++++++++++++++++++++++++**********+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*
++++++++++=++++++++++++++++++***++++++++=++==+++++++++++++=+++=+=++++++=++++++++++++++++++++++++++++
+++++++==+===++==++======++++++++++++=========================+==================+======+====++++==+