ETH Price: $3,319.41 (-1.20%)

Contract

0xB565726e2e44e4aE9e3CE750fc4ba8fA65e701e0
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Revoke Grant71239812019-01-25 12:30:582128 days ago1548419458IN
0xB565726e...A65e701e0
0 ETH0.000706184
Unpause67315902018-11-19 4:48:142195 days ago1542602894IN
0xB565726e...A65e701e0
0 ETH0.000085053
Set Etheal Token67315762018-11-19 4:44:542195 days ago1542602694IN
0xB565726e...A65e701e0
0 ETH0.000220015
Pause66783712018-11-10 12:15:552204 days ago1541852155IN
0xB565726e...A65e701e0
0 ETH0.000143745
Revoke Grant64880852018-10-10 9:14:522235 days ago1539162892IN
0xB565726e...A65e701e0
0 ETH0.000398563
Create Grant62637552018-09-03 10:01:492272 days ago1535968909IN
0xB565726e...A65e701e0
0 ETH0.002070413
Create Grant62637552018-09-03 10:01:492272 days ago1535968909IN
0xB565726e...A65e701e0
0 ETH0.002132343
Create Grant62637502018-09-03 10:01:292272 days ago1535968889IN
0xB565726e...A65e701e0
0 ETH0.00207063
Create Grant62637502018-09-03 10:01:292272 days ago1535968889IN
0xB565726e...A65e701e0
0 ETH0.002132343
Create Grant62637482018-09-03 10:00:562272 days ago1535968856IN
0xB565726e...A65e701e0
0 ETH0.002132343
Create Grant62637442018-09-03 9:59:532272 days ago1535968793IN
0xB565726e...A65e701e0
0 ETH0.002760594
Create Grant62637442018-09-03 9:59:532272 days ago1535968793IN
0xB565726e...A65e701e0
0 ETH0.002132373
Create Grant62637352018-09-03 9:57:412272 days ago1535968661IN
0xB565726e...A65e701e0
0 ETH0.002132373
Create Grant62636972018-09-03 9:47:262272 days ago1535968046IN
0xB565726e...A65e701e0
0 ETH0.002132373
Create Grant62636902018-09-03 9:46:262272 days ago1535967986IN
0xB565726e...A65e701e0
0 ETH0.002132373
Create Grant62636722018-09-03 9:41:332272 days ago1535967693IN
0xB565726e...A65e701e0
0 ETH0.002132373
Create Grant62636692018-09-03 9:41:002272 days ago1535967660IN
0xB565726e...A65e701e0
0 ETH0.002132563
Create Grant62636472018-09-03 9:35:102272 days ago1535967310IN
0xB565726e...A65e701e0
0 ETH0.002132373
Create Grant62636402018-09-03 9:33:552272 days ago1535967235IN
0xB565726e...A65e701e0
0 ETH0.002070443
Create Grant62636402018-09-03 9:33:552272 days ago1535967235IN
0xB565726e...A65e701e0
0 ETH0.002132563
Create Grant62636222018-09-03 9:30:352272 days ago1535967035IN
0xB565726e...A65e701e0
0 ETH0.002132373
Create Grant62635372018-09-03 9:07:452272 days ago1535965665IN
0xB565726e...A65e701e0
0 ETH0.002070443
Create Grant62635372018-09-03 9:07:452272 days ago1535965665IN
0xB565726e...A65e701e0
0 ETH0.002132373
Revoke Grant62635012018-09-03 8:59:272272 days ago1535965167IN
0xB565726e...A65e701e0
0 ETH0.000336633
Create Grant62635012018-09-03 8:59:272272 days ago1535965167IN
0xB565726e...A65e701e0
0 ETH0.002070443
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
67575692018-11-23 11:39:032191 days ago1542973143
0xB565726e...A65e701e0
0.01 ETH
62637552018-09-03 10:01:492272 days ago1535968909
0xB565726e...A65e701e0
 Contract Creation0 ETH
62637552018-09-03 10:01:492272 days ago1535968909
0xB565726e...A65e701e0
 Contract Creation0 ETH
62637502018-09-03 10:01:292272 days ago1535968889
0xB565726e...A65e701e0
 Contract Creation0 ETH
62637502018-09-03 10:01:292272 days ago1535968889
0xB565726e...A65e701e0
 Contract Creation0 ETH
62637482018-09-03 10:00:562272 days ago1535968856
0xB565726e...A65e701e0
 Contract Creation0 ETH
62637442018-09-03 9:59:532272 days ago1535968793
0xB565726e...A65e701e0
 Contract Creation0 ETH
62637442018-09-03 9:59:532272 days ago1535968793
0xB565726e...A65e701e0
 Contract Creation0 ETH
62637352018-09-03 9:57:412272 days ago1535968661
0xB565726e...A65e701e0
 Contract Creation0 ETH
62636972018-09-03 9:47:262272 days ago1535968046
0xB565726e...A65e701e0
 Contract Creation0 ETH
62636902018-09-03 9:46:262272 days ago1535967986
0xB565726e...A65e701e0
 Contract Creation0 ETH
62636722018-09-03 9:41:332272 days ago1535967693
0xB565726e...A65e701e0
 Contract Creation0 ETH
62636692018-09-03 9:41:002272 days ago1535967660
0xB565726e...A65e701e0
 Contract Creation0 ETH
62636472018-09-03 9:35:102272 days ago1535967310
0xB565726e...A65e701e0
 Contract Creation0 ETH
62636402018-09-03 9:33:552272 days ago1535967235
0xB565726e...A65e701e0
 Contract Creation0 ETH
62636402018-09-03 9:33:552272 days ago1535967235
0xB565726e...A65e701e0
 Contract Creation0 ETH
62636222018-09-03 9:30:352272 days ago1535967035
0xB565726e...A65e701e0
 Contract Creation0 ETH
62635372018-09-03 9:07:452272 days ago1535965665
0xB565726e...A65e701e0
 Contract Creation0 ETH
62635372018-09-03 9:07:452272 days ago1535965665
0xB565726e...A65e701e0
 Contract Creation0 ETH
62635012018-09-03 8:59:272272 days ago1535965167
0xB565726e...A65e701e0
 Contract Creation0 ETH
62635012018-09-03 8:59:272272 days ago1535965167
0xB565726e...A65e701e0
 Contract Creation0 ETH
62632382018-09-03 7:55:052272 days ago1535961305
0xB565726e...A65e701e0
 Contract Creation0 ETH
62632372018-09-03 7:54:512272 days ago1535961291
0xB565726e...A65e701e0
 Contract Creation0 ETH
62632372018-09-03 7:54:512272 days ago1535961291
0xB565726e...A65e701e0
 Contract Creation0 ETH
62632362018-09-03 7:54:422272 days ago1535961282
0xB565726e...A65e701e0
 Contract Creation0 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
EthealController

Compiler Version
v0.4.18+commit.9cf6e910

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2017-11-29
*/

pragma solidity ^0.4.17;
/**
 * @title ERC20
 * @dev ERC20 interface
 */
contract ERC20 {
    function balanceOf(address who) public view returns (uint256);
    function transfer(address to, uint256 value) public returns (bool);
    function allowance(address owner, address spender) public view returns (uint256);
    function transferFrom(address from, address to, uint256 value) public returns (bool);
    function approve(address spender, uint256 value) public returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}
/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
  address public owner;
  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  function Ownable() {
    owner = msg.sender;
  }
  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }
  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param newOwner The address to transfer ownership to.
   */
  function transferOwnership(address newOwner) onlyOwner public {
    require(newOwner != address(0));
    OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }
}
/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a * b;
    assert(a == 0 || c / a == b);
    return c;
  }
  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;
  }
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }
  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    assert(c >= a);
    return c;
  }
}
contract Controlled {
    /// @notice The address of the controller is the only address that can call
    ///  a function with this modifier
    modifier onlyController { require(msg.sender == controller); _; }
    address public controller;
    function Controlled() public { controller = msg.sender;}
    /// @notice Changes the controller of the contract
    /// @param _newController The new controller of the contract
    function changeController(address _newController) public onlyController {
        controller = _newController;
    }
}
/**
 * @title MiniMe interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract ERC20MiniMe is ERC20, Controlled {
    function approveAndCall(address _spender, uint256 _amount, bytes _extraData) public returns (bool);
    function totalSupply() public view returns (uint);
    function balanceOfAt(address _owner, uint _blockNumber) public view returns (uint);
    function totalSupplyAt(uint _blockNumber) public view returns(uint);
    function createCloneToken(string _cloneTokenName, uint8 _cloneDecimalUnits, string _cloneTokenSymbol, uint _snapshotBlock, bool _transfersEnabled) public returns(address);
    function generateTokens(address _owner, uint _amount) public returns (bool);
    function destroyTokens(address _owner, uint _amount)  public returns (bool);
    function enableTransfers(bool _transfersEnabled) public;
    function isContract(address _addr) internal view returns(bool);
    function claimTokens(address _token) public;
    event ClaimedTokens(address indexed _token, address indexed _controller, uint _amount);
    event NewCloneToken(address indexed _cloneToken, uint _snapshotBlock);
}
/**
 * @title Crowdsale
 * @dev Crowdsale is a base contract for managing a token crowdsale.
 * Crowdsales have a start and end timestamps, where investors can make
 * token purchases and the crowdsale will assign them tokens based
 * on a token per ETH rate. Funds collected are forwarded to a wallet
 * as they arrive.
 */
contract Crowdsale {
  using SafeMath for uint256;
  // The token being sold
  ERC20MiniMe public token;
  // start and end timestamps where investments are allowed (both inclusive)
  uint256 public startTime;
  uint256 public endTime;
  // address where funds are collected
  address public wallet;
  // how many token units a buyer gets per wei
  uint256 public rate;
  // amount of raised money in wei
  uint256 public weiRaised;
  /**
   * event for token purchase logging
   * @param purchaser who paid for the tokens
   * @param beneficiary who got the tokens
   * @param value weis paid for purchase
   * @param amount amount of tokens purchased
   */
  event TokenPurchase(address indexed purchaser, address indexed beneficiary, uint256 value, uint256 amount);
  function Crowdsale(uint256 _startTime, uint256 _endTime, uint256 _rate, address _wallet) {
    require(_startTime >= now);
    require(_endTime >= _startTime);
    require(_rate > 0);
    require(_wallet != 0x0);
    startTime = _startTime;
    endTime = _endTime;
    rate = _rate;
    wallet = _wallet;
  }
  // fallback function can be used to buy tokens
  function () payable {
    buyTokens(msg.sender);
  }
  // low level token purchase function
  function buyTokens(address beneficiary) public payable {
    buyTokens(beneficiary, msg.value);
  }
  // implementation of low level token purchase function
  function buyTokens(address beneficiary, uint256 weiAmount) internal {
    require(beneficiary != 0x0);
    require(validPurchase(weiAmount));
    // update state
    weiRaised = weiRaised.add(weiAmount);
    transferToken(beneficiary, weiAmount);
    forwardFunds(weiAmount);
  }
  // low level transfer token
  // override to create custom token transfer mechanism, eg. pull pattern
  function transferToken(address beneficiary, uint256 weiAmount) internal {
    // calculate token amount to be created
    uint256 tokens = weiAmount.mul(rate);
    token.generateTokens(beneficiary, tokens);
    TokenPurchase(msg.sender, beneficiary, weiAmount, tokens);
  }
  // send ether to the fund collection wallet
  // override to create custom fund forwarding mechanisms
  function forwardFunds(uint256 weiAmount) internal {
    wallet.transfer(weiAmount);
  }
  // @return true if the transaction can buy tokens
  function validPurchase(uint256 weiAmount) internal view returns (bool) {
    bool withinPeriod = now >= startTime && now <= endTime;
    bool nonZeroPurchase = weiAmount != 0;
    return withinPeriod && nonZeroPurchase;
  }
  // @return true if crowdsale event has ended
  function hasEnded() public view returns (bool) {
    return now > endTime;
  }
  // @return true if crowdsale has started
  function hasStarted() public view returns (bool) {
    return now >= startTime;
  }
}
/// @dev The token controller contract must implement these functions
contract TokenController {
    ERC20MiniMe public ethealToken;
    address public SALE; // address where sale tokens are located
    /// @notice needed for hodler handling
    function addHodlerStake(address _beneficiary, uint _stake) public;
    function setHodlerStake(address _beneficiary, uint256 _stake) public;
    function setHodlerTime(uint256 _time) public;
    /// @notice Called when `_owner` sends ether to the MiniMe Token contract
    /// @param _owner The address that sent the ether to create tokens
    /// @return True if the ether is accepted, false if it throws
    function proxyPayment(address _owner) public payable returns(bool);
    /// @notice Notifies the controller about a token transfer allowing the
    ///  controller to react if desired
    /// @param _from The origin of the transfer
    /// @param _to The destination of the transfer
    /// @param _amount The amount of the transfer
    /// @return False if the controller does not authorize the transfer
    function onTransfer(address _from, address _to, uint _amount) public returns(bool);
    /// @notice Notifies the controller about an approval allowing the
    ///  controller to react if desired
    /// @param _owner The address that calls `approve()`
    /// @param _spender The spender in the `approve()` call
    /// @param _amount The amount in the `approve()` call
    /// @return False if the controller does not authorize the approval
    function onApprove(address _owner, address _spender, uint _amount) public returns(bool);
}
/**
 * @title Pausable
 * @dev Base contract which allows children to implement an emergency stop mechanism.
 */
