ETH Price: $3,563.21 (+1.50%)
Gas: 41 Gwei

Contract

0x47A15658051E1C68795F8D51d1f29dE8b6ccaCd2
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Withdraw Balance...70262692019-01-07 14:58:341907 days ago1546873114IN
0x47A15658...8b6ccaCd2
0 ETH0.000096713
Explore53815642018-04-04 22:39:172184 days ago1522881557IN
0x47A15658...8b6ccaCd2
0.01 ETH0.000048872
Explore53814792018-04-04 22:18:292184 days ago1522880309IN
0x47A15658...8b6ccaCd2
0.01 ETH0.000048872
Pause53811422018-04-04 20:52:292184 days ago1522875149IN
0x47A15658...8b6ccaCd2
0 ETH0.000112524
Unpause53811192018-04-04 20:44:182184 days ago1522874658IN
0x47A15658...8b6ccaCd2
0 ETH0.000125854
Pause53810112018-04-04 20:16:472184 days ago1522873007IN
0x47A15658...8b6ccaCd2
0 ETH0.000112524
Exploration Resu...53809942018-04-04 20:13:022184 days ago1522872782IN
0x47A15658...8b6ccaCd2
0 ETH0.0029972
Explore53809902018-04-04 20:12:322184 days ago1522872752IN
0x47A15658...8b6ccaCd2
0.01 ETH0.00040293
Exploration Resu...53809792018-04-04 20:10:202184 days ago1522872620IN
0x47A15658...8b6ccaCd2
0 ETH0.002966742
Explore53809762018-04-04 20:08:532184 days ago1522872533IN
0x47A15658...8b6ccaCd2
0.01 ETH0.000268472
Exploration Resu...53806892018-04-04 19:00:062185 days ago1522868406IN
0x47A15658...8b6ccaCd2
0 ETH0.0029972
Explore53806832018-04-04 18:59:072185 days ago1522868347IN
0x47A15658...8b6ccaCd2
0.01 ETH0.00026862
Exploration Resu...53806162018-04-04 18:43:482185 days ago1522867428IN
0x47A15658...8b6ccaCd2
0 ETH0.002966872
Exploration Resu...53806162018-04-04 18:43:482185 days ago1522867428IN
0x47A15658...8b6ccaCd2
0 ETH0.003057252
Explore53806102018-04-04 18:42:202185 days ago1522867340IN
0x47A15658...8b6ccaCd2
0.01 ETH0.00032862
Explore53806102018-04-04 18:42:202185 days ago1522867340IN
0x47A15658...8b6ccaCd2
0.01 ETH0.00032862
Exploration Resu...53805982018-04-04 18:38:372185 days ago1522867117IN
0x47A15658...8b6ccaCd2
0 ETH0.003027122
Explore53805952018-04-04 18:37:582185 days ago1522867078IN
0x47A15658...8b6ccaCd2
0.01 ETH0.000147731.1
Exploration Resu...53805852018-04-04 18:35:112185 days ago1522866911IN
0x47A15658...8b6ccaCd2
0 ETH0.003057252
Exploration Resu...53805822018-04-04 18:34:392185 days ago1522866879IN
0x47A15658...8b6ccaCd2
0 ETH0.003027122
Exploration Resu...53805802018-04-04 18:32:402185 days ago1522866760IN
0x47A15658...8b6ccaCd2
0 ETH0.003027122
Explore53805782018-04-04 18:32:312185 days ago1522866751IN
0x47A15658...8b6ccaCd2
0.01 ETH0.00026862
Explore53805782018-04-04 18:32:312185 days ago1522866751IN
0x47A15658...8b6ccaCd2
0.01 ETH0.00026862
Exploration Resu...53805782018-04-04 18:32:312185 days ago1522866751IN
0x47A15658...8b6ccaCd2
0 ETH0.002966742
Explore53805772018-04-04 18:32:232185 days ago1522866743IN
0x47A15658...8b6ccaCd2
0.01 ETH0.00026862
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Txn Hash Block From To Value
70262692019-01-07 14:58:341907 days ago1546873114
0x47A15658...8b6ccaCd2
0.613 ETH
53809902018-04-04 20:12:322184 days ago1522872752
0x47A15658...8b6ccaCd2
0.0058 ETH
53809902018-04-04 20:12:322184 days ago1522872752
0x47A15658...8b6ccaCd2
0.0032 ETH
53809762018-04-04 20:08:532184 days ago1522872533
0x47A15658...8b6ccaCd2
0.0058 ETH
53809762018-04-04 20:08:532184 days ago1522872533
0x47A15658...8b6ccaCd2
0.0032 ETH
53806832018-04-04 18:59:072185 days ago1522868347
0x47A15658...8b6ccaCd2
0.0058 ETH
53806832018-04-04 18:59:072185 days ago1522868347
0x47A15658...8b6ccaCd2
0.0032 ETH
53806102018-04-04 18:42:202185 days ago1522867340
0x47A15658...8b6ccaCd2
0.0058 ETH
53806102018-04-04 18:42:202185 days ago1522867340
0x47A15658...8b6ccaCd2
0.0032 ETH
53806102018-04-04 18:42:202185 days ago1522867340
0x47A15658...8b6ccaCd2
0.0058 ETH
53806102018-04-04 18:42:202185 days ago1522867340
0x47A15658...8b6ccaCd2
0.0032 ETH
53805952018-04-04 18:37:582185 days ago1522867078
0x47A15658...8b6ccaCd2
0.0058 ETH
53805952018-04-04 18:37:582185 days ago1522867078
0x47A15658...8b6ccaCd2
0.0032 ETH
53805782018-04-04 18:32:312185 days ago1522866751
0x47A15658...8b6ccaCd2
0.0058 ETH
53805782018-04-04 18:32:312185 days ago1522866751
0x47A15658...8b6ccaCd2
0.0032 ETH
53805782018-04-04 18:32:312185 days ago1522866751
0x47A15658...8b6ccaCd2
0.0058 ETH
53805782018-04-04 18:32:312185 days ago1522866751
0x47A15658...8b6ccaCd2
0.0032 ETH
53805772018-04-04 18:32:232185 days ago1522866743
0x47A15658...8b6ccaCd2
0.0058 ETH
53805772018-04-04 18:32:232185 days ago1522866743
0x47A15658...8b6ccaCd2
0.0032 ETH
53805752018-04-04 18:31:522185 days ago1522866712
0x47A15658...8b6ccaCd2
0.0058 ETH
53805752018-04-04 18:31:522185 days ago1522866712
0x47A15658...8b6ccaCd2
0.0032 ETH
53805752018-04-04 18:31:522185 days ago1522866712
0x47A15658...8b6ccaCd2
0.0058 ETH
53805752018-04-04 18:31:522185 days ago1522866712
0x47A15658...8b6ccaCd2
0.0032 ETH
53804542018-04-04 18:05:212185 days ago1522865121
0x47A15658...8b6ccaCd2
0.0058 ETH
53804542018-04-04 18:05:212185 days ago1522865121
0x47A15658...8b6ccaCd2
0.0032 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
EthernautsExplore

Compiler Version
v0.4.19+commit.c4cbbb05

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-03-11
*/

pragma solidity ^0.4.19;

/// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens
/// @author Ethernauts
contract ERC721 {
    // Required methods
    function totalSupply() public view returns (uint256 total);
    function balanceOf(address _owner) public view returns (uint256 balance);
    function ownerOf(uint256 _tokenId) external view returns (address owner);
    function approve(address _to, uint256 _tokenId) external;
    function transfer(address _to, uint256 _tokenId) external;
    function transferFrom(address _from, address _to, uint256 _tokenId) external;
    function takeOwnership(uint256 _tokenId) public;
    function implementsERC721() public pure returns (bool);

    // Events
    event Transfer(address from, address to, uint256 tokenId);
    event Approval(address owner, address approved, uint256 tokenId);

    // Optional
    // function name() public view returns (string name);
    // function symbol() public view returns (string symbol);
    // function tokensOfOwner(address _owner) external view returns (uint256[] tokenIds);
    // function tokenMetadata(uint256 _tokenId, string _preferredTransport) public view returns (string infoUrl);

    // ERC-165 Compatibility (https://github.com/ethereum/EIPs/issues/165)
    function supportsInterface(bytes4 _interfaceID) external view returns (bool);
}

// Extend this library for child contracts
library SafeMath {

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

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

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

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

    /**
    * @dev Compara two numbers, and return the bigger one.
    */
    function max(int256 a, int256 b) internal pure returns (int256) {
        if (a > b) {
            return a;
        } else {
            return b;
        }
    }

    /**
    * @dev Compara two numbers, and return the bigger one.
    */
    function min(int256 a, int256 b) internal pure returns (int256) {
        if (a < b) {
            return a;
        } else {
            return b;
        }
    }


}

/// @dev Base contract for all Ethernauts contracts holding global constants and functions.
contract EthernautsBase {

    /*** CONSTANTS USED ACROSS CONTRACTS ***/

    /// @dev Used by all contracts that interfaces with Ethernauts
    ///      The ERC-165 interface signature for ERC-721.
    ///  Ref: https://github.com/ethereum/EIPs/issues/165
    ///  Ref: https://github.com/ethereum/EIPs/issues/721
    bytes4 constant InterfaceSignature_ERC721 =
    bytes4(keccak256('name()')) ^
    bytes4(keccak256('symbol()')) ^
    bytes4(keccak256('totalSupply()')) ^
    bytes4(keccak256('balanceOf(address)')) ^
    bytes4(keccak256('ownerOf(uint256)')) ^
    bytes4(keccak256('approve(address,uint256)')) ^
    bytes4(keccak256('transfer(address,uint256)')) ^
    bytes4(keccak256('transferFrom(address,address,uint256)')) ^
    bytes4(keccak256('takeOwnership(uint256)')) ^
    bytes4(keccak256('tokensOfOwner(address)')) ^
    bytes4(keccak256('tokenMetadata(uint256,string)'));

    /// @dev due solidity limitation we cannot return dynamic array from methods
    /// so it creates incompability between functions across different contracts
    uint8 public constant STATS_SIZE = 10;
    uint8 public constant SHIP_SLOTS = 5;

    // Possible state of any asset
    enum AssetState { Available, UpForLease, Used }

    // Possible state of any asset
    // NotValid is to avoid 0 in places where category must be bigger than zero
    enum AssetCategory { NotValid, Sector, Manufacturer, Ship, Object, Factory, CrewMember }

    /// @dev Sector stats
    enum ShipStats {Level, Attack, Defense, Speed, Range, Luck}
    /// @notice Possible attributes for each asset
    /// 00000001 - Seeded - Offered to the economy by us, the developers. Potentially at regular intervals.
    /// 00000010 - Producible - Product of a factory and/or factory contract.
    /// 00000100 - Explorable- Product of exploration.
    /// 00001000 - Leasable - Can be rented to other users and will return to the original owner once the action is complete.
    /// 00010000 - Permanent - Cannot be removed, always owned by a user.
    /// 00100000 - Consumable - Destroyed after N exploration expeditions.
    /// 01000000 - Tradable - Buyable and sellable on the market.
    /// 10000000 - Hot Potato - Automatically gets put up for sale after acquiring.
    bytes2 public ATTR_SEEDED     = bytes2(2**0);
    bytes2 public ATTR_PRODUCIBLE = bytes2(2**1);
    bytes2 public ATTR_EXPLORABLE = bytes2(2**2);
    bytes2 public ATTR_LEASABLE   = bytes2(2**3);
    bytes2 public ATTR_PERMANENT  = bytes2(2**4);
    bytes2 public ATTR_CONSUMABLE = bytes2(2**5);
    bytes2 public ATTR_TRADABLE   = bytes2(2**6);
    bytes2 public ATTR_GOLDENGOOSE = bytes2(2**7);
}


