Contract 0xf47dfA415b9447B40f562Ae5D8C0A01683d5509D 1

 
Txn Hash Method
Block
From
To
Value
0x5286a541fd1f182acc11149fb5f8caf28d9686434139975dc985f96106992d16Cash Out123397672021-04-30 4:41:10149 days 21 hrs ago0x967b073201215cabbbc0f1c1f2b258683b495cb4 IN  0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0 Ether0.00159315231
0x37abff8996ddd465746e43b2f99e402764e56cb2fa71c4abea1a4f8c40fc91daSell Tokens123397602021-04-30 4:40:24149 days 21 hrs ago0x967b073201215cabbbc0f1c1f2b258683b495cb4 IN  0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0 Ether0.002811189632.8
0x6dd75744e093c7ba0c5648f190881c5c4c446a384b96ca5c768e353c68826ef8Cash Out118991732021-02-21 8:24:33217 days 17 hrs ago0x4dd4ae5e3d4f6d225c15535f713ad2f3dea52996 IN  0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0 Ether0.00646704120
0xc23ce6732edd9eb07504feecb6fdce1546ffc439dc9135d6d78e34de910c1a05Sell Tokens118990932021-02-21 8:04:55217 days 17 hrs ago0x4dd4ae5e3d4f6d225c15535f713ad2f3dea52996 IN  0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0 Ether0.010778613123
0xa7f9ae3a2b5a8ac62a1e1dba11a5b0dfadef3ade3153439120a463190409f268Cash Out109335872020-09-25 19:07:29366 days 6 hrs ago0xf7388b6a9c65bceecfaab0bed560dc229a899848 IN  0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0 Ether0.0035029865
0x21d8088e7dc2d5f0b747ab1307d7edcd246f147bb50c3f3794c8712072ccf0f0Sell Tokens109335682020-09-25 19:04:25366 days 6 hrs ago0xf7388b6a9c65bceecfaab0bed560dc229a899848 IN  0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0 Ether0.00697257696
0x936c1fb712cb74c87cf0ba3bc5b9ccd6b52deb716c9e3ae419c5f489f197f65bCash Out104598882020-07-14 20:54:37439 days 4 hrs ago0x6fa716966c81e8f907629f90352452d8f2dd0df4 IN  0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0 Ether0.00075448814
0x74612ba4314c2813e354be81721dc115dbba8cbdcdfed0dc07c8af1ed317f5deSell Tokens104560752020-07-14 6:34:52439 days 19 hrs ago0x6fa716966c81e8f907629f90352452d8f2dd0df4 IN  0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0 Ether0.00254208535
0x3a323cb96abe90059f16a61f76fd886de01c714c5e19f0edff400b45cf5fbaf8Double Down98692102020-04-14 7:36:44530 days 18 hrs agoENS Name krumil.eth IN  0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0 Ether0.0003438483
0x674682b4c78e0183d2b0ed5f2b6023c2cbb0d8347dd5c283ae0df3618b94b079Sell Tokens98007322020-04-03 18:37:52541 days 7 hrs ago0x6f1bc0edd28c72bb6bb484cfbc9befa02e79a545 IN  0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0 Ether0.0004357146
0x725040e21dd5753b4cd9bf54048cc46594af515c4d53aae7b083f1e9f011952bCash Out98007122020-04-03 18:32:43541 days 7 hrs ago0x6f1bc0edd28c72bb6bb484cfbc9befa02e79a545 IN  0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0 Ether0.0004311368
0x35cf2786abc06b9e2d670377f7034ba6d8782fd5db85b39bef3eb2d6ad6b822bCash Out97516932020-03-27 5:53:41548 days 20 hrs ago0x81f0d747157ee0f2c308a41d1334dc8a83d98108 IN  0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0 Ether0.0000538921
0xb75aede73c98e886373497f168922c7f35e44bb50dac09809442e7969c4c24aaTransfer96991882020-03-19 1:39:28557 days 14 mins agoENS Name thrillercrypto.eth IN  0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0 Ether0.00044234
0x84acb0c8a90b5947c5e339c4f45d1f92978a69f0fc9c6ae5da77ad1856be9c73Cash Out96902892020-03-17 17:02:41558 days 8 hrs ago0xf77fc2a7a1457f2efc504618190f87b38f8c4718 IN  0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0 Ether0.000269465
0x5b960b6f70c6f4e8821007620d882f5cb90a5a49a9aed75b69e9c015d6bf6c7bSell Tokens96902892020-03-17 17:02:41558 days 8 hrs ago0xf77fc2a7a1457f2efc504618190f87b38f8c4718 IN  0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0 Ether0.0003630955
0xd6c22fdb88c0fd614b8499f5e8e242f190b58a8ab5051478d23726e873a4cfceCash Out96452312020-03-10 18:03:42565 days 7 hrs ago0x5b0a412c6dc925d1dad14a83fe57f5b5cf952006 IN  0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0 Ether0.00017245443.2
0xcd09bd08558d400bd4f94a90be24df5e5de5011b9921a8dea8a551985b892ed1Sell Tokens96452212020-03-10 18:02:25565 days 7 hrs ago0x5b0a412c6dc925d1dad14a83fe57f5b5cf952006 IN  0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0 Ether0.000209177282.88
0xce1bc406dd9656a01ed438d3be52baa0154aadfa9c6f75e6308b619ed01682baCash Out95496872020-02-25 1:35:46580 days 18 mins ago0x74b4acd3883ff928ba01c92021dd7fc0730efed8 IN  0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0 Ether0.0000538921
0xd11e463b4a15a1197349b9d235a048ccc2419be719414325991e87a71e64c556Sell Tokens95496872020-02-25 1:35:46580 days 18 mins ago0x74b4acd3883ff928ba01c92021dd7fc0730efed8 IN  0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0 Ether0.0000726071
0x80a1f2117b980c6e94df660faf7355f9fd9160c7b748ff2b7926b71abc02745dCash Out95139272020-02-19 13:31:40585 days 12 hrs ago0x6e5d16b57e8ba136683089ea6c3d30c08b209bc5 IN  0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0 Ether0.0002155684
0x83bb3920000e55c83a3d8fb2415e1ee85932d6b85af7181e050ee9a882e4ecc1Cash Out95035962020-02-17 23:29:42587 days 2 hrs ago0x8da88ecac7c71edc34c742232c8d1fdc61c5f8be IN  0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0 Ether0.0000538921
0xf1d27c62065986849feccf6b7846c859981981f7d64c1103b4235d6708532e32Sell Tokens95031472020-02-17 21:47:06587 days 4 hrs ago0x8da88ecac7c71edc34c742232c8d1fdc61c5f8be IN  0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0 Ether0.0001452622
0xb25b4022d6aaf95fc63f982e12d42f174834db98ecd4f05cf10062efb1a0aeb5Sell Tokens94670402020-02-12 8:14:37592 days 17 hrs ago0x6e5d16b57e8ba136683089ea6c3d30c08b209bc5 IN  0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0 Ether0.000580768
0x57823e81fac2da4698970829877ec84f0dc1be045617c3a643c9ef2442430bcaSell Tokens94603362020-02-11 7:28:49593 days 18 hrs ago0x4dd4ae5e3d4f6d225c15535f713ad2f3dea52996 IN  0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0 Ether0.000350384
0x96cda17b3b32fce9a2208f7ffe01f497e811a12e73b87baa6e10ab28ab8bd9f5Sell Tokens94586362020-02-11 1:14:17594 days 39 mins ago0x8da88ecac7c71edc34c742232c8d1fdc61c5f8be IN  0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0 Ether0.0004379755
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x5286a541fd1f182acc11149fb5f8caf28d9686434139975dc985f96106992d16123397672021-04-30 4:41:10149 days 21 hrs ago 0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0x967b073201215cabbbc0f1c1f2b258683b495cb40.682637636315605974 Ether
0x37abff8996ddd465746e43b2f99e402764e56cb2fa71c4abea1a4f8c40fc91da123397602021-04-30 4:40:24149 days 21 hrs ago 0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0x967b073201215cabbbc0f1c1f2b258683b495cb40.52246717942881012 Ether
0x37abff8996ddd465746e43b2f99e402764e56cb2fa71c4abea1a4f8c40fc91da123397602021-04-30 4:40:24149 days 21 hrs ago 0xf47dfa415b9447b40f562ae5d8c0a01683d5509d 0x370ca03717c72e5eee6f8be267995a91cf5c09040.06883282007118988 Ether
0x95ae25fbd92c0757b4b96961e96ffd1a0cb59f14c83f744a602e218c6468e33b123397502021-04-30 4:39:06149 days 21 hrs ago 0x370ca03717c72e5eee6f8be267995a91cf5c0904 0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0.047105250050575256 Ether
0x6dd75744e093c7ba0c5648f190881c5c4c446a384b96ca5c768e353c68826ef8118991732021-02-21 8:24:33217 days 17 hrs ago 0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0x4dd4ae5e3d4f6d225c15535f713ad2f3dea529960.165869478537053959 Ether
0xd21fae6b46381298dd14a539ae1f793c554c0ee61417886cea1e950dbbc0ca14118991052021-02-21 8:08:22217 days 17 hrs ago 0x370ca03717c72e5eee6f8be267995a91cf5c0904 0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0.070420558530465659 Ether
0xc23ce6732edd9eb07504feecb6fdce1546ffc439dc9135d6d78e34de910c1a05118990932021-02-21 8:04:55217 days 17 hrs ago 0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0x4dd4ae5e3d4f6d225c15535f713ad2f3dea529960.622230289265698474 Ether
0xc23ce6732edd9eb07504feecb6fdce1546ffc439dc9135d6d78e34de910c1a05118990932021-02-21 8:04:55217 days 17 hrs ago 0xf47dfa415b9447b40f562ae5d8c0a01683d5509d 0x370ca03717c72e5eee6f8be267995a91cf5c09040.023080576624237201 Ether
0xa7f9ae3a2b5a8ac62a1e1dba11a5b0dfadef3ade3153439120a463190409f268109335872020-09-25 19:07:29366 days 6 hrs ago 0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0xf7388b6a9c65bceecfaab0bed560dc229a8998480.169694608495204645 Ether
0x20a5ff14a7060dfc3fd8246d76600a268b8328f67dd7a256193abf35bb12c7c2109335782020-09-25 19:05:53366 days 6 hrs ago 0x370ca03717c72e5eee6f8be267995a91cf5c0904 0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0.128177745038411254 Ether
0x21d8088e7dc2d5f0b747ab1307d7edcd246f147bb50c3f3794c8712072ccf0f0109335682020-09-25 19:04:25366 days 6 hrs ago 0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0xf7388b6a9c65bceecfaab0bed560dc229a8998481.763864466607839201 Ether
0x21d8088e7dc2d5f0b747ab1307d7edcd246f147bb50c3f3794c8712072ccf0f0109335682020-09-25 19:04:25366 days 6 hrs ago 0xf47dfa415b9447b40f562ae5d8c0a01683d5509d 0x370ca03717c72e5eee6f8be267995a91cf5c09040.097474926726106275 Ether
0x936c1fb712cb74c87cf0ba3bc5b9ccd6b52deb716c9e3ae419c5f489f197f65b104598882020-07-14 20:54:37439 days 4 hrs ago 0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0x6fa716966c81e8f907629f90352452d8f2dd0df40.243727990041066346 Ether
0x74612ba4314c2813e354be81721dc115dbba8cbdcdfed0dc07c8af1ed317f5de104560752020-07-14 6:34:52439 days 19 hrs ago 0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0x6fa716966c81e8f907629f90352452d8f2dd0df42.09782305740791092 Ether
0x74612ba4314c2813e354be81721dc115dbba8cbdcdfed0dc07c8af1ed317f5de104560752020-07-14 6:34:52439 days 19 hrs ago 0xf47dfa415b9447b40f562ae5d8c0a01683d5509d 0x370ca03717c72e5eee6f8be267995a91cf5c09040.110064204155384621 Ether
0xdab25a44cae9f9d757168f5a8429a7f8610383f5ae258bcdadabf9867a4c4a8f102020882020-06-04 22:52:53479 days 3 hrs ago 0x370ca03717c72e5eee6f8be267995a91cf5c0904 0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0.020302914129567291 Ether
0x3a323cb96abe90059f16a61f76fd886de01c714c5e19f0edff400b45cf5fbaf898692102020-04-14 7:36:44530 days 18 hrs ago 0xf47dfa415b9447b40f562ae5d8c0a01683d5509d 0x370ca03717c72e5eee6f8be267995a91cf5c09040.000049743808158023 Ether
0x648213c08c9dfa8e485f749973759c60b254f4afa23e8a6fc212acda7ba431d598007332020-04-03 18:38:17541 days 7 hrs ago 0x370ca03717c72e5eee6f8be267995a91cf5c0904 0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0.007588719642463456 Ether
0x674682b4c78e0183d2b0ed5f2b6023c2cbb0d8347dd5c283ae0df3618b94b07998007322020-04-03 18:37:52541 days 7 hrs ago 0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0x6f1bc0edd28c72bb6bb484cfbc9befa02e79a5450.099582651294031244 Ether
0x674682b4c78e0183d2b0ed5f2b6023c2cbb0d8347dd5c283ae0df3618b94b07998007322020-04-03 18:37:52541 days 7 hrs ago 0xf47dfa415b9447b40f562ae5d8c0a01683d5509d 0x370ca03717c72e5eee6f8be267995a91cf5c09040.004061241400760262 Ether
0x725040e21dd5753b4cd9bf54048cc46594af515c4d53aae7b083f1e9f011952b98007122020-04-03 18:32:43541 days 7 hrs ago 0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0x6f1bc0edd28c72bb6bb484cfbc9befa02e79a5450.004465670489038366 Ether
0x35cf2786abc06b9e2d670377f7034ba6d8782fd5db85b39bef3eb2d6ad6b822b97516932020-03-27 5:53:41548 days 20 hrs ago 0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0x81f0d747157ee0f2c308a41d1334dc8a83d981080.000047502825144757 Ether
0xe33985ac798c050b3241f0b0cb2b1dd78eae1c294439647aac2427eae8af29f297515842020-03-27 5:33:55548 days 20 hrs ago 0x370ca03717c72e5eee6f8be267995a91cf5c0904 0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0.004664562678353376 Ether
0xb75aede73c98e886373497f168922c7f35e44bb50dac09809442e7969c4c24aa96991882020-03-19 1:39:28557 days 14 mins ago 0xf47dfa415b9447b40f562ae5d8c0a01683d5509d 0x370ca03717c72e5eee6f8be267995a91cf5c09040.000371417692804784 Ether
0xe8bcee24733b79b3c9d88a95bdfeb9ae5e21d37a41544e66ef73d4bbcfbf2c8c96902932020-03-17 17:03:32558 days 8 hrs ago 0x370ca03717c72e5eee6f8be267995a91cf5c0904 0xf47dfa415b9447b40f562ae5d8c0a01683d5509d0.009677548976289322 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SHILLcoin

