Contract 0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f 3

 
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x179d4d3740fff56a638f6a40d385abff7e4ba7e67207a0f2c09fec8e3512f9f8Approve145923942022-01-22 16:39:1910 hrs 34 mins ago0xf925a4424d7ba451e4c7a790c6a9987b3ee8cf77 IN  0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f0 BNB0.000222855
0x778740eb07abc89ca6b5378c120a1149bf394e9a8c9561e8dff9d79b86acac45Transfer145285262022-01-20 11:15:552 days 15 hrs ago0x02fdd50f231c5cc22028a825aa542c3f9424aaa2 IN  0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f0 BNB0.00135872
0x4af445dae7538a7e85faeabaaf7cd75081a3dd51b90665d6e2bf1606bc50cb64Approve144818642022-01-18 20:15:314 days 6 hrs ago0x894b15815d2b4d2b61bcd8b50cc5e578c27486b4 IN  0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f0 BNB0.000222855
0x17e4d15ffaafd38618a312163ed3de2ce08ff3595997e2877cf0f8267ae5573aApprove144763832022-01-18 15:38:534 days 11 hrs ago0x6687d2ca8d9d3e82295797643e865aade76d2cf9 IN  0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f0 BNB0.000311997
0x802daaaa6ebab9239363de21fe7b19780feff16c7ea53a2922f0bdbb87b52dc5Approve144381532022-01-17 7:18:455 days 19 hrs ago0x2de47ab97d0e22c29e2ff8a4d5b775ab43c71f4d IN  0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f0 BNB0.00007297
0x6be2c5cc29816b7c1b813353f92d42f72a4105048d6d40aba8fc0b2cd9bebe96Approve144148202022-01-16 11:43:416 days 15 hrs ago0xbca11eb2493a099c55919bdf3187d7c4ef031ec0 IN  0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f0 BNB0.000267426
0xbe1977d32e6eb753544c4af03bd053fa24037fcaa4d86733db52bd08e3bb7a80Transfer143814622022-01-15 7:50:237 days 19 hrs ago0x02fdd50f231c5cc22028a825aa542c3f9424aaa2 IN  0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f0 BNB0.00135866
0x90326de1ef3a9071d7176a8bd84ff78bd8ebd365d6cf6eac1e06c446dd5fd72bApprove143286762022-01-13 11:45:319 days 15 hrs ago0x145b0275847f8f0a6092a1e6021837a4a1266f77 IN  0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f0 BNB0.000222855
0xef8cf01929c9fa8b7c059e30e49dffe79c5df87c0668a78739fc8d0a7dc4105cApprove143153542022-01-13 0:39:2410 days 2 hrs ago0x9a11f826b680c6a94c98d0afd24ca1604fddebef IN  0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f0 BNB0.00007297
0x777de613f756c5d5f24dc5aa788c6411befbe2afcafe9a8e58cac3a6799e8b69Approve143046092022-01-12 15:41:3610 days 11 hrs ago0xeeca7735ad4ce7ccc900adfb0b81a627ee64c22e IN  0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f0 BNB0.000222855
0xf8cc9d5dc368551a01eef58c6ed2ec24a458e7c1b75e31bcb4577b7145019e8dApprove142505102022-01-10 18:27:3512 days 8 hrs ago0x5194f89aaf888a5c1a8faaf84f09c108c0875126 IN  0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f0 BNB0.000222855
0xb478488e2cc35a436b96b09c88adb78827fa9147ef4dd4d8779275fc560664e5Transfer142503972022-01-10 18:21:5612 days 8 hrs ago0x2e65f6741fb48df7ff98fc0b14f684b597701a15 IN  0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f0 BNB0.001871675
0x345fbee1708c6d21029876eb8ba13fbaeeaf552019c9fba9e8b5dabdaa992874Transfer142411452022-01-10 10:38:5112 days 16 hrs ago0xf744b8c3519468205f51ccefc95ef5760661048e IN  0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f0 BNB0.001871675
0x35fb5f19c2413052399492a1eb72c0ef9a40631182cd21971ec57342e9b8225aTransfer142284102022-01-10 0:02:0613 days 3 hrs ago0x02fdd50f231c5cc22028a825aa542c3f9424aaa2 IN  0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f0 BNB0.00146122
0x0076c7c64b0e77b836f3ddd9f21722513633abe8459459977fffa07ee44121ddTransfer142283952022-01-10 0:01:2113 days 3 hrs ago0x02fdd50f231c5cc22028a825aa542c3f9424aaa2 IN  0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f0 BNB0.00135866
0x4f04ae19f13a90e50fe3c4cc9c60749579c5f1772f11fea362a343dfcbb684bfApprove141357762022-01-06 18:42:1216 days 8 hrs ago0xf8b5635ae0e9703b0943f000197ed224bf93f9e1 IN  0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f0 BNB0.000222855
0xcc4e939a8e30e3a1cf7b0fe424fce21f2102c1b526ec355e2fe40f401bf31f39Approve141228202022-01-06 7:53:2716 days 19 hrs ago0xf4bfe40c243a91042ee8baf2d8d086bb12e136d0 IN  0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f0 BNB0.000222855
0x8d606c588284fd2d58e39198e652c6c4eb39d38d3a1d9f0edb21551754b24997Approve141041742022-01-05 16:19:2717 days 10 hrs ago0xdbb1a065e8dc4e1a4658951898de88cbc7b72f93 IN  0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f0 BNB0.000222855
0x13370e0f6f2c8e40ba94e34c7045c0d384dc13b25579dff75de3eda4c9895798Approve140552182022-01-03 23:25:2719 days 3 hrs ago0x754cfc5d3d3cead94500142d9a955a4f0df7251f IN  0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f0 BNB0.000222855
0x8f95794e6dfcb9e4607dc4e49fb0de12d178c58a13a7eb083494d7954e97fe62Approve140256432022-01-02 22:45:2720 days 4 hrs ago0xdfdbe52c86b26f4a067de58037bcdafc4c148308 IN  0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f0 BNB0.000267426
0x5e65ac6bd2b3d4f81d8a45f43d9b2997584ceb9f89fe0288ebd2fe40e73da998Approve140205112022-01-02 18:28:5020 days 8 hrs ago0xfc46dd37bbadeec534b224381887d5d5dcbc8c4b IN  0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f0 BNB0.000222855
0x9d0aad0d8196843b061cd25c1f225d364a5e47914eafae82e1c0812bc34e3e37Approve139887662022-01-01 15:56:5521 days 11 hrs ago0x1763a9fed6b718a2ee9cd05dafa50b9b035f417d IN  0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f0 BNB0.000222855
0x3498e09fa2b486644e0c02c823287b87e3699f7f1fab45da9ec30cd7daa74e9cApprove139753812022-01-01 4:46:2221 days 22 hrs ago0x9d3cd90185160ddcb20f3258b27ec32cd51aac01 IN  0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f0 BNB0.000222855
0xe92512b1d32ecc2c5ca0c5c49be1f86e7ab6864883803f127b394a9ae93d1f64Approve139529652021-12-31 10:03:5122 days 17 hrs ago0x438ab0e6d10707aabe73f2a2d238559a8aa4bfc4 IN  0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f0 BNB0.000222855
0x2d33358607460a716d855bb5bfb6dc29ef5a17fc08e00cbdd9aba2dea602ac14Approve139371742021-12-30 20:54:1623 days 6 hrs ago0x639fbd9092085549500186ae8d548539aa1e9fd9 IN  0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f0 BNB0.000311997
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x27d09e4eadfcf4fc74406fb7390361844abef35b9a254a0606a3ac199a752ac6142284392022-01-10 0:03:3313 days 3 hrs ago 0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f PancakeSwap: Router v20.036589860219636665 BNB
0x27d09e4eadfcf4fc74406fb7390361844abef35b9a254a0606a3ac199a752ac6142284392022-01-10 0:03:3313 days 3 hrs ago PancakeSwap: Router v2 0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f0.036589860219636665 BNB
0x4454b22a31328b59cd7f7ba4cbf2a391d44fcb4f8f7efcaa754cf23f185025ab131771532021-12-04 3:48:2549 days 23 hrs ago 0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f PancakeSwap: Router v20.050666228337850393 BNB
0x4454b22a31328b59cd7f7ba4cbf2a391d44fcb4f8f7efcaa754cf23f185025ab131771532021-12-04 3:48:2549 days 23 hrs ago PancakeSwap: Router v2 0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f0.050666228337850393 BNB
0x84f94179eb3b5f321e6253a5f0127387d8815a1e0576d55da24c99c6481c1b75131044092021-12-01 13:37:4452 days 13 hrs ago 0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f PancakeSwap: Router v20.057795599728719229 BNB
0x84f94179eb3b5f321e6253a5f0127387d8815a1e0576d55da24c99c6481c1b75131044092021-12-01 13:37:4452 days 13 hrs ago PancakeSwap: Router v2 0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f0.057795599728719229 BNB
0x19bcb07210175a7f109564c9a7276a1e86e95dc13df84fcd30d42a6b2caa13d1126097282021-11-13 8:58:4870 days 18 hrs ago 0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f PancakeSwap: Router v20.088454043692546317 BNB
0x19bcb07210175a7f109564c9a7276a1e86e95dc13df84fcd30d42a6b2caa13d1126097282021-11-13 8:58:4870 days 18 hrs ago PancakeSwap: Router v2 0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f0.088454043692546317 BNB
0x25c7380d3dc24e365ff03b3ca139072b597162526fd6fe672c79717f94c416b5123166222021-11-02 22:43:2781 days 4 hrs ago 0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f PancakeSwap: Router v20.119518056812630901 BNB
0x25c7380d3dc24e365ff03b3ca139072b597162526fd6fe672c79717f94c416b5123166222021-11-02 22:43:2781 days 4 hrs ago PancakeSwap: Router v2 0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f0.119518056812630901 BNB
0x9d53907ba5e00c088b05772588198ab202d8947575d1257ba0264f50488bcd0d119431772021-10-20 18:09:5394 days 9 hrs ago 0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f PancakeSwap: Router v20.147438296819407852 BNB
0x9d53907ba5e00c088b05772588198ab202d8947575d1257ba0264f50488bcd0d119431772021-10-20 18:09:5394 days 9 hrs ago PancakeSwap: Router v2 0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f0.147438296819407852 BNB
0x5964d9c4af674dfbed8972560acff7d1de653d3f49108c94d5ba1258dffadba6113610312021-09-30 9:17:27114 days 17 hrs ago 0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f PancakeSwap: Router v20.18862183648639028 BNB
0x5964d9c4af674dfbed8972560acff7d1de653d3f49108c94d5ba1258dffadba6113610312021-09-30 9:17:27114 days 17 hrs ago PancakeSwap: Router v2 0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f0.18862183648639028 BNB
0xeb1554a57cfb4e01d1a4affe034612362b046f51ccf573699a2e5ef4cd968d87107716422021-09-09 19:06:10135 days 8 hrs ago 0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f PancakeSwap: Router v20.226199776232711603 BNB
0xeb1554a57cfb4e01d1a4affe034612362b046f51ccf573699a2e5ef4cd968d87107716422021-09-09 19:06:10135 days 8 hrs ago PancakeSwap: Router v2 0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f0.226199776232711603 BNB
0xb3484bf82d5c45e45c995c0143b10da4096b87537ee8482530392263573ac0d9103734652021-08-26 19:00:59149 days 8 hrs ago 0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f PancakeSwap: Router v20.246888412415770198 BNB
0xb3484bf82d5c45e45c995c0143b10da4096b87537ee8482530392263573ac0d9103734652021-08-26 19:00:59149 days 8 hrs ago PancakeSwap: Router v2 0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f0.246888412415770198 BNB
0x7b74463b499e0ed9bcf1cd5015f5f3700b98e3a317852bdb7203af62448faff7101627852021-08-19 10:23:34156 days 16 hrs ago 0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f PancakeSwap: Router v20.264721614692893516 BNB
0x7b74463b499e0ed9bcf1cd5015f5f3700b98e3a317852bdb7203af62448faff7101627852021-08-19 10:23:34156 days 16 hrs ago PancakeSwap: Router v2 0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f0.264721614692893516 BNB
0xd404d77a39052ce6028350094ac97f795b11484a0fec5bc8f73e75d1f83d8f7997890192021-08-06 5:37:19169 days 21 hrs ago 0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f PancakeSwap: Router v20.319680352654713425 BNB
0xd404d77a39052ce6028350094ac97f795b11484a0fec5bc8f73e75d1f83d8f7997890192021-08-06 5:37:19169 days 21 hrs ago PancakeSwap: Router v2 0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f0.319680352654713425 BNB
0x1ab58f44c40445a6e77d50dcf22d01f43c250c33fc356736852892a9732bd27f94423382021-07-24 17:06:56182 days 10 hrs ago 0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f PancakeSwap: Router v20.439277026553366235 BNB
0x1ab58f44c40445a6e77d50dcf22d01f43c250c33fc356736852892a9732bd27f94423382021-07-24 17:06:56182 days 10 hrs ago PancakeSwap: Router v2 0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f0.439277026553366235 BNB
0x739e3903dc3a323ed439d5d2cac968f3d6371e7125882760a96c5f38aa764a5b93119202021-07-20 4:05:39186 days 23 hrs ago 0x7153431234b9a6d1fa53cd057d5a1aac00c85c7f0x607c9c13ef8eb886328b40b2de41a8c255d84f770.27565663 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
KICHI

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 12 : KichiCoin.sol
// SPDX-License-Identifier: Unlicensed
/*
$KICH Decentralized Community! Our mission is to unite the community to achieve common goals that reward everyone involved. Welcome to the KICHI COLLECTIVE

Website- https://www.kichicoin.io/
Telegram - https://t.me/kichicoin
Reddit - https://www.reddit.com/r/KichiCoinToken/
Twitter - https://twitter.com/KichiCoin
Instagram - https://www.instagram.com/kichicoin/
Discord - https://discord.gg/cHPHJtDJhq
Youtube- https://www.youtube.com/channel/UCoarDKyWdCkOW4nw62kUYQA
Tiktok - https://www.tiktok.com/@kichicoin
Twitch - https://www.twitch.tv/kichcoin
FB Page - https://www.facebook.com/KichiCoin
FB Group- https://www.facebook.com/groups/kichicoin

WBZkX5XZX$5kZX5XkX5kZ5XkZX$ZZXXZk5$$5k$Z$Z5X$Z$5k5$$$$k5Zkk$Z5k55$X5Xkkk5ZXk$XZ5X5Z$5k5ZZZZ5Zk$Z5$ZkRHH
RR:' '`' -.` .- `.'..- `  ''-    `' `- ' '`'`'  ''.  .' `-`.``.`'``.-  ''.-.- .' . '-.``'''---  ...>HBW
RH_.' - `'-.'.. '`-.   . '.. ` ' -   '- '  '...``  ''    -``  ` '- ''.'` - ` ' '-' ''`-'.-.'-'' '``>QgR
gW!'- . '- '  ` .  .'.'  '``-' -.-'--.'   `'-+rilYytszs17i?=:'   `.-.-'    ''- .-.-  -``'`' ' .  . >QHH
RR,  ' .'--'-'.  '  -.-.--- `.''.  . . !|T3pO89anyfYTY1znaX6MM831|,' .. `'..`'.-.`'.` .  .-  ..'` .+QHR
WQ!. ` ` .-` -. -`.-'.-``. . - --.'^va8O4yv<+<<+!>_<+>+<<+>+>>({29&9t*``` '- '`-- ` -``-`. -  ' `` <gQQ
QH_.'```'  `. `'..`-.'``'``.'--  vkN9t|+>><,:,:~:_^!_:^,:^~~!!<+>>+iFbOo=. -   ''`--.' `-.-``''.  .>QRQ
RR:   ` '-`  .``. .  `  '-`  '+yDmt"<<+:::~:^^___~::!!^,___:_^^!~!!><>/j&U{ .  ''..` - `- `--.` '.`>BBR
Rg^' '--' - -`' .' '` `.`- '^nDki><+~~!_,_!~_~!^~__,:_~::^^:__~^!_,!^^+++YMML.  '  -` `-'' --'``- -+HRW
BW:.'' . --.-- ' `- `'.   `1N%v>+<_!^!,,^:~,:_,!!:!_^~!^,^!,~!_,^~!~~,,!+<<TO0r''`'-'. .-  .'`' `  <HHg
RW_ `'.''`-`-.-` -.' `' -+9D1<<+,!~~^,,^^~_!:^~^!_:~^:!^^,^_!,_,:^:!^:,!~,<+*#By'``  '.'.` ``'- .''<RRQ
QQ^ -.-- ' ` `      -. .|D8">+!^_~,,~,,!~^^~,:^!:__,:_,_!:!:~__,,!:,~_,,:!~:<<7D6!  '  - '`.` .-'  >HBR
RB!' .'. `  .. - '''-` [email protected]><<_^_~,!:~_~_~^_,,_:__^~_,_~!~^_!^^,:,~:,_,!~_:^,~<+\Nq! '-''''  . `-`''<BHW
BH: ''- ` '.-`. -`-'''/Dh<<>!,:!~~~^:_~_~~!^,!,^^_~:!^_:~_!__:,,,^~!,^^~~!~^~,+<(@h^.--..'. -.  ` '>RWW
gR!-`  '.`-` .` ' .  _OO"+<^!^,_^,^~::!,,,_!!~:^^_,^:^___!^,_!!_,!!!!^,~~!::,~^><LQC-  .-'    '- ` <BgB
RW:  '  '''.'`' -``` JWc+<_,:!^^,^!^^^:!___~:~^_^~_~!^~:^~::~_^_!^~!,~!!~::!_!!:<<XQ*  `-'.` `. . ->QgW
gH!-`-'-.. - '  ` . [email protected]<<<:!!~__!~^!,^_:!,,!~!^!^:~_,:!^^,_~:,:^,~~,~~!!^~,^::~_<+?RV. - .` ' -''  <RWg
QQ:.. - -  .-'--.  `7Rf<+^,::~!!__~,_~^!:^^,~!:!___!!:_!:!~:!:,_^,,~~_:!^__!_:,,!><UD` ..  '---'`-`+HWQ
gg_`.  ````' `  `.- oQi<>,^~~:!!~!^^^~__~!!^^:!~!_!:,:,,_!:!_,:!^__:^^~,!~^,:::^_<>4R=` - -  ' --.-+BHR
RW!`.'  ` -.'-.` '[email protected]?><^::_~_:^^:~:^~^~_~:_^~^__:_:_^^_::__::,~,::!,!_^:~:~~!~~<>2g(''`. .```.- ->QWB
gQ!'''`.'..   ' '-  tH)<<_~:,^~~!:^_^,_~_^,^!:,,:,,^____~:,_^_!!++!::_:^!~~~!!_~^>>Ig" -. ..`--. '.>QHR
RQ, .`'' . ``' .` '`Tg1<>:^~!,~,:~:!!~^__::!:,__~^,_~~~_!:,!!:izTMmv__^^,~~^^,!,_<+wQ: -. -.'`---- +WWR
Wg~'  -' .'-..`-`  `;gk><,::!_,~:_^~~:^_,,^,^^::~~,,:~,:^^^_^~5hoO%4__:!~^,!!:!!+<;@S '' .--   . `'<RRB
HR^ ```' '`  -` '.' 'AD?<>:,~~,:!!:,,:+YYM8[~:_^:~,~,:!_::!:_:+13aL<<,+_<~!,:~!:><tBc' ``'  `  `'-'<QWH
BR^'-      ..  -' ` .?Q$><,,_,^!_~,_,:y9zd8M:,!___^:,:,^,_!^!~!!,!_>_<^^^!!!::!+<=DU`."]yozl>`'` '->QBg
WR^  `'`'`-'''.   `  'zWz<+_^_~_^_,__!<1k9Y"_^^~^,_^,:~!_~,:_,,~!_,_~:,~!^_^:^<++PBT#dax)/1kDj,`'``>WWH
HQ!.. -  '  - ..-   .'-ZR1>>!,~!_,<:<++~^!:,_~!!__^^_^~~!!^~~,^!^::^!~~^:,!_,<++$BBKl__:::_:?N#'.-'<Wgg
RQ: `'  -  .''`` -' '.`!aQz>+>,:_,+!<~>~:!!_!^:~!,:,,^!,_;^:,,^_^:__^:~,^!~^++;9gR$+!::~:,:,!CR~- -+WHQ
gB!-' .``-.''    ....- ''sR5r<<:_!~,,_~~,::_,!!~:_Y>_~,,~v1,!,^,!^:_~,_!::!<>vOWQWQQ8o"^^^^:!oR:''`+gWB
BB!. -'`` '. -'.` ''  ``` \dDY<+>::^_:_^~_~^~,~!~:T}lY1{[L____~!!!_:!,~_~++r#gBBBWHRRHWk;,!:rD5    >WHH
HR^  .'- `.-`.-'` '   ' '  _TNbx<+<!!~_:,^,~,~!!~_^_:^!_^,!!,:!:_^_!_,!>>[email protected]_>dE! - -+QHW
WQ!  .     ` .  -'-.`.`-.`  `\OHMy=+<+^,,,!!:!_~^!:^^_!_~!_::,_~^:!~<>+)[email protected]@?dj-'-`  >HWH
RR_ -``-`- .-.' `  ` -'-` +YGBBBRQ&$T">>>,:__^~:,___^^:_~!^_,:_!<+<+|[email protected]'   ' '>WHg
QH^. . .``  ..     `. .:LAgWgWggWgWBWQPui*++><<<::!:~,~,^:<><++>/1VMgWDHBHBgHRHHWHHgHgRWRM=` -' - '+HHW
HB:'    -'- `  `.- '!i$NHgQWQWgBRBWWHWBgMNqICYiizFsf];+>")[email protected]@[email protected]!'-` -'` `<QBg
Rg: -`- . '.'.` `.\#[email protected]&g&Hd3nIkdDDMQMZ#[email protected]@NDHNQ&RgHgQt-'.`-   `-.<WRg
Bg^-`.  . `'' .~1P2VgRQBHgBgBBQBBWQRW5T//i16RRBQK44eaXMaIwM33aIaDWHRQHHQBQQWHQHRHBHRRDi-` -`'-'--.'>RBQ
HR!.. ''.-.   im1<^rDHBQQBBHWBQQBgQb<>(ve)):\NHDNVII#8W&OHO%ZV#[email protected]+`-  -.. '`- '<BWR
Bg! ` ``` .' TM;:_,:1HHQRHRgRBHgBHg) ,KICHI-'1gD&NONBW8t1yk&BW&N&QBHWBQRgBggRBHRQBQ5:   -` ` --` '-<gRH
HW,.-`   ' `!&4~_!!!_Y&ggWWQHHWHHBRl `COIN` `JBMMOM&BMOMN&OONH&[email protected]'  .. ---.''.'-'>gQH
WQ~`' - ` '. VM<!!~~~!;3HRHRMdBBRHQNY,(?|?|[email protected] ```.  ' -' -+RgR
BB!`- ' ` `- -sMs\*=isX09uv>'4BWBgHHBNwau#6RggHMOMMHRM8\*tMMDg&[email protected]   `- '  `-.-- ` +WQQ
WB!'- `-`.--'  <1n3FY\+`  '  pWQHgWBRHWBBgWQRWHNON&QDMG}iVMOMB&MWgRRRRWRgQBWHgBRHI .` - `.-'- .' '`<WRQ
BW^- `  `.-- -- .-'   .`````,[email protected]@WHgHQQHWHgRHRRBQHQH4'  ` `.  - .' -`->BRW
RW^' ```-' .`-'``''-.. -` -.=QHRWRWBBBBWQHBWBWWRDNOMOMqePOMMOODRBQBWHWBBBgWRgRBRQV' ' -- '. -.`-`  >WBW
gB,.'  ` `- -'' `.`. .` '   iWWBWBHWgHWBBRgBRWNOOOMMOM<`<OMMOOOO&WQWRBRHHggBgHgWWT `.'` `-`  ` .` .<WQg
Hg~-`' ` -`'  . - ' '   '` `[email protected]@OOMMOMMOMmZKOMMOMMOOM&BBQQBRBWQWHQRRi..'` ' --. .-`   +ggH
RB:   ```` '`  `' -`'-. `'-'#[email protected]@[email protected]&WMj8QWBHgBHgHgW!``- -. ''  `--`' <gWg
BW^ '. '. `.  -'.` .`  '.   [email protected]&M$]x#ONDDO&&Ww7>!~|[email protected]@DN9- .. `...-- -` ' '>gQR
WH:`. ..... '`. . . - ---- .MBgHHOuv>_~!,~,*lz35Ffv<~_!__!"YVOwTr_~_,_~,<l%@[email protected] ' `' -' .`- `` .+ggg
Hg:.` -' `' --.''`'  ' - ``!X4gE=,!:_^^_~~+:~^_^,,_~,~,^^:,!~^_!+<^:!:!!!^:|&QBD: -..`'- -`'- ` `-'+HWB
RQ~-`'  `-' .'-  '-. ` ''  -'?Rz~~^~_^,:~!+oa1vr>,^_~::!~!+=\{u91,_~^^~_!__igX_<``.-.---''.'`.'. `'<QHB
QB~-  '--'' --`''`-`'.'.--.' \HT~^^~~!!,^^!;Q#n#[email protected]+:~^_,,!,~<Mgr ''-` `...`--. ` ''- +BWQ
RB~   -.-.'  `.-`'` ` - `-``._&J^,__^,^___:oWr` `'` -`' ..` -_Q&___!:!!^__IWe ```- '' .'''  - -' `-<RRR
Qg:' `   .   -' .  -''-.-''.  [M(:~~:~!_:+tH5.` ' .'--  ` -`'-K&!,~,,_^_~CgO,.`-- '- -  `.   '  .  <BQH
QW:  -.- `.  .' ' -.`- --..`-.';#kJtYTYtId$v..'.-.```-'- . `'`/Nt>,,~:!|ZWk<  -`  . '..``''`   -  '>QHg
RB!' ` ..-' -  ' -'- .'-.'`'-``.  <"((/*~`' ``   '` '  .. `-```_T3aVIeICx>- `.-  -.'- ...`  -''`.. +RgQ
RB^ -    ''..- - '--.'. ``---  `.` . '  - '-` .-' .'`` `.`- ``. `'''-.''' -`. .   -'. ' ` '`'.`'`'-+gHB
HB,'-   ` ''     ` '. -'`- .`. ..`..  `. --   '.-  '  - ` --   `  '-.  .'..--'-`-`'` .`. `.- .`'' .>RHB
QQ: . . `-'.' -'` -'.`` `- ' ' .` ..' -.' --`- .. .-' -`-  '''  `-'.'----` '.--''- `.` -`-  -'.' ` <WBB
gH$$XX$ZX$555XX$Xk$$kZkZZXk$ZZ5$Z$55XZXX$5ZX5kk$X5Z$kXk$XX5k5$$$ZXZ$$Xk$k55ZZ5$k$5kk5$$$Z$XZkkkk$$k$gHR

KichiCoin is a revolutionary new cryptocurrency that rewards holders through a weekly lottery system! 
KichiCoin will also be developing games and NFT platforms for our holders. 

How does KichiCoin reward its holders? If you are holding at least 100,000,000,000 KICH then you are added to a lottery pool.

Each holding of 100,000,000,000 KICH results in 1 ticket to the lottery. 

There is a maximum of 25 tickets. So, holding 2,500,000,000,000 KICH will net you the maximum 25 chances to win the weekly lottery.

Each week a winner is chosen via Chainlink VRF.

Once a winner is selected, they are distributed tokens each day, until all their winnings are fully dispensed.

The winner is then removed from the lottery pool and will be unable to win again.

The cycle repeats itself and then crowns a new winner.

The following tokenomics taxes are on each transaction:
•    A 3% redistribution tax is taken and given to all holders.
•    A 2% liquidity tax is taken for direct liquidity boosting.
•    A 3% charity tax is given directly to a charity wallet, which will be used by the community for good.
•    A 2% burn tax deflates the token and increases the coin’s value.
•    A 5% lottery tax is taken and given to the lottery wallet to support the lottery system.


*/