/// @notice This contract manages the various addresses and constraints for operations
//          that can be executed only by specific roles. Namely CEO and CTO. it also includes pausable pattern.
contract EthernautsAccessControl is EthernautsBase {

    // This facet controls access control for Ethernauts.
    // All roles have same responsibilities and rights, but there is slight differences between them:
    //
    //     - The CEO: The CEO can reassign other roles and only role that can unpause the smart contract.
    //       It is initially set to the address that created the smart contract.
    //
    //     - The CTO: The CTO can change contract address, oracle address and plan for upgrades.
    //
    //     - The COO: The COO can change contract address and add create assets.
    //
    /// @dev Emited when contract is upgraded - See README.md for updgrade plan
    /// @param newContract address pointing to new contract
    event ContractUpgrade(address newContract);

    // The addresses of the accounts (or contracts) that can execute actions within each roles.
    address public ceoAddress;
    address public ctoAddress;
    address public cooAddress;
    address public oracleAddress;

    // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked
    bool public paused = false;

    /// @dev Access modifier for CEO-only functionality
    modifier onlyCEO() {
        require(msg.sender == ceoAddress);
        _;
    }

    /// @dev Access modifier for CTO-only functionality
    modifier onlyCTO() {
        require(msg.sender == ctoAddress);
        _;
    }

    /// @dev Access modifier for CTO-only functionality
    modifier onlyOracle() {
        require(msg.sender == oracleAddress);
        _;
    }

    modifier onlyCLevel() {
        require(
            msg.sender == ceoAddress ||
            msg.sender == ctoAddress ||
            msg.sender == cooAddress
        );
        _;
    }

    /// @dev Assigns a new address to act as the CEO. Only available to the current CEO.
    /// @param _newCEO The address of the new CEO
    function setCEO(address _newCEO) external onlyCEO {
        require(_newCEO != address(0));

        ceoAddress = _newCEO;
    }

    /// @dev Assigns a new address to act as the CTO. Only available to the current CTO or CEO.
    /// @param _newCTO The address of the new CTO
    function setCTO(address _newCTO) external {
        require(
            msg.sender == ceoAddress ||
            msg.sender == ctoAddress
        );
        require(_newCTO != address(0));

        ctoAddress = _newCTO;
    }

    /// @dev Assigns a new address to act as the COO. Only available to the current COO or CEO.
    /// @param _newCOO The address of the new COO
    function setCOO(address _newCOO) external {
        require(
            msg.sender == ceoAddress ||
            msg.sender == cooAddress
        );
        require(_newCOO != address(0));

        cooAddress = _newCOO;
    }

    /// @dev Assigns a new address to act as oracle.
    /// @param _newOracle The address of oracle
    function setOracle(address _newOracle) external {
        require(msg.sender == ctoAddress);
        require(_newOracle != address(0));

        oracleAddress = _newOracle;
    }

    /*** Pausable functionality adapted from OpenZeppelin ***/

    /// @dev Modifier to allow actions only when the contract IS NOT paused
    modifier whenNotPaused() {
        require(!paused);
        _;
    }

    /// @dev Modifier to allow actions only when the contract IS paused
    modifier whenPaused {
        require(paused);
        _;
    }

    /// @dev Called by any "C-level" role to pause the contract. Used only when
    ///  a bug or exploit is detected and we need to limit damage.
    function pause() external onlyCLevel whenNotPaused {
        paused = true;
    }

    /// @dev Unpauses the smart contract. Can only be called by the CEO, since
    ///  one reason we may pause the contract is when CTO account is compromised.
    /// @notice This is public rather than external so it can be called by
    ///  derived contracts.
    function unpause() public onlyCEO whenPaused {
        // can't unpause if contract was upgraded
        paused = false;
    }

}


/// @title The facet of the Ethernauts contract that manages ownership, ERC-721 compliant.
/// @notice This provides the methods required for basic non-fungible token
//          transactions, following the draft ERC-721 spec (https://github.com/ethereum/EIPs/issues/721).
//          It interfaces with EthernautsStorage provinding basic functions as create and list, also holds
//          reference to logic contracts as Auction, Explore and so on
/// @author Ethernatus - Fernando Pauer
/// @dev Ref: https://github.com/ethereum/EIPs/issues/721
contract EthernautsOwnership is EthernautsAccessControl, ERC721 {

    /// @dev Contract holding only data.
    EthernautsStorage public ethernautsStorage;

    /*** CONSTANTS ***/
    /// @notice Name and symbol of the non fungible token, as defined in ERC721.
    string public constant name = "Ethernauts";
    string public constant symbol = "ETNT";

    /********* ERC 721 - COMPLIANCE CONSTANTS AND FUNCTIONS ***************/
    /**********************************************************************/

    bytes4 constant InterfaceSignature_ERC165 = bytes4(keccak256('supportsInterface(bytes4)'));

    /*** EVENTS ***/

    // Events as per ERC-721
    event Transfer(address indexed from, address indexed to, uint256 tokens);
    event Approval(address indexed owner, address indexed approved, uint256 tokens);

    /// @dev When a new asset is create it emits build event
    /// @param owner The address of asset owner
    /// @param tokenId Asset UniqueID
    /// @param assetId ID that defines asset look and feel
    /// @param price asset price
    event Build(address owner, uint256 tokenId, uint16 assetId, uint256 price);

    function implementsERC721() public pure returns (bool) {
        return true;
    }

    /// @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).
    ///  Returns true for any standardized interfaces implemented by this contract. ERC-165 and ERC-721.
    /// @param _interfaceID interface signature ID
    function supportsInterface(bytes4 _interfaceID) external view returns (bool)
    {
        return ((_interfaceID == InterfaceSignature_ERC165) || (_interfaceID == InterfaceSignature_ERC721));
    }

    /// @dev Checks if a given address is the current owner of a particular Asset.
    /// @param _claimant the address we are validating against.
    /// @param _tokenId asset UniqueId, only valid when > 0
    function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {
        return ethernautsStorage.ownerOf(_tokenId) == _claimant;
    }

    /// @dev Checks if a given address currently has transferApproval for a particular Asset.
    /// @param _claimant the address we are confirming asset is approved for.
    /// @param _tokenId asset UniqueId, only valid when > 0
    function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) {
        return ethernautsStorage.approvedFor(_tokenId) == _claimant;
    }

    /// @dev Marks an address as being approved for transferFrom(), overwriting any previous
    ///  approval. Setting _approved to address(0) clears all transfer approval.
    ///  NOTE: _approve() does NOT send the Approval event. This is intentional because
    ///  _approve() and transferFrom() are used together for putting Assets on auction, and
    ///  there is no value in spamming the log with Approval events in that case.
    function _approve(uint256 _tokenId, address _approved) internal {
        ethernautsStorage.approve(_tokenId, _approved);
    }

    /// @notice Returns the number of Assets owned by a specific address.
    /// @param _owner The owner address to check.
    /// @dev Required for ERC-721 compliance
    function balanceOf(address _owner) public view returns (uint256 count) {
        return ethernautsStorage.balanceOf(_owner);
    }

    /// @dev Required for ERC-721 compliance.
    /// @notice Transfers a Asset to another address. If transferring to a smart
    ///  contract be VERY CAREFUL to ensure that it is aware of ERC-721 (or
    ///  Ethernauts specifically) or your Asset may be lost forever. Seriously.
    /// @param _to The address of the recipient, can be a user or contract.
    /// @param _tokenId The ID of the Asset to transfer.
    function transfer(
        address _to,
        uint256 _tokenId
    )
    external
    whenNotPaused
    {
        // Safety check to prevent against an unexpected 0x0 default.
        require(_to != address(0));
        // Disallow transfers to this contract to prevent accidental misuse.
        // The contract should never own any assets
        // (except very briefly after it is created and before it goes on auction).
        require(_to != address(this));
        // Disallow transfers to the storage contract to prevent accidental
        // misuse. Auction or Upgrade contracts should only take ownership of assets
        // through the allow + transferFrom flow.
        require(_to != address(ethernautsStorage));

        // You can only send your own asset.
        require(_owns(msg.sender, _tokenId));

        // Reassign ownership, clear pending approvals, emit Transfer event.
        ethernautsStorage.transfer(msg.sender, _to, _tokenId);
    }

    /// @dev Required for ERC-721 compliance.
    /// @notice Grant another address the right to transfer a specific Asset via
    ///  transferFrom(). This is the preferred flow for transfering NFTs to contracts.
    /// @param _to The address to be granted transfer approval. Pass address(0) to
    ///  clear all approvals.
    /// @param _tokenId The ID of the Asset that can be transferred if this call succeeds.
    function approve(
        address _to,
        uint256 _tokenId
    )
    external
    whenNotPaused
    {
        // Only an owner can grant transfer approval.
        require(_owns(msg.sender, _tokenId));

        // Register the approval (replacing any previous approval).
        _approve(_tokenId, _to);

        // Emit approval event.
        Approval(msg.sender, _to, _tokenId);
    }


    /// @notice Transfer a Asset owned by another address, for which the calling address
    ///  has previously been granted transfer approval by the owner.
    /// @param _from The address that owns the Asset to be transferred.
    /// @param _to The address that should take ownership of the Asset. Can be any address,
    ///  including the caller.
    /// @param _tokenId The ID of the Asset to be transferred.
    function _transferFrom(
        address _from,
        address _to,
        uint256 _tokenId
    )
    internal
    {
        // Safety check to prevent against an unexpected 0x0 default.
        require(_to != address(0));
        // Disallow transfers to this contract to prevent accidental misuse.
        // The contract should never own any assets (except for used assets).
        require(_owns(_from, _tokenId));
        // Check for approval and valid ownership
        require(_approvedFor(_to, _tokenId));

        // Reassign ownership (also clears pending approvals and emits Transfer event).
        ethernautsStorage.transfer(_from, _to, _tokenId);
    }

    /// @dev Required for ERC-721 compliance.
    /// @notice Transfer a Asset owned by another address, for which the calling address
    ///  has previously been granted transfer approval by the owner.
    /// @param _from The address that owns the Asset to be transfered.
    /// @param _to The address that should take ownership of the Asset. Can be any address,
    ///  including the caller.
    /// @param _tokenId The ID of the Asset to be transferred.
    function transferFrom(
        address _from,
        address _to,
        uint256 _tokenId
    )
    external
    whenNotPaused
    {
        _transferFrom(_from, _to, _tokenId);
    }

    /// @dev Required for ERC-721 compliance.
    /// @notice Allow pre-approved user to take ownership of a token
    /// @param _tokenId The ID of the Token that can be transferred if this call succeeds.
    function takeOwnership(uint256 _tokenId) public {
        address _from = ethernautsStorage.ownerOf(_tokenId);

        // Safety check to prevent against an unexpected 0x0 default.
        require(_from != address(0));
        _transferFrom(_from, msg.sender, _tokenId);
    }

    /// @notice Returns the total number of Assets currently in existence.
    /// @dev Required for ERC-721 compliance.
    function totalSupply() public view returns (uint256) {
        return ethernautsStorage.totalSupply();
    }

    /// @notice Returns owner of a given Asset(Token).
    /// @param _tokenId Token ID to get owner.
    /// @dev Required for ERC-721 compliance.
    function ownerOf(uint256 _tokenId)
    external
    view
    returns (address owner)
    {
        owner = ethernautsStorage.ownerOf(_tokenId);

        require(owner != address(0));
    }

    /// @dev Creates a new Asset with the given fields. ONly available for C Levels
    /// @param _creatorTokenID The asset who is father of this asset
    /// @param _price asset price
    /// @param _assetID asset ID
    /// @param _category see Asset Struct description
    /// @param _attributes see Asset Struct description
    /// @param _stats see Asset Struct description
    function createNewAsset(
        uint256 _creatorTokenID,
        address _owner,
        uint256 _price,
        uint16 _assetID,
        uint8 _category,
        uint8 _attributes,
        uint8[STATS_SIZE] _stats
    )
    external onlyCLevel
    returns (uint256)
    {
        // owner must be sender
        require(_owner != address(0));

        uint256 tokenID = ethernautsStorage.createAsset(
            _creatorTokenID,
            _owner,
            _price,
            _assetID,
            _category,
            uint8(AssetState.Available),
            _attributes,
            _stats,
            0,
            0
        );

        // emit the build event
        Build(
            _owner,
            tokenID,
            _assetID,
            _price
        );

        return tokenID;
    }

    /// @notice verify if token is in exploration time
    /// @param _tokenId The Token ID that can be upgraded
    function isExploring(uint256 _tokenId) public view returns (bool) {
        uint256 cooldown;
        uint64 cooldownEndBlock;
        (,,,,,cooldownEndBlock, cooldown,) = ethernautsStorage.assets(_tokenId);
        return (cooldown > now) || (cooldownEndBlock > uint64(block.number));
    }
}