contract Pausable is Ownable {
  event Pause();
  event Unpause();
  bool public paused = false;
  /**
   * @dev Modifier to make a function callable only when the contract is not paused.
   */
  modifier whenNotPaused() {
    require(!paused);
    _;
  }
  /**
   * @dev Modifier to make a function callable only when the contract is paused.
   */
  modifier whenPaused() {
    require(paused);
    _;
  }
  /**
   * @dev called by the owner to pause, triggers stopped state
   */
  function pause() onlyOwner whenNotPaused public {
    paused = true;
    Pause();
  }
  /**
   * @dev called by the owner to unpause, returns to normal state
   */
  function unpause() onlyOwner whenPaused public {
    paused = false;
    Unpause();
  }
}
/**
 * @title Hodler
 * @dev Handles hodler reward, TokenController should create and own it.
 */
contract Hodler is Ownable {
    using SafeMath for uint;
    // HODLER reward tracker
    // stake amount per address
    struct HODL {
        uint256 stake;
        // moving ANY funds invalidates hodling of the address
        bool invalid;
        bool claimed3M;
        bool claimed6M;
        bool claimed9M;
    }
    mapping (address => HODL) public hodlerStakes;
    // total current staking value and hodler addresses
    uint256 public hodlerTotalValue;
    uint256 public hodlerTotalCount;
    // store dates and total stake values for 3 - 6 - 9 months after normal sale
    uint256 public hodlerTotalValue3M;
    uint256 public hodlerTotalValue6M;
    uint256 public hodlerTotalValue9M;
    uint256 public hodlerTimeStart;
    uint256 public hodlerTime3M;
    uint256 public hodlerTime6M;
    uint256 public hodlerTime9M;
    // reward HEAL token amount
    uint256 public TOKEN_HODL_3M;
    uint256 public TOKEN_HODL_6M;
    uint256 public TOKEN_HODL_9M;
    // total amount of tokens claimed so far
    uint256 public claimedTokens;
    
    event LogHodlSetStake(address indexed _setter, address indexed _beneficiary, uint256 _value);
    event LogHodlClaimed(address indexed _setter, address indexed _beneficiary, uint256 _value);
    event LogHodlStartSet(address indexed _setter, uint256 _time);
    /// @dev Only before hodl is started
    modifier beforeHodlStart() {
        if (hodlerTimeStart == 0 || now <= hodlerTimeStart)
            _;
    }
    /// @dev Contructor, it should be created by a TokenController
    function Hodler(uint256 _stake3m, uint256 _stake6m, uint256 _stake9m) {
        TOKEN_HODL_3M = _stake3m;
        TOKEN_HODL_6M = _stake6m;
        TOKEN_HODL_9M = _stake9m;
    }
    /// @notice Adding hodler stake to an account
    /// @dev Only owner contract can call it and before hodling period starts
    /// @param _beneficiary Recepient address of hodler stake
    /// @param _stake Amount of additional hodler stake
    function addHodlerStake(address _beneficiary, uint256 _stake) public onlyOwner beforeHodlStart {
        // real change and valid _beneficiary is needed
        if (_stake == 0 || _beneficiary == address(0))
            return;
        
        // add stake and maintain count
        if (hodlerStakes[_beneficiary].stake == 0)
            hodlerTotalCount = hodlerTotalCount.add(1);
        hodlerStakes[_beneficiary].stake = hodlerStakes[_beneficiary].stake.add(_stake);
        hodlerTotalValue = hodlerTotalValue.add(_stake);
        LogHodlSetStake(msg.sender, _beneficiary, hodlerStakes[_beneficiary].stake);
    }
    /// @notice Setting hodler stake of an account
    /// @dev Only owner contract can call it and before hodling period starts
    /// @param _beneficiary Recepient address of hodler stake
    /// @param _stake Amount to set the hodler stake
    function setHodlerStake(address _beneficiary, uint256 _stake) public onlyOwner beforeHodlStart {
        // real change and valid _beneficiary is needed
        if (hodlerStakes[_beneficiary].stake == _stake || _beneficiary == address(0))
            return;
        
        // add stake and maintain count
        if (hodlerStakes[_beneficiary].stake == 0 && _stake > 0) {
            hodlerTotalCount = hodlerTotalCount.add(1);
        } else if (hodlerStakes[_beneficiary].stake > 0 && _stake == 0) {
            hodlerTotalCount = hodlerTotalCount.sub(1);
        }
        uint256 _diff = _stake > hodlerStakes[_beneficiary].stake ? _stake.sub(hodlerStakes[_beneficiary].stake) : hodlerStakes[_beneficiary].stake.sub(_stake);
        if (_stake > hodlerStakes[_beneficiary].stake) {
            hodlerTotalValue = hodlerTotalValue.add(_diff);
        } else {
            hodlerTotalValue = hodlerTotalValue.sub(_diff);
        }
        hodlerStakes[_beneficiary].stake = _stake;
        LogHodlSetStake(msg.sender, _beneficiary, _stake);
    }
    /// @notice Setting hodler start period.
    /// @param _time The time when hodler reward starts counting
    function setHodlerTime(uint256 _time) public onlyOwner beforeHodlStart {
        require(_time >= now);
        hodlerTimeStart = _time;
        hodlerTime3M = _time.add(90 days);
        hodlerTime6M = _time.add(180 days);
        hodlerTime9M = _time.add(270 days);
        LogHodlStartSet(msg.sender, _time);
    }
    /// @notice Invalidates hodler account 
    /// @dev Gets called by EthealController#onTransfer before every transaction
    function invalidate(address _account) public onlyOwner {
        if (hodlerStakes[_account].stake > 0 && !hodlerStakes[_account].invalid) {
            hodlerStakes[_account].invalid = true;
            hodlerTotalValue = hodlerTotalValue.sub(hodlerStakes[_account].stake);
            hodlerTotalCount = hodlerTotalCount.sub(1);
        }
        // update hodl total values "automatically" - whenever someone sends funds thus
        updateAndGetHodlTotalValue();
    }
    /// @notice Claiming HODL reward for msg.sender
    function claimHodlReward() public {
        claimHodlRewardFor(msg.sender);
    }
    /// @notice Claiming HODL reward for an address
    function claimHodlRewardFor(address _beneficiary) public {
        // only when the address has a valid stake
        require(hodlerStakes[_beneficiary].stake > 0 && !hodlerStakes[_beneficiary].invalid);
        uint256 _stake = 0;
        
        // update hodl total values
        updateAndGetHodlTotalValue();
        // claim hodl if not claimed
        if (!hodlerStakes[_beneficiary].claimed3M && now >= hodlerTime3M) {
            _stake = _stake.add(hodlerStakes[_beneficiary].stake.mul(TOKEN_HODL_3M).div(hodlerTotalValue3M));
            hodlerStakes[_beneficiary].claimed3M = true;
        }
        if (!hodlerStakes[_beneficiary].claimed6M && now >= hodlerTime6M) {
            _stake = _stake.add(hodlerStakes[_beneficiary].stake.mul(TOKEN_HODL_6M).div(hodlerTotalValue6M));
            hodlerStakes[_beneficiary].claimed6M = true;
        }
        if (!hodlerStakes[_beneficiary].claimed9M && now >= hodlerTime9M) {
            _stake = _stake.add(hodlerStakes[_beneficiary].stake.mul(TOKEN_HODL_9M).div(hodlerTotalValue9M));
            hodlerStakes[_beneficiary].claimed9M = true;
        }
        if (_stake > 0) {
            // increasing claimed tokens
            claimedTokens = claimedTokens.add(_stake);
            // transferring tokens
            require(TokenController(owner).ethealToken().transfer(_beneficiary, _stake));
            // log
            LogHodlClaimed(msg.sender, _beneficiary, _stake);
        }
    }
    /// @notice claimHodlRewardFor() for multiple addresses
    /// @dev Anyone can call this function and distribute hodl rewards
    /// @param _beneficiaries Array of addresses for which we want to claim hodl rewards
    function claimHodlRewardsFor(address[] _beneficiaries) external {
        for (uint256 i = 0; i < _beneficiaries.length; i++)
            claimHodlRewardFor(_beneficiaries[i]);
    }
    /// @notice Setting 3 - 6 - 9 months total staking hodl value if time is come
    function updateAndGetHodlTotalValue() public returns (uint) {
        if (now >= hodlerTime3M && hodlerTotalValue3M == 0) {
            hodlerTotalValue3M = hodlerTotalValue;
        }
        if (now >= hodlerTime6M && hodlerTotalValue6M == 0) {
            hodlerTotalValue6M = hodlerTotalValue;
        }
        if (now >= hodlerTime9M && hodlerTotalValue9M == 0) {
            hodlerTotalValue9M = hodlerTotalValue;
            // since we can transfer more tokens to this contract, make it possible to retain more than the predefined limit
            TOKEN_HODL_9M = TokenController(owner).ethealToken().balanceOf(this).sub(TOKEN_HODL_3M).sub(TOKEN_HODL_6M).add(claimedTokens);
        }
        return hodlerTotalValue;
    }
}
/**
 * @title TokenVesting
 * @dev A token holder contract that can release its token balance gradually like a
 * typical vesting scheme, with a cliff and vesting period. Optionally revocable by the
 * owner.
 */
contract TokenVesting is Ownable {
  using SafeMath for uint256;
  event Released(uint256 amount);
  event Revoked();
  // beneficiary of tokens after they are released
  address public beneficiary;
  uint256 public cliff;
  uint256 public start;
  uint256 public duration;
  bool public revocable;
  mapping (address => uint256) public released;
  mapping (address => bool) public revoked;
  /**
   * @dev Creates a vesting contract that vests its balance of any ERC20 token to the
   * _beneficiary, gradually in a linear fashion until _start + _duration. By then all
   * of the balance will have vested.
   * @param _beneficiary address of the beneficiary to whom vested tokens are transferred
   * @param _cliff duration in seconds of the cliff in which tokens will begin to vest
   * @param _duration duration in seconds of the period in which the tokens will vest
   * @param _revocable whether the vesting is revocable or not
   */
  function TokenVesting(address _beneficiary, uint256 _start, uint256 _cliff, uint256 _duration, bool _revocable) {
    require(_beneficiary != address(0));
    require(_cliff <= _duration);
    beneficiary = _beneficiary;
    revocable = _revocable;
    duration = _duration;
    cliff = _start.add(_cliff);
    start = _start;
  }
  /**
   * @notice Transfers vested tokens to beneficiary.
   * @param token ERC20 token which is being vested
   */
  function release(ERC20MiniMe token) public {
    uint256 unreleased = releasableAmount(token);
    require(unreleased > 0);
    released[token] = released[token].add(unreleased);
    require(token.transfer(beneficiary, unreleased));
    Released(unreleased);
  }
  /**
   * @notice Allows the owner to revoke the vesting. Tokens already vested
   * remain in the contract, the rest are returned to the owner.
   * @param token ERC20MiniMe token which is being vested
   */
  function revoke(ERC20MiniMe token) public onlyOwner {
    require(revocable);
    require(!revoked[token]);
    uint256 balance = token.balanceOf(this);
    uint256 unreleased = releasableAmount(token);
    uint256 refund = balance.sub(unreleased);
    revoked[token] = true;
    require(token.transfer(owner, refund));
    Revoked();
  }
  /**
   * @dev Calculates the amount that has already vested but hasn't been released yet.
   * @param token ERC20MiniMe token which is being vested
   */
  function releasableAmount(ERC20MiniMe token) public view returns (uint256) {
    return vestedAmount(token).sub(released[token]);
  }
  /**
   * @dev Calculates the amount that has already vested.
   * @param token ERC20MiniMe token which is being vested
   */
  function vestedAmount(ERC20MiniMe token) public view returns (uint256) {
    uint256 currentBalance = token.balanceOf(this);
    uint256 totalBalance = currentBalance.add(released[token]);
    if (now < cliff) {
      return 0;
    } else if (now >= start.add(duration) || revoked[token]) {
      return totalBalance;
    } else {
      return totalBalance.mul(now.sub(start)).div(duration);
    }
  }
}
/**
 * @title claim accidentally sent tokens
 */
