/**
dddddddddddddddddddddddddddddddddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxkkkOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOkkkkkkkkkkkkkkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
ddddddddddddddddddddddddddddddddddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxkkkkkOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOkkkkkkkkkkkkkkkkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxkkkkkkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOOOOOOOkkkkkkkkkkkkkkkkkkkkkkkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxkkkkkkkkkkkkkkkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxddddddddddddddddddddddddddd
ddddddddddddddddxxxxxxxxxxxxxxxxxxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxddddddddddddddddddd
dddddxxxxxxxxxxxxxxxxxxxxxxxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOkOOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
dddxxxxxxxxxxxxxxxxxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxkkkkkkkkkkkkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOkkkxxxxxxxxkkkOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxxx
xxxxxxxxxxkkkkkkkkkkkkkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOkoccccc:::::::::::::cclodxkOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
xxxxxxxkkkkkkkkkkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOkxlcccloddddddddddddddoollllclllodxOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOkkkkkkkkkkkkkkkkkk
kkkkkkkkkkkkkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOxl:;:lddddddddddddddddddddddddddddoloxkkOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
kkkkkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOxo:;:lxkkxddddddddddddddddddddddddddddolollxOOO0OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOxl::ldkkxxxddxxxxxxxxxxxkkkxxxddddddddddocldccokOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOkocccloddodddddddddxdddddxxxxxxxddddddddddc:lddo:lkOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOxl;,..  ....,:clccccccccccllllooddddddddddoc:lodddc:dOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOko,.            ..,:lollcc:::,'',;;:codddddddlcloddddl;lk0OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOkc.                  .,codddddolccc:;,,;coddddoooooddddl;:xOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO0Okl'                       .':lddddddddoolccloddoloooddddddo:;lkOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo'                 ......     ..,:looooodddddddoooloodddxddxdl:cokO0OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOk:.               .,cloooolc;..     ..;:cllllooddddol:codddddddddc;oOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOd'                'codoooooooool:,.     ..,;ccc::;,'....;cooddddxo'.dOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOl.               .:odoodoooooooooodol:,.     ........'',;,.';loodxo..d0OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOc.               'coooooddddddddxxxkkkkOkoc,.....':clolcclc;'..;lodl..x0OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOc.              .:looooddxxxxxxxkkkkkkkkkkkOkxxxddxkkkkkdoxxdl:'.'cdl',d0OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOk;              .cdoodxxkkkkkkkxxxxkkkkkxxxkkkkkkkkOOkxkOkdddxxdo:'.:c,ckOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO0OOOd;.        .',':dddxxkkkkkkxxxxxxxxxxxxxxxxkkkkkkkOOkddxkOkxodxxxoc:;,cooxOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO0kdc;''',:ldkx:lkkkkkkkkkkxxxxxddxxxxxxxxddooooddxkOOdldkOOOkolxkkxc,,cl;,cxOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOkkkOO0OOx;lkkkkkkkkkkkxdxdlldoccc:,,;::cllolclxOdokOOOOOo:dkxl:;,,;;,':xOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOd;lOkkxolc::::coxxlll:'',;coxkOOkOOOkkxxxkOOOOOOd:co::c'.'..::,lOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
OOOkkkxxxxxxxxkkkOOOOOOOOOOOOOOOOOOOOOOOOOOOkkkkkkkOOOOOOOOkkkOOOd;lkl,..'',;:,,:coodxdooxdool;,,,,:lolcdkOkkOOOOkl:::c;..;,,c:;oOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
xddoollcccccllooddxxkkkkkkkkkkkkkkxxxxxxddddoooooooodddxxxkkkkkkkdcdo''cdxdoooddo;:xkkdloo;.:c,;:::cloodkkkkkkkkkkdoool:,',:cl;:xOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
c::::;;;;;;;;;:::cclllloooooolllllllccccc::::::::::::ccclloodddxxocclcll;'..'';od;:xkko:coolcllloolcoxxxkkkkkkkOkxdoolllc,';cc,:xOOOOkOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
;;,;;,,,,,,,,;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;,,,;;;;;;;:::cccll:,cxl'':cldocl:,lxxxolldkkxxxxdxxdxxxxxxxxkkkkkxdoooll:'':oc':xkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
,,,,,,,,,,,,,,;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;;;;;;;.,dxdolcloooo;;oddxdddxxdolodxxxdddddxxxxxxkkkxdooollc::cl;':oddddddddddxxxxxxxxxxxxxxxxxxxxxxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;;;;,,,,,,,,,,,,,,;;;;;,;,,,,,,;;;,,,.'okxdddxxxkl;cdddddooxxdc,,:cooodddddxxxxxxkkxdooolllc:;,'';::::cccccccccccccclllllllllllllllloooooooooooooooooooddddddddddddddddddddddddxxxxxxxxxxxxxxxxxxxkkkkkkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
,,,,,,,,,,,,,,,,,,,,,,,,'''',,;::;;,,,,,,,,,,,,,;:::;,,,,,,,,,,;,,'.:xxxxxxxxxdc;loddooooollc,,;:;;:cloddxxxxxkkkxdooool;..''',,;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::;;;;:::::::::::::::::::::::cccccccccccccccccccccccccccllllllloooooodddddxxxxxxkkkkkOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOkkkkkk
,,,,,,,,,,''''''''''''''''..',;::;,''''''''''''',;:;,,'',,'''',,,,..lxddxxddxxo:;::::::c:'...';ldoc:;:loxxxxxkkkkkxdoool:..,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,'''''''''''''''''''''''',,,,,,,,,,,,,,,,,,,,,,,,,,,;;;;;;;;;;;;;:::::ccccccllllooddxxkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOOOOOkkkkxdoollll
''''''''''''''''''''''....''''',''''''''.......''','''',,,,''''''..;ddddddxdxdc,....',,;'...,cdxkkkkolloxxkkkkkkkkxdooool,..''''''''''''''''''''''''''''''''''''''''''''.........................'''''''''''''''''''''''''''''''''''''''',,,,,,,,,,,,;;;;;::clloooddddddxxxxxxxxxxxxxxxxkkxxxddooollc:;;,,,,
'''''''''''''''''''''''''''''''''''''''''''''''.''''.''',,'''..''..cddddddxdl:;cll:;,,;::cc::;,',;:lodlcdkkkkkkkkkxddddddc..'..........'''''...''''..................................................'''''''...........................''''''''''''''''''''',,,;;;;;::::::::::::::::::cccccc::;;;;,,,'''''''
''''''''''''',''''''''''''''''''''''''''''''''''.''..'''''''......,oxxxxddo:;:cldxxkxxxdlc:;:l;';lodxkdldkOOOOOkxxdddddddo'..'.............'''''''''''''''''''......'''''''''''''''''''''''''''''''''''',,,,''''''''''''''''''''',,''''''''''''''''''''''''''''''''''''''''''''''''''',,,,,'''''''''''''''''
'''''''''',,;;,,'''''''''''''''''''''''''''''''''''''''''''''''''',lkxxxxxdl::cc:;,,cdxdooc;;lodxdxkOOkooxkOOOkxdddddddddd:.',,,,,,''',,,,,,,,,,,,,,,,;;;;;;;;;;,,,,;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::;;::::::::::::::::::::::;;:::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;,,,;;;,,,,,,,,,,,,'''',,,,'''''''''''''''''''
,,,,,,,,,,,;::;,,,,,,,,,,,,,;;;;;;;;;;;;::::::::::;;;;;;;;;;;;;;:;';okkxkkkkdooc::,,;loolc;:oxdooxkOkOOxdxkOOkxddddddddoodl'.,:ccc:::::::::cccccccccccccccccccccccclllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllccccccccccccccccccccccccccccccccccccc::::::;;;;;::;;,,,'''''''',,,,,,,
cc:::::::::cccc:::::::::ccccccccccccclllllllllllllllllllllcccccccl:,;oxkkkkkOkkodOOkkxddooloooloxkOkkOOkkkkOkxdooddooooooo:''.':llllllllllllooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooolllllllllllllllllccc:::::::::::::::cccc
lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllcccccc;':oxkOOOOOOkkOOOkkkxdooodxkkkkkkOkxxkOOkxddoooooooodo;.,;,..:ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooollooooodoodddddddddd
llllllllllllllllllllllllllllllllllllllllllllllllllllcccccccccccc::::''coxkOOOOOOOOkOkkkkkkkxxkkkkkkkkl:lxkkxdddooooooodo:.';;cc.'cllooloooooooooooddddddddddddddddddddddddddddddddddddddddddddddddooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooddddddddddddddddxxxxxxxxxxxxxxxx
llccccccccccccccccccccccccccccc::::::::::::::::::::::::::::;;;;;;;;;,.':oodxOOOkxxkkkkkxkkxxxxxxkkkxl,,coxdoooooolooodo:.'::loc.'::;:clooooooodddddddddddddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxddddddddddddddddddddddooooooooooooooooooooooooooooooodddddddddddddddddddddddddddddddddxxxxxxxxxxxxxxxxxxxxxxxxxxx
::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;,,,,,,,,,,,,'''''''''..;clloxkOxoldxxxkkxxxxxdddol:'';codoooooooooooc'.,cllo:.';::::,,;;clooccodxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxddddddddddddddddddddddddddddddddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
,,,,,,,,,,,,,,,,,,,,,,,''''',,,'''''',,'''''''''''''''''''''''''''''''...;cllloxkkdloooodoolc:;,''''';coddooooollool,.',clll,.';,;:cc;;;,''''::::clodxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
,,,,,,,,,,,,,,,,'',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;;;;;;;,''''...,cllllodkkdoc:;,'....',;cllodddddoooolll;..;lc:cc'.,::loo:,',;:;'':llllc::cllldxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
:::::::::::::::::::::::::::ccccccccccccccccccccllllllllllllllllc:;;;,;:....,cllllllooooollccclloodxxxxdddoooolcc;...;::cc:'.,,;cllc;;:;,'.;clcllllll:,'';clodkOOOkkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdddddddddddddddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
oooooooooooooooooooooooooddddddddddddddddddddddddddddddddddddddoccclc:'.'::,':lllllllloooooodddxxxxxddoooolc:,'...,cllc:'.';:lxxo;,,,;,'':llllllllc,......';:coxkOOOOOkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxddddddddddddddddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ddddddddddddddxddddddddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdol;;clllc,..cdoc;,;clllllllllooooddddddooollc;'.....,:cllc:'.,:cdkkdc:::,..;cllllllloc,','..':ll:,';cldxOOkxdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdddddddddddddddddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdoc:;,,:llc;,..,ldlc;;cc:cclllllllllloooooollc:,'''''',:cllc:;'';cokOxl::c:,.,cllllllll:,.';:cccclodo:,;;;;:ldxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxddddddddddddddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoc:;;:;';cllc,..,coooo:;collllc:;;;;::cc::cc:;;;;;;,'',:llll:;',;:lxkkd::cc:'.,cllllllcc;....':lodxkkxc,;:::;:lloodddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdxxdlc;;;:lc,,:lc:;...;ldolc:;ldddoolc::;,',;::;::::c::;,,;:cool:;,,;;;:oddc;:::;..,cllllllc:,...',,;:::ldkOdcc:;::oxxdc:clodxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoc;;lolcdd:.;clc:,..';loc:c;,cddxxdoooddoollllllllc:;'';cccllc;'',;;:ldoc;,,;;,..,cllllllc:'..'',;::::cdxdoldkxl::oxxdc::::coxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxo:::cloxxxc.'cllc:,..,;:;',:;,cddxkkxxxddddddddool:;,;;codlll;'';;,;cllc;,,;::;..:lllllllc:'..'',;:::cldkOxc:ldxkdloxxo:::::;;ldxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ddddddddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxo::cc:ldxxd;.:lol:;'.''..  .';,:odxkOOkkkxdddol:;;;;;:lodol:,.';:::ldkxl:;;;;,,..:lccccllc;...',;::::codkOko;;ccooooxxxoc:::::;,cdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
dddddddddddddddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxo;;:cclxkxl;';looc;'.... .....',,cdxkkkOOOkkdc;,,,;:cllllc:,..,:::coxxoc:::c:'':;:lolllloo;..'',;:c::coxkOOx:;::ccllldxxdl::::c:,';oxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdxd:;:cclxkx:';clllol;.....',,,'...';ldxkkkOOko,''....;:::::;'.,::::coxdc::::::;.'lllllccccc,..;ccll:::coxOOOkc;::::::ldxddxoc::::::,';oxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxddddxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdc;:cclxkxl,.:lllcc:,...,,,,,,,'...,:dxxOOkkc.... .....,,,'.':::::lddl::::::::;..:ooodddo:,..,;cdkOxoccoxOOko;;::::::lkOkdccc:::::::;,:oxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxddoodxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxl;;:clxkxoc,..;cccc;...';;;,,,,;;..';ldxkkkc...''''''. ....;::::coxoc:::::::::'.,clloollc,...,,,:ldkkxxxxdol;;::::::cokOxoc:::::::::c;,:dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdoooddxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxo;:ddlodxdc;'.':llc:'..',;::;,,:::'..':dxxxc..''''''','...',;:::cdxoc:::::::::'.'clllllc:;...,,;:::;:cdkOOdlc:;;::::codkkdc:::::c::::::;,:dxxxxxxxxxxxxxxxxxxxxxxxxxxxxdddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdooodxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxddxxxxxxxddxxxxxxxxxxxxxxxxxd:':odxxxdl;'..;cll:,..':ldxdo:;:;'''...cdxc..''''''',,,,,,,,,;;codl::::::::::,..:cllllll:'..',,;::::codoooodkkxl:;::ldxxdl::::::::::::::,';odxxxxxxxxxxxxxxxxxxxxxxxxdddddddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxddooodxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxddddddxxxxxxxddddxxxxxxxxxxxxxxdc,;:cldxxdc;'.':llc:'...,:loddddl:;;;'..,ol'.''''''',;;::;;::cccllcccllcc:::;;..;lllllll:,...',;::::cxOOxc;:loxOOko::lddoc:::::::::::cclooc,:dxxxxxxxxxxxxxddddxxxxxxddddddddddddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdooooddxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxddddddxxxxxddddddxxxxxxxxxxxxxo,,:coxxdc:::'.;clc:,...',,;::ldo:;;:cc;.,l;.''''''',:::::c:cccloolloollolllc:'.'::cllllc;...',;:c::lxOOxl:::;;:lxOOxocloc,,;;:cccclooollllc;.;oxxxxxxxxxxxddddddddddxxddddddddddddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxddolloddxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxddddddxxxxxddodddxxxxxxxxxxxxd:';ccoxxoc:;'.,cccc;'...',;::okkd:,;,,,,,,:;,''''',,;;;;;;;;;:oxxoccccccccccc;..:lclllll:'..',,;:::lxOOxl:::::::::ldxddoo:,,;;:llllcc::::::::'.,oxxdxxdxxxxdddddddddddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdddddxxddollodddxxxxxxxxxddddxxxxx
xxxxxxxxxxxddddddxxxxddoooddxxxxxxxxxxxxl,,ccldxdo:;,..;llc:;,..',,::cxOd:;c::;;,,'...'''',,;;,;,,;;;:lkxoc::c::::::c:'.,cllllllc;..';:::::lkOkdlc:::::::::::codooc,,;:::::::::::::::::,.,ldxxxxxxxxxdddddddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdddoddddddollodddxxxxxxxxdddoddddxx
xxxxxxxxxxxddddddxxxxddoooddddddxxxxxxxo;':ccodddc;;'..clc:;,'..',;:cdkxc::cc:ccc:,'.'''',,,;;;;;;::;cxkdcc::::::::::;..::clllll:'..;loxdloxkxocc:::::::::cloolcllc:;;;;;;::::::::::::::,',lxxdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdddddddddxxxxxxxxxxxddoooodddoolloddxxxxxxxxddooloodddx
xxdddddddxxddddddxxxdddooooodddddxxxxxdc,;:coxddl:;,..'clc:,,'..',;:okkl:cccc::c;,,''',,,,,;;;;;:::;:dkxlc:::::::::::,.,cllllllc;...',:ldxOkdlcc::::::::ccloxxdlcc;,;,,;:::::c::c::::::;;,.,ldxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdddddddddooodddddddddxxxdddddollodddoolloddxxxxxxxxddolllodddx
xddoooodddddddddddxddddooolooooddddxdxo;':ccdkdlc;,,..,ccc::;'.',;:cdxo:::::::::,',',,,,,,,,,,;:::;;lxxlc::::::::::::'.:cllllllc,..',,,:oddddxdlc:::::::coodkxdol;'',,;:::::::::;;;;:ccllll::oxxdxxxxxxxxxxxxxxxxxxxxdddooddxxxxxxxxxxxxxxxxxxdolloodddooooooooodddddddddddolloddddoloooddxxxxxxxddollloddxx
ddollllodddddoooddddoc;::llc:cloodddddc';ccodo:,,;,,..;cc:;,...:llloddlodoooooc;;:;:c:cccccllooooollodooddo:;;coollc;''cccllllc,...,,;lxkdlclxkkxolc;;;:lodkko:;,'''''''',;;;,;:clodkOOkoc::;:oxdxxxxxdddddxxxxxxxxddoolllodddxxxxxxxxxxxdoloddolclodddoooooollloodoooooddoollll:::clllooddxxxxxdddollloddxx
llc::::clllolllllooo,.;,..''..:llllool;,::cdc.,;..,,'';c:;..,;..''.,occooodddoc:cllllllccllllloollcloolclc'.;'.coodoc,;ccclllc..:..':lxkdolc:cldkkl''...cdkOo..:. ...  ,:..;cldkkkkdoll,.;,.':;lxxxxxddddodddxxxddddoolccllooddddxxxxxxxo;''.cdllclloooolloolllloooollllooollo:.';.'cccclodddxxxdddollloddxx
:::;;;;;::cccccccccc..xd. 'x: ':::ccc,..'':xc.;:......'',;..ld. ;x,.:c:c:;,,,'..,;,,',;:;,;:c:;,;;:dxl;';;.,Oc ...,;,,;clllllc.;O; .;looc;,,;:;;:l,.dc..;xOkl.'l. .dc  :x,'ddlc::c:::::..dd..,',ldxdoc:::lodlclc:::lolcc;,,;:cooolc::clo,.ol.'llc:;;:cl:;;:lc;;;cl:;,,;clc;;;;'.lk'.;,,,:looddddddollllodddd
::;;,,,;;::::ccc::::..xo..oOd,.'::;,.';:::,,'.',. ',';::,...::.'dOo'.':c,.';';:;'',::,...,'.,'.;'..,,;::,. ,ko,::;..;c:;;;;;:,.;Ol,::,'...;..,..;..lOxc;.:kxc..;..cOx;.,c..,;:::,.'::::..dx;;::'.;:',:::;','.;;,:::'';,.';::;'','';::;,..ckx:..:;..;....;,...';..',::;,''.';,;:'lk'..';..;lllooooolccclloooo
::;;,,,,;;;::ccc::::.'xo..oOd,.';:'.:xo;;okc..ox..o0d:;okc  .. 'dOo'..,;..oOd::dkdc:lkc.'kl.'.,kl .cxl;:xo.;Okl;:xd'.::::;;,;'.;Okl;cxo. :O,.'.cO,.lOxc;.;dd, ;O;.lOx;... .lxc;cxl.':::..d0o::ok; .cxl;:dd, 'kOl::dx, .cxl;:dd' 'xo::ox;.ckk:..,,.'xl. ;OO, .od.'dd:;cdo. c0koc,lk,.lx:.':ccclollc::::cccccc
;:;;,,,,,,;;::ccc:::..xo. ;k: ';::'.',...;kd..od..ok,...dd..,'. ck, ..',..ok'  ;Oc. .dx.'kl...,kl ;O:....:.,kl...;O:.,lc;;:;::.;O:.,.,kc :k,.'.ck, 'kc..:xdl, :k; 'kc .;:..dx:'.''.':cc..xx.'.'xl.;O:....ox''ko...,kc :Ol'..;ko.;ko;'.,. .xo..;;,..cx'.okkl.;k;.ox'...;kc :O:...cOdxd..;::::ccllc:;;;:::::::
::;;,,,,,,,,;:::::cc..xo. ;k:.,:::,.,llllokd..ox..ox..'.od.'lo;.:k,.......od.  ;k:  .od.'xl...,kc ck,.'.   ,Oc ..;O: 'olclc:c:.;k;.:'.xo.:O,.'.ck, 'kc .:oll;.;O; ,kc '::'..codxd:.'ldd,.xo.'..xo.cO,.;'.cO;'xl...'kc.lOdcclloc..,ldddo, .do..;;;,.'xl:x:lx;od..xo..;.'xo.:k,.'.c0ddx,.,::::ccll::;;;::::::;
::;;;,,,,,,,,;;;::cc''xo. ;k: ':c:.'kd'. 'xd..ox..ox....dx..::' ck,.,:;;..ox.  ;k:  .dd.'xo.  ;Oc ;kc.. 'l,,Oc ..;O: .,',;,,;,.;O:...;kc :O;...ok, 'kc..'',;' :k; ,kc .:;..:' ..lO;.coc..do....xo.;Oc....dx''kl...'kc :O:   .:,.':. .,xx..xo..;;,;..ckko.'xkk; .ox'...;kc.ck,...ck,.ok;.,:::cccc::;;;;::::;;
::;;;;,,,,,,,,,;;::c''ko. 'xx;.'cc'.oxc:coOx'.ox..ox....od..,,'.;kd,.':;..ox...;O:...ox..lkl:cdOl .cxl:cdo.,kc.,.;k: .:l..;;,. ;Oxl:lxl. 'dxc:lkk, .dxl:..',. :O; .xx:..;..lxl;:dd..,;:..do....xo..cxo:cdd, 'xl...'kl .cxo::dx, ,xdc;lxc..okc..,;;,.'xO: .l0o...'odc:lxl. cO,.'.ck' .lk:.';;::cc::;;;;;;;;;;
:::;;;;;,,,,,,,,;;::'.,'...';;.'clc'',;:,'',..''...'.,,.''.'ccc,.,:,.,cc,.',.'..;..'.',..',::;,,'...';:;,...,..,..,.  :d'.lc:;..,',:;'.',..,:;,,,...';:;..','..,.  .;;..;:;,,;:;,.';:;;'.'. ...'.  .';::,....,'....,....';:;,.....;::;'....;:..,;;;'.',....;..,,..';:;'....,..,.',....,'..;;;::::;;;;;;;;;;;
::::;;;;;;;,,,,;;;;;;;,,,;,''',:llll;'......','''..';cc,.':lllllc:;;:llllc::clc:::clc::clc:;;::::cccc;;;:cc:;::cc:;:'.,;.,llclc'.....',,,,'.',:c:::;.....'',''.........;lool;,',;:;,'......',;;,..',,,'',,;;,''''''',;:;,'''',;;;,'..',;;;,''',;;;;;;,,,;,''',;;;;,'.',;;;,,,;;;,',,,,,,,;;;;::::;;;;;;;;;;;
::::::::::;;;;;;;;;;;;;;;;;;;::clllc:;:c:;,''''''';ccl:',:llllllllllccccllllllllllllllllllllllllllllllllllllllllllllc;'',;clllc:,'....'''',;:llcc:cc;,'','''''',,'...,;colc::::;,'....',;:cclloo:..,;;;;;;;;;,,''',,;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;,,,,,,;;;;;;,,;;;;;;;;;;;,,,;;;;;;;;;;;;;;;;;;;;;;;
:::::::::::::::;;;;;;;:::;;;:::ccllc;;clllcc:::;',cllc,';cllllllllc:cllllllllccccccccccllllllllllllllllllllllllllllllllll::clllcc:'....'';:clc:;;:ccc:;;,''','',,'...'',,;::;,'..',;::clooodxxxkkc..;;;;;;;;;,,''',,;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;,,,,,,;;;;;;,,,;;;;;;;;;;,,;;;;;;;;;;;;;;;;;;;;;;;;
cccc:::::::::::::::::::::::::::::cc:;;cllllllll:,:llc;',cllllllc:;;;:clcccccccccccc:::;;,,:cc::;;;:clllllllllllllllllllllc::cllllc;'...',:cc:;,,',;:cccc:,'''''''''.....',;,,,;clllloodxxxkkkOkkOx;.';;;;;;;;,,,'',,,;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;,,,,,,;;;;;,,,;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
lcccc::::::::::::::::::::::::::::::;;:lllllllll:;::::,,:lllllllc;',:c:::;;;;;;;::::;;;,,..,,''',,,',:lllllllllllllllllllllc::lllll:,...',;,'''','',,:cccc:,'','''''.....'',;cloooodxxkkOOOOOkkkkkOo'.,;;;;;;;;,,,',,,;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;,,,,,,,;;;;;,,;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;

contract HonestDave
{

    uint256 public totalSupply_;
    mapping(address => uint256) public balances_;
    mapping(address => mapping(address => uint256)) public allowances_;


    string public NAME = "It aint much but its honest work";
    string public SYMBOL = "DAVE";
    uint8 public DECIMAL_AMOUNT = 18;

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);

    constructor() {
        _mint(msg.sender, 69_000_000_000 ether);
    }


    function name() public view virtual returns (string memory)
    {
        return NAME;
    }

    function symbol() public view virtual returns (string memory)
    {
        return SYMBOL;
    }

    function decimals() public view virtual returns (uint8)
    {
        return DECIMAL_AMOUNT;
    }

    function totalSupply() public view virtual returns (uint256)
    {
        return totalSupply_;
    }

    function balanceOf(
        address account
    ) public view virtual returns (uint256)
    {
        return balances_[account];
    }


    function transfer(
        address to,
        uint256 amount
    ) public virtual returns (bool)
    {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    function allowance(
        address owner,
        address spender
    ) public view virtual returns (uint256)
    {
        return allowances_[owner][spender];
    }

    function approve(
        address spender,
        uint256 amount
    ) public virtual returns (bool)
    {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    function increaseAllowance(
        address spender,
        uint256 addedValue
    ) public virtual returns (bool)
    {
        address owner = _msgSender();
        _approve(owner, spender, allowances_[owner][spender] + addedValue);
        return true;
    }

    function decreaseAllowance(
        address spender,
        uint256 subtractedValue
    ) public virtual returns (bool)
    {
        address owner = _msgSender();
        uint256 currentAllowance = allowances_[owner][spender];
        require(currentAllowance >= subtractedValue, "Decreased allowance below zero.");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }


    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual
    {
        require(from != address(0), "Transfer from the zero address.");
        require(to != address(0), "Transfer to the zero address.");

        uint256 fromBalance = balances_[from];
        require(fromBalance >= amount, "Transfer amount exceeds balance.");
        unchecked {
            balances_[from] = fromBalance - amount;
        }
        balances_[to] += amount;

        emit Transfer(from, to, amount);
    }

    function _mint(
        address account,
        uint256 amount
    ) internal virtual
    {
        require(account != address(0), "Mint to the zero address.");

        totalSupply_ += amount;
        balances_[account] += amount;
        emit Transfer(address(0), account, amount);
    }

    function _burn(
        address account,
        uint256 amount
    ) internal virtual
    {
        require(account != address(0), "Burn from the zero address.");

        uint256 accountBalance = balances_[account];
        require(accountBalance >= amount, "Burn amount exceeds balance.");
        unchecked {
            balances_[account] = accountBalance - amount;
        }
        totalSupply_ -= amount;

        emit Transfer(account, address(0), amount);
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual
    {
        require(owner != address(0), "Approve from the zero address.");
        require(spender != address(0), "Approve to the zero address.");

        allowances_[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual
    {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "Insufficient allowance.");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }


    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}