/// @title The facet of the Ethernauts Logic contract handle all common code for logic/business contracts
/// @author Ethernatus - Fernando Pauer
contract EthernautsLogic is EthernautsOwnership {

    // Set in case the logic contract is broken and an upgrade is required
    address public newContractAddress;

    /// @dev Constructor
    function EthernautsLogic() public {
        // the creator of the contract is the initial CEO, COO, CTO
        ceoAddress = msg.sender;
        ctoAddress = msg.sender;
        cooAddress = msg.sender;
        oracleAddress = msg.sender;

        // Starts paused.
        paused = true;
    }

    /// @dev Used to mark the smart contract as upgraded, in case there is a serious
    ///  breaking bug. This method does nothing but keep track of the new contract and
    ///  emit a message indicating that the new address is set. It's up to clients of this
    ///  contract to update to the new contract address in that case. (This contract will
    ///  be paused indefinitely if such an upgrade takes place.)
    /// @param _v2Address new address
    function setNewAddress(address _v2Address) external onlyCTO whenPaused {
        // See README.md for updgrade plan
        newContractAddress = _v2Address;
        ContractUpgrade(_v2Address);
    }

    /// @dev set a new reference to the NFT ownership contract
    /// @param _CStorageAddress - address of a deployed contract implementing EthernautsStorage.
    function setEthernautsStorageContract(address _CStorageAddress) public onlyCLevel whenPaused {
        EthernautsStorage candidateContract = EthernautsStorage(_CStorageAddress);
        require(candidateContract.isEthernautsStorage());
        ethernautsStorage = candidateContract;
    }

    /// @dev Override unpause so it requires all external contract addresses
    ///  to be set before contract can be unpaused. Also, we can't have
    ///  newContractAddress set either, because then the contract was upgraded.
    /// @notice This is public rather than external so we can call super.unpause
    ///  without using an expensive CALL.
    function unpause() public onlyCEO whenPaused {
        require(ethernautsStorage != address(0));
        require(newContractAddress == address(0));
        // require this contract to have access to storage contract
        require(ethernautsStorage.contractsGrantedAccess(address(this)) == true);

        // Actually unpause the contract.
        super.unpause();
    }

    // @dev Allows the COO to capture the balance available to the contract.
    function withdrawBalances(address _to) public onlyCLevel {
        _to.transfer(this.balance);
    }

    /// return current contract balance
    function getBalance() public view onlyCLevel returns (uint256) {
        return this.balance;
    }
}

/// @title Storage contract for Ethernauts Data. Common structs and constants.
/// @notice This is our main data storage, constants and data types, plus
//          internal functions for managing the assets. It is isolated and only interface with
//          a list of granted contracts defined by CTO
/// @author Ethernauts - Fernando Pauer
contract EthernautsStorage is EthernautsAccessControl {

    function EthernautsStorage() public {
        // the creator of the contract is the initial CEO
        ceoAddress = msg.sender;

        // the creator of the contract is the initial CTO as well
        ctoAddress = msg.sender;

        // the creator of the contract is the initial CTO as well
        cooAddress = msg.sender;

        // the creator of the contract is the initial Oracle as well
        oracleAddress = msg.sender;
    }

    /// @notice No tipping!
    /// @dev Reject all Ether from being sent here. Hopefully, we can prevent user accidents.
    function() external payable {
        require(msg.sender == address(this));
    }

    /*** Mapping for Contracts with granted permission ***/
    mapping (address => bool) public contractsGrantedAccess;

    /// @dev grant access for a contract to interact with this contract.
    /// @param _v2Address The contract address to grant access
    function grantAccess(address _v2Address) public onlyCTO {
        // See README.md for updgrade plan
        contractsGrantedAccess[_v2Address] = true;
    }

    /// @dev remove access from a contract to interact with this contract.
    /// @param _v2Address The contract address to be removed
    function removeAccess(address _v2Address) public onlyCTO {
        // See README.md for updgrade plan
        delete contractsGrantedAccess[_v2Address];
    }

    /// @dev Only allow permitted contracts to interact with this contract
    modifier onlyGrantedContracts() {
        require(contractsGrantedAccess[msg.sender] == true);
        _;
    }

    modifier validAsset(uint256 _tokenId) {
        require(assets[_tokenId].ID > 0);
        _;
    }
    /*** DATA TYPES ***/

    /// @dev The main Ethernauts asset struct. Every asset in Ethernauts is represented by a copy
    ///  of this structure. Note that the order of the members in this structure
    ///  is important because of the byte-packing rules used by Ethereum.
    ///  Ref: http://solidity.readthedocs.io/en/develop/miscellaneous.html
    struct Asset {

        // Asset ID is a identifier for look and feel in frontend
        uint16 ID;

        // Category = Sectors, Manufacturers, Ships, Objects (Upgrades/Misc), Factories and CrewMembers
        uint8 category;

        // The State of an asset: Available, On sale, Up for lease, Cooldown, Exploring
        uint8 state;

        // Attributes
        // byte pos - Definition
        // 00000001 - Seeded - Offered to the economy by us, the developers. Potentially at regular intervals.
        // 00000010 - Producible - Product of a factory and/or factory contract.
        // 00000100 - Explorable- Product of exploration.
        // 00001000 - Leasable - Can be rented to other users and will return to the original owner once the action is complete.
        // 00010000 - Permanent - Cannot be removed, always owned by a user.
        // 00100000 - Consumable - Destroyed after N exploration expeditions.
        // 01000000 - Tradable - Buyable and sellable on the market.
        // 10000000 - Hot Potato - Automatically gets put up for sale after acquiring.
        bytes2 attributes;

        // The timestamp from the block when this asset was created.
        uint64 createdAt;

        // The minimum timestamp after which this asset can engage in exploring activities again.
        uint64 cooldownEndBlock;

        // The Asset's stats can be upgraded or changed based on exploration conditions.
        // It will be defined per child contract, but all stats have a range from 0 to 255
        // Examples
        // 0 = Ship Level
        // 1 = Ship Attack
        uint8[STATS_SIZE] stats;

        // Set to the cooldown time that represents exploration duration for this asset.
        // Defined by a successful exploration action, regardless of whether this asset is acting as ship or a part.
        uint256 cooldown;

        // a reference to a super asset that manufactured the asset
        uint256 builtBy;
    }

    /*** CONSTANTS ***/

    // @dev Sanity check that allows us to ensure that we are pointing to the
    //  right storage contract in our EthernautsLogic(address _CStorageAddress) call.
    bool public isEthernautsStorage = true;

    /*** STORAGE ***/

    /// @dev An array containing the Asset struct for all assets in existence. The Asset UniqueId
    ///  of each asset is actually an index into this array.
    Asset[] public assets;

    /// @dev A mapping from Asset UniqueIDs to the price of the token.
    /// stored outside Asset Struct to save gas, because price can change frequently
    mapping (uint256 => uint256) internal assetIndexToPrice;

    /// @dev A mapping from asset UniqueIDs to the address that owns them. All assets have some valid owner address.
    mapping (uint256 => address) internal assetIndexToOwner;

    // @dev A mapping from owner address to count of tokens that address owns.
    //  Used internally inside balanceOf() to resolve ownership count.
    mapping (address => uint256) internal ownershipTokenCount;

    /// @dev A mapping from AssetUniqueIDs to an address that has been approved to call
    ///  transferFrom(). Each Asset can only have one approved address for transfer
    ///  at any time. A zero value means no approval is outstanding.
    mapping (uint256 => address) internal assetIndexToApproved;


    /*** SETTERS ***/

    /// @dev set new asset price
    /// @param _tokenId  asset UniqueId
    /// @param _price    asset price
    function setPrice(uint256 _tokenId, uint256 _price) public onlyGrantedContracts {
        assetIndexToPrice[_tokenId] = _price;
    }

    /// @dev Mark transfer as approved
    /// @param _tokenId  asset UniqueId
    /// @param _approved address approved
    function approve(uint256 _tokenId, address _approved) public onlyGrantedContracts {
        assetIndexToApproved[_tokenId] = _approved;
    }

    /// @dev Assigns ownership of a specific Asset to an address.
    /// @param _from    current owner address
    /// @param _to      new owner address
    /// @param _tokenId asset UniqueId
    function transfer(address _from, address _to, uint256 _tokenId) public onlyGrantedContracts {
        // Since the number of assets is capped to 2^32 we can't overflow this
        ownershipTokenCount[_to]++;
        // transfer ownership
        assetIndexToOwner[_tokenId] = _to;
        // When creating new assets _from is 0x0, but we can't account that address.
        if (_from != address(0)) {
            ownershipTokenCount[_from]--;
            // clear any previously approved ownership exchange
            delete assetIndexToApproved[_tokenId];
        }
    }

    /// @dev A public method that creates a new asset and stores it. This
    ///  method does basic checking and should only be called from other contract when the
    ///  input data is known to be valid. Will NOT generate any event it is delegate to business logic contracts.
    /// @param _creatorTokenID The asset who is father of this asset
    /// @param _owner First owner of this asset
    /// @param _price asset price
    /// @param _ID asset ID
    /// @param _category see Asset Struct description
    /// @param _state see Asset Struct description
    /// @param _attributes see Asset Struct description
    /// @param _stats see Asset Struct description
    function createAsset(
        uint256 _creatorTokenID,
        address _owner,
        uint256 _price,
        uint16 _ID,
        uint8 _category,
        uint8 _state,
        uint8 _attributes,
        uint8[STATS_SIZE] _stats,
        uint256 _cooldown,
        uint64 _cooldownEndBlock
    )
    public onlyGrantedContracts
    returns (uint256)
    {
        // Ensure our data structures are always valid.
        require(_ID > 0);
        require(_category > 0);
        require(_attributes != 0x0);
        require(_stats.length > 0);

        Asset memory asset = Asset({
            ID: _ID,
            category: _category,
            builtBy: _creatorTokenID,
            attributes: bytes2(_attributes),
            stats: _stats,
            state: _state,
            createdAt: uint64(now),
            cooldownEndBlock: _cooldownEndBlock,
            cooldown: _cooldown
        });

        uint256 newAssetUniqueId = assets.push(asset) - 1;

        // Check it reached 4 billion assets but let's just be 100% sure.
        require(newAssetUniqueId == uint256(uint32(newAssetUniqueId)));

        // store price
        assetIndexToPrice[newAssetUniqueId] = _price;

        // This will assign ownership
        transfer(address(0), _owner, newAssetUniqueId);

        return newAssetUniqueId;
    }

    /// @dev A public method that edit asset in case of any mistake is done during process of creation by the developer. This
    /// This method doesn't do any checking and should only be called when the
    ///  input data is known to be valid.
    /// @param _tokenId The token ID
    /// @param _creatorTokenID The asset that create that token
    /// @param _price asset price
    /// @param _ID asset ID
    /// @param _category see Asset Struct description
    /// @param _state see Asset Struct description
    /// @param _attributes see Asset Struct description
    /// @param _stats see Asset Struct description
    /// @param _cooldown asset cooldown index
    function editAsset(
        uint256 _tokenId,
        uint256 _creatorTokenID,
        uint256 _price,
        uint16 _ID,
        uint8 _category,
        uint8 _state,
        uint8 _attributes,
        uint8[STATS_SIZE] _stats,
        uint16 _cooldown
    )
    external validAsset(_tokenId) onlyCLevel
    returns (uint256)
    {
        // Ensure our data structures are always valid.
        require(_ID > 0);
        require(_category > 0);
        require(_attributes != 0x0);
        require(_stats.length > 0);

        // store price
        assetIndexToPrice[_tokenId] = _price;

        Asset storage asset = assets[_tokenId];
        asset.ID = _ID;
        asset.category = _category;
        asset.builtBy = _creatorTokenID;
        asset.attributes = bytes2(_attributes);
        asset.stats = _stats;
        asset.state = _state;
        asset.cooldown = _cooldown;
    }

    /// @dev Update only stats
    /// @param _tokenId asset UniqueId
    /// @param _stats asset state, see Asset Struct description
    function updateStats(uint256 _tokenId, uint8[STATS_SIZE] _stats) public validAsset(_tokenId) onlyGrantedContracts {
        assets[_tokenId].stats = _stats;
    }

    /// @dev Update only asset state
    /// @param _tokenId asset UniqueId
    /// @param _state asset state, see Asset Struct description
    function updateState(uint256 _tokenId, uint8 _state) public validAsset(_tokenId) onlyGrantedContracts {
        assets[_tokenId].state = _state;
    }

    /// @dev Update Cooldown for a single asset
    /// @param _tokenId asset UniqueId
    /// @param _cooldown asset state, see Asset Struct description
    function setAssetCooldown(uint256 _tokenId, uint256 _cooldown, uint64 _cooldownEndBlock)
    public validAsset(_tokenId) onlyGrantedContracts {
        assets[_tokenId].cooldown = _cooldown;
        assets[_tokenId].cooldownEndBlock = _cooldownEndBlock;
    }

    /*** GETTERS ***/

    /// @notice Returns only stats data about a specific asset.
    /// @dev it is necessary due solidity compiler limitations
    ///      when we have large qty of parameters it throws StackTooDeepException
    /// @param _tokenId The UniqueId of the asset of interest.
    function getStats(uint256 _tokenId) public view returns (uint8[STATS_SIZE]) {
        return assets[_tokenId].stats;
    }

    /// @dev return current price of an asset
    /// @param _tokenId asset UniqueId
    function priceOf(uint256 _tokenId) public view returns (uint256 price) {
        return assetIndexToPrice[_tokenId];
    }

    /// @notice Check if asset has all attributes passed by parameter
    /// @param _tokenId The UniqueId of the asset of interest.
    /// @param _attributes see Asset Struct description
    function hasAllAttrs(uint256 _tokenId, bytes2 _attributes) public view returns (bool) {
        return assets[_tokenId].attributes & _attributes == _attributes;
    }

    /// @notice Check if asset has any attribute passed by parameter
    /// @param _tokenId The UniqueId of the asset of interest.
    /// @param _attributes see Asset Struct description
    function hasAnyAttrs(uint256 _tokenId, bytes2 _attributes) public view returns (bool) {
        return assets[_tokenId].attributes & _attributes != 0x0;
    }

    /// @notice Check if asset is in the state passed by parameter
    /// @param _tokenId The UniqueId of the asset of interest.
    /// @param _category see AssetCategory in EthernautsBase for possible states
    function isCategory(uint256 _tokenId, uint8 _category) public view returns (bool) {
        return assets[_tokenId].category == _category;
    }

    /// @notice Check if asset is in the state passed by parameter
    /// @param _tokenId The UniqueId of the asset of interest.
    /// @param _state see enum AssetState in EthernautsBase for possible states
    function isState(uint256 _tokenId, uint8 _state) public view returns (bool) {
        return assets[_tokenId].state == _state;
    }

    /// @notice Returns owner of a given Asset(Token).
    /// @dev Required for ERC-721 compliance.
    /// @param _tokenId asset UniqueId
    function ownerOf(uint256 _tokenId) public view returns (address owner)
    {
        return assetIndexToOwner[_tokenId];
    }

    /// @dev Required for ERC-721 compliance
    /// @notice Returns the number of Assets owned by a specific address.
    /// @param _owner The owner address to check.
    function balanceOf(address _owner) public view returns (uint256 count) {
        return ownershipTokenCount[_owner];
    }

    /// @dev Checks if a given address currently has transferApproval for a particular Asset.
    /// @param _tokenId asset UniqueId
    function approvedFor(uint256 _tokenId) public view onlyGrantedContracts returns (address) {
        return assetIndexToApproved[_tokenId];
    }

    /// @notice Returns the total number of Assets currently in existence.
    /// @dev Required for ERC-721 compliance.
    function totalSupply() public view returns (uint256) {
        return assets.length;
    }

    /// @notice List all existing tokens. It can be filtered by attributes or assets with owner
    /// @param _owner filter all assets by owner
    function getTokenList(address _owner, uint8 _withAttributes, uint256 start, uint256 count) external view returns(
        uint256[6][]
    ) {
        uint256 totalAssets = assets.length;

        if (totalAssets == 0) {
            // Return an empty array
            return new uint256[6][](0);
        } else {
            uint256[6][] memory result = new uint256[6][](totalAssets > count ? count : totalAssets);
            uint256 resultIndex = 0;
            bytes2 hasAttributes  = bytes2(_withAttributes);
            Asset memory asset;

            for (uint256 tokenId = start; tokenId < totalAssets && resultIndex < count; tokenId++) {
                asset = assets[tokenId];
                if (
                    (asset.state != uint8(AssetState.Used)) &&
                    (assetIndexToOwner[tokenId] == _owner || _owner == address(0)) &&
                    (asset.attributes & hasAttributes == hasAttributes)
                ) {
                    result[resultIndex][0] = tokenId;
                    result[resultIndex][1] = asset.ID;
                    result[resultIndex][2] = asset.category;
                    result[resultIndex][3] = uint256(asset.attributes);
                    result[resultIndex][4] = asset.cooldown;
                    result[resultIndex][5] = assetIndexToPrice[tokenId];
                    resultIndex++;
                }
            }

            return result;
        }
    }
}