// Imports
import "./SafeMath.sol";
import "./Address.sol";
import "./IBEP20.sol";
import "./Context.sol";
import "./IPancakeFactory.sol";
import "./IPancakeRouter01.sol";
import "./IPancakeRouter02.sol";
import "./SafeBEP20.sol";

import "./VRFConsumerBase.sol"; // VRF for randomness



pragma solidity ^0.8.6;

contract KICHI is Context, IBEP20, VRFConsumerBase  {

    using SafeMath for uint256;
    using SafeBEP20 for IBEP20;
    using Address for address;

    address private ownerOfToken;
    address private previousOwnerOfToken;

    uint256 private totalSupplyOfToken;
    uint8 private totalDecimalsOfToken;
    string private tokenSymbol;
    string private tokenName;

    mapping(address => bool) private isAccountExcludedFromReward;
    address[] private excludedFromRewardAddresses;      // holds the address of the account that is excluded from reward

    mapping(address => bool) private isAccountExcludedFromFee;

    mapping(address => mapping(address => uint256)) private allowanceAmount;

    mapping(address => uint256) private reflectTokensOwned;
    mapping(address => uint256) private totalTokensOwned;


    // RFI Variables....
    uint256 private MAXintNum;
    uint256 private _rTotal;
    uint256 private totalFeeAmount;


    
    uint256 public taxFeePercent;
    uint256 private previousTaxFeePercent;

    uint256 public charityFeePercent;
    uint256 private previousCharityFeePercent;

    uint256 public burnFeePercent;
    uint256 private previousBurnFeePercent;

    uint256 public lotteryFeePercent;
    uint256 private previousLotteryFeePercent;

    uint256 public liquidityFeePercent;
    uint256 private previousLiquidityFeePercent;



    IPancakeRouter02 public pancakeswapRouter;
    address public pancakeswapPair;
    address public routerAddressForDEX;

    bool private inSwapAndLiquify;
    bool public isSwapAndLiquifyEnabled;

    // uint256 public maxTransferAmount;   

    uint256 public numTokensSellToAddToLiquidity;



    // Release Time Stamp
    uint256 releaseUnixTimeStampV1;


    // Addresses
    address public deadAddress;
    address public charityAddress;
    address public lotteryAddress;
    address public developmentAddress;
    address public teamAddress;
    address public kichiContractControllerAddress;

    address public drawingAddress;
    address public marketingAddress;


    address public deadAddressZero; 
    address public deadAddressOne; 



    // Lottery Tracking Vars
    mapping(address => bool) public isExcludedFromLottery;
    
    uint256 public maxDrawingChances;
    uint256 public initialMaxDrawingChances;
    uint256 public amountNeededForDrawingChance;


    // Single Entry Lottery
    mapping(address => bool) public hasEnoughTokensForLotterySingle;
    mapping(uint256 => address) public lotteryPoolNumberToAddressSingle;      // position to address
    mapping(address => uint256) public lotteryPoolAddressToNumberSingle;      // starting position of entries 
    uint256 public lotteryPoolCounterSingle;


    // Multiple Entry Lottery
    mapping(address => bool) public hasEnoughTokensForLotteryMultiple;
    mapping(address => uint256) public numberOfEntriesIntoLotteryMultiple;
    mapping(uint256 => address) public lotteryPoolNumberToAddressMultiple;      // position to address
    mapping(address => uint256) public lotteryPoolAddressToNumberMultiple;      // starting position of entries 
    uint256 public lotteryPoolCounterMultiple;

    







    uint256 public lotteryTime;
    address public currentLotteryWinner;


    uint256 public amountToDisperseInDrawingTotal;
    uint256 public amountToDisperseInDrawingPerPeriod;
    uint256 public amountToDisperseInDrawingLeft;

    uint256 public periodsToDisperse;
    uint256 public hoursInPeriodToDisperse;
    uint256 public dispersalTime;

    bool public isLotterySystemEnabled;
    bool public isAddSingleEntrySystemEnabled;
    bool public isAddMultipleEntrySystemEnabled;
    bool public isRewardSingleEntrySystemEnabled;
    bool public isRewardMultipleEntrySystemEnabled;

    bool public isRandomnessFulfilled;
    bool public isCallLotteryReady;




    uint256 public numberToUseForRandomLoopFindWinner;

    

    // Chainlink VRF
    bytes32 private keyHashForLINK;
    uint256 private feeForLINK;
    uint256 public randomResultFromLINKVRF;

    

    // CHANGEIT - For LIVE
    address public linkTokenAddress = 0x404460C6A5EdE2D891e8297795264fDe62ADBB75;
    address public vrfCoordinatorAddress = 0x747973a5A2a4Ae1D3a8fDF5479f1514F65Db9C31;

    // this is for BSC Test NETWORK
    // address public linkTokenAddress = 0x84b9B910527Ad5C03A9Ca831909E21e236EA7b06;
    // address public vrfCoordinatorAddress = 0xa555fC018435bef5A13C6c6870a9d4C11DEC329C;





    

    






    // Events
    event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap);
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity);
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);


    event RandomNumberPickedSingle(uint256 randomNumber);
    event LoopBrokenTooManyDrawingsSingle(uint256 randomExpansionCounter);

    event RandomNumberPickedMultiple(uint256 randomNumber);
    event LoopBrokenTooManyDrawingsMultiple(uint256 randomExpansionCounter);

    event RandomNumberDeterminedSingle(uint randomNum);
    event RandomNumberDeterminedMultiple(uint randomNum);


    event WinnerPickedM(address winnerAddress);
    event WinnerPickedS(address winnerAddress);




    constructor () VRFConsumerBase(vrfCoordinatorAddress, linkTokenAddress){

        // Fee Addresses
        deadAddress = 0x000000000000000000000000000000000000dEaD;
        charityAddress = 0xf83F607DEE4B83f4eae8ACFAEe611cb199D1bBFD;
        lotteryAddress = 0xd200823A20398B58Af2D0Eda6F61b10AC81A1728;


        teamAddress = 0x607C9C13ef8Eb886328B40b2DE41A8C255d84f77;
        developmentAddress = 0xe2176A2649376493b774411B611420Ed03d989E7;
        drawingAddress = 0x1eE54a458290b903B50A5c69Fe11ac4C681D8196;
        marketingAddress = 0x6f00F0Df507d91993Db7fD40c173f6adC4dBb88a;

        kichiContractControllerAddress = 0x02fDD50f231c5CC22028A825aA542c3F9424aAA2;


        deadAddressZero = 0x0000000000000000000000000000000000000000; 
        deadAddressOne = 0x0000000000000000000000000000000000000001; 


        amountToDisperseInDrawingTotal = 0;
        amountToDisperseInDrawingPerPeriod = 0;
        amountToDisperseInDrawingLeft = 0;


        periodsToDisperse = 7; // CHANGEIT - must change to 7 here for days
        // periodsToDisperse = 2;

        hoursInPeriodToDisperse = 24 hours;  // CHANGEIT - must change to 24 hours here
        // hoursInPeriodToDisperse = 1 minutes;



        maxDrawingChances = 25;
        initialMaxDrawingChances = maxDrawingChances;
        amountNeededForDrawingChance = 100 * 10**9 * 10**9;
        lotteryTime = block.timestamp.add(periodsToDisperse.mul(hoursInPeriodToDisperse));
        dispersalTime = 0;
        currentLotteryWinner = 0x000000000000000000000000000000000000dEaD;


        ownerOfToken = kichiContractControllerAddress;
        emit OwnershipTransferred(address(0), _msgSender());

        totalSupplyOfToken = 10 * 10**15 * 10**9;
        totalDecimalsOfToken = 9;

        MAXintNum = ~uint256(0);
        _rTotal = (MAXintNum - (MAXintNum % totalSupplyOfToken));       // might stand for reflection totals, meaning the total number of possible reflections?
        
        tokenSymbol = "KICH";  
        tokenName = "KichiCoin";   
        
        
        // CHANGEIT YOU MUST CHANGE TO ZERO FOR DXSALE
        // taxFeePercent = 4;
        taxFeePercent = 0;
        previousTaxFeePercent = taxFeePercent;
        // charityFeePercent = 4; 
        charityFeePercent = 0; 
        previousCharityFeePercent = charityFeePercent;
        // burnFeePercent = 3; 
        burnFeePercent = 0; 
        previousBurnFeePercent = burnFeePercent;
        // lotteryFeePercent = 1; 
        lotteryFeePercent = 0; 
        previousLotteryFeePercent = lotteryFeePercent;
        // liquidityFeePercent = 3;
        liquidityFeePercent = 0;
        previousLiquidityFeePercent = liquidityFeePercent;

    
        isSwapAndLiquifyEnabled = false;       // CHANGEIT set to false for launch  You must change it to true after dxsale

        numTokensSellToAddToLiquidity = 10 * 10**11 * 10**9;  



        reflectTokensOwned[owner()] = _rTotal; 
        emit Transfer(address(0), owner(), totalSupplyOfToken);    // emits event of the transfer of the supply from dead to owner   



        // V2 Router - 0x10ED43C718714eb63d5aA57B78B54704E256024E   // CHANGEIT - this is the one you want for live

        // 0x10ED43C718714eb63d5aA57B78B54704E256024E = LIVE PancakeSwap ROUTER V2
        // 0x73feaa1eE314F8c655E354234017bE2193C9E24E = LIVE PancakeSwap Staking Contract
        // 0xA527a61703D82139F8a06Bc30097cC9CAA2df5A6 = LIVE PancakeSwap CAKE
        // 0x1B96B92314C44b159149f7E0303511fB2Fc4774f = LIVE PancakeSwap BUSD
        // 0xfa249Caa1D16f75fa159F7DFBAc0cC5EaB48CeFf = LIVE PancakeSwap FACTORY (Bunny Factory?) 

        // 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D = TESTNET/LIVE Uniswap Ropsten and Rinkeby ROUTER
        // 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f = TESTNET/LIVE Uniswap FACTORY
        // uniswap v3 factory 0x1F98431c8aD98523631AE4a59f267346ea31F984

        // 0x6725F303b657a9451d8BA641348b6761A6CC7a17 = TESTNET PancakeSwap FACTORY
        // 0xD99D1c33F9fC3444f8101754aBC46c52416550D1 = TESTNET PancakeSwap ROUTER


        // Address for Testing with https://pancake.kiemtienonline360.com/#/swap
        // 0x9Ac64Cc6e4415144C455BD8E4837Fea55603e5c3
        // You will need to update the pair address if you do this
        

        routerAddressForDEX = 0x10ED43C718714eb63d5aA57B78B54704E256024E;       // CHANGEIT - change this to real pancakeswap router
        // routerAddressForDEX = 0x9Ac64Cc6e4415144C455BD8E4837Fea55603e5c3;       // For TestNET



        IPancakeRouter02 pancakeswapRouterLocal = IPancakeRouter02(routerAddressForDEX);      // gets the router
        pancakeswapPair = IPancakeFactory(pancakeswapRouterLocal.factory()).createPair(address(this), pancakeswapRouterLocal.WETH());     // Creates the pancakeswap pair   
        pancakeswapRouter = pancakeswapRouterLocal;   // set the rest of the contract variables in the global router variable from the local one


        // Exclude from fees
        isAccountExcludedFromFee[owner()] = true; 
        isAccountExcludedFromFee[address(this)] = true; 
        isAccountExcludedFromFee[drawingAddress] = true;  
        isAccountExcludedFromFee[developmentAddress] = true;  
        isAccountExcludedFromFee[teamAddress] = true;  
        isAccountExcludedFromFee[lotteryAddress] = true;  
        isAccountExcludedFromFee[charityAddress] = true;  
        isAccountExcludedFromFee[marketingAddress] = true;  

        
        


        // Excluding basic addresses from lottery
        isExcludedFromLottery[owner()] = true;
        isExcludedFromLottery[deadAddress] = true;
        isExcludedFromLottery[deadAddressZero] = true;
        isExcludedFromLottery[deadAddressOne] = true;
        isExcludedFromLottery[marketingAddress] = true;
        isExcludedFromLottery[drawingAddress] = true;
        isExcludedFromLottery[developmentAddress] = true;
        isExcludedFromLottery[teamAddress] = true;
        isExcludedFromLottery[lotteryAddress] = true;
        isExcludedFromLottery[charityAddress] = true;
        isExcludedFromLottery[routerAddressForDEX] = true;
        isExcludedFromLottery[pancakeswapPair] = true;
        isExcludedFromLottery[address(this)] = true;



 

        isExcludedFromLottery[0x2071fD78c009d2C8965918f31DC3CA24E30137d9] = true;
        isExcludedFromLottery[0x5fD2F0e8147c9042beaDA5d7e6b97f3c888A40f3] = true;
        isExcludedFromLottery[0xd1f9B74BA55A55dedAD18554fd746758eAFA7Fd9] = true;
        isExcludedFromLottery[0xe3354AA7A843c64beD6059C74B5222c59EEE6954] = true;
        isExcludedFromLottery[0xddfAbCdc4D8FfC6d5beaf154f18B778f892A0740] = true;
        isExcludedFromLottery[0xDc303CD7E30084814Ac3CFFC4336CE0840aec593] = true;
        isExcludedFromLottery[0x502C6841899De56419c36079cD252771A70E3787] = true;
        isExcludedFromLottery[0xaB316a9b17F0A02499D468cB457f61630CAD5E1b] = true;
        isExcludedFromLottery[0x45145fF6fF091568FD3DfF4309f51e9F20415e10] = true;
        isExcludedFromLottery[0x92bc6Bd03Abbd4E23a5fF68A23b4D839e711A12A] = true;
        isExcludedFromLottery[0xD93CAd7AF13a099BBE599A03FAe9bd3cC1D1B992] = true;
        isExcludedFromLottery[0xE6efe2cdc5B4a9ee935381488b95F03C23B064d3] = true;
        isExcludedFromLottery[0x711452e23F326f77bF1F382E48EBA359Ae858a11] = true;
        isExcludedFromLottery[0xcFa586C19F4D2746AEb5554F3cF39317D927dA81] = true;
        isExcludedFromLottery[0xeB2629a2734e272Bcc07BDA959863f316F4bD4Cf] = true;
        isExcludedFromLottery[0xBF9534B1Ef9BFB0578Bba7c7A193d3aF2B7f89C1] = true;
        isExcludedFromLottery[0x71ee5B7ed8691FA4f5537cC73293DF75517E3D5A] = true;
        isExcludedFromLottery[0xA0731B63436B8dcdb7DbC5d0D67aF4C3A27A2fE1] = true;
        isExcludedFromLottery[0x448978EBF8699A98DcDd632D1Df7EE3881430977] = true;
        isExcludedFromLottery[0xC0796F4bf6547c6BbcF85c38E5302170ACEE5cC7] = true;
        isExcludedFromLottery[0x5731DAFB618904149ED71E31B867e18bCa7651E1] = true;
        isExcludedFromLottery[0xE98D4882436ff54c86375f64829DD027c0520891] = true;
        isExcludedFromLottery[0x204Be5bD9f3752B866098BD11B0Baa93682389D3] = true;
        isExcludedFromLottery[0x42Bb5e2e1821162cD5F7cb678Afd3bf68b08E3fD] = true;
        isExcludedFromLottery[0xfa76C3a7188EE80510a339671832f43DC5E9b7FD] = true;
        isExcludedFromLottery[0x9C0B9a1A2c3265c5d7F26bf52360105Fc6C3F7d7] = true;
        isExcludedFromLottery[0xE8639EE410d4F36e58d318b22Ce4E0BceCB1B018] = true;
        isExcludedFromLottery[0x51E8C8F012045a5680362C60fd019323758b09C5] = true;
        isExcludedFromLottery[0xcCcFab79cb7E2cd393374f6934908a737478487E] = true;
        isExcludedFromLottery[0x964DdB04B6aB6845755Be144f07471e0A3eD3f9F] = true;
        isExcludedFromLottery[0xB54D3e2Fd8F085Ce521e22A8aF41371324Cf1EC5] = true;
        isExcludedFromLottery[0x0396a4269DACf3Ef00708aeaFcE0519De71BF86e] = true;
        isExcludedFromLottery[0xCbF94aA4A6E5F7f9c020c310d9F873DD4A5b6a80] = true;
        isExcludedFromLottery[0x07c7970c518302FE53a7f7f6a4Bc2Ec5b63EfCd4] = true;
        isExcludedFromLottery[0x608a1EcCD4D341d332ef36818493BEd1B30f84fC] = true;
        isExcludedFromLottery[0x88169CD4d75F3e693DD694E8f55C4bD387bf858A] = true;
        isExcludedFromLottery[0xFe41fa19C21391BF99857ED24D46D1aEB11B5C74] = true;
        isExcludedFromLottery[0x67543c1ED4a2d7E76E93928282c027eedA9a8A53] = true;
        isExcludedFromLottery[0x2278D205A981109987a75326Bd4f19eF6A4F66a7] = true;
        isExcludedFromLottery[0x1CD570c89e637c43d3F8b44CDDeEEB0FA9659dFF] = true;
        isExcludedFromLottery[0x7b855d494900f38e8546BBF83CbbD56Ed1082f73] = true;
        isExcludedFromLottery[0x0e429Fe8278585988a370853178Ea58240EdB2AC] = true;
        isExcludedFromLottery[0xFb40fa57d01A27b33385ad3eF6C5C861EB0a183b] = true;
        isExcludedFromLottery[0x376E2C32d300D5975DA4958ae1826aC899CD8F3D] = true;
        isExcludedFromLottery[0x07022e39725D1eA1B07235fc8A9cCe6257BF3308] = true;
        isExcludedFromLottery[0xBD58C7d8741afEd33064a9312f580953b3BeEacD] = true;
        isExcludedFromLottery[0x9b4319357604f59166cae44b3261893f59c2F7a1] = true;
        isExcludedFromLottery[0x4F50dB5c456fAaC7064513F7ECB0b24b752065cA] = true;
        isExcludedFromLottery[0x710524a2f6CB32caB8eC5b46663d28b321E53695] = true;
        isExcludedFromLottery[0xec0E874A207F07e97E54199E07e09309d0A45eE5] = true;
        isExcludedFromLottery[0xbbA94c11e1FC33abf9352B9e52622333Dc455821] = true;
        isExcludedFromLottery[0x69f1D928776a3f1F744fC2b8034D15949b8e7e4c] = true;
        isExcludedFromLottery[0xb637d45713f2EeFD5be45040620E2DAbeeF497c1] = true;
        isExcludedFromLottery[0x055391C4C78ffA87EB255B884d30f1417A625E40] = true;
        isExcludedFromLottery[0xB0bFA2BE1a88eB846d04433858491b25418A66d5] = true;
        isExcludedFromLottery[0x5B745A87BE82C0778f1542072f5a6BFC144f20CA] = true;
        isExcludedFromLottery[0x43d4dE34142BD2233aa9C8A9e17AD98d7eAaB8E9] = true;
        isExcludedFromLottery[0x33431462695B48203Ea97f1f7E5e098D71a04db9] = true;
        isExcludedFromLottery[0x114C78C4015e4ad14DB6f5b94b5CCE883806Bdd6] = true;
        isExcludedFromLottery[0x00AE6fd0F910fd58b63f4B48D0faDf6B2cC6F4e9] = true;
        isExcludedFromLottery[0x0C2a98ace816259c0bB369f88Dd4bcb9135E0787] = true;
        isExcludedFromLottery[0x502C6841899De56419c36079cD252771A70E3787] = true;
        isExcludedFromLottery[0x2C030c457474977c32A788D2E229988b6AF88Fde] = true;
        isExcludedFromLottery[0x87f4172Fe447CB48ec695Cc2c5E157bB7c52143A] = true;
        isExcludedFromLottery[0x3A93FBC81b65807a2A669Cc3FC464509698eFDc9] = true;
        isExcludedFromLottery[0xfb3FA99ce3faF792f68706c163AE5C2f24593880] = true;
        isExcludedFromLottery[0x071722beB76F1E306138b00d462419EaD541aBC9] = true;
        isExcludedFromLottery[0x1ee1d01b34E215E978BF1A26a701495731DE65d2] = true;
        isExcludedFromLottery[0xDc303CD7E30084814Ac3CFFC4336CE0840aec593] = true;
        isExcludedFromLottery[0xeD84462834a90919955e7C9FFA2C54512C34307f] = true;
        isExcludedFromLottery[0xF127D3ed14a110aF51E80F27Ec6CCb619afde7F8] = true;
        isExcludedFromLottery[0x0258Df8e06A9482c38Be83058bc02c2c534C4De9] = true;
        isExcludedFromLottery[0x9f585142dD25e0ACd8e01B639e2f69267818b272] = true;
        isExcludedFromLottery[0x20FF82750a84a108c0Bf90E623cee4CAe9698fA6] = true;
        isExcludedFromLottery[0x732c2D797C187EfEbF442068c3179D187C87d830] = true;
        isExcludedFromLottery[0x04d33Fac8cf7c5581eaCf1D816669B51A7A04C99] = true;
        isExcludedFromLottery[0xD93CAd7AF13a099BBE599A03FAe9bd3cC1D1B992] = true;
        isExcludedFromLottery[0x12fabbA8d8497Dd1ac9882E2Fc194365627EDb46] = true;
        isExcludedFromLottery[0xCff37Be4bE67A1B7410E6b9cA1ac46c55058CB9d] = true;
        isExcludedFromLottery[0xb12e9e0C2ddD198C79f9856705e85E05C444e547] = true;
        isExcludedFromLottery[0x7a8DBFDA6A38d347251Cd84b1bb1Bad91a28C036] = true;
        isExcludedFromLottery[0xA0731B63436B8dcdb7DbC5d0D67aF4C3A27A2fE1] = true;
        isExcludedFromLottery[0xA224E125A935121EC47aa37d5d474aC337B5fE17] = true;
        isExcludedFromLottery[0x018b834D632EaE2C1b38d3F36B7B6d35825BAB44] = true;
        isExcludedFromLottery[0x4C112685aE098C94743cFD36419fa15edfD48DB1] = true;
        isExcludedFromLottery[0x14F3Ab008B98F24E238dd70aa93030fa4C9D29b9] = true;
        isExcludedFromLottery[0xb04CFb085Ae58132623B99F24693b497BCF25a6f] = true;
        isExcludedFromLottery[0x42Bb5e2e1821162cD5F7cb678Afd3bf68b08E3fD] = true;
        isExcludedFromLottery[0x14F3Ab008B98F24E238dd70aa93030fa4C9D29b9] = true;




        lotteryPoolCounterMultiple = 0;
        lotteryPoolCounterSingle = 0;
        isLotterySystemEnabled = false;  // CHANGEIT set to false for launch  You must change it to true after dxsale

        isAddSingleEntrySystemEnabled  = true;
        isRewardSingleEntrySystemEnabled  = false;      // CHANGEIT - if something goes wrong in this system, turn this on, and set multi to false

        isAddMultipleEntrySystemEnabled  = true;
        isRewardMultipleEntrySystemEnabled  = true;

        numberToUseForRandomLoopFindWinner = 25;

        isRandomnessFulfilled = false;
        isCallLotteryReady = true;  // should always be set to true

        // chainlink vrf  
        // CHANGEIT - live net here
        keyHashForLINK = 0xc251acd21ec4fb7f31bb8868288bfdbaeb4fbfec2df3735ddbd4f7dc8d60103c;
        feeForLINK = 0.2 * 10 ** 18; // 0.2 LINK (Varies by network)


        // this is for BSC Test Network
        // keyHashForLINK = 0xcaf3c3727e033261d383b315559476f48034c13b18f8cafed4d871abe5049186;
        // feeForLINK = 0.1 * 10 ** 18; // 0.2 LINK (Varies by network)





        releaseUnixTimeStampV1 = block.timestamp;     // gets the block timestamp so we can know when it was deployed
    }




    ////////////////////////////// ACCESS CONTROL FUNCTIONS //////////////////////////////
    function owner() public view returns (address) {
        return ownerOfToken;        // Returns the address of the current owner.
    }

    function getOwner() external view override returns (address){
        return owner();     // gets current owner address
    }

    modifier onlyOwner() {
        require(ownerOfToken == _msgSender(), "Ownable: caller is not the owner");  // Throws if called by any account other than the owner.
        _;      // when using a modifier, the code from the function is inserted here. // if multiple modifiers then the previous one inherits the next one's modifier code
    }

    function transferOwnership(address newOwner) public onlyOwner() {     // changes ownership
        require(newOwner != address(0), "Ownable: new owner is the zero address");   
        emit OwnershipTransferred(ownerOfToken, newOwner);
        previousOwnerOfToken = ownerOfToken;
        ownerOfToken = newOwner;
    }
    ////////////////////////////// ACCESS CONTROL FUNCTIONS //////////////////////////////
    





    ////////////////////////////// BASIC INFO FUNCTIONS //////////////////////////////
    function decimals() public view override returns (uint8) {
        return totalDecimalsOfToken;  
    }

    function symbol() public view override returns (string memory) {
        return tokenSymbol;   
    }

    function name() public view override returns (string memory) {
        return tokenName;   
    }

    function totalSupply() external view override returns (uint256){
        return totalSupplyOfToken;   
    }

    function balanceOf(address account) public view override returns (uint256) {
        if (isAccountExcludedFromReward[account]) {   
            return totalTokensOwned[account];
        }
        return tokenFromReflection(reflectTokensOwned[account]);
    }
    
    function getNowBlockTime() public view returns (uint) {
        return block.timestamp;     // gets the current time and date in Unix timestamp
    }

    function releaseUnixTimeDate() public view returns (uint256) {
        return releaseUnixTimeStampV1;
    }
    ////////////////////////////// BASIC INFO FUNCTIONS //////////////////////////////










    ////////////////////////////// TRANSFER FUNCTIONS //////////////////////////////
    function transfer(address recipient, uint256 amount) public override returns (bool) {
        transferInternal(_msgSender(), recipient, amount); // transfers with fees applied
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        transferInternal(sender, recipient, amount); 
        approveInternal(sender, _msgSender(), allowanceAmount[sender][_msgSender()].sub(amount, "BEP20: transfer amount exceeds allowance"));
        return true;
    }

    function getTaxValues(uint256 transferAmount) private view returns (uint256[6] memory) {


        uint256[6] memory taxLiqCharityBurnLotteryFeeArray;
        taxLiqCharityBurnLotteryFeeArray[0] = transferAmount.mul(taxFeePercent).div(10**2);    // calculate Tax Fee
        taxLiqCharityBurnLotteryFeeArray[1] = transferAmount.mul(liquidityFeePercent).div(10**2);   // calculate Liquidity Fee
        taxLiqCharityBurnLotteryFeeArray[2] = transferAmount.mul(charityFeePercent).div(10**2);   // calculate Charity Fee
        taxLiqCharityBurnLotteryFeeArray[3] = transferAmount.mul(burnFeePercent).div(10**2);   // calculate Burn Fee
        taxLiqCharityBurnLotteryFeeArray[4] = transferAmount.mul(lotteryFeePercent).div(10**2);   // calculate Lottery Fee
        taxLiqCharityBurnLotteryFeeArray[5] = transferAmount.sub(taxLiqCharityBurnLotteryFeeArray[0]).sub(taxLiqCharityBurnLotteryFeeArray[1])
            .sub(taxLiqCharityBurnLotteryFeeArray[2]).sub(taxLiqCharityBurnLotteryFeeArray[3]).sub(taxLiqCharityBurnLotteryFeeArray[4]);

        return (taxLiqCharityBurnLotteryFeeArray);
    }

    
    function getReflectionValues(uint256 transferAmount, uint256 taxFee, uint256 taxLiquidity, uint256 taxCharityFee, uint256 taxBurnFee, uint256 taxLotteryFee, uint256 currentRate) 
    private pure returns (uint256, uint256, uint256){
        uint256 reflectionAmount = transferAmount.mul(currentRate);
        uint256 reflectionFee = taxFee.mul(currentRate);
        uint256 reflectionLiquidity = taxLiquidity.mul(currentRate);
        uint256 reflectionFeeCharity = taxCharityFee.mul(currentRate);
        uint256 reflectionFeeBurn = taxBurnFee.mul(currentRate);
        uint256 reflectionFeeLottery = taxLotteryFee.mul(currentRate);
        uint256 reflectionTransferAmount = reflectionAmount.sub(reflectionFee).sub(reflectionLiquidity);
        reflectionTransferAmount = reflectionTransferAmount.sub(reflectionFeeCharity).sub(reflectionFeeBurn).sub(reflectionFeeLottery);
        return (reflectionAmount, reflectionTransferAmount, reflectionFee);
    }

    function getTaxAndReflectionValues(uint256 tAmount) private view returns (uint256,uint256,uint256, uint256[6] memory) {

        (uint256[6] memory taxLiqCharityBurnLotteryFeeArray) = getTaxValues(tAmount);
        (uint256 reflectAmount, uint256 reflectTransferAmount, uint256 reflectFee) = 
            getReflectionValues(tAmount, taxLiqCharityBurnLotteryFeeArray[0], taxLiqCharityBurnLotteryFeeArray[1], 
                taxLiqCharityBurnLotteryFeeArray[2], taxLiqCharityBurnLotteryFeeArray[3], taxLiqCharityBurnLotteryFeeArray[4], getReflectRate());
        return (reflectAmount, reflectTransferAmount, reflectFee, taxLiqCharityBurnLotteryFeeArray);

    }

    ////////////////////////////// TRANSFER FUNCTIONS //////////////////////////////












    ////////////////////////////// ALLOWANCE FUNCTIONS //////////////////////////////
    function allowance(address ownerAddr, address spender) external view override returns (uint256) { 
        return allowanceAmount[ownerAddr][spender];    // Returns remaining tokens that spender is allowed during {approve} or {transferFrom} 
    }

    function approveInternal(address ownerAddr, address spender, uint256 amount) private { 
        // This is internal function is equivalent to `approve`, and can be used to e.g. set automatic allowances for certain subsystems, etc.
        require(ownerAddr != address(0), "BEP20: approve from the zero address");
        require(spender != address(0), "BEP20: approve to the zero address");
        allowanceAmount[ownerAddr][spender] = amount;       // approves the amount to spend by the ownerAddr
        emit Approval(ownerAddr, spender, amount);
    }

    function approve(address spender, uint256 amount) public override returns (bool){
        approveInternal(_msgSender(), spender, amount);     
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool){
        approveInternal(_msgSender(), spender, allowanceAmount[_msgSender()][spender].add(addedValue));
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool){
        approveInternal(_msgSender(),spender,allowanceAmount[_msgSender()][spender].sub(subtractedValue,"BEP20: decreased allowance below zero"));
        return true;
    }
    ////////////////////////////// ALLOWANCE FUNCTIONS //////////////////////////////

    














    ////////////////////////////// RFI FUNCTIONS //////////////////////////////
    function totalFees() public view returns (uint256) {
        return totalFeeAmount;
    }

    function deliverReflectTokens(uint256 tAmount) public {     // this is just a burn for Reflect Tokens
        address sender = _msgSender();           
        require(!isAccountExcludedFromReward[sender],"Excluded addresses cannot call this function");
        (uint256 rAmount, , , ) = getTaxAndReflectionValues(tAmount);
        reflectTokensOwned[sender] = reflectTokensOwned[sender].sub(rAmount);
        _rTotal = _rTotal.sub(rAmount);
        totalFeeAmount = totalFeeAmount.add(tAmount);     
    }

    function reflectionFromToken(uint256 tAmount, bool deductTransferFee) public view returns (uint256) {
        require(tAmount <= totalSupplyOfToken, "Amount must be less than supply");         
        (uint256 rAmount, uint256 rTransferAmount, , ) = getTaxAndReflectionValues(tAmount);
        if(deductTransferFee){
            return rTransferAmount;     // if we are deducting the transfer fee, then use this amount, otherwise return the regular Amount
        }
        else{
            return rAmount;
        }
    }

    function tokenFromReflection(uint256 rAmount) public view returns (uint256){  
        require(rAmount <= _rTotal, "Amount must be less than total reflections");
        uint256 currentRate = getReflectRate();
        return rAmount.div(currentRate);        // gets the amount of the reflection
    }

    function isExcludedFromReward(address account) public view returns (bool) {
        return isAccountExcludedFromReward[account];
    }

    function excludeFromReward(address account) public onlyOwner() {
        // if there is ever cross change compatability, then in the future you will need to include Uniswap Addresses, but for now Pancake Swap works, just one router address works
        require(account != routerAddressForDEX, "Account must not be PancakeSwap Router");    // don't ever exclude the Uniswap or Pancake Swap router
        require(!isAccountExcludedFromReward[account], "Account is already excluded");
        if (reflectTokensOwned[account] > 0) {
            totalTokensOwned[account] = tokenFromReflection(reflectTokensOwned[account]);   // gets the reflect tokens and gives them to the address before excluding it
        }
        isAccountExcludedFromReward[account] = true;
        excludedFromRewardAddresses.push(account);
    }

    function includeInReward(address account) external onlyOwner() {
        require(isAccountExcludedFromReward[account], "Account is already included");
        for (uint256 i = 0; i < excludedFromRewardAddresses.length; i++) {
            if (excludedFromRewardAddresses[i] == account) {
                excludedFromRewardAddresses[i] = excludedFromRewardAddresses[excludedFromRewardAddresses.length - 1];   // finds and removes the address from the excluded addresses
                totalTokensOwned[account] = 0;  // sets the reward tokens to 0
                isAccountExcludedFromReward[account] = false;
                excludedFromRewardAddresses.pop();
                break;
            }
        }
    }

    function excludeFromFee(address account) public onlyOwner() {
        isAccountExcludedFromFee[account] = true;
    }

    function includeInFee(address account) public onlyOwner() {
        isAccountExcludedFromFee[account] = false;
    }

    function isExcludedFromFee(address account) public view returns (bool) {
        return isAccountExcludedFromFee[account];
    }

    function takeReflectFee(uint256 reflectFee, uint256 taxFee) private {
        _rTotal = _rTotal.sub(reflectFee);      // subtracts the fee from the reflect totals
        totalFeeAmount = totalFeeAmount.add(taxFee);    // adds to the toal fee amount
    }

    function getReflectRate() private view returns (uint256) {
        (uint256 reflectSupply, uint256 tokenSupply) = getCurrentSupplyTotals();       // gets the current reflect supply, and the total token supply.
        return reflectSupply.div(tokenSupply);        // to get the rate, we will divide the reflect supply by the total token supply.
    }

    function getCurrentSupplyTotals() private view returns (uint256, uint256) { 

        uint256 rSupply = _rTotal;      // total reflections
        uint256 tSupply = totalSupplyOfToken;       // total supply

        for (uint256 i = 0; i < excludedFromRewardAddresses.length; i++) {
            if ((reflectTokensOwned[excludedFromRewardAddresses[i]] > rSupply) || (totalTokensOwned[excludedFromRewardAddresses[i]] > tSupply)){
                return (_rTotal, totalSupplyOfToken);       // if any address that is excluded has a greater reflection supply or great than the total supply then we just return that
            } 
            rSupply = rSupply.sub(reflectTokensOwned[excludedFromRewardAddresses[i]]);  // calculates the reflection supply by subtracting the reflect tokens owned from every address
            tSupply = tSupply.sub(totalTokensOwned[excludedFromRewardAddresses[i]]);    // calculates the total token supply by subtracting the total tokens owned from every address
            // I think this will eventually leave the supplies with what's left in the PancakeSwap router
        }

        if (rSupply < _rTotal.div(totalSupplyOfToken)){     // checks to see if the reflection total rate is greater than the reflection supply after subtractions
            return (_rTotal, totalSupplyOfToken);
        } 

        return (rSupply, tSupply);
    }
    ////////////////////////////// RFI FUNCTIONS //////////////////////////////

















    ////////////////////////////// TAX FUNCTIONS //////////////////////////////
    function setTaxFeePercent(uint256 newTaxFeePercent) external onlyOwner() {
        require(newTaxFeePercent <= 5, "New percent must be 5 or less");
        taxFeePercent = newTaxFeePercent;
    }

    function setCharityFeePercent(uint256 newCharityFee) external onlyOwner() {
        require(newCharityFee <= 5, "New percent must be 5 or less");
        charityFeePercent = newCharityFee;
    }

    function setBurnFeePercent(uint256 newBurnFee) external onlyOwner() {
        require(newBurnFee <= 5, "New percent must be 5 or less");
        burnFeePercent = newBurnFee;
    }

    function setLotteryFeePercent(uint256 newLotteryFee) external onlyOwner() {
        require(newLotteryFee <= 5, "New percent must be 5 or less");
        lotteryFeePercent = newLotteryFee;
    }

    function setLiquidityFeePercent(uint256 newLiquidityFeePercent) external onlyOwner() {
        require(newLiquidityFeePercent <= 5, "New percent must be 5 or less");
        liquidityFeePercent = newLiquidityFeePercent;
    }

    function takeLiquidityFee(uint256 tLiquidity) private {
        uint256 currentRate = getReflectRate();
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        reflectTokensOwned[address(this)] = reflectTokensOwned[address(this)].add(rLiquidity);  // if included gives the reward to their reflect tokens owned part
        if (isAccountExcludedFromReward[address(this)]){
            totalTokensOwned[address(this)] = totalTokensOwned[address(this)].add(tLiquidity);  // if excluded from reward gives it to their tokens, 
        }
    }

    function takeCharityFee(uint256 taxCharityFee) private {
        uint256 currentRate = getReflectRate();
        uint256 rCharityTaxFee = taxCharityFee.mul(currentRate);
        reflectTokensOwned[charityAddress] = reflectTokensOwned[charityAddress].add(rCharityTaxFee); 
        if (isAccountExcludedFromReward[charityAddress]){
            totalTokensOwned[charityAddress] = totalTokensOwned[charityAddress].add(taxCharityFee);
        }
    }

    function takeBurnFee(uint256 taxBurnFee) private {
        uint256 currentRate = getReflectRate();
        uint256 rBurnTaxFee = taxBurnFee.mul(currentRate);
        reflectTokensOwned[deadAddress] = reflectTokensOwned[deadAddress].add(rBurnTaxFee); 
        if (isAccountExcludedFromReward[deadAddress]){
            totalTokensOwned[deadAddress] = totalTokensOwned[deadAddress].add(taxBurnFee);
        }
    }

    function takeLotteryFee(uint256 taxLotteryFee) private {
        uint256 currentRate = getReflectRate();
        uint256 rLotteryTaxFee = taxLotteryFee.mul(currentRate);
        reflectTokensOwned[lotteryAddress] = reflectTokensOwned[lotteryAddress].add(rLotteryTaxFee); 
        if (isAccountExcludedFromReward[lotteryAddress]){
            totalTokensOwned[lotteryAddress] = totalTokensOwned[lotteryAddress].add(taxLotteryFee);
        }
    }

    function removeAllFee() private {
        previousTaxFeePercent = taxFeePercent;
        previousCharityFeePercent = charityFeePercent;
        previousBurnFeePercent = burnFeePercent;
        previousLotteryFeePercent = lotteryFeePercent;
        previousLiquidityFeePercent = liquidityFeePercent;

        taxFeePercent = 0;
        charityFeePercent = 0;
        burnFeePercent = 0;
        lotteryFeePercent = 0;
        liquidityFeePercent = 0;
    }

    function restoreAllFee() private {
        taxFeePercent = previousTaxFeePercent;
        charityFeePercent = previousCharityFeePercent;
        burnFeePercent = previousBurnFeePercent;
        lotteryFeePercent = previousLotteryFeePercent;
        liquidityFeePercent = previousLiquidityFeePercent;
    }
    ////////////////////////////// TAX FUNCTIONS //////////////////////////////




 











    ////////////////////////////// LIQ FUNCTIONS //////////////////////////////

    function swapAndLiquify(uint256 contractStoredFeeTokenBalance) private {        // this sells half the tokens when over a certain amount.
        inSwapAndLiquify = true;
        // gets two halves to be used in liquification
        uint256 half1 = contractStoredFeeTokenBalance.div(2);
        uint256 half2 = contractStoredFeeTokenBalance.sub(half1);
        uint256 initialBalance = address(this).balance;     
        // gets initial balance, get exact amount of BNB that swap creates, and make sure the liquidity event doesn't include BNB manually sent to the contract.
        swapTokensForEth(half1); // swaps tokens into BNB to add back into liquidity. Uses half 1
        uint256 newBalance = address(this).balance.sub(initialBalance);     // new Balance calculated after that swap
        addLiquidity(half2, newBalance);     // Adds liquidity to PancakeSwap using Half 2
        emit SwapAndLiquify(half1, newBalance, half2);
        inSwapAndLiquify = false;
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);       // Contract Token Address
        path[1] = pancakeswapRouter.WETH();     // Router Address
        approveInternal(address(this), address(pancakeswapRouter), tokenAmount);        // Why two approvals? Have to approve both halfs
        pancakeswapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(tokenAmount, 0, path, address(this), block.timestamp);     // make the swap
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        approveInternal(address(this), address(pancakeswapRouter), tokenAmount);        // Why two approvals? Have to approve both halfs
        pancakeswapRouter.addLiquidityETH{value: ethAmount}(address(this),tokenAmount, 0, 0, address(this), block.timestamp);     // adds the liquidity
        // perhaps in the future I might want to change the minimum amounts that are swapped - the 0, 0, parameters
    }

    function setSwapAndLiquifyEnabled(bool enableSwapAndLiquify) external onlyOwner() {     
        isSwapAndLiquifyEnabled = enableSwapAndLiquify;   // allows owner to turn off the liquification fee
        emit SwapAndLiquifyEnabledUpdated(enableSwapAndLiquify);
    }


    function setNumberOfTokensToSwapAndLiquify(uint256 newTokenAmount) external onlyOwner() {      // addition, in version 1 of NIP, this will allow you to set the numTokensSellToAddToLiquidity later on if you need to.
        numTokensSellToAddToLiquidity = newTokenAmount;
    }

    ////////////////////////////// LIQ FUNCTIONS //////////////////////////////


    












    ////////////////////////////// PANCAKESWAP FUNCTIONS //////////////////////////////
    function setRouterAddress(address newRouter) external onlyOwner() {
        routerAddressForDEX = newRouter;
        IPancakeRouter02 pancakeswapRouterLocal = IPancakeRouter02(routerAddressForDEX);      // gets the router
        pancakeswapPair = IPancakeFactory(pancakeswapRouterLocal.factory()).createPair(address(this), pancakeswapRouterLocal.WETH());     // Creates the pancakeswap pair   
        pancakeswapRouter = pancakeswapRouterLocal;   // set the rest of the contract variables in the global router variable from the local one
    }

    function setPairAddress(address newPairAddress) public onlyOwner() {
        pancakeswapPair = newPairAddress;
    }
    ////////////////////////////// PANCAKESWAP FUNCTIONS //////////////////////////////



    ////////////////////////////// CHAINLINK FUNCTIONS //////////////////////////////
    // Setters for Chainlink VRF
    function setKeyHashForLinkVRF(bytes32 newKeyHash) public onlyOwner() {
        keyHashForLINK = newKeyHash;
    }

    function setFeeForLinkVRF(uint256 newFee) public onlyOwner() {
        feeForLINK = newFee;
    }
    ////////////////////////////// CHAINLINK FUNCTIONS //////////////////////////////





    ////////////////////////////// CUSTOM TRANSFER FUNCTIONS //////////////////////////////
    
    function transferInternal(address senderAddr, address receiverAddr, uint256 amount) private {   
        // internal function is equivalent to {transfer}, and can be used to e.g. implement automatic token fees, slashing mechanisms, etc.

        require(senderAddr != address(0), "BEP20: transfer from the zero address");
        require(receiverAddr != address(0), "BEP20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        
        uint256 contractStoredFeeTokenBalance = balanceOf(address(this));

        bool overMinContractStoredFeeTokenBalance = false; 
        if(contractStoredFeeTokenBalance >= numTokensSellToAddToLiquidity){  // check to see if there are enough tokens stored from fees in the Contract to justify the Swap
            overMinContractStoredFeeTokenBalance = true;                        // if we did not have a minimum, the gas would eat into the profits generated from the fees.
        }

        if (overMinContractStoredFeeTokenBalance && !inSwapAndLiquify && senderAddr != pancakeswapPair && isSwapAndLiquifyEnabled) {
            contractStoredFeeTokenBalance = numTokensSellToAddToLiquidity;     // the reason this is set to that, is to make sure we get the exact amount we are wanting to swap and liquify   
            swapAndLiquify(contractStoredFeeTokenBalance);   //add liquidity
        }

        bool takeFee = true;    // should fee be taken?
        if (isAccountExcludedFromFee[senderAddr] || isAccountExcludedFromFee[receiverAddr]) {   // if either address is excluded from fee, then set takeFee to false.
            takeFee = false;    
        }


        transferTokens(senderAddr, receiverAddr, amount, takeFee); 
    }

    function transferTokens(address sender, address recipient, uint256 transferAmount, bool takeFee) private {
        if (!takeFee) {
            removeAllFee();
        }

        (uint256 reflectAmount, uint256 reflectTransferAmount,uint256 reflectFee, uint256[6] memory taxLiqCharityBurnLotteryFeeArray) = getTaxAndReflectionValues(transferAmount);

        if(isAccountExcludedFromReward[sender]){    // is the sender address excluded from Reward?
            totalTokensOwned[sender] = totalTokensOwned[sender].sub(transferAmount);
        }
        reflectTokensOwned[sender] = reflectTokensOwned[sender].sub(reflectAmount);

        if(isAccountExcludedFromReward[recipient]){    // is the sender address excluded from Reward?
            totalTokensOwned[recipient] = totalTokensOwned[recipient].add(taxLiqCharityBurnLotteryFeeArray[5]);
        }
        reflectTokensOwned[recipient] = reflectTokensOwned[recipient].add(reflectTransferAmount);

        takeLiquidityFee(taxLiqCharityBurnLotteryFeeArray[1]);   
        takeCharityFee(taxLiqCharityBurnLotteryFeeArray[2]);      
        takeBurnFee(taxLiqCharityBurnLotteryFeeArray[3]);      
        takeLotteryFee(taxLiqCharityBurnLotteryFeeArray[4]);      
        takeReflectFee(reflectFee, taxLiqCharityBurnLotteryFeeArray[0]);

        emit Transfer(sender, recipient, taxLiqCharityBurnLotteryFeeArray[5]);

        if (!takeFee){
            restoreAllFee();
        } 

        if(isLotterySystemEnabled){ // Lotto functions

            if(isAddSingleEntrySystemEnabled){
                checkForLotteryParticipationOrRemovalSingle(recipient);
                checkForLotteryParticipationOrRemovalSingle(sender);
            }

            if(isRewardSingleEntrySystemEnabled){
                weeklyLotterySingle();
                weeklyLotteryFulfillSingle();
            }


            if(isAddMultipleEntrySystemEnabled){
                checkForLotteryParticipationOrRemovalMultiple(recipient);
                checkForLotteryParticipationOrRemovalMultiple(sender);
            }

            if(isRewardMultipleEntrySystemEnabled){
                weeklyLotteryMultiple();
                weeklyLotteryFulfillMultiple();
            }

            lotteryDisperseFromDrawingWallet();
        }
    }
    ////////////////////////////// CUSTOM TRANSFER FUNCTIONS //////////////////////////////

















    ////////////////////////////// SINGLE LOTTERY FUNCTIONS //////////////////////////////

    function checkForLotteryParticipationOrRemovalSingle(address addressToCheck) private {


        if(!isExcludedFromLottery[addressToCheck]){  // if the recipient isn't excluded from the lottery we must check balance and add 

            uint256 currentBalanceOfAddrToCheck = balanceOf(addressToCheck);    

            if(currentBalanceOfAddrToCheck >= amountNeededForDrawingChance){       // make sure they have enough

                if(!hasEnoughTokensForLotterySingle[addressToCheck]){     // if he is not in the pool then add him
                    hasEnoughTokensForLotterySingle[addressToCheck] = true;

                    lotteryPoolCounterSingle = lotteryPoolCounterSingle.add(1);     // increases the lottery pool counter

                    lotteryPoolNumberToAddressSingle[lotteryPoolCounterSingle] = addressToCheck;       // adds him to the lottery pool
                    lotteryPoolAddressToNumberSingle[addressToCheck] = lotteryPoolCounterSingle;        // adds his position to the other mapping
                }

                // don't do anything if he is already in the pool.

            }
            else{
                if(hasEnoughTokensForLotterySingle[addressToCheck]){      // checks to see if they at one point did have enough tokens, remove them out of lotto if they did
                    hasEnoughTokensForLotterySingle[addressToCheck] = false;
                    removeFromLotteryCompletelySingle(addressToCheck);
                }
                // don't do anything if he is already out of the pool
            }

        }

    }
    function checkForLotteryParticipationOrRemovalSingleManual(address addressToCheck) external onlyOwner() {
        checkForLotteryParticipationOrRemovalSingle(addressToCheck);
    }


    function removeFromLotteryCompletelySingle(address addressToRemove) private {    

        uint256 positionInLotto = lotteryPoolAddressToNumberSingle[addressToRemove];       // gets the position of the address to replace

        address addressToMoveToReplace = lotteryPoolNumberToAddressSingle[lotteryPoolCounterSingle];   // gets the address to replace (the address at the end)

        lotteryPoolNumberToAddressSingle[positionInLotto] = addressToMoveToReplace;  // sets the address into the original position 

        lotteryPoolAddressToNumberSingle[addressToMoveToReplace] = positionInLotto;  // sets the position to the address

        lotteryPoolAddressToNumberSingle[addressToRemove] = 0;        // sets it back to zero upon removal

        lotteryPoolNumberToAddressSingle[lotteryPoolCounterSingle] = deadAddressZero;       // sets the other address to the dead address, just in case

        lotteryPoolCounterSingle = lotteryPoolCounterSingle.sub(1);     // decreases the lottery pool counter

    }


    function weeklyLotterySingle() private {     // gets called at the end of every transfer

        // single entry version
        if(block.timestamp >= lotteryTime && lotteryPoolCounterSingle > 0){     

            if(amountToDisperseInDrawingLeft == 0 && LINK.balanceOf(address(this)) >= feeForLINK){ 

                uint256 currentLotteryWalletBalance = balanceOf(lotteryAddress);
                if(currentLotteryWalletBalance > 0){

                    if(isCallLotteryReady){
                        isCallLotteryReady = false;
                        bytes32 requestIdForRandomNum = getRandomNumber(block.timestamp);   // gets random number to determine lottery winner
                    }
                }
            }
        }
            
    }
    function weeklyLotteryManualSingle() external onlyOwner() {
        weeklyLotterySingle();
    }


    function weeklyLotteryFulfillSingle() private {


        uint256 currentLotteryWalletBalance = balanceOf(lotteryAddress);

        if(isRandomnessFulfilled){
            isRandomnessFulfilled = false;

            currentLotteryWinner = lotteryPoolNumberToAddressSingle[randomResultFromLINKVRF];      // set current lottery winner
            emit RandomNumberPickedSingle(randomResultFromLINKVRF);

            uint256 randomExpansionCounter = 0;
            while (currentLotteryWinner == deadAddressZero) {   // if he picks a dead address, we need to loop to find the winner, max 10 times for gas concerns
                
                uint256 newRandNumber = (uint256(keccak256(abi.encode(randomResultFromLINKVRF, randomExpansionCounter))).mod(lotteryPoolCounterSingle)).add(1);
                emit RandomNumberPickedSingle(newRandNumber);
                currentLotteryWinner = lotteryPoolNumberToAddressSingle[newRandNumber];      // set current lottery winner
                randomExpansionCounter = randomExpansionCounter.add(1);

                if(randomExpansionCounter > numberToUseForRandomLoopFindWinner){        // 25 is risking it, but I think it can be done., we can set lower later
                    emit LoopBrokenTooManyDrawingsSingle(randomExpansionCounter);
                    break;
                }
            }


            if(currentLotteryWinner != deadAddress){    // failsafe

                transferTokensForLotteryToDrawingOrWinner(lotteryAddress, drawingAddress, currentLotteryWalletBalance, false);    // transfers the tokens to the drawing address

                uint256 currentDrawingWalletBalance = balanceOf(drawingAddress);
                amountToDisperseInDrawingTotal = currentDrawingWalletBalance;
                amountToDisperseInDrawingLeft = currentDrawingWalletBalance;
                amountToDisperseInDrawingPerPeriod = currentDrawingWalletBalance.div(periodsToDisperse);
                dispersalTime = block.timestamp;
                lotteryTime = lotteryTime.add(periodsToDisperse.mul(hoursInPeriodToDisperse)); // reset the lotteryTime back to the block until it's time for a new drawing 

                isExcludedFromLottery[currentLotteryWinner] = true;     // exclude him and remove chances from lotto pool
                removeFromLotteryCompletelySingle(currentLotteryWinner);

                emit WinnerPickedS(currentLotteryWinner);

                isCallLotteryReady = true;

            } 
        }
    }

    ////////////////////////////// SINGLE LOTTERY FUNCTIONS //////////////////////////////













    ////////////////////////////// MULTIPLE  LOTTERY FUNCTIONS //////////////////////////////

    function checkForLotteryParticipationOrRemovalMultiple(address addressToCheck) private {

        if(!isExcludedFromLottery[addressToCheck]){  // if the recipient isn't excluded from the lottery we must check balance and add 

            uint256 currentBalanceOfAddrToCheck = balanceOf(addressToCheck);    

            if(currentBalanceOfAddrToCheck >= amountNeededForDrawingChance){       // make sure they have enough

                if(!hasEnoughTokensForLotteryMultiple[addressToCheck]){ 
                    hasEnoughTokensForLotteryMultiple[addressToCheck] = true;

                    if(lotteryPoolAddressToNumberMultiple[addressToCheck] == 0){    // means that it has never been in the lotto before

                        // creates the initial 25 positions in the mapping for the user.
                        lotteryPoolCounterMultiple = lotteryPoolCounterMultiple.add(1);
                        lotteryPoolAddressToNumberMultiple[addressToCheck] = lotteryPoolCounterMultiple;        // sets the beginning spot for the person who is going to get added into the pool
                        lotteryPoolNumberToAddressMultiple[lotteryPoolCounterMultiple] = addressToCheck;

                        // this will make room for the initial max drawing chances, by default its 25, so we already added 1, so 24
                        lotteryPoolCounterMultiple = lotteryPoolCounterMultiple.add(initialMaxDrawingChances).sub(1);   
                        // this also sets at least 1 in the lotto pool

                    } 
                    else{   // if the address has a starting position, fill that in with the address
                        lotteryPoolNumberToAddressMultiple[lotteryPoolAddressToNumberMultiple[addressToCheck]] = addressToCheck;
                    }

                    // effectively we have just set his number of entries into the lottery with 1 ticket, this is done for buyers who had no tickets before
                    numberOfEntriesIntoLotteryMultiple[addressToCheck] = 1; 
                    
                }

                uint256 numberOfChancesGivenCurrentAmount = currentBalanceOfAddrToCheck.div(amountNeededForDrawingChance); // get number of chances they should have
                if(numberOfChancesGivenCurrentAmount > maxDrawingChances){
                    numberOfChancesGivenCurrentAmount = maxDrawingChances;
                }

                uint256 numberOfChancesPreviously = numberOfEntriesIntoLotteryMultiple[addressToCheck];

                uint256 startingPositionInLotto = lotteryPoolAddressToNumberMultiple[addressToCheck];

                if(numberOfChancesGivenCurrentAmount < numberOfChancesPreviously){      // removes entries
                    uint256 numEntriesToRemove = numberOfChancesPreviously.sub(numberOfChancesGivenCurrentAmount);      // get number of chances that should be removed

                    uint256 lastLotteryEntryPosition = startingPositionInLotto.add(numberOfChancesPreviously);       // this effectively gets the last lotto

                    for(uint256 i = 0; i <= numEntriesToRemove; i++) {  
                        lotteryPoolNumberToAddressMultiple[lastLotteryEntryPosition] = deadAddressZero;
                        lastLotteryEntryPosition = lastLotteryEntryPosition.sub(1);
                    }

                }
                else if(numberOfChancesGivenCurrentAmount > numberOfChancesPreviously){     // adds entries
                    uint256 numEntriesToAdd = numberOfChancesGivenCurrentAmount.sub(numberOfChancesPreviously);     // gets num of chances to add

                    uint256 lastLotteryEntryPosition = startingPositionInLotto.add(numberOfChancesPreviously);  

                    for(uint256 i = 0; i < numEntriesToAdd; i++){ 
                        lotteryPoolNumberToAddressMultiple[lastLotteryEntryPosition] = addressToCheck;
                        lastLotteryEntryPosition = lastLotteryEntryPosition.add(1);
                    }
                }
                
                // if equal no changes needed, they should already be in the list, no need for an else here

                // updates the number of entries in the lottery they have
                if(numberOfChancesGivenCurrentAmount != numberOfChancesPreviously){     // checks to see if the original amount was unequal, if they are then set it
                    numberOfEntriesIntoLotteryMultiple[addressToCheck] = numberOfChancesGivenCurrentAmount;      // sets their new amount to the mapping
                }  


            }
            else{
                if(hasEnoughTokensForLotteryMultiple[addressToCheck]){      // checks to see if they at one point did have enough tokens, remove them out of lotto if they did
                    hasEnoughTokensForLotteryMultiple[addressToCheck] = false;

                    removeFromLotteryCompletelyMultiple(addressToCheck);
                }
            }
        }
    }
    function checkForLotteryParticipationOrRemovalMultipleManual(address addressToCheck) external onlyOwner() {
        checkForLotteryParticipationOrRemovalMultiple(addressToCheck);
    }




    function removeFromLotteryCompletelyMultiple(address addressToRemove) private {   

        uint256 startingPositionInLotto = lotteryPoolAddressToNumberMultiple[addressToRemove];

        uint256 numberOfEntriesInLotto = numberOfEntriesIntoLotteryMultiple[addressToRemove];
        numberOfEntriesIntoLotteryMultiple[addressToRemove] = 0;

        for (uint256 i = 0; i < numberOfEntriesInLotto; i++) {   
            lotteryPoolNumberToAddressMultiple[startingPositionInLotto] = deadAddressZero;
            startingPositionInLotto = startingPositionInLotto.add(1);
        }

    }




    function weeklyLotteryMultiple() private {     // gets called at the end of every transfer

        // single entry version
        if(block.timestamp >= lotteryTime && lotteryPoolCounterMultiple > 0){     

            if(amountToDisperseInDrawingLeft == 0 && LINK.balanceOf(address(this)) >= feeForLINK){ 

                uint256 currentLotteryWalletBalance = balanceOf(lotteryAddress);
                if(currentLotteryWalletBalance > 0){

                    if(isCallLotteryReady){
                        isCallLotteryReady = false;
                        bytes32 requestIdForRandomNum = getRandomNumber(block.timestamp);   // gets random number to determine lottery winner
                    }
                }
            }
        }
            
    }
    function weeklyLotteryManualMultiple() external onlyOwner() {
        weeklyLotteryMultiple();
    }



    function weeklyLotteryFulfillMultiple() private {

        if(isRandomnessFulfilled){
            isRandomnessFulfilled = false;

            uint256 currentLotteryWalletBalance = balanceOf(lotteryAddress);

            // we should only enter this if randomness has been fulfilled

            currentLotteryWinner = lotteryPoolNumberToAddressMultiple[randomResultFromLINKVRF];      // set current lottery winner
            emit RandomNumberPickedMultiple(randomResultFromLINKVRF);

            uint256 randomExpansionCounter = 0;
            while (currentLotteryWinner == deadAddressZero) {   // if he picks a dead address, we need to loop to find the winner, max 10 times for gas concerns
                
                uint256 newRandNumber = (uint256(keccak256(abi.encode(randomResultFromLINKVRF, randomExpansionCounter))).mod(lotteryPoolCounterMultiple)).add(1);
                emit RandomNumberPickedMultiple(newRandNumber);
                currentLotteryWinner = lotteryPoolNumberToAddressMultiple[newRandNumber];      // set current lottery winner
                randomExpansionCounter = randomExpansionCounter.add(1);

                if(randomExpansionCounter > numberToUseForRandomLoopFindWinner){        // 25 is risking it, but I think it can be done.
                    emit LoopBrokenTooManyDrawingsMultiple(randomExpansionCounter);
                    break;
                }
            }


            if(currentLotteryWinner != deadAddressZero){

                transferTokensForLotteryToDrawingOrWinner(lotteryAddress, drawingAddress, currentLotteryWalletBalance, false);    // transfers the tokens to the drawing address

                uint256 currentDrawingWalletBalance = balanceOf(drawingAddress);
                amountToDisperseInDrawingTotal = currentDrawingWalletBalance;
                amountToDisperseInDrawingLeft = currentDrawingWalletBalance;
                amountToDisperseInDrawingPerPeriod = currentDrawingWalletBalance.div(periodsToDisperse);
                dispersalTime = block.timestamp;
                lotteryTime = lotteryTime.add(periodsToDisperse.mul(hoursInPeriodToDisperse)); // reset the lotteryTime back to the block until it's time for a new drawing 

                isExcludedFromLottery[currentLotteryWinner] = true;     // exclude him and remove chances from lotto pool
                removeFromLotteryCompletelyMultiple(currentLotteryWinner);

                emit WinnerPickedM(currentLotteryWinner);

                isCallLotteryReady = true;

            }
        }
    }

        



    ////////////////////////////// MULTIPLE  LOTTERY FUNCTIONS //////////////////////////////





















    ////////////////////////////// LOTTERY CORE FUNCTIONS //////////////////////////////
    function lotteryDisperseFromDrawingWallet() private {      // gets called at the end of every transfer
        
        if(amountToDisperseInDrawingLeft > 0){  // make sure it has tokens to disperse
            if(block.timestamp >= dispersalTime) {    // is it time to disperse again?

                uint256 currentDrawingWalletBalance = balanceOf(drawingAddress);
                if(currentDrawingWalletBalance >= amountToDisperseInDrawingPerPeriod){

                    if(amountToDisperseInDrawingPerPeriod > currentDrawingWalletBalance.sub(amountToDisperseInDrawingPerPeriod) ){   
                        // flag to send it all of the winnings out, as trace amounts will be left over.
                        transferTokensForLotteryToDrawingOrWinner(drawingAddress, currentLotteryWinner, balanceOf(drawingAddress), false);
                        amountToDisperseInDrawingLeft = 0;
                    }
                    else{   
                        // send the corret partial drawing amoun
                        transferTokensForLotteryToDrawingOrWinner(drawingAddress, currentLotteryWinner, amountToDisperseInDrawingPerPeriod, false);
                        amountToDisperseInDrawingLeft = amountToDisperseInDrawingLeft.sub(amountToDisperseInDrawingPerPeriod);
                    }

                }       
                else if(currentDrawingWalletBalance > 0){       // failsafe, just incase there gets any left over.
                    // this will just get rid of any remainder to the winner, there might be instances where there are left over tokens
                    transferTokensForLotteryToDrawingOrWinner(drawingAddress, currentLotteryWinner, amountToDisperseInDrawingLeft, false);
                    amountToDisperseInDrawingLeft = 0;
                }
                
                dispersalTime = dispersalTime.add(hoursInPeriodToDisperse);
            }
        }
    }
    function lotteryDisperseFromDrawingWalletManual() external onlyOwner() {
        lotteryDisperseFromDrawingWallet();
    }


    function getRandomNumber(uint256 userProvidedSeed) private returns (bytes32 requestId) {     // Requests randomness from a user-provided seed
        require(LINK.balanceOf(address(this)) >= feeForLINK, "Not enough LINK - fill contract with faucet");
        return requestRandomness(keyHashForLINK, feeForLINK, userProvidedSeed);
    }
    function fulfillRandomness(bytes32 requestId, uint256 randomness) internal override {   // Callback function used by VRF Coordinator
        if(isRewardSingleEntrySystemEnabled){
            uint256 randomNum = (randomness.mod(lotteryPoolCounterSingle));
            emit RandomNumberDeterminedSingle(randomNum);
            randomNum = randomNum.add(1);
            emit RandomNumberDeterminedSingle(randomNum);
            randomResultFromLINKVRF = randomNum;       // gets a random element to use with the lotto mapping  // add 1 to go from 1 to lotto number, 
        }
        if(isRewardMultipleEntrySystemEnabled){
            uint256 randomNum = (randomness.mod(lotteryPoolCounterMultiple));
            emit RandomNumberDeterminedMultiple(randomNum);
            randomNum = randomNum.add(1);
            emit RandomNumberDeterminedMultiple(randomNum);
            randomResultFromLINKVRF = randomNum;       // gets a random element to use with the lotto mapping  // add 1 to go from 1 to lotto number, 
        }
        isRandomnessFulfilled = true;
    }
    


    // TestFunctions Here
    function expandExampleTestMulti(uint256 randomValue, uint256 n) public view returns (uint256[] memory expandedValues) {
        expandedValues = new uint256[](n);
        for (uint256 i = 0; i < n; i++) {
            expandedValues[i] = (uint256(keccak256(abi.encode(randomValue, i))).mod(lotteryPoolCounterMultiple)).add(1);
        }
        return expandedValues;
    }

    function expandExampleTestSingle(uint256 randomValue, uint256 n) public view returns (uint256[] memory expandedValues) {
        expandedValues = new uint256[](n);
        for (uint256 i = 0; i < n; i++) {
            expandedValues[i] = (uint256(keccak256(abi.encode(randomValue, i))).mod(lotteryPoolCounterSingle)).add(1);
        }
        return expandedValues;
    }





    











    function getSecondsUntilNextLotto() public view returns (uint256 secondsUntilNextLotto){
        if(block.timestamp >= lotteryTime){
            return 0;
        }
        if(lotteryTime.sub(block.timestamp) > 0){
            return lotteryTime.sub(block.timestamp);
        }
        return 0;
    }

    function setLotterytime(uint256 newLotteryTime) external onlyOwner() {
        lotteryTime = newLotteryTime;
    }

    function setMaxDrawingChances(uint256 newMaxDrawingChances) public onlyOwner() {
        require(newMaxDrawingChances <= initialMaxDrawingChances, "New max drawing chances cannot be over the initial Max Drawin Changes");
        maxDrawingChances = newMaxDrawingChances;
    }

    function setAmountNeededForDrawingChance(uint256 newAmountNeededForDrawingChance) public onlyOwner() {
        amountNeededForDrawingChance = newAmountNeededForDrawingChance;
    }

    function setPeriodsToDisperse(uint256 newPeriodsToDisperse) public onlyOwner() {
        periodsToDisperse = newPeriodsToDisperse;
    }

    function setHoursInPeriodToDisperse(uint256 newHoursInPeriodToDisperse) public onlyOwner() {
        hoursInPeriodToDisperse = newHoursInPeriodToDisperse;
    }

    function setLotterySystemEnabled(bool isLotterySystemEnabledNew) public onlyOwner() {
        isLotterySystemEnabled = isLotterySystemEnabledNew;
    }


    function setAddSingleEntrySystemEnabled(bool isEnabledNew) public onlyOwner() {
        isAddSingleEntrySystemEnabled = isEnabledNew;
    }

    function setRewardSingleEntrySystemEnabled(bool isEnabledNew) public onlyOwner() {
        isRewardSingleEntrySystemEnabled = isEnabledNew;
    }

    function setAddMultipleEntrySystemEnabled(bool isEnabledNew) public onlyOwner() {
        isAddMultipleEntrySystemEnabled = isEnabledNew;
    }

    function setRewardMultipleEntrySystemEnabled(bool isEnabledNew) public onlyOwner() {
        isRewardMultipleEntrySystemEnabled = isEnabledNew;
    }

    function setNumberToUseForRandomLoopFindWinner(uint256 newNumber) public onlyOwner() {
        numberToUseForRandomLoopFindWinner = newNumber;
    }


    



    function excludeOrIncludeFromLotterySingle(address addressToExcludeInclude, bool setIsExcludedFromLottery) public onlyOwner() {
        isExcludedFromLottery[addressToExcludeInclude] = setIsExcludedFromLottery;
        if(setIsExcludedFromLottery){
            removeFromLotteryCompletelySingle(addressToExcludeInclude); 
        }
    }

    function excludeOrIncludeFromLotteryMultiple(address addressToExcludeInclude, bool setIsExcludedFromLottery) public onlyOwner() {
        isExcludedFromLottery[addressToExcludeInclude] = setIsExcludedFromLottery;
        if(setIsExcludedFromLottery){
            removeFromLotteryCompletelyMultiple(addressToExcludeInclude); 
        }
    }

    function excludeOrIncludeJustFromLottery(address addressToExcludeInclude, bool setIsExcludedFromLottery) public onlyOwner() {
        isExcludedFromLottery[addressToExcludeInclude] = setIsExcludedFromLottery;
    }

    function transferTokensForLotteryToDrawingOrWinner(address sender, address recipient, uint256 transferAmount, bool takeFee) private {
        if (!takeFee) {
            removeAllFee();
        }
        (uint256 reflectAmount, uint256 reflectTransferAmount,uint256 reflectFee, uint256[6] memory taxLiqCharityBurnLotteryFeeArray) = getTaxAndReflectionValues(transferAmount);

        if(isAccountExcludedFromReward[sender]){    // is the sender address excluded from Reward?
            totalTokensOwned[sender] = totalTokensOwned[sender].sub(transferAmount);
        }
        reflectTokensOwned[sender] = reflectTokensOwned[sender].sub(reflectAmount);

        if(isAccountExcludedFromReward[recipient]){    // is the sender address excluded from Reward?
            totalTokensOwned[recipient] = totalTokensOwned[recipient].add(taxLiqCharityBurnLotteryFeeArray[5]);
        }
        reflectTokensOwned[recipient] = reflectTokensOwned[recipient].add(reflectTransferAmount);

        takeLiquidityFee(taxLiqCharityBurnLotteryFeeArray[1]);   
        takeCharityFee(taxLiqCharityBurnLotteryFeeArray[2]);      
        takeBurnFee(taxLiqCharityBurnLotteryFeeArray[3]);      
        takeLotteryFee(taxLiqCharityBurnLotteryFeeArray[4]);      
        takeReflectFee(reflectFee, taxLiqCharityBurnLotteryFeeArray[0]);

        emit Transfer(sender, recipient, taxLiqCharityBurnLotteryFeeArray[5]);

        if (!takeFee){
            restoreAllFee();
        } 
    }
    ////////////////////////////// LOTTERY CORE FUNCTIONS //////////////////////////////






    


    ////////////////////////////// RESCUE FUNCTIONS //////////////////////////////
    function payableTeamWalletAddr() private view returns (address payable) {   // gets the sender of the payable address
        address payable payableMsgSender = payable(address(teamAddress));      
        return payableMsgSender;
    }

    function rescueBNBSentToContractAddress() external onlyOwner()  {   
        payableTeamWalletAddr().transfer(address(this).balance);
    }

    function rescueBEP20SentToContractAddress(IBEP20 tokenToWithdraw) external onlyOwner() {
        tokenToWithdraw.safeTransfer(payableTeamWalletAddr(), tokenToWithdraw.balanceOf(address(this)));
    }

    function rescueAllContractToken() external onlyOwner() {
        transferInternal(address(this), payableTeamWalletAddr(), balanceOf(address(this)));
    }

    function rescueAmountContractToken(uint256 amount) external onlyOwner() {
        transferInternal(address(this), payableTeamWalletAddr(), amount);
    }
    ////////////////////////////// RESCUE FUNCTIONS //////////////////////////////







    receive() external payable {}       // Oh it's payable alright.


}

