#  ## ##     # ## ##### ## ##### ##     #   #####  #####  ##### ### ###   
##  ## #  ##### #  ##### #  ##### #  ##  #  ##  ## ##  ## ##  ## ##  ##    
##  ## #  ##### #  ##### #  ##### #  ##  #  ##  ## ##     ##     ##  ##    
###### #    ### #  ##### #  ##### #  ##  #  ######  ####  ##     ##  ##    
##  ## #  ##### #  ##### #  ##### #  ##  #  ##  ##     ## ##     ##  ##    
##  ## #  ##### #  ##### #  ##### #  ##  #  ##  ##     ## ##     ##  ##    
##  ## #  ##### #  ##### #  ##### #  ##  #  ##  ## ##  ## ##  ## ##  ##    
##  #  #     ## #     ## #     ## #     ##  ##  #  #####  ##### ### ###