/// @title The facet of the Ethernauts Explore contract that send a ship to explore the deep space.
/// @notice An owned ship can be send on an expedition. Exploration takes time
//          and will always result in “success”. This means the ship can never be destroyed
//          and always returns with a collection of loot. The degree of success is dependent
//          on different factors as sector stats, gamma ray burst number and ship stats.
//          While the ship is exploring it cannot be acted on in any way until the expedition completes.
//          After the ship returns from an expedition the user is then rewarded with a number of objects (assets).
/// @author Ethernatus - Fernando Pauer
contract EthernautsExplore is EthernautsLogic {

    /// @dev Delegate constructor to Nonfungible contract.
    function EthernautsExplore() public
    EthernautsLogic() {}

    /*** EVENTS ***/
    /// emit signal to anyone listening in the universe
    event Explore(uint256 indexed shipId, uint256 indexed sectorID, uint256 time);

    event Result(uint256 indexed shipId, uint256 indexed sectorID);

    /*** CONSTANTS ***/

    // An approximation of currently how many seconds are in between blocks.
    uint256 public secondsPerBlock = 15;

    uint256 public TICK_TIME = 15; // time is always in minutes

    // exploration fee
    uint256 public percentageCut  = 90;
    uint256 public oracleFee      = 2000000; // wei
    uint256 public sectorOwnerCut = 0.01 ether;

    int256 public SPEED_STAT_MAX = 30;
    int256 public RANGE_STAT_MAX = 20;
    int256 public MIN_TIME_EXPLORE = 60;
    int256 public MAX_TIME_EXPLORE = 2160;
    int256 public RANGE_SCALE = 2;

    /// @dev Sector stats
    enum SectorStats {Volume, Threat, Difficulty}

    /// @dev hold all ships in exploration
    uint256[] explorers;

    /// @dev A mapping from Asset UniqueIDs to the exploration index.
    mapping (uint256 => uint256) internal tokenIndexToExplore;

    /// @dev A mapping from Asset UniqueIDs to the sector token id.
    mapping (uint256 => uint256) internal tokenIndexToSector;

    /// @dev Get a list of ship exploring our universe
    function getExplorerList() public view returns(
        uint256[4][]
    ) {
        uint256[4][] memory tokens = new uint256[4][](explorers.length);
        uint256 index = 0;
        uint16 ID;
        uint8 state;

        for(uint256 i = 0; i < explorers.length; i++) {
            if (explorers[i] != 0) {
                (ID,,state,,,,,) = ethernautsStorage.assets(explorers[i]);
                tokens[index][0] = explorers[i];
                tokens[index][1] = ID;
                tokens[index][2] = state;
                tokens[index][3] = tokenIndexToSector[explorers[i]];

                index++;
            }
        }

        if (index == 0) {
            // Return an empty array
            return new uint256[4][](0);
        } else {
            return tokens;
        }
    }

    function setTickTime(uint256 _tickTime) external onlyCLevel {
        TICK_TIME = _tickTime;
    }

    function setSectorOwnerCut(uint256 _sectorOwnerCut) external onlyCLevel {
        sectorOwnerCut = _sectorOwnerCut;
    }

    function setOracleFee(uint256 _oracleFee) external onlyCLevel {
        oracleFee = _oracleFee;
    }

    function setPercentageCut(uint256 _percentageCut) external onlyCLevel {
        percentageCut = _percentageCut;
    }


    /// @notice Explore a sector with a defined ship. Sectors contain a list of Objects that can be given to the players
    /// when exploring. Each entry has a Drop Rate and are sorted by Sector ID and Drop rate.
    /// The drop rate is a whole number between 0 and 1,000,000. 0 is 0% and 1,000,000 is 100%.
    /// Every time a Sector is explored a random number between 0 and 1,000,000 is calculated for each available Object.
    /// If the final result is lower than the Drop Rate of the Object, that Object will be rewarded to the player once
    /// Exploration is complete. Only 1 to 5 Objects maximum can be dropped during one exploration.
    /// (FUTURE VERSIONS) The final number will be affected by the user’s Ship Stats.
    /// @param _shipTokenId The Token ID that represents a ship and can explore
    /// @param _sectorTokenId The Token ID that represents a sector and can be explored
    function explore(uint256 _shipTokenId, uint256 _sectorTokenId) payable external whenNotPaused {
        // charge a fee for each exploration when the results are ready
        require(msg.value >= sectorOwnerCut);

        // check if Asset is a ship or not
        require(ethernautsStorage.isCategory(_shipTokenId, uint8(AssetCategory.Ship)));

        // check if _sectorTokenId is a sector or not
        require(ethernautsStorage.isCategory(_sectorTokenId, uint8(AssetCategory.Sector)));

        // Ensure the Ship is in available state, otherwise it cannot explore
        require(ethernautsStorage.isState(_shipTokenId, uint8(AssetState.Available)));

        // ship could not be in exploration
        require(!isExploring(_shipTokenId));

        // check if explorer is ship owner
        require(msg.sender == ethernautsStorage.ownerOf(_shipTokenId));

        // check if owner sector is not empty
        address sectorOwner = ethernautsStorage.ownerOf(_sectorTokenId);
        require(sectorOwner != address(0));

        /// mark as exploring
        tokenIndexToExplore[_shipTokenId] = explorers.push(_shipTokenId) - 1;
        tokenIndexToSector[_shipTokenId] = _sectorTokenId;

        uint8[STATS_SIZE] memory _shipStats = ethernautsStorage.getStats(_shipTokenId);
        uint8[STATS_SIZE] memory _sectorStats = ethernautsStorage.getStats(_sectorTokenId);

        /// set exploration time
        uint256 time = uint256(_explorationTime(
                _shipStats[uint256(ShipStats.Range)],
                _shipStats[uint256(ShipStats.Speed)],
                _sectorStats[uint256(SectorStats.Volume)]
            ));
        // exploration time in minutes converted to seconds
        time *= 60;

        uint64 _cooldownEndBlock = uint64((time/secondsPerBlock) + block.number);
        ethernautsStorage.setAssetCooldown(_shipTokenId, now + time, _cooldownEndBlock);

        // to avoid mistakes and charge unnecessary extra fees
        uint256 feeExcess = SafeMath.sub(msg.value, sectorOwnerCut);
        uint256 payment = uint256(SafeMath.div(SafeMath.mul(msg.value, percentageCut), 100)) - oracleFee;

        /// emit signal to anyone listening in the universe
        Explore(_shipTokenId, _sectorTokenId, now + time);

        // keeping oracle accounts with balance
        oracleAddress.transfer(oracleFee);

        // paying sector owner
        sectorOwner.transfer(payment);

        // send excess back to explorer
        msg.sender.transfer(feeExcess);
    }

    /// @notice Exploration is complete and 5 Objects maximum will be dropped during one exploration.
    /// @param _shipTokenId The Token ID that represents a ship and can explore
    /// @param _sectorTokenId The Token ID that represents a sector and can be explored
    /// @param _IDs that represents a object returned from exploration
    /// @param _attributes that represents attributes for each object returned from exploration
    /// @param _stats that represents all stats for each object returned from exploration
    function explorationResults(
        uint256 _shipTokenId,
        uint256 _sectorTokenId,
        uint16[5] _IDs,
        uint8[5] _attributes,
        uint8[STATS_SIZE][5] _stats
    )
    external onlyOracle
    {
        uint256 cooldown;
        uint64 cooldownEndBlock;
        uint256 builtBy;
        (,,,,,cooldownEndBlock, cooldown, builtBy) = ethernautsStorage.assets(_shipTokenId);

        address owner = ethernautsStorage.ownerOf(_shipTokenId);
        require(owner != address(0));

        /// create objects returned from exploration
        for (uint256 i = 0; i < 5; i++) {
            _buildAsset(
                _sectorTokenId,
                owner,
                0,
                _IDs[i],
                uint8(AssetCategory.Object),
                uint8(_attributes[i]),
                _stats[i],
                cooldown,
                cooldownEndBlock
            );
        }

        /// remove from explore list
        delete explorers[tokenIndexToExplore[_shipTokenId]];
        delete tokenIndexToSector[_shipTokenId];

        /// emit signal to anyone listening in the universe
        Result(_shipTokenId, _sectorTokenId);
    }

    /// @dev Creates a new Asset with the given fields. ONly available for C Levels
    /// @param _creatorTokenID The asset who is father of this asset
    /// @param _price asset price
    /// @param _assetID asset ID
    /// @param _category see Asset Struct description
    /// @param _attributes see Asset Struct description
    /// @param _stats see Asset Struct description
    /// @param _cooldown see Asset Struct description
    /// @param _cooldownEndBlock see Asset Struct description
    function _buildAsset(
        uint256 _creatorTokenID,
        address _owner,
        uint256 _price,
        uint16 _assetID,
        uint8 _category,
        uint8 _attributes,
        uint8[STATS_SIZE] _stats,
        uint256 _cooldown,
        uint64 _cooldownEndBlock
    )
    private returns (uint256)
    {
        uint256 tokenID = ethernautsStorage.createAsset(
            _creatorTokenID,
            _owner,
            _price,
            _assetID,
            _category,
            uint8(AssetState.Available),
            _attributes,
            _stats,
            _cooldown,
            _cooldownEndBlock
        );

        // emit the build event
        Build(
            _owner,
            tokenID,
            _assetID,
            _price
        );

        return tokenID;
    }

    /// @notice Exploration Time: The time it takes to explore a Sector is dependent on the Sector Volume
    ///         along with the Ship’s Range and Speed.
    /// @param _shipRange ship range
    /// @param _shipSpeed ship speed
    /// @param _sectorVolume sector volume
    function _explorationTime(
        uint8 _shipRange,
        uint8 _shipSpeed,
        uint8 _sectorVolume
    ) private view returns (int256) {
        int256 minToExplore = 0;

        minToExplore = SafeMath.min(_shipSpeed, SPEED_STAT_MAX) - 1;
        minToExplore = -72 * minToExplore;
        minToExplore += MAX_TIME_EXPLORE;

        uint256 minRange = uint256(SafeMath.min(_shipRange, RANGE_STAT_MAX));
        uint256 scaledRange = uint256(RANGE_STAT_MAX * RANGE_SCALE);
        int256 minExplore = (minToExplore - MIN_TIME_EXPLORE);

        minToExplore -= fraction(minExplore, int256(minRange), int256(scaledRange));
        minToExplore += fraction(minToExplore, (_sectorVolume - 10), 10);
        minToExplore = SafeMath.max(minToExplore, MIN_TIME_EXPLORE);

        return minToExplore;
    }

    /// @notice calcs a perc without float or double :(
    function fraction(int256 _subject, int256 _numerator, int256 _denominator)
    private pure returns (int256) {
        int256 division = _subject * _numerator - _subject * _denominator;
        int256 total = _subject * _denominator + division;
        return total / _denominator;
    }

    /// @notice Any C-level can fix how many seconds per blocks are currently observed.
    /// @param _secs The seconds per block
    function setSecondsPerBlock(uint256 _secs) external onlyCLevel {
        require(_secs > 0);
        secondsPerBlock = _secs;
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"name":"_interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TICK_TIME","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ceoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_TIME_EXPLORE","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"implementsERC721","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"getBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ctoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newCEO","type":"address"}],"name":"setCEO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getExplorerList","outputs":[{"name":"","type":"uint256[4][]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newCOO","type":"address"}],"name":"setCOO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ATTR_GOLDENGOOSE","outputs":[{"name":"","type":"bytes2"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_sectorOwnerCut","type":"uint256"}],"name":"setSectorOwnerCut","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_CStorageAddress","type":"address"}],"name":"setEthernautsStorageContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ethernautsStorage","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_secs","type":"uint256"}],"name":"setSecondsPerBlock","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ATTR_SEEDED","outputs":[{"name":"","type":"bytes2"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"newContractAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"SPEED_STAT_MAX","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_creatorTokenID","type":"uint256"},{"name":"_owner","type":"address"},{"name":"_price","type":"uint256"},{"name":"_assetID","type":"uint16"},{"name":"_category","type":"uint8"},{"name":"_attributes","type":"uint8"},{"name":"_stats","type":"uint8[10]"}],"name":"createNewAsset","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ATTR_TRADABLE","outputs":[{"name":"","type":"bytes2"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"count","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_v2Address","type":"address"}],"name":"setNewAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_percentageCut","type":"uint256"}],"name":"setPercentageCut","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"STATS_SIZE","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_shipTokenId","type":"uint256"},{"name":"_sectorTokenId","type":"uint256"},{"name":"_IDs","type":"uint16[5]"},{"name":"_attributes","type":"uint8[5]"},{"name":"_stats","type":"uint8[10][5]"}],"name":"explorationResults","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ATTR_LEASABLE","outputs":[{"name":"","type":"bytes2"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"RANGE_SCALE","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"secondsPerBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOracle","type":"address"}],"name":"setOracle","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ATTR_PRODUCIBLE","outputs":[{"name":"","type":"bytes2"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ATTR_CONSUMABLE","outputs":[{"name":"","type":"bytes2"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"oracleAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"SHIP_SLOTS","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"cooAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_TIME_EXPLORE","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"takeOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_oracleFee","type":"uint256"}],"name":"setOracleFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_shipTokenId","type":"uint256"},{"name":"_sectorTokenId","type":"uint256"}],"name":"explore","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"sectorOwnerCut","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ATTR_PERMANENT","outputs":[{"name":"","type":"bytes2"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"isExploring","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"}],"name":"withdrawBalances","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"RANGE_STAT_MAX","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tickTime","type":"uint256"}],"name":"setTickTime","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ATTR_EXPLORABLE","outputs":[{"name":"","type":"bytes2"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"percentageCut","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"oracleFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newCTO","type":"address"}],"name":"setCTO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"shipId","type":"uint256"},{"indexed":true,"name":"sectorID","type":"uint256"},{"indexed":false,"name":"time","type":"uint256"}],"name":"Explore","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"shipId","type":"uint256"},{"indexed":true,"name":"sectorID","type":"uint256"}],"name":"Result","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"tokens","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"approved","type":"address"},{"indexed":false,"name":"tokens","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"assetId","type":"uint16"},{"indexed":false,"name":"price","type":"uint256"}],"name":"Build","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newContract","type":"address"}],"name":"ContractUpgrade","type":"event"}]

