/**
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;
}
}
{
"compilationTarget": {
"HonestDave.sol": "HonestDave"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DECIMAL_AMOUNT","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NAME","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYMBOL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowances_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balances_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]