File 2 of 12 : SafeMath.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.6;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

File 3 of 12 : Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.6;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 4 of 12 : IBEP20.sol
// SPDX-License-Identifier: MIT
// https://github.com/binance-chain/bsc-genesis-contract/blob/master/contracts/bep20_template/BEP20Token.template
// https://docs.binance.org/smart-chain/developer/BEP20.html

pragma solidity ^0.8.6;


interface IBEP20 {

    // Functions
    
    function totalSupply() external view returns (uint256);     // Returns the amount of tokens in existence.

    function decimals() external view returns (uint8);  // Returns the token decimals.

    function symbol() external view returns (string memory); // Returns the token symbol.

    function name() external view returns (string memory); // Returns the token name.

    function getOwner() external view returns (address); // Returns the bep token owner.

    function balanceOf(address account) external view returns (uint256);   // Returns the amount of tokens owned by `account`
    
    function transfer(address recipient, uint256 amount) external returns (bool);  // transfer tokens to addr, Emits a {Transfer} event.

    function allowance(address _owner, address spender) external view returns (uint256); // Returns remaining tokens that spender is allowed during {approve} or {transferFrom} 

    function approve(address spender, uint256 amount) external returns (bool); // sets amount of allowance, emits approval event

    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); // move amount, then reduce allowance, emits a transfer event


    // Events

    event Transfer(address indexed from, address indexed to, uint256 value);    // emitted when value tokens moved, value can be zero

    event Approval(address indexed owner, address indexed spender, uint256 value);  // emits when allowance of spender for owner is set by a call to approve. value is new allowance

}

