/**
*/

/*
The most whimsically mischievous player in the crypto universe. In a world where finance often wears a serious face, GRINCH Token brings a splash of fun, humor, and a hint of naughtiness to the blockchain landscape.


dxxxxxxxxxxddddxxddodxdddxxdddxddddxdxxdddddddxxdxxxkkkkxdxxdxxxxxkxkkxxdxxxxxxxxxxxdoc::::clloodddddddoolllcc::::::codxkkxxkkxkkkkkkxxxxxxxxxkkkkxxxxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxkkkxkkkkkkkkkkkk
oodxdooddddxxxxddddddddddxdddddddddddxxxddddddxxxkkxxkkkxxxxdxxkxxxxkkkxxxdxxxxxdoc:;:ldkO00Okkxdooooolllllooodddolc::;;:ldxxxkkkkkkkkxkkxxkkkkkkkkkkkxxxxxxkkkkkkkkkkkkkkkkkkkkkkkOkkkkkkkkxkkkkkkkkkkk
ooooddoooooxxxddddddddxddddddddddddddxxxxxxxddxxxxxxxxxxxxxxxxxkxxxxkkkkxxxxxxoc;;lxOKK0kdoollllllllllllllc::::cclllodolc:;;:oxxxxxxxxkkkkkkkkkkkkkkkkkkxxxxxxxxxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkO
ddoooddooodxkxxkkkxxdodxxddddxdddxdddddxxxxxddxxxxdddxxxxxxxxxxxxxxxxxxxkkxdl;;cxKXKkdollllllllllllllllllllc:;'',::ccccllool:;;cdkOOOOOkkkkkkkxxxxxxxxkkkkxxxkxxxxxxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
odddoodddoodxddxkkkkxdodxddddxdddxxxdddxxddxxddxxxxxdxxxxxxxxxxxxxxxxxxxxdl;:dKNKOdollllllllllllllllllcllllllc:,...,;:ccccllooc;;lkXXXXXKK0Okxxxxxkkkxxxkkkkkxkkxkkkxxxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
doodddoddxddddddxkkkxdodxddddxxxdddxdddxxxddxxddxxxxdxxxdxxxxxxxxxxxxkxdc,:xXX0xollllllllllllllllllllcccccccccc:;,....,;;;cllcllc;;ckKXXXXXXKOkxxkkkkkkxxxkkkkkkkkkkkkkkxxxxxxkkkkkxkkkkkOkkkkkkkkkkkOkk
xxddodddddddddddxkkkxdodxxddddxxxxdxxddxxxxddxxxdddxxxxxxxxxxxxxxxxxkxo;:xXXOxolllc::;;,,,,,,,,,,,,,,,;;;;;;;;;;;:;'......,;::;;;cl:;lONNXKKXXKOkkkkkkkkkkxxkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
dxxxxdddddddddddxxxxdoodxxddxddxxxxxxdddxxxxdddxxxxxxxxxxkxxxxxxxxkOxc;dKXOo:;,,,;:ccloddxxxxxxxxxdoollc:;,''..'',;,'......','.';ccoo:;dKXXXKXXKOkkkkkkkkkkkkkxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
oodddxxxxxxxxdddddxdoodxddddddxxxxxxxxdddxxxxxxddxxxxxxxkkkxxxxkOKKk:;dkd:,;:ldkOKXNWWWWWWWWWWWWWWWWWWWNNXK0kdl:;'......   ....',:cccl;'l0XXXKKX0kkkkkkkxkkkkkkxxxkkkkkkkxxxxxkkkkxkkkkkkkkkkkkkkkkkkkkO
ddoooooodddddddddddoddxxdddxxxddxxxxxxxxddxxxxxxxxxxxxxxxxxxkOO0KKx,.,clox0XNWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWNX0xo:,..     ..',,;:ccc,.:OXXXXX0kkkkkkkkkkkkkkkkkkkkkkkkkxkkkkkkkkkOkkkkkkkkkkxkkkkkkkk
dddddddddddddddddooddxxxxxxxxxxxxxxxxxxkkxxxxxxxxxxxxxxxxxxkOKKOdc::okKNWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWNKko;.     .',,;::c:,.,kXXXK0kkkkkkkkkkkkkkkkkkkxkkkkkkkkkkkkkOkkkkkkkkkkkkkkkkkkkkk
ooooooooooooooooddxxkkkkkkkkkkkkkkxxxxxkkkkkkkkxxxxxxxxxxxkO0kl:cxKNWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWN0d:.   ..,,,;;::,.,xXX0OkkkkkOOOOOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
oooooooooooodddxxxxxdxxxxxxkkkkkkxxxkkkkxkkkkOOkkxxxxxxxkxkOo;lONWWWNNWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWNNNNWN0d;.  ..',,;;:,.'lkkkkkdlcccccodxxkkkkkkkkkkkkkkOkkkkkkkkkkkkkkkkkkOkkkkkkkk
xxddddddddxxxxxxxdddddddddddxxkkkkxxxxxxxkkOOOkkkkkkxxxxxxkl;dKNWNKO0XWWWWWWWWWWWWWNNNNXXXKKKKKKKKKXXXXXXNNWWWWWWWWWWWNK00KXNNXx:.   ...',;,..,ll;;:lodxxdoc:clxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
xxdddxxxddddxxxxxxxddddddddxxxxxkkxxxxxkkxxkOOkxxxkkkkkkkxd;:x0XOddOXWWWWWWWWNNXKK00OOOkkkkkkkkkkkkkkkkkOOO0KKXXNNWWWWWNNK0OO0KKOd:.     ..... .,lOXWWWWWWWN0dc:cdkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
xddddxxddoodddxxkkkxxxdddddxxxxxxkkxxxxkkkkxxxxxxxxxxxxol:,.;ooloOXWWWWWNNXK0OOkkkkkxxddolllcccclllloooddxxkkkkOO00KXNNWWWNXKOkxdxxo'.....    .:kNWWWWWWWWWWWXOd:;lkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
dodddxxdddddddddxxkkkxxxxxxxxxxxkkkkxxxkkxxkkkkkxxxdoc;,'''..';xXWWWWNXK0Okkkxxdlc;,'........  ...........',:cldxkkkkO00KXNNNKOxlcldc.'::;'. 'lxKNWWWWWWWWWWWNKkxc,cxkkkkkkkkkkkkkkOkkkkkkkkkkkkkkkkkkkk
ddddxxxxxxxxxxxxxxkkkxxkkkkkkkkkkkOOkxxxkkkkkkkkxoc;,''''''..:0NWWNX0Okkkxdl:,...  ......'''',,,,'''''....... ...,:ldxkkkkO00Okkkoc:,.'::c:..cdkKNWWWWWWWWWWWNKkkx:,lkkkkkkkkkkkkkOkkkkkkkkkkkkkkkkkkkkk
dddxxxxdddddxxxxxkkkkkkkkxxxxxxkkkkkkkkxxxkkkxdc;,''''''''..lKWNX0Okkkxl:'.     ...,cooddxxxxkkkkxxxxxddoolc,....   .';ldkkkkkkkkkko,.'::c;.,odx0XWWWWWWWWWWNKOkkko':xkkkkkkkkkkkOkkkkkkkkkkkkOOOkkkkkkk
xxxxxxdooddddxxxxxkkkxxxxxxxxxxkkkkkkOkkkkxdo:,''''''''''..cKNX0kkkxo:..    .';:ccccldO0KKKK00000000000000Oococ'.........;lxkkkkkkkkd,.,:c;.;dxxkOXNWWWWWNNX0kkkkxo';xkkkkkkkkkkOOkkkkkkkkkkOOOOOOOkkkkk
xdxxxdoddxkkkxxkxxkkxkxxxkkxxxxxxxxxxkkkkdl;'''''''''',;:';ON0kkkxl,.    ..;ldxxdoloooldO0000000000000000Ooco:;coxkkkkxo;...:oxkkkkkko'.:c:''lxxkkkO0KKK00Okkkkkxxc'ckkkkkkkkkkkOOOOkkkkkOkkOOOOOOOkkkkk
ddxxkdodkkkkkxkkxkkkxkkO00Okkxxxxxxxxxxdl;'''''''''';coxo,lK0kkxl'.    .;okO00000kdlccloox0000000OO0K000Oolc;lO0KKK0kdoddl'  .;ldxkkxd:.:ddc,,lxxxkkkkkkkkkkkkxxxl,,dkkkkkkkkkkkkOOOOOkkkkkkkkkkkkkkkkkk
dddxkxddkkkkxxxxxxxkkO0KOxxkkxxxxxkkxdc,''''''''',:oxkOOo,lOkko,.     ,dOkoc::cok000Od::dddk00000kO0000kolc:d0K00Od;..  ..'.   .:oxxddl.,dkkd:,:oxxxxxxxxxxxxddoc',okkkkkkkkkkkkkOOOkOOOOOkkkkOOOkkkkOOO
ddddxxxddxkkxxxxxkkxkkxddddxxxxxxxxdl;''''''''',coxOOOOOd,,oxl.     .,od:.      .:x000Ol:oxodO00Oxk000kdo:ck0KK0x:.    .,;'..   .,loooc.'dOOOko:;:loddxxxdddoc:,':dkOOO0000KK00OOkOOOkkkkkkkkkkkkkkkkkkk
dxddxxxdddxxxxxkOOkdolloxxxxxxxxxxl;''''''''',cdkkkkOOOOko:;,.    .,::;,;:;'..    .lk000klloodO0Oxk0OkxocoOKK0Oo,    .,okOdc'.   .,cc:''lkOOOOOkxl;,,;;;;;;,'',cdkO0KXK0OOkkOOOO0OkkOOOOkkkkkkkkkkkkkkOO
dxddxxxxxxxdxkOOkdlccldxxxxxxxxxd:'...''''',cdkkkOOkkOOOKXXOo;.  .:lloxOOkdoc,.    .;d00K0kolcd0Odkxodddk0K0ko:.   .';ldxxdl:,.   ..':dO00OOOOOOOOkdl;,,,,,;:cldk0KK00kdolllllldxkOkkkkkkkkkkkkkkkkkkkkk
dddddxdxxxxdxkkdlclodxxxxxxxxxxl,'....''',:oxkkkkOOkk0XNNX0OOko,'loodOOkdc,....     .'cdO0K0OdodxdollxO0KOxl;..   .....,:llc::,.  .:dOKXNXKOOOOOOOOOkxlccccccccldO0kdddoloolllllxkOOOkkkkkkkkkkkkkkkkkkk
dddddxddxxxxxxddddxxxxxxxxxxxd:'.......';oxkkkkkkOO0XNNK0OkOOOx;'dxddolc:,.  .;oddl,....:oxO000dcc;;cokxdc,.. .'cdkkc.  .;c:::;,. .:kOOOKXNNK0OOOOOOOkkdlcccccccloddooddolllllodkOOOOOOOOOOOOOOkOOOOOOOO
ddddddddxxxxxxxdxxxkxxxxxxxxo;'.....'',lxkkkkkkkO0XNNK0OOOOOOxc,lOOdllc::,. .lXWWWNKx:.  ..,;::,,::,''....   'd0XWWWXc  .;ccc::;;,..,lkOOO0XNNK0OOOOOOOkxolccccccclodxxxddddxxkkkkkkkkkkkkkkkkkkkkkkkkkk
dddddxxdxxxxxxxxxkkkkkkkxxxl,.......':dkkkkkkOkOXNNKOOOOOOOko:ckXKOkxxdlc:'..dNWWNXKOc..      ..;:;,'.  .. ...;OXNWWXl..,cloddddool:,',cdkOO0XNNKOOOOOOOOkdlcccccccloxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
dxddxxxdxxxkkxxxxxxxxxkkkxc'.......'cxkkkkkkOO0NNX0OOOOOkdccokKKOOOOOOOkdl:'.,ONWWX0l.   .cl. ..,;;...,dd,    'xXNWNx'.cdkO000000Okxoc;',:okOOKNNX0OOOOOOOkxocccccccloxkkkOOOOOOOOOOkkkkkkkkkkkkkkkkkkkk
dxdxxxxdxxxkkkxxxxxxxxxxxc'.......,lkOkkOOkO0XNX0OOOOOOd::d00OkO0KKKK0000Oxo:',oKWNKx;..,oOd'';coxxdl:;d0kl;;ckKXN0l';dO0000O0OOOOOOxoc;,..,okO0KNNKOOOOOOOkkolccccclllxkOOOkkOOOOOOOOkkkkkkkkkkkkkkkkkk
dxxxxxxdxxxkkkkkkkkkxkkd:'.......;oxkkkOOOOKNNK0OOOOOko;ckxdxk0KKK0kkkkOO00Okdl;:ok00Okxxo:';ddxkkxxdo,,lodkOOOkxl::okO00OxdodxOkkkkOkl;'...lkOOO0XNX0OOOOOOOkdlccclccloxkOOkkOOOOOOOOOOkkkkkkkkkkkkkkkO
xddddxxxxxxxxkkkkkkkkkxc'......';okkkkOOOOKNNKOOOOOOOd,;l;:xkOK0kxxdoddolloxxddolccloddoolddc'',,'.....d0kolllloodxxdooolccc::ldxddkxxdc,...ckOOOO0XNN0OOOOOOOkdlccclllloxkOOOkkOOkOOOOOkkkkkkkkkkkkkkkO
xxddxxxdxxxxkxxxxxxkkkl'.......;okkkkkOO0XNX0OO0000KOc',.,dk0KOxxdolc:,...,;:ldk00KKK000KKXN0o.    .';xKNXXXK0OO000K0xl:,....;:ododxxol:,...;xOOOOOOKNNKOOOOOOOkdlccllllloxkkkkkkkkkkkkOOkkkkkkkkkkkkkOO
xxdxxxdxxxxxkkkxxxxxxl,.......;okkkkkOO0NNX00KKKXKKKk,...cdOKOxxolxkl,...,:lxO0KKXXK00KXXXXXXXOl',oOKKXXXXXXXXK00K00000Odo;',cldxdxkolc:'..;oOOOOOOOOKNNKOOOOOOOkdlcclllllokOOOkkkkkkkkkOOkkkOOOOOkkkOOk
xdxxddxkkkkxxkkkxxxxo,.......,okkkkkOO0NWXKKKKKKKXXKx, .';okkOOolkOdlll:lO000000KK0OKXXXXXXXXXXKodXXXXXXXXXXKKK0000OOOkdoc;lxlcxkxxdl::,. ,x0K0OOOOOOO0NNKOOOOOOOkdlccllllldkOkkkkkkkkkkOOOkkkkOOkkkOOOk
xddddxxxxxxkxxkkkkxd;.......'lkkkkkkO0XWNK000KKKKXXXk;'...:xodOxdOkdldxc,:oxddxO0000KKKKKKKKKKX0odKKKKKKKKKKK00000Oxdddc,.:kkllxdolc::,...:kKX0OOOOOOOOKNNKOOkOOOOkdllllllllxkkkkkkkkkkOOOOkkkkkkkkkOOOO
dddxxxddxxxxxxxxkkkl'......':xkkkkkOOXWN0OO0KKXKKKKKOol:..,locdkOOOxldOdc,..:dook000000000KK00KOlo0KKKKKKKKK0000Oxdoxd:..:dkocloc:::;'...,x00XKOOOOOOOOOKNNKOOOOOOOxolllclllokOkOkkkkkOOOOOkkkkOkkkkOOOO
dddxxxxxxxxxxxxxxxd;.......;dkkkkkkOKWNK0000KKKK00O0KKKO:,cc:c:cdkO0xdkOkdc,':ddodO000000000000OllO00000000000Oxddxxc'.,coolc:c::;,...',ckK0KXK0OOOOOOOO0XWX0OOOOOkkdlllllllldkOOOOOOOOkkkkkkkkkkkkkkkkk
dddxxxxxxxxxkkkxxdc'......'cxkkkkkO0NNK000KKKKKKK00OOOkxocoo:,,;;:ldxkxxxkkxl,,:ddddkO00OOOOOOOx::xOkkOOOOkOkxddxxl,.';clcc:::;;,.. .:dk0KK0KNK0OOOOOOOOO0XWX0OOOOOOkollllllloxkOOOOOkkkkkkkkkkkkkkkkkkk
ddxxxxxxxxxxxkkkkd;.......;dkkkkOOOXWXOkkOOOOOkkxdollccloo:,,,'...,;:cllooodxdc'':ddlldxkkxkkkoc;:ddddxxxddoloxxl,..,:cc:::;;,'....'';kKXXKKXNK0OOOOOOOOOO0NNKOOOOOOkxlclllllldkkkOkkkkkkkkkkkkkkkkkkkkk
ddxxxxxxxxxxxkkkxl'......'cxkkkkkk0NN0Okkkkdlcccccllodxkkc;oxodo:'...',;::cclooc;.':ooc:clcclc;:;,:ccccccclodol,..';::::;;,'.. .';:ll,;xKKKXNX0O00OOOOOOOOOXWXOOOOOOOkollllllloxOOOOOOkkkkkkkkkkkkkkkkkk
dxdddddxxxxxxxxxd;.......;dkkkkkkOXWXOOOOOOkkxxxkkkkOOO0d;okdOOxxxl;.....',;::ccc:,..;lllcc::,,:;',,;;cloddl:'...,;;;;;,.....';clc;:lc'c0KKXXK000OOOOOOOOOO0NNKOOO0000xllllllllxOOkkkOOOOOOkkkkkkkkkkOOO
xxkxxxxxxxxxxxxxo,.......:xkkkkkk0NN0kOOOOkOOOOO00000000x::lkOlxK0kdldoc,....',;;::;'..';clooc;:;;llooool:'....',,,,'.....,:ldxxddc,;:':OXXK000OOOOOOOOOOOOOXWXOkxxxkkxollllllldkOOOOOkkkkkkkkkkkkkkkkkk
xdxxkkkxxxxxkkxxl'......'lkkkkkkkKWXOkkOOkOOOO000000000K0o.,xccKXX0xOK00Okoc;'.....'''......'',:;;c:;;'... ...'......';:ldxkO0KKkdd,.''oKK00000OOOOOOOOOOOOOKWN0kxdoccclllllllloxkO00000OOOOOOOOOOOOOOOO
xkkkOkxxxxxxxxxxc.......,okkkkkkOXWKOOkOOOOO0000000OOOOOOk:.'.l0kOOkXNXXXKKK0Oxl:,'.........  .:,...      .......,:loxkkO0XXNX00kcl; .:0XK0O000OOOOOOOOOOOOO0NNKOOkdoccccllllllodkO0KKKKKK0OOOOOOOOOkOOO
xkk000Okxxxxxxxd:.......;dkkkkkkOXWKOkkkOOOOO00000OOO00000d,..;l'cdxKK0KXNNNXXKK00Oxl:'..     .:'        ..,;codxkO00KXNNNK0XOolo;'...c0XK00O00OO0OOOOOOOOOO0XWKOOOOOkxolllllllllodxkkkk0KKOOkkkkkOOOOkO
ddodOKK0Okkkkkkd;.......;dkkkkkk0NN0OOOkOkxkO00K0000000K0d:lx:'. .,cdxdd0XXNNNNXXNXxclolccccc;,:,.'',,,,,:cdOKKKKXXNWNXX00d:dl.... .;o;:OK00000000OOOOOOOOOOOXWXOOOOOOOxlllllllloodddoodkOOOOOkkkkOkOOOk
dddodkO00Oxxkkkd;.......;dkkkkkk0NNKOOOOOxdk0KKKK0000KKKo;dNNkl:'......;kkx0K0KOOXk;lXNNNWWNNk:::oOOOOOOOOdcdXNNNN00WKxool:...  ...':kOl;d0000O0000OOOOOOOOOOXWXOOOOOOOxlllllllldkkkkxxkkOkkOOkkkOOkkOOk
ddddoloxO0Okxxkx;.......;dkkkkkO0NN0OOOOOkxkkOKXXKKKKK0o;xNNOolllc:,....;;:oolooOO;,kNXXXXXXXkc:cdOOOOOOOOOl;kKOO0doOd;',.......';:ccoOKd;oKXK0000000OOOOOOOOXWXOOOOOOOxllllllllxOOOkkkOkOkkOOOOOkOkkkkk
xxxxdlclxOKKOxxd;.......;dkkkkkk0NN0OOOOOOkxddx0XNXK0kc:OWNOolllllllc:;''.....'col::oooooddddocccoolllccccc;':c;,;,.'. .....',;;clllllokKk:l0XXK000000OOOOOOOXWXOOOOOOOxllllllllxkOOOkkOkOOOOkOOOkkOOkkk
ddddxxoccxKNXOxd:.......;dkkkkkkOXNKOOOOOOxdlcldOXNXk;:0WXkolllllllllllll:,. .xNNNNNNNNNNNNNWWNNNNN0kkkkkkkxxxxd:.    ..',,;cclllllllllokK0c:kXXXK00000OOO0O0XWX0OOOOOOxllllllllxkOOOkkOkkOOOOOOOOkOOkkk
ddddddxdllkKK0kd:.......,okkkkkkOXWKOOOOOOkocccclxOk:cKWXkoolllcllcclllcclc'.cXWWWWWWWWWMMMMMMMMMMWXK000OOOOOOOOk:.  ..,cllllllllllllllllxKKl;xKXXK00O000OOO0NNKOOOOOOOxllllllloxOOOOkkOOkOOOOOOOOOOOkOO
ddddddddxdxOOOkxc'......'lkkkkkkkKWXOkkOOOOxoc::cc:,cKWXxoolllc:cl::llc;:c:',xOkxxxdddddddddddddddddddooooooollodo,  ..:llccllllcclllllllld0Ko;dKXKKK0O0000OKNN0OOOOOOOdllllllloxOOOOkkkOOkOOOOOOOOOkOOk
dddddddddxxkkkxxl,......'cxkkkkkk0NN0kOOOOOOkdlc:;'cKWKxolllllc;:l;'::;'',;,'.. ..''''''''''''''''''''''''''..........':llc;:llc;:llllllllldOKd;dKXXK0O0OOOOXWXOOOOOOOxollllllldkOOkOOkkOOOkOOOOOOOkOOOk
dddddddddxxxxkxkd;.......;dkkkkkkOXWKOkOOOOOOOkd:'cKWKdlllllll:'','.';:;....'...,oxkkkOOOOOO0OOOO00000OOOOkkdlc,.   ..,cllc;,:lc,;lllllllllloOKd;oKXXKOOOOO0NWKOOOOOOOxllllllllxkkOOOOOkOOOkkOOOOOkkOOkk
dddddxxdddxxxxxxxc'......'lkkkkkkk0NN0kOOOOOOOOd;cKWKdlllllc::'.,:clkK0l,:oxxxd::kKNNNWWWWNK0KKKKKKK0KXWWWWXOxo,    ..,clllc,,::';cccllllllllokKx;oKXK0OOOOKWX0OOOOOOkdllllllloxOOkkOOOkkOOOkkOOOkOOOOkO
ddxdddddddxxxxxxko,.......:xkkkkkkOXWKOOOOOOOOx:cKWKdllllll;..'o0OOXW0::k0kxol:,.;kNWWNKOOxoONWWWWNXKxdk0XNXOxl.    ..;llllc;'';.':;:llllllllloxKx;oKKOOOO0NWKOOOOOOOxollllllldkOOkkOOOkkOOOkkOOOkkOOOkk
dddddddddxxxxkxxxd:.......,lkkkkkkk0NN0OOOOOkx:c0WKdllllc:,..:ONNNWW0::kxc:;,'...'ldOXNx;,,,xNWWWWMKxc,,:kNXkd:.   ...;lllll:,''..,',clllllllllox0x;lkOOOOXWX0OOOOOOkdllllllloxOkkOOOOkkOOOkkOOOOOkkOOkk
ddddddddxxxxxxxdxxo,.......;dkkkkkkkKWX0OOOOx::0WKdllll:',:oONWWWWWXl;xkddxxxxxxddol:c0Oc,''lXMWWMWkc;',cOKkdo'    ...,:clll:;,.....':cllllllllllx0d,:k00KNN0OOOOOOOxlllllllldkkkOOkOOkkOOOkOOOkOOOkkOOk
dddddddxxxxxxxddxxd:'......'cxkkkkkkOXWX0OOx:;OWXxllll:.;dkXWWWWWWWO,:xdddolllcccccc:;dOo;,;oXMMWMNd;,,;colccc:,......',,;:::;,. ...';c:;:lllllllld0d,ckKNWKOOOOOOOkollllllloxOkkOkOOkkkOOkOOOOOOOOOkOOk
dddddxxxxxxxxddxxxxo;.......,lxkkkkkO0NNKOkc,xWXxllllc.'ox0WWWWWWWNo.:loxxdl:'.........,:lxk0NMMMMNkllc;.',;:clddl:,'..''',,,;;'.  ..,,,:lllllllllld0d,cKWX0OOOOOOOdllcllllldkkkkOOOOkkOOO0K0000OOOOOkOO
ddxxxxdddxxxddxxxxkxl,.......;okkkkkOO0NWKl,dNNklc:;;'.;xkXWWWWWWWXl.,clddoooooooollc:;,''oKKKKXXXKkoxOx,..  ..,cokkdl:'.''',,,'.   ..'clllllllllllldOo,oKKKKK0OOOxlclllllldkkkkOOOOkkOO0K0OxddxkkkOOkkk
xdddddddxxxxdxxxkkkxxc'......':dkkkkkOO0NO;lXNx::codko':dxXWWWNNNWNo..:cclodooollc:;''';cd0Xxccccc:,'l0kl'..  ...';ldO0x,...''...    .,cclllllllllllcokl'o0KKXKKOxoccllllloxkkkkOOOOO0KKOxollllldkkkOOkk
dddddddxxxxdxxkkkxxxxd:'......':dkkkOOOOk::0NOxkKNNXKx':xxKWWWXXNWWk..':cll:,'...    .:ONWWWKl,,'''..';,,;:cclllccccodxkx;.,l:'',:c;...,;::::::cccclc:okc'o0KXXKkoccllllllxkkkkkkOOO0XXOdlllllllxkOkkkOk
ddddddxxxxxxkkkxxxxxxxd:.......':xkOOOOkc'dWNXX0Okdooc.;xx0NWWXKXWWK: .,coxxdolc:;;,.'cONWWWNOlcc;.',,;;;;,,;clodxk00K0xdo,,kX0xollkOl'.',;:::::::ccc::dk;,kKXKOocclclllldkkkkkkkkOOKKOddooolloxkOOkkOOk
dddxxxxxxxxxxxxxxxxxkkxl,.......':dkkkkx;;0N0xdollllll''dxkXWWN00XNNx.  .';cccccccccc:;:dKWWWNNNNKd;,,,;,,.   ..';:lodkdloc.,ONNNXOxKXk;.,odxxkOOkdoc:;:xo.c0XOocccccllldkOkkkkkkkkO00xooodddxkOkkkOOOOk
xxxxdddddddddddxxxkOOkdc:,'......';oxkkd;:K0dlllllllll;.:xxOXWWKOOXNXl.   .............'oKWWWWWWN0o,.....'',;;::cloooollccl,.cXWWWWNNNXk;'o000Okkxdolc;;ox,'xkoccccclcldkkkOkOOkOkkOOOOkxxkOOOkkkOOOOOkO
dddddxxxxxxxxxxxxkOOkoccdo:'......',lxkx;:0Oollollllllc..lkx0XWN0xx0NKl.    ...    .'cokKXNNNNNNXo,;;;;;cloddddxxkkkOOkxdlc, ,OWNNWWWWXOx,.:lllllllll:;;cx:.:lcccccllldkkkkOOOOkkkkkkkOOOOOOOOOOOOOOOOOO
dxxxxxxxxdddddddxkOkolodxxd:'.......':dxc,xkoooooooolll,..lxdOXNNOoox0Kkc,',cc'.  ..,xKNNNNNNNNNNKo;'........'''';clllllllc' .xWNKNWWWXOkl..cllllllc:;;,cx;.,ccccccloxOkkkkOOkkkkkkkkkkkkOOkOOOOOOOOOOkk
xxxdddddddddddddxxxddxxxxxxdc,......'';oo,:dooooooollc;,. .ldoxOXXOocldkkkdoc,.  ....lKNWWWWWWWWWWKdc:,.  ....',;:clcccccc;. .xNNKKNWWNOkd'.;llc:c:;;,;,co'.;ccccclokOkkkkOOOkkkkkkkkkkkkkkkkkkkkkkkkkkk
oddddddddddddddxxxxxxxxxxxxxxo;'......',::';lllllc::;,,,,. .;lllldkxo:;,;;;,'..  ....,ONWNWWWWWWNNNKOxl.  ........',;cccc:,. .xNN00NWWNOxd,.'::;;;,,;;,;oc..:ccccldkOkkkkkOOkkOOOkkkkOOkkkkkkkkkkkkkkkkk
odxxxxxxxxxxxxxxxxxxxxxxxxxxxxdc,.....'.','..,;;;,,,,,,,,'.. .,:::::::;,''''..  ......c0KKKKKKKKKKKKKOo.  .....'',;;::::;,.  .kWN00NWWXOxd, .,,,,,,,,,,cl'.;ccccldkkkkkkkkkkkkkkkkOOkkkkkkkkkkkkkkkkkkkk
doddddddddxxxxxxxxxxxxxxxxxxxkkxo;'...'''''....',,,,,,,,,''.   ..',;;,,,'.......',;:c,'oXXXXNNNNNNNNX0c.  ................   ;KWXO0NNNKkxl. .,,,,,,,,;:c'.,cccldxkkkkkkkkkkkkkkkkkOkkkkkkkkkkkkkkkkkkkkk
dddddddddddxxxdddddxxxxxxxxxxxxxxdc,''''''''................        ...  ....';:cllllc';kKKKKKKKKK0Okd,............ ...     .dNN0k0NNN0xd:. .,,,,,,,;;,..;cccodkkkkkkkkkkkkkkkkkOOOOOkkkkkkkkkkkkkkkkkkk
ddddddddddddddddxxkkkxxxxxxxxxxxxxxo:,'''''''''.';;;;;;:cloc,.    ......',;:clllllllllc,''''........................,:'.   .lXN0xxKNX0xdl' .',,,,,''...,:ccldxkkkkkkkkkkOOkkkkkkkkkkkkOOkOkkkkkkkkkkOOOO
dddddddddddddxxxxxxxddddxxxxxxxxxxxkxo:,''''''''';lx0KKKXXO;,:.  .';:cccllllllllllllllll:,'.........'',,,;;;;,,'''. 'cc;..,dKKkooOXXOxdl,  ..........,:ccldxkkkkkOOOOOOOOOOOkkkkkkkkkkOOOOOkkkkkkkkkOOOO
ddddoddxxxxxxxxxxdddxxxxxxxxxxxxxkkkOOkdlcccccccccclxO000KOc:xo;,;cooooodoooodooooooooooooooollllllllooooooool::::;',cllloxkxdllokOxoolc'........';:ccccloddddxkOOOOkkkkkkkkkkkkkkkkkkkkOOOkkkkkkkkkOOOk

Website - https://grinch.pro/
Telegram - https://t.me/grinch_portal
Twitter - https://twitter.com/grinch_erc


*/