606060405260017e01000000000000000000000000000000000000000000000000000000000000026000806101000a81548161ffff02191690837e010000000000000000000000000000000000000000000000000000000000009004021790555060027e0100000000000000000000000000000000000000000000000000000000000002600060026101000a81548161ffff02191690837e010000000000000000000000000000000000000000000000000000000000009004021790555060047e0100000000000000000000000000000000000000000000000000000000000002600060046101000a81548161ffff02191690837e010000000000000000000000000000000000000000000000000000000000009004021790555060087e0100000000000000000000000000000000000000000000000000000000000002600060066101000a81548161ffff02191690837e010000000000000000000000000000000000000000000000000000000000009004021790555060107e0100000000000000000000000000000000000000000000000000000000000002600060086101000a81548161ffff02191690837e010000000000000000000000000000000000000000000000000000000000009004021790555060207e01000000000000000000000000000000000000000000000000000000000000026000600a6101000a81548161ffff02191690837e010000000000000000000000000000000000000000000000000000000000009004021790555060407e01000000000000000000000000000000000000000000000000000000000000026000600c6101000a81548161ffff02191690837e010000000000000000000000000000000000000000000000000000000000009004021790555060807e01000000000000000000000000000000000000000000000000000000000000026000600e6101000a81548161ffff02191690837e01000000000000000000000000000000000000000000000000000000000000900402179055506000600460146101000a81548160ff021916908315150217905550600f600755600f600855605a600955621e8480600a55662386f26fc10000600b55601e600c556014600d55603c600e55610870600f556002601055341561034c57600080fd5b33600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600460146101000a81548160ff021916908315150217905550614f6c8061047a6000396000f3006060604052600436106102b4576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146102b957806302c9972c1461031357806306fdde031461033c578063095ea7b3146103ca5780630a0f81681461040c5780630be21ea9146104615780631051db341461048a57806312065fe0146104b757806318160ddd146104e05780631f5136601461050957806323b872dd1461055e57806327d7874c146105bf578063281972af146105f85780632ba73c15146106855780632d381f84146106be5780633f4ba83a1461072957806349ce58041461073e5780634b3afdd214610761578063564106371461079a5780635663896e146107ef5780635c975abb146108125780635ea396241461083f5780636352211e146108aa5780636af04a571461090d5780636b14dfe1146109625780636ca400931461098b5780636d18dc6314610a1757806370a0823114610a825780637158798814610acf578063733bf2f214610b08578063764b08c314610b2b578063771edc4c14610b5a57806378f1361414610b9c57806379eb26cc14610c075780637a7d493714610c305780637adbf97314610c595780638456cb5914610c925780638645a3da14610ca757806393e1595d14610d1257806395d89b4114610d7d578063a89ae4ba14610e0b578063a9059cbb14610e60578063aff4cbea14610ea2578063b047fb5014610ed1578063b15201b214610f26578063b2e6ceeb14610f4f578063b6d9ef6014610f72578063bbb21c4d14610f95578063c41728a714610fb6578063c459b00314610fdf578063c86dca5a1461104a578063ca64a02d14611085578063d0d9fcf7146110be578063eff35f75146110e7578063f2d5866d1461110a578063f4f4224614611175578063f9cd3ceb1461119e578063fe1439b4146111c7575b600080fd5b34156102c457600080fd5b6102f960048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050611200565b604051808215151515815260200191505060405180910390f35b341561031e57600080fd5b610326611548565b6040518082815260200191505060405180910390f35b341561034757600080fd5b61034f61154e565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561038f578082015181840152602081019050610374565b50505050905090810190601f1680156103bc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103d557600080fd5b61040a600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611587565b005b341561041757600080fd5b61041f61162b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561046c57600080fd5b610474611651565b6040518082815260200191505060405180910390f35b341561049557600080fd5b61049d611657565b604051808215151515815260200191505060405180910390f35b34156104c257600080fd5b6104ca611660565b6040518082815260200191505060405180910390f35b34156104eb57600080fd5b6104f361178b565b6040518082815260200191505060405180910390f35b341561051457600080fd5b61051c61183b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561056957600080fd5b6105bd600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611861565b005b34156105ca57600080fd5b6105f6600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061188d565b005b341561060357600080fd5b61060b611969565b60405180806020018281038252838181518152602001915080516000925b8184101561067457828490602001906020020151600460200280838360005b83811015610663578082015181840152602081019050610648565b505050509050019260010192610629565b925050509250505060405180910390f35b341561069057600080fd5b6106bc600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611ca3565b005b34156106c957600080fd5b6106d1611dd7565b60405180827dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b341561073457600080fd5b61073c611e08565b005b341561074957600080fd5b61075f6004808035906020019091905050612036565b005b341561076c57600080fd5b610798600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061214c565b005b34156107a557600080fd5b6107ad61234f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156107fa57600080fd5b6108106004808035906020019091905050612375565b005b341561081d57600080fd5b61082561249a565b604051808215151515815260200191505060405180910390f35b341561084a57600080fd5b6108526124ad565b60405180827dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b34156108b557600080fd5b6108cb60048080359060200190919050506124dd565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561091857600080fd5b6109206125d6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561096d57600080fd5b6109756125fc565b6040518082815260200191505060405180910390f35b341561099657600080fd5b610a01600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803561ffff1690602001909190803560ff1690602001909190803560ff169060200190919080610140019091905050612602565b6040518082815260200191505060405180910390f35b3415610a2257600080fd5b610a2a612943565b60405180827dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b3415610a8d57600080fd5b610ab9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612974565b6040518082815260200191505060405180910390f35b3415610ada57600080fd5b610b06600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612a5d565b005b3415610b1357600080fd5b610b296004808035906020019091905050612b7b565b005b3415610b3657600080fd5b610b3e612c91565b604051808260ff1660ff16815260200191505060405180910390f35b3415610b6557600080fd5b610b9a6004808035906020019091908035906020019091908060a0019091908060a00190919080610640019091905050612c96565b005b3415610ba757600080fd5b610baf613014565b60405180827dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b3415610c1257600080fd5b610c1a613045565b6040518082815260200191505060405180910390f35b3415610c3b57600080fd5b610c4361304b565b6040518082815260200191505060405180910390f35b3415610c6457600080fd5b610c90600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613051565b005b3415610c9d57600080fd5b610ca561312d565b005b3415610cb257600080fd5b610cba613272565b60405180827dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b3415610d1d57600080fd5b610d256132a3565b60405180827dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b3415610d8857600080fd5b610d906132d4565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610dd0578082015181840152602081019050610db5565b50505050905090810190601f168015610dfd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610e1657600080fd5b610e1e61330d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610e6b57600080fd5b610ea0600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050613333565b005b3415610ead57600080fd5b610eb5613548565b604051808260ff1660ff16815260200191505060405180910390f35b3415610edc57600080fd5b610ee461354d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610f3157600080fd5b610f39613573565b6040518082815260200191505060405180910390f35b3415610f5a57600080fd5b610f706004808035906020019091905050613579565b005b3415610f7d57600080fd5b610f93600480803590602001909190505061367c565b005b610fb46004808035906020019091908035906020019091905050613792565b005b3415610fc157600080fd5b610fc96140c5565b6040518082815260200191505060405180910390f35b3415610fea57600080fd5b610ff26140cb565b60405180827dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b341561105557600080fd5b61106b60048080359060200190919050506140fc565b604051808215151515815260200191505060405180910390f35b341561109057600080fd5b6110bc600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050614232565b005b34156110c957600080fd5b6110d1614398565b6040518082815260200191505060405180910390f35b34156110f257600080fd5b611108600480803590602001909190505061439e565b005b341561111557600080fd5b61111d6144b4565b60405180827dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b341561118057600080fd5b6111886144e5565b6040518082815260200191505060405180910390f35b34156111a957600080fd5b6111b16144eb565b6040518082815260200191505060405180910390f35b34156111d257600080fd5b6111fe600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506144f1565b005b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611541575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f74616b654f776e6572736869702875696e7432353629000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d652829000000000000000000000000000000000000000000000000000081525060060190506040518091039020181818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60085481565b6040805190810160405280600a81526020017f45746865726e617574730000000000000000000000000000000000000000000081525081565b600460149054906101000a900460ff161515156115a357600080fd5b6115ad3382614625565b15156115b857600080fd5b6115c28183614711565b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a35050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f5481565b60006001905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061170b5750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806117635750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561176e57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff1631905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561181b57600080fd5b6102c65a03f1151561182c57600080fd5b50505060405180519050905090565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460149054906101000a900460ff1615151561187d57600080fd5b6118888383836147ed565b505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118e957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561192557600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611971614e87565b611979614e87565b6000806000806011805490506040518059106119925750595b9080825280602002602001820160405280156119c857816020015b6119b5614e9b565b8152602001906001900390816119ad5790505b50945060009350600090505b601180549050811015611c415760006011828154811015156119f257fe5b906000526020600020900154141515611c3457600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cf35bdd0601183815481101515611a5257fe5b906000526020600020900154600060405161010001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505061010060405180830381600087803b1515611aba57600080fd5b6102c65a03f11515611acb57600080fd5b50505060405180519060200180519060200180519060200180519060200180519060200180519060200180519060200180519050909192939495509091929350909192509091509050508093508194505050601181815481101515611b2c57fe5b9060005260206000209001548585815181101515611b4657fe5b906020019060200201516000600481101515611b5e57fe5b6020020181815250508261ffff168585815181101515611b7a57fe5b906020019060200201516001600481101515611b9257fe5b6020020181815250508160ff168585815181101515611bad57fe5b906020019060200201516002600481101515611bc557fe5b60200201818152505060136000601183815481101515611be157fe5b9060005260206000209001548152602001908152602001600020548585815181101515611c0a57fe5b906020019060200201516003600481101515611c2257fe5b60200201818152505083806001019450505b80806001019150506119d4565b6000841415611c97576000604051805910611c595750595b908082528060200260200182016040528015611c8f57816020015b611c7c614e9b565b815260200190600190039081611c745790505b509550611c9b565b8495505b505050505090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611d4c5750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515611d5757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611d9357600080fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600e9054906101000a90047e010000000000000000000000000000000000000000000000000000000000000281565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611e6457600080fd5b600460149054906101000a900460ff161515611e7f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515611edd57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515611f3a57600080fd5b60011515600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632da22fc0306000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b151561200357600080fd5b6102c65a03f1151561201457600080fd5b50505060405180519050151514151561202c57600080fd5b612034614964565b565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806120df5750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806121375750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561214257600080fd5b80600b8190555050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806121f75750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061224f5750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561225a57600080fd5b600460149054906101000a900460ff16151561227557600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff1663ae61fcda6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156122e457600080fd5b6102c65a03f115156122f557600080fd5b50505060405180519050151561230a57600080fd5b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061241e5750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806124765750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561248157600080fd5b60008111151561249057600080fd5b8060078190555050565b600460149054906101000a900460ff1681565b6000809054906101000a90047e010000000000000000000000000000000000000000000000000000000000000281565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561257857600080fd5b6102c65a03f1151561258957600080fd5b505050604051805190509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156125d157600080fd5b919050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c5481565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806126ae5750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806127065750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561271157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415151561274d57600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631e8cdd0a8a8a8a8a8a6000600281111561279d57fe5b8b8b6000806000604051602001526040518b63ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808b81526020018a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018981526020018861ffff1661ffff1681526020018760ff1660ff1681526020018660ff1660ff1681526020018560ff1660ff16815260200184600a6020028082843782019150508381526020018267ffffffffffffffff1681526020019a5050505050505050505050602060405180830381600087803b151561289457600080fd5b6102c65a03f115156128a557600080fd5b5050506040518051905090507fbeb1fffdbea52fcb668386f7d55545fac4cb704f66674ba929c648e708f7c0208882888a604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018361ffff1661ffff16815260200182815260200194505050505060405180910390a180915050979650505050505050565b6000600c9054906101000a90047e010000000000000000000000000000000000000000000000000000000000000281565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1515612a3b57600080fd5b6102c65a03f11515612a4c57600080fd5b505050604051805190509050919050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612ab957600080fd5b600460149054906101000a900460ff161515612ad457600080fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f450db8da6efbe9c22f2347f7c2021231df1fc58d3ae9a2fa75d39fa44619930581604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612c245750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80612c7c5750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515612c8757600080fd5b8060098190555050565b600a81565b6000806000806000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612cfa57600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cf35bdd08b600060405161010001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505061010060405180830381600087803b1515612d9557600080fd5b6102c65a03f11515612da657600080fd5b50505060405180519060200180519060200180519060200180519060200180519060200180519060200180519060200180519050909192939495965090919293949550909192939450909192935090919250809550819750829650505050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8b6000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515612e9d57600080fd5b6102c65a03f11515612eae57600080fd5b505050604051805190509150600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612ef657600080fd5b600090505b6005811015612f9257612f84898360008b85600581101515612f1957fe5b602002013561ffff1660046006811115612f2f57fe5b8c87600581101515612f3d57fe5b602002013560ff168c88600581101515612f5357fe5b6101400201600a806020026040519081016040528092919082600a6020028082843782019150505050508c8c6149f8565b508080600101915050612efb565b6011601260008c815260200190815260200160002054815481101515612fb457fe5b906000526020600020900160009055601360008b815260200190815260200160002060009055888a7f34fa627446f032cedc60a5521c4a8fbdd28f3ce106d8c6f6c17322ada873cebb60405160405180910390a350505050505050505050565b600060069054906101000a90047e010000000000000000000000000000000000000000000000000000000000000281565b60105481565b60075481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156130ad57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156130e957600080fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806131d65750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061322e5750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561323957600080fd5b600460149054906101000a900460ff1615151561325557600080fd5b6001600460146101000a81548160ff021916908315150217905550565b600060029054906101000a90047e010000000000000000000000000000000000000000000000000000000000000281565b6000600a9054906101000a90047e010000000000000000000000000000000000000000000000000000000000000281565b6040805190810160405280600481526020017f45544e540000000000000000000000000000000000000000000000000000000081525081565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460149054906101000a900460ff1615151561334f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561338b57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156133c657600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561342357600080fd5b61342d3382614625565b151561343857600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663beabacc83384846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b151561353057600080fd5b6102c65a03f1151561354157600080fd5b5050505050565b600581565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561361457600080fd5b6102c65a03f1151561362557600080fd5b505050604051805190509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561366d57600080fd5b6136788133846147ed565b5050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806137255750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061377d5750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561378857600080fd5b80600a8190555050565b600061379c614ec3565b6137a4614ec3565b600080600080600460149054906101000a900460ff161515156137c657600080fd5b600b5434101515156137d757600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663660250478a6003600681111561382357fe5b6000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808381526020018260ff1660ff16815260200192505050602060405180830381600087803b151561388a57600080fd5b6102c65a03f1151561389b57600080fd5b5050506040518051905015156138b057600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636602504789600160068111156138fc57fe5b6000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808381526020018260ff1660ff16815260200192505050602060405180830381600087803b151561396357600080fd5b6102c65a03f1151561397457600080fd5b50505060405180519050151561398957600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ef816fd98a600060028111156139d557fe5b6000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808381526020018260ff1660ff16815260200192505050602060405180830381600087803b1515613a3c57600080fd5b6102c65a03f11515613a4d57600080fd5b505050604051805190501515613a6257600080fd5b613a6b896140fc565b151515613a7757600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8a6000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515613b1057600080fd5b6102c65a03f11515613b2157600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613b6457600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e896000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515613bfd57600080fd5b6102c65a03f11515613c0e57600080fd5b505050604051805190509650600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614151515613c5657600080fd5b600160118054806001018281613c6c9190614eef565b916000526020600020900160008c90919091505503601260008b81526020019081526020016000208190555087601360008b815260200190815260200160002081905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637b3039658a600060405161014001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505061014060405180830381600087803b1515613d4b57600080fd5b6102c65a03f11515613d5c57600080fd5b50505060405180610140016040529550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637b30396589600060405161014001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505061014060405180830381600087803b1515613e0757600080fd5b6102c65a03f11515613e1857600080fd5b50505060405180610140016040529450613e8d8660046005811115613e3957fe5b600a81101515613e4557fe5b60200201518760036005811115613e5857fe5b600a81101515613e6457fe5b60200201518760006002811115613e7757fe5b600a81101515613e8357fe5b6020020151614c1b565b9350603c840293504360075485811515613ea357fe5b04019250600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663058d4dd08a864201866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018267ffffffffffffffff1667ffffffffffffffff1681526020019350505050600060405180830381600087803b1515613f5d57600080fd5b6102c65a03f11515613f6e57600080fd5b505050613f7d34600b54614cc8565b9150600a54613f98613f9134600954614ce1565b6064614d1c565b03905087897f76dd98418c6ea6d8cbd6d45a8a55bf9b4755ce3650d24398a40c702e3c45e7f98642016040518082815260200191505060405180910390a3600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc600a549081150290604051600060405180830381858888f19350505050151561403a57600080fd5b8673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561407a57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015156140ba57600080fd5b505050505050505050565b600b5481565b600060089054906101000a90047e010000000000000000000000000000000000000000000000000000000000000281565b6000806000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cf35bdd085600060405161010001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505061010060405180830381600087803b151561419c57600080fd5b6102c65a03f115156141ad57600080fd5b505050604051805190602001805190602001805190602001805190602001805190602001805190602001805190602001805190509091929394959650909192939495509091929394509091929350909192505080935081925050504282118061422957504367ffffffffffffffff168167ffffffffffffffff16115b92505050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806142db5750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806143335750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561433e57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050151561439557600080fd5b50565b600d5481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806144475750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061449f5750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156144aa57600080fd5b8060088190555050565b600060049054906101000a90047e010000000000000000000000000000000000000000000000000000000000000281565b60095481565b600a5481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061459a5750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156145a557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156145e157600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008273ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e846000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15156146d757600080fd5b6102c65a03f115156146e857600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663febe490983836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b15156147d557600080fd5b6102c65a03f115156147e657600080fd5b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561482957600080fd5b6148338382614625565b151561483e57600080fd5b6148488282614d37565b151561485357600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663beabacc88484846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b151561494b57600080fd5b6102c65a03f1151561495c57600080fd5b505050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156149c057600080fd5b600460149054906101000a900460ff1615156149db57600080fd5b6000600460146101000a81548160ff021916908315150217905550565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631e8cdd0a8c8c8c8c8c60006002811115614a4b57fe5b8d8d8d8d6000604051602001526040518b63ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808b81526020018a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018981526020018861ffff1661ffff1681526020018760ff1660ff1681526020018660ff1660ff1681526020018560ff1660ff16815260200184600a60200280838360005b83811015614b1e578082015181840152602081019050614b03565b505050509050018381526020018267ffffffffffffffff1667ffffffffffffffff1681526020019a5050505050505050505050602060405180830381600087803b1515614b6a57600080fd5b6102c65a03f11515614b7b57600080fd5b5050506040518051905090507fbeb1fffdbea52fcb668386f7d55545fac4cb704f66674ba929c648e708f7c0208a828a8c604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018361ffff1661ffff16815260200182815260200194505050505060405180910390a1809150509998505050505050505050565b60008060008060008093506001614c378860ff16600c54614e23565b039350837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb8029350600f5484019350614c758860ff16600d54614e23565b9250601054600d54029150600e5484039050614c92818484614e3f565b84039350614ca884600a880360ff16600a614e3f565b84019350614cb884600e54614e6b565b9350839450505050509392505050565b6000828211151515614cd657fe5b818303905092915050565b6000806000841415614cf65760009150614d15565b8284029050828482811515614d0757fe5b04141515614d1157fe5b8091505b5092915050565b6000808284811515614d2a57fe5b0490508091505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632a6dd48f846000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515614de957600080fd5b6102c65a03f11515614dfa57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600081831215614e3557829050614e39565b8190505b92915050565b6000806000838602858702039150818487020190508381811515614e5f57fe5b05925050509392505050565b600081831315614e7d57829050614e81565b8190505b92915050565b602060405190810160405280600081525090565b6080604051908101604052806004905b6000815260200190600190039081614eab5790505090565b61014060405190810160405280600a905b600060ff16815260200190600190039081614ed45790505090565b815481835581811511614f1657818360005260206000209182019101614f159190614f1b565b5b505050565b614f3d91905b80821115614f39576000816000905550600101614f21565b5090565b905600a165627a7a72305820d26dc59fa0da2b885559e8f1b5e5f7273c09a417d7daf72e259590646cb8ec190029