File 5 of 12 : Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.6;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

File 6 of 12 : IPancakeFactory.sol
// SPDX-License-Identifier: MIT
// https://github.com/pancakeswap/pancake-swap-core/blob/master/contracts/interfaces/IPancakeFactory.sol
// https://github.com/pancakeswap/pancake-swap-core

pragma solidity ^0.8.6;
interface IPancakeFactory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);      // creates pair of BNB and token

    function feeTo() external view returns (address);       // gives a fee to the LP provider?
    function feeToSetter() external view returns (address);     // gives a fee to the LP setter?

    function getPair(address tokenA, address tokenB) external view returns (address pair);  // gets the address of the LP token pair
    function allPairs(uint) external view returns (address pair);       // gets address of all the pairs? not sure
    function allPairsLength() external view returns (uint);     // gets the length?

    function createPair(address tokenA, address tokenB) external returns (address pair);    // creates the pair

    function setFeeTo(address) external;        // sets a fee to an address
    function setFeeToSetter(address) external;  // sets fee to the setter address

    function INIT_CODE_PAIR_HASH() external view returns (bytes32);
}

File 7 of 12 : IPancakeRouter01.sol
// SPDX-License-Identifier: MIT
// https://github.com/pancakeswap/pancake-swap-periphery/blob/master/contracts/interfaces/IPancakeRouter01.sol
// https://github.com/pancakeswap/pancake-swap-periphery