contract HasNoTokens is Ownable {
    event ExtractedTokens(address indexed _token, address indexed _claimer, uint _amount);
    /// @notice This method can be used to extract mistakenly
    ///  sent tokens to this contract.
    /// @param _token The address of the token contract that you want to recover
    ///  set to 0 in case you want to extract ether.
    /// @param _claimer Address that tokens will be send to
    function extractTokens(address _token, address _claimer) onlyOwner public {
        if (_token == 0x0) {
            _claimer.transfer(this.balance);
            return;
        }
        ERC20 token = ERC20(_token);
        uint balance = token.balanceOf(this);
        token.transfer(_claimer, balance);
        ExtractedTokens(_token, _claimer, balance);
    }
}
/**
 * @title EthealController
 * @author thesved
 * @notice Controller of the Etheal Token
 * @dev Crowdsale can be only replaced when no active crowdsale is running.
 *  The contract is paused by default. It has to be unpaused to enable token transfer.
 */
contract EthealController is Pausable, HasNoTokens, TokenController {
    using SafeMath for uint;
    // when migrating this contains the address of the new controller
    TokenController public newController;
    // token contract
    ERC20MiniMe public ethealToken;
    // distribution of tokens
    uint256 public constant ETHEAL_UNIT = 10**18;
    uint256 public constant THOUSAND = 10**3;
    uint256 public constant MILLION = 10**6;
    uint256 public constant TOKEN_SALE1_PRE = 9 * MILLION * ETHEAL_UNIT;
    uint256 public constant TOKEN_SALE1_NORMAL = 20 * MILLION * ETHEAL_UNIT;
    uint256 public constant TOKEN_SALE2 = 9 * MILLION * ETHEAL_UNIT;
    uint256 public constant TOKEN_SALE3 = 5 * MILLION * ETHEAL_UNIT;
    uint256 public constant TOKEN_HODL_3M = 1 * MILLION * ETHEAL_UNIT;
    uint256 public constant TOKEN_HODL_6M = 2 * MILLION * ETHEAL_UNIT;
    uint256 public constant TOKEN_HODL_9M = 7 * MILLION * ETHEAL_UNIT;
    uint256 public constant TOKEN_REFERRAL = 2 * MILLION * ETHEAL_UNIT;
    uint256 public constant TOKEN_BOUNTY = 1500 * THOUSAND * ETHEAL_UNIT;
    uint256 public constant TOKEN_COMMUNITY = 20 * MILLION * ETHEAL_UNIT;
    uint256 public constant TOKEN_TEAM = 14 * MILLION * ETHEAL_UNIT;
    uint256 public constant TOKEN_FOUNDERS = 6500 * THOUSAND * ETHEAL_UNIT;
    uint256 public constant TOKEN_INVESTORS = 3 * MILLION * ETHEAL_UNIT;
    // addresses only SALE will remain, the others will be real eth addresses
    address public SALE = 0X1;
    address public FOUNDER1 = 0x296dD2A2879fEBe2dF65f413999B28C053397fC5;
    address public FOUNDER2 = 0x0E2feF8e4125ed0f49eD43C94b2B001C373F74Bf;
    address public INVESTOR1 = 0xAAd27eD6c93d91aa60Dc827bE647e672d15e761A;
    address public INVESTOR2 = 0xb906665f4ef609189A31CE55e01C267EC6293Aa5;
    // addresses for multisig and crowdsale
    address public ethealMultisigWallet;
    Crowdsale public crowdsale;
    // hodler reward contract
    Hodler public hodlerReward;
    // token grants
    TokenVesting[] public tokenGrants;
    uint256 public constant VESTING_TEAM_CLIFF = 365 days;
    uint256 public constant VESTING_TEAM_DURATION = 4 * 365 days;
    uint256 public constant VESTING_ADVISOR_CLIFF = 3 * 30 days;
    uint256 public constant VESTING_ADVISOR_DURATION = 6 * 30 days;
    /// @dev only the crowdsale can call it
    modifier onlyCrowdsale() {
        require(msg.sender == address(crowdsale));
        _;
    }
    /// @dev only the crowdsale can call it
    modifier onlyEthealMultisig() {
        require(msg.sender == address(ethealMultisigWallet));
        _;
    }
    ////////////////
    // Constructor, overrides
    ////////////////
    /// @notice Constructor for Etheal Controller
    function EthealController(address _wallet) {
        require(_wallet != address(0));
        paused = true;
        ethealMultisigWallet = _wallet;
    }
    /// @dev overrides HasNoTokens#extractTokens to make it possible to extract any tokens after migration or before that any tokens except etheal
    function extractTokens(address _token, address _claimer) onlyOwner public {
        require(newController != address(0) || _token != address(ethealToken));
        super.extractTokens(_token, _claimer);
    }
    ////////////////
    // Manage crowdsale
    ////////////////
    /// @notice Set crowdsale address and transfer HEAL tokens from ethealController's SALE address
    /// @dev Crowdsale can be only set when the current crowdsale is not active and ethealToken is set
    function setCrowdsaleTransfer(address _sale, uint256 _amount) public onlyOwner {
        require (_sale != address(0) && !isCrowdsaleOpen() && address(ethealToken) != address(0));
        crowdsale = Crowdsale(_sale);
        // transfer HEAL tokens to crowdsale account from the account of controller
        require(ethealToken.transferFrom(SALE, _sale, _amount));
    }
    /// @notice Is there a not ended crowdsale?
    /// @return true if there is no crowdsale or the current crowdsale is not yet ended but started
    function isCrowdsaleOpen() public view returns (bool) {
        return address(crowdsale) != address(0) && !crowdsale.hasEnded() && crowdsale.hasStarted();
    }
    ////////////////
    // Manage grants
    ////////////////
    /// @notice Grant vesting token to an address
    function createGrant(address _beneficiary, uint256 _start, uint256 _amount, bool _revocable, bool _advisor) public onlyOwner {
        require(_beneficiary != address(0) && _amount > 0 && _start >= now);
        // create token grant
        if (_advisor) {
            tokenGrants.push(new TokenVesting(_beneficiary, _start, VESTING_ADVISOR_CLIFF, VESTING_ADVISOR_DURATION, _revocable));
        } else {
            tokenGrants.push(new TokenVesting(_beneficiary, _start, VESTING_TEAM_CLIFF, VESTING_TEAM_DURATION, _revocable));
        }
        // transfer funds to the grant
        transferToGrant(tokenGrants.length.sub(1), _amount);
    }
    /// @notice Transfer tokens to a grant until it is starting
    function transferToGrant(uint256 _id, uint256 _amount) public onlyOwner {
        require(_id < tokenGrants.length && _amount > 0 && now <= tokenGrants[_id].start());
        // transfer funds to the grant
        require(ethealToken.transfer(address(tokenGrants[_id]), _amount));
    }
    /// @dev Revoking grant
    function revokeGrant(uint256 _id) public onlyOwner {
        require(_id < tokenGrants.length);
        tokenGrants[_id].revoke(ethealToken);
    }
    /// @notice Returns the token grant count
    function getGrantCount() view public returns (uint) {
        return tokenGrants.length;
    }
    ////////////////
    // BURN, handle ownership - only multsig can call these functions!
    ////////////////
    /// @notice contract can burn its own or its sale tokens
    function burn(address _where, uint256 _amount) public onlyEthealMultisig {
        require(_where == address(this) || _where == SALE);
        require(ethealToken.destroyTokens(_where, _amount));
    }
    /// @notice replaces controller when it was not yet replaced, only multisig can do it
    function setNewController(address _controller) public onlyEthealMultisig {
        require(_controller != address(0) && newController == address(0));
        newController = TokenController(_controller);
        ethealToken.changeController(_controller);
        hodlerReward.transferOwnership(_controller);
        // send eth
        uint256 _stake = this.balance;
        if (_stake > 0) {
            _controller.transfer(_stake);
        }
        // send tokens
        _stake = ethealToken.balanceOf(this);
        if (_stake > 0) {
            ethealToken.transfer(_controller, _stake);
        }
    }
    /// @notice Set new multisig wallet, to make it upgradable.
    function setNewMultisig(address _wallet) public onlyEthealMultisig {
        require(_wallet != address(0));
        ethealMultisigWallet = _wallet;
    }
    ////////////////
    // When PAUSED
    ////////////////
    /// @notice set the token, if no hodler provided then creates a hodler reward contract
    function setEthealToken(address _token, address _hodler) public onlyOwner whenPaused {
        require(_token != address(0));
        ethealToken = ERC20MiniMe(_token);
        
        if (_hodler != address(0)) {
            // set hodler reward contract if provided
            hodlerReward = Hodler(_hodler);
        } else if (hodlerReward == address(0)) {
            // create hodler reward contract if not yet created
            hodlerReward = new Hodler(TOKEN_HODL_3M, TOKEN_HODL_6M, TOKEN_HODL_9M);
        }
        // MINT tokens if not minted yet
        if (ethealToken.totalSupply() == 0) {
            // sale
            ethealToken.generateTokens(SALE, TOKEN_SALE1_PRE.add(TOKEN_SALE1_NORMAL).add(TOKEN_SALE2).add(TOKEN_SALE3));
            // hodler reward
            ethealToken.generateTokens(address(hodlerReward), TOKEN_HODL_3M.add(TOKEN_HODL_6M).add(TOKEN_HODL_9M));
            // bounty + referral
            ethealToken.generateTokens(owner, TOKEN_BOUNTY.add(TOKEN_REFERRAL));
            // community fund
            ethealToken.generateTokens(address(ethealMultisigWallet), TOKEN_COMMUNITY);
            // team -> grantable
            ethealToken.generateTokens(address(this), TOKEN_FOUNDERS.add(TOKEN_TEAM));
            // investors
            ethealToken.generateTokens(INVESTOR1, TOKEN_INVESTORS.div(3).mul(2));
            ethealToken.generateTokens(INVESTOR2, TOKEN_INVESTORS.div(3));
        }
    }
    ////////////////
    // Proxy for Hodler contract
    ////////////////
    
    /// @notice Proxy call for setting hodler start time
    function setHodlerTime(uint256 _time) public onlyCrowdsale {
        hodlerReward.setHodlerTime(_time);
    }
    /// @notice Proxy call for adding hodler stake
    function addHodlerStake(address _beneficiary, uint256 _stake) public onlyCrowdsale {
        hodlerReward.addHodlerStake(_beneficiary, _stake);
    }
    /// @notice Proxy call for setting hodler stake
    function setHodlerStake(address _beneficiary, uint256 _stake) public onlyCrowdsale {
        hodlerReward.setHodlerStake(_beneficiary, _stake);
    }
    ////////////////
    // MiniMe Controller functions
    ////////////////
    /// @notice No eth payment to the token contract
    function proxyPayment(address _owner) payable public returns (bool) {
        revert();
    }
    /// @notice Before transfers are enabled for everyone, only this and the crowdsale contract is allowed to distribute HEAL
    function onTransfer(address _from, address _to, uint256 _amount) public returns (bool) {
        // moving any funds makes hodl participation invalid
        hodlerReward.invalidate(_from);
        return !paused || _from == address(this) || _to == address(this) || _from == address(crowdsale) || _to == address(crowdsale);
    }
    function onApprove(address _owner, address _spender, uint256 _amount) public returns (bool) {
        return !paused;
    }
    /// @notice Retrieve mistakenly sent tokens (other than the etheal token) from the token contract 
    function claimTokenTokens(address _token) public onlyOwner {
        require(_token != address(ethealToken));
        ethealToken.claimTokens(_token);
    }
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[{"name":"_beneficiary","type":"address"},{"name":"_stake","type":"uint256"}],"name":"setHodlerStake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_SALE1_PRE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ethealToken","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_HODL_6M","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_SALE2","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"uint256"}],"name":"revokeGrant","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"hodlerReward","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_HODL_9M","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_BOUNTY","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_hodler","type":"address"}],"name":"setEthealToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"MILLION","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_beneficiary","type":"address"},{"name":"_start","type":"uint256"},{"name":"_amount","type":"uint256"},{"name":"_revocable","type":"bool"},{"name":"_advisor","type":"bool"}],"name":"createGrant","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"newController","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"VESTING_ADVISOR_DURATION","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"onTransfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"VESTING_ADVISOR_CLIFF","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"SALE","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"VESTING_TEAM_CLIFF","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_controller","type":"address"}],"name":"setNewController","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isCrowdsaleOpen","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_FOUNDERS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"tokenGrants","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_REFERRAL","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_SALE1_NORMAL","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getGrantCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ethealMultisigWallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"THOUSAND","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_TEAM","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ETHEAL_UNIT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_beneficiary","type":"address"},{"name":"_stake","type":"uint256"}],"name":"addHodlerStake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"crowdsale","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_where","type":"address"},{"name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"uint256"},{"name":"_amount","type":"uint256"}],"name":"transferToGrant","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"FOUNDER2","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_SALE3","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"}],"name":"setNewMultisig","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_time","type":"uint256"}],"name":"setHodlerTime","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"VESTING_TEAM_DURATION","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_INVESTORS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"}],"name":"claimTokenTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"INVESTOR2","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_COMMUNITY","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_sale","type":"address"},{"name":"_amount","type":"uint256"}],"name":"setCrowdsaleTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"FOUNDER1","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"},{"name":"_amount","type":"uint256"}],"name":"onApprove","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_claimer","type":"address"}],"name":"extractTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"}],"name":"proxyPayment","outputs":[{"name":"","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"INVESTOR1","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_HODL_3M","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_wallet","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_token","type":"address"},{"indexed":true,"name":"_claimer","type":"address"},{"indexed":false,"name":"_amount","type":"uint256"}],"name":"ExtractedTokens","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