// SPDX-License-Identifier: MIT


pragma solidity 0.8.20;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }
}

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;
        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        return c;
    }

}

contract Ownable is Context {
    address private _owner;
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    function owner() public view returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

}

interface IUniswapV2Factory {
    function createPair(address tokenA, address tokenB) external returns (address pair);
}

interface IUniswapV2Router02 {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
}

contract GRINCH is Context, IERC20, Ownable {
    using SafeMath for uint256;
    mapping (address => uint256) private _balances;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => bool) private _isExcludedFromFee;
    mapping(address => uint256) private _holderLastTransferTimestamp;
    bool public transferDelayEnabled = true;
    address payable private _taxWallet;

    uint256 private _initialBuyTax=35;
    uint256 private _initialSellTax=20;
    uint256 private _finalBuyTax=2;
    uint256 private _finalSellTax=2;
    uint256 private _reduceBuyTaxAt=10;
    uint256 private _reduceSellTaxAt=35;
    uint256 private _preventSwapBefore=10;
    uint256 private _buyCount=0;

    uint8 private constant _decimals = 9;
    uint256 private constant _tTotal = 77000000 * 10**_decimals;
    string private constant _name = unicode"GRINCH";
    string private constant _symbol = unicode"GRINCH";
    uint256 public _maxTxAmount = 1540000 * 10**_decimals;
    uint256 public _maxWalletSize = 1540000 * 10**_decimals;
    uint256 public _taxSwapThreshold= 1540000 * 10**_decimals;
    uint256 public _maxTaxSwap= 1540000 * 10**_decimals;

    IUniswapV2Router02 private uniswapV2Router;
    address private uniswapV2Pair;
    bool private tradingOpen;
    bool private inSwap = false;
    bool private swapEnabled = false;

    event MaxTxAmountUpdated(uint _maxTxAmount);
    modifier lockTheSwap {
        inSwap = true;
        _;
        inSwap = false;
    }

    constructor () {
        _taxWallet = payable(_msgSender());
        _balances[_msgSender()] = _tTotal;
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromFee[_taxWallet] = true;

        emit Transfer(address(0), _msgSender(), _tTotal);
    }

    function name() public pure returns (string memory) {
        return _name;
    }

    function symbol() public pure returns (string memory) {
        return _symbol;
    }

    function decimals() public pure returns (uint8) {
        return _decimals;
    }

    function totalSupply() public pure override returns (uint256) {
        return _tTotal;
    }

    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) public view override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function _approve(address owner, address spender, uint256 amount) private {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _transfer(address from, address to, uint256 amount) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        uint256 taxAmount=0;
        if (from != owner() && to != owner()) {
            taxAmount = amount.mul((_buyCount>_reduceBuyTaxAt)?_finalBuyTax:_initialBuyTax).div(100);

            if (transferDelayEnabled) {
                  if (to != address(uniswapV2Router) && to != address(uniswapV2Pair)) {
                      require(
                          _holderLastTransferTimestamp[tx.origin] <
                              block.number,
                          "_transfer:: Transfer Delay enabled.  Only one purchase per block allowed."
                      );
                      _holderLastTransferTimestamp[tx.origin] = block.number;
                  }
              }

            if (from == uniswapV2Pair && to != address(uniswapV2Router) && ! _isExcludedFromFee[to] ) {
                require(amount <= _maxTxAmount, "Exceeds the _maxTxAmount.");
                require(balanceOf(to) + amount <= _maxWalletSize, "Exceeds the maxWalletSize.");
                _buyCount++;
            }

            if(to == uniswapV2Pair && from!= address(this) ){
                taxAmount = amount.mul((_buyCount>_reduceSellTaxAt)?_finalSellTax:_initialSellTax).div(100);
            }

            uint256 contractTokenBalance = balanceOf(address(this));
            if (!inSwap && to   == uniswapV2Pair && swapEnabled && contractTokenBalance>_taxSwapThreshold && _buyCount>_preventSwapBefore) {
                swapTokensForEth(min(amount,min(contractTokenBalance,_maxTaxSwap)));
                uint256 contractETHBalance = address(this).balance;
                if(contractETHBalance > 50000000000000000) {
                    sendETHToFee(address(this).balance);
                }
            }
        }

        if(taxAmount>0){
          _balances[address(this)]=_balances[address(this)].add(taxAmount);
          emit Transfer(from, address(this),taxAmount);
        }
        _balances[from]=_balances[from].sub(amount);
        _balances[to]=_balances[to].add(amount.sub(taxAmount));
        emit Transfer(from, to, amount.sub(taxAmount));
    }


    function min(uint256 a, uint256 b) private pure returns (uint256){
      return (a>b)?b:a;
    }

    function swapTokensForEth(uint256 tokenAmount) private lockTheSwap {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function removeLimits() external onlyOwner{
        _maxTxAmount = _tTotal;
        _maxWalletSize=_tTotal;
        transferDelayEnabled=false;
        emit MaxTxAmountUpdated(_tTotal);
    }

    function sendETHToFee(uint256 amount) private {
        _taxWallet.transfer(amount);
    }


    function Set_Trade_Open_Right_Now () external onlyOwner() {
        require(!tradingOpen,"trading is already open");
        uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        _approve(address(this), address(uniswapV2Router), _tTotal);
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH());
        uniswapV2Router.addLiquidityETH{value: address(this).balance}(address(this),balanceOf(address(this)),0,0,owner(),block.timestamp);
        IERC20(uniswapV2Pair).approve(address(uniswapV2Router), type(uint).max);
        swapEnabled = true;
        tradingOpen = true;
    }

    receive() external payable {}

    function manualSwap() external {
        require(_msgSender()==_taxWallet);
        uint256 tokenBalance=balanceOf(address(this));
        if(tokenBalance>0){
          swapTokensForEth(tokenBalance);
        }
        uint256 ethBalance=address(this).balance;
        if(ethBalance>0){
          sendETHToFee(ethBalance);
        }
    }
}