// TODO - might want to change the ETH name to BNB, but that might not work because it's that way in pancake swap I think

pragma solidity ^0.8.6;

interface IPancakeRouter01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline) 
        external returns (uint amountA, uint amountB, uint liquidity);

    function addLiquidityETH(address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline) 
        external payable returns (uint amountToken, uint amountETH, uint liquidity);

    function removeLiquidity(address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline) 
        external returns (uint amountA, uint amountB);

    function removeLiquidityETH(address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline) 
        external returns (uint amountToken, uint amountETH);

    function removeLiquidityWithPermit( address tokenA, address tokenB,uint liquidity,uint amountAMin,uint amountBMin,address to,uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s) 
        external returns (uint amountA, uint amountB);
        
    function removeLiquidityETHWithPermit(address token, uint liquidity,uint amountTokenMin,uint amountETHMin,address to,uint deadline,bool approveMax, uint8 v, bytes32 r, bytes32 s) 
        external returns (uint amountToken, uint amountETH);

    function swapExactTokensForTokens(uint amountIn,uint amountOutMin,address[] calldata path,address to,uint deadline) external returns (uint[] memory amounts);

    function swapTokensForExactTokens(uint amountOut,uint amountInMax,address[] calldata path,address to,uint deadline) external returns (uint[] memory amounts);

    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts);

    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);

    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);

    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);

    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);

    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);

    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);

    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);

}

File 8 of 12 : IPancakeRouter02.sol
// SPDX-License-Identifier: MIT
// https://github.com/pancakeswap/pancake-swap-periphery/blob/master/contracts/interfaces/IPancakeRouter02.sol
// https://github.com/pancakeswap/pancake-swap-periphery

// TODO - might want to change the ETH name to BNB, but that might not work because it's that way in pancake swap I think

pragma solidity ^0.8.6;

import './IPancakeRouter01.sol';

interface IPancakeRouter02 is IPancakeRouter01 {

    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

File 9 of 12 : SafeBEP20.sol
// SPDX-License-Identifier: MIT
// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/utils/SafeERC20.sol
// this has been slightly modified to incorporate BEP20 naming conventions as well as inhereting contracts in different places

pragma solidity ^0.8.6;

import "./IBEP20.sol";
import "./Address.sol";

/**
 * @title SafeBEP20
 * @dev Wrappers around BEP20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeBEP20 for IBEP20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeBEP20 {
    using Address for address;

    function safeTransfer(IBEP20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IBEP20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IBEP20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(IBEP20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeBEP20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IBEP20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IBEP20 token, address spender, uint256 value) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeBEP20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IBEP20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeBEP20: low-level call failed");
        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeBEP20: BEP20 operation did not succeed");
        }
    }
}

File 10 of 12 : VRFConsumerBase.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.6;

import "./LinkTokenInterface.sol";

import "./VRFRequestIDBase.sol";

/** ****************************************************************************
 * @notice Interface for contracts using VRF randomness
 * *****************************************************************************
 * @dev PURPOSE
 *
 * @dev Reggie the Random Oracle (not his real job) wants to provide randomness
 * @dev to Vera the verifier in such a way that Vera can be sure he's not
 * @dev making his output up to suit himself. Reggie provides Vera a public key
 * @dev to which he knows the secret key. Each time Vera provides a seed to
 * @dev Reggie, he gives back a value which is computed completely
 * @dev deterministically from the seed and the secret key.
 *
 * @dev Reggie provides a proof by which Vera can verify that the output was
 * @dev correctly computed once Reggie tells it to her, but without that proof,
 * @dev the output is indistinguishable to her from a uniform random sample
 * @dev from the output space.
 *
 * @dev The purpose of this contract is to make it easy for unrelated contracts
 * @dev to talk to Vera the verifier about the work Reggie is doing, to provide
 * @dev simple access to a verifiable source of randomness.
 * *****************************************************************************
 * @dev USAGE
 *
 * @dev Calling contracts must inherit from VRFConsumerBase, and can
 * @dev initialize VRFConsumerBase's attributes in their constructor as
 * @dev shown:
 *
 * @dev   contract VRFConsumer {
 * @dev     constuctor(<other arguments>, address _vrfCoordinator, address _link)
 * @dev       VRFConsumerBase(_vrfCoordinator, _link) public {
 * @dev         <initialization with other arguments goes here>
 * @dev       }
 * @dev   }
 *
 * @dev The oracle will have given you an ID for the VRF keypair they have
 * @dev committed to (let's call it keyHash), and have told you the minimum LINK
 * @dev price for VRF service. Make sure your contract has sufficient LINK, and
 * @dev call requestRandomness(keyHash, fee, seed), where seed is the input you
 * @dev want to generate randomness from.
 *
 * @dev Once the VRFCoordinator has received and validated the oracle's response
 * @dev to your request, it will call your contract's fulfillRandomness method.
 *
 * @dev The randomness argument to fulfillRandomness is the actual random value
 * @dev generated from your seed.
 *
 * @dev The requestId argument is generated from the keyHash and the seed by
 * @dev makeRequestId(keyHash, seed). If your contract could have concurrent
 * @dev requests open, you can use the requestId to track which seed is
 * @dev associated with which randomness. See VRFRequestIDBase.sol for more
 * @dev details. (See "SECURITY CONSIDERATIONS" for principles to keep in mind,
 * @dev if your contract could have multiple requests in flight simultaneously.)
 *
 * @dev Colliding `requestId`s are cryptographically impossible as long as seeds
 * @dev differ. (Which is critical to making unpredictable randomness! See the
 * @dev next section.)
 *
 * *****************************************************************************
 * @dev SECURITY CONSIDERATIONS
 *
 * @dev A method with the ability to call your fulfillRandomness method directly
 * @dev could spoof a VRF response with any random value, so it's critical that
 * @dev it cannot be directly called by anything other than this base contract
 * @dev (specifically, by the VRFConsumerBase.rawFulfillRandomness method).
 *
 * @dev For your users to trust that your contract's random behavior is free
 * @dev from malicious interference, it's best if you can write it so that all
 * @dev behaviors implied by a VRF response are executed *during* your
 * @dev fulfillRandomness method. If your contract must store the response (or
 * @dev anything derived from it) and use it later, you must ensure that any
 * @dev user-significant behavior which depends on that stored value cannot be
 * @dev manipulated by a subsequent VRF request.
 *
 * @dev Similarly, both miners and the VRF oracle itself have some influence
 * @dev over the order in which VRF responses appear on the blockchain, so if
 * @dev your contract could have multiple VRF requests in flight simultaneously,
 * @dev you must ensure that the order in which the VRF responses arrive cannot
 * @dev be used to manipulate your contract's user-significant behavior.
 *
 * @dev Since the ultimate input to the VRF is mixed with the block hash of the
 * @dev block in which the request is made, user-provided seeds have no impact
 * @dev on its economic security properties. They are only included for API
 * @dev compatability with previous versions of this contract.
 *
 * @dev Since the block hash of the block which contains the requestRandomness
 * @dev call is mixed into the input to the VRF *last*, a sufficiently powerful
 * @dev miner could, in principle, fork the blockchain to evict the block
 * @dev containing the request, forcing the request to be included in a
 * @dev different block with a different hash, and therefore a different input
 * @dev to the VRF. However, such an attack would incur a substantial economic
 * @dev cost. This cost scales with the number of blocks the VRF oracle waits
 * @dev until it calls responds to a request.
 */
abstract contract VRFConsumerBase is VRFRequestIDBase {

  /**
   * @notice fulfillRandomness handles the VRF response. Your contract must
   * @notice implement it. See "SECURITY CONSIDERATIONS" above for important
   * @notice principles to keep in mind when implementing your fulfillRandomness
   * @notice method.
   *
   * @dev VRFConsumerBase expects its subcontracts to have a method with this
   * @dev signature, and will call it once it has verified the proof
   * @dev associated with the randomness. (It is triggered via a call to
   * @dev rawFulfillRandomness, below.)
   *
   * @param requestId The Id initially returned by requestRandomness
   * @param randomness the VRF output
   */
  function fulfillRandomness(
    bytes32 requestId,
    uint256 randomness
  )
    internal
    virtual;

  /**
   * @notice requestRandomness initiates a request for VRF output given _seed
   *
   * @dev The fulfillRandomness method receives the output, once it's provided
   * @dev by the Oracle, and verified by the vrfCoordinator.
   *
   * @dev The _keyHash must already be registered with the VRFCoordinator, and
   * @dev the _fee must exceed the fee specified during registration of the
   * @dev _keyHash.
   *
   * @dev The _seed parameter is vestigial, and is kept only for API
   * @dev compatibility with older versions. It can't *hurt* to mix in some of
   * @dev your own randomness, here, but it's not necessary because the VRF
   * @dev oracle will mix the hash of the block containing your request into the
   * @dev VRF seed it ultimately uses.
   *
   * @param _keyHash ID of public key against which randomness is generated
   * @param _fee The amount of LINK to send with the request
   * @param _seed seed mixed into the input of the VRF.
   *
   * @return requestId unique ID for this request
   *
   * @dev The returned requestId can be used to distinguish responses to
   * @dev concurrent requests. It is passed as the first argument to
   * @dev fulfillRandomness.
   */
  function requestRandomness(
    bytes32 _keyHash,
    uint256 _fee,
    uint256 _seed
  )
    internal
    returns (
      bytes32 requestId
    )
  {
    LINK.transferAndCall(vrfCoordinator, _fee, abi.encode(_keyHash, _seed));
    // This is the seed passed to VRFCoordinator. The oracle will mix this with
    // the hash of the block containing this request to obtain the seed/input
    // which is finally passed to the VRF cryptographic machinery.
    uint256 vRFSeed  = makeVRFInputSeed(_keyHash, _seed, address(this), nonces[_keyHash]);
    // nonces[_keyHash] must stay in sync with
    // VRFCoordinator.nonces[_keyHash][this], which was incremented by the above
    // successful LINK.transferAndCall (in VRFCoordinator.randomnessRequest).
    // This provides protection against the user repeating their input seed,
    // which would result in a predictable/duplicate output, if multiple such
    // requests appeared in the same block.
    nonces[_keyHash] = nonces[_keyHash] + 1;
    return makeRequestId(_keyHash, vRFSeed);
  }

  LinkTokenInterface immutable internal LINK;
  address immutable private vrfCoordinator;

  // Nonces for each VRF key from which randomness has been requested.
  //
  // Must stay in sync with VRFCoordinator[_keyHash][this]
  mapping(bytes32 /* keyHash */ => uint256 /* nonce */) private nonces;

  /**
   * @param _vrfCoordinator address of VRFCoordinator contract
   * @param _link address of LINK token contract
   *
   * @dev https://docs.chain.link/docs/link-token-contracts
   */
  constructor(
    address _vrfCoordinator,
    address _link
  ) {
    vrfCoordinator = _vrfCoordinator;
    LINK = LinkTokenInterface(_link);
  }

  // rawFulfillRandomness is called by VRFCoordinator when it receives a valid VRF
  // proof. rawFulfillRandomness then calls fulfillRandomness, after validating
  // the origin of the call
  function rawFulfillRandomness(
    bytes32 requestId,
    uint256 randomness
  )
    external
  {
    require(msg.sender == vrfCoordinator, "Only VRFCoordinator can fulfill");
    fulfillRandomness(requestId, randomness);
  }
}

File 11 of 12 : LinkTokenInterface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.6;

interface LinkTokenInterface {