Compiler Version
v0.5.12+commit.7709ece9

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license
/**
 *Submitted for verification at Etherscan.io on 2020-01-25
*/

pragma solidity ^0.5.10;

/// @title An economic simulation and game
/// @author TheTokenPhysicist
/// @dev NatSpec comments provide broader information. Detailed comments available in source code
contract SHILLcoin
//start contract
{
//NOTE: in general modifiers have been defined/placed just before the functions that use them

//STATE VARIABLES
//INTERNAL CONSTANTS
//internal constant used for math
uint256 constant internal MAGNITUDE = 2**64;
int256 constant internal IMAGNITUDE = 2**64;

//NOTE that 1ETHER = 1e18 wei
uint256 constant internal FEE_CYCLE_SIZE = 25e16 wei;
//(6553/65536 = 10.00%)
uint16 constant internal MAX_VARIANCE = 6553;
//(1638/65536 = 2.50%)
uint constant internal BASE_RATE = 1638;
//max rate = base_rate + max_variance (8191/65536 = 12.50%)
//limits for setup phase
uint256 constant internal SETUP_LIMIT = 6e18;
uint256 constant internal CONTRIBUTOR_PURCHASE_MAX = 25e17;
//parameters for token bonding curve
//set to 0.000001=10^-6 (ETH/token), i.e. 10^6 tokens/ETH (ignoring rise due to price increment)
uint256 constant internal TOKEN_PRICE_INITIAL = 0.000001 ether;
//set to 0.000000001=10^-9 (ETH/token), representing an increase of 10^-9 ETH in the price of each token per outstanding token
uint256 constant internal TOKEN_PRICE_INCREMENT = 0.000000001 ether;

//PUBLIC CONSTANTS
//ERC 20 standard for the number of decimals the token uses
uint8 constant public decimals = 18;

//PUBLIC VARIABLES
string public name = "SHILLcoin";
string public symbol = "SHILL";
//tracks total ether stored in unwithdrawn dividends
uint256 public _slushFundBalance = 0;
//initializes fee rate at BASE_RATE
uint16 public _feeRate = uint16(BASE_RATE);
//tracks total accumulated rewards per token
uint256 public _rewardsPerTokenAllTime = 0;
//tracks total existing number of tokens. named to match ERC-20 standard (see https://eips.ethereum.org/EIPS/eip-20)
uint256 public totalSupply = 0;
//partner contract address will be set IRREVERSIBLY by administrator in setup phase
//partner address initially set to administrator address to avoid divide by zero error on first token purchase
address payable public partnerAddress_ = msg.sender;
bool public partnerSet = false;
// when setupPhase is set to true, only contributors can purchase tokens - used during contract setup
//this is automatically switched off (irreversibly) after setupLimit is met, or can be switched off manually by admin with endSetupPhase()
bool public setupPhase = true;


//MAPPINGS
// track token balances
mapping(address => uint256) public tokenBalanceLedger_;
// track payouts
mapping(address => int256) public payoutsToLedger_;
//track approved addresses to allow transferFrom functionality - stored as allowance[from][spender] = allowance that [spender] is approved to send from [from]
//named to match ERC-20 standard
mapping(address => mapping(address => uint256)) allowance;
//track ether spending in setup phase
mapping(address => uint256) internal accumulatedContributorSpends_;
//tracks administrator(s) & contributors
mapping(address => bool) public administrator_;
mapping(address => bool) public contributors_;


//EVENTS
//when a transfer is completed
//also emitted for token mint/burn events, in which cases, respectively, from/to is set to the 0 address (matches ERC20 standard)
event Transfer(
    address indexed from,
    address indexed to,
    uint256 tokensTransferred
);
// ERC20 compliance
//when the tokenOwner address adjusts the allowance that the approvedAddress is allowed to transfer from the holdings of tokenOwner
//relevant to transferFrom functionality
event Approval(
    address indexed tokenOwner,
    address indexed approvedAddress,
    uint256 newAllowance
);
//when a player spends their rewards to purchase more tokens
event DoubleDown(
    address indexed playerAddress,
    uint256 etherValue, //etherValue of the spent rewards
    uint256 tokensMinted
);
//when a player withdraws their rewards as ether
event CashOut(
    address indexed playerAddress,
    uint256 etherValue
);
//event announced when the fee rate is recalculated (occurs whenever slush fund balance changes)
//NOTE: fee rate is represented as 16-bit int; calculations of the fee itself use value*feeRate/65536 (65536 = 2^16)
event AnnounceFeeRate(
    uint16 newFeeRate
);


//CONSTRUCTOR/INITIALIZATION
constructor()
    public
{
    //sets up admin(s) and contributors
    administrator_[msg.sender] = true; //TheTokenPhysicist -- Mastermind
    contributors_[msg.sender] = true;
    contributors_[0xF7388B6a9c65BCEECfaaB0beD560dc229A899848] = true; //MaddEconomist -- Advisor
    contributors_[0x8DA88ecAc7C71EDc34C742232C8D1fdc61C5f8bE] = true; //swimmingly -- Tester & design review
    contributors_[0x6Fa716966c81e8f907629f90352452d8F2dD0dF4] = true; //cryptoGENIUS17 -- Design consulting & editing
}


//FALLBACK
/// @notice fallback function. ensures that you still receive tokens if you just send money directly to the contract
/// @dev fallback function. buys tokens with all sent ether *unless* ether is sent from partner address; if it is, then distributes ether as rewards to token holders
function()
    external
    payable
{
    if ( msg.sender == partnerAddress_ ) {
        //convert money sent from partner contract into rewards for all token holders
        makeItRain();
    } else {
       purchaseTokens( msg.sender, msg.value ); 
    }
}


//EXTERNAL FUNCTIONS
/// @notice buys tokens with all sent funds. tokens are automatically credited to sender address
/// @dev emits event Transfer(address(0), playerAddress, newTokens) since function mint is called internally
function buyTokens()
    external
    payable
{
    purchaseTokens( msg.sender, msg.value );
}

/// @notice uses all of message sender's accumulated rewards to buy more tokens for the sender
/// @dev emits event DoubleDown(msg.sender, rewards , newTokens) and event Transfer(address(0), playerAddress, newTokens) since function mint is called internally
function doubleDown()
    external
{
    //pull current ether value of sender's rewards
    uint256 etherValue = rewardsOf( msg.sender );
    //update rewards tracker to reflect payout. performed before rewards are sent to prevent re-entrancy
    updateSpentRewards( msg.sender , etherValue);
    //update slush fund and fee rate
    _slushFundBalance -= etherValue;
    require( calcFeeRate(), "error in calling calcFeeRate" );
    // use rewards to buy new tokens
    uint256 newTokens = purchaseTokens(msg.sender , etherValue);
    //NOTE: purchaseTokens already emits an event, but this is useful for tracking specifically DoubleDown events
    emit DoubleDown(msg.sender, etherValue , newTokens);
}

/// @notice converts all of message senders's accumulated rewards into cold, hard ether
/// @dev emits event CashOut( msg.sender, etherValue )
/// @return etherValue sent to account holder
function cashOut()
    external
    returns (uint256 etherValue)
{
    //pull current ether value of sender's rewards
    etherValue = rewardsOf( msg.sender );
    //update rewards tracker to reflect payout. performed before rewards are sent to prevent re-entrancy
    updateSpentRewards( msg.sender , etherValue);
    //update slush fund and fee rate
    _slushFundBalance -= etherValue;
    require( calcFeeRate(), "error in calling calcFeeRate" );
    //transfer rewards to sender
    msg.sender.transfer( etherValue );
    //NOTE: purchaseTokens already emits an event, but this is useful for tracking specifically CashOut events
    emit CashOut( msg.sender, etherValue );
}

/// @notice sells all of sender's tokens
/// @dev emits event Transfer(playerAddress, address(0), amountTokens) since function burn is called internally
function sellAll()
    external
    returns (bool)
{
    uint256 tokens = tokenBalanceLedger_[msg.sender];
    if ( tokens > 0 ) {
        sell(tokens);
    }
    return true;
}

/// @notice sells desired number of message sender's tokens
/// @dev emits event Transfer(playerAddress, address(0), amountTokens) since function burn is called internally
/// @param amountTokens The number of tokens the sender wants to sell
function sellTokens( uint256 amountTokens )
    external
    returns (bool)
{
    require( amountTokens <= tokenBalanceLedger_[msg.sender], "insufficient funds available" );
    sell(amountTokens);
    return true;
}

/// @notice transfers tokens from sender to another address. Pays fee at same rate as buy/sell
/// @dev emits event Transfer( msg.sender, toAddress, tokensAfterFee )
/// @param toAddress Destination for transferred tokens
/// @param amountTokens The number of tokens the sender wants to transfer
function transfer( address toAddress, uint256 amountTokens )
    external
    returns( bool )
{
    //make sure message sender has the requested tokens (transfers also disabled during SetupPhase)
    require( ( amountTokens <= tokenBalanceLedger_[ msg.sender ] && !setupPhase ), "transfer not allowed" );
    //make the transfer internally
    require( transferInternal( msg.sender, toAddress, amountTokens ), "error in internal token transfer" );
    //ERC20 compliance
    return true;
}

/// @notice sets approved amount of tokens that an external address can transfer on behalf of the user
/// @dev emits event Approval(msg.sender, approvedAddress, amountTokens)
/// @param approvedAddress External address to give approval to (i.e. to give control to transfer sender's tokens)
/// @param amountTokens The number of tokens the sender wants to approve the external address to transfer for them
function approve( address approvedAddress, uint256 amountTokens)
    external
    returns (bool)
{
    allowance[msg.sender][approvedAddress] = amountTokens;
    emit Approval(msg.sender, approvedAddress, amountTokens);
    return true;
}

/// @notice increases approved amount of tokens that an external address can transfer on behalf of the user
/// @dev emits event Approval(msg.sender, approvedAddress, newAllowance)
/// @param approvedAddress External address to give approval to (i.e. to give control to transfer sender's tokens)
/// @param amountTokens The number of tokens by which the sender wants to increase the external address' allowance
function increaseAllowance( address approvedAddress, uint256 amountTokens)
    external
    returns (bool)
{
    uint256 pastAllowance = allowance[msg.sender][approvedAddress];
    uint256 newAllowance = SafeMath.add( pastAllowance , amountTokens );
    allowance[msg.sender][approvedAddress] = newAllowance;
    emit Approval(msg.sender, approvedAddress, newAllowance);
    return true;
}

/// @notice decreases approved amount of tokens that an external address can transfer on behalf of the user
/// @dev emits event Approval(msg.sender, approvedAddress, newAllowance)
/// @param approvedAddress External address to give approval to (i.e. to give control to transfer sender's tokens)
/// @param amountTokens The number of tokens by which the sender wants to decrease the external address' allowance
function decreaseAllowance( address approvedAddress, uint256 amountTokens)
    external
    returns (bool)
{
    uint256 pastAllowance = allowance[msg.sender][approvedAddress];
    uint256 newAllowance = SafeMath.sub( pastAllowance , amountTokens );
    allowance[msg.sender][approvedAddress] = newAllowance;
    emit Approval(msg.sender, approvedAddress, newAllowance);
    return true;
}

modifier checkTransferApproved(address fromAddress, uint256 amountTokens){
    require( allowance[fromAddress][msg.sender] <= amountTokens, "transfer not authorized (allowance insufficient)" );
    _;
} 
/// @notice transfers tokens from one address to another. Pays fee at same rate as buy/sell
/// @dev emits event Transfer( fromAddress, toAddress, tokensAfterFee )
/// @param fromAddress Account that sender wishes to transfer tokens from
/// @param toAddress Destination for transferred tokens
/// @param amountTokens The number of tokens the sender wants to transfer
function transferFrom(address payable fromAddress, address payable toAddress, uint256 amountTokens)
    checkTransferApproved(fromAddress , amountTokens)
    external
    returns (bool)
{
    // make sure sending address has requested tokens (transfers also disabled during SetupPhase)
    require( ( amountTokens <= tokenBalanceLedger_[ fromAddress ] && !setupPhase ), "transfer not allowed - insufficient funds available" );
    //update allowance (reduce it by tokens to be sent)
    uint256 pastAllowance = allowance[fromAddress][msg.sender];
    uint256 newAllowance = SafeMath.sub( pastAllowance , amountTokens );
    allowance[fromAddress][msg.sender] = newAllowance;
    //make the transfer internally
    require( transferInternal( fromAddress, toAddress, amountTokens ), "error in internal token transfer" ); 
    // ERC20 compliance
    return true;
}

/// @notice called by users to exchange between token types. Pays fee at half the rate of buy/sell
/// @param amountTokens the number of tokens the user wishes to exchange
function exchangeTokens( uint256 amountTokens )
    external
    returns(bool)
{
    // make sure sending address has requested tokens (transfers also disabled during SetupPhase)
    require( ( amountTokens <= tokenBalanceLedger_[ msg.sender ] && !setupPhase ), "transfer not allowed - insufficient funds available" );
    //mirrors valueAfterFee function, but with fee halved (half fee is also charged by the other contract)
    uint256 amountEther = tokensToEther( amountTokens );
    uint256 fee = SafeMath.div( ( amountEther * _feeRate / 2 ) , 65536 ); //fee
    uint256 valueAfterFee = SafeMath.sub( amountEther , fee ); //value after fee
    //destroys sold tokens (removes sold tokens from total token supply) and subtracts them from player balance
    //also updates reward tracker (payoutsToLedger_) for player address
    burn(msg.sender, amountTokens);
    //mirrors makeItRain function (distributes fee to token holders)
    uint256 addedRewards = SafeMath.mul( fee , MAGNITUDE );
    uint256 additionalRewardsPerToken = SafeMath.div( addedRewards , totalSupply );
    _rewardsPerTokenAllTime = SafeMath.add( _rewardsPerTokenAllTime , additionalRewardsPerToken );
    //updates balance in slush fund and calculates new fee rate
    require( updateSlushFund( fee ), "error in calling updateSlushFund" );
    //sends remainder to partner contract, to be used to buy tokens from that contract
    address payable buddy = partnerAddress_;
    ( bool success, bytes memory returnData ) = buddy.call.value( valueAfterFee )(abi.encodeWithSignature("incomingExchangeRequest(address)", msg.sender));
    //no need to check return data since partner is a trusted entity
    require( success, "failed to send funds to partner contract (not enough gas provided?)" );
    return true;    
}

/// @notice handles exchange. only callable by partner contract.
/// @param playerAddress passed on from call to exchangeTokens function. used to track player address
function incomingExchangeRequest( address playerAddress )
    external
    payable
    returns(bool)
{
    require( (msg.sender == partnerAddress_), "this function can only be called by the partner contract" );
    //mirrors valueAfterFee function, but with fee halved (half fee is also charged by the other contract)
    uint256 amountEther = msg.value;
    uint256 fee = SafeMath.div( ( amountEther * _feeRate / 2 ) , 65536 ); //fee
    uint256 valueAfterFee = SafeMath.sub( amountEther , fee ); //value after fee
    //mirrors makeItRain function (distributes fee to token holders)
    uint256 addedRewards = SafeMath.mul( fee , MAGNITUDE );
    uint256 additionalRewardsPerToken = SafeMath.div( addedRewards , totalSupply );
    _rewardsPerTokenAllTime = SafeMath.add( _rewardsPerTokenAllTime , additionalRewardsPerToken );
    //updates balance in slush fund and calculates new fee rate
    require( updateSlushFund( fee ), "error in calling updateSlushFund" );
    //mirrors purchaseTokens function
    uint256 amountTokens = etherToTokens( valueAfterFee );
    //adds new tokens to total token supply and gives them to the player
    //also updates reward tracker (payoutsToLedger_) for player address
    mint( playerAddress, amountTokens );
    return true;
}


//ADMIN ONLY FUNCTIONS (ALL EXTERNAL AS WELL)
//defines modifier for functions that only contract admin(s) can use
modifier onlyAdministrator() {  
    require( administrator_[ msg.sender ] == true, "function can only be called by contract admin" );
    _;
}
/// @notice admin only function. irreversibly sets address of partner contract
/// @param partner Address of partner contract
function setPartner( address payable partner)
    onlyAdministrator()
    public
{
    if ( partnerSet == false ) {
        partnerAddress_ = partner;
        partnerSet = true;
    }
}

/// @notice admin only function. irreversibly ends SetupPhase
/// @dev SetupPhase also ends automatically if contract holds more than (SETUP_LIMIT) in ether. see modifier purchaseAllowed(uint256 amountEther)
function endSetupPhase()
    onlyAdministrator()
    public
{
    setupPhase = false;
}

/// @notice admin only function. simple name change
/// @param newName Desired new name for contract
function setName( string memory newName )
    onlyAdministrator()
    public
{
    name = newName;
}

/// @notice admin only function. simple symbol change
/// @param newSymbol Desired new symbol for contract
function setSymbol( string memory newSymbol )
    onlyAdministrator()
    public
{
    symbol = newSymbol;
}


//HELPER FUNCTIONS (ALL EXTERNAL AS WELL) -- used to pull information
/// @notice returns current sell price for one token
function sellPrice() 
    external
    view
    returns(uint256)
{
    // avoid dividing by zero
    require(totalSupply != 0, "function called too early (supply is zero)");
    //represents selling one "full token" since the token has 18 decimals
    uint256 etherValue = tokensToEther( 1e18 );
    uint[2] memory feeAndValue = valueAfterFee( etherValue );
    return feeAndValue[1];
}

/// @notice calculates current buy price for one token
function currentBuyPrice() 
    external
    view
    returns(uint256)
{
    // avoid dividing by zero
    require(totalSupply != 0, "function called too early (supply is zero)");
    //represents buying one "full token" since the token has 18 decimals
    uint256 etherValue = tokensToEther( 1e18 );
    uint[2] memory feeAndValue = valueAfterFee( etherValue );
    //NOTE: this is not strictly correct, but gets very close to real purchase value
    uint256 totalCost = etherValue + feeAndValue[0];
    return totalCost;
}

/// @notice calculates number of tokens that can be bought at current price and fee rate for input amount of ether
/// @param etherValue Desired amount of ether from which to calculate equivalent number of tokens
/// @return amountTokens Expected return of tokens for spending etherValue
function calculateExpectedTokens(uint256 etherValue) 
    external
    view
    returns(uint256)
{
    uint256 etherAfterFee = valueAfterFee( etherValue )[1];
    uint256 amountTokens = etherToTokens( etherAfterFee );
    return amountTokens;
}

/// @notice calculates amount of ether (as wei) received if input number of tokens is sold at current price and fee rate
/// @param tokensToSell Desired number of tokens (as an integer) from which to calculate equivalent value of ether
/// @return etherAfterFee Amount of ether that would be received for selling tokens
function calculateExpectedWei(uint256 tokensToSell) 
    external
    view
    returns(uint256)
{
    require( tokensToSell <= totalSupply, "unable to calculate for amount of tokens greater than current supply" );
    //finds ether value of tokens before fee
    uint256 etherValue = tokensToEther( tokensToSell );
    //calculates ether after fee
    uint256 etherAfterFee = valueAfterFee( etherValue )[1];
    return etherAfterFee;
}

/// @notice returns total ether balance of contract
function totalEtherBalance()
    external
    view
    returns(uint)
{
    return address(this).balance;
}

/// @notice returns number of tokens owned by message sender
function myTokens()
    external
    view
    returns(uint256)
{
    return tokenBalanceLedger_[msg.sender];
}

/// @notice returns reward balance of message sender
function myRewards() 
    external 
    view 
    returns(uint256)
{
    return rewardsOf( msg.sender );
}

/// @notice returns token balance of desired address
/// @dev conforms to ERC-20 standard
/// @param playerAddress Address which sender wants to know the balance of
/// @return balance Current raw token balance of playerAddress
function balanceOf( address playerAddress )
    external
    view
    returns(uint256 balance)
{
    return (tokenBalanceLedger_[playerAddress]);
}


//PUBLIC FUNCTIONS
/// @notice function for donating to slush fund. adjusts current fee rate as fast as possible but does not give the message sender any tokens
/// @dev invoked internally when partner contract sends funds to this contract (see fallback function)
function makeItRain()
    public
    payable
    returns(bool)
{
    //avoid dividing by zero
    require(totalSupply != 0, "makeItRain function called too early (supply is zero)");
    uint256 amountEther = msg.value;
    uint256 addedRewards = SafeMath.mul( amountEther , MAGNITUDE );
    uint256 additionalRewardsPerToken = SafeMath.div( addedRewards , totalSupply );
    _rewardsPerTokenAllTime = SafeMath.add( _rewardsPerTokenAllTime , additionalRewardsPerToken );
    //updates balance in slush fund and calculates new fee rate
    require( updateSlushFund( amountEther ), "error in calling updateSlushFund" );
    return true;
}

/// @notice returns reward balance of desired address
/// @dev invoked internally in cashOut and doubleDown functions
/// @param playerAddress Address which sender wants to know the rewards balance of
/// @return playerRewards Current ether value of unspent rewards of playerAddress
function rewardsOf( address playerAddress )
    public
    view
    returns(uint256 playerRewards)
{
    playerRewards = (uint256) ( ( (int256)( _rewardsPerTokenAllTime * tokenBalanceLedger_[ playerAddress ] ) - payoutsToLedger_[ playerAddress ] ) / IMAGNITUDE );
    return playerRewards;
}


//INTERNAL FUNCTIONS
//recalculates fee rate given current contract state
function calcFeeRate()
    internal
    returns(bool)
{
    uint excessSlush = ( (_slushFundBalance % FEE_CYCLE_SIZE) * MAX_VARIANCE );
    uint16 cycleLocation = uint16( excessSlush / FEE_CYCLE_SIZE );
    uint16 newFeeRate = uint16( BASE_RATE + cycleLocation );
    //copy local variable to state variable
    _feeRate = newFeeRate;
    //anounce new rate
    emit AnnounceFeeRate( newFeeRate );
    return(true);
}

//updates balance in slush fund and calculates new fee rate
function updateSlushFund( uint256 amountEther )
    internal
    returns(bool)
{
    _slushFundBalance += amountEther;
    require( calcFeeRate(), "error in calling calcFeeRate" );
    return true;
}

//update rewards tracker when a user withdraws their rewards
function updateSpentRewards( address playerAddress, uint256 etherValue )
    internal
    returns(bool)
{
    int256 updatedPayouts = payoutsToLedger_[playerAddress] + int256 ( SafeMath.mul( etherValue, MAGNITUDE ) );
    require( (updatedPayouts >= payoutsToLedger_[playerAddress]), "ERROR: integer overflow in updateSpentRewards function" );
    payoutsToLedger_[playerAddress] = updatedPayouts;
    return true;
}

//updates rewards tracker. makes sure that player does not receive any rewards accumulated before they purchased/received these tokens
function updateRewardsOnPurchase( address playerAddress, uint256 amountTokens )
    internal
    returns(bool)
{
    int256 updatedPayouts = payoutsToLedger_[playerAddress] + int256 ( SafeMath.mul( _rewardsPerTokenAllTime, amountTokens ) );
    require( (updatedPayouts >= payoutsToLedger_[playerAddress]), "ERROR: integer overflow in updateRewardsOnPurchase function" );
    payoutsToLedger_[playerAddress] = updatedPayouts;    
    return true;
}

//adds new tokens to total token supply and gives them to the player
function mint(address playerAddress, uint256 amountTokens)
    internal
{
    require( playerAddress != address(0), "cannot mint tokens for zero address" );
    totalSupply = SafeMath.add( totalSupply, amountTokens );
    //updates rewards tracker. makes sure that player does not receive any rewards accumulated before they purchased these tokens
    updateRewardsOnPurchase( playerAddress, amountTokens );
    //give tokens to player. performed last to prevent re-entrancy attacks
    tokenBalanceLedger_[playerAddress] = SafeMath.add( tokenBalanceLedger_[playerAddress] , amountTokens );
    //event conforms to ERC-20 standard
    emit Transfer(address(0), playerAddress, amountTokens);
}

//Modifier that limits buying while contract setup occurs
modifier purchaseAllowed(uint256 amountEther){
    //check if still in setup phase
    if ( setupPhase ) {
        //check that sender is in contributor list
        require( contributors_[ msg.sender ] == true, "purchases currently limited only to contributors" );
        //check that sender hasn't deposited more ether than allowed
        uint256 contributorSpent = SafeMath.add( accumulatedContributorSpends_[ msg.sender ] , amountEther );
        require( contributorSpent <= CONTRIBUTOR_PURCHASE_MAX, "attempted purchase would exceed limit placed upon contributors" );
        //before SETUP_LIMIT is met, track contributor spends
        if ( ( address(this).balance + amountEther ) <= SETUP_LIMIT ) {
            //update the amount spent by address
            accumulatedContributorSpends_[ msg.sender ] = contributorSpent;
        } else {
        //if conditions have been met to end setup phase, then exit it automatically. admin also has ability to end setup phase manually
        setupPhase = false;
        }
    }
    _;
}
//gives appropriate number of tokens to purchasing address
function purchaseTokens(address payable playerAddress, uint256 etherValue)
    //checks if purchase allowed -- only relevant for limiting actions during setup phase
    purchaseAllowed( etherValue )    
    internal
    returns( uint256 )
{
    //calculates fee/rewards
    uint[2] memory feeAndValue = valueAfterFee( etherValue );
    //calculates tokens from postFee value of input ether
    uint256 amountTokens = etherToTokens( feeAndValue[1] );
    //avoid overflow errors
    require ( ( (amountTokens + totalSupply) > totalSupply), "purchase would cause integer overflow" );
    // send rewards to partner contract, to be distributed to its holders
    address payable buddy = partnerAddress_;
    ( bool success, bytes memory returnData ) = buddy.call.value( feeAndValue[0] )("");
    require( success, "failed to send funds to partner contract (not enough gas provided?)" );
    //adds new tokens to total token supply and gives them to the player
    //also updates reward tracker (payoutsToLedger_) for player address
    mint( playerAddress, amountTokens );
    return( amountTokens );
}

//update rewards tracker. makes sure that player can still withdraw rewards that accumulated while they were holding their sold/transferred tokens
function updateRewardsOnSale( address playerAddress, uint256 amountTokens )
    internal
    returns(bool)
{
    int256 updatedPayouts = payoutsToLedger_[playerAddress] - int256 ( SafeMath.mul( _rewardsPerTokenAllTime, amountTokens ) );
    require( (updatedPayouts <= payoutsToLedger_[playerAddress]), "ERROR: integer underflow in updateRewardsOnSale function" );
    payoutsToLedger_[playerAddress] = updatedPayouts;
    return true;
}

//destroys sold tokens (removes sold tokens from total token supply) and subtracts them from player balance
function burn(address playerAddress, uint256 amountTokens)
    internal
{
    require( playerAddress != address(0), "cannot burn tokens for zero address" );
    require( amountTokens <= tokenBalanceLedger_[ playerAddress ], "insufficient funds available" );
    //subtract tokens from player balance. performed first to prevent possibility of re-entrancy attacks
    tokenBalanceLedger_[playerAddress] = SafeMath.sub( tokenBalanceLedger_[playerAddress], amountTokens );
    //remove tokens from total supply
    totalSupply = SafeMath.sub( totalSupply, amountTokens );
    //update rewards tracker. makes sure that player can still withdraw rewards that accumulated while they were holding their sold tokens
    updateRewardsOnSale( playerAddress, amountTokens );
    //event conforms to ERC-20 standard
    emit Transfer(playerAddress, address(0), amountTokens);
  }

//sells desired amount of tokens for ether
function sell(uint256 amountTokens)
    internal
    returns (bool)
{
    require( amountTokens <= tokenBalanceLedger_[ msg.sender ], "insufficient funds available" );
    //calculates fee and net value to send to seller
    uint256 etherValue = tokensToEther( amountTokens );
    uint[2] memory feeAndValue = valueAfterFee( etherValue );
    //destroys sold tokens (removes sold tokens from total token supply) and subtracts them from player balance
    //also updates reward tracker (payoutsToLedger_) for player address
    burn(msg.sender, amountTokens);
    // sends rewards to partner contract, to be distributed to its holders
    address payable buddy = partnerAddress_;
    ( bool success, bytes memory returnData ) = buddy.call.value( feeAndValue[0] )("");
    require( success, "failed to send funds to partner contract (not enough gas provided?)" );
    //sends ether to seller
    //NOTE: occurs last to avoid re-entrancy attacks
    msg.sender.transfer( feeAndValue[1] );
    return true;
}

//takes in amount and returns fee to pay on it and the value after the fee
//classified as view since needs to access state (to pull current fee rate) but not write to it
function valueAfterFee( uint amount )
    internal
    view
    returns (uint[2] memory outArray_ )
{
    outArray_[0] = SafeMath.div( SafeMath.mul(amount, _feeRate), 65536 ); //fee
    outArray_[1] = SafeMath.sub( amount , outArray_[0] ); //value after fee
    return outArray_;
}

//returns purchased number of tokens based on linear bonding curve with fee
//it's the quadratic formula stupid!
function etherToTokens(uint256 etherValue)
    internal
    view
    returns(uint256)
{
    uint256 tokenPriceInitial = TOKEN_PRICE_INITIAL * 1e18;
    uint256 _tokensReceived = 
     (
        (
            // avoids underflow
            SafeMath.sub(
                ( sqrt( 
                        ( tokenPriceInitial**2 ) +
                        ( 2 * ( TOKEN_PRICE_INCREMENT * 1e18 ) * ( etherValue * 1e18 ) ) +
                        ( ( ( TOKEN_PRICE_INCREMENT ) ** 2 ) * ( totalSupply ** 2 ) ) +
                        ( 2 * ( TOKEN_PRICE_INCREMENT ) * tokenPriceInitial * totalSupply )
                    )
                ), tokenPriceInitial )
        ) / ( TOKEN_PRICE_INCREMENT )
    ) - ( totalSupply );
  
    return _tokensReceived;
}

//returns sell value of tokens based on linear bonding curve with fee
//~inverse of etherToTokens, but with rounding down to ensure contract is always more than solvent
function tokensToEther(uint256 inputTokens)
    internal
    view
    returns(uint256)
{
    uint256 tokens = ( inputTokens + 1e18 );
    uint256 functionTotalSupply = ( totalSupply + 1e18 );
    uint256 etherReceived = (
        // avoids underflow
        SafeMath.sub(
            ( (
                ( TOKEN_PRICE_INITIAL + ( TOKEN_PRICE_INCREMENT * ( functionTotalSupply / 1e18 ) ) )
               - TOKEN_PRICE_INCREMENT )
            * ( tokens - 1e18 ) ),
            ( TOKEN_PRICE_INCREMENT * ( ( tokens ** 2 - tokens ) / 1e18 ) ) / 2 )
        / 1e18 );
    return etherReceived;
}

//manages transfers of tokens in both transfer and transferFrom functions
function transferInternal( address fromAddress, address toAddress, uint256 amountTokens )
    internal
    returns( bool )
{
    uint[2] memory feeAndValue = valueAfterFee( amountTokens ); //(token fee) and (amount of tokens after fee)
    uint256 etherRewards = tokensToEther( feeAndValue[0] );
    //destroy the tokens paid as fee
    totalSupply = SafeMath.sub(totalSupply , feeAndValue[0]);
    //emit event to reflect destruction of tokens (conforms to ERC-20 standard)
    emit Transfer(fromAddress, address(0), feeAndValue[0]);
    //remove tokens from sending address
    tokenBalanceLedger_[ fromAddress ] = SafeMath.sub( tokenBalanceLedger_[ fromAddress ], amountTokens );
    //makes sure that receiving address does not receive any rewards accumulated before they received these tokens
    updateRewardsOnPurchase( toAddress, feeAndValue[1] );
    //give tokens to receiving address
    tokenBalanceLedger_[ toAddress ] = SafeMath.add( tokenBalanceLedger_[ toAddress ], feeAndValue[1] );
    //makes sure that sender can still withdraw rewards that accumulated while they were holding their transferred tokens
    //NOTE: uses amountTokens as input since this is what the sending address sends, while receiving address gets (feeAndValue[1]) tokens
    updateRewardsOnSale( fromAddress, amountTokens );
    //send rewards to partner contract, to be distributed to its holders
    address payable buddy = partnerAddress_;
    ( bool success, bytes memory returnData ) = buddy.call.value( etherRewards )("");
    require( success, "failed to send funds to partner contract (not enough gas provided?)" );
    // emit event
    emit Transfer( fromAddress, toAddress, feeAndValue[1] );
    return true;
}

//utility for calculating (approximate) square roots. simple implementation of Babylonian method
//see: https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method
function sqrt(uint x)
    internal
    pure
    returns (uint y)
{
    uint z = (x + 1) / 2;
    y = x;
    while (z < y)
    {
        y = z;
        z = (x / z + z) / 2;
    }
}

//end contract
}


