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