Address Contract Partially Verified
Address
0xB44b653f147569d88a684cBf6549e1968E8B2A1d
Balance
0 ETH
Nonce
1
Code Size
23144 bytes
Creator
0x9F57641e...aafD at tx 0xe99378cf...e3c29f
Indexed Transactions
0
Contract Bytecode
23144 bytes
0x6080604052600436106102975760003560e01c80637571336a1161015a578063c18bc195116100c1578063e2f456051161007a578063e2f4560514610a15578063f11a24d314610a40578063f275f64b14610a6b578063f2fde38b14610a94578063f637434214610abd578063f9d0831a14610ae85761029e565b8063c18bc19514610907578063cc2ffe7c14610930578063d257b34f1461095b578063d85ba06314610984578063dc3f0d0f146109af578063dd62ed3e146109d85761029e565b8063a9059cbb11610113578063a9059cbb146107e5578063aa4bde2814610822578063b62496f51461084d578063bb4c9f0b1461088a578063bbc0c742146108b3578063c0246668146108de5761029e565b80637571336a146106d557806388e765ff146106fe5780638da5cb5b1461072957806395d89b41146107545780639a7a23d61461077f578063a457c2d7146107a85761029e565b80634a62bb65116101fe5780636a486a8e116101b75780636a486a8e146105e95780636b2fb124146106145780636ddd17131461063f57806370a082311461066a578063715018a6146106a7578063751039fc146106be5761029e565b80634a62bb65146104eb5780635b5c251f146105165780635c068a8c146105415780636605bfda1461056c57806366ca9b831461059557806366d602ae146105be5761029e565b80631a8145bb116102505780631a8145bb146103c757806323b872dd146103f25780632be32b611461042f578063313ce56714610458578063395093511461048357806349bd5a5e146104c05761029e565b806302dbd8f8146102a357806306fdde03146102cc578063095ea7b3146102f757806310d5de53146103345780631694505e1461037157806318160ddd1461039c5761029e565b3661029e57005b600080fd5b3480156102af57600080fd5b506102ca60048036038101906102c59190613e0a565b610b11565b005b3480156102d857600080fd5b506102e1610c16565b6040516102ee9190613ee3565b60405180910390f35b34801561030357600080fd5b5061031e60048036038101906103199190613f63565b610ca8565b60405161032b9190613fbe565b60405180910390f35b34801561034057600080fd5b5061035b60048036038101906103569190613fd9565b610cc6565b6040516103689190613fbe565b60405180910390f35b34801561037d57600080fd5b50610386610ce6565b6040516103939190614065565b60405180910390f35b3480156103a857600080fd5b506103b1610d0a565b6040516103be919061408f565b60405180910390f35b3480156103d357600080fd5b506103dc610d14565b6040516103e9919061408f565b60405180910390f35b3480156103fe57600080fd5b50610419600480360381019061041491906140aa565b610d1a565b6040516104269190613fbe565b60405180910390f35b34801561043b57600080fd5b50610456600480360381019061045191906140fd565b610e12565b005b34801561046457600080fd5b5061046d610f75565b60405161047a9190614146565b60405180910390f35b34801561048f57600080fd5b506104aa60048036038101906104a59190613f63565b610f7e565b6040516104b79190613fbe565b60405180910390f35b3480156104cc57600080fd5b506104d561102a565b6040516104e29190614170565b60405180910390f35b3480156104f757600080fd5b5061050061104e565b60405161050d9190613fbe565b60405180910390f35b34801561052257600080fd5b5061052b611061565b6040516105389190614170565b60405180910390f35b34801561054d57600080fd5b50610556611087565b604051610563919061408f565b60405180910390f35b34801561057857600080fd5b50610593600480360381019061058e9190613fd9565b61108d565b005b3480156105a157600080fd5b506105bc60048036038101906105b79190613e0a565b61121b565b005b3480156105ca57600080fd5b506105d3611320565b6040516105e0919061408f565b60405180910390f35b3480156105f557600080fd5b506105fe611326565b60405161060b919061408f565b60405180910390f35b34801561062057600080fd5b5061062961132c565b604051610636919061408f565b60405180910390f35b34801561064b57600080fd5b50610654611332565b6040516106619190613fbe565b60405180910390f35b34801561067657600080fd5b50610691600480360381019061068c9190613fd9565b611345565b60405161069e919061408f565b60405180910390f35b3480156106b357600080fd5b506106bc61138d565b005b3480156106ca57600080fd5b506106d36114e5565b005b3480156106e157600080fd5b506106fc60048036038101906106f791906141b7565b6115c5565b005b34801561070a57600080fd5b5061071361174c565b604051610720919061408f565b60405180910390f35b34801561073557600080fd5b5061073e611752565b60405161074b9190614170565b60405180910390f35b34801561076057600080fd5b5061076961177c565b6040516107769190613ee3565b60405180910390f35b34801561078b57600080fd5b506107a660048036038101906107a191906141b7565b61180e565b005b3480156107b457600080fd5b506107cf60048036038101906107ca9190613f63565b611942565b6040516107dc9190613fbe565b60405180910390f35b3480156107f157600080fd5b5061080c60048036038101906108079190613f63565b611a2d565b6040516108199190613fbe565b60405180910390f35b34801561082e57600080fd5b50610837611a4b565b604051610844919061408f565b60405180910390f35b34801561085957600080fd5b50610874600480360381019061086f9190613fd9565b611a51565b6040516108819190613fbe565b60405180910390f35b34801561089657600080fd5b506108b160048036038101906108ac91906142b2565b611a71565b005b3480156108bf57600080fd5b506108c8611cdc565b6040516108d59190613fbe565b60405180910390f35b3480156108ea57600080fd5b50610905600480360381019061090091906141b7565b611cef565b005b34801561091357600080fd5b5061092e600480360381019061092991906140fd565b611e2f565b005b34801561093c57600080fd5b50610945611f92565b604051610952919061408f565b60405180910390f35b34801561096757600080fd5b50610982600480360381019061097d91906140fd565b611f98565b005b34801561099057600080fd5b50610999612100565b6040516109a6919061408f565b60405180910390f35b3480156109bb57600080fd5b506109d660048036038101906109d191906140fd565b612106565b005b3480156109e457600080fd5b506109ff60048036038101906109fa9190614333565b612269565b604051610a0c919061408f565b60405180910390f35b348015610a2157600080fd5b50610a2a6122f0565b604051610a37919061408f565b60405180910390f35b348015610a4c57600080fd5b50610a556122f6565b604051610a62919061408f565b60405180910390f35b348015610a7757600080fd5b50610a926004803603810190610a8d9190614373565b6122fc565b005b348015610aa057600080fd5b50610abb6004803603810190610ab69190613fd9565b612461565b005b348015610ac957600080fd5b50610ad2612628565b604051610adf919061408f565b60405180910390f35b348015610af457600080fd5b50610b0f6004803603810190610b0a9190613fd9565b61262e565b005b610b1961285c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ba8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9f906143ec565b60405180910390fd5b8160108190555080601181905550601154601054610bc6919061443b565b600f81905550601e600f541115610c12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c09906144dd565b60405180910390fd5b5050565b606060038054610c259061452c565b80601f0160208091040260200160405190810160405280929190818152602001828054610c519061452c565b8015610c9e5780601f10610c7357610100808354040283529160200191610c9e565b820191906000526020600020905b815481529060010190602001808311610c8157829003601f168201915b5050505050905090565b6000610cbc610cb561285c565b8484612864565b6001905092915050565b60156020528060005260406000206000915054906101000a900460ff1681565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6000600254905090565b60135481565b6000610d27848484612a2f565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610d7261285c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de9906145d0565b60405180910390fd5b610e0685610dfe61285c565b858403612864565b60019150509392505050565b610e1a61285c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ea9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea0906143ec565b60405180910390fd5b670de0b6b3a76400006103e86001610ebf610d0a565b610ec991906145f0565b610ed39190614679565b610edd9190614679565b811015610f1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f169061471c565b60405180910390fd5b670de0b6b3a764000081610f3391906145f0565b6006819055507ffcc0366804aaa8dbf88a2924100c733b70dec8445957a5d5f8ff92898de41009600654604051610f6a919061408f565b60405180910390a150565b60006012905090565b6000611020610f8b61285c565b848460016000610f9961285c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461101b919061443b565b612864565b6001905092915050565b7f000000000000000000000000539b4dfcd1e4dc3153e59204004c2141f796f43281565b600b60149054906101000a900460ff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d5481565b61109561285c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111b906143ec565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118b906147ae565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f2e1e696cfb265fa16e1170d24ef04cb2262772bde00ecf34d80bae6722487b7f60405160405180910390a250565b61122361285c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146112b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a9906143ec565b60405180910390fd5b81600d8190555080600e81905550600e54600d546112d0919061443b565b600c81905550600f600c54111561131c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113139061481a565b60405180910390fd5b5050565b60075481565b600f5481565b60105481565b600b60169054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61139561285c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611424576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141b906143ec565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6114ed61285c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461157c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611573906143ec565b60405180910390fd5b6000600b60146101000a81548160ff0219169083151502179055507fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c60405160405180910390a1565b6115cd61285c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461165c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611653906143ec565b60405180910390fd5b806116f1577f000000000000000000000000539b4dfcd1e4dc3153e59204004c2141f796f43273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e7906148ac565b60405180910390fd5b5b80601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60065481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461178b9061452c565b80601f01602080910402602001604051908101604052809291908181526020018280546117b79061452c565b80156118045780601f106117d957610100808354040283529160200191611804565b820191906000526020600020905b8154815290600101906020018083116117e757829003601f168201915b5050505050905090565b61181661285c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146118a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189c906143ec565b60405180910390fd5b7f000000000000000000000000539b4dfcd1e4dc3153e59204004c2141f796f43273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192b9061493e565b60405180910390fd5b61193e828261354c565b5050565b6000806001600061195161285c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611a0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a05906149d0565b60405180910390fd5b611a22611a1961285c565b85858403612864565b600191505092915050565b6000611a41611a3a61285c565b8484612a2f565b6001905092915050565b60085481565b60166020528060005260406000206000915054906101000a900460ff1681565b611a7961285c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aff906143ec565b60405180910390fd5b6103218484905010611b4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4690614a62565b60405180910390fd5b818190508484905014611b97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8e90614af4565b60405180910390fd5b6000805b85859050811015611bfe57611bae610f75565b600a611bba9190614c47565b848483818110611bcd57611bcc614c92565b5b90506020020135611bde91906145f0565b82611be9919061443b565b91508080611bf690614cc1565b915050611b9b565b5080611c0933611345565b1015611c4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4190614d56565b60405180910390fd5b60005b85859050811015611cd457611cc133878784818110611c6f57611c6e614c92565b5b9050602002016020810190611c849190613fd9565b611c8c610f75565b600a611c989190614c47565b878786818110611cab57611caa614c92565b5b90506020020135611cbc91906145f0565b612a2f565b8080611ccc90614cc1565b915050611c4d565b505050505050565b600b60159054906101000a900460ff1681565b611cf761285c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7d906143ec565b60405180910390fd5b80601460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051611e239190613fbe565b60405180910390a25050565b611e3761285c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ec6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebd906143ec565b60405180910390fd5b670de0b6b3a76400006103e86003611edc610d0a565b611ee691906145f0565b611ef09190614679565b611efa9190614679565b811015611f3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3390614de8565b60405180910390fd5b670de0b6b3a764000081611f5091906145f0565b6008819055507fefc9add9a9b7382de284ef5ad69d8ea863e2680492b21a81948c2d5f04a442bc600854604051611f87919061408f565b60405180910390a150565b60125481565b611fa061285c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461202f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612026906143ec565b60405180910390fd5b620186a0600161203d610d0a565b61204791906145f0565b6120519190614679565b811015612093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208a90614e7a565b60405180910390fd5b6103e860016120a0610d0a565b6120aa91906145f0565b6120b49190614679565b8111156120f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ed90614f0c565b60405180910390fd5b80600a8190555050565b600c5481565b61210e61285c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461219d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612194906143ec565b60405180910390fd5b670de0b6b3a76400006103e860016121b3610d0a565b6121bd91906145f0565b6121c79190614679565b6121d19190614679565b811015612213576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220a90614f9e565b60405180910390fd5b670de0b6b3a76400008161222791906145f0565b6007819055507f53c4eb831d8cfeb750f1c62590d8cd30f4c6f0380d29a05caa09f0d92588560e60075460405161225e919061408f565b60405180910390a150565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600a5481565b600e5481565b61230461285c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238a906143ec565b60405180910390fd5b600b60159054906101000a900460ff16156123e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123da9061500a565b60405180910390fd5b80600b60156101000a81548160ff0219169083151502179055506001600b60166101000a81548160ff0219169083151502179055507fe8a59d3db38e5220ac9d0f72590b7ac876e0916dc8f4db3e7614e6f91fe52089600b60159054906101000a900460ff166040516124569190613fbe565b60405180910390a150565b61246961285c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146124f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ef906143ec565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612568576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255f9061509c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60115481565b61263661285c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146126c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126bc906143ec565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561274d57612702611752565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015612747573d6000803e3d6000fd5b50612859565b600081905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161278d9190614170565b602060405180830381865afa1580156127aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ce91906150d1565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6127f4611752565b836040518363ffffffff1660e01b81526004016128129291906150fe565b6020604051808303816000875af1158015612831573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612855919061513c565b5050505b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128cb906151db565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612944576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293b9061526d565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612a22919061408f565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a96906152ff565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0690615391565b60405180910390fd5b60008111612b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b49906153fd565b60405180910390fd5b600b60149054906101000a900460ff161561310157612b6f611752565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612bdd5750612bad611752565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612c165750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612c50575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b1561310057600b60159054906101000a900460ff16612dbf57601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612d0a5750601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612d49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4090615469565b60405180910390fd5b612d51611752565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612dbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612db5906154d5565b60405180910390fd5b5b601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612e625750601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612f0957600654811115612eac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea390615567565b60405180910390fd5b600854612eb883611345565b82612ec3919061443b565b1115612f04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612efb906155d3565b60405180910390fd5b6130ff565b601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612fac5750601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612ffb57600754811115612ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fed90615665565b60405180910390fd5b6130fe565b601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615801561309f5750601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156130fd576008546130b083611345565b826130bb919061443b565b11156130fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f3906155d3565b60405180910390fd5b5b5b5b5b5b600061310c30611345565b90506000600a5482101590508080156131315750600b60169054906101000a900460ff165b801561314a5750600960009054906101000a900460ff16155b80156131a05750601660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156131f65750601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561324c5750601460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15613290576001600960006101000a81548160ff0219169083151502179055506132746135f7565b6000600960006101000a81548160ff0219169083151502179055505b600060019050601460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806133375750601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561334157600090505b6000811561353857601660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156133a457506000600f54115b15613430576064600f54866133b991906145f0565b6133c39190614679565b9050600f54601154826133d691906145f0565b6133e09190614679565b601360008282546133f1919061443b565b92505081905550600f546010548261340991906145f0565b6134139190614679565b60126000828254613424919061443b565b92505081905550613514565b601660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561348b57506000600c54115b15613513576064600c54866134a091906145f0565b6134aa9190614679565b9050600c54600e54826134bd91906145f0565b6134c79190614679565b601360008282546134d8919061443b565b92505081905550600c54600d54826134f091906145f0565b6134fa9190614679565b6012600082825461350b919061443b565b925050819055505b5b6000811115613529576135288730836137ad565b5b80856135359190615685565b94505b6135438787876137ad565b50505050505050565b80601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506135ad8282613a18565b8015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b600061360230611345565b90506000601254601354613616919061443b565b905060008214806136275750600081145b156136335750506137ab565b600a805461364191906145f0565b82111561365957600a805461365691906145f0565b91505b6000806002836013548661366d91906145f0565b6136779190614679565b6136819190614679565b905061369781856136929190615685565b613aac565b60004790506000819050600060026013546136b29190614679565b866136bd9190615685565b601254846136cb91906145f0565b6136d59190614679565b905080826136e39190615685565b9150600060138190555060006012819055506000841180156137055750600082115b15613715576137148483613ce9565b5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405161375b906156ea565b60006040518083038185875af1925050503d8060008114613798576040519150601f19603f3d011682016040523d82523d6000602084013e61379d565b606091505b505080955050505050505050505b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561381d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613814906152ff565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561388d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161388490615391565b60405180910390fd5b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613913576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161390a90615771565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546139a6919061443b565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613a0a919061408f565b60405180910390a350505050565b80601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd67468282604051613aa0929190615791565b60405180910390a15050565b6000600267ffffffffffffffff811115613ac957613ac86157ba565b5b604051908082528060200260200182016040528015613af75781602001602082028036833780820191505090505b5090503081600081518110613b0f57613b0e614c92565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613bb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bd891906157fe565b81600181518110613bec57613beb614c92565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613c51307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84612864565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401613cb3959493929190615924565b600060405180830381600087803b158015613ccd57600080fd5b505af1158015613ce1573d6000803e3d6000fd5b505050505050565b613d14307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84612864565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080613d5e611752565b426040518863ffffffff1660e01b8152600401613d809695949392919061597e565b60606040518083038185885af1158015613d9e573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613dc391906159df565b5050505050565b600080fd5b600080fd5b6000819050919050565b613de781613dd4565b8114613df257600080fd5b50565b600081359050613e0481613dde565b92915050565b60008060408385031215613e2157613e20613dca565b5b6000613e2f85828601613df5565b9250506020613e4085828601613df5565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613e84578082015181840152602081019050613e69565b83811115613e93576000848401525b50505050565b6000601f19601f8301169050919050565b6000613eb582613e4a565b613ebf8185613e55565b9350613ecf818560208601613e66565b613ed881613e99565b840191505092915050565b60006020820190508181036000830152613efd8184613eaa565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613f3082613f05565b9050919050565b613f4081613f25565b8114613f4b57600080fd5b50565b600081359050613f5d81613f37565b92915050565b60008060408385031215613f7a57613f79613dca565b5b6000613f8885828601613f4e565b9250506020613f9985828601613df5565b9150509250929050565b60008115159050919050565b613fb881613fa3565b82525050565b6000602082019050613fd36000830184613faf565b92915050565b600060208284031215613fef57613fee613dca565b5b6000613ffd84828501613f4e565b91505092915050565b6000819050919050565b600061402b61402661402184613f05565b614006565b613f05565b9050919050565b600061403d82614010565b9050919050565b600061404f82614032565b9050919050565b61405f81614044565b82525050565b600060208201905061407a6000830184614056565b92915050565b61408981613dd4565b82525050565b60006020820190506140a46000830184614080565b92915050565b6000806000606084860312156140c3576140c2613dca565b5b60006140d186828701613f4e565b93505060206140e286828701613f4e565b92505060406140f386828701613df5565b9150509250925092565b60006020828403121561411357614112613dca565b5b600061412184828501613df5565b91505092915050565b600060ff82169050919050565b6141408161412a565b82525050565b600060208201905061415b6000830184614137565b92915050565b61416a81613f25565b82525050565b60006020820190506141856000830184614161565b92915050565b61419481613fa3565b811461419f57600080fd5b50565b6000813590506141b18161418b565b92915050565b600080604083850312156141ce576141cd613dca565b5b60006141dc85828601613f4e565b92505060206141ed858286016141a2565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f84011261421c5761421b6141f7565b5b8235905067ffffffffffffffff811115614239576142386141fc565b5b60208301915083602082028301111561425557614254614201565b5b9250929050565b60008083601f840112614272576142716141f7565b5b8235905067ffffffffffffffff81111561428f5761428e6141fc565b5b6020830191508360208202830111156142ab576142aa614201565b5b9250929050565b600080600080604085870312156142cc576142cb613dca565b5b600085013567ffffffffffffffff8111156142ea576142e9613dcf565b5b6142f687828801614206565b9450945050602085013567ffffffffffffffff81111561431957614318613dcf565b5b6143258782880161425c565b925092505092959194509250565b6000806040838503121561434a57614349613dca565b5b600061435885828601613f4e565b925050602061436985828601613f4e565b9150509250929050565b60006020828403121561438957614388613dca565b5b6000614397848285016141a2565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006143d6602083613e55565b91506143e1826143a0565b602082019050919050565b60006020820190508181036000830152614405816143c9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061444682613dd4565b915061445183613dd4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156144865761448561440c565b5b828201905092915050565b7f4d757374206b656570206665657320617420333025206f72206c657373000000600082015250565b60006144c7601d83613e55565b91506144d282614491565b602082019050919050565b600060208201905081810360008301526144f6816144ba565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061454457607f821691505b60208210811415614558576145576144fd565b5b50919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b60006145ba602883613e55565b91506145c58261455e565b604082019050919050565b600060208201905081810360008301526145e9816145ad565b9050919050565b60006145fb82613dd4565b915061460683613dd4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561463f5761463e61440c565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061468482613dd4565b915061468f83613dd4565b92508261469f5761469e61464a565b5b828204905092915050565b7f43616e6e6f7420736574206d61782062757920616d6f756e74206c6f7765722060008201527f7468616e20302e31250000000000000000000000000000000000000000000000602082015250565b6000614706602983613e55565b9150614711826146aa565b604082019050919050565b60006020820190508181036000830152614735816146f9565b9050919050565b7f5f54726561737572794164647265737320616464726573732063616e6e6f742060008201527f6265203000000000000000000000000000000000000000000000000000000000602082015250565b6000614798602483613e55565b91506147a38261473c565b604082019050919050565b600060208201905081810360008301526147c78161478b565b9050919050565b7f4d757374206b656570206665657320617420313525206f72206c657373000000600082015250565b6000614804601d83613e55565b915061480f826147ce565b602082019050919050565b60006020820190508181036000830152614833816147f7565b9050919050565b7f43616e6e6f742072656d6f766520756e697377617020706169722066726f6d2060008201527f6d61782074786e00000000000000000000000000000000000000000000000000602082015250565b6000614896602783613e55565b91506148a18261483a565b604082019050919050565b600060208201905081810360008301526148c581614889565b9050919050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060008201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b6000614928603983613e55565b9150614933826148cc565b604082019050919050565b600060208201905081810360008301526149578161491b565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006149ba602583613e55565b91506149c58261495e565b604082019050919050565b600060208201905081810360008301526149e9816149ad565b9050919050565b7f474153204572726f723a206d61782061697264726f70206c696d69742069732060008201527f3530302061646472657373657300000000000000000000000000000000000000602082015250565b6000614a4c602d83613e55565b9150614a57826149f0565b604082019050919050565b60006020820190508181036000830152614a7b81614a3f565b9050919050565b7f4d69736d61746368206265747765656e204164647265737320616e6420746f6b60008201527f656e20636f756e74000000000000000000000000000000000000000000000000602082015250565b6000614ade602883613e55565b9150614ae982614a82565b604082019050919050565b60006020820190508181036000830152614b0d81614ad1565b9050919050565b60008160011c9050919050565b6000808291508390505b6001851115614b6b57808604811115614b4757614b4661440c565b5b6001851615614b565780820291505b8081029050614b6485614b14565b9450614b2b565b94509492505050565b600082614b845760019050614c40565b81614b925760009050614c40565b8160018114614ba85760028114614bb257614be1565b6001915050614c40565b60ff841115614bc457614bc361440c565b5b8360020a915084821115614bdb57614bda61440c565b5b50614c40565b5060208310610133831016604e8410600b8410161715614c165782820a905083811115614c1157614c1061440c565b5b614c40565b614c238484846001614b21565b92509050818404811115614c3a57614c3961440c565b5b81810290505b9392505050565b6000614c5282613dd4565b9150614c5d8361412a565b9250614c8a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484614b74565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614ccc82613dd4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614cff57614cfe61440c565b5b600182019050919050565b7f4e6f7420656e6f75676820746f6b656e7320696e2077616c6c65740000000000600082015250565b6000614d40601b83613e55565b9150614d4b82614d0a565b602082019050919050565b60006020820190508181036000830152614d6f81614d33565b9050919050565b7f43616e6e6f7420736574206d61782077616c6c657420616d6f756e74206c6f7760008201527f6572207468616e20302e33250000000000000000000000000000000000000000602082015250565b6000614dd2602c83613e55565b9150614ddd82614d76565b604082019050919050565b60006020820190508181036000830152614e0181614dc5565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60008201527f20302e3030312520746f74616c20737570706c792e0000000000000000000000602082015250565b6000614e64603583613e55565b9150614e6f82614e08565b604082019050919050565b60006020820190508181036000830152614e9381614e57565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206869676865722074686160008201527f6e20302e312520746f74616c20737570706c792e000000000000000000000000602082015250565b6000614ef6603483613e55565b9150614f0182614e9a565b604082019050919050565b60006020820190508181036000830152614f2581614ee9565b9050919050565b7f43616e6e6f7420736574206d61782073656c6c20616d6f756e74206c6f77657260008201527f207468616e20302e312500000000000000000000000000000000000000000000602082015250565b6000614f88602a83613e55565b9150614f9382614f2c565b604082019050919050565b60006020820190508181036000830152614fb781614f7b565b9050919050565b7f43616e6e6f7420726520656e61626c652074726164696e670000000000000000600082015250565b6000614ff4601883613e55565b9150614fff82614fbe565b602082019050919050565b6000602082019050818103600083015261502381614fe7565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615086602683613e55565b91506150918261502a565b604082019050919050565b600060208201905081810360008301526150b581615079565b9050919050565b6000815190506150cb81613dde565b92915050565b6000602082840312156150e7576150e6613dca565b5b60006150f5848285016150bc565b91505092915050565b60006040820190506151136000830185614161565b6151206020830184614080565b9392505050565b6000815190506151368161418b565b92915050565b60006020828403121561515257615151613dca565b5b600061516084828501615127565b91505092915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006151c5602483613e55565b91506151d082615169565b604082019050919050565b600060208201905081810360008301526151f4816151b8565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000615257602283613e55565b9150615262826151fb565b604082019050919050565b600060208201905081810360008301526152868161524a565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006152e9602583613e55565b91506152f48261528d565b604082019050919050565b60006020820190508181036000830152615318816152dc565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061537b602383613e55565b91506153868261531f565b604082019050919050565b600060208201905081810360008301526153aa8161536e565b9050919050565b7f616d6f756e74206d7573742062652067726561746572207468616e2030000000600082015250565b60006153e7601d83613e55565b91506153f2826153b1565b602082019050919050565b60006020820190508181036000830152615416816153da565b9050919050565b7f54726164696e67206973206e6f74206163746976652e00000000000000000000600082015250565b6000615453601683613e55565b915061545e8261541d565b602082019050919050565b6000602082019050818103600083015261548281615446565b9050919050565b7f54726164696e6720697320656e61626c65640000000000000000000000000000600082015250565b60006154bf601283613e55565b91506154ca82615489565b602082019050919050565b600060208201905081810360008301526154ee816154b2565b9050919050565b7f427579207472616e7366657220616d6f756e742065786365656473207468652060008201527f6d6178206275792e000000000000000000000000000000000000000000000000602082015250565b6000615551602883613e55565b915061555c826154f5565b604082019050919050565b6000602082019050818103600083015261558081615544565b9050919050565b7f43616e6e6f7420457863656564206d61782077616c6c65740000000000000000600082015250565b60006155bd601883613e55565b91506155c882615587565b602082019050919050565b600060208201905081810360008301526155ec816155b0565b9050919050565b7f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560008201527f206d61782073656c6c2e00000000000000000000000000000000000000000000602082015250565b600061564f602a83613e55565b915061565a826155f3565b604082019050919050565b6000602082019050818103600083015261567e81615642565b9050919050565b600061569082613dd4565b915061569b83613dd4565b9250828210156156ae576156ad61440c565b5b828203905092915050565b600081905092915050565b50565b60006156d46000836156b9565b91506156df826156c4565b600082019050919050565b60006156f5826156c7565b9150819050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061575b602683613e55565b9150615766826156ff565b604082019050919050565b6000602082019050818103600083015261578a8161574e565b9050919050565b60006040820190506157a66000830185614161565b6157b36020830184613faf565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000815190506157f881613f37565b92915050565b60006020828403121561581457615813613dca565b5b6000615822848285016157e9565b91505092915050565b6000819050919050565b600061585061584b6158468461582b565b614006565b613dd4565b9050919050565b61586081615835565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61589b81613f25565b82525050565b60006158ad8383615892565b60208301905092915050565b6000602082019050919050565b60006158d182615866565b6158db8185615871565b93506158e683615882565b8060005b838110156159175781516158fe88826158a1565b9750615909836158b9565b9250506001810190506158ea565b5085935050505092915050565b600060a0820190506159396000830188614080565b6159466020830187615857565b818103604083015261595881866158c6565b90506159676060830185614161565b6159746080830184614080565b9695505050505050565b600060c0820190506159936000830189614161565b6159a06020830188614080565b6159ad6040830187615857565b6159ba6060830186615857565b6159c76080830185614161565b6159d460a0830184614080565b979650505050505050565b6000806000606084860312156159f8576159f7613dca565b5b6000615a06868287016150bc565b9350506020615a17868287016150bc565b9250506040615a28868287016150bc565b915050925092509256fea26469706673582212200c6d2b6c5c261ae77683df08efb046dc7a6322c1b37516c7d1455a700a534b6e64736f6c634300080c0033
Verified Source Code Partial Match
Compiler: v0.8.12+commit.f00d7308
EVM: london
Optimization: No
io2DAIToken.sol 582 lines
/**
* 2DAI.io
* Telegram: https://t.me/Token2dAI
* Ready to unleash your creativity with the power of AI? Let's generate the visuals of your dreams.
* Total Supply: 1 Billion Tokens
* Initial Max Wallet: 2% (>20000000 Tokens)
* Set slippage to 3-4% : 1% to LP, 2% tax for Marketing & Hosting costs.
*/
// SPDX-License-Identifier: MIT
pragma solidity 0.8.12;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
this;
return msg.data;
}
}
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
interface IERC20Metadata is IERC20 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
}
contract ERC20 is Context, IERC20, IERC20Metadata {
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
function name() public view virtual override returns (string memory) {
return _name;
}
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
function decimals() public view virtual override returns (uint8) {
return 18;
}
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
function approve(address spender, uint256 amount) public virtual override returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
function transferFrom(
address sender,
address recipient,
uint256 amount
) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
uint256 currentAllowance = _allowances[sender][_msgSender()];
require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
unchecked {
_approve(sender, _msgSender(), currentAllowance - amount);
}
return true;
}
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
return true;
}
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
uint256 currentAllowance = _allowances[_msgSender()][spender];
require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
unchecked {
_approve(_msgSender(), spender, currentAllowance - subtractedValue);
}
return true;
}
function _transfer(
address sender,
address recipient,
uint256 amount
) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
uint256 senderBalance = _balances[sender];
require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
unchecked {
_balances[sender] = senderBalance - amount;
}
_balances[recipient] += amount;
emit Transfer(sender, recipient, amount);
}
function _createInitialSupply(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_totalSupply += amount;
_balances[account] += amount;
emit Transfer(address(0), account, amount);
}
function _approve(
address owner,
address spender,
uint256 amount
) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
}
contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor () {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
function owner() public view returns (address) {
return _owner;
}
modifier onlyOwner() {
require(_owner == _msgSender(), "Ownable: caller is not the owner");
_;
}
function renounceOwnership() external virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
interface IDexRouter {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function addLiquidityETH(
address token,
uint256 amountTokenDesired,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
)
external
payable
returns (
uint256 amountToken,
uint256 amountETH,
uint256 liquidity
);
}
interface IDexFactory {
function createPair(address tokenA, address tokenB)
external
returns (address pair);
}
contract io2DAIToken is ERC20, Ownable {
uint256 public maxBuyAmount;
uint256 public maxSellAmount;
uint256 public maxWalletAmount;
IDexRouter public immutable uniswapV2Router;
address public immutable uniswapV2Pair;
bool private swapping;
uint256 public swapTokensAtAmount;
address public TreasuryAddress;
bool public limitsInEffect = true;
bool public tradingActive = false;
bool public swapEnabled = false;
uint256 public buyTotalFees;
uint256 public buyTreasuryFee;
uint256 public buyLiquidityFee;
uint256 public sellTotalFees;
uint256 public sellTreasuryFee;
uint256 public sellLiquidityFee;
uint256 public tokensForTreasury;
uint256 public tokensForLiquidity;
// exlcude from fees and max transaction amount
mapping (address => bool) private _isExcludedFromFees;
mapping (address => bool) public _isExcludedMaxTransactionAmount;
// store addresses that a automatic market maker pairs. Any transfer *to* these addresses
// could be subject to a maximum transfer amount
mapping (address => bool) public automatedMarketMakerPairs;
event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
event EnabledTrading(bool tradingActive);
event RemovedLimits();
event ExcludeFromFees(address indexed account, bool isExcluded);
event UpdatedMaxBuyAmount(uint256 newAmount);
event UpdatedMaxSellAmount(uint256 newAmount);
event UpdatedMaxWalletAmount(uint256 newAmount);
event UpdatedTreasuryAddress(address indexed newWallet);
event UpdatedRewardsAddress(address indexed newWallet);
event MaxTransactionExclusion(address _address, bool excluded);
event SwapAndLiquify(
uint256 tokensSwapped,
uint256 ethReceived,
uint256 tokensIntoLiquidity
);
constructor() ERC20("2DAI.io", "2DAI") {
address newOwner = msg.sender;
IDexRouter _uniswapV2Router = IDexRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
_excludeFromMaxTransaction(address(_uniswapV2Router), true);
uniswapV2Router = _uniswapV2Router;
uniswapV2Pair = IDexFactory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
_setAutomatedMarketMakerPair(address(uniswapV2Pair), true);
uint256 totalSupply = 1000000000 * 1e18;
maxBuyAmount = totalSupply * 20 / 1000;
maxSellAmount = totalSupply * 20 / 1000;
maxWalletAmount = totalSupply * 20 / 1000;
swapTokensAtAmount = totalSupply * 50 / 100000;
buyTreasuryFee = 2;
buyLiquidityFee = 1;
buyTotalFees = buyTreasuryFee + buyLiquidityFee;
sellTreasuryFee = 2;
sellLiquidityFee = 1;
sellTotalFees = sellTreasuryFee + sellLiquidityFee;
_excludeFromMaxTransaction(newOwner, true);
_excludeFromMaxTransaction(address(this), true);
_excludeFromMaxTransaction(address(0xdead), true);
TreasuryAddress = address(0x7cDEfde9fb25b015220c27d69d04b9362912AE6a);
excludeFromFees(newOwner, true);
excludeFromFees(address(this), true);
excludeFromFees(address(0xdead), true);
_createInitialSupply(newOwner, totalSupply);
transferOwnership(newOwner);
}
receive() external payable {}
function updateMaxBuyAmount(uint256 newNum) external onlyOwner {
require(newNum >= (totalSupply() * 1 / 1000)/1e18, "Cannot set max buy amount lower than 0.1%");
maxBuyAmount = newNum * (10**18);
emit UpdatedMaxBuyAmount(maxBuyAmount);
}
function updateMaxSellAmount(uint256 newNum) external onlyOwner {
require(newNum >= (totalSupply() * 1 / 1000)/1e18, "Cannot set max sell amount lower than 0.1%");
maxSellAmount = newNum * (10**18);
emit UpdatedMaxSellAmount(maxSellAmount);
}
// remove limits after token is stable
function removeLimits() external onlyOwner {
limitsInEffect = false;
emit RemovedLimits();
}
function _excludeFromMaxTransaction(address updAds, bool isExcluded) private {
_isExcludedMaxTransactionAmount[updAds] = isExcluded;
emit MaxTransactionExclusion(updAds, isExcluded);
}
function excludeFromMaxTransaction(address updAds, bool isEx) external onlyOwner {
if(!isEx){
require(updAds != uniswapV2Pair, "Cannot remove uniswap pair from max txn");
}
_isExcludedMaxTransactionAmount[updAds] = isEx;
}
function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
require(newNum >= (totalSupply() * 3 / 1000)/1e18, "Cannot set max wallet amount lower than 0.3%");
maxWalletAmount = newNum * (10**18);
emit UpdatedMaxWalletAmount(maxWalletAmount);
}
// change the minimum amount of tokens to sell from fees
function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner {
require(newAmount >= totalSupply() * 1 / 100000, "Swap amount cannot be lower than 0.001% total supply.");
require(newAmount <= totalSupply() * 1 / 1000, "Swap amount cannot be higher than 0.1% total supply.");
swapTokensAtAmount = newAmount;
}
function updateBuyFees(uint256 _treasuryFee, uint256 _liquidityFee) external onlyOwner {
buyTreasuryFee = _treasuryFee;
buyLiquidityFee = _liquidityFee;
buyTotalFees = buyTreasuryFee + buyLiquidityFee;
require(buyTotalFees <= 15, "Must keep fees at 15% or less");
}
function updateSellFees(uint256 _treasuryFee, uint256 _liquidityFee) external onlyOwner {
sellTreasuryFee = _treasuryFee;
sellLiquidityFee = _liquidityFee;
sellTotalFees = sellTreasuryFee + sellLiquidityFee;
require(sellTotalFees <= 30, "Must keep fees at 30% or less");
}
function excludeFromFees(address account, bool excluded) public onlyOwner {
_isExcludedFromFees[account] = excluded;
emit ExcludeFromFees(account, excluded);
}
function _transfer(address from, address to, uint256 amount) internal override {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
require(amount > 0, "amount must be greater than 0");
if(limitsInEffect){
if (from != owner() && to != owner() && to != address(0) && to != address(0xdead)){
if(!tradingActive){
require(_isExcludedMaxTransactionAmount[from] || _isExcludedMaxTransactionAmount[to], "Trading is not active.");
require(from == owner(), "Trading is enabled");
}
//when buy
if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
require(amount <= maxBuyAmount, "Buy transfer amount exceeds the max buy.");
require(amount + balanceOf(to) <= maxWalletAmount, "Cannot Exceed max wallet");
}
//when sell
else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
require(amount <= maxSellAmount, "Sell transfer amount exceeds the max sell.");
}
else if (!_isExcludedMaxTransactionAmount[to] && !_isExcludedMaxTransactionAmount[from]){
require(amount + balanceOf(to) <= maxWalletAmount, "Cannot Exceed max wallet");
}
}
}
uint256 contractTokenBalance = balanceOf(address(this));
bool canSwap = contractTokenBalance >= swapTokensAtAmount;
if(canSwap && swapEnabled && !swapping && !automatedMarketMakerPairs[from] && !_isExcludedFromFees[from] && !_isExcludedFromFees[to]) {
swapping = true;
swapBack();
swapping = false;
}
bool takeFee = true;
// if any account belongs to _isExcludedFromFee account then remove the fee
if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
takeFee = false;
}
uint256 fees = 0;
// only take fees on Trades, not on wallet transfers
if(takeFee){
// on sell
if (automatedMarketMakerPairs[to] && sellTotalFees > 0){
fees = amount * sellTotalFees /100;
tokensForLiquidity += fees * sellLiquidityFee / sellTotalFees;
tokensForTreasury += fees * sellTreasuryFee / sellTotalFees;
}
// on buy
else if(automatedMarketMakerPairs[from] && buyTotalFees > 0) {
fees = amount * buyTotalFees / 100;
tokensForLiquidity += fees * buyLiquidityFee / buyTotalFees;
tokensForTreasury += fees * buyTreasuryFee / buyTotalFees;
}
if(fees > 0){
super._transfer(from, address(this), fees);
}
amount -= fees;
}
super._transfer(from, to, amount);
}
function swapTokensForEth(uint256 tokenAmount) private {
// generate the uniswap pair path of token -> weth
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = uniswapV2Router.WETH();
_approve(address(this), address(uniswapV2Router), tokenAmount);
// make the swap
uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
tokenAmount,
0, // accept any amount of ETH
path,
address(this),
block.timestamp
);
}
function setAutomatedMarketMakerPair(address pair, bool value) external onlyOwner {
require(pair != uniswapV2Pair, "The pair cannot be removed from automatedMarketMakerPairs");
_setAutomatedMarketMakerPair(pair, value);
}
function _setAutomatedMarketMakerPair(address pair, bool value) private {
automatedMarketMakerPairs[pair] = value;
_excludeFromMaxTransaction(pair, value);
emit SetAutomatedMarketMakerPair(pair, value);
}
// once enabled, can never be turned off
function enableTrading(bool _status) external onlyOwner {
require(!tradingActive, "Cannot re enable trading");
tradingActive = _status;
swapEnabled = true;
emit EnabledTrading(tradingActive);
}
function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
// approve token transfer to cover all possible scenarios
_approve(address(this), address(uniswapV2Router), tokenAmount);
// add the liquidity
uniswapV2Router.addLiquidityETH{value: ethAmount}(
address(this),
tokenAmount,
0, // slippage is unavoidable
0, // slippage is unavoidable
address(owner()),
block.timestamp
);
}
function multiSend(address[] calldata addresses, uint256[] calldata tokens) external onlyOwner {
require(addresses.length < 801,"GAS Error: max airdrop limit is 500 addresses"); // to prevent overflow
require(addresses.length == tokens.length,"Mismatch between Address and token count");
uint256 SCCC = 0;
for(uint i=0; i < addresses.length; i++){
SCCC = SCCC + (tokens[i] * 10**decimals());
}
require(balanceOf(msg.sender) >= SCCC, "Not enough tokens in wallet");
for(uint i=0; i < addresses.length; i++){
_transfer(msg.sender,addresses[i],(tokens[i] * 10**decimals()));
}
}
function setTreasuryAddress(address _TreasuryAddress) external onlyOwner {
require(_TreasuryAddress != address(0), "_TreasuryAddress address cannot be 0");
TreasuryAddress = payable(_TreasuryAddress);
emit UpdatedTreasuryAddress(_TreasuryAddress);
}
function swapBack() private {
uint256 contractBalance = balanceOf(address(this));
uint256 totalTokensToSwap = tokensForLiquidity + tokensForTreasury;
if(contractBalance == 0 || totalTokensToSwap == 0) {return;}
if(contractBalance > swapTokensAtAmount * 10){
contractBalance = swapTokensAtAmount * 10;
}
bool success;
// Halve the amount of liquidity tokens
uint256 liquidityTokens = contractBalance * tokensForLiquidity / totalTokensToSwap / 2;
swapTokensForEth(contractBalance - liquidityTokens);
uint256 ethBalance = address(this).balance;
uint256 ethForLiquidity = ethBalance;
uint256 ethForTreasury = ethBalance * tokensForTreasury / (totalTokensToSwap - (tokensForLiquidity/2));
ethForLiquidity -= ethForTreasury;
tokensForLiquidity = 0;
tokensForTreasury = 0;
if(liquidityTokens > 0 && ethForLiquidity > 0){
addLiquidity(liquidityTokens, ethForLiquidity);
}
(success,) = address(TreasuryAddress).call{value: address(this).balance}("");
}
function claimStuckTokens(address _token) external onlyOwner {
if (_token == address(0x0)) {
payable(owner()).transfer(address(this).balance);
return;
}
IERC20 erc20token = IERC20(_token);
uint256 balance = erc20token.balanceOf(address(this));
erc20token.transfer(owner(), balance);
}
}
Read Contract
TreasuryAddress 0x5b5c251f → address
_isExcludedMaxTransactionAmount 0x10d5de53 → bool
allowance 0xdd62ed3e → uint256
automatedMarketMakerPairs 0xb62496f5 → bool
balanceOf 0x70a08231 → uint256
buyLiquidityFee 0xf11a24d3 → uint256
buyTotalFees 0xd85ba063 → uint256
buyTreasuryFee 0x5c068a8c → uint256
decimals 0x313ce567 → uint8
limitsInEffect 0x4a62bb65 → bool
maxBuyAmount 0x88e765ff → uint256
maxSellAmount 0x66d602ae → uint256
maxWalletAmount 0xaa4bde28 → uint256
name 0x06fdde03 → string
owner 0x8da5cb5b → address
sellLiquidityFee 0xf6374342 → uint256
sellTotalFees 0x6a486a8e → uint256
sellTreasuryFee 0x6b2fb124 → uint256
swapEnabled 0x6ddd1713 → bool
swapTokensAtAmount 0xe2f45605 → uint256
symbol 0x95d89b41 → string
tokensForLiquidity 0x1a8145bb → uint256
tokensForTreasury 0xcc2ffe7c → uint256
totalSupply 0x18160ddd → uint256
tradingActive 0xbbc0c742 → bool
uniswapV2Pair 0x49bd5a5e → address
uniswapV2Router 0x1694505e → address
Write Contract 21 functions
These functions modify contract state and require a wallet transaction to execute.
approve 0x095ea7b3
address spender
uint256 amount
returns: bool
claimStuckTokens 0xf9d0831a
address _token
decreaseAllowance 0xa457c2d7
address spender
uint256 subtractedValue
returns: bool
enableTrading 0xf275f64b
bool _status
excludeFromFees 0xc0246668
address account
bool excluded
excludeFromMaxTransaction 0x7571336a
address updAds
bool isEx
increaseAllowance 0x39509351
address spender
uint256 addedValue
returns: bool
multiSend 0xbb4c9f0b
address[] addresses
uint256[] tokens
removeLimits 0x751039fc
No parameters
renounceOwnership 0x715018a6
No parameters
setAutomatedMarketMakerPair 0x9a7a23d6
address pair
bool value
setTreasuryAddress 0x6605bfda
address _TreasuryAddress
transfer 0xa9059cbb
address recipient
uint256 amount
returns: bool
transferFrom 0x23b872dd
address sender
address recipient
uint256 amount
returns: bool
transferOwnership 0xf2fde38b
address newOwner
updateBuyFees 0x66ca9b83
uint256 _treasuryFee
uint256 _liquidityFee
updateMaxBuyAmount 0x2be32b61
uint256 newNum
updateMaxSellAmount 0xdc3f0d0f
uint256 newNum
updateMaxWalletAmount 0xc18bc195
uint256 newNum
updateSellFees 0x02dbd8f8
uint256 _treasuryFee
uint256 _liquidityFee
updateSwapTokensAtAmount 0xd257b34f
uint256 newAmount
Recent Transactions
No transactions found for this address