60606040526000805460a060020a60ff021916905560058054600160a060020a031990811660011790915560068054821673296dd2a2879febe2df65f413999b28c053397fc5179055600780548216730e2fef8e4125ed0f49ed43c94b2b001c373f74bf17905560088054821673aad27ed6c93d91aa60dc827be647e672d15e761a1790556009805490911673b906665f4ef609189a31ce55e01c267ec6293aa517905534156100ae57600080fd5b604051602080613b668339810160405280805160008054600160a060020a03191633600160a060020a03908116919091179091559092508216151590506100f457600080fd5b6000805460a060020a60ff02191674010000000000000000000000000000000000000000179055600a8054600160a060020a03909216600160a060020a0319909216919091179055613a1b8061014b6000396000f300606060405260043610620002a45763ffffffff60e060020a600035041662346b578114620002a95780630224dc1814620002d057806303d756cb14620002f857806304c80c3c146200032a5780631b8b478714620002d05780631d33267a14620003405780631f816c6d146200035957806328262dd1146200036f578063299c55f714620003855780632f5c5a08146200039b57806332bc934c14620003c357806332f402c514620003d95780633a02263c146200040b5780633f4ba83a1462000421578063471b37cf14620004375780634a393149146200044d5780634bc1aa42146200048c5780634db08aea14620004a257806356c2c1f614620004b857806359baef4014620004ce5780635a3320ff14620004f05780635c975abb146200050657806363302789146200051c5780636fc559bb146200053257806372f4f5f9146200032a5780637a4690fb146200054b5780637c1b6afe14620005615780638059e80414620005775780638456cb59146200058d578063851cad9014620005a35780638cac193914620005b95780638da5cb5b14620005cf5780638f382a0014620005e557806393a378da14620005fb5780639c1e03a014620006205780639dc29fac14620006365780639f95de64146200065b578063a804903a1462000677578063ac60da79146200068d578063aebb254014620006a3578063b0e9a1ef14620006c5578063b2cb0a3d14620006de578063b3922c4214620006f4578063b5c7b1fe146200070a578063b8a4b858146200072c578063bd1fac00146200054b578063ca94452d1462000742578063d16c4cf51462000767578063da682aeb146200077d578063ed6b2d7d14620007a8578063f2fde38b14620007d0578063f48c305414620007f2578063f5459d6b1462000808578063fbd7d081146200081e575b600080fd5b3415620002b557600080fd5b620002ce600160a060020a036004351660243562000834565b005b3415620002dc57600080fd5b620002e6620008bf565b60405190815260200160405180910390f35b34156200030457600080fd5b6200030e620008ce565b604051600160a060020a03909116815260200160405180910390f35b34156200033657600080fd5b620002e6620008dd565b34156200034c57600080fd5b620002ce600435620008ec565b34156200036557600080fd5b6200030e6200099f565b34156200037b57600080fd5b620002e6620009ae565b34156200039157600080fd5b620002e6620009bd565b3415620003a757600080fd5b620002ce600160a060020a0360043581169060243516620009cc565b3415620003cf57600080fd5b620002e662001011565b3415620003e557600080fd5b620002ce600160a060020a03600435166024356044356064351515608435151562001018565b34156200041757600080fd5b6200030e620011de565b34156200042d57600080fd5b620002ce620011ed565b34156200044357600080fd5b620002e66200126e565b34156200045957600080fd5b62000478600160a060020a036004358116906024351660443562001275565b604051901515815260200160405180910390f35b34156200049857600080fd5b620002e662001361565b3415620004ae57600080fd5b6200030e62001368565b3415620004c457600080fd5b620002e662001377565b3415620004da57600080fd5b620002ce600160a060020a03600435166200137f565b3415620004fc57600080fd5b62000478620015db565b34156200051257600080fd5b62000478620016cf565b34156200052857600080fd5b620002e6620016df565b34156200053e57600080fd5b6200030e600435620016ee565b34156200055757600080fd5b620002e662001717565b34156200056d57600080fd5b620002e662001726565b34156200058357600080fd5b6200030e6200172c565b34156200059957600080fd5b620002ce6200173b565b3415620005af57600080fd5b620002e6620017c1565b3415620005c557600080fd5b620002e6620017c7565b3415620005db57600080fd5b6200030e620017d6565b3415620005f157600080fd5b620002e6620017e5565b34156200060757600080fd5b620002ce600160a060020a0360043516602435620017f1565b34156200062c57600080fd5b6200030e62001864565b34156200064257600080fd5b620002ce600160a060020a036004351660243562001873565b34156200066757600080fd5b620002ce60043560243562001951565b34156200068357600080fd5b6200030e62001a9a565b34156200069957600080fd5b620002e662001aa9565b3415620006af57600080fd5b620002ce600160a060020a036004351662001ab8565b3415620006d157600080fd5b620002ce60043562001b0c565b3415620006ea57600080fd5b620002e662001b71565b34156200070057600080fd5b620002e662001b79565b34156200071657600080fd5b620002ce600160a060020a036004351662001b88565b34156200073857600080fd5b6200030e62001c11565b34156200074e57600080fd5b620002ce600160a060020a036004351660243562001c20565b34156200077357600080fd5b6200030e62001d0b565b34156200078957600080fd5b62000478600160a060020a036004358116906024351660443562001d1a565b3415620007b457600080fd5b620002ce600160a060020a036004358116906024351662001d2f565b3415620007dc57600080fd5b620002ce600160a060020a036004351662001d8b565b62000478600160a060020a036004351662001e1b565b34156200081457600080fd5b6200030e62001e22565b34156200082a57600080fd5b620002e662001e31565b600b5433600160a060020a039081169116146200085057600080fd5b600c54600160a060020a031662346b57838360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1515620008a657600080fd5b6102c65a03f11515620008b857600080fd5b5050505050565b6a0771d2fa45345aa900000081565b600454600160a060020a031681565b6a01a784379d99db4200000081565b60005433600160a060020a039081169116146200090857600080fd5b600d5481106200091757600080fd5b600d8054829081106200092657fe5b600091825260209091200154600454600160a060020a03918216916374a8f103911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156200098757600080fd5b6102c65a03f115156200099957600080fd5b50505050565b600c54600160a060020a031681565b6a05ca4ec2a79a7f6700000081565b6a013da329b633647180000081565b60005433600160a060020a03908116911614620009e857600080fd5b60005460a060020a900460ff16151562000a0157600080fd5b600160a060020a038216151562000a1757600080fd5b60048054600160a060020a031916600160a060020a038481169190911790915581161562000a6057600c8054600160a060020a031916600160a060020a03831617905562000af0565b600c54600160a060020a0316151562000af05769d3c21bcecceda10000006a01a784379d99db420000006a05ca4ec2a79a7f6700000062000aa06200205c565b808481526020018381526020018281526020019350505050604051809103906000f080151562000acf57600080fd5b600c8054600160a060020a031916600160a060020a03929092169190911790555b600454600160a060020a03166318160ddd6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562000b3957600080fd5b6102c65a03f1151562000b4b57600080fd5b5050506040518051151590506200100d57600454600554600160a060020a039182169163827f32c0911662000bbc6a0422ca8b0a00a42500000062000baf6a0771d2fa45345aa900000081816a108b2a2c2802909400000063ffffffff62001e3f16565b9063ffffffff62001e3f16565b60006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151562000c0957600080fd5b6102c65a03f1151562000c1b57600080fd5b50505060405180515050600454600c54600160a060020a039182169163827f32c0911662000c756a05ca4ec2a79a7f6700000062000baf69d3c21bcecceda10000006a01a784379d99db4200000063ffffffff62001e3f16565b60006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151562000cc257600080fd5b6102c65a03f1151562000cd457600080fd5b50505060405180515050600454600054600160a060020a039182169163827f32c0911662000d1f6a013da329b63364718000006a01a784379d99db4200000063ffffffff62001e3f16565b60006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151562000d6c57600080fd5b6102c65a03f1151562000d7e57600080fd5b50505060405180515050600454600a54600160a060020a039182169163827f32c091166a108b2a2c2802909400000060006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151562000dfa57600080fd5b6102c65a03f1151562000e0c57600080fd5b50505060405180515050600454600160a060020a031663827f32c03062000e506a05606db4c03408968000006a0b949d854f34fece00000063ffffffff62001e3f16565b60006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151562000e9d57600080fd5b6102c65a03f1151562000eaf57600080fd5b50505060405180515050600454600854600160a060020a039182169163827f32c0911662000f03600262000ef66a027b46536c66c8e3000000600363ffffffff62001e5616565b9063ffffffff62001e6e16565b60006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151562000f5057600080fd5b6102c65a03f1151562000f6257600080fd5b50505060405180515050600454600954600160a060020a039182169163827f32c0911662000fa36a027b46536c66c8e3000000600363ffffffff62001e5616565b60006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151562000ff057600080fd5b6102c65a03f115156200100257600080fd5b505050604051805150505b5050565b620f424081565b60005433600160a060020a039081169116146200103457600080fd5b600160a060020a038516158015906200104d5750600083115b80156200105a5750428410155b15156200106657600080fd5b80156200111657600d8054600181016200108183826200206d565b9160005260206000209001600087876276a70062ed4e0088620010a362002099565b600160a060020a03909516855260208501939093526040808501929092526060840152901515608083015260a09091019051809103906000f0801515620010e957600080fd5b909190916101000a815481600160a060020a030219169083600160a060020a0316021790555050620011bc565b600d8054600181016200112a83826200206d565b9160005260206000209001600087876301e13380630784ce00886200114e62002099565b600160a060020a03909516855260208501939093526040808501929092526060840152901515608083015260a09091019051809103906000f08015156200119457600080fd5b909190916101000a815481600160a060020a030219169083600160a060020a03160217905550505b600d54620008b890620011d790600163ffffffff62001e9516565b8462001951565b600354600160a060020a031681565b60005433600160a060020a039081169116146200120957600080fd5b60005460a060020a900460ff1615156200122257600080fd5b6000805474ff0000000000000000000000000000000000000000191690557f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b62ed4e0081565b600c54600090600160a060020a03166337a3931f8560405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b1515620012c957600080fd5b6102c65a03f11515620012db57600080fd5b505060005460a060020a900460ff16159050806200130a575030600160a060020a031684600160a060020a0316145b8062001327575030600160a060020a031683600160a060020a0316145b80620013405750600b54600160a060020a038581169116145b80620013595750600b54600160a060020a038481169116145b949350505050565b6276a70081565b600554600160a060020a031681565b6301e1338081565b600a5460009033600160a060020a039081169116146200139e57600080fd5b600160a060020a03821615801590620013c05750600354600160a060020a0316155b1515620013cc57600080fd5b60038054600160a060020a031916600160a060020a038481169190911790915560045416633cebb8238360405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156200143557600080fd5b6102c65a03f115156200144757600080fd5b5050600c54600160a060020a0316905063f2fde38b8360405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156200149c57600080fd5b6102c65a03f11515620014ae57600080fd5b50505030600160a060020a03163190506000811115620014fa57600160a060020a03821681156108fc0282604051600060405180830381858888f193505050501515620014fa57600080fd5b600454600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156200155457600080fd5b6102c65a03f115156200156657600080fd5b505050604051805191505060008111156200100d57600454600160a060020a031663a9059cbb838360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151562000ff057600080fd5b600b54600090600160a060020a0316158015906200165b5750600b54600160a060020a031663ecb70fb76000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200163d57600080fd5b6102c65a03f115156200164f57600080fd5b50505060405180519050155b8015620016c95750600b54600160a060020a03166344691f7e6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620016ac57600080fd5b6102c65a03f11515620016be57600080fd5b505050604051805190505b90505b90565b60005460a060020a900460ff1681565b6a05606db4c034089680000081565b600d805482908110620016fd57fe5b600091825260209091200154600160a060020a0316905081565b6a108b2a2c2802909400000081565b600d5490565b600a54600160a060020a031681565b60005433600160a060020a039081169116146200175757600080fd5b60005460a060020a900460ff16156200176f57600080fd5b6000805474ff0000000000000000000000000000000000000000191660a060020a1790557f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6103e881565b6a0b949d854f34fece00000081565b600054600160a060020a031681565b670de0b6b3a764000081565b600b5433600160a060020a039081169116146200180d57600080fd5b600c54600160a060020a03166393a378da838360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1515620008a657600080fd5b600b54600160a060020a031681565b600a5433600160a060020a039081169116146200188f57600080fd5b30600160a060020a031682600160a060020a03161480620018bd5750600554600160a060020a038381169116145b1515620018c957600080fd5b600454600160a060020a031663d3ce77fe838360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156200192957600080fd5b6102c65a03f115156200193b57600080fd5b5050506040518051905015156200100d57600080fd5b60005433600160a060020a039081169116146200196d57600080fd5b600d54821080156200197f5750600081115b801562001a075750600d8054839081106200199657fe5b6000918252602082200154600160a060020a03169063be9a655590604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620019e757600080fd5b6102c65a03f11515620019f957600080fd5b505050604051805190504211155b151562001a1357600080fd5b600454600d8054600160a060020a039092169163a9059cbb91908590811062001a3857fe5b6000918252602082200154600160a060020a03169084906040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156200192957600080fd5b600754600160a060020a031681565b6a0422ca8b0a00a42500000081565b600a5433600160a060020a0390811691161462001ad457600080fd5b600160a060020a038116151562001aea57600080fd5b600a8054600160a060020a031916600160a060020a0392909216919091179055565b600b5433600160a060020a0390811691161462001b2857600080fd5b600c54600160a060020a031663b0e9a1ef8260405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b15156200098757600080fd5b630784ce0081565b6a027b46536c66c8e300000081565b60005433600160a060020a0390811691161462001ba457600080fd5b600454600160a060020a038281169116141562001bc057600080fd5b600454600160a060020a031663df8de3e78260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156200098757600080fd5b600954600160a060020a031681565b60005433600160a060020a0390811691161462001c3c57600080fd5b600160a060020a0382161580159062001c5c575062001c5a620015db565b155b801562001c735750600454600160a060020a031615155b151562001c7f57600080fd5b600b8054600160a060020a031916600160a060020a0384811691909117909155600454600554908216916323b872dd9116848460006040516020015260405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b15156200192957600080fd5b600654600160a060020a031681565b505060005460a060020a900460ff1615919050565b60005433600160a060020a0390811691161462001d4b57600080fd5b600354600160a060020a031615158062001d735750600454600160a060020a03838116911614155b151562001d7f57600080fd5b6200100d828262001ea8565b60005433600160a060020a0390811691161462001da757600080fd5b600160a060020a038116151562001dbd57600080fd5b600054600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008054600160a060020a031916600160a060020a0392909216919091179055565b6000806000fd5b600854600160a060020a031681565b69d3c21bcecceda100000081565b60008282018381101562001e4f57fe5b9392505050565b600080828481151562001e6557fe5b04949350505050565b600082820283158062001e8c575082848281151562001e8957fe5b04145b151562001e4f57fe5b60008282111562001ea257fe5b50900390565b60008054819033600160a060020a0390811691161462001ec757600080fd5b600160a060020a038416151562001f1c5782600160a060020a03166108fc30600160a060020a0316319081150290604051600060405180830381858888f19350505050151562001f1657600080fd5b62000999565b83915081600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151562001f7757600080fd5b6102c65a03f1151562001f8957600080fd5b5050506040518051915050600160a060020a03821663a9059cbb848360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151562001ff257600080fd5b6102c65a03f115156200200457600080fd5b505050604051805190505082600160a060020a031684600160a060020a03167f21e9b296e283cad208b551b3c383bb74e34086eb5691fee8392dcce6794521c28360405190815260200160405180910390a350505050565b60405161101580620020cc83390190565b815481835581811511620020945760008381526020902062002094918101908301620020aa565b505050565b60405161090f80620030e183390190565b620016cc91905b80821115620020c75760008155600101620020b1565b509056006060604052341561000f57600080fd5b60405160608061101583398101604052808051919060200180519190602001805160008054600160a060020a033316600160a060020a0319909116179055600b949094555050600c55600d55610fab8061006a6000396000f3006060604052600436106101235763ffffffff60e060020a600035041662346b57811461012857806304c80c3c1461014c5780630d92e3e8146101715780630eb6f5431461018457806326c43d8f1461019757806328262dd1146101aa57806337a3931f146101bd57806342ef4c1a146101dc5780634a48314f146101ef5780634b86faba14610202578063685a73e0146102155780638da5cb5b1461023357806391e79c721461026257806393a378da14610275578063b0e9a1ef14610297578063b40d8d58146102ad578063be2b1047146102c0578063c899fa77146102d3578063d228cfc5146102e6578063d43a0b4c14610305578063d6192c6c14610318578063e2c208361461036e578063f2fde38b14610381578063fbd7d081146103a0575b600080fd5b341561013357600080fd5b61014a600160a060020a03600435166024356103b3565b005b341561015757600080fd5b61015f6105cc565b60405190815260200160405180910390f35b341561017c57600080fd5b61015f6105d2565b341561018f57600080fd5b61015f6105d8565b34156101a257600080fd5b61015f6105de565b34156101b557600080fd5b61015f6105e4565b34156101c857600080fd5b61014a600160a060020a03600435166105ea565b34156101e757600080fd5b61015f6106b1565b34156101fa57600080fd5b61015f6106b7565b341561020d57600080fd5b61014a6106bd565b341561022057600080fd5b61014a60048035602481019101356106c8565b341561023e57600080fd5b6102466106ff565b604051600160a060020a03909116815260200160405180910390f35b341561026d57600080fd5b61015f61070e565b341561028057600080fd5b61014a600160a060020a0360043516602435610714565b34156102a257600080fd5b61014a600435610848565b34156102b857600080fd5b61015f61090f565b34156102cb57600080fd5b61015f610915565b34156102de57600080fd5b61015f61091b565b34156102f157600080fd5b61014a600160a060020a0360043516610921565b341561031057600080fd5b61015f610cc6565b341561032357600080fd5b610337600160a060020a0360043516610ccc565b60405194855292151560208501529015156040808501919091529015156060840152901515608083015260a0909101905180910390f35b341561037957600080fd5b61015f610d04565b341561038c57600080fd5b61014a600160a060020a0360043516610e7b565b34156103ab57600080fd5b61015f610f16565b6000805433600160a060020a039081169116146103cf57600080fd5b60075415806103e057506007544211155b156105c757600160a060020a0383166000908152600160205260409020548214806104125750600160a060020a038316155b1561041c576105c7565b600160a060020a0383166000908152600160205260409020541580156104425750600082115b156104635760035461045b90600163ffffffff610f1c16565b6003556104a4565b600160a060020a038316600090815260016020526040812054118015610487575081155b156104a4576003546104a090600163ffffffff610f3216565b6003555b600160a060020a03831660009081526001602052604090205482116104f157600160a060020a0383166000908152600160205260409020546104ec908363ffffffff610f3216565b61051b565b600160a060020a03831660009081526001602052604090205461051b90839063ffffffff610f3216565b600160a060020a03841660009081526001602052604090205490915082111561055957600254610551908263ffffffff610f1c16565b600255610570565b60025461056c908263ffffffff610f3216565b6002555b600160a060020a038084166000818152600160205260409081902085905590913316907f531b6d98182f354ef73d680007a0fa84a81fa4a320e289e4f826150ad104fb1a9085905190815260200160405180910390a35b505050565b600c5481565b600e5481565b60055481565b60035481565b600d5481565b60005433600160a060020a0390811691161461060557600080fd5b600160a060020a0381166000908152600160205260408120541180156106485750600160a060020a0381166000908152600160208190526040909120015460ff16155b156106a557600160a060020a0381166000908152600160208190526040909120808201805460ff19169092179091555460025461068a9163ffffffff610f3216565b6002556003546106a190600163ffffffff610f3216565b6003555b6106ad610d04565b5050565b60095481565b60085481565b6106c633610921565b565b60005b818110156105c7576106f78383838181106106e257fe5b90506020020135600160a060020a0316610921565b6001016106cb565b600054600160a060020a031681565b60025481565b60005433600160a060020a0390811691161461072f57600080fd5b600754158061074057506007544211155b156106ad578015806107595750600160a060020a038216155b15610763576106ad565b600160a060020a038216600090815260016020526040902054151561079a5760035461079690600163ffffffff610f1c16565b6003555b600160a060020a0382166000908152600160205260409020546107c3908263ffffffff610f1c16565b600160a060020a0383166000908152600160205260409020556002546107ef908263ffffffff610f1c16565b600255600160a060020a03808316600081815260016020526040908190205491923316917f531b6d98182f354ef73d680007a0fa84a81fa4a320e289e4f826150ad104fb1a915190815260200160405180910390a35050565b60005433600160a060020a0390811691161461086357600080fd5b600754158061087457506007544211155b1561090c574281101561088657600080fd5b600781905561089e816276a70063ffffffff610f1c16565b6008556108b48162ed4e0063ffffffff610f1c16565b6009556108cb81630163f50063ffffffff610f1c16565b600a55600160a060020a0333167fc7ad31b0c99a40aa43822fbc49a68cf7f3eb3d52152a5c01a7f636e4481cf43f8260405190815260200160405180910390a25b50565b600a5481565b60075481565b60045481565b600160a060020a03811660009081526001602052604081205481901180156109665750600160a060020a0382166000908152600160208190526040909120015460ff16155b151561097157600080fd5b50600061097c610d04565b50600160a060020a03821660009081526001602081905260409091200154610100900460ff161580156109b157506008544210155b15610a3357600454600b54600160a060020a038416600090815260016020526040902054610a07926109fa9290916109ee9163ffffffff610f4416565b9063ffffffff610f6816565b829063ffffffff610f1c16565b600160a060020a038316600090815260016020819052604090912001805461ff00191661010017905590505b600160a060020a0382166000908152600160208190526040909120015462010000900460ff16158015610a6857506009544210155b15610ad357600554600c54600160a060020a038416600090815260016020526040902054610aa5926109fa9290916109ee9163ffffffff610f4416565b600160a060020a038316600090815260016020819052604090912001805462ff000019166201000017905590505b600160a060020a038216600090815260016020819052604090912001546301000000900460ff16158015610b095750600a544210155b15610b7657600654600d54600160a060020a038416600090815260016020526040902054610b46926109fa9290916109ee9163ffffffff610f4416565b600160a060020a038316600090815260016020819052604090912001805463ff0000001916630100000017905590505b60008111156106ad57600e54610b92908263ffffffff610f1c16565b600e5560008054600160a060020a0316906303d756cb90604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610bde57600080fd5b6102c65a03f11515610bef57600080fd5b50505060405180519050600160a060020a031663a9059cbb838360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610c5557600080fd5b6102c65a03f11515610c6657600080fd5b505050604051805190501515610c7b57600080fd5b81600160a060020a031633600160a060020a03167fd06980f1b54006ca63e8ddd2f4dafe76e8bcd6e7d7f333296f778781626af4268360405190815260200160405180910390a35050565b60065481565b6001602081905260009182526040909120805491015460ff808216916101008104821691620100008204811691630100000090041685565b60006008544210158015610d185750600454155b15610d24576002546004555b6009544210158015610d365750600554155b15610d42576002546005555b600a544210158015610d545750600654155b15610e7457600254600655600e54600c54600b5460008054610e709493610e64939092610e5892600160a060020a0316906303d756cb90604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610dc057600080fd5b6102c65a03f11515610dd157600080fd5b50505060405180519050600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515610e3157600080fd5b6102c65a03f11515610e4257600080fd5b505050604051805191905063ffffffff610f3216565b9063ffffffff610f3216565b9063ffffffff610f1c16565b600d555b5060025490565b60005433600160a060020a03908116911614610e9657600080fd5b600160a060020a0381161515610eab57600080fd5b600054600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600b5481565b600082820183811015610f2b57fe5b9392505050565b600082821115610f3e57fe5b50900390565b6000828202831580610f605750828482811515610f5d57fe5b04145b1515610f2b57fe5b6000808284811515610f7657fe5b049493505050505600a165627a7a72305820b13878352c4505507a0469068cef25077583c2b2fd96737ede4cf449af3c69b800296060604052341561000f57600080fd5b60405160a08061090f833981016040528080519190602001805191906020018051919060200180519190602001805160008054600160a060020a03191633600160a060020a039081169190911790915590925086161515905061007157600080fd5b8183111561007e57600080fd5b60018054600160a060020a031916600160a060020a0387161790556005805460ff191682151517905560048290556100c384846401000000006100d2810261079b1704565b600255505050600355506100e8565b6000828201838110156100e157fe5b9392505050565b610818806100f76000396000f3006060604052600436106100ab5763ffffffff60e060020a6000350416630fb5a6b481146100b057806313d033c0146100d55780631726cbc8146100e85780631916558714610107578063384711cc1461012857806338af3eed1461014757806374a8f10314610176578063872a7810146101955780638da5cb5b146101bc5780639852595c146101cf578063be9a6555146101ee578063f2fde38b14610201578063fa01dc0614610220575b600080fd5b34156100bb57600080fd5b6100c361023f565b60405190815260200160405180910390f35b34156100e057600080fd5b6100c3610245565b34156100f357600080fd5b6100c3600160a060020a036004351661024b565b341561011257600080fd5b610126600160a060020a0360043516610283565b005b341561013357600080fd5b6100c3600160a060020a036004351661039c565b341561015257600080fd5b61015a6104dd565b604051600160a060020a03909116815260200160405180910390f35b341561018157600080fd5b610126600160a060020a03600435166104ec565b34156101a057600080fd5b6101a86106a9565b604051901515815260200160405180910390f35b34156101c757600080fd5b61015a6106b2565b34156101da57600080fd5b6100c3600160a060020a03600435166106c1565b34156101f957600080fd5b6100c36106d3565b341561020c57600080fd5b610126600160a060020a03600435166106d9565b341561022b57600080fd5b6101a8600160a060020a0360043516610774565b60045481565b60025481565b600160a060020a03811660009081526006602052604081205461027d906102718461039c565b9063ffffffff61078916565b92915050565b600061028e8261024b565b90506000811161029d57600080fd5b600160a060020a0382166000908152600660205260409020546102c6908263ffffffff61079b16565b600160a060020a0380841660008181526006602052604080822094909455600154919363a9059cbb939290921691859190516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561033f57600080fd5b6102c65a03f1151561035057600080fd5b50505060405180519050151561036557600080fd5b7ffb81f9b30d73d830c3544b34d827c08142579ee75710b490bab0b3995468c5658160405190815260200160405180910390a15050565b600080600083600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156103f857600080fd5b6102c65a03f1151561040957600080fd5b5050506040518051600160a060020a03861660009081526006602052604090205490935061043f9150839063ffffffff61079b16565b905060025442101561045457600092506104d6565b6004546003546104699163ffffffff61079b16565b4210158061048f5750600160a060020a03841660009081526007602052604090205460ff165b1561049c578092506104d6565b6104d36004546104c76104ba6003544261078990919063ffffffff16565b849063ffffffff6107b116565b9063ffffffff6107d516565b92505b5050919050565b600154600160a060020a031681565b600080548190819033600160a060020a0390811691161461050c57600080fd5b60055460ff16151561051d57600080fd5b600160a060020a03841660009081526007602052604090205460ff161561054357600080fd5b83600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561059a57600080fd5b6102c65a03f115156105ab57600080fd5b5050506040518051905092506105c08461024b565b91506105d2838363ffffffff61078916565b600160a060020a03808616600081815260076020526040808220805460ff191660011790558154949550919363a9059cbb931691859190516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561065157600080fd5b6102c65a03f1151561066257600080fd5b50505060405180519050151561067757600080fd5b7f44825a4b2df8acb19ce4e1afba9aa850c8b65cdb7942e2078f27d0b0960efee660405160405180910390a150505050565b60055460ff1681565b600054600160a060020a031681565b60066020526000908152604090205481565b60035481565b60005433600160a060020a039081169116146106f457600080fd5b600160a060020a038116151561070957600080fd5b600054600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60076020526000908152604090205460ff1681565b60008282111561079557fe5b50900390565b6000828201838110156107aa57fe5b9392505050565b60008282028315806107cd57508284828115156107ca57fe5b04145b15156107aa57fe5b60008082848115156107e357fe5b049493505050505600a165627a7a7230582009649e1f374e51bd346858160f9ce8785feb3bfeb10e4f09b72214fac4485c0e0029a165627a7a7230582092a1f27c76560e9a5c435886caece0a86173198ab75681be3e0196811ebb45d30029000000000000000000000000fc5c6c8015962e7035f3bdc5fe7ec94bedc77833