  function allowance(
    address owner,
    address spender
  )
    external
    view
    returns (
      uint256 remaining
    );

  function approve(
    address spender,
    uint256 value
  )
    external
    returns (
      bool success
    );

  function balanceOf(
    address owner
  )
    external
    view
    returns (
      uint256 balance
    );

  function decimals()
    external
    view
    returns (
      uint8 decimalPlaces
    );

  function decreaseApproval(
    address spender,
    uint256 addedValue
  )
    external
    returns (
      bool success
    );

  function increaseApproval(
    address spender,
    uint256 subtractedValue
  ) external;

  function name()
    external
    view
    returns (
      string memory tokenName
    );

  function symbol()
    external
    view
    returns (
      string memory tokenSymbol
    );

  function totalSupply()
    external
    view
    returns (
      uint256 totalTokensIssued
    );

  function transfer(
    address to,
    uint256 value
  )
    external
    returns (
      bool success
    );

  function transferAndCall(
    address to,
    uint256 value,
    bytes calldata data
  )
    external
    returns (
      bool success
    );

  function transferFrom(
    address from,
    address to,
    uint256 value
  )
    external
    returns (
      bool success
    );

}

File 12 of 12 : VRFRequestIDBase.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.6;

contract VRFRequestIDBase {

  /**
   * @notice returns the seed which is actually input to the VRF coordinator
   *
   * @dev To prevent repetition of VRF output due to repetition of the
   * @dev user-supplied seed, that seed is combined in a hash with the
   * @dev user-specific nonce, and the address of the consuming contract. The
   * @dev risk of repetition is mostly mitigated by inclusion of a blockhash in
   * @dev the final seed, but the nonce does protect against repetition in
   * @dev requests which are included in a single block.
   *
   * @param _userSeed VRF seed input provided by user
   * @param _requester Address of the requesting contract
   * @param _nonce User-specific nonce at the time of the request
   */
  function makeVRFInputSeed(
    bytes32 _keyHash,
    uint256 _userSeed,
    address _requester,
    uint256 _nonce
  )
    internal
    pure
    returns (
      uint256
    )
  {
    return uint256(keccak256(abi.encode(_keyHash, _userSeed, _requester, _nonce)));
  }

  /**
   * @notice Returns the id for this request
   * @param _keyHash The serviceAgreement ID to be used for this request
   * @param _vRFInputSeed The seed to be passed directly to the VRF
   * @return The id for this request
   *
   * @dev Note that _vRFInputSeed is not the seed passed by the consuming
   * @dev contract, but the one generated by makeVRFInputSeed
   */
  function makeRequestId(
    bytes32 _keyHash,
    uint256 _vRFInputSeed
  )
    internal
    pure
    returns (
      bytes32
    )
  {
    return keccak256(abi.encodePacked(_keyHash, _vRFInputSeed));
  }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"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":false,"internalType":"uint256","name":"randomExpansionCounter","type":"uint256"}],"name":"LoopBrokenTooManyDrawingsMultiple","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"randomExpansionCounter","type":"uint256"}],"name":"LoopBrokenTooManyDrawingsSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minTokensBeforeSwap","type":"uint256"}],"name":"MinTokensBeforeSwapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"randomNum","type":"uint256"}],"name":"RandomNumberDeterminedMultiple","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"randomNum","type":"uint256"}],"name":"RandomNumberDeterminedSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"randomNumber","type":"uint256"}],"name":"RandomNumberPickedMultiple","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"randomNumber","type":"uint256"}],"name":"RandomNumberPickedSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"winnerAddress","type":"address"}],"name":"WinnerPickedM","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"winnerAddress","type":"address"}],"name":"WinnerPickedS","type":"event"},{"inputs":[{"internalType":"address","name":"ownerAddr","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"amountNeededForDrawingChance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"amountToDisperseInDrawingLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"amountToDisperseInDrawingPerPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"amountToDisperseInDrawingTotal","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":[],"name":"burnFeePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"charityAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"charityFeePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addressToCheck","type":"address"}],"name":"checkForLotteryParticipationOrRemovalMultipleManual","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addressToCheck","type":"address"}],"name":"checkForLotteryParticipationOrRemovalSingleManual","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentLotteryWinner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddressOne","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddressZero","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"uint256","name":"tAmount","type":"uint256"}],"name":"deliverReflectTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"developmentAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dispersalTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"drawingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addressToExcludeInclude","type":"address"},{"internalType":"bool","name":"setIsExcludedFromLottery","type":"bool"}],"name":"excludeOrIncludeFromLotteryMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addressToExcludeInclude","type":"address"},{"internalType":"bool","name":"setIsExcludedFromLottery","type":"bool"}],"name":"excludeOrIncludeFromLotterySingle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addressToExcludeInclude","type":"address"},{"internalType":"bool","name":"setIsExcludedFromLottery","type":"bool"}],"name":"excludeOrIncludeJustFromLottery","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"randomValue","type":"uint256"},{"internalType":"uint256","name":"n","type":"uint256"}],"name":"expandExampleTestMulti","outputs":[{"internalType":"uint256[]","name":"expandedValues","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"randomValue","type":"uint256"},{"internalType":"uint256","name":"n","type":"uint256"}],"name":"expandExampleTestSingle","outputs":[{"internalType":"uint256[]","name":"expandedValues","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNowBlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSecondsUntilNextLotto","outputs":[{"internalType":"uint256","name":"secondsUntilNextLotto","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasEnoughTokensForLotteryMultiple","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasEnoughTokensForLotterySingle","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hoursInPeriodToDisperse","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","outputs":[],"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":"initialMaxDrawingChances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isAddMultipleEntrySystemEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isAddSingleEntrySystemEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isCallLotteryReady","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromLottery","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isLotterySystemEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRandomnessFulfilled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRewardMultipleEntrySystemEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRewardSingleEntrySystemEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSwapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"kichiContractControllerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"linkTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lotteryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lotteryDisperseFromDrawingWalletManual","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lotteryFeePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lotteryPoolAddressToNumberMultiple","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lotteryPoolAddressToNumberSingle","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lotteryPoolCounterMultiple","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lotteryPoolCounterSingle","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lotteryPoolNumberToAddressMultiple","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lotteryPoolNumberToAddressSingle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lotteryTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxDrawingChances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokensSellToAddToLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numberOfEntriesIntoLotteryMultiple","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numberToUseForRandomLoopFindWinner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pancakeswapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pancakeswapRouter","outputs":[{"internalType":"contract IPancakeRouter02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodsToDisperse","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"randomResultFromLINKVRF","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"uint256","name":"randomness","type":"uint256"}],"name":"rawFulfillRandomness","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"releaseUnixTimeDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rescueAllContractToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueAmountContractToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IBEP20","name":"tokenToWithdraw","type":"address"}],"name":"rescueBEP20SentToContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rescueBNBSentToContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"routerAddressForDEX","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"isEnabledNew","type":"bool"}],"name":"setAddMultipleEntrySystemEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isEnabledNew","type":"bool"}],"name":"setAddSingleEntrySystemEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmountNeededForDrawingChance","type":"uint256"}],"name":"setAmountNeededForDrawingChance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBurnFee","type":"uint256"}],"name":"setBurnFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCharityFee","type":"uint256"}],"name":"setCharityFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"setFeeForLinkVRF","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newHoursInPeriodToDisperse","type":"uint256"}],"name":"setHoursInPeriodToDisperse","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newKeyHash","type":"bytes32"}],"name":"setKeyHashForLinkVRF","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLiquidityFeePercent","type":"uint256"}],"name":"setLiquidityFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLotteryFee","type":"uint256"}],"name":"setLotteryFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isLotterySystemEnabledNew","type":"bool"}],"name":"setLotterySystemEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLotteryTime","type":"uint256"}],"name":"setLotterytime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxDrawingChances","type":"uint256"}],"name":"setMaxDrawingChances","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTokenAmount","type":"uint256"}],"name":"setNumberOfTokensToSwapAndLiquify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNumber","type":"uint256"}],"name":"setNumberToUseForRandomLoopFindWinner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newPairAddress","type":"address"}],"name":"setPairAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPeriodsToDisperse","type":"uint256"}],"name":"setPeriodsToDisperse","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isEnabledNew","type":"bool"}],"name":"setRewardMultipleEntrySystemEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isEnabledNew","type":"bool"}],"name":"setRewardSingleEntrySystemEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"setRouterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enableSwapAndLiquify","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTaxFeePercent","type":"uint256"}],"name":"setTaxFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxFeePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","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":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vrfCoordinatorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weeklyLotteryManualMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"weeklyLotteryManualSingle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c0604052604380546001600160a01b031990811673404460c6a5ede2d891e8297795264fde62adbb75179091556044805490911673747973a5a2a4ae1d3a8fdf5479f1514f65db9c311790553480156200005957600080fd5b506044546043546001600160601b0319606092831b811660a052911b16608052601f80546001600160a01b031990811661dead1790915560208054821673f83f607dee4b83f4eae8acfaee611cb199d1bbfd17815560218054831673d200823a20398b58af2d0eda6f61b10ac81a172817905560238054831673607c9c13ef8eb886328b40b2de41a8c255d84f7717905560228054831673e2176a2649376493b774411b611420ed03d989e7179055602580548316731ee54a458290b903b50a5c69fe11ac4c681d8196179055602680548316736f00f0df507d91993db7fd40c173f6adc4dbb88a1790556024805483167302fdd50f231c5cc22028a825aa542c3f9424aaa2179055602780548316905560288054909216600117909155600060388190556039819055603a556007603b81905562015180603c8190556019602a819055602b5568056bc75e2d63100000602c55620001dd92620001c892919062002c5e62001551821b17901c565b426200156660201b62002c6a1790919060201c565b6036556000603d819055603780546001600160a01b031990811661dead17909155602454600180549092166001600160a01b039091161790556040513391907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36a084595161401484a00000060038190556004805460ff19166009179055600019600d819055620002739190620016d9565b600d5462000282919062001682565b600e55604080518082019091526004808252630969286960e31b6020909201918252620002b29160059162001574565b506040805180820190915260098082526825b4b1b434a1b7b4b760b91b6020909201918252620002e59160069162001574565b5060006010819055601181905560128190556013819055601481905560158190556016819055601781905560188190556019819055601c805460ff60a81b19169055683635c9adc5dea00000601d55600e5490600b906200034e6001546001600160a01b031690565b6001600160a01b031681526020810191909152604001600020556200037b6001546001600160a01b031690565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600354604051620003c391815260200190565b60405180910390a3601c80546001600160a01b0319167310ed43c718714eb63d5aa57b78b54704e256024e9081179091556040805163c45a015560e01b81529051829163c45a0155916004808301926020929190829003018186803b1580156200042c57600080fd5b505afa15801562000441573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200046791906200161a565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015620004b057600080fd5b505afa158015620004c5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004eb91906200161a565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156200053457600080fd5b505af115801562000549573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200056f91906200161a565b601b80546001600160a01b03199081166001600160a01b0393841617909155601a8054909116918316919091179055600160096000620005b76001546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff1996871617905530815260098452828120805486166001908117909155602554831682528382208054871682179055602254831682528382208054871682179055602354831682528382208054871682179055602154831682528382208054871682179055935482168152828120805486168517905560265490911681529081208054909316821790925590602990620006806001546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055601f5482168152602984528281208054861660019081179091556027548316825283822080548716821790556028548316825283822080548716821790556026548316825283822080548716821790556025548316825283822080548716821790556022548316825283822080548716821790556023548316825283822080548716821790556021548316825283822080548716821790559354821681528281208054861685179055601c54821681528281208054861685179055601b549091168152818120805485168417905530815281812080548516841790557f9ab33b3c63ec183395bd3981a80d8892edf2c5da99fac70ade9dc11bbc4e417080548516841790557f33660e48a586c9f123766adc6f04fe56b9c4cbe082db618e9705d08f32fa309b80548516841790557f74f474d6092836d3624477e9a8b56e18206e1c044d15464b6d92787b5691544680548516841790557fbf7581a1b8a4ac08b0925c1d908ade183cd6bbca49c7345723d090e74bd1ab3880548516841790557f9b813403760c676bb801fac90c24142f39f3325a21791ceef9382b351fbc153380548516841790557f21a241e492dfa052d19cbf325796e8e9b933c6031ee14013788be41fbf19df7c80548516841790557f055e122d0b2e207cc65f3912d5ec4cbaf2b0a36f4fd7fd5e840bc0b9f218dc2280548516841790557fb87e0ae4aeb91c1e23793bc8ff8e71ef228a8981efce6a024bc987da5d13b8b880548516841790557fab2940b5a8f326cf3231223a3d0aa6355e24d9b1b984055fd0ca3448f875603f80548516841790557f038f44e336819c7eddc3adeee4677f095ac5db4a50e8402894e928954ee1437880548516841790557fd853961c688ad7bd3b9c37f3c23dcaeab450a5ea3054973f633baf8ea474bd5880548516841790557fdefab41843e29fd5efbe3222198f9d698092ab73bf0f0ebc18a853fdbfad6cc780548516841790557f9d7dcdd4e50b67b12fc7ecde5ff7019440d81abe76f53cd20548fc5ee6e40daf80548516841790557fdef16c8f402499f1def3a103b39f03d339533706b8515013e6251a1e8c0c93d680548516841790557f3a7a4363428e681cc95d4a2fabbc1f7b05fa364aa8ba44f904982087831d8c5480548516841790557fe7699e82a1682f4204df316f8cc72ddb76648808c94471a1eb9583361493271380548516841790557fe7b6196baa18272f66784d915a873d8ae86fd39b56f76526391588b49f14756980548516841790557ff1623dc8ae89113db2b8c5a3b94604b583c251c663bc5aa86545fb5170661fd180548516841790557fb587fb4c9be7dc5b4617ddb444f18245e43e1356d41a79f298e617e71735b10480548516841790557f76f60eb4d9f4b6a91fb03aea0bb2ab661eed1f652e7a1459262e18b1cec036f980548516841790557fce680bbf9624895268d7bb8f9cb7bcffcaf18cbce16e85eb09da81cdbec8c71e80548516841790557f28d4d31d7e762e7c07f3969708b7c44f4eec38d8e2da3f5043ddde1166f5c94c80548516841790557f52bfd75aeb00cdd7765a65bb5e6d4dd0b8ee726e6eac77ad17ff80c25727f75e80548516841790557f0461be8fc0abf4f899472b8315f43ffe374f3fc26b4f474d5ff1b93fd0a9d5af80548516841790557ff320825b9ea3e79df4d72b99ae4cd468d7f22264fe2a045201a3114f58b34e1280548516841790557fa14109533b2ed09eee5e77a80ec417329ef0ed5357d88dad8a74d2ba18e20f8c80548516841790557f91598ddcd040a3da03b1ed6d0249de235c675dc0ef81239f072c292a1023a5ad80548516841790557f6804b809482b1115bdd538c391b8bf85142bf50471879d881c2ae7da83b52b3780548516841790557f334124dfb31db7b1f9c893e0af628d319a78b87fc8f92d6cf1b9fe309dcc68bf80548516841790557fd96c9cda29f03d61ff162fc265343addd295d1a97beaf99bb0f744234445e73b80548516841790557f74e063423ec0298d961a88e05216e75221a6f0f2d57211b2908b8fe1ca94c59b80548516841790557f250fcd2c6c022df80d800849fd6014c3d9b4299f6fb1c3c70864613a0031c3fb80548516841790557fe2e77add7d32470ecd6e2d809be140b0a9607eb6ea125ace206091dd3070c34f80548516841790557f6932c2d3b24ec3fb0395d0715f2d461120631eade287c8df91ed930e5ded4d7780548516841790557f69e054f8f94056d25113572f214029a1e21762ad787cc2cd3ca69c246c65edc380548516841790557f35641a9224bfefd12b3b922c64e78d127c60655cbb819ca4bb57cf42c6786ee780548516841790557f19c479873e8b8acaf294a2a24402b508995c70cf87794470c6917138bf0c5da480548516841790557f798b1324ea3b986cdf2b9db82f93ff1d5c4bcc09b45b1657382908bbfa53da3f80548516841790557f842ab21960e792ad71172dbc8515887313dfb76f8ad5e315400da3da43ac5dc580548516841790557f60a4ec8b7bb7378fae504a764cd8d83865f0076f1d12a4316fb5534ceef2563a80548516841790557fcc247d64558ac64f4e01ad3550350a2c27bf4a0753c38f2c6d9c35ccb2d2b4ba80548516841790557fb41afac40e3522a95f94e0d44d7c066fd009cda43b1b489dcaa6e44308f2e0b880548516841790557f65e117b0bc397311f34787833276392f46106af290fdefc49292680d8d99673880548516841790557f709bac5dc3f84fd783a7627b658a7dbc3d6788bfab6dede937b2e8a36ee7efe480548516841790557fbe05c25c2aa6afd8bc86d131d94263f4c0e2497d464a64f3c9ee7f3049c8da2e80548516841790557f990823d470f7c9df60cf473c2286d244392ff6dc2901909bb0b9075aaaa29a5f80548516841790557fcde7645e47de5fec30254bef8771532f0dd1c3a8421830dc615100487dbfe09880548516841790557fed982f94707dea1263d6b149c92b89e7116a90a4dc63284cdbb91c5aade7efc280548516841790557fb51dc601faa52759f876d93da29ffc6da5338fb82c486ce26e93d6b3fe09ddc180548516841790557fd25af8f7c8903b7a1a759c791afd47b9468526f86f4acafd8b44514aef3b59ba80548516841790557fd39f4b2a9e466af933c7a882f84e5ecbc32b0c5d9e99f60c80effe322ccca70f80548516841790557f8cb8840654aa3b562ae596a9d0f572bcff289def66915d7ae78f7ead64e0b81080548516841790557ff4a20589f9bc3a7796b58332914b150c0701d60163027edaa28433820127c12280548516841790557f9ccd7517b22dc9bda87e9f2ef2afec0cad9b6d6031f399dd917dd7bffd69ed9880548516841790557fa157f3d733883c1b2829cf8422275eeed39be670376bb79cde66aa30d82d618080548516841790557ff15ab42dd907617ddec2010c779fc422bd446623686ece0112559b6ce21e69d280548516841790557f0a7cca9dc6d2c4123cf6acca06d6eb500d8d8b3bd00dbfe0fe50940eac3a93ce80548516841790557f719890d71c49ae6011b35aceb1f9133200d169cc1ce412168a131f4829c5abf580548516841790557f66541d2dff21416a2935be477919618fa1a5dce222e8507db105629a3ee1d78b80548516841790557fccf78516c4a6cf9b72180be4e6543aa9201b24f78372a56c620310de640b5e7380548516841790557f8ea4b1d7f86948bdc29217300ed66369c53fc8639df423c0999132e300bd920480548516841790557f70d7b942b19eab40e29918ac781bacce4d919a71770e6243874402d08f0de8cf80548516841790557f2a30a6c4fadb5a7fb476f1ddf70f6c5e88123563eb109ca50a1f3fbc0a9b2ee780548516841790557f887ceb22bce4e0d8f693ded066f7531bfdd918b1c003415398b724ad0b4f590f80548516841790557f9f01a1cd135dfbf3e1494e481d545b9eaf7214d2b0e19305f6475587c31bec4580548516841790557fa0bdf9aad7192abc1a871745f73c445f3fa49be157bef5afbdc035ce4afefefc80548516841790557ffa9cffdedca524aaeb99bb455bdf5d68e74204d401286d9e5a033d6b637d605580548516841790557fc69961c0433837b486dc69f2e75b73bef1064bd97b35eb2be54c1de09652ca4380548516841790557f687fc51f50dce909f3051ba14e4cdfce21ef8821580fd4b15d73a86c81305d3b80548516841790557f47fc01861401718b32ed53c932dce2993a40f90019fb70dce1c45698f199756e80548516841790557fbe3dfb025280750ab08c0630db898a196d403ffb1bf9eee764ba447f64cf06b180548516841790557f263136ffcf36582d9d8e7891363754b872f2a8528df990604c80eaca4d1acbc680548516841790557fae8fab7e312213d7a6028d6d87c954688ae245937b285876b08fae567399e42680548516841790557fe810f2665b993bb56422972d60fa97d099ea8fa5c587fdeb7e502ce3bebd52b380548516841790557f5d16cfa4367fbb42081af368be88aa20c41da6b453d8219b389a6950b5704b3580548516841790557f3137dd56ec0b170c3180d07105dc10a4836a2079a29634d9ac3fedf704f9f5fc80548516841790557f94377fc4a2b4b9099f6a1c95b7ab6a704179b19556a1789f649d11ce057b491680548516841790557f0f96669d0ed1993d105b442724b5041aafd7d24afea4eb8236aab0ac372e986480548516841790557f72683239603c749d2f4cb3df68327c83a8cb71f10ac45f098a3532240ab4199e80548516841790557f659ee2e076288fab66e382d9ddd0251124ecad21ce88a38710556fbcd836369780548516841790557f9cf09f2b490c58cd195c6cf286e77279b07b23ecfcd5af89408e2b0536c9eac880548516841790557f1bf38cf68807c484a103cbc26101c90e5f9b1a16c728843165cdec02d7b8fcd680548516841790557faddeec4d8e2d52633e8b5926ab1b5dd63e02bfab7e5efc86d64bf1d25d4a7aaa80549094169092179092557314f3ab008b98f24e238dd70aa93030fa4c9d29b981526035819055603055603e80546019603f55660100010001010066ffffffffffffff199091161790557fc251acd21ec4fb7f31bb8868288bfdbaeb4fbfec2df3735ddbd4f7dc8d60103c9055506702c68af0bb14000060415542601e5562001712565b60006200155f828462001660565b9392505050565b60006200155f828462001645565b82805462001582906200169c565b90600052602060002090601f016020900481019282620015a65760008555620015f1565b82601f10620015c157805160ff1916838001178555620015f1565b82800160010185558215620015f1579182015b82811115620015f1578251825591602001919060010190620015d4565b50620015ff92915062001603565b5090565b5b80821115620015ff576000815560010162001604565b6000602082840312156200162d57600080fd5b81516001600160a01b03811681146200155f57600080fd5b600082198211156200165b576200165b620016fc565b500190565b60008160001904831182151516156200167d576200167d620016fc565b500290565b600082821015620016975762001697620016fc565b500390565b600181811c90821680620016b157607f821691505b60208210811415620016d357634e487b7160e01b600052602260045260246000fd5b50919050565b600082620016f757634e487b7160e01b600052601260045260246000fd5b500690565b634e487b7160e01b600052601160045260246000fd5b60805160601c60a05160601c6157c46200175a600039600081816124950152614f50015260008181613821015281816139b8015281816143a50152614f2101526157c46000f3fe6080604052600436106107035760003560e01c806370a0823111610390578063afcf2fc4116101dc578063d9cfb8031161010d578063ef89c457116100ab578063f3380a1e1161007a578063f3380a1e146114f7578063f629cd6014611518578063f921791514611532578063fcebe6cd1461155257600080fd5b8063ef89c4571461148e578063efbe389a146114a4578063f15c8b65146114c4578063f2fde38b146114d757600080fd5b8063e4761042116100e7578063e476104214611401578063e9f7719f14611421578063ea2f0b371461144e578063ef124faf1461146e57600080fd5b8063d9cfb8031461137b578063db6754ed1461139b578063dd62ed3e146113bb57600080fd5b8063c49b9a801161017a578063cafabc1211610154578063cafabc1214611303578063cea2695814611323578063d12a768814611343578063d8db90101461135957600080fd5b8063c49b9a80146112ae578063c664559c146112ce578063c6d4a4dc146112ee57600080fd5b8063bb583f45116101b6578063bb583f4514611223578063bd35832814611259578063be42cd2e14611279578063be8ee7f41461128e57600080fd5b8063afcf2fc4146111c3578063b015ebaf146111e3578063ba005cae1461120357600080fd5b806394985ddd116102c1578063a4f234be1161025f578063a9059cbb1161022e578063a9059cbb14611143578063a962c47e14611163578063af41063b14611183578063af82a626146111a357600080fd5b8063a4f234be146110cd578063a54c8e77146110ed578063a5ece94114611103578063a72048571461112357600080fd5b80639bf97c301161029b5780639bf97c3014611047578063a22d483214611077578063a31ce6d414611097578063a457c2d7146110ad57600080fd5b806394985ddd14610ff257806395d89b4114611012578063976cbe3d1461102757600080fd5b80638468689e1161032e5780638a2fef5a116103085780638a2fef5a14610f7e5780638da5cb5b14610f945780638ee88c5314610fb25780638f29e45b14610fd257600080fd5b80638468689e14610f1057806388f8202014610f30578063893d20e814610f6957600080fd5b80637aa9c1651161036a5780637aa9c16514610ea55780637b592a4914610eba57806380ddf0ba14610eda578063820468f014610ef057600080fd5b806370a0823114610e4057806371ef4db514610e6057806373c32cf214610e7557600080fd5b80633685d4191161054f57806350480d7d11610480578063638b1b141161041e57806367f16bcf116103ed57806367f16bcf14610dca578063693cdc0014610dea5780636e2310b214610e0a5780636f6b489d14610e2057600080fd5b8063638b1b1414610d305780636457287014610d505780636481681c14610d7d578063669c752914610d9d57600080fd5b806357a5d4ae1161045a57806357a5d4ae14610cc45780635d069ffb14610ce45780635f5a7ab914610cfa5780635fe9774214610d1057600080fd5b806350480d7d14610c4b57806352390c0214610c6b5780635342acb414610c8b57600080fd5b806341cb87fc116104ed5780634549b039116104c75780634549b03914610bdf57806349f1640d14610bff5780634e0856a714610c155780634e83394c14610c2b57600080fd5b806341cb87fc14610b72578063436bbf1114610b92578063437823ec14610bbf57600080fd5b80633b540996116105295780633b54099614610b055780633beedf6d14610b1b5780633f41406714610b3b5780634178fe8614610b5c57600080fd5b80633685d41914610aa557806336f047b714610ac55780633950935114610ae557600080fd5b80631c75f0851161063457806327c8f835116105d2578063310d2fbc116105a1578063310d2fbc14610a2c578063313ce56714610a4c578063340dfdc414610a6e578063361be06c14610a8457600080fd5b806327c8f835146109c05780632ab463fb146109e05780632d6ef165146109f65780632d83811914610a0c57600080fd5b806323a56c5c1161060e57806323a56c5c1461093b57806323b872dd14610951578063241ade11146109715780632797ba9e146109a157600080fd5b80631c75f085146108e65780631efc63391461090657806322f9e9301461091b57600080fd5b806311127ccc116106a157806313114a9d1161067b57806313114a9d1461087c578063171b783f146108915780631805af60146108b157806318160ddd146108d157600080fd5b806311127ccc146107f857806311ffd5b714610846578063122dce7f1461085c57600080fd5b8063061c82d0116106dd578063061c82d01461077e57806306fdde03146107a0578063095ea7b3146107c25780630d8cef8d146107e257600080fd5b8063045d1adf1461070f57806304f377f814610738578063056bd30a1461076957600080fd5b3661070a57005b600080fd5b34801561071b57600080fd5b50610725603b5481565b6040519081526020015b60405180910390f35b34801561074457600080fd5b50601c5461075990600160a81b900460ff1681565b604051901515815260200161072f565b34801561077557600080fd5b50601e54610725565b34801561078a57600080fd5b5061079e61079936600461536e565b611567565b005b3480156107ac57600080fd5b506107b56115c0565b60405161072f91906154c8565b3480156107ce57600080fd5b506107596107dd366004615308565b611652565b3480156107ee57600080fd5b5061072560425481565b34801561080457600080fd5b5061082e61081336600461536e565b602e602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161072f565b34801561085257600080fd5b5061072560105481565b34801561086857600080fd5b5061079e61087736600461536e565b611669565b34801561088857600080fd5b50600f54610725565b34801561089d57600080fd5b5061079e6108ac366004615226565b611698565b3480156108bd57600080fd5b5061079e6108cc366004615334565b611762565b3480156108dd57600080fd5b50600354610725565b3480156108f257600080fd5b5060235461082e906001600160a01b031681565b34801561091257600080fd5b5061079e61179f565b34801561092757600080fd5b5061079e610936366004615334565b6117d3565b34801561094757600080fd5b50610725602c5481565b34801561095d57600080fd5b5061075961096c366004615299565b61181d565b34801561097d57600080fd5b5061075961098c366004615226565b60316020526000908152604090205460ff1681565b3480156109ad57600080fd5b50603e5461075990610100900460ff1681565b3480156109cc57600080fd5b50601f5461082e906001600160a01b031681565b3480156109ec57600080fd5b5061072560165481565b348015610a0257600080fd5b50610725602b5481565b348015610a1857600080fd5b50610725610a2736600461536e565b611887565b348015610a3857600080fd5b5061079e610a47366004615334565b611904565b348015610a5857600080fd5b5060045460405160ff909116815260200161072f565b348015610a7a57600080fd5b50610725602a5481565b348015610a9057600080fd5b50603e54610759906301000000900460ff1681565b348015610ab157600080fd5b5061079e610ac0366004615226565b611948565b348015610ad157600080fd5b5061079e610ae036600461536e565b611aff565b348015610af157600080fd5b50610759610b00366004615308565b611b2e565b348015610b1157600080fd5b5061072560125481565b348015610b2757600080fd5b5060215461082e906001600160a01b031681565b348015610b4757600080fd5b50603e5461075990600160301b900460ff1681565b348015610b6857600080fd5b50610725603d5481565b348015610b7e57600080fd5b5061079e610b8d366004615226565b611b64565b348015610b9e57600080fd5b50610725610bad366004615226565b60346020526000908152604090205481565b348015610bcb57600080fd5b5061079e610bda366004615226565b611d4d565b348015610beb57600080fd5b50610725610bfa3660046153c2565b611d9b565b348015610c0b57600080fd5b5061072560305481565b348015610c2157600080fd5b5061072560145481565b348015610c3757600080fd5b5061079e610c4636600461536e565b611e18565b348015610c5757600080fd5b5061079e610c6636600461536e565b611e47565b348015610c7757600080fd5b5061079e610c86366004615226565b611efc565b348015610c9757600080fd5b50610759610ca6366004615226565b6001600160a01b031660009081526009602052604090205460ff1690565b348015610cd057600080fd5b5061079e610cdf3660046152da565b6120bc565b348015610cf057600080fd5b50610725603a5481565b348015610d0657600080fd5b5061072560365481565b348015610d1c57600080fd5b5060245461082e906001600160a01b031681565b348015610d3c57600080fd5b5060225461082e906001600160a01b031681565b348015610d5c57600080fd5b50610d70610d6b366004615387565b61211c565b60405161072f9190615484565b348015610d8957600080fd5b5061079e610d9836600461536e565b6121ef565b348015610da957600080fd5b50610725610db8366004615226565b60326020526000908152604090205481565b348015610dd657600080fd5b5060445461082e906001600160a01b031681565b348015610df657600080fd5b5061079e610e05366004615226565b61221e565b348015610e1657600080fd5b5061072560185481565b348015610e2c57600080fd5b50603e546107599062010000900460ff1681565b348015610e4c57600080fd5b50610725610e5b366004615226565b612251565b348015610e6c57600080fd5b5061079e6122b0565b348015610e8157600080fd5b50610759610e90366004615226565b602d6020526000908152604090205460ff1681565b348015610eb157600080fd5b5061079e6122fe565b348015610ec657600080fd5b5061079e610ed536600461536e565b612361565b348015610ee657600080fd5b5061072560385481565b348015610efc57600080fd5b5061079e610f0b36600461536e565b612390565b348015610f1c57600080fd5b5061079e610f2b36600461536e565b6123bf565b348015610f3c57600080fd5b50610759610f4b366004615226565b6001600160a01b031660009081526007602052604090205460ff1690565b348015610f7557600080fd5b5061082e6123ee565b348015610f8a57600080fd5b5061072560395481565b348015610fa057600080fd5b506001546001600160a01b031661082e565b348015610fbe57600080fd5b5061079e610fcd36600461536e565b612407565b348015610fde57600080fd5b5061079e610fed366004615226565b612457565b348015610ffe57600080fd5b5061079e61100d366004615387565b61248a565b34801561101e57600080fd5b506107b561250c565b34801561103357600080fd5b5061079e6110423660046152da565b61251b565b34801561105357600080fd5b50610759611062366004615226565b60296020526000908152604090205460ff1681565b34801561108357600080fd5b5061079e611092366004615226565b612570565b3480156110a357600080fd5b5061072560355481565b3480156110b957600080fd5b506107596110c8366004615308565b6125bc565b3480156110d957600080fd5b50601c5461082e906001600160a01b031681565b3480156110f957600080fd5b50610725603f5481565b34801561110f57600080fd5b5060265461082e906001600160a01b031681565b34801561112f57600080fd5b5061079e61113e366004615334565b61260b565b34801561114f57600080fd5b5061075961115e366004615308565b612651565b34801561116f57600080fd5b5060275461082e906001600160a01b031681565b34801561118f57600080fd5b5061079e61119e36600461536e565b61265e565b3480156111af57600080fd5b5061079e6111be36600461536e565b6126ae565b3480156111cf57600080fd5b5060205461082e906001600160a01b031681565b3480156111ef57600080fd5b5060285461082e906001600160a01b031681565b34801561120f57600080fd5b5061079e61121e366004615334565b6126f4565b34801561122f57600080fd5b5061082e61123e36600461536e565b6033602052600090815260409020546001600160a01b031681565b34801561126557600080fd5b5061079e61127436600461536e565b61273c565b34801561128557600080fd5b5061072561278c565b34801561129a57600080fd5b5060255461082e906001600160a01b031681565b3480156112ba57600080fd5b5061079e6112c9366004615334565b6127c6565b3480156112da57600080fd5b5060375461082e906001600160a01b031681565b3480156112fa57600080fd5b5061079e612848565b34801561130f57600080fd5b5061079e61131e36600461536e565b61287a565b34801561132f57600080fd5b5061079e61133e36600461536e565b612961565b34801561134f57600080fd5b50610725601d5481565b34801561136557600080fd5b50603e5461075990640100000000900460ff1681565b34801561138757600080fd5b50610d70611396366004615387565b6129b1565b3480156113a757600080fd5b50601a5461082e906001600160a01b031681565b3480156113c757600080fd5b506107256113d6366004615260565b6001600160a01b039182166000908152600a6020908152604080832093909416825291909152205490565b34801561140d57600080fd5b5061079e61141c3660046152da565b612a59565b34801561142d57600080fd5b5061072561143c366004615226565b602f6020526000908152604090205481565b34801561145a57600080fd5b5061079e611469366004615226565b612ab9565b34801561147a57600080fd5b5060435461082e906001600160a01b031681565b34801561149a57600080fd5b50610725603c5481565b3480156114b057600080fd5b50601b5461082e906001600160a01b031681565b3480156114d057600080fd5b5042610725565b3480156114e357600080fd5b5061079e6114f2366004615226565b612b04565b34801561150357600080fd5b50603e5461075990600160281b900460ff1681565b34801561152457600080fd5b50603e546107599060ff1681565b34801561153e57600080fd5b5061079e61154d36600461536e565b612bfd565b34801561155e57600080fd5b5061079e612c2c565b6001546001600160a01b0316331461159a5760405162461bcd60e51b815260040161159190615512565b60405180910390fd5b60058111156115bb5760405162461bcd60e51b8152600401611591906154db565b601055565b6060600680546115cf90615646565b80601f01602080910402602001604051908101604052809291908181526020018280546115fb90615646565b80156116485780601f1061161d57610100808354040283529160200191611648565b820191906000526020600020905b81548152906001019060200180831161162b57829003601f168201915b5050505050905090565b600061165f338484612c76565b5060015b92915050565b6001546001600160a01b031633146116935760405162461bcd60e51b815260040161159190615512565b603c55565b6001546001600160a01b031633146116c25760405162461bcd60e51b815260040161159190615512565b61175f6116d76023546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b038416906370a082319060240160206040518083038186803b15801561171657600080fd5b505afa15801561172a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174e91906153a9565b6001600160a01b0384169190612d9a565b50565b6001546001600160a01b0316331461178c5760405162461bcd60e51b815260040161159190615512565b603e805460ff1916911515919091179055565b6001546001600160a01b031633146117c95760405162461bcd60e51b815260040161159190615512565b6117d1612df1565b565b6001546001600160a01b031633146117fd5760405162461bcd60e51b815260040161159190615512565b603e80549115156401000000000264ff0000000019909216919091179055565b600061182a848484612ee9565b61187c843361187785604051806060016040528060288152602001615742602891396001600160a01b038a166000908152600a6020908152604080832033845290915290205491906130e5565b612c76565b5060015b9392505050565b6000600e548211156118ee5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401611591565b60006118f8613111565b90506118808382613134565b6001546001600160a01b0316331461192e5760405162461bcd60e51b815260040161159190615512565b603e80549115156101000261ff0019909216919091179055565b6001546001600160a01b031633146119725760405162461bcd60e51b815260040161159190615512565b6001600160a01b03811660009081526007602052604090205460ff166119da5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920696e636c7564656400000000006044820152606401611591565b60005b600854811015611afb57816001600160a01b031660088281548110611a0457611a046156f2565b6000918252602090912001546001600160a01b03161415611ae95760088054611a2f90600190615603565b81548110611a3f57611a3f6156f2565b600091825260209091200154600880546001600160a01b039092169183908110611a6b57611a6b6156f2565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600c82526040808220829055600790925220805460ff191690556008805480611ac357611ac36156dc565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80611af381615681565b9150506119dd565b5050565b6001546001600160a01b03163314611b295760405162461bcd60e51b815260040161159190615512565b601d55565b336000818152600a602090815260408083206001600160a01b0387168452909152812054909161165f9185906118779086612c6a565b6001546001600160a01b03163314611b8e5760405162461bcd60e51b815260040161159190615512565b601c80546001600160a01b0319166001600160a01b0383169081179091556040805163c45a015560e01b81529051829163c45a0155916004808301926020929190829003018186803b158015611be357600080fd5b505afa158015611bf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c1b9190615243565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015611c6357600080fd5b505afa158015611c77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9b9190615243565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015611ce357600080fd5b505af1158015611cf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1b9190615243565b601b80546001600160a01b039283166001600160a01b031991821617909155601a805493909216921691909117905550565b6001546001600160a01b03163314611d775760405162461bcd60e51b815260040161159190615512565b6001600160a01b03166000908152600960205260409020805460ff19166001179055565b6000600354831115611def5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401611591565b600080611dfb85613140565b5050915091508315611e105791506116639050565b509050611663565b6001546001600160a01b03163314611e425760405162461bcd60e51b815260040161159190615512565b603b55565b6001546001600160a01b03163314611e715760405162461bcd60e51b815260040161159190615512565b602b54811115611ef75760405162461bcd60e51b815260206004820152604560248201527f4e6577206d61782064726177696e67206368616e6365732063616e6e6f74206260448201527f65206f7665722074686520696e697469616c204d61782044726177696e204368606482015264616e67657360d81b608482015260a401611591565b602a55565b6001546001600160a01b03163314611f265760405162461bcd60e51b815260040161159190615512565b601c546001600160a01b0382811691161415611f935760405162461bcd60e51b815260206004820152602660248201527f4163636f756e74206d757374206e6f742062652050616e63616b6553776170206044820152652937baba32b960d11b6064820152608401611591565b6001600160a01b03811660009081526007602052604090205460ff1615611ffc5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401611591565b6001600160a01b0381166000908152600b602052604090205415612056576001600160a01b0381166000908152600b602052604090205461203c90611887565b6001600160a01b0382166000908152600c60205260409020555b6001600160a01b03166000818152600760205260408120805460ff191660019081179091556008805491820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319169091179055565b6001546001600160a01b031633146120e65760405162461bcd60e51b815260040161159190615512565b6001600160a01b0382166000908152602960205260409020805460ff19168215801591909117909155611afb57611afb826131aa565b60608167ffffffffffffffff81111561213757612137615708565b604051908082528060200260200182016040528015612160578160200160208202803683370190505b50905060005b828110156121e8576121b960016121b36035548785604051602001612195929190918252602082015260400190565b60408051601f19818403018152919052805160209091012090613237565b90612c6a565b8282815181106121cb576121cb6156f2565b6020908102919091010152806121e081615681565b915050612166565b5092915050565b6001546001600160a01b031633146122195760405162461bcd60e51b815260040161159190615512565b602c55565b6001546001600160a01b031633146122485760405162461bcd60e51b815260040161159190615512565b61175f81613243565b6001600160a01b03811660009081526007602052604081205460ff161561228e57506001600160a01b03166000908152600c602052604090205490565b6001600160a01b0382166000908152600b602052604090205461166390611887565b6001546001600160a01b031633146122da5760405162461bcd60e51b815260040161159190615512565b6117d1306122f06023546001600160a01b031690565b6122f930612251565b612ee9565b6001546001600160a01b031633146123285760405162461bcd60e51b815260040161159190615512565b6023546040516001600160a01b03909116904780156108fc02916000818181858888f1935050505015801561175f573d6000803e3d6000fd5b6001546001600160a01b0316331461238b5760405162461bcd60e51b815260040161159190615512565b603655565b6001546001600160a01b031633146123ba5760405162461bcd60e51b815260040161159190615512565b604055565b6001546001600160a01b031633146123e95760405162461bcd60e51b815260040161159190615512565b604155565b60006124026001546001600160a01b031690565b905090565b6001546001600160a01b031633146124315760405162461bcd60e51b815260040161159190615512565b60058111156124525760405162461bcd60e51b8152600401611591906154db565b601855565b6001546001600160a01b031633146124815760405162461bcd60e51b815260040161159190615512565b61175f8161354d565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146125025760405162461bcd60e51b815260206004820152601f60248201527f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c006044820152606401611591565b611afb8282613663565b6060600580546115cf90615646565b6001546001600160a01b031633146125455760405162461bcd60e51b815260040161159190615512565b6001600160a01b03919091166000908152602960205260409020805460ff1916911515919091179055565b6001546001600160a01b0316331461259a5760405162461bcd60e51b815260040161159190615512565b601b80546001600160a01b0319166001600160a01b0392909216919091179055565b600061165f33846118778560405180606001604052806025815260200161576a60259139336000908152600a602090815260408083206001600160a01b038d16845290915290205491906130e5565b6001546001600160a01b031633146126355760405162461bcd60e51b815260040161159190615512565b603e8054911515620100000262ff000019909216919091179055565b600061165f338484612ee9565b6001546001600160a01b031633146126885760405162461bcd60e51b815260040161159190615512565b60058111156126a95760405162461bcd60e51b8152600401611591906154db565b601255565b6001546001600160a01b031633146126d85760405162461bcd60e51b815260040161159190615512565b61175f306126ee6023546001600160a01b031690565b83612ee9565b6001546001600160a01b0316331461271e5760405162461bcd60e51b815260040161159190615512565b603e805491151563010000000263ff00000019909216919091179055565b6001546001600160a01b031633146127665760405162461bcd60e51b815260040161159190615512565b60058111156127875760405162461bcd60e51b8152600401611591906154db565b601655565b6000603654421061279d5750600090565b6036546000906127ad90426137d9565b11156127c05760365461240290426137d9565b50600090565b6001546001600160a01b031633146127f05760405162461bcd60e51b815260040161159190615512565b601c8054821515600160a81b0260ff60a81b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599061283d90831515815260200190565b60405180910390a150565b6001546001600160a01b031633146128725760405162461bcd60e51b815260040161159190615512565b6117d16137e5565b3360008181526007602052604090205460ff16156128ef5760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608401611591565b60006128fa83613140565b5050506001600160a01b0383166000908152600b602052604090205490915061292390826137d9565b6001600160a01b0383166000908152600b6020526040902055600e5461294990826137d9565b600e55600f546129599084612c6a565b600f55505050565b6001546001600160a01b0316331461298b5760405162461bcd60e51b815260040161159190615512565b60058111156129ac5760405162461bcd60e51b8152600401611591906154db565b601455565b60608167ffffffffffffffff8111156129cc576129cc615708565b6040519080825280602002602001820160405280156129f5578160200160208202803683370190505b50905060005b828110156121e857612a2a60016121b36030548785604051602001612195929190918252602082015260400190565b828281518110612a3c57612a3c6156f2565b602090810291909101015280612a5181615681565b9150506129fb565b6001546001600160a01b03163314612a835760405162461bcd60e51b815260040161159190615512565b6001600160a01b0382166000908152602960205260409020805460ff19168215801591909117909155611afb57611afb826138f9565b6001546001600160a01b03163314612ae35760405162461bcd60e51b815260040161159190615512565b6001600160a01b03166000908152600960205260409020805460ff19169055565b6001546001600160a01b03163314612b2e5760405162461bcd60e51b815260040161159190615512565b6001600160a01b038116612b935760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611591565b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a360018054600280546001600160a01b038084166001600160a01b0319928316179092559091169216919091179055565b6001546001600160a01b03163314612c275760405162461bcd60e51b815260040161159190615512565b603f55565b6001546001600160a01b03163314612c565760405162461bcd60e51b815260040161159190615512565b6117d1613980565b600061188082846155e4565b600061188082846155b8565b6001600160a01b038316612cd85760405162461bcd60e51b8152602060048201526024808201527f42455032303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401611591565b6001600160a01b038216612d395760405162461bcd60e51b815260206004820152602260248201527f42455032303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401611591565b6001600160a01b038381166000818152600a602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612dec9084906139ef565b505050565b603a54156117d157603d5442106117d157602554600090612e1a906001600160a01b0316612251565b90506039548110612ea657603954612e339082906137d9565b6039541115612e6d57602554603754612e63916001600160a01b039081169116612e5c82612251565b6000613ac1565b6000603a55612ed4565b602554603754603954612e8f926001600160a01b039081169216906000613ac1565b603954603a54612e9e916137d9565b603a55612ed4565b8015612ed457602554603754603a54612ece926001600160a01b039081169216906000613ac1565b6000603a555b603c54603d54612ee391612c6a565b603d5550565b6001600160a01b038316612f4d5760405162461bcd60e51b815260206004820152602560248201527f42455032303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401611591565b6001600160a01b038216612faf5760405162461bcd60e51b815260206004820152602360248201527f42455032303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401611591565b600081116130115760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401611591565b600061301c30612251565b90506000601d54821061302d575060015b8080156130445750601c54600160a01b900460ff16155b801561305e5750601b546001600160a01b03868116911614155b80156130735750601c54600160a81b900460ff165b1561308657601d54915061308682613d3a565b6001600160a01b03851660009081526009602052604090205460019060ff16806130c857506001600160a01b03851660009081526009602052604090205460ff165b156130d1575060005b6130dd86868684613de1565b505050505050565b600081848411156131095760405162461bcd60e51b815260040161159191906154c8565b505050900390565b600080600061311e61409a565b909250905061312d8282613134565b9250505090565b600061188082846155d0565b600080600061314d615208565b60006131588661421c565b90506000808061319689858360200201518660016020020151876002602002015188600360200201518960046020020151613191613111565b6142ed565b919950975095509293505050509193509193565b6001600160a01b038181166000908152602f602081815260408084208054603080548752602e808652848820548389528589208054918b166001600160a01b03199283168117909155808a529787528589208490559388905560275482548952955292909520805493909616921691909117909355915490919061322f9060016137d9565b603055505050565b6000611880828461569c565b6001600160a01b03811660009081526029602052604090205460ff1661175f57600061326e82612251565b9050602c548110613503576001600160a01b03821660009081526031602052604090205460ff16613390576001600160a01b0382166000908152603160209081526040808320805460ff19166001179055603490915290205461333c576035546132d9906001612c6a565b60358181556001600160a01b0384166000818152603460209081526040808320869055948252603390529290922080546001600160a01b031916909217909155602b5490546133349160019161332e91612c6a565b906137d9565b603555613373565b6001600160a01b03821660008181526034602090815260408083205483526033909152902080546001600160a01b03191690911790555b6001600160a01b0382166000908152603260205260409020600190555b60006133a7602c548361313490919063ffffffff16565b9050602a548111156133b85750602a545b6001600160a01b038316600090815260326020908152604080832054603490925290912054818310156134605760006133f183856137d9565b905060006133ff8385612c6a565b905060005b82811161345857602754600083815260336020526040902080546001600160a01b0319166001600160a01b039092169190911790556134448260016137d9565b91508061345081615681565b915050613404565b5050506134d9565b818311156134d957600061347484846137d9565b905060006134828385612c6a565b905060005b828110156134d557600082815260336020526040902080546001600160a01b0319166001600160a01b038a161790556134c1826001612c6a565b9150806134cd81615681565b915050613487565b5050505b8183146134fc576001600160a01b03851660009081526032602052604090208390555b5050505050565b6001600160a01b03821660009081526031602052604090205460ff1615611afb576001600160a01b0382166000908152603160205260409020805460ff19169055611afb826138f9565b6001600160a01b03811660009081526029602052604090205460ff1661175f57600061357882612251565b9050602c548110613619576001600160a01b0382166000908152602d602052604090205460ff16611afb576001600160a01b0382166000908152602d60205260409020805460ff191660019081179091556030546135d591612c6a565b60308181556000918252602e6020908152604080842080546001600160a01b0319166001600160a01b0388169081179091559254928452602f909152909120555050565b6001600160a01b0382166000908152602d602052604090205460ff1615611afb576001600160a01b0382166000908152602d60205260409020805460ff19169055611afb826131aa565b603e546301000000900460ff161561371157600061368c6030548361323790919063ffffffff16565b90507f0f53ca5a05faa661effd85005fc85959f019007d315cfa1f68e71ba93ca4d41c816040516136bf91815260200190565b60405180910390a16136d2816001612c6a565b90507f0f53ca5a05faa661effd85005fc85959f019007d315cfa1f68e71ba93ca4d41c8160405161370591815260200190565b60405180910390a16042555b603e54640100000000900460ff16156137c057600061373b6035548361323790919063ffffffff16565b90507f07a49713cabef6e7ca289451feb67d9cc1a37c17ab112cc0f29abc7c4f0948818160405161376e91815260200190565b60405180910390a1613781816001612c6a565b90507f07a49713cabef6e7ca289451feb67d9cc1a37c17ab112cc0f29abc7c4f094881816040516137b491815260200190565b60405180910390a16042555b5050603e805465ff00000000001916600160281b179055565b60006118808284615603565b60365442101580156137f957506000603054115b156117d157603a541580156138a757506041546040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a08231906024015b60206040518083038186803b15801561386c57600080fd5b505afa158015613880573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138a491906153a9565b10155b156117d1576021546000906138c4906001600160a01b0316612251565b9050801561175f57603e54600160301b900460ff161561175f57603e805466ff000000000000191690556000612dec42614381565b6001600160a01b0381166000908152603460209081526040808320546032909252822080549083905590915b8181101561397a57602754600084815260336020526040902080546001600160a01b0319166001600160a01b03909216919091179055613966836001612c6a565b92508061397281615681565b915050613925565b50505050565b60365442101580156137f95750603554156117d157603a541580156138a757506041546040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401613854565b6000613a44826040518060400160405280602081526020017f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166144909092919063ffffffff16565b805190915015612dec5780806020019051810190613a629190615351565b612dec5760405162461bcd60e51b815260206004820152602a60248201527f5361666542455032303a204245503230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401611591565b80613b0057613b006010805460115560128054601355601480546015556016805460175560188054601955600094859055928490559083905582905555565b600080600080613b0f86613140565b6001600160a01b038c166000908152600760205260409020549397509195509350915060ff1615613b77576001600160a01b0388166000908152600c6020526040902054613b5d90876137d9565b6001600160a01b0389166000908152600c60205260409020555b6001600160a01b0388166000908152600b6020526040902054613b9a90856137d9565b6001600160a01b03808a166000908152600b6020908152604080832094909455918a1681526007909152205460ff1615613c2857613c0e8160055b6020020151600c60008a6001600160a01b03166001600160a01b0316815260200190815260200160002054612c6a90919063ffffffff16565b6001600160a01b0388166000908152600c60205260409020555b6001600160a01b0387166000908152600b6020526040902054613c4b9084612c6a565b6001600160a01b0388166000908152600b6020526040902055613c758160015b60200201516144a7565b613c868160025b602002015161452f565b613c978160035b60200201516145ee565b613ca88160045b60200201516146ad565b613cba828260005b602002015161476c565b6001600160a01b038088169089167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360056020020151604051613d0091815260200190565b60405180910390a384613d3057613d30601154601055601354601255601554601455601754601655601954601855565b5050505050505050565b601c805460ff60a01b1916600160a01b1790556000613d5a826002613134565b90506000613d6883836137d9565b905047613d7483614790565b6000613d8047836137d9565b9050613d8c83826148f1565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050601c805460ff60a01b19169055505050565b80613e2057613e206010805460115560128054601355601480546015556016805460175560188054601955600094859055928490559083905582905555565b600080600080613e2f86613140565b6001600160a01b038c166000908152600760205260409020549397509195509350915060ff1615613e97576001600160a01b0388166000908152600c6020526040902054613e7d90876137d9565b6001600160a01b0389166000908152600c60205260409020555b6001600160a01b0388166000908152600b6020526040902054613eba90856137d9565b6001600160a01b03808a166000908152600b6020908152604080832094909455918a1681526007909152205460ff1615613f1357613ef9816005613bd5565b6001600160a01b0388166000908152600c60205260409020555b6001600160a01b0387166000908152600b6020526040902054613f369084612c6a565b6001600160a01b0388166000908152600b6020526040902055613f5a816001613c6b565b613f65816002613c7c565b613f70816003613c8d565b613f7b816004613c9e565b613f8782826000613cb0565b6001600160a01b038088169089167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360056020020151604051613fcd91815260200190565b60405180910390a384613ffd57613ffd601154601055601354601255601554601455601754601655601954601855565b603e5460ff1615613d3057603e54610100900460ff161561402a576140218761354d565b61402a8861354d565b603e546301000000900460ff161561404c576140446137e5565b61404c6149aa565b603e5462010000900460ff161561406f5761406687613243565b61406f88613243565b603e54640100000000900460ff16156140925761408a613980565b614092614c78565b613d30612df1565b600e546003546000918291825b6008548110156141ec5782600b6000600884815481106140c9576140c96156f2565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180614134575081600c60006008848154811061410d5761410d6156f2565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561414a57600e54600354945094505050509091565b614190600b600060088481548110614164576141646156f2565b60009182526020808320909101546001600160a01b0316835282019290925260400190205484906137d9565b92506141d8600c6000600884815481106141ac576141ac6156f2565b60009182526020808320909101546001600160a01b0316835282019290925260400190205483906137d9565b9150806141e481615681565b9150506140a7565b50600354600e546141fc91613134565b82101561421357600e546003549350935050509091565b90939092509050565b614224615208565b61422c615208565b61424c606461424660105486612c5e90919063ffffffff16565b90613134565b815260185461426390606490614246908690612c5e565b602082015260125461427d90606490614246908690612c5e565b604082015260145461429790606490614246908690612c5e565b60608201526016546142b190606490614246908690612c5e565b6080820181905260608201516040830151602084015184516142e2949361332e939092849283919082908c906137d9565b60a082015292915050565b60008080806142fc8b86612c5e565b9050600061430a8b87612c5e565b905060006143188b88612c5e565b905060006143268b89612c5e565b905060006143348b8a612c5e565b905060006143428b8b612c5e565b905060006143548561332e89896137d9565b90506143668261332e858185896137d9565b96995095975093955050505050509750975097945050505050565b6041546040516370a0823160e01b8152306004820152600091906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a082319060240160206040518083038186803b1580156143e757600080fd5b505afa1580156143fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061441f91906153a9565b10156144815760405162461bcd60e51b815260206004820152602b60248201527f4e6f7420656e6f756768204c494e4b202d2066696c6c20636f6e74726163742060448201526a1dda5d1a0819985d58d95d60aa1b6064820152608401611591565b61166360405460415484614f1d565b606061449f84846000856150a7565b949350505050565b60006144b1613111565b905060006144bf8383612c5e565b306000908152600b60205260409020549091506144dc9082612c6a565b306000908152600b602090815260408083209390935560079052205460ff1615612dec57306000908152600c602052604090205461451a9084612c6a565b306000908152600c6020526040902055505050565b6000614539613111565b905060006145478383612c5e565b602080546001600160a01b03166000908152600b90915260409020549091506145709082612c6a565b602080546001600160a01b039081166000908152600b8352604080822094909455825490911681526007909152205460ff1615612dec57602080546001600160a01b03166000908152600c90915260409020546145cd9084612c6a565b602080546001600160a01b03166000908152600c9091526040902055505050565b60006145f8613111565b905060006146068383612c5e565b601f546001600160a01b03166000908152600b602052604090205490915061462e9082612c6a565b601f80546001600160a01b039081166000908152600b6020908152604080832095909555925490911681526007909152205460ff1615612dec57601f546001600160a01b03166000908152600c602052604090205461468d9084612c6a565b601f546001600160a01b03166000908152600c6020526040902055505050565b60006146b7613111565b905060006146c58383612c5e565b6021546001600160a01b03166000908152600b60205260409020549091506146ed9082612c6a565b602180546001600160a01b039081166000908152600b6020908152604080832095909555925490911681526007909152205460ff1615612dec576021546001600160a01b03166000908152600c602052604090205461474c9084612c6a565b6021546001600160a01b03166000908152600c6020526040902055505050565b600e5461477990836137d9565b600e55600f546147899082612c6a565b600f555050565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106147c5576147c56156f2565b6001600160a01b03928316602091820292909201810191909152601a54604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561481957600080fd5b505afa15801561482d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148519190615243565b81600181518110614864576148646156f2565b6001600160a01b039283166020918202929092010152601a5461488a9130911684612c76565b601a5460405163791ac94760e01b81526001600160a01b039091169063791ac947906148c3908590600090869030904290600401615547565b600060405180830381600087803b1580156148dd57600080fd5b505af11580156130dd573d6000803e3d6000fd5b601a546149099030906001600160a01b031684612c76565b601a5460405163f305d71960e01b8152306004820181905260248201859052600060448301819052606483015260848201524260a48201526001600160a01b039091169063f305d71990839060c4016060604051808303818588803b15801561497157600080fd5b505af1158015614985573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906134fc91906153e7565b6021546000906149c2906001600160a01b0316612251565b603e54909150600160281b900460ff161561175f57603e805465ff0000000000191690556042546000818152602e60205260409081902054603780546001600160a01b0319166001600160a01b03909216919091179055517f475079cca4912eed13e3d98ffbb531441a2cd5134afb339b635b8ca29ceca2ce91614a499190815260200190565b60405180910390a160005b6027546037546001600160a01b0390811691161415614b57576000614a9860016121b360305460425486604051602001612195929190918252602082015260400190565b90507f475079cca4912eed13e3d98ffbb531441a2cd5134afb339b635b8ca29ceca2ce81604051614acb91815260200190565b60405180910390a16000818152602e6020526040902054603780546001600160a01b0319166001600160a01b03909216919091179055614b0c826001612c6a565b9150603f54821115614b51576040518281527fc343f318c6bc2d70f8454ac29c08bfadbd57e6abd20a86a03a1100feeb6647309060200160405180910390a150614b57565b50614a54565b601f546037546001600160a01b03908116911614611afb57602154602554614b8e916001600160a01b039081169116846000613ac1565b602554600090614ba6906001600160a01b0316612251565b6038819055603a819055603b54909150614bc1908290613134565b60395542603d55603c54603b54614be591614bdc9190612c5e565b60365490612c6a565b603655603780546001600160a01b039081166000908152602960205260409020805460ff191660011790559054614c1c91166131aa565b6037546040516001600160a01b0390911681527fff8f0b3b557e32131adbf3944de0c9671e72e41509c03ccb518647543e4a9b7c906020015b60405180910390a150603e805466ff0000000000001916600160301b1790555050565b603e54600160281b900460ff16156117d157603e805465ff000000000019169055602154600090614cb1906001600160a01b0316612251565b6042546000818152603360205260409081902054603780546001600160a01b0319166001600160a01b03909216919091179055519192507f4613766bc2c5c7b95c92618a7474f048b4d8f333504893b466482d601d614bc791614d1691815260200190565b60405180910390a160005b6027546037546001600160a01b0390811691161415614e24576000614d6560016121b360355460425486604051602001612195929190918252602082015260400190565b90507f4613766bc2c5c7b95c92618a7474f048b4d8f333504893b466482d601d614bc781604051614d9891815260200190565b60405180910390a1600081815260336020526040902054603780546001600160a01b0319166001600160a01b03909216919091179055614dd9826001612c6a565b9150603f54821115614e1e576040518281527fff4c244007e9193551a7dc5e6acec8511547ea1ab0fdca3a451bf780f9e951989060200160405180910390a150614e24565b50614d21565b6027546037546001600160a01b03908116911614611afb57602154602554614e5b916001600160a01b039081169116846000613ac1565b602554600090614e73906001600160a01b0316612251565b6038819055603a819055603b54909150614e8e908290613134565b60395542603d55603c54603b54614ea991614bdc9190612c5e565b603655603780546001600160a01b039081166000908152602960205260409020805460ff191660011790559054614ee091166138f9565b6037546040516001600160a01b0390911681527f9bc2e22587e41f0f601d1319b5be39b26e8c2827dd413754bc49d12254b0986c90602001614c55565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634000aea07f0000000000000000000000000000000000000000000000000000000000000000858786604051602001614f8c929190918252602082015260400190565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401614fb99392919061545d565b602060405180830381600087803b158015614fd357600080fd5b505af1158015614fe7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061500b9190615351565b5060008481526020818152604080832054815180840189905280830187905230606082015260808082018390528351808303909101815260a0909101909252815191830191909120878452929091526150659060016155b8565b60008681526020818152604091829020929092558051808301889052808201849052815180820383018152606090910190915280519101205b95945050505050565b6060824710156151085760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401611591565b843b6151565760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611591565b600080866001600160a01b031685876040516151729190615441565b60006040518083038185875af1925050503d80600081146151af576040519150601f19603f3d011682016040523d82523d6000602084013e6151b4565b606091505b50915091506151c48282866151cf565b979650505050505050565b606083156151de575081611880565b8251156151ee5782518084602001fd5b8160405162461bcd60e51b815260040161159191906154c8565b6040518060c001604052806006906020820280368337509192915050565b60006020828403121561523857600080fd5b81356118808161571e565b60006020828403121561525557600080fd5b81516118808161571e565b6000806040838503121561527357600080fd5b823561527e8161571e565b9150602083013561528e8161571e565b809150509250929050565b6000806000606084860312156152ae57600080fd5b83356152b98161571e565b925060208401356152c98161571e565b929592945050506040919091013590565b600080604083850312156152ed57600080fd5b82356152f88161571e565b9150602083013561528e81615733565b6000806040838503121561531b57600080fd5b82356153268161571e565b946020939093013593505050565b60006020828403121561534657600080fd5b813561188081615733565b60006020828403121561536357600080fd5b815161188081615733565b60006020828403121561538057600080fd5b5035919050565b6000806040838503121561539a57600080fd5b50508035926020909101359150565b6000602082840312156153bb57600080fd5b5051919050565b600080604083850312156153d557600080fd5b82359150602083013561528e81615733565b6000806000606084860312156153fc57600080fd5b8351925060208401519150604084015190509250925092565b6000815180845261542d81602086016020860161561a565b601f01601f19169290920160200192915050565b6000825161545381846020870161561a565b9190910192915050565b60018060a01b038416815282602082015260606040820152600061509e6060830184615415565b6020808252825182820181905260009190848201906040850190845b818110156154bc578351835292840192918401916001016154a0565b50909695505050505050565b6020815260006118806020830184615415565b6020808252601d908201527f4e65772070657263656e74206d7573742062652035206f72206c657373000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156155975784516001600160a01b031683529383019391830191600101615572565b50506001600160a01b03969096166060850152505050608001529392505050565b600082198211156155cb576155cb6156b0565b500190565b6000826155df576155df6156c6565b500490565b60008160001904831182151516156155fe576155fe6156b0565b500290565b600082821015615615576156156156b0565b500390565b60005b8381101561563557818101518382015260200161561d565b8381111561397a5750506000910152565b600181811c9082168061565a57607f821691505b6020821081141561567b57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415615695576156956156b0565b5060010190565b6000826156ab576156ab6156c6565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461175f57600080fd5b801515811461175f57600080fdfe42455032303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636542455032303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220644becdea9a48b5ddb6eb125ac523769835b3abab118fe5d7d99c24bf8797cd064736f6c63430008060033

Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.