Deployed Bytecode

0x6060604052600436106102b4576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146102b957806302c9972c1461031357806306fdde031461033c578063095ea7b3146103ca5780630a0f81681461040c5780630be21ea9146104615780631051db341461048a57806312065fe0146104b757806318160ddd146104e05780631f5136601461050957806323b872dd1461055e57806327d7874c146105bf578063281972af146105f85780632ba73c15146106855780632d381f84146106be5780633f4ba83a1461072957806349ce58041461073e5780634b3afdd214610761578063564106371461079a5780635663896e146107ef5780635c975abb146108125780635ea396241461083f5780636352211e146108aa5780636af04a571461090d5780636b14dfe1146109625780636ca400931461098b5780636d18dc6314610a1757806370a0823114610a825780637158798814610acf578063733bf2f214610b08578063764b08c314610b2b578063771edc4c14610b5a57806378f1361414610b9c57806379eb26cc14610c075780637a7d493714610c305780637adbf97314610c595780638456cb5914610c925780638645a3da14610ca757806393e1595d14610d1257806395d89b4114610d7d578063a89ae4ba14610e0b578063a9059cbb14610e60578063aff4cbea14610ea2578063b047fb5014610ed1578063b15201b214610f26578063b2e6ceeb14610f4f578063b6d9ef6014610f72578063bbb21c4d14610f95578063c41728a714610fb6578063c459b00314610fdf578063c86dca5a1461104a578063ca64a02d14611085578063d0d9fcf7146110be578063eff35f75146110e7578063f2d5866d1461110a578063f4f4224614611175578063f9cd3ceb1461119e578063fe1439b4146111c7575b600080fd5b34156102c457600080fd5b6102f960048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050611200565b604051808215151515815260200191505060405180910390f35b341561031e57600080fd5b610326611548565b6040518082815260200191505060405180910390f35b341561034757600080fd5b61034f61154e565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561038f578082015181840152602081019050610374565b50505050905090810190601f1680156103bc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103d557600080fd5b61040a600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611587565b005b341561041757600080fd5b61041f61162b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561046c57600080fd5b610474611651565b6040518082815260200191505060405180910390f35b341561049557600080fd5b61049d611657565b604051808215151515815260200191505060405180910390f35b34156104c257600080fd5b6104ca611660565b6040518082815260200191505060405180910390f35b34156104eb57600080fd5b6104f361178b565b6040518082815260200191505060405180910390f35b341561051457600080fd5b61051c61183b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561056957600080fd5b6105bd600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611861565b005b34156105ca57600080fd5b6105f6600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061188d565b005b341561060357600080fd5b61060b611969565b60405180806020018281038252838181518152602001915080516000925b8184101561067457828490602001906020020151600460200280838360005b83811015610663578082015181840152602081019050610648565b505050509050019260010192610629565b925050509250505060405180910390f35b341561069057600080fd5b6106bc600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611ca3565b005b34156106c957600080fd5b6106d1611dd7565b60405180827dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b341561073457600080fd5b61073c611e08565b005b341561074957600080fd5b61075f6004808035906020019091905050612036565b005b341561076c57600080fd5b610798600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061214c565b005b34156107a557600080fd5b6107ad61234f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156107fa57600080fd5b6108106004808035906020019091905050612375565b005b341561081d57600080fd5b61082561249a565b604051808215151515815260200191505060405180910390f35b341561084a57600080fd5b6108526124ad565b60405180827dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b34156108b557600080fd5b6108cb60048080359060200190919050506124dd565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561091857600080fd5b6109206125d6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561096d57600080fd5b6109756125fc565b6040518082815260200191505060405180910390f35b341561099657600080fd5b610a01600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803561ffff1690602001909190803560ff1690602001909190803560ff169060200190919080610140019091905050612602565b6040518082815260200191505060405180910390f35b3415610a2257600080fd5b610a2a612943565b60405180827dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b3415610a8d57600080fd5b610ab9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612974565b6040518082815260200191505060405180910390f35b3415610ada57600080fd5b610b06600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612a5d565b005b3415610b1357600080fd5b610b296004808035906020019091905050612b7b565b005b3415610b3657600080fd5b610b3e612c91565b604051808260ff1660ff16815260200191505060405180910390f35b3415610b6557600080fd5b610b9a6004808035906020019091908035906020019091908060a0019091908060a00190919080610640019091905050612c96565b005b3415610ba757600080fd5b610baf613014565b60405180827dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b3415610c1257600080fd5b610c1a613045565b6040518082815260200191505060405180910390f35b3415610c3b57600080fd5b610c4361304b565b6040518082815260200191505060405180910390f35b3415610c6457600080fd5b610c90600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613051565b005b3415610c9d57600080fd5b610ca561312d565b005b3415610cb257600080fd5b610cba613272565b60405180827dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b3415610d1d57600080fd5b610d256132a3565b60405180827dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b3415610d8857600080fd5b610d906132d4565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610dd0578082015181840152602081019050610db5565b50505050905090810190601f168015610dfd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610e1657600080fd5b610e1e61330d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610e6b57600080fd5b610ea0600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050613333565b005b3415610ead57600080fd5b610eb5613548565b604051808260ff1660ff16815260200191505060405180910390f35b3415610edc57600080fd5b610ee461354d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610f3157600080fd5b610f39613573565b6040518082815260200191505060405180910390f35b3415610f5a57600080fd5b610f706004808035906020019091905050613579565b005b3415610f7d57600080fd5b610f93600480803590602001909190505061367c565b005b610fb46004808035906020019091908035906020019091905050613792565b005b3415610fc157600080fd5b610fc96140c5565b6040518082815260200191505060405180910390f35b3415610fea57600080fd5b610ff26140cb565b60405180827dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b341561105557600080fd5b61106b60048080359060200190919050506140fc565b604051808215151515815260200191505060405180910390f35b341561109057600080fd5b6110bc600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050614232565b005b34156110c957600080fd5b6110d1614398565b6040518082815260200191505060405180910390f35b34156110f257600080fd5b611108600480803590602001909190505061439e565b005b341561111557600080fd5b61111d6144b4565b60405180827dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b341561118057600080fd5b6111886144e5565b6040518082815260200191505060405180910390f35b34156111a957600080fd5b6111b16144eb565b6040518082815260200191505060405180910390f35b34156111d257600080fd5b6111fe600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506144f1565b005b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611541575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f74616b654f776e6572736869702875696e7432353629000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d652829000000000000000000000000000000000000000000000000000081525060060190506040518091039020181818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60085481565b6040805190810160405280600a81526020017f45746865726e617574730000000000000000000000000000000000000000000081525081565b600460149054906101000a900460ff161515156115a357600080fd5b6115ad3382614625565b15156115b857600080fd5b6115c28183614711565b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a35050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f5481565b60006001905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061170b5750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806117635750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561176e57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff1631905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561181b57600080fd5b6102c65a03f1151561182c57600080fd5b50505060405180519050905090565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460149054906101000a900460ff1615151561187d57600080fd5b6118888383836147ed565b505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118e957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561192557600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611971614e87565b611979614e87565b6000806000806011805490506040518059106119925750595b9080825280602002602001820160405280156119c857816020015b6119b5614e9b565b8152602001906001900390816119ad5790505b50945060009350600090505b601180549050811015611c415760006011828154811015156119f257fe5b906000526020600020900154141515611c3457600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cf35bdd0601183815481101515611a5257fe5b906000526020600020900154600060405161010001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505061010060405180830381600087803b1515611aba57600080fd5b6102c65a03f11515611acb57600080fd5b50505060405180519060200180519060200180519060200180519060200180519060200180519060200180519060200180519050909192939495509091929350909192509091509050508093508194505050601181815481101515611b2c57fe5b9060005260206000209001548585815181101515611b4657fe5b906020019060200201516000600481101515611b5e57fe5b6020020181815250508261ffff168585815181101515611b7a57fe5b906020019060200201516001600481101515611b9257fe5b6020020181815250508160ff168585815181101515611bad57fe5b906020019060200201516002600481101515611bc557fe5b60200201818152505060136000601183815481101515611be157fe5b9060005260206000209001548152602001908152602001600020548585815181101515611c0a57fe5b906020019060200201516003600481101515611c2257fe5b60200201818152505083806001019450505b80806001019150506119d4565b6000841415611c97576000604051805910611c595750595b908082528060200260200182016040528015611c8f57816020015b611c7c614e9b565b815260200190600190039081611c745790505b509550611c9b565b8495505b505050505090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611d4c5750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515611d5757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611d9357600080fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600e9054906101000a90047e010000000000000000000000000000000000000000000000000000000000000281565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611e6457600080fd5b600460149054906101000a900460ff161515611e7f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515611edd57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515611f3a57600080fd5b60011515600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632da22fc0306000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b151561200357600080fd5b6102c65a03f1151561201457600080fd5b50505060405180519050151514151561202c57600080fd5b612034614964565b565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806120df5750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806121375750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561214257600080fd5b80600b8190555050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806121f75750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061224f5750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561225a57600080fd5b600460149054906101000a900460ff16151561227557600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff1663ae61fcda6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156122e457600080fd5b6102c65a03f115156122f557600080fd5b50505060405180519050151561230a57600080fd5b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061241e5750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806124765750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561248157600080fd5b60008111151561249057600080fd5b8060078190555050565b600460149054906101000a900460ff1681565b6000809054906101000a90047e010000000000000000000000000000000000000000000000000000000000000281565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561257857600080fd5b6102c65a03f1151561258957600080fd5b505050604051805190509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156125d157600080fd5b919050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c5481565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806126ae5750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806127065750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561271157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415151561274d57600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631e8cdd0a8a8a8a8a8a6000600281111561279d57fe5b8b8b6000806000604051602001526040518b63ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808b81526020018a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018981526020018861ffff1661ffff1681526020018760ff1660ff1681526020018660ff1660ff1681526020018560ff1660ff16815260200184600a6020028082843782019150508381526020018267ffffffffffffffff1681526020019a5050505050505050505050602060405180830381600087803b151561289457600080fd5b6102c65a03f115156128a557600080fd5b5050506040518051905090507fbeb1fffdbea52fcb668386f7d55545fac4cb704f66674ba929c648e708f7c0208882888a604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018361ffff1661ffff16815260200182815260200194505050505060405180910390a180915050979650505050505050565b6000600c9054906101000a90047e010000000000000000000000000000000000000000000000000000000000000281565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1515612a3b57600080fd5b6102c65a03f11515612a4c57600080fd5b505050604051805190509050919050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612ab957600080fd5b600460149054906101000a900460ff161515612ad457600080fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f450db8da6efbe9c22f2347f7c2021231df1fc58d3ae9a2fa75d39fa44619930581604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612c245750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80612c7c5750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515612c8757600080fd5b8060098190555050565b600a81565b6000806000806000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612cfa57600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cf35bdd08b600060405161010001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505061010060405180830381600087803b1515612d9557600080fd5b6102c65a03f11515612da657600080fd5b50505060405180519060200180519060200180519060200180519060200180519060200180519060200180519060200180519050909192939495965090919293949550909192939450909192935090919250809550819750829650505050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8b6000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515612e9d57600080fd5b6102c65a03f11515612eae57600080fd5b505050604051805190509150600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612ef657600080fd5b600090505b6005811015612f9257612f84898360008b85600581101515612f1957fe5b602002013561ffff1660046006811115612f2f57fe5b8c87600581101515612f3d57fe5b602002013560ff168c88600581101515612f5357fe5b6101400201600a806020026040519081016040528092919082600a6020028082843782019150505050508c8c6149f8565b508080600101915050612efb565b6011601260008c815260200190815260200160002054815481101515612fb457fe5b906000526020600020900160009055601360008b815260200190815260200160002060009055888a7f34fa627446f032cedc60a5521c4a8fbdd28f3ce106d8c6f6c17322ada873cebb60405160405180910390a350505050505050505050565b600060069054906101000a90047e010000000000000000000000000000000000000000000000000000000000000281565b60105481565b60075481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156130ad57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156130e957600080fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806131d65750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061322e5750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561323957600080fd5b600460149054906101000a900460ff1615151561325557600080fd5b6001600460146101000a81548160ff021916908315150217905550565b600060029054906101000a90047e010000000000000000000000000000000000000000000000000000000000000281565b6000600a9054906101000a90047e010000000000000000000000000000000000000000000000000000000000000281565b6040805190810160405280600481526020017f45544e540000000000000000000000000000000000000000000000000000000081525081565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460149054906101000a900460ff1615151561334f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561338b57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156133c657600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561342357600080fd5b61342d3382614625565b151561343857600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663beabacc83384846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b151561353057600080fd5b6102c65a03f1151561354157600080fd5b5050505050565b600581565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561361457600080fd5b6102c65a03f1151561362557600080fd5b505050604051805190509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561366d57600080fd5b6136788133846147ed565b5050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806137255750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061377d5750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561378857600080fd5b80600a8190555050565b600061379c614ec3565b6137a4614ec3565b600080600080600460149054906101000a900460ff161515156137c657600080fd5b600b5434101515156137d757600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663660250478a6003600681111561382357fe5b6000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808381526020018260ff1660ff16815260200192505050602060405180830381600087803b151561388a57600080fd5b6102c65a03f1151561389b57600080fd5b5050506040518051905015156138b057600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636602504789600160068111156138fc57fe5b6000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808381526020018260ff1660ff16815260200192505050602060405180830381600087803b151561396357600080fd5b6102c65a03f1151561397457600080fd5b50505060405180519050151561398957600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ef816fd98a600060028111156139d557fe5b6000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808381526020018260ff1660ff16815260200192505050602060405180830381600087803b1515613a3c57600080fd5b6102c65a03f11515613a4d57600080fd5b505050604051805190501515613a6257600080fd5b613a6b896140fc565b151515613a7757600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8a6000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515613b1057600080fd5b6102c65a03f11515613b2157600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613b6457600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e896000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515613bfd57600080fd5b6102c65a03f11515613c0e57600080fd5b505050604051805190509650600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614151515613c5657600080fd5b600160118054806001018281613c6c9190614eef565b916000526020600020900160008c90919091505503601260008b81526020019081526020016000208190555087601360008b815260200190815260200160002081905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637b3039658a600060405161014001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505061014060405180830381600087803b1515613d4b57600080fd5b6102c65a03f11515613d5c57600080fd5b50505060405180610140016040529550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637b30396589600060405161014001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505061014060405180830381600087803b1515613e0757600080fd5b6102c65a03f11515613e1857600080fd5b50505060405180610140016040529450613e8d8660046005811115613e3957fe5b600a81101515613e4557fe5b60200201518760036005811115613e5857fe5b600a81101515613e6457fe5b60200201518760006002811115613e7757fe5b600a81101515613e8357fe5b6020020151614c1b565b9350603c840293504360075485811515613ea357fe5b04019250600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663058d4dd08a864201866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018267ffffffffffffffff1667ffffffffffffffff1681526020019350505050600060405180830381600087803b1515613f5d57600080fd5b6102c65a03f11515613f6e57600080fd5b505050613f7d34600b54614cc8565b9150600a54613f98613f9134600954614ce1565b6064614d1c565b03905087897f76dd98418c6ea6d8cbd6d45a8a55bf9b4755ce3650d24398a40c702e3c45e7f98642016040518082815260200191505060405180910390a3600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc600a549081150290604051600060405180830381858888f19350505050151561403a57600080fd5b8673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561407a57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015156140ba57600080fd5b505050505050505050565b600b5481565b600060089054906101000a90047e010000000000000000000000000000000000000000000000000000000000000281565b6000806000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cf35bdd085600060405161010001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505061010060405180830381600087803b151561419c57600080fd5b6102c65a03f115156141ad57600080fd5b505050604051805190602001805190602001805190602001805190602001805190602001805190602001805190602001805190509091929394959650909192939495509091929394509091929350909192505080935081925050504282118061422957504367ffffffffffffffff168167ffffffffffffffff16115b92505050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806142db5750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806143335750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561433e57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050151561439557600080fd5b50565b600d5481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806144475750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061449f5750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156144aa57600080fd5b8060088190555050565b600060049054906101000a90047e010000000000000000000000000000000000000000000000000000000000000281565b60095481565b600a5481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061459a5750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156145a557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156145e157600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008273ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e846000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15156146d757600080fd5b6102c65a03f115156146e857600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663febe490983836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b15156147d557600080fd5b6102c65a03f115156147e657600080fd5b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561482957600080fd5b6148338382614625565b151561483e57600080fd5b6148488282614d37565b151561485357600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663beabacc88484846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b151561494b57600080fd5b6102c65a03f1151561495c57600080fd5b505050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156149c057600080fd5b600460149054906101000a900460ff1615156149db57600080fd5b6000600460146101000a81548160ff021916908315150217905550565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631e8cdd0a8c8c8c8c8c60006002811115614a4b57fe5b8d8d8d8d6000604051602001526040518b63ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808b81526020018a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018981526020018861ffff1661ffff1681526020018760ff1660ff1681526020018660ff1660ff1681526020018560ff1660ff16815260200184600a60200280838360005b83811015614b1e578082015181840152602081019050614b03565b505050509050018381526020018267ffffffffffffffff1667ffffffffffffffff1681526020019a5050505050505050505050602060405180830381600087803b1515614b6a57600080fd5b6102c65a03f11515614b7b57600080fd5b5050506040518051905090507fbeb1fffdbea52fcb668386f7d55545fac4cb704f66674ba929c648e708f7c0208a828a8c604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018361ffff1661ffff16815260200182815260200194505050505060405180910390a1809150509998505050505050505050565b60008060008060008093506001614c378860ff16600c54614e23565b039350837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb8029350600f5484019350614c758860ff16600d54614e23565b9250601054600d54029150600e5484039050614c92818484614e3f565b84039350614ca884600a880360ff16600a614e3f565b84019350614cb884600e54614e6b565b9350839450505050509392505050565b6000828211151515614cd657fe5b818303905092915050565b6000806000841415614cf65760009150614d15565b8284029050828482811515614d0757fe5b04141515614d1157fe5b8091505b5092915050565b6000808284811515614d2a57fe5b0490508091505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632a6dd48f846000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515614de957600080fd5b6102c65a03f11515614dfa57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600081831215614e3557829050614e39565b8190505b92915050565b6000806000838602858702039150818487020190508381811515614e5f57fe5b05925050509392505050565b600081831315614e7d57829050614e81565b8190505b92915050565b602060405190810160405280600081525090565b6080604051908101604052806004905b6000815260200190600190039081614eab5790505090565b61014060405190810160405280600a905b600060ff16815260200190600190039081614ed45790505090565b815481835581811511614f1657818360005260206000209182019101614f159190614f1b565b5b505050565b614f3d91905b80821115614f39576000816000905550600101614f21565b5090565b905600a165627a7a72305820d26dc59fa0da2b885559e8f1b5e5f7273c09a417d7daf72e259590646cb8ec190029

Swarm Source

bzzr://d26dc59fa0da2b885559e8f1b5e5f7273c09a417d7daf72e259590646cb8ec19

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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