Deployed Bytecode

0x606060405260043610620002a45763ffffffff60e060020a600035041662346b578114620002a95780630224dc1814620002d057806303d756cb14620002f857806304c80c3c146200032a5780631b8b478714620002d05780631d33267a14620003405780631f816c6d146200035957806328262dd1146200036f578063299c55f714620003855780632f5c5a08146200039b57806332bc934c14620003c357806332f402c514620003d95780633a02263c146200040b5780633f4ba83a1462000421578063471b37cf14620004375780634a393149146200044d5780634bc1aa42146200048c5780634db08aea14620004a257806356c2c1f614620004b857806359baef4014620004ce5780635a3320ff14620004f05780635c975abb146200050657806363302789146200051c5780636fc559bb146200053257806372f4f5f9146200032a5780637a4690fb146200054b5780637c1b6afe14620005615780638059e80414620005775780638456cb59146200058d578063851cad9014620005a35780638cac193914620005b95780638da5cb5b14620005cf5780638f382a0014620005e557806393a378da14620005fb5780639c1e03a014620006205780639dc29fac14620006365780639f95de64146200065b578063a804903a1462000677578063ac60da79146200068d578063aebb254014620006a3578063b0e9a1ef14620006c5578063b2cb0a3d14620006de578063b3922c4214620006f4578063b5c7b1fe146200070a578063b8a4b858146200072c578063bd1fac00146200054b578063ca94452d1462000742578063d16c4cf51462000767578063da682aeb146200077d578063ed6b2d7d14620007a8578063f2fde38b14620007d0578063f48c305414620007f2578063f5459d6b1462000808578063fbd7d081146200081e575b600080fd5b3415620002b557600080fd5b620002ce600160a060020a036004351660243562000834565b005b3415620002dc57600080fd5b620002e6620008bf565b60405190815260200160405180910390f35b34156200030457600080fd5b6200030e620008ce565b604051600160a060020a03909116815260200160405180910390f35b34156200033657600080fd5b620002e6620008dd565b34156200034c57600080fd5b620002ce600435620008ec565b34156200036557600080fd5b6200030e6200099f565b34156200037b57600080fd5b620002e6620009ae565b34156200039157600080fd5b620002e6620009bd565b3415620003a757600080fd5b620002ce600160a060020a0360043581169060243516620009cc565b3415620003cf57600080fd5b620002e662001011565b3415620003e557600080fd5b620002ce600160a060020a03600435166024356044356064351515608435151562001018565b34156200041757600080fd5b6200030e620011de565b34156200042d57600080fd5b620002ce620011ed565b34156200044357600080fd5b620002e66200126e565b34156200045957600080fd5b62000478600160a060020a036004358116906024351660443562001275565b604051901515815260200160405180910390f35b34156200049857600080fd5b620002e662001361565b3415620004ae57600080fd5b6200030e62001368565b3415620004c457600080fd5b620002e662001377565b3415620004da57600080fd5b620002ce600160a060020a03600435166200137f565b3415620004fc57600080fd5b62000478620015db565b34156200051257600080fd5b62000478620016cf565b34156200052857600080fd5b620002e6620016df565b34156200053e57600080fd5b6200030e600435620016ee565b34156200055757600080fd5b620002e662001717565b34156200056d57600080fd5b620002e662001726565b34156200058357600080fd5b6200030e6200172c565b34156200059957600080fd5b620002ce6200173b565b3415620005af57600080fd5b620002e6620017c1565b3415620005c557600080fd5b620002e6620017c7565b3415620005db57600080fd5b6200030e620017d6565b3415620005f157600080fd5b620002e6620017e5565b34156200060757600080fd5b620002ce600160a060020a0360043516602435620017f1565b34156200062c57600080fd5b6200030e62001864565b34156200064257600080fd5b620002ce600160a060020a036004351660243562001873565b34156200066757600080fd5b620002ce60043560243562001951565b34156200068357600080fd5b6200030e62001a9a565b34156200069957600080fd5b620002e662001aa9565b3415620006af57600080fd5b620002ce600160a060020a036004351662001ab8565b3415620006d157600080fd5b620002ce60043562001b0c565b3415620006ea57600080fd5b620002e662001b71565b34156200070057600080fd5b620002e662001b79565b34156200071657600080fd5b620002ce600160a060020a036004351662001b88565b34156200073857600080fd5b6200030e62001c11565b34156200074e57600080fd5b620002ce600160a060020a036004351660243562001c20565b34156200077357600080fd5b6200030e62001d0b565b34156200078957600080fd5b62000478600160a060020a036004358116906024351660443562001d1a565b3415620007b457600080fd5b620002ce600160a060020a036004358116906024351662001d2f565b3415620007dc57600080fd5b620002ce600160a060020a036004351662001d8b565b62000478600160a060020a036004351662001e1b565b34156200081457600080fd5b6200030e62001e22565b34156200082a57600080fd5b620002e662001e31565b600b5433600160a060020a039081169116146200085057600080fd5b600c54600160a060020a031662346b57838360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1515620008a657600080fd5b6102c65a03f11515620008b857600080fd5b5050505050565b6a0771d2fa45345aa900000081565b600454600160a060020a031681565b6a01a784379d99db4200000081565b60005433600160a060020a039081169116146200090857600080fd5b600d5481106200091757600080fd5b600d8054829081106200092657fe5b600091825260209091200154600454600160a060020a03918216916374a8f103911660405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156200098757600080fd5b6102c65a03f115156200099957600080fd5b50505050565b600c54600160a060020a031681565b6a05ca4ec2a79a7f6700000081565b6a013da329b633647180000081565b60005433600160a060020a03908116911614620009e857600080fd5b60005460a060020a900460ff16151562000a0157600080fd5b600160a060020a038216151562000a1757600080fd5b60048054600160a060020a031916600160a060020a038481169190911790915581161562000a6057600c8054600160a060020a031916600160a060020a03831617905562000af0565b600c54600160a060020a0316151562000af05769d3c21bcecceda10000006a01a784379d99db420000006a05ca4ec2a79a7f6700000062000aa06200205c565b808481526020018381526020018281526020019350505050604051809103906000f080151562000acf57600080fd5b600c8054600160a060020a031916600160a060020a03929092169190911790555b600454600160a060020a03166318160ddd6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562000b3957600080fd5b6102c65a03f1151562000b4b57600080fd5b5050506040518051151590506200100d57600454600554600160a060020a039182169163827f32c0911662000bbc6a0422ca8b0a00a42500000062000baf6a0771d2fa45345aa900000081816a108b2a2c2802909400000063ffffffff62001e3f16565b9063ffffffff62001e3f16565b60006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151562000c0957600080fd5b6102c65a03f1151562000c1b57600080fd5b50505060405180515050600454600c54600160a060020a039182169163827f32c0911662000c756a05ca4ec2a79a7f6700000062000baf69d3c21bcecceda10000006a01a784379d99db4200000063ffffffff62001e3f16565b60006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151562000cc257600080fd5b6102c65a03f1151562000cd457600080fd5b50505060405180515050600454600054600160a060020a039182169163827f32c0911662000d1f6a013da329b63364718000006a01a784379d99db4200000063ffffffff62001e3f16565b60006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151562000d6c57600080fd5b6102c65a03f1151562000d7e57600080fd5b50505060405180515050600454600a54600160a060020a039182169163827f32c091166a108b2a2c2802909400000060006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151562000dfa57600080fd5b6102c65a03f1151562000e0c57600080fd5b50505060405180515050600454600160a060020a031663827f32c03062000e506a05606db4c03408968000006a0b949d854f34fece00000063ffffffff62001e3f16565b60006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151562000e9d57600080fd5b6102c65a03f1151562000eaf57600080fd5b50505060405180515050600454600854600160a060020a039182169163827f32c0911662000f03600262000ef66a027b46536c66c8e3000000600363ffffffff62001e5616565b9063ffffffff62001e6e16565b60006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151562000f5057600080fd5b6102c65a03f1151562000f6257600080fd5b50505060405180515050600454600954600160a060020a039182169163827f32c0911662000fa36a027b46536c66c8e3000000600363ffffffff62001e5616565b60006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151562000ff057600080fd5b6102c65a03f115156200100257600080fd5b505050604051805150505b5050565b620f424081565b60005433600160a060020a039081169116146200103457600080fd5b600160a060020a038516158015906200104d5750600083115b80156200105a5750428410155b15156200106657600080fd5b80156200111657600d8054600181016200108183826200206d565b9160005260206000209001600087876276a70062ed4e0088620010a362002099565b600160a060020a03909516855260208501939093526040808501929092526060840152901515608083015260a09091019051809103906000f0801515620010e957600080fd5b909190916101000a815481600160a060020a030219169083600160a060020a0316021790555050620011bc565b600d8054600181016200112a83826200206d565b9160005260206000209001600087876301e13380630784ce00886200114e62002099565b600160a060020a03909516855260208501939093526040808501929092526060840152901515608083015260a09091019051809103906000f08015156200119457600080fd5b909190916101000a815481600160a060020a030219169083600160a060020a03160217905550505b600d54620008b890620011d790600163ffffffff62001e9516565b8462001951565b600354600160a060020a031681565b60005433600160a060020a039081169116146200120957600080fd5b60005460a060020a900460ff1615156200122257600080fd5b6000805474ff0000000000000000000000000000000000000000191690557f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b62ed4e0081565b600c54600090600160a060020a03166337a3931f8560405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b1515620012c957600080fd5b6102c65a03f11515620012db57600080fd5b505060005460a060020a900460ff16159050806200130a575030600160a060020a031684600160a060020a0316145b8062001327575030600160a060020a031683600160a060020a0316145b80620013405750600b54600160a060020a038581169116145b80620013595750600b54600160a060020a038481169116145b949350505050565b6276a70081565b600554600160a060020a031681565b6301e1338081565b600a5460009033600160a060020a039081169116146200139e57600080fd5b600160a060020a03821615801590620013c05750600354600160a060020a0316155b1515620013cc57600080fd5b60038054600160a060020a031916600160a060020a038481169190911790915560045416633cebb8238360405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156200143557600080fd5b6102c65a03f115156200144757600080fd5b5050600c54600160a060020a0316905063f2fde38b8360405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156200149c57600080fd5b6102c65a03f11515620014ae57600080fd5b50505030600160a060020a03163190506000811115620014fa57600160a060020a03821681156108fc0282604051600060405180830381858888f193505050501515620014fa57600080fd5b600454600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156200155457600080fd5b6102c65a03f115156200156657600080fd5b505050604051805191505060008111156200100d57600454600160a060020a031663a9059cbb838360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151562000ff057600080fd5b600b54600090600160a060020a0316158015906200165b5750600b54600160a060020a031663ecb70fb76000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200163d57600080fd5b6102c65a03f115156200164f57600080fd5b50505060405180519050155b8015620016c95750600b54600160a060020a03166344691f7e6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620016ac57600080fd5b6102c65a03f11515620016be57600080fd5b505050604051805190505b90505b90565b60005460a060020a900460ff1681565b6a05606db4c034089680000081565b600d805482908110620016fd57fe5b600091825260209091200154600160a060020a0316905081565b6a108b2a2c2802909400000081565b600d5490565b600a54600160a060020a031681565b60005433600160a060020a039081169116146200175757600080fd5b60005460a060020a900460ff16156200176f57600080fd5b6000805474ff0000000000000000000000000000000000000000191660a060020a1790557f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6103e881565b6a0b949d854f34fece00000081565b600054600160a060020a031681565b670de0b6b3a764000081565b600b5433600160a060020a039081169116146200180d57600080fd5b600c54600160a060020a03166393a378da838360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1515620008a657600080fd5b600b54600160a060020a031681565b600a5433600160a060020a039081169116146200188f57600080fd5b30600160a060020a031682600160a060020a03161480620018bd5750600554600160a060020a038381169116145b1515620018c957600080fd5b600454600160a060020a031663d3ce77fe838360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156200192957600080fd5b6102c65a03f115156200193b57600080fd5b5050506040518051905015156200100d57600080fd5b60005433600160a060020a039081169116146200196d57600080fd5b600d54821080156200197f5750600081115b801562001a075750600d8054839081106200199657fe5b6000918252602082200154600160a060020a03169063be9a655590604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620019e757600080fd5b6102c65a03f11515620019f957600080fd5b505050604051805190504211155b151562001a1357600080fd5b600454600d8054600160a060020a039092169163a9059cbb91908590811062001a3857fe5b6000918252602082200154600160a060020a03169084906040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156200192957600080fd5b600754600160a060020a031681565b6a0422ca8b0a00a42500000081565b600a5433600160a060020a0390811691161462001ad457600080fd5b600160a060020a038116151562001aea57600080fd5b600a8054600160a060020a031916600160a060020a0392909216919091179055565b600b5433600160a060020a0390811691161462001b2857600080fd5b600c54600160a060020a031663b0e9a1ef8260405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b15156200098757600080fd5b630784ce0081565b6a027b46536c66c8e300000081565b60005433600160a060020a0390811691161462001ba457600080fd5b600454600160a060020a038281169116141562001bc057600080fd5b600454600160a060020a031663df8de3e78260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156200098757600080fd5b600954600160a060020a031681565b60005433600160a060020a0390811691161462001c3c57600080fd5b600160a060020a0382161580159062001c5c575062001c5a620015db565b155b801562001c735750600454600160a060020a031615155b151562001c7f57600080fd5b600b8054600160a060020a031916600160a060020a0384811691909117909155600454600554908216916323b872dd9116848460006040516020015260405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b15156200192957600080fd5b600654600160a060020a031681565b505060005460a060020a900460ff1615919050565b60005433600160a060020a0390811691161462001d4b57600080fd5b600354600160a060020a031615158062001d735750600454600160a060020a03838116911614155b151562001d7f57600080fd5b6200100d828262001ea8565b60005433600160a060020a0390811691161462001da757600080fd5b600160a060020a038116151562001dbd57600080fd5b600054600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008054600160a060020a031916600160a060020a0392909216919091179055565b6000806000fd5b600854600160a060020a031681565b69d3c21bcecceda100000081565b60008282018381101562001e4f57fe5b9392505050565b600080828481151562001e6557fe5b04949350505050565b600082820283158062001e8c575082848281151562001e8957fe5b04145b151562001e4f57fe5b60008282111562001ea257fe5b50900390565b60008054819033600160a060020a0390811691161462001ec757600080fd5b600160a060020a038416151562001f1c5782600160a060020a03166108fc30600160a060020a0316319081150290604051600060405180830381858888f19350505050151562001f1657600080fd5b62000999565b83915081600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151562001f7757600080fd5b6102c65a03f1151562001f8957600080fd5b5050506040518051915050600160a060020a03821663a9059cbb848360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151562001ff257600080fd5b6102c65a03f115156200200457600080fd5b505050604051805190505082600160a060020a031684600160a060020a03167f21e9b296e283cad208b551b3c383bb74e34086eb5691fee8392dcce6794521c28360405190815260200160405180910390a350505050565b60405161101580620020cc83390190565b815481835581811511620020945760008381526020902062002094918101908301620020aa565b505050565b60405161090f80620030e183390190565b620016cc91905b80821115620020c75760008155600101620020b1565b509056006060604052341561000f57600080fd5b60405160608061101583398101604052808051919060200180519190602001805160008054600160a060020a033316600160a060020a0319909116179055600b949094555050600c55600d55610fab8061006a6000396000f3006060604052600436106101235763ffffffff60e060020a600035041662346b57811461012857806304c80c3c1461014c5780630d92e3e8146101715780630eb6f5431461018457806326c43d8f1461019757806328262dd1146101aa57806337a3931f146101bd57806342ef4c1a146101dc5780634a48314f146101ef5780634b86faba14610202578063685a73e0146102155780638da5cb5b1461023357806391e79c721461026257806393a378da14610275578063b0e9a1ef14610297578063b40d8d58146102ad578063be2b1047146102c0578063c899fa77146102d3578063d228cfc5146102e6578063d43a0b4c14610305578063d6192c6c14610318578063e2c208361461036e578063f2fde38b14610381578063fbd7d081146103a0575b600080fd5b341561013357600080fd5b61014a600160a060020a03600435166024356103b3565b005b341561015757600080fd5b61015f6105cc565b60405190815260200160405180910390f35b341561017c57600080fd5b61015f6105d2565b341561018f57600080fd5b61015f6105d8565b34156101a257600080fd5b61015f6105de565b34156101b557600080fd5b61015f6105e4565b34156101c857600080fd5b61014a600160a060020a03600435166105ea565b34156101e757600080fd5b61015f6106b1565b34156101fa57600080fd5b61015f6106b7565b341561020d57600080fd5b61014a6106bd565b341561022057600080fd5b61014a60048035602481019101356106c8565b341561023e57600080fd5b6102466106ff565b604051600160a060020a03909116815260200160405180910390f35b341561026d57600080fd5b61015f61070e565b341561028057600080fd5b61014a600160a060020a0360043516602435610714565b34156102a257600080fd5b61014a600435610848565b34156102b857600080fd5b61015f61090f565b34156102cb57600080fd5b61015f610915565b34156102de57600080fd5b61015f61091b565b34156102f157600080fd5b61014a600160a060020a0360043516610921565b341561031057600080fd5b61015f610cc6565b341561032357600080fd5b610337600160a060020a0360043516610ccc565b60405194855292151560208501529015156040808501919091529015156060840152901515608083015260a0909101905180910390f35b341561037957600080fd5b61015f610d04565b341561038c57600080fd5b61014a600160a060020a0360043516610e7b565b34156103ab57600080fd5b61015f610f16565b6000805433600160a060020a039081169116146103cf57600080fd5b60075415806103e057506007544211155b156105c757600160a060020a0383166000908152600160205260409020548214806104125750600160a060020a038316155b1561041c576105c7565b600160a060020a0383166000908152600160205260409020541580156104425750600082115b156104635760035461045b90600163ffffffff610f1c16565b6003556104a4565b600160a060020a038316600090815260016020526040812054118015610487575081155b156104a4576003546104a090600163ffffffff610f3216565b6003555b600160a060020a03831660009081526001602052604090205482116104f157600160a060020a0383166000908152600160205260409020546104ec908363ffffffff610f3216565b61051b565b600160a060020a03831660009081526001602052604090205461051b90839063ffffffff610f3216565b600160a060020a03841660009081526001602052604090205490915082111561055957600254610551908263ffffffff610f1c16565b600255610570565b60025461056c908263ffffffff610f3216565b6002555b600160a060020a038084166000818152600160205260409081902085905590913316907f531b6d98182f354ef73d680007a0fa84a81fa4a320e289e4f826150ad104fb1a9085905190815260200160405180910390a35b505050565b600c5481565b600e5481565b60055481565b60035481565b600d5481565b60005433600160a060020a0390811691161461060557600080fd5b600160a060020a0381166000908152600160205260408120541180156106485750600160a060020a0381166000908152600160208190526040909120015460ff16155b156106a557600160a060020a0381166000908152600160208190526040909120808201805460ff19169092179091555460025461068a9163ffffffff610f3216565b6002556003546106a190600163ffffffff610f3216565b6003555b6106ad610d04565b5050565b60095481565b60085481565b6106c633610921565b565b60005b818110156105c7576106f78383838181106106e257fe5b90506020020135600160a060020a0316610921565b6001016106cb565b600054600160a060020a031681565b60025481565b60005433600160a060020a0390811691161461072f57600080fd5b600754158061074057506007544211155b156106ad578015806107595750600160a060020a038216155b15610763576106ad565b600160a060020a038216600090815260016020526040902054151561079a5760035461079690600163ffffffff610f1c16565b6003555b600160a060020a0382166000908152600160205260409020546107c3908263ffffffff610f1c16565b600160a060020a0383166000908152600160205260409020556002546107ef908263ffffffff610f1c16565b600255600160a060020a03808316600081815260016020526040908190205491923316917f531b6d98182f354ef73d680007a0fa84a81fa4a320e289e4f826150ad104fb1a915190815260200160405180910390a35050565b60005433600160a060020a0390811691161461086357600080fd5b600754158061087457506007544211155b1561090c574281101561088657600080fd5b600781905561089e816276a70063ffffffff610f1c16565b6008556108b48162ed4e0063ffffffff610f1c16565b6009556108cb81630163f50063ffffffff610f1c16565b600a55600160a060020a0333167fc7ad31b0c99a40aa43822fbc49a68cf7f3eb3d52152a5c01a7f636e4481cf43f8260405190815260200160405180910390a25b50565b600a5481565b60075481565b60045481565b600160a060020a03811660009081526001602052604081205481901180156109665750600160a060020a0382166000908152600160208190526040909120015460ff16155b151561097157600080fd5b50600061097c610d04565b50600160a060020a03821660009081526001602081905260409091200154610100900460ff161580156109b157506008544210155b15610a3357600454600b54600160a060020a038416600090815260016020526040902054610a07926109fa9290916109ee9163ffffffff610f4416565b9063ffffffff610f6816565b829063ffffffff610f1c16565b600160a060020a038316600090815260016020819052604090912001805461ff00191661010017905590505b600160a060020a0382166000908152600160208190526040909120015462010000900460ff16158015610a6857506009544210155b15610ad357600554600c54600160a060020a038416600090815260016020526040902054610aa5926109fa9290916109ee9163ffffffff610f4416565b600160a060020a038316600090815260016020819052604090912001805462ff000019166201000017905590505b600160a060020a038216600090815260016020819052604090912001546301000000900460ff16158015610b095750600a544210155b15610b7657600654600d54600160a060020a038416600090815260016020526040902054610b46926109fa9290916109ee9163ffffffff610f4416565b600160a060020a038316600090815260016020819052604090912001805463ff0000001916630100000017905590505b60008111156106ad57600e54610b92908263ffffffff610f1c16565b600e5560008054600160a060020a0316906303d756cb90604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610bde57600080fd5b6102c65a03f11515610bef57600080fd5b50505060405180519050600160a060020a031663a9059cbb838360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610c5557600080fd5b6102c65a03f11515610c6657600080fd5b505050604051805190501515610c7b57600080fd5b81600160a060020a031633600160a060020a03167fd06980f1b54006ca63e8ddd2f4dafe76e8bcd6e7d7f333296f778781626af4268360405190815260200160405180910390a35050565b60065481565b6001602081905260009182526040909120805491015460ff808216916101008104821691620100008204811691630100000090041685565b60006008544210158015610d185750600454155b15610d24576002546004555b6009544210158015610d365750600554155b15610d42576002546005555b600a544210158015610d545750600654155b15610e7457600254600655600e54600c54600b5460008054610e709493610e64939092610e5892600160a060020a0316906303d756cb90604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610dc057600080fd5b6102c65a03f11515610dd157600080fd5b50505060405180519050600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515610e3157600080fd5b6102c65a03f11515610e4257600080fd5b505050604051805191905063ffffffff610f3216565b9063ffffffff610f3216565b9063ffffffff610f1c16565b600d555b5060025490565b60005433600160a060020a03908116911614610e9657600080fd5b600160a060020a0381161515610eab57600080fd5b600054600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600b5481565b600082820183811015610f2b57fe5b9392505050565b600082821115610f3e57fe5b50900390565b6000828202831580610f605750828482811515610f5d57fe5b04145b1515610f2b57fe5b6000808284811515610f7657fe5b049493505050505600a165627a7a72305820b13878352c4505507a0469068cef25077583c2b2fd96737ede4cf449af3c69b800296060604052341561000f57600080fd5b60405160a08061090f833981016040528080519190602001805191906020018051919060200180519190602001805160008054600160a060020a03191633600160a060020a039081169190911790915590925086161515905061007157600080fd5b8183111561007e57600080fd5b60018054600160a060020a031916600160a060020a0387161790556005805460ff191682151517905560048290556100c384846401000000006100d2810261079b1704565b600255505050600355506100e8565b6000828201838110156100e157fe5b9392505050565b610818806100f76000396000f3006060604052600436106100ab5763ffffffff60e060020a6000350416630fb5a6b481146100b057806313d033c0146100d55780631726cbc8146100e85780631916558714610107578063384711cc1461012857806338af3eed1461014757806374a8f10314610176578063872a7810146101955780638da5cb5b146101bc5780639852595c146101cf578063be9a6555146101ee578063f2fde38b14610201578063fa01dc0614610220575b600080fd5b34156100bb57600080fd5b6100c361023f565b60405190815260200160405180910390f35b34156100e057600080fd5b6100c3610245565b34156100f357600080fd5b6100c3600160a060020a036004351661024b565b341561011257600080fd5b610126600160a060020a0360043516610283565b005b341561013357600080fd5b6100c3600160a060020a036004351661039c565b341561015257600080fd5b61015a6104dd565b604051600160a060020a03909116815260200160405180910390f35b341561018157600080fd5b610126600160a060020a03600435166104ec565b34156101a057600080fd5b6101a86106a9565b604051901515815260200160405180910390f35b34156101c757600080fd5b61015a6106b2565b34156101da57600080fd5b6100c3600160a060020a03600435166106c1565b34156101f957600080fd5b6100c36106d3565b341561020c57600080fd5b610126600160a060020a03600435166106d9565b341561022b57600080fd5b6101a8600160a060020a0360043516610774565b60045481565b60025481565b600160a060020a03811660009081526006602052604081205461027d906102718461039c565b9063ffffffff61078916565b92915050565b600061028e8261024b565b90506000811161029d57600080fd5b600160a060020a0382166000908152600660205260409020546102c6908263ffffffff61079b16565b600160a060020a0380841660008181526006602052604080822094909455600154919363a9059cbb939290921691859190516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561033f57600080fd5b6102c65a03f1151561035057600080fd5b50505060405180519050151561036557600080fd5b7ffb81f9b30d73d830c3544b34d827c08142579ee75710b490bab0b3995468c5658160405190815260200160405180910390a15050565b600080600083600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156103f857600080fd5b6102c65a03f1151561040957600080fd5b5050506040518051600160a060020a03861660009081526006602052604090205490935061043f9150839063ffffffff61079b16565b905060025442101561045457600092506104d6565b6004546003546104699163ffffffff61079b16565b4210158061048f5750600160a060020a03841660009081526007602052604090205460ff165b1561049c578092506104d6565b6104d36004546104c76104ba6003544261078990919063ffffffff16565b849063ffffffff6107b116565b9063ffffffff6107d516565b92505b5050919050565b600154600160a060020a031681565b600080548190819033600160a060020a0390811691161461050c57600080fd5b60055460ff16151561051d57600080fd5b600160a060020a03841660009081526007602052604090205460ff161561054357600080fd5b83600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561059a57600080fd5b6102c65a03f115156105ab57600080fd5b5050506040518051905092506105c08461024b565b91506105d2838363ffffffff61078916565b600160a060020a03808616600081815260076020526040808220805460ff191660011790558154949550919363a9059cbb931691859190516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561065157600080fd5b6102c65a03f1151561066257600080fd5b50505060405180519050151561067757600080fd5b7f44825a4b2df8acb19ce4e1afba9aa850c8b65cdb7942e2078f27d0b0960efee660405160405180910390a150505050565b60055460ff1681565b600054600160a060020a031681565b60066020526000908152604090205481565b60035481565b60005433600160a060020a039081169116146106f457600080fd5b600160a060020a038116151561070957600080fd5b600054600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60076020526000908152604090205460ff1681565b60008282111561079557fe5b50900390565b6000828201838110156107aa57fe5b9392505050565b60008282028315806107cd57508284828115156107ca57fe5b04145b15156107aa57fe5b60008082848115156107e357fe5b049493505050505600a165627a7a7230582009649e1f374e51bd346858160f9ce8785feb3bfeb10e4f09b72214fac4485c0e0029a165627a7a7230582092a1f27c76560e9a5c435886caece0a86173198ab75681be3e0196811ebb45d30029

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000fc5c6c8015962e7035f3bdc5fe7ec94bedc77833

-----Decoded View---------------
Arg [0] : _wallet (address): 0xFc5c6c8015962E7035f3BDc5fE7eC94BEDc77833

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000fc5c6c8015962e7035f3bdc5fe7ec94bedc77833


Swarm Source

bzzr://92a1f27c76560e9a5c435886caece0a86173198ab75681be3e0196811ebb45d3

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

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ 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.