ETH Price: $3,567.89 (+1.95%)
Gas: 30 Gwei

Contract

0xf47dfA415b9447B40f562Ae5D8C0A01683d5509D
 

Overview

ETH Balance

0.056857185183397883 ETH

Eth Value

$202.86 (@ $3,567.89/ETH)

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Cash Out123397672021-04-30 4:41:101063 days ago1619757670IN
0xf47dfA41...683d5509D
0 ETH0.0015931531
Sell Tokens123397602021-04-30 4:40:241063 days ago1619757624IN
0xf47dfA41...683d5509D
0 ETH0.0028111832.8
Cash Out118991732021-02-21 8:24:331131 days ago1613895873IN
0xf47dfA41...683d5509D
0 ETH0.00646704120
Sell Tokens118990932021-02-21 8:04:551131 days ago1613894695IN
0xf47dfA41...683d5509D
0 ETH0.01077861123
Cash Out109335872020-09-25 19:07:291280 days ago1601060849IN
0xf47dfA41...683d5509D
0 ETH0.0035029865
Sell Tokens109335682020-09-25 19:04:251280 days ago1601060665IN
0xf47dfA41...683d5509D
0 ETH0.0069725796
Cash Out104598882020-07-14 20:54:371353 days ago1594760077IN
0xf47dfA41...683d5509D
0 ETH0.0007544814
Sell Tokens104560752020-07-14 6:34:521353 days ago1594708492IN
0xf47dfA41...683d5509D
0 ETH0.0025420835
Double Down98692102020-04-14 7:36:441444 days ago1586849804IN
0xf47dfA41...683d5509D
0 ETH0.000343843
Sell Tokens98007322020-04-03 18:37:521455 days ago1585939072IN
0xf47dfA41...683d5509D
0 ETH0.000435716
Cash Out98007122020-04-03 18:32:431455 days ago1585938763IN
0xf47dfA41...683d5509D
0 ETH0.000431138
Cash Out97516932020-03-27 5:53:411462 days ago1585288421IN
0xf47dfA41...683d5509D
0 ETH0.000053891
Transfer96991882020-03-19 1:39:281470 days ago1584581968IN
0xf47dfA41...683d5509D
0 ETH0.00044234
Cash Out96902892020-03-17 17:02:411472 days ago1584464561IN
0xf47dfA41...683d5509D
0 ETH0.000269465
Sell Tokens96902892020-03-17 17:02:411472 days ago1584464561IN
0xf47dfA41...683d5509D
0 ETH0.000363095
Cash Out96452312020-03-10 18:03:421479 days ago1583863422IN
0xf47dfA41...683d5509D
0 ETH0.000172453.2
Sell Tokens96452212020-03-10 18:02:251479 days ago1583863345IN
0xf47dfA41...683d5509D
0 ETH0.000209172.88
Cash Out95496872020-02-25 1:35:461493 days ago1582594546IN
0xf47dfA41...683d5509D
0 ETH0.000053891
Sell Tokens95496872020-02-25 1:35:461493 days ago1582594546IN
0xf47dfA41...683d5509D
0 ETH0.00007261
Cash Out95139272020-02-19 13:31:401499 days ago1582119100IN
0xf47dfA41...683d5509D
0 ETH0.000215564
Cash Out95035962020-02-17 23:29:421500 days ago1581982182IN
0xf47dfA41...683d5509D
0 ETH0.000053891
Sell Tokens95031472020-02-17 21:47:061501 days ago1581976026IN
0xf47dfA41...683d5509D
0 ETH0.000145262
Sell Tokens94670402020-02-12 8:14:371506 days ago1581495277IN
0xf47dfA41...683d5509D
0 ETH0.000580768
Sell Tokens94603362020-02-11 7:28:491507 days ago1581406129IN
0xf47dfA41...683d5509D
0 ETH0.000350384
Sell Tokens94586362020-02-11 1:14:171507 days ago1581383657IN
0xf47dfA41...683d5509D
0 ETH0.000437975
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Txn Hash Block From To Value
123397672021-04-30 4:41:101063 days ago1619757670
0xf47dfA41...683d5509D
0.68263763 ETH
123397602021-04-30 4:40:241063 days ago1619757624
0xf47dfA41...683d5509D
0.52246717 ETH
123397602021-04-30 4:40:241063 days ago1619757624
0xf47dfA41...683d5509D
0.06883282 ETH
123397502021-04-30 4:39:061063 days ago1619757546
0xf47dfA41...683d5509D
0.04710525 ETH
118991732021-02-21 8:24:331131 days ago1613895873
0xf47dfA41...683d5509D
0.16586947 ETH
118991052021-02-21 8:08:221131 days ago1613894902
0xf47dfA41...683d5509D
0.07042055 ETH
118990932021-02-21 8:04:551131 days ago1613894695
0xf47dfA41...683d5509D
0.62223028 ETH
118990932021-02-21 8:04:551131 days ago1613894695
0xf47dfA41...683d5509D
0.02308057 ETH
109335872020-09-25 19:07:291280 days ago1601060849
0xf47dfA41...683d5509D
0.1696946 ETH
109335782020-09-25 19:05:531280 days ago1601060753
0xf47dfA41...683d5509D
0.12817774 ETH
109335682020-09-25 19:04:251280 days ago1601060665
0xf47dfA41...683d5509D
1.76386446 ETH
109335682020-09-25 19:04:251280 days ago1601060665
0xf47dfA41...683d5509D
0.09747492 ETH
104598882020-07-14 20:54:371353 days ago1594760077
0xf47dfA41...683d5509D
0.24372799 ETH
104560752020-07-14 6:34:521353 days ago1594708492
0xf47dfA41...683d5509D
2.09782305 ETH
104560752020-07-14 6:34:521353 days ago1594708492
0xf47dfA41...683d5509D
0.1100642 ETH
102020882020-06-04 22:52:531393 days ago1591311173
0xf47dfA41...683d5509D
0.02030291 ETH
98692102020-04-14 7:36:441444 days ago1586849804
0xf47dfA41...683d5509D
0.00004974 ETH
98007332020-04-03 18:38:171455 days ago1585939097
0xf47dfA41...683d5509D
0.00758871 ETH
98007322020-04-03 18:37:521455 days ago1585939072
0xf47dfA41...683d5509D
0.09958265 ETH
98007322020-04-03 18:37:521455 days ago1585939072
0xf47dfA41...683d5509D
0.00406124 ETH
98007122020-04-03 18:32:431455 days ago1585938763
0xf47dfA41...683d5509D
0.00446567 ETH
97516932020-03-27 5:53:411462 days ago1585288421
0xf47dfA41...683d5509D
0.0000475 ETH
97515842020-03-27 5:33:551462 days ago1585287235
0xf47dfA41...683d5509D
0.00466456 ETH
96991882020-03-19 1:39:281470 days ago1584581968
0xf47dfA41...683d5509D
0.00037141 ETH
96902932020-03-17 17:03:321472 days ago1584464612
0xf47dfA41...683d5509D
0.00967754 ETH
View All Internal Transactions
Loading...
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