//MATH OPERATIONS -- designed to avoid possibility of errors with built-in math functions
library SafeMath
{

//@dev Multiplies two numbers, throws on overflow.
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    if (a == 0) {
        return 0;
    }
    uint256 c = a * b;
    assert(c / a == b);
    return c;
}

//@dev Integer division of two numbers, truncating the quotient.
function div(uint256 a, uint256 b) internal pure returns (uint256) {
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return c;
}

//@dev Substracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
}

//@dev Adds two numbers, throws on overflow.
function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    assert(c >= a);
    return c;
}

//end library
}

Contract Security Audit

Contract ABI

[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"newFeeRate","type":"uint16"}],"name":"AnnounceFeeRate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenOwner","type":"address"},{"indexed":true,"internalType":"address","name":"approvedAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"newAllowance","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"playerAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"etherValue","type":"uint256"}],"name":"CashOut","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"playerAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"etherValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensMinted","type":"uint256"}],"name":"DoubleDown","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":"tokensTransferred","type":"uint256"}],"name":"Transfer","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":true,"inputs":[],"name":"_feeRate","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_rewardsPerTokenAllTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_slushFundBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"administrator_","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"approvedAddress","type":"address"},{"internalType":"uint256","name":"amountTokens","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"playerAddress","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"buyTokens","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"etherValue","type":"uint256"}],"name":"calculateExpectedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokensToSell","type":"uint256"}],"name":"calculateExpectedWei","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"cashOut","outputs":[{"internalType":"uint256","name":"etherValue","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"contributors_","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"currentBuyPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"approvedAddress","type":"address"},{"internalType":"uint256","name":"amountTokens","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"doubleDown","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"endSetupPhase","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amountTokens","type":"uint256"}],"name":"exchangeTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"playerAddress","type":"address"}],"name":"incomingExchangeRequest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"approvedAddress","type":"address"},{"internalType":"uint256","name":"amountTokens","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"makeItRain","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"myRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"myTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"partnerAddress_","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"partnerSet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"payoutsToLedger_","outputs":[{"internalType":"int256","name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"playerAddress","type":"address"}],"name":"rewardsOf","outputs":[{"internalType":"uint256","name":"playerRewards","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"sellAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"sellPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amountTokens","type":"uint256"}],"name":"sellTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"newName","type":"string"}],"name":"setName","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"partner","type":"address"}],"name":"setPartner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"newSymbol","type":"string"}],"name":"setSymbol","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"setupPhase","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenBalanceLedger_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalEtherBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"toAddress","type":"address"},{"internalType":"uint256","name":"amountTokens","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"fromAddress","type":"address"},{"internalType":"address payable","name":"toAddress","type":"address"},{"internalType":"uint256","name":"amountTokens","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280600981526020017f5348494c4c636f696e000000000000000000000000000000000000000000000081525060009080519060200190620000519291906200034d565b506040518060400160405280600581526020017f5348494c4c000000000000000000000000000000000000000000000000000000815250600190805190602001906200009f9291906200034d565b506000600255610666600360006101000a81548161ffff021916908361ffff1602179055506000600455600060055533600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600660146101000a81548160ff0219169083151502179055506001600660156101000a81548160ff0219169083151502179055503480156200015257600080fd5b506001600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600c600073f7388b6a9c65bceecfaab0bed560dc229a89984873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600c6000738da88ecac7c71edc34c742232c8d1fdc61c5f8be73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600c6000736fa716966c81e8f907629f90352452d8f2dd0df473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620003fc565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200039057805160ff1916838001178555620003c1565b82800160010185558215620003c1579182015b82811115620003c0578251825591602001919060010190620003a3565b5b509050620003d09190620003d4565b5090565b620003f991905b80821115620003f5576000816000905550600101620003db565b5090565b90565b6143b1806200040c6000396000f3fe60806040526004361061023b5760003560e01c806364d156401161012e578063a16d5960116100ab578063b84c82461161006f578063b84c824614610d44578063c47f002714610e0c578063d0febe4c14610ed4578063dcdfbbb914610ede578063e625d51514610f0d5761023b565b8063a16d596014610bc3578063a457c2d714610c14578063a7e1f6a214610c87578063a9059cbb14610c9e578063b2131f7d14610d115761023b565b8063949e8acd116100f2578063949e8acd14610a45578063958507eb14610a7057806395d89b4114610a9b5780639b7a629c14610b2b5780639e57ada614610b5a5761023b565b806364d15640146108ae57806365a23cca146109135780636c11bcd31461096257806370a08231146109b5578063793cd71e14610a1a5761023b565b806340477126116101bc5780634ead0590116101805780634ead0590146107515780635c5a0a9d146107ad5780635d86685a146108125780635dae4e50146108615780635f5ad897146108835761023b565b8063404771261461061857806342a7afe21461066b57806345fd71e114610696578063479ba7ae146106c15780634b750334146107265761023b565b806316e457f01161020357806316e457f01461048757806318160ddd146104b657806323b872dd146104e1578063313ce5671461057457806339509351146105a55761023b565b806305a051eb146102ad57806306fdde031461030457806307410b5b14610394578063095ea7b3146103fd5780630afc2c2814610470575b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561029f57610299610f38565b506102ab565b6102a93334611058565b505b005b3480156102b957600080fd5b506102c26113f8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561031057600080fd5b5061031961141e565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561035957808201518184015260208101905061033e565b50505050905090810190601f1680156103865780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103a057600080fd5b506103e3600480360360208110156103b757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506114bc565b604051808215151515815260200191505060405180910390f35b34801561040957600080fd5b506104566004803603604081101561042057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506114dc565b604051808215151515815260200191505060405180910390f35b34801561047c57600080fd5b506104856115ce565b005b34801561049357600080fd5b5061049c611694565b604051808215151515815260200191505060405180910390f35b3480156104c257600080fd5b506104cb6116f5565b6040518082815260200191505060405180910390f35b3480156104ed57600080fd5b5061055a6004803603606081101561050457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506116fb565b604051808215151515815260200191505060405180910390f35b34801561058057600080fd5b50610589611a21565b604051808260ff1660ff16815260200191505060405180910390f35b3480156105b157600080fd5b506105fe600480360360408110156105c857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611a26565b604051808215151515815260200191505060405180910390f35b34801561062457600080fd5b506106516004803603602081101561063b57600080fd5b8101908080359060200190929190505050611ba8565b604051808215151515815260200191505060405180910390f35b34801561067757600080fd5b50610680611f68565b6040518082815260200191505060405180910390f35b3480156106a257600080fd5b506106ab611f78565b6040518082815260200191505060405180910390f35b3480156106cd57600080fd5b50610710600480360360208110156106e457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061201e565b6040518082815260200191505060405180910390f35b34801561073257600080fd5b5061073b6120c1565b6040518082815260200191505060405180910390f35b6107936004803603602081101561076757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061215f565b604051808215151515815260200191505060405180910390f35b3480156107b957600080fd5b506107fc600480360360208110156107d057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612325565b6040518082815260200191505060405180910390f35b34801561081e57600080fd5b5061084b6004803603602081101561083557600080fd5b810190808035906020019092919050505061233d565b6040518082815260200191505060405180910390f35b610869610f38565b604051808215151515815260200191505060405180910390f35b34801561088f57600080fd5b50610898612373565b6040518082815260200191505060405180910390f35b3480156108ba57600080fd5b506108fd600480360360208110156108d157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612379565b6040518082815260200191505060405180910390f35b34801561091f57600080fd5b5061094c6004803603602081101561093657600080fd5b8101908080359060200190929190505050612391565b6040518082815260200191505060405180910390f35b34801561096e57600080fd5b5061099b6004803603602081101561098557600080fd5b8101908080359060200190929190505050612423565b604051808215151515815260200191505060405180910390f35b3480156109c157600080fd5b50610a04600480360360208110156109d857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506124ed565b6040518082815260200191505060405180910390f35b348015610a2657600080fd5b50610a2f612536565b6040518082815260200191505060405180910390f35b348015610a5157600080fd5b50610a5a612670565b6040518082815260200191505060405180910390f35b348015610a7c57600080fd5b50610a856126b7565b6040518082815260200191505060405180910390f35b348015610aa757600080fd5b50610ab06126bd565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610af0578082015181840152602081019050610ad5565b50505050905090810190601f168015610b1d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610b3757600080fd5b50610b4061275b565b604051808215151515815260200191505060405180910390f35b348015610b6657600080fd5b50610ba960048036036020811015610b7d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061276e565b604051808215151515815260200191505060405180910390f35b348015610bcf57600080fd5b50610c1260048036036020811015610be657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061278e565b005b348015610c2057600080fd5b50610c6d60048036036040811015610c3757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506128b3565b604051808215151515815260200191505060405180910390f35b348015610c9357600080fd5b50610c9c612a35565b005b348015610caa57600080fd5b50610cf760048036036040811015610cc157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612b3f565b604051808215151515815260200191505060405180910390f35b348015610d1d57600080fd5b50610d26612c96565b604051808261ffff1661ffff16815260200191505060405180910390f35b348015610d5057600080fd5b50610e0a60048036036020811015610d6757600080fd5b8101908080359060200190640100000000811115610d8457600080fd5b820183602082011115610d9657600080fd5b80359060200191846001830284011164010000000083111715610db857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612caa565b005b348015610e1857600080fd5b50610ed260048036036020811015610e2f57600080fd5b8101908080359060200190640100000000811115610e4c57600080fd5b820183602082011115610e5e57600080fd5b80359060200191846001830284011164010000000083111715610e8057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612d6d565b005b610edc612e30565b005b348015610eea57600080fd5b50610ef3612e3d565b604051808215151515815260200191505060405180910390f35b348015610f1957600080fd5b50610f22612e50565b6040518082815260200191505060405180910390f35b6000806005541415610f95576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260358152602001806140806035913960400191505060405180910390fd5b60003490506000610faf8268010000000000000000612e6f565b90506000610fbf82600554612ea6565b9050610fcd60045482612ebf565b600481905550610fdc83612edb565b61104e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f6572726f7220696e2063616c6c696e6720757064617465536c75736846756e6481525060200191505060405180910390fd5b6001935050505090565b600081600660159054906101000a900460ff16156112565760011515600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611119576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806141696030913960400191505060405180910390fd5b6000611164600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483612ebf565b90506722b1c8c1227a00008111156111c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e8152602001806141bc603e913960400191505060405180910390fd5b6753444835ec580000823073ffffffffffffffffffffffffffffffffffffffff163101116112385780600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611254565b6000600660156101000a81548160ff0219169083151502179055505b505b61125e613f85565b61126784612f70565b905060006112858260016002811061127b57fe5b6020020151612ff1565b90506005546005548201116112e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061431d6025913960400191505060405180910390fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600060608273ffffffffffffffffffffffffffffffffffffffff168560006002811061133457fe5b602002015160405180600001905060006040518083038185875af1925050503d806000811461137f576040519150601f19603f3d011682016040523d82523d6000602084013e611384565b606091505b5091509150816113df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001806142276043913960600191505060405180910390fd5b6113e98985613078565b83965050505050505092915050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114b45780601f10611489576101008083540402835291602001916114b4565b820191906000526020600020905b81548152906001019060200180831161149757829003601f168201915b505050505081565b600c6020528060005260406000206000915054906101000a900460ff1681565b600081600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60011515600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611677576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001806141fa602d913960400191505060405180910390fd5b6000600660156101000a81548160ff021916908315150217905550565b600080600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111156116ed576116eb81613211565b505b600191505090565b60055481565b6000838280600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156117d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061426a6030913960400191505060405180910390fd5b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484111580156118305750600660159054906101000a900460ff16155b611885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061404d6033913960400191505060405180910390fd5b6000600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060006119128287613452565b905080600960008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506119a0888888613469565b611a12576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f6572726f7220696e20696e7465726e616c20746f6b656e207472616e7366657281525060200191505060405180910390fd5b60019450505050509392505050565b601281565b600080600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000611ab48285612ebf565b905080600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a360019250505092915050565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211158015611c065750600660159054906101000a900460ff16155b611c5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061404d6033913960400191505060405180910390fd5b6000611c66836137f5565b90506000611c976002600360009054906101000a900461ffff1661ffff16840281611c8d57fe5b0462010000612ea6565b90506000611ca58383613452565b9050611cb13386613896565b6000611cc68368010000000000000000612e6f565b90506000611cd682600554612ea6565b9050611ce460045482612ebf565b600481905550611cf384612edb565b611d65576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f6572726f7220696e2063616c6c696e6720757064617465536c75736846756e6481525060200191505060405180910390fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600060608273ffffffffffffffffffffffffffffffffffffffff168633604051602401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019150506040516020818303038152906040527f4ead0590000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b60208310611e955780518252602082019150602081019050602083039250611e72565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611ef7576040519150601f19603f3d011682016040523d82523d6000602084013e611efc565b606091505b509150915081611f57576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001806142276043913960600191505060405180910390fd5b600198505050505050505050919050565b6000611f733361201e565b905090565b6000806005541415611fd5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806142f3602a913960400191505060405180910390fd5b6000611fe8670de0b6b3a76400006137f5565b9050611ff2613f85565b611ffb82612f70565b905060008160006002811061200c57fe5b60200201518301905080935050505090565b600068010000000000000000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546004540203816120b657fe5b059050809050919050565b600080600554141561211e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806142f3602a913960400191505060405180910390fd5b6000612131670de0b6b3a76400006137f5565b905061213b613f85565b61214482612f70565b90508060016002811061215357fe5b60200201519250505090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612207576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806140b56038913960400191505060405180910390fd5b6000349050600061223b6002600360009054906101000a900461ffff1661ffff1684028161223157fe5b0462010000612ea6565b905060006122498383613452565b905060006122608368010000000000000000612e6f565b9050600061227082600554612ea6565b905061227e60045482612ebf565b60048190555061228d84612edb565b6122ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f6572726f7220696e2063616c6c696e6720757064617465536c75736846756e6481525060200191505060405180910390fd5b600061230a84612ff1565b90506123168882613078565b60019650505050505050919050565b60076020528060005260406000206000915090505481565b60008061234983612f70565b60016002811061235557fe5b60200201519050600061236782612ff1565b90508092505050919050565b60045481565b60086020528060005260406000206000915090505481565b60006005548211156123ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260448152602001806141256044913960600191505060405180910390fd5b60006123f9836137f5565b9050600061240682612f70565b60016002811061241257fe5b602002015190508092505050919050565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211156124da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f696e73756666696369656e742066756e647320617661696c61626c650000000081525060200191505060405180910390fd5b6124e382613211565b5060019050919050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006125413361201e565b905061254d3382613ae4565b5080600260008282540392505081905550612566613c24565b6125d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f6572726f7220696e2063616c6c696e672063616c63466565526174650000000081525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561261e573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff167fab933177d8753a66dd869151cf9aa88649e067b7a4e2dad9d5d192d61cf593b0826040518082815260200191505060405180910390a290565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b60025481565b60018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156127535780601f1061272857610100808354040283529160200191612753565b820191906000526020600020905b81548152906001019060200180831161273657829003601f168201915b505050505081565b600660149054906101000a900460ff1681565b600b6020528060005260406000206000915054906101000a900460ff1681565b60011515600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514612837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001806141fa602d913960400191505060405180910390fd5b60001515600660149054906101000a900460ff16151514156128b05780600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600660146101000a81548160ff0219169083151502179055505b50565b600080600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060006129418285613452565b905080600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a360019250505092915050565b6000612a403361201e565b9050612a4c3382613ae4565b5080600260008282540392505081905550612a65613c24565b612ad7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f6572726f7220696e2063616c6c696e672063616c63466565526174650000000081525060200191505060405180910390fd5b6000612ae33383611058565b90503373ffffffffffffffffffffffffffffffffffffffff167f4de94b39625248a5696f0c1f78680ee8dad819ce02dc53b3b5ed5db8d95cd3d88383604051808381526020018281526020019250505060405180910390a25050565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211158015612b9d5750600660159054906101000a900460ff16155b612c0f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f7472616e73666572206e6f7420616c6c6f77656400000000000000000000000081525060200191505060405180910390fd5b612c1a338484613469565b612c8c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f6572726f7220696e20696e7465726e616c20746f6b656e207472616e7366657281525060200191505060405180910390fd5b6001905092915050565b600360009054906101000a900461ffff1681565b60011515600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514612d53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001806141fa602d913960400191505060405180910390fd5b8060019080519060200190612d69929190613fa7565b5050565b60011515600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514612e16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001806141fa602d913960400191505060405180910390fd5b8060009080519060200190612e2c929190613fa7565b5050565b612e3a3334611058565b50565b600660159054906101000a900460ff1681565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b600080831415612e825760009050612ea0565b6000828402905082848281612e9357fe5b0414612e9b57fe5b809150505b92915050565b600080828481612eb257fe5b0490508091505092915050565b600080828401905083811015612ed157fe5b8091505092915050565b600081600260008282540192505081905550612ef5613c24565b612f67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f6572726f7220696e2063616c6c696e672063616c63466565526174650000000081525060200191505060405180910390fd5b60019050919050565b612f78613f85565b612fa2612f9983600360009054906101000a900461ffff1661ffff16612e6f565b62010000612ea6565b81600060028110612faf57fe5b602002018181525050612fd38282600060028110612fc957fe5b6020020151613452565b81600160028110612fe057fe5b602002018181525050809050919050565b600080670de0b6b3a764000064e8d4a510000290506000600554633b9aca0061306361305d60055486633b9aca00600202020260026005540a6002633b9aca000a02670de0b6b3a76400008a02670de0b6b3a7640000633b9aca0002600202026002890a010101613cce565b85613452565b8161306a57fe5b040390508092505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061429a6023913960400191505060405180910390fd5b61310a60055482612ebf565b60058190555061311a8282613d13565b50613164600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482612ebf565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211156132c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f696e73756666696369656e742066756e647320617661696c61626c650000000081525060200191505060405180910390fd5b60006132d3836137f5565b90506132dd613f85565b6132e682612f70565b90506132f23385613896565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600060608273ffffffffffffffffffffffffffffffffffffffff168460006002811061334157fe5b602002015160405180600001905060006040518083038185875af1925050503d806000811461338c576040519150601f19603f3d011682016040523d82523d6000602084013e613391565b606091505b5091509150816133ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001806142276043913960600191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc8560016002811061341357fe5b60200201519081150290604051600060405180830381858888f19350505050158015613443573d6000803e3d6000fd5b50600195505050505050919050565b60008282111561345e57fe5b818303905092915050565b6000613473613f85565b61347c83612f70565b9050600061349a8260006002811061349057fe5b60200201516137f5565b90506134b9600554836000600281106134af57fe5b6020020151613452565b600581905550600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460006002811061351c57fe5b60200201516040518082815260200191505060405180910390a361357f600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205485613452565b600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506135dd85836001600281106135d357fe5b6020020151613d13565b50613638600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548360016002811061362e57fe5b6020020151612ebf565b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506136858685613e4c565b506000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600060608273ffffffffffffffffffffffffffffffffffffffff168460405180600001905060006040518083038185875af1925050503d806000811461370f576040519150601f19603f3d011682016040523d82523d6000602084013e613714565b606091505b50915091508161376f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001806142276043913960600191505060405180910390fd5b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876001600281106137cb57fe5b60200201516040518082815260200191505060405180910390a36001955050505050509392505050565b600080670de0b6b3a7640000830190506000670de0b6b3a76400006005540190506000670de0b6b3a7640000613881670de0b6b3a76400008503633b9aca00670de0b6b3a7640000868161384557fe5b04633b9aca000264e8d4a510000103026002670de0b6b3a7640000876002890a038161386d57fe5b04633b9aca00028161387b57fe5b04613452565b8161388857fe5b049050809350505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561391c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806141996023913960400191505060405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111156139d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f696e73756666696369656e742066756e647320617661696c61626c650000000081525060200191505060405180910390fd5b613a1a600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482613452565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613a6960055482613452565b600581905550613a798282613e4c565b50600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600080613afa8368010000000000000000612e6f565b600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054019050600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811215613bd5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806142bd6036913960400191505060405180910390fd5b80600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600191505092915050565b60008061199961ffff166703782dace9d9000060025481613c4157fe5b0602905060006703782dace9d900008281613c5857fe5b04905060008161ffff1661066601905080600360006101000a81548161ffff021916908361ffff1602179055507fc2cc2ca038d89e4eb3ed987815f876e8e6aaee289e7be6e8d951d2424930763e81604051808261ffff1661ffff16815260200191505060405180910390a16001935050505090565b60008060026001840181613cde57fe5b0490508291505b81811015613d0d57809150600281828581613cfc57fe5b040181613d0557fe5b049050613ce5565b50919050565b600080613d2260045484612e6f565b600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054019050600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811215613dfd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b815260200180614342603b913960400191505060405180910390fd5b80600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600191505092915050565b600080613e5b60045484612e6f565b600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054039050600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811315613f36576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806140ed6038913960400191505060405180910390fd5b80600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600191505092915050565b6040518060400160405280600290602082028038833980820191505090505090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613fe857805160ff1916838001178555614016565b82800160010185558215614016579182015b82811115614015578251825591602001919060010190613ffa565b5b5090506140239190614027565b5090565b61404991905b8082111561404557600081600090555060010161402d565b5090565b9056fe7472616e73666572206e6f7420616c6c6f776564202d20696e73756666696369656e742066756e647320617661696c61626c656d616b6549745261696e2066756e6374696f6e2063616c6c656420746f6f206561726c792028737570706c79206973207a65726f29746869732066756e6374696f6e2063616e206f6e6c792062652063616c6c65642062792074686520706172746e657220636f6e74726163744552524f523a20696e746567657220756e646572666c6f7720696e20757064617465526577617264734f6e53616c652066756e6374696f6e756e61626c6520746f2063616c63756c61746520666f7220616d6f756e74206f6620746f6b656e732067726561746572207468616e2063757272656e7420737570706c797075726368617365732063757272656e746c79206c696d69746564206f6e6c7920746f20636f6e7472696275746f727363616e6e6f74206275726e20746f6b656e7320666f72207a65726f2061646472657373617474656d7074656420707572636861736520776f756c6420657863656564206c696d697420706c616365642075706f6e20636f6e7472696275746f727366756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920636f6e74726163742061646d696e6661696c656420746f2073656e642066756e647320746f20706172746e657220636f6e747261637420286e6f7420656e6f756768206761732070726f76696465643f297472616e73666572206e6f7420617574686f72697a65642028616c6c6f77616e636520696e73756666696369656e742963616e6e6f74206d696e7420746f6b656e7320666f72207a65726f20616464726573734552524f523a20696e7465676572206f766572666c6f7720696e207570646174655370656e74526577617264732066756e6374696f6e66756e6374696f6e2063616c6c656420746f6f206561726c792028737570706c79206973207a65726f29707572636861736520776f756c6420636175736520696e7465676572206f766572666c6f774552524f523a20696e7465676572206f766572666c6f7720696e20757064617465526577617264734f6e50757263686173652066756e6374696f6ea265627a7a7231582005a4502a65bb0e2a1a551683a17b6451794fc459ac3de41d759414e829c63ad564736f6c634300050c0032

Deployed ByteCode Sourcemap

202:34512:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5297:15;;;;;;;;;;;5283:29;;:10;:29;;;5278:219;;;5413:12;:10;:12::i;:::-;;5278:219;;;5449:39;5465:10;5477:9;5449:14;:39::i;:::-;;5278:219;202:34512;2153:51;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2153:51:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1471:32;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1471:32:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;1471:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3137:45;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3137:45:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3137:45:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;9740:245;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9740:245:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;9740:245:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;17342:92;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17342:92:0;;;:::i;:::-;;7865:186;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7865:186:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1923:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1923:30:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12204:877;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12204:877:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12204:877:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1411:35;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1411:35:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;10404:398;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10404:398:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;10404:398:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;13259:1814;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13259:1814:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13259:1814:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;20726:112;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20726:112:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18460:537;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18460:537:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22440:298;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22440:298:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22440:298:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18003:397;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18003:397:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15246:1290;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15246:1290:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;2556:54;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2556:54:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2556:54:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19292:252;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19292:252:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19292:252:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21500:649;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1760:42;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1760:42:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2631:50;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2631:50:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2631:50:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19871:446;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19871:446:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19871:446:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;8300:223;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8300:223:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;8300:223:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;21074:153;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21074:153:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;21074:153:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;7012:694;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7012:694:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20552:116;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20552:116:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1593:36;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1593:36:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1506:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1506:30:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;1506:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2207;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2207:30:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;3088:46;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3088:46:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3088:46:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;16935:193;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16935:193:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;16935:193:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;11221:398;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11221:398:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11221:398:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;6099:717;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6099:717:0;;;:::i;:::-;;8827:499;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8827:499:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;8827:499:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1669:42;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1669:42:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;17759:113;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17759:113:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17759:113:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;17759:113:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;17759:113:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;17759:113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;17759:113:0;;;;;;;;;;;;;;;:::i;:::-;;17541:105;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17541:105:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17541:105:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;17541:105:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;17541:105:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;17541:105:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;17541:105:0;;;;;;;;;;;;;;;:::i;:::-;;5736:99;;;:::i;:::-;;2483:29;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2483:29:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;20374:112;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20374:112:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21500:649;21560:4;21627:1;21612:11;;:16;;21604:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21693:19;21715:9;21693:31;;21731:20;21754:39;21768:11;454:5;21754:12;:39::i;:::-;21731:62;;21800:33;21836:42;21850:12;21865:11;;21836:12;:42::i;:::-;21800:78;;21911:67;21925:23;;21951:25;21911:12;:67::i;:::-;21885:23;:93;;;;22059:30;22076:11;22059:15;:30::i;:::-;22050:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22141:4;22134:11;;;;;21500:649;:::o;26567:1119::-;26800:7;26755:10;25540;;;;;;;;;;;25535:959;;;25656:4;25625:35;;:13;:27;25640:10;25625:27;;;;;;;;;;;;;;;;;;;;;;;;;:35;;;25616:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25795:24;25822:73;25836:29;:43;25867:10;25836:43;;;;;;;;;;;;;;;;25882:11;25822:12;:73::i;:::-;25795:100;;921:5;25915:16;:44;;25906:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;861:4;26132:11;26116:4;26108:21;;;:35;26106:54;26101:386;;26274:16;26228:29;:43;26259:10;26228:43;;;;;;;;;;;;;;;:62;;;;26101:386;;;26470:5;26457:10;;:18;;;;;;;;;;;;;;;;;;26101:386;25535:959;;26848:26;;:::i;:::-;26877:27;26892:10;26877:13;:27::i;:::-;26848:56;;26970:20;26993:31;27008:11;27020:1;27008:14;;;;;;;;;;;26993:13;:31::i;:::-;26970:54;;27103:11;;27088;;27073:12;:26;27072:42;27060:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27240:21;27264:15;;;;;;;;;;;27240:39;;27288:12;27302:23;27330:5;:10;;27348:11;27360:1;27348:14;;;;;;;;;;;27330:38;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;27286:82:0;;;;27384:7;27375:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27618:35;27624:13;27639:12;27618:4;:35::i;:::-;27668:12;27660:22;;;;;;;26567:1119;;;;;:::o;2153:51::-;;;;;;;;;;;;;:::o;1471:32::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3137:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;9740:245::-;9833:4;9888:12;9847:9;:21;9857:10;9847:21;;;;;;;;;;;;;;;:38;9869:15;9847:38;;;;;;;;;;;;;;;:53;;;;9933:15;9912:51;;9921:10;9912:51;;;9950:12;9912:51;;;;;;;;;;;;;;;;;;9977:4;9970:11;;9740:245;;;;:::o;17342:92::-;16738:4;16706:36;;:14;:28;16722:10;16706:28;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;16697:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17425:5;17412:10;;:18;;;;;;;;;;;;;;;;;;17342:92::o;7865:186::-;7912:4;7926:14;7943:19;:31;7963:10;7943:31;;;;;;;;;;;;;;;;7926:48;;7995:1;7986:6;:10;7981:49;;;8010:12;8015:6;8010:4;:12::i;:::-;;7981:49;8043:4;8036:11;;;7865:186;:::o;1923:30::-;;;;:::o;12204:877::-;12387:4;12331:11;12345:12;11750;11712:9;:22;11722:11;11712:22;;;;;;;;;;;;;;;:34;11735:10;11712:34;;;;;;;;;;;;;;;;:50;;11703:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12527:19;:34;12548:11;12527:34;;;;;;;;;;;;;;;;12511:12;:50;;:65;;;;;12566:10;;;;;;;;;;;12565:11;12511:65;12500:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12699:21;12723:9;:22;12733:11;12723:22;;;;;;;;;;;;;;;:34;12746:10;12723:34;;;;;;;;;;;;;;;;12699:58;;12764:20;12787:44;12801:13;12817:12;12787;:44::i;:::-;12764:67;;12875:12;12838:9;:22;12848:11;12838:22;;;;;;;;;;;;;;;:34;12861:10;12838:34;;;;;;;;;;;;;;;:49;;;;12939:56;12957:11;12970:9;12981:12;12939:16;:56::i;:::-;12930:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13073:4;13066:11;;;;12204:877;;;;;;;:::o;1411:35::-;1444:2;1411:35;:::o;10404:398::-;10507:4;10521:21;10545:9;:21;10555:10;10545:21;;;;;;;;;;;;;;;:38;10567:15;10545:38;;;;;;;;;;;;;;;;10521:62;;10590:20;10613:44;10627:13;10643:12;10613;:44::i;:::-;10590:67;;10705:12;10664:9;:21;10674:10;10664:21;;;;;;;;;;;;;;;:38;10686:15;10664:38;;;;;;;;;;;;;;;:53;;;;10750:15;10729:51;;10738:10;10729:51;;;10767:12;10729:51;;;;;;;;;;;;;;;;;;10794:4;10787:11;;;;10404:398;;;;:::o;13259:1814::-;13334:4;13474:19;:33;13495:10;13474:33;;;;;;;;;;;;;;;;13458:12;:49;;:64;;;;;13512:10;;;;;;;;;;;13511:11;13458:64;13447:134;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13696:19;13718:29;13733:12;13718:13;:29::i;:::-;13696:51;;13754:11;13768:54;13809:1;13798:8;;;;;;;;;;;13784:22;;:11;:22;:26;;;;;;13815:5;13768:12;:54::i;:::-;13754:68;;13835:21;13859:33;13873:11;13887:3;13859:12;:33::i;:::-;13835:57;;14103:30;14108:10;14120:12;14103:4;:30::i;:::-;14210:20;14233:31;14247:3;454:5;14233:12;:31::i;:::-;14210:54;;14271:33;14307:42;14321:12;14336:11;;14307:12;:42::i;:::-;14271:78;;14382:67;14396:23;;14422:25;14382:12;:67::i;:::-;14356:23;:93;;;;14530:22;14547:3;14530:15;:22::i;:::-;14521:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14685:21;14709:15;;;;;;;;;;;14685:39;;14733:12;14747:23;14775:5;:10;;14793:13;14869:10;14809:71;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;14809:71:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;14809:71:0;14775:106;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;14775:106:0;;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;14731:150:0;;;;14967:7;14958:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15061:4;15054:11;;;;;;;;;;13259:1814;;;:::o;20726:112::-;20787:7;20811:23;20822:10;20811:9;:23::i;:::-;20804:30;;20726:112;:::o;18460:537::-;18525:7;18596:1;18581:11;;:16;;18573:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18725:18;18746:21;18761:4;18746:13;:21::i;:::-;18725:42;;18774:26;;:::i;:::-;18803:27;18818:10;18803:13;:27::i;:::-;18774:56;;18923:17;18956:11;18968:1;18956:14;;;;;;;;;;;18943:10;:27;18923:47;;18984:9;18977:16;;;;;18460:537;:::o;22440:298::-;22519:21;500:5;22657:16;:33;22675:13;22657:33;;;;;;;;;;;;;;;;22616:19;:36;22637:13;22616:36;;;;;;;;;;;;;;;;22590:23;;:62;22580:110;22578:127;;;;;;22550:157;;22721:13;22714:20;;22440:298;;;:::o;18003:397::-;18062:7;18133:1;18118:11;;:16;;18110:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18263:18;18284:21;18299:4;18284:13;:21::i;:::-;18263:42;;18312:26;;:::i;:::-;18341:27;18356:10;18341:13;:27::i;:::-;18312:56;;18382:11;18394:1;18382:14;;;;;;;;;;;18375:21;;;;18003:397;:::o;15246:1290::-;15344:4;15382:15;;;;;;;;;;;15368:29;;:10;:29;;;15358:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15575:19;15597:9;15575:31;;15613:11;15627:54;15668:1;15657:8;;;;;;;;;;;15643:22;;:11;:22;:26;;;;;;15674:5;15627:12;:54::i;:::-;15613:68;;15694:21;15718:33;15732:11;15746:3;15718:12;:33::i;:::-;15694:57;;15846:20;15869:31;15883:3;454:5;15869:12;:31::i;:::-;15846:54;;15907:33;15943:42;15957:12;15972:11;;15943:12;:42::i;:::-;15907:78;;16018:67;16032:23;;16058:25;16018:12;:67::i;:::-;15992:23;:93;;;;16166:22;16183:3;16166:15;:22::i;:::-;16157:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16272:20;16295:30;16310:13;16295;:30::i;:::-;16272:53;;16479:35;16485:13;16500:12;16479:4;:35::i;:::-;16528:4;16521:11;;;;;;;;15246:1290;;;:::o;2556:54::-;;;;;;;;;;;;;;;;;:::o;19292:252::-;19383:7;19400:21;19424:27;19439:10;19424:13;:27::i;:::-;19452:1;19424:30;;;;;;;;;;;19400:54;;19461:20;19484:30;19499:13;19484;:30::i;:::-;19461:53;;19528:12;19521:19;;;;19292:252;;;:::o;1760:42::-;;;;:::o;2631:50::-;;;;;;;;;;;;;;;;;:::o;19871:446::-;19961:7;20003:11;;19987:12;:27;;19978:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20141:18;20162:29;20177:12;20162:13;:29::i;:::-;20141:50;;20232:21;20256:27;20271:10;20256:13;:27::i;:::-;20284:1;20256:30;;;;;;;;;;;20232:54;;20300:13;20293:20;;;;19871:446;;;:::o;8300:223::-;8372:4;8411:19;:31;8431:10;8411:31;;;;;;;;;;;;;;;;8395:12;:47;;8386:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8483:18;8488:12;8483:4;:18::i;:::-;;8515:4;8508:11;;8300:223;;;:::o;21074:153::-;21155:15;21188:19;:34;21208:13;21188:34;;;;;;;;;;;;;;;;21180:43;;21074:153;;;:::o;7012:694::-;7059:18;7152:23;7163:10;7152:9;:23::i;:::-;7139:36;;7288:44;7308:10;7321;7288:18;:44::i;:::-;;7398:10;7377:17;;:31;;;;;;;;;;;7424:13;:11;:13::i;:::-;7415:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7512:10;:19;;:33;7533:10;7512:33;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7512:33:0;7678:10;7669:33;;;7690:10;7669:33;;;;;;;;;;;;;;;;;;7012:694;:::o;20552:116::-;20609:7;20633:19;:31;20653:10;20633:31;;;;;;;;;;;;;;;;20626:38;;20552:116;:::o;1593:36::-;;;;:::o;1506:30::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2207:::-;;;;;;;;;;;;;:::o;3088:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;16935:193::-;16738:4;16706:36;;:14;:28;16722:10;16706:28;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;16697:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17045:5;17031:19;;:10;;;;;;;;;;;:19;;;17026:99;;;17082:7;17064:15;;:25;;;;;;;;;;;;;;;;;;17113:4;17100:10;;:17;;;;;;;;;;;;;;;;;;17026:99;16935:193;:::o;11221:398::-;11324:4;11338:21;11362:9;:21;11372:10;11362:21;;;;;;;;;;;;;;;:38;11384:15;11362:38;;;;;;;;;;;;;;;;11338:62;;11407:20;11430:44;11444:13;11460:12;11430;:44::i;:::-;11407:67;;11522:12;11481:9;:21;11491:10;11481:21;;;;;;;;;;;;;;;:38;11503:15;11481:38;;;;;;;;;;;;;;;:53;;;;11567:15;11546:51;;11555:10;11546:51;;;11584:12;11546:51;;;;;;;;;;;;;;;;;;11611:4;11604:11;;;;11221:398;;;;:::o;6099:717::-;6195:18;6216:23;6227:10;6216:9;:23::i;:::-;6195:44;;6352;6372:10;6385;6352:18;:44::i;:::-;;6462:10;6441:17;;:31;;;;;;;;;;;6488:13;:11;:13::i;:::-;6479:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6580:17;6600:39;6615:10;6628;6600:14;:39::i;:::-;6580:59;;6777:10;6766:46;;;6789:10;6802:9;6766:46;;;;;;;;;;;;;;;;;;;;;;;;6099:717;;:::o;8827:499::-;8916:4;9059:19;:33;9080:10;9059:33;;;;;;;;;;;;;;;;9043:12;:49;;:64;;;;;9097:10;;;;;;;;;;;9096:11;9043:64;9032:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9187:55;9205:10;9217:9;9228:12;9187:16;:55::i;:::-;9178:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9318:4;9311:11;;8827:499;;;;:::o;1669:42::-;;;;;;;;;;;;;:::o;17759:113::-;16738:4;16706:36;;:14;:28;16722:10;16706:28;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;16697:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17859:9;17850:6;:18;;;;;;;;;;;;:::i;:::-;;17759:113;:::o;17541:105::-;16738:4;16706:36;;:14;:28;16722:10;16706:28;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;16697:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17635:7;17628:4;:14;;;;;;;;;;;;:::i;:::-;;17541:105;:::o;5736:99::-;5792:39;5808:10;5820:9;5792:14;:39::i;:::-;;5736:99::o;2483:29::-;;;;;;;;;;;;;:::o;20374:112::-;20440:4;20469;20461:21;;;20454:28;;20374:112;:::o;34886:180::-;34944:7;34969:1;34964;:6;34960:39;;;34990:1;34983:8;;;;34960:39;35005:9;35021:1;35017;:5;35005:17;;35045:1;35040;35036;:5;;;;;;:10;35029:18;;;;35061:1;35054:8;;;34886:180;;;;;:::o;35136:268::-;35194:7;35285:9;35301:1;35297;:5;;;;;;35285:17;;35399:1;35392:8;;;35136:268;;;;:::o;35666:131::-;35724:7;35740:9;35756:1;35752;:5;35740:17;;35776:1;35771;:6;;35764:14;;;;35792:1;35785:8;;;35666:131;;;;:::o;23314:206::-;23389:4;23424:11;23403:17;;:32;;;;;;;;;;;23451:13;:11;:13::i;:::-;23442:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23512:4;23505:11;;23314:206;;;:::o;30524:289::-;30600:24;;:::i;:::-;30650:53;30664:30;30677:6;30685:8;;;;;;;;;;;30664:30;;:12;:30::i;:::-;30696:5;30650:12;:53::i;:::-;30635:9;30645:1;30635:12;;;;;;;;;;:68;;;;;30731:37;30745:6;30754:9;30764:1;30754:12;;;;;;;;;;;30731;:37::i;:::-;30716:9;30726:1;30716:12;;;;;;;;;;:52;;;;;30800:9;30793:16;;30524:289;;;:::o;30932:779::-;31012:7;31029:25;31079:4;1113:14;31057:26;31029:54;;31090:23;31661:11;;1308:17;31182:428;31215:355;31534:11;;31514:17;1308;31482:1;:29;:49;:63;31447:1;31432:11;;:16;31424:1;1308:17;31395:30;31393:57;31355:4;31342:10;:17;31331:4;1308:17;31307:28;31301:1;:36;:60;31268:1;31249:17;:20;31247:116;:205;:300;31215:4;:355::i;:::-;31591:17;31182:12;:428::i;:::-;31134:515;;;;;;31123:551;31090:584;;31692:15;31685:22;;;;30932:779;;;:::o;24680:703::-;24795:1;24770:27;;:13;:27;;;;24761:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24859:41;24873:11;;24886:12;24859;:41::i;:::-;24845:11;:55;;;;25038:54;25063:13;25078:12;25038:23;:54::i;:::-;;25212:65;25226:19;:34;25246:13;25226:34;;;;;;;;;;;;;;;;25263:12;25212;:65::i;:::-;25175:19;:34;25195:13;25175:34;;;;;;;;;;;;;;;:102;;;;25351:13;25330:49;;25347:1;25330:49;;;25366:12;25330:49;;;;;;;;;;;;;;;;;;24680:703;;:::o;29324:1023::-;29388:4;29427:19;:33;29448:10;29427:33;;;;;;;;;;;;;;;;29411:12;:49;;29402:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29555:18;29576:29;29591:12;29576:13;:29::i;:::-;29555:50;;29612:26;;:::i;:::-;29641:27;29656:10;29641:13;:27::i;:::-;29612:56;;29861:30;29866:10;29878:12;29861:4;:30::i;:::-;29974:21;29998:15;;;;;;;;;;;29974:39;;30022:12;30036:23;30064:5;:10;;30082:11;30094:1;30082:14;;;;;;;;;;;30064:38;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;30020:82:0;;;;30118:7;30109:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30288:10;:19;;:37;30309:11;30321:1;30309:14;;;;;;;;;;;30288:37;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30288:37:0;30339:4;30332:11;;;;;;;29324:1023;;;:::o;35505:111::-;35563:7;35591:1;35586;:6;;35579:14;;;;35611:1;35607;:5;35600:12;;35505:111;;;;:::o;32574:1736::-;32692:4;32707:26;;:::i;:::-;32736:29;32751:12;32736:13;:29::i;:::-;32707:58;;32819:20;32842:31;32857:11;32869:1;32857:14;;;;;;;;;;;32842:13;:31::i;:::-;32819:54;;32932:42;32945:11;;32959;32971:1;32959:14;;;;;;;;;;;32932:12;:42::i;:::-;32918:11;:56;;;;33097:1;33067:49;;33076:11;33067:49;;;33101:11;33113:1;33101:14;;;;;;;;;;;33067:49;;;;;;;;;;;;;;;;;;33202:64;33216:19;:34;33237:11;33216:34;;;;;;;;;;;;;;;;33252:12;33202;:64::i;:::-;33165:19;:34;33186:11;33165:34;;;;;;;;;;;;;;;:101;;;;33389:52;33414:9;33425:11;33437:1;33425:14;;;;;;;;;;;33389:23;:52::i;:::-;;33523:64;33537:19;:32;33558:9;33537:32;;;;;;;;;;;;;;;;33571:11;33583:1;33571:14;;;;;;;;;;;33523:12;:64::i;:::-;33488:19;:32;33509:9;33488:32;;;;;;;;;;;;;;;:99;;;;33856:48;33877:11;33890:12;33856:19;:48::i;:::-;;33985:21;34009:15;;;;;;;;;;;33985:39;;34033:12;34047:23;34075:5;:10;;34093:12;34075:36;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;34031:80:0;;;;34127:7;34118:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34261:9;34238:50;;34248:11;34238:50;;;34272:11;34284:1;34272:14;;;;;;;;;;;34238:50;;;;;;;;;;;;;;;;;;34302:4;34295:11;;;;;;;32574:1736;;;;;:::o;31886:609::-;31967:7;31984:14;32017:4;32003:11;:18;31984:39;;32030:27;32076:4;32062:11;;:18;32030:52;;32089:21;32458:4;32153:293;32354:4;32345:6;:13;1308:17;32275:4;32253:19;:26;;;;;;1308:17;32227:54;1113:14;32203:80;32201:124;32182:178;32443:1;32432:4;32421:6;32417:1;32407:6;:11;:20;32405:31;;;;;;1308:17;32379:59;32377:67;;;;;;32153:12;:293::i;:::-;:309;;;;;;32089:375;;32478:13;32471:20;;;;;31886:609;;;:::o;28396:880::-;28511:1;28486:27;;:13;:27;;;;28477:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28586:19;:36;28607:13;28586:36;;;;;;;;;;;;;;;;28570:12;:52;;28561:95;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28806:64;28820:19;:34;28840:13;28820:34;;;;;;;;;;;;;;;;28856:12;28806;:64::i;:::-;28769:19;:34;28789:13;28769:34;;;;;;;;;;;;;;;:101;;;;28930:41;28944:11;;28957:12;28930;:41::i;:::-;28916:11;:55;;;;29118:50;29139:13;29154:12;29118:19;:50::i;:::-;;29253:1;29221:49;;29230:13;29221:49;;;29257:12;29221:49;;;;;;;;;;;;;;;;;;28396:880;;:::o;23586:424::-;23686:4;23700:21;23767:37;23781:10;454:5;23767:12;:37::i;:::-;23724:16;:31;23741:13;23724:31;;;;;;;;;;;;;;;;:82;23700:106;;23841:16;:31;23858:13;23841:31;;;;;;;;;;;;;;;;23823:14;:49;;23813:120;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23974:14;23940:16;:31;23957:13;23940:31;;;;;;;;;;;;;;;:48;;;;24002:4;23995:11;;;23586:424;;;;:::o;22820:429::-;22870:4;22884:16;661:4;22905:51;;584:9;22906:17;;:34;;;;;;22905:51;22884:74;;22965:20;584:9;22996:11;:28;;;;;;22965:61;;23033:17;23073:13;23061:25;;727:4;23061:25;23033:55;;23151:10;23140:8;;:21;;;;;;;;;;;;;;;;;;23197:29;23214:10;23197:29;;;;;;;;;;;;;;;;;;;;;;23240:4;23233:12;;;;;22820:429;:::o;34502:191::-;34562:6;34578;34597:1;34592;34588;:5;34587:11;;;;;;34578:20;;34609:1;34605:5;;34617:73;34628:1;34624;:5;34617:73;;;34651:1;34647:5;;34681:1;34676;34672;34668;:5;;;;;;:9;34667:15;;;;;;34663:19;;34617:73;;;34502:191;;;;:::o;24150:456::-;24257:4;24271:21;24338:53;24352:23;;24377:12;24338;:53::i;:::-;24295:16;:31;24312:13;24295:31;;;;;;;;;;;;;;;;:98;24271:122;;24428:16;:31;24445:13;24428:31;;;;;;;;;;;;;;;;24410:14;:49;;24400:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24566:14;24532:16;:31;24549:13;24532:31;;;;;;;;;;;;;;;:48;;;;24598:4;24591:11;;;24150:456;;;;:::o;27838:445::-;27941:4;27955:21;28022:53;28036:23;;28061:12;28022;:53::i;:::-;27979:16;:31;27996:13;27979:31;;;;;;;;;;;;;;;;:98;27955:122;;28112:16;:31;28129:13;28112:31;;;;;;;;;;;;;;;;28094:14;:49;;28084:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28247:14;28213:16;:31;28230:13;28213:31;;;;;;;;;;;;;;;:48;;;;28275:4;28268:11;;;27838:445;;;;:::o;202:34512::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;202:34512:0;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

bzzr://05a4502a65bb0e2a1a551683a17b6451794fc459ac3de41d759414e829c63ad5
Block Transaction Difficulty Gas Used Reward
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.