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