0x60806040526004361061023b5760003560e01c806364d156401161012e578063a16d5960116100ab578063b84c82461161006f578063b84c824614610d44578063c47f002714610e0c578063d0febe4c14610ed4578063dcdfbbb914610ede578063e625d51514610f0d5761023b565b8063a16d596014610bc3578063a457c2d714610c14578063a7e1f6a214610c87578063a9059cbb14610c9e578063b2131f7d14610d115761023b565b8063949e8acd116100f2578063949e8acd14610a45578063958507eb14610a7057806395d89b4114610a9b5780639b7a629c14610b2b5780639e57ada614610b5a5761023b565b806364d15640146108ae57806365a23cca146109135780636c11bcd31461096257806370a08231146109b5578063793cd71e14610a1a5761023b565b806340477126116101bc5780634ead0590116101805780634ead0590146107515780635c5a0a9d146107ad5780635d86685a146108125780635dae4e50146108615780635f5ad897146108835761023b565b8063404771261461061857806342a7afe21461066b57806345fd71e114610696578063479ba7ae146106c15780634b750334146107265761023b565b806316e457f01161020357806316e457f01461048757806318160ddd146104b657806323b872dd146104e1578063313ce5671461057457806339509351146105a55761023b565b806305a051eb146102ad57806306fdde031461030457806307410b5b14610394578063095ea7b3146103fd5780630afc2c2814610470575b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561029f57610299610f38565b506102ab565b6102a93334611058565b505b005b3480156102b957600080fd5b506102c26113f8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561031057600080fd5b5061031961141e565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561035957808201518184015260208101905061033e565b50505050905090810190601f1680156103865780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103a057600080fd5b506103e3600480360360208110156103b757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506114bc565b604051808215151515815260200191505060405180910390f35b34801561040957600080fd5b506104566004803603604081101561042057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506114dc565b604051808215151515815260200191505060405180910390f35b34801561047c57600080fd5b506104856115ce565b005b34801561049357600080fd5b5061049c611694565b604051808215151515815260200191505060405180910390f35b3480156104c257600080fd5b506104cb6116f5565b6040518082815260200191505060405180910390f35b3480156104ed57600080fd5b5061055a6004803603606081101561050457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506116fb565b604051808215151515815260200191505060405180910390f35b34801561058057600080fd5b50610589611a21565b604051808260ff1660ff16815260200191505060405180910390f35b3480156105b157600080fd5b506105fe600480360360408110156105c857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611a26565b604051808215151515815260200191505060405180910390f35b34801561062457600080fd5b506106516004803603602081101561063b57600080fd5b8101908080359060200190929190505050611ba8565b604051808215151515815260200191505060405180910390f35b34801561067757600080fd5b50610680611f68565b6040518082815260200191505060405180910390f35b3480156106a257600080fd5b506106ab611f78565b6040518082815260200191505060405180910390f35b3480156106cd57600080fd5b50610710600480360360208110156106e457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061201e565b6040518082815260200191505060405180910390f35b34801561073257600080fd5b5061073b6120c1565b6040518082815260200191505060405180910390f35b6107936004803603602081101561076757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061215f565b604051808215151515815260200191505060405180910390f35b3480156107b957600080fd5b506107fc600480360360208110156107d057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612325565b6040518082815260200191505060405180910390f35b34801561081e57600080fd5b5061084b6004803603602081101561083557600080fd5b810190808035906020019092919050505061233d565b6040518082815260200191505060405180910390f35b610869610f38565b604051808215151515815260200191505060405180910390f35b34801561088f57600080fd5b50610898612373565b6040518082815260200191505060405180910390f35b3480156108ba57600080fd5b506108fd600480360360208110156108d157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612379565b6040518082815260200191505060405180910390f35b34801561091f57600080fd5b5061094c6004803603602081101561093657600080fd5b8101908080359060200190929190505050612391565b6040518082815260200191505060405180910390f35b34801561096e57600080fd5b5061099b6004803603602081101561098557600080fd5b8101908080359060200190929190505050612423565b604051808215151515815260200191505060405180910390f35b3480156109c157600080fd5b50610a04600480360360208110156109d857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506124ed565b6040518082815260200191505060405180910390f35b348015610a2657600080fd5b50610a2f612536565b6040518082815260200191505060405180910390f35b348015610a5157600080fd5b50610a5a612670565b6040518082815260200191505060405180910390f35b348015610a7c57600080fd5b50610a856126b7565b6040518082815260200191505060405180910390f35b348015610aa757600080fd5b50610ab06126bd565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610af0578082015181840152602081019050610ad5565b50505050905090810190601f168015610b1d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610b3757600080fd5b50610b4061275b565b604051808215151515815260200191505060405180910390f35b348015610b6657600080fd5b50610ba960048036036020811015610b7d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061276e565b604051808215151515815260200191505060405180910390f35b348015610bcf57600080fd5b50610c1260048036036020811015610be657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061278e565b005b348015610c2057600080fd5b50610c6d60048036036040811015610c3757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506128b3565b604051808215151515815260200191505060405180910390f35b348015610c9357600080fd5b50610c9c612a35565b005b348015610caa57600080fd5b50610cf760048036036040811015610cc157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612b3f565b604051808215151515815260200191505060405180910390f35b348015610d1d57600080fd5b50610d26612c96565b604051808261ffff1661ffff16815260200191505060405180910390f35b348015610d5057600080fd5b50610e0a60048036036020811015610d6757600080fd5b8101908080359060200190640100000000811115610d8457600080fd5b820183602082011115610d9657600080fd5b80359060200191846001830284011164010000000083111715610db857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612caa565b005b348015610e1857600080fd5b50610ed260048036036020811015610e2f57600080fd5b8101908080359060200190640100000000811115610e4c57600080fd5b820183602082011115610e5e57600080fd5b80359060200191846001830284011164010000000083111715610e8057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612d6d565b005b610edc612e30565b005b348015610eea57600080fd5b50610ef3612e3d565b604051808215151515815260200191505060405180910390f35b348015610f1957600080fd5b50610f22612e50565b6040518082815260200191505060405180910390f35b6000806005541415610f95576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260358152602001806140806035913960400191505060405180910390fd5b60003490506000610faf8268010000000000000000612e6f565b90506000610fbf82600554612ea6565b9050610fcd60045482612ebf565b600481905550610fdc83612edb565b61104e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f6572726f7220696e2063616c6c696e6720757064617465536c75736846756e6481525060200191505060405180910390fd5b6001935050505090565b600081600660159054906101000a900460ff16156112565760011515600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611119576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806141696030913960400191505060405180910390fd5b6000611164600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483612ebf565b90506722b1c8c1227a00008111156111c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e8152602001806141bc603e913960400191505060405180910390fd5b6753444835ec580000823073ffffffffffffffffffffffffffffffffffffffff163101116112385780600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611254565b6000600660156101000a81548160ff0219169083151502179055505b505b61125e613f85565b61126784612f70565b905060006112858260016002811061127b57fe5b6020020151612ff1565b90506005546005548201116112e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061431d6025913960400191505060405180910390fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600060608273ffffffffffffffffffffffffffffffffffffffff168560006002811061133457fe5b602002015160405180600001905060006040518083038185875af1925050503d806000811461137f576040519150601f19603f3d011682016040523d82523d6000602084013e611384565b606091505b5091509150816113df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001806142276043913960600191505060405180910390fd5b6113e98985613078565b83965050505050505092915050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114b45780601f10611489576101008083540402835291602001916114b4565b820191906000526020600020905b81548152906001019060200180831161149757829003601f168201915b505050505081565b600c6020528060005260406000206000915054906101000a900460ff1681565b600081600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60011515600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611677576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001806141fa602d913960400191505060405180910390fd5b6000600660156101000a81548160ff021916908315150217905550565b600080600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111156116ed576116eb81613211565b505b600191505090565b60055481565b6000838280600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156117d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061426a6030913960400191505060405180910390fd5b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484111580156118305750600660159054906101000a900460ff16155b611885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061404d6033913960400191505060405180910390fd5b6000600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060006119128287613452565b905080600960008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506119a0888888613469565b611a12576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f6572726f7220696e20696e7465726e616c20746f6b656e207472616e7366657281525060200191505060405180910390fd5b60019450505050509392505050565b601281565b600080600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000611ab48285612ebf565b905080600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a360019250505092915050565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211158015611c065750600660159054906101000a900460ff16155b611c5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061404d6033913960400191505060405180910390fd5b6000611c66836137f5565b90506000611c976002600360009054906101000a900461ffff1661ffff16840281611c8d57fe5b0462010000612ea6565b90506000611ca58383613452565b9050611cb13386613896565b6000611cc68368010000000000000000612e6f565b90506000611cd682600554612ea6565b9050611ce460045482612ebf565b600481905550611cf384612edb565b611d65576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f6572726f7220696e2063616c6c696e6720757064617465536c75736846756e6481525060200191505060405180910390fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600060608273ffffffffffffffffffffffffffffffffffffffff168633604051602401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019150506040516020818303038152906040527f4ead0590000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b60208310611e955780518252602082019150602081019050602083039250611e72565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611ef7576040519150601f19603f3d011682016040523d82523d6000602084013e611efc565b606091505b509150915081611f57576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001806142276043913960600191505060405180910390fd5b600198505050505050505050919050565b6000611f733361201e565b905090565b6000806005541415611fd5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806142f3602a913960400191505060405180910390fd5b6000611fe8670de0b6b3a76400006137f5565b9050611ff2613f85565b611ffb82612f70565b905060008160006002811061200c57fe5b60200201518301905080935050505090565b600068010000000000000000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546004540203816120b657fe5b059050809050919050565b600080600554141561211e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806142f3602a913960400191505060405180910390fd5b6000612131670de0b6b3a76400006137f5565b905061213b613f85565b61214482612f70565b90508060016002811061215357fe5b60200201519250505090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612207576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806140b56038913960400191505060405180910390fd5b6000349050600061223b6002600360009054906101000a900461ffff1661ffff1684028161223157fe5b0462010000612ea6565b905060006122498383613452565b905060006122608368010000000000000000612e6f565b9050600061227082600554612ea6565b905061227e60045482612ebf565b60048190555061228d84612edb565b6122ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f6572726f7220696e2063616c6c696e6720757064617465536c75736846756e6481525060200191505060405180910390fd5b600061230a84612ff1565b90506123168882613078565b60019650505050505050919050565b60076020528060005260406000206000915090505481565b60008061234983612f70565b60016002811061235557fe5b60200201519050600061236782612ff1565b90508092505050919050565b60045481565b60086020528060005260406000206000915090505481565b60006005548211156123ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260448152602001806141256044913960600191505060405180910390fd5b60006123f9836137f5565b9050600061240682612f70565b60016002811061241257fe5b602002015190508092505050919050565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211156124da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f696e73756666696369656e742066756e647320617661696c61626c650000000081525060200191505060405180910390fd5b6124e382613211565b5060019050919050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006125413361201e565b905061254d3382613ae4565b5080600260008282540392505081905550612566613c24565b6125d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f6572726f7220696e2063616c6c696e672063616c63466565526174650000000081525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561261e573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff167fab933177d8753a66dd869151cf9aa88649e067b7a4e2dad9d5d192d61cf593b0826040518082815260200191505060405180910390a290565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b60025481565b60018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156127535780601f1061272857610100808354040283529160200191612753565b820191906000526020600020905b81548152906001019060200180831161273657829003601f168201915b505050505081565b600660149054906101000a900460ff1681565b600b6020528060005260406000206000915054906101000a900460ff1681565b60011515600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514612837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001806141fa602d913960400191505060405180910390fd5b60001515600660149054906101000a900460ff16151514156128b05780600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600660146101000a81548160ff0219169083151502179055505b50565b600080600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060006129418285613452565b905080600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a360019250505092915050565b6000612a403361201e565b9050612a4c3382613ae4565b5080600260008282540392505081905550612a65613c24565b612ad7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f6572726f7220696e2063616c6c696e672063616c63466565526174650000000081525060200191505060405180910390fd5b6000612ae33383611058565b90503373ffffffffffffffffffffffffffffffffffffffff167f4de94b39625248a5696f0c1f78680ee8dad819ce02dc53b3b5ed5db8d95cd3d88383604051808381526020018281526020019250505060405180910390a25050565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211158015612b9d5750600660159054906101000a900460ff16155b612c0f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f7472616e73666572206e6f7420616c6c6f77656400000000000000000000000081525060200191505060405180910390fd5b612c1a338484613469565b612c8c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f6572726f7220696e20696e7465726e616c20746f6b656e207472616e7366657281525060200191505060405180910390fd5b6001905092915050565b600360009054906101000a900461ffff1681565b60011515600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514612d53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001806141fa602d913960400191505060405180910390fd5b8060019080519060200190612d69929190613fa7565b5050565b60011515600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514612e16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001806141fa602d913960400191505060405180910390fd5b8060009080519060200190612e2c929190613fa7565b5050565b612e3a3334611058565b50565b600660159054906101000a900460ff1681565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b600080831415612e825760009050612ea0565b6000828402905082848281612e9357fe5b0414612e9b57fe5b809150505b92915050565b600080828481612eb257fe5b0490508091505092915050565b600080828401905083811015612ed157fe5b8091505092915050565b600081600260008282540192505081905550612ef5613c24565b612f67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f6572726f7220696e2063616c6c696e672063616c63466565526174650000000081525060200191505060405180910390fd5b60019050919050565b612f78613f85565b612fa2612f9983600360009054906101000a900461ffff1661ffff16612e6f565b62010000612ea6565b81600060028110612faf57fe5b602002018181525050612fd38282600060028110612fc957fe5b6020020151613452565b81600160028110612fe057fe5b602002018181525050809050919050565b600080670de0b6b3a764000064e8d4a510000290506000600554633b9aca0061306361305d60055486633b9aca00600202020260026005540a6002633b9aca000a02670de0b6b3a76400008a02670de0b6b3a7640000633b9aca0002600202026002890a010101613cce565b85613452565b8161306a57fe5b040390508092505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061429a6023913960400191505060405180910390fd5b61310a60055482612ebf565b60058190555061311a8282613d13565b50613164600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482612ebf565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211156132c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f696e73756666696369656e742066756e647320617661696c61626c650000000081525060200191505060405180910390fd5b60006132d3836137f5565b90506132dd613f85565b6132e682612f70565b90506132f23385613896565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600060608273ffffffffffffffffffffffffffffffffffffffff168460006002811061334157fe5b602002015160405180600001905060006040518083038185875af1925050503d806000811461338c576040519150601f19603f3d011682016040523d82523d6000602084013e613391565b606091505b5091509150816133ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001806142276043913960600191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc8560016002811061341357fe5b60200201519081150290604051600060405180830381858888f19350505050158015613443573d6000803e3d6000fd5b50600195505050505050919050565b60008282111561345e57fe5b818303905092915050565b6000613473613f85565b61347c83612f70565b9050600061349a8260006002811061349057fe5b60200201516137f5565b90506134b9600554836000600281106134af57fe5b6020020151613452565b600581905550600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460006002811061351c57fe5b60200201516040518082815260200191505060405180910390a361357f600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205485613452565b600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506135dd85836001600281106135d357fe5b6020020151613d13565b50613638600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548360016002811061362e57fe5b6020020151612ebf565b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506136858685613e4c565b506000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600060608273ffffffffffffffffffffffffffffffffffffffff168460405180600001905060006040518083038185875af1925050503d806000811461370f576040519150601f19603f3d011682016040523d82523d6000602084013e613714565b606091505b50915091508161376f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001806142276043913960600191505060405180910390fd5b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876001600281106137cb57fe5b60200201516040518082815260200191505060405180910390a36001955050505050509392505050565b600080670de0b6b3a7640000830190506000670de0b6b3a76400006005540190506000670de0b6b3a7640000613881670de0b6b3a76400008503633b9aca00670de0b6b3a7640000868161384557fe5b04633b9aca000264e8d4a510000103026002670de0b6b3a7640000876002890a038161386d57fe5b04633b9aca00028161387b57fe5b04613452565b8161388857fe5b049050809350505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561391c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806141996023913960400191505060405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111156139d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f696e73756666696369656e742066756e647320617661696c61626c650000000081525060200191505060405180910390fd5b613a1a600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482613452565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613a6960055482613452565b600581905550613a798282613e4c565b50600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600080613afa8368010000000000000000612e6f565b600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054019050600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811215613bd5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806142bd6036913960400191505060405180910390fd5b80600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600191505092915050565b60008061199961ffff166703782dace9d9000060025481613c4157fe5b0602905060006703782dace9d900008281613c5857fe5b04905060008161ffff1661066601905080600360006101000a81548161ffff021916908361ffff1602179055507fc2cc2ca038d89e4eb3ed987815f876e8e6aaee289e7be6e8d951d2424930763e81604051808261ffff1661ffff16815260200191505060405180910390a16001935050505090565b60008060026001840181613cde57fe5b0490508291505b81811015613d0d57809150600281828581613cfc57fe5b040181613d0557fe5b049050613ce5565b50919050565b600080613d2260045484612e6f565b600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054019050600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811215613dfd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b815260200180614342603b913960400191505060405180910390fd5b80600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600191505092915050565b600080613e5b60045484612e6f565b600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054039050600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811315613f36576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806140ed6038913960400191505060405180910390fd5b80600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600191505092915050565b6040518060400160405280600290602082028038833980820191505090505090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613fe857805160ff1916838001178555614016565b82800160010185558215614016579182015b82811115614015578251825591602001919060010190613ffa565b5b5090506140239190614027565b5090565b61404991905b8082111561404557600081600090555060010161402d565b5090565b9056fe7472616e73666572206e6f7420616c6c6f776564202d20696e73756666696369656e742066756e647320617661696c61626c656d616b6549745261696e2066756e6374696f6e2063616c6c656420746f6f206561726c792028737570706c79206973207a65726f29746869732066756e6374696f6e2063616e206f6e6c792062652063616c6c65642062792074686520706172746e657220636f6e74726163744552524f523a20696e746567657220756e646572666c6f7720696e20757064617465526577617264734f6e53616c652066756e6374696f6e756e61626c6520746f2063616c63756c61746520666f7220616d6f756e74206f6620746f6b656e732067726561746572207468616e2063757272656e7420737570706c797075726368617365732063757272656e746c79206c696d69746564206f6e6c7920746f20636f6e7472696275746f727363616e6e6f74206275726e20746f6b656e7320666f72207a65726f2061646472657373617474656d7074656420707572636861736520776f756c6420657863656564206c696d697420706c616365642075706f6e20636f6e7472696275746f727366756e6374696f6e2063616e206f6e6c792062652063616c6c656420627920636f6e74726163742061646d696e6661696c656420746f2073656e642066756e647320746f20706172746e657220636f6e747261637420286e6f7420656e6f756768206761732070726f76696465643f297472616e73666572206e6f7420617574686f72697a65642028616c6c6f77616e636520696e73756666696369656e742963616e6e6f74206d696e7420746f6b656e7320666f72207a65726f20616464726573734552524f523a20696e7465676572206f766572666c6f7720696e207570646174655370656e74526577617264732066756e6374696f6e66756e6374696f6e2063616c6c656420746f6f206561726c792028737570706c79206973207a65726f29707572636861736520776f756c6420636175736520696e7465676572206f766572666c6f774552524f523a20696e7465676572206f766572666c6f7720696e20757064617465526577617264734f6e50757263686173652066756e6374696f6ea265627a7a7231582005a4502a65bb0e2a1a551683a17b6451794fc459ac3de41d759414e829c63ad564736f6c634300050c0032

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
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Txn Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.