Contract 0xcec76159cb10f8c110e738809e4ee4b71f1de12e

 

TxHash Block Age From To Value [TxFee]
0xe92ab95a5b3d7044b0605212560d97466e5b1e7366d94797b839b298cc8cc7fd(pending)11 days 3 hrs ago0xb0eef5d733306e4a78ee3d12023c019326dec8dd  IN  0xcec76159cb10f8c110e738809e4ee4b71f1de12e0 Ether(Pending)
0x3f07aef161752b2012666ac2dae6b0162b27be31ebf2237450f0d58fd088f7c872386233 hrs 21 mins ago0xbf46181e170113c2f6cde6f30b80e3c2f101972f  IN   0xcec76159cb10f8c110e738809e4ee4b71f1de12e0 Ether0.00254835
0x95bbd2b40d133518607fc54cf001bb23c7574e3c11806c23797388eaf86e817472386003 hrs 28 mins ago0xbf46181e170113c2f6cde6f30b80e3c2f101972f  IN   0xcec76159cb10f8c110e738809e4ee4b71f1de12e0 Ether0.00015507
0x371fb972f20e3f87a6c22bd406c1a1d3b896ef0d78950068575a3a3ab9160a6872386003 hrs 28 mins ago0xbf46181e170113c2f6cde6f30b80e3c2f101972f  IN   0xcec76159cb10f8c110e738809e4ee4b71f1de12e0 Ether0.009741678
0x508a6e6f9d7ebf84ea0841240c251d5b26fe28c597b160644965dfe7f1c00b5672383125 hrs 6 mins ago0xbf46181e170113c2f6cde6f30b80e3c2f101972f  IN   0xcec76159cb10f8c110e738809e4ee4b71f1de12e0.05 Ether0.000195939
0x393e78b51ea8e7b8a2ee509671d6fdebda63eeb97c155ac5ef25e2c1ce14460272382665 hrs 24 mins ago0xbf46181e170113c2f6cde6f30b80e3c2f101972f  IN   0xcec76159cb10f8c110e738809e4ee4b71f1de12e0 Ether0.000129225
0x6fcc0d6255b33dc57ab9f06e99e2f645a1171fbcb191e1f843ac7e9d5d2f861f72382345 hrs 35 mins ago0xbf46181e170113c2f6cde6f30b80e3c2f101972f  IN   0xcec76159cb10f8c110e738809e4ee4b71f1de12e0 Ether0.005265005
0x7fe2aeaf9d421f4e6730c57b988cdb2ead51f54a1241884ab35d843d76f079b472382305 hrs 36 mins ago0xbf46181e170113c2f6cde6f30b80e3c2f101972f  IN   0xcec76159cb10f8c110e738809e4ee4b71f1de12e0.005 Ether0.000326565
0x18931cfd6b642770733c50b22a242d237c6b06c9a70683856e1e70858c2dd0fa723503023 hrs 59 mins ago0x823e132ecc7fa27844526f6a63d39cb3ba25c754  IN   0xcec76159cb10f8c110e738809e4ee4b71f1de12e0.015 Ether0.000326565
0xdd5e70a88348797b6c7261fd71cdc051dc2e0bc7fee9d76bfde2662f00fe6f5872186534 days 22 hrs ago0xd664e6126dc4710518d17e2ff910a65aefba3309  IN   0xcec76159cb10f8c110e738809e4ee4b71f1de12e0 Ether0.000297021
0x262e1558cccb673c88df9038454a99e2be227033a14df60f189f5c4a48d13c88715726818 days 1 hr ago0x15c0b4d8336acf9ea53a58b119592a72a52d0e46  IN   0xcec76159cb10f8c110e738809e4ee4b71f1de12e0 Ether0.000568965
0x013ad6e7e88dc0e853f0236090d525118b113a2e3b7ddb9588f1046f9cfb6a72715715418 days 1 hr ago0x15c0b4d8336acf9ea53a58b119592a72a52d0e46  IN   0xcec76159cb10f8c110e738809e4ee4b71f1de12e0 Ether0.005278772
0xd4574593f1aa25ed34894ad2de6a07d943dc72f0e0a6e75ca02a484d2b5f0be1715714718 days 1 hr ago0x15c0b4d8336acf9ea53a58b119592a72a52d0e46  IN   0xcec76159cb10f8c110e738809e4ee4b71f1de12e0.005 Ether0.000261252
0x668b493d450b819a3679e7599f30618eb4723f29fde72b935d05ec191779f655715525218 days 10 hrs ago0x6680aca671b2b23f265825d5bcff3a6a581f477c  IN   0xcec76159cb10f8c110e738809e4ee4b71f1de12e0 Ether0.004005939
0xdd45c9e3983572b792ff9f1b4c1b27cfad2920e13c3529d8262a5bf32842e6b4714457720 days 14 hrs ago0xe487c7f0a9f1d11b9df1c327a4e44b222f40fcef  IN   0xcec76159cb10f8c110e738809e4ee4b71f1de12e0 Ether0.001331985
0xd4fae0af667fe659f37f6d37bdc9fc73ea2e4adb52ed6434ee98af1322acf2e0713451622 days 16 hrs ago0x1e722e9d1b3ef0961292df0489c8e66a22f28432  IN   0xcec76159cb10f8c110e738809e4ee4b71f1de12e0 Ether0.001689327765
0x011d41189db78522e1eb026151b73e7f0c81e522c419ff2ceac17eaa7fe00476713450222 days 16 hrs ago0x1e722e9d1b3ef0961292df0489c8e66a22f28432  IN   0xcec76159cb10f8c110e738809e4ee4b71f1de12e0.015 Ether0.000096651967
0xc7e99da47d4ef51870b0d2f75e678d4b55fbfd88c907c5540548fd317a9b39db713444622 days 16 hrs ago0x1e722e9d1b3ef0961292df0489c8e66a22f28432  IN   0xcec76159cb10f8c110e738809e4ee4b71f1de12e0 Ether0.001114044405
0xc3af8abb25bab35dac18d3e2ea1946a191c31468c10aa7e7d1df026b62a36ad4712192025 days 3 hrs ago0x6eac7d87a9f2ad5c8c03c79e71b9038468043780  IN   0xcec76159cb10f8c110e738809e4ee4b71f1de12e0 Ether0.00299412
0x714cc56c767b1808ec8d18661e8d0e9dd5a4341ae562ce14fca66f09874e5599712191525 days 3 hrs ago0x6eac7d87a9f2ad5c8c03c79e71b9038468043780  IN   0xcec76159cb10f8c110e738809e4ee4b71f1de12e0 Ether0.002152864
0x2062a88c92d2edd69a904b648354c7f1d870c8e21f35957588d87a0d82294c07711958925 days 14 hrs ago0xa4cadd1051de76101455adcc627faab417fc6486  IN   0xcec76159cb10f8c110e738809e4ee4b71f1de12e0 Ether0.005163535
0x637995b77da6e819effebbb016acbb6a5694ae28cb95fe107bee02d6c40f9e9a711957625 days 14 hrs ago0xa4cadd1051de76101455adcc627faab417fc6486  IN   0xcec76159cb10f8c110e738809e4ee4b71f1de12e0.05 Ether0.000326565
0xee3dc5c3d226ac9c97e5e981179849f9e55f601cbcd3f4f368d9cb224b0c374c710404428 days 16 hrs ago0xab3009dbb3c9a5694ed818cf0d159e069dd55107  IN   0xcec76159cb10f8c110e738809e4ee4b71f1de12e0 Ether0.0027566385
0xbe65ae7cb909d2ae6022b9f578a6e59fb4791f765d9dcaf7de329eb93baf1fb4710401828 days 16 hrs ago0xab3009dbb3c9a5694ed818cf0d159e069dd55107  IN   0xcec76159cb10f8c110e738809e4ee4b71f1de12e0.005 Ether0.000195939
0xe2d7547a811cf5d6d28e1c7c1975c860afed172024db76ec84f3e3e303127f51710009229 days 10 hrs ago0xa374a95b8246cc6d9c5bb660a913571be8c2d8aa  IN   0xcec76159cb10f8c110e738809e4ee4b71f1de12e0 Ether0.001297935
[ Download CSV Export 

Latest 25 Internal Transaction, Click here to view more Internal Transactions as a result of Contract Execution

Parent TxHash Block Age From To Value
0x508a6e6f9d7ebf84ea0841240c251d5b26fe28c597b160644965dfe7f1c00b5672383125 hrs 6 mins ago0xcec76159cb10f8c110e738809e4ee4b71f1de12e0x7b37faf831044d08da0c0e7419e2e31615f430320.049 Ether
0x7fe2aeaf9d421f4e6730c57b988cdb2ead51f54a1241884ab35d843d76f079b472382305 hrs 36 mins ago0xcec76159cb10f8c110e738809e4ee4b71f1de12e0x7b37faf831044d08da0c0e7419e2e31615f430320.0049 Ether
0x18931cfd6b642770733c50b22a242d237c6b06c9a70683856e1e70858c2dd0fa723503023 hrs 59 mins ago0xcec76159cb10f8c110e738809e4ee4b71f1de12e0x7b37faf831044d08da0c0e7419e2e31615f430320.0147 Ether
0xd4574593f1aa25ed34894ad2de6a07d943dc72f0e0a6e75ca02a484d2b5f0be1715714718 days 1 hr ago0xcec76159cb10f8c110e738809e4ee4b71f1de12e0x7b37faf831044d08da0c0e7419e2e31615f430320.0049 Ether
0x011d41189db78522e1eb026151b73e7f0c81e522c419ff2ceac17eaa7fe00476713450222 days 16 hrs ago0xcec76159cb10f8c110e738809e4ee4b71f1de12e0x7b37faf831044d08da0c0e7419e2e31615f430320.0147 Ether
0x637995b77da6e819effebbb016acbb6a5694ae28cb95fe107bee02d6c40f9e9a711957625 days 14 hrs ago0xcec76159cb10f8c110e738809e4ee4b71f1de12e0x7b37faf831044d08da0c0e7419e2e31615f430320.049 Ether
0xbe65ae7cb909d2ae6022b9f578a6e59fb4791f765d9dcaf7de329eb93baf1fb4710401828 days 16 hrs ago0xcec76159cb10f8c110e738809e4ee4b71f1de12e0x7b37faf831044d08da0c0e7419e2e31615f430320.0049 Ether
0x27d10147b60ad6c3d9ffe8e0124c20d8702f2f3733425bb6053bfb24f7cd3d55708895131 days 10 hrs ago0xcec76159cb10f8c110e738809e4ee4b71f1de12e0x7b37faf831044d08da0c0e7419e2e31615f430320.0196 Ether
0xe6a750065592a6e0916308331c05a9ea82f1c2e14486e9bc003f2a383798fb8f708891431 days 10 hrs ago0xcec76159cb10f8c110e738809e4ee4b71f1de12e0x7b37faf831044d08da0c0e7419e2e31615f430320.0098 Ether
0x9b6097da12ef0e08c0dd3febf07318d78e26cc72e5dd145affb3e453c758f86b708882931 days 10 hrs ago0xcec76159cb10f8c110e738809e4ee4b71f1de12e0x7b37faf831044d08da0c0e7419e2e31615f430320.0098 Ether
0xe7b20035947a745a4d2ab17b73b72019a8d4d27d32aa2db26bd55f186cc80504708481032 days 3 hrs ago0xcec76159cb10f8c110e738809e4ee4b71f1de12e0x7b37faf831044d08da0c0e7419e2e31615f430320.0049 Ether
0xb8893a5a14768245cc812827093944b373f80975e6d4a715ac532dca9206a51d707824233 days 8 hrs ago0xcec76159cb10f8c110e738809e4ee4b71f1de12e0x7b37faf831044d08da0c0e7419e2e31615f430320.0049 Ether
0xd6e18c6769174261251034fc4dee16dbca6dbb7e51c33973b1cc246b54c2e85f707821533 days 8 hrs ago0xcec76159cb10f8c110e738809e4ee4b71f1de12e0x7b37faf831044d08da0c0e7419e2e31615f430320.0049 Ether
0xdf952cf9d32251b890e26976a460b937deb7bf7021446f31aa53db5f4791b19a704202339 days 19 hrs ago0xcec76159cb10f8c110e738809e4ee4b71f1de12e0x7b37faf831044d08da0c0e7419e2e31615f430320.0049 Ether
0xbcdc4a1922cac258a55f4864f58cbf3d13991dc2a51e011ce0c3e91a274b9add704174839 days 20 hrs ago0xcec76159cb10f8c110e738809e4ee4b71f1de12e0x7b37faf831044d08da0c0e7419e2e31615f430320.0196 Ether
0x1f70a48cc31d858dcbe440e458b32cf9a77c5db10fd6db24eb91b9ff44a0fba5704059240 days 1 hr ago0xcec76159cb10f8c110e738809e4ee4b71f1de12e0x7b37faf831044d08da0c0e7419e2e31615f430320.049 Ether
0xb37c000a8e3b8eb82dfddd70e1dd2beed6be75984a096f7eb3a84700962e7c7e701587844 days 12 hrs ago0xcec76159cb10f8c110e738809e4ee4b71f1de12e0x7b37faf831044d08da0c0e7419e2e31615f430320.0098 Ether
0x346551628022dcbf494b65ac9f07e2d1257d195032bad654500549f5e7f4a1cf701484144 days 16 hrs ago0xcec76159cb10f8c110e738809e4ee4b71f1de12e0x7b37faf831044d08da0c0e7419e2e31615f430320.049 Ether
0x464f31a4e2fe69f704b97b103afce3e90b884a5becc619d67257826adb0987a9699148348 days 18 hrs ago0xcec76159cb10f8c110e738809e4ee4b71f1de12e0x7b37faf831044d08da0c0e7419e2e31615f430320.0245 Ether
0x2aa470fa1217c60779238a0bca8e8ceead881f4b6fe849fe5376ad1c4da6b7d9699130748 days 19 hrs ago0xcec76159cb10f8c110e738809e4ee4b71f1de12e0x7b37faf831044d08da0c0e7419e2e31615f430320.0049 Ether
0xa389cc086ecb6b022a76e899ea8fd65b53128708b6332c4e5df3947afd955f55697039352 days 8 hrs ago0xcec76159cb10f8c110e738809e4ee4b71f1de12e0x7b37faf831044d08da0c0e7419e2e31615f430320.049 Ether
0xeca2b5e26803363a71e300941498e322807d266143a3124e62dda73a21f89e49696080353 days 23 hrs ago0xcec76159cb10f8c110e738809e4ee4b71f1de12e0x7b37faf831044d08da0c0e7419e2e31615f430320.0098 Ether
0xeab31b3a33c779cc26178c7654520c274a411e8c323a8ad853cb7633a79d9850693632658 days 2 hrs ago0xcec76159cb10f8c110e738809e4ee4b71f1de12e0x7b37faf831044d08da0c0e7419e2e31615f430320.0049 Ether
0xa048f2282b40e837f530d975efd24848407e008bba448ac448fd8d3495a1ce68693587058 days 4 hrs ago0xcec76159cb10f8c110e738809e4ee4b71f1de12e0x7b37faf831044d08da0c0e7419e2e31615f430320.0049 Ether
0x67e72fd3d709a85a42e6d8e0f11a9c94cb66e9f4b72f8d6b12a6ddff6a62a60b692914159 days 7 hrs ago0xcec76159cb10f8c110e738809e4ee4b71f1de12e0x7b37faf831044d08da0c0e7419e2e31615f430320.049 Ether
[ Download CSV Export 
Warning: The compiled contract might be susceptible to ExpExponentCleanup (medium/high-severity), EventStructWrongData (very low-severity) Solidity Compiler Bugs.

Contract Source Code Verified (Exact Match)
Contract Name: CryptoCrystal
Compiler Version: v0.4.23+commit.124ca40d
Optimization Enabled: No
Runs (Optimizer):  200


Contract Source Code
pragma solidity ^0.4.23;

// File: contracts/zeppelin-solidity/contracts/ownership/Ownable.sol

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
  address public owner;


  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);


  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  function Ownable() public {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param newOwner The address to transfer ownership to.
   */
  function transferOwnership(address newOwner) public onlyOwner {
    require(newOwner != address(0));
    OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }

}

// File: contracts/Acceptable.sol

// @title Acceptable
// @author Takayuki Jimba
// @dev Provide basic access control.
contract Acceptable is Ownable {
    address public sender;

    // @dev Throws if called by any address other than the sender.
    modifier onlyAcceptable {
        require(msg.sender == sender);
        _;
    }

    // @dev Change acceptable address
    // @param _sender The address to new sender
    function setAcceptable(address _sender) public onlyOwner {
        sender = _sender;
    }
}

// File: contracts/zeppelin-solidity/contracts/token/ERC721/ERC721Basic.sol

/**
 * @title ERC721 Non-Fungible Token Standard basic interface
 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Basic {
  event Transfer(address indexed _from, address indexed _to, uint256 _tokenId);
  event Approval(address indexed _owner, address indexed _approved, uint256 _tokenId);
  event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);  

  function balanceOf(address _owner) public view returns (uint256 _balance);
  function ownerOf(uint256 _tokenId) public view returns (address _owner);
  function exists(uint256 _tokenId) public view returns (bool _exists);
  
  function approve(address _to, uint256 _tokenId) public;
  function getApproved(uint256 _tokenId) public view returns (address _operator);
  
  function setApprovalForAll(address _operator, bool _approved) public;
  function isApprovedForAll(address _owner, address _operator) public view returns (bool);

  function transferFrom(address _from, address _to, uint256 _tokenId) public;
  function safeTransferFrom(address _from, address _to, uint256 _tokenId) public;  
  function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes _data) public;
}

// File: contracts/zeppelin-solidity/contracts/token/ERC721/ERC721.sol

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Enumerable is ERC721Basic {
  function totalSupply() public view returns (uint256);
  function tokenOfOwnerByIndex(address _owner, uint256 _index) public view returns (uint256 _tokenId);
  function tokenByIndex(uint256 _index) public view returns (uint256);
}

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Metadata is ERC721Basic {
  function name() public view returns (string _name);
  function symbol() public view returns (string _symbol);
  function tokenURI(uint256 _tokenId) public view returns (string);
}

/**
 * @title ERC-721 Non-Fungible Token Standard, full implementation interface
 * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721 is ERC721Basic, ERC721Enumerable, ERC721Metadata {
}

// File: contracts/CrystalBaseIF.sol

// @title CrystalBaseIF
// @author Takayuki Jimba
contract CrystalBaseIF is ERC721 {
    function mint(address _owner, uint256 _gene, uint256 _kind, uint256 _weight) public returns(uint256);
    function burn(address _owner, uint256 _tokenId) public;
    function _transferFrom(address _from, address _to, uint256 _tokenId) public;
    function getCrystalKindWeight(uint256 _tokenId) public view returns(uint256 kind, uint256 weight);
    function getCrystalGeneKindWeight(uint256 _tokenId) public view returns(uint256 gene, uint256 kind, uint256 weight);
}

// File: contracts/zeppelin-solidity/contracts/math/SafeMath.sol

/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
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 Subtracts 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;
  }
}

// File: contracts/MiningSupplier.sol

// @title MiningSupplier
// @author Takayuki Jimba
contract MiningSupplier {
    using SafeMath for uint256;

    uint256 public constant secondsPerYear = 1 years * 1 seconds;
    uint256 public constant secondsPerDay = 1 days * 1 seconds;

    // @dev Number of blocks per year
    function _getBlocksPerYear(
        uint256 _secondsPerBlock
    ) public pure returns(uint256) {
        return secondsPerYear.div(_secondsPerBlock);
    }

    // @dev 0-based block number index
    //      First block number index of every years is 0
    function _getBlockIndexAtYear(
        uint256 _initialBlockNumber,
        uint256 _currentBlockNumber,
        uint256 _secondsPerBlock
    ) public pure returns(uint256) {
        //require(_currentBlockNumber >= _initialBlockNumber, "current is large than or equal to initial");
        require(_currentBlockNumber >= _initialBlockNumber);
        uint256 _blockIndex = _currentBlockNumber.sub(_initialBlockNumber);
        uint256 _blocksPerYear = _getBlocksPerYear(_secondsPerBlock);
        return _blockIndex.sub(_blockIndex.div(_blocksPerYear).mul(_blocksPerYear));
    }

    // @dev Map block number to block index.
    //      First block is number 0.
    function _getBlockIndex(
        uint256 _initialBlockNumber,
        uint256 _currentBlockNumber
    ) public pure returns(uint256) {
        //require(_currentBlockNumber >= _initialBlockNumber, "current is large than or equal to initial");
        require(_currentBlockNumber >= _initialBlockNumber);
        return _currentBlockNumber.sub(_initialBlockNumber);
    }

    // @dev Map block number to year index.
    //      First (blocksPerYear - 1) blocks are number 0.
    function _getYearIndex(
        uint256 _secondsPerBlock,
        uint256 _initialBlockNumber,
        uint256 _currentBlockNumber
    ) public pure returns(uint256) {
        uint256 _blockIndex =  _getBlockIndex(_initialBlockNumber, _currentBlockNumber);
        uint256 _blocksPerYear = _getBlocksPerYear(_secondsPerBlock);
        return _blockIndex.div(_blocksPerYear);
    }

    // @dev
    function _getWaitingBlocks(
        uint256 _secondsPerBlock
    ) public pure returns(uint256) {
        return secondsPerDay.div(_secondsPerBlock);
    }

    function _getWeightUntil(
        uint256 _totalWeight,
        uint256 _yearIndex
    ) public pure returns(uint256) {
        uint256 _sum = 0;
        for(uint256 i = 0; i < _yearIndex; i++) {
            _sum = _sum.add(_totalWeight / (2 ** (i + 1)));
        }
        return _sum;
    }

    function _estimateSupply(
        uint256 _secondsPerBlock,
        uint256 _initialBlockNumber,
        uint256 _currentBlockNumber,
        uint256 _totalWeight
    ) public pure returns(uint256){
        uint256 _yearIndex = _getYearIndex(_secondsPerBlock, _initialBlockNumber, _currentBlockNumber); // 0-based
        uint256 _blockIndex = _getBlockIndexAtYear(_initialBlockNumber, _currentBlockNumber, _secondsPerBlock) + 1;
        uint256 _numerator = _totalWeight.mul(_secondsPerBlock).mul(_blockIndex);
        uint256 _yearFactor = 2 ** (_yearIndex + 1);
        uint256 _denominator =  _yearFactor.mul(secondsPerYear);
        uint256 _supply = _numerator.div(_denominator).add(_getWeightUntil(_totalWeight, _yearIndex));
        return _supply; // mg
    }

    function _estimateWeight(
        uint256 _secondsPerBlock,
        uint256 _initialBlockNumber,
        uint256 _currentBlockNumber,
        uint256 _totalWeight,
        uint256 _currentWeight
    ) public pure returns(uint256) {
        uint256 _supply = _estimateSupply(
            _secondsPerBlock,
            _initialBlockNumber,
            _currentBlockNumber,
            _totalWeight
        );
        uint256 _yearIndex = _getYearIndex(
            _secondsPerBlock,
            _initialBlockNumber,
            _currentBlockNumber
        ); // 0-based
        uint256 _yearFactor = 2 ** _yearIndex;
        uint256 _defaultWeight = 10000; // mg

        if(_currentWeight > _supply) {
            // (_supply / _currentWeight) * _defaultWeight / _yearFactor
            return _supply.mul(_defaultWeight).div(_currentWeight).div(_yearFactor);
        } else {
            // _defaultWeight / _yearFactor
            return _defaultWeight.div(_yearFactor);
        }
    }

    function _updateNeeded(
        uint256 _secondsPerBlock,
        uint256 _currentBlockNumber,
        uint256 _blockNumberUpdated
    ) public pure returns(bool) {
        if (_blockNumberUpdated == 0) {
            return true;
        }
        uint256 _waitingBlocks = _getWaitingBlocks(_secondsPerBlock);
        return _currentBlockNumber >= _blockNumberUpdated + _waitingBlocks;
    }
}

// File: contracts/CrystalWeightManager.sol

// @title CrystalWeightManager
// @author Takayuki Jimba
contract CrystalWeightManager is MiningSupplier {
    // Amounts of deposit of all crystals.
    // Each unit of weight is milligrams
    // e.g. 50000000000 means 50t.
    uint256[100] crystalWeights = [
        50000000000,226800000000,1312500000000,31500000000,235830000000,
        151200000000,655200000000,829500000000,7177734375,762300000000,
        684600000000,676200000000,5037226562,30761718750,102539062500,
        102539062500,102539062500,5126953125,31500000000,5040000000,
        20507812500,20507812500,10253906250,5024414062,6300000000,
        20507812500,102539062500,102539062500,102539062500,102539062500,
        102539062500,7690429687,15380859375,69300000000,10253906250,
        547050000000,15380859375,20507812500,15380859375,15380859375,
        20507812500,15380859375,7690429687,153808593750,92285156250,
        102539062500,71777343750,82031250000,256347656250,1384277343750,
        820312500000,743408203125,461425781250,563964843750,538330078125,
        358886718750,256347656250,358886718750,102539062500,307617187500,
        256347656250,51269531250,41015625000,307617187500,307617187500,
        2050781250,3588867187,2563476562,5126953125,399902343750,
        615234375000,563964843750,461425781250,358886718750,717773437500,
        41015625000,41015625000,2050781250,102539062500,102539062500,
        51269531250,102539062500,30761718750,41015625000,102539062500,
        102539062500,102539062500,205078125000,205078125000,556500000000,
        657300000000,41015625000,102539062500,30761718750,102539062500,
        20507812500,20507812500,20507812500,20507812500,82031250000
    ];

    uint256 public secondsPerBlock = 12;
    uint256 public initialBlockNumber = block.number;
    uint256 public constant originalTotalWeight = 21 * 10**13; // mg
    uint256 public currentWeight = 0;
    uint256 public estimatedWeight = 0;
    uint256 public blockNumberUpdated = 0;

    event UpdateEstimatedWeight(uint256 weight, uint256 nextUpdateBlockNumber);

    function setEstimatedWeight(uint256 _minedWeight) internal {
        currentWeight = currentWeight.add(_minedWeight);

        uint256 _currentBlockNumber = block.number;

        bool _isUpdate = _updateNeeded(
            secondsPerBlock,
            _currentBlockNumber,
            blockNumberUpdated
        );

        if(_isUpdate) {
            estimatedWeight = _estimateWeight(
                secondsPerBlock,
                initialBlockNumber,
                _currentBlockNumber,
                originalTotalWeight,
                currentWeight
            );
            blockNumberUpdated = _currentBlockNumber;

            emit UpdateEstimatedWeight(estimatedWeight, _currentBlockNumber);
        }
    }

    function getCrystalWeights() external view returns(uint256[100]) {
        return crystalWeights;
    }
}

// File: contracts/EOACallable.sol

// @title EOACallable
// @author Takayuki Jimba
contract EOACallable {
    function isContract(address addr) internal view returns (bool) {
        uint size;
        assembly { size := extcodesize(addr) }
        return size > 0;
    }

    modifier onlyEOA {
        require(!isContract(msg.sender));
        _;
    }
}

// File: contracts/ExchangeBaseIF.sol

// @title ExchangeBaseIF
// @author Takayuki Jimba
contract ExchangeBaseIF {
    function create(
        address _owner,
        uint256 _ownerTokenId,
        uint256 _ownerTokenGene,
        uint256 _ownerTokenKind,
        uint256 _ownerTokenWeight,
        uint256 _kind,
        uint256 _weight,
        uint256 _createdAt
    ) public returns(uint256);
    function remove(uint256 _id) public;
    function getExchange(uint256 _id) public view returns(
        address owner,
        uint256 tokenId,
        uint256 kind,
        uint256 weight,
        uint256 createdAt
    );
    function getTokenId(uint256 _id) public view returns(uint256);
    function ownerOf(uint256 _id) public view returns(address);
    function isOnExchange(uint256 _tokenId) public view returns(bool);
    function isOnExchangeById(uint256 _id) public view returns(bool);
}

// File: contracts/zeppelin-solidity/contracts/token/ERC20/ERC20Basic.sol

/**
 * @title ERC20Basic
 * @dev Simpler version of ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/179
 */
contract ERC20Basic {
  function totalSupply() public view returns (uint256);
  function balanceOf(address who) public view returns (uint256);
  function transfer(address to, uint256 value) public returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
}

// File: contracts/zeppelin-solidity/contracts/token/ERC20/ERC20.sol

/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract ERC20 is ERC20Basic {
  function allowance(address owner, address spender) public view returns (uint256);
  function transferFrom(address from, address to, uint256 value) public returns (bool);
  function approve(address spender, uint256 value) public returns (bool);
  event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: contracts/PickaxeIF.sol

// @title PickaxeIF
// @author Takayuki Jimba
contract PickaxeIF is ERC20 {
    function transferFromOwner(address _to, uint256 _amount) public;
    function burn(address _from, uint256 _amount) public;
}

// File: contracts/RandomGeneratorIF.sol

// @title RandomGeneratorIF
// @author Takayuki Jimba
contract RandomGeneratorIF {
    function generate() public returns(uint64);
}

// File: contracts/Sellable.sol

// @title Sellable
// @author Takayuki Jimba
// @dev Sell tokens.
//      Token is supposed to be Pickaxe contract in our contracts.
//      Actual transferring tokens operation is to be implemented in inherited contract.
contract Sellable is Ownable {
    using SafeMath for uint256;

    address public wallet;
    uint256 public rate;

    address public donationWallet;
    uint256 public donationRate;

    uint256 public constant MIN_WEI_AMOUNT = 5 * 10**15;

    event TokenPurchase(address indexed purchaser, address indexed beneficiary, uint256 value, uint256 amount);
    event ForwardFunds(address sender, uint256 value, uint256 deposit);
    event Donation(address sender, uint256 value);

    constructor(address _wallet, address _donationWallet, uint256 _donationRate) public {
        // 1 token = 0.005 ETH
        rate = 200;
        wallet = _wallet;
        donationWallet = _donationWallet;
        donationRate = _donationRate;
    }

    function setWallet(address _wallet) external onlyOwner {
        wallet = _wallet;
    }

    function setEthereumWallet(address _donationWallet) external onlyOwner {
        donationWallet = _donationWallet;
    }

    function () external payable {
        require(msg.value >= MIN_WEI_AMOUNT);
        buyPickaxes(msg.sender);
    }

    function buyPickaxes(address _beneficiary) public payable {
        require(msg.value >= MIN_WEI_AMOUNT);

        uint256 _weiAmount = msg.value;
        uint256 _tokens = _weiAmount.mul(rate).div(1 ether);

        require(_tokens.mul(1 ether).div(rate) == _weiAmount);

        _transferFromOwner(msg.sender, _tokens);
        emit TokenPurchase(msg.sender, _beneficiary, _weiAmount, _tokens);
        _forwardFunds();
    }

    function _transferFromOwner(address _to, uint256 _value) internal {
        /* MUST override */
    }

    function _forwardFunds() internal {
        uint256 donation = msg.value.div(donationRate); // 2%
        uint256 value = msg.value - donation;

        wallet.transfer(value);

        emit ForwardFunds(msg.sender, value, donation);

        uint256 donationEth = 2014000000000000000; // 2.014 ether
        if(address(this).balance >= donationEth) {
            donationWallet.transfer(donationEth);
            emit Donation(msg.sender, donationEth);
        }
    }
}

// File: contracts/CryptoCrystal.sol

// @title CryptoCrystal
// @author Takayuki Jimba
// @dev Almost all application specific logic is in this contract.
//      CryptoCrystal acts as a facade to Pixaxe(ERC20), CrystalBase(ERC721), ExchangeBase as to transactions.
contract CryptoCrystal is Sellable, EOACallable, CrystalWeightManager {
    PickaxeIF public pickaxe;
    CrystalBaseIF public crystal;
    ExchangeBaseIF public exchange;
    RandomGeneratorIF public generator;

    //event RandomGenerated(uint256 number);

    event MineCrystals(
        // miner of the crystal
        address indexed owner,
        // time of mining
        uint256 indexed minedAt,
        // tokenIds of mined crystals
        uint256[] tokenIds,
        // kinds of mined crystals
        uint256[] kinds,
        // weights of mined crystals
        uint256[] weights,
        // genes of mined crystals
        uint256[] genes
    );

    event MeltCrystals(
        // melter of the crystals
        address indexed owner,
        // time of melting
        uint256 indexed meltedAt,
        // tokenIds of melted crystals
        uint256[] meltedTokenIds,
        // tokenId of newly generated crystal
        uint256 tokenId,
        // kind of newly generated crystal
        uint256 kind,
        // weight of newly generated crystal
        uint256 weight,
        // gene of newly generated crystal
        uint256 gene
    );

    event CreateExchange(
        // id of exchange
        uint256 indexed id,
        // creator of the exchange
        address owner,
        // tokenId of exhibited crystal
        uint256 ownerTokenId,
        // gene of exhibited crystal
        uint256 ownerTokenGene,
        // kind of exhibited crystal
        uint256 ownerTokenKind,
        // weight of exhibited crystal
        uint256 ownerTokenWeight,
        // kind of condition for exchange
        uint256 kind,
        // weight of condition for exchange
        uint256 weight,
        // time of exchange creation
        uint256 createdAt
    );

    event CancelExchange(
        // id of excahnge
        uint256 indexed id,
        // creator of the exchange
        address owner,
        // tokenId of exhibited crystal
        uint256 ownerTokenId,
        // kind of exhibited crystal
        uint256 ownerTokenKind,
        // weight of exhibited crystal
        uint256 ownerTokenWeight,
        // time of exchange cancelling
        uint256 cancelledAt
    );

    event BidExchange(
        // id of exchange
        uint256 indexed id,
        // creator of the exchange
        address owner,
        // tokenId of exhibited crystal
        uint256 ownerTokenId,
        // gene of exhibited crystal
        uint256 ownerTokenGene,
        // kind of exhibited crystal
        uint256 ownerTokenKind,
        // weight of exhibited crystal
        uint256 ownerTokenWeight,
        // exchanger who bid to exchange
        address exchanger,
        // tokenId of crystal to exchange
        uint256 exchangerTokenId,
        // kind of crystal to exchange
        uint256 exchangerTokenKind,
        // weight of crystal to exchange (may not be the same to weight condition)
        uint256 exchangerTokenWeight,
        // time of bidding
        uint256 bidAt
    );

    struct ExchangeWrapper {
        uint256 id;
        address owner;
        uint256 tokenId;
        uint256 kind;
        uint256 weight;
        uint256 createdAt;
    }

    struct CrystalWrapper {
        address owner;
        uint256 tokenId;
        uint256 gene;
        uint256 kind;
        uint256 weight;
    }

    constructor(
        PickaxeIF _pickaxe,
        CrystalBaseIF _crystal,
        ExchangeBaseIF _exchange,
        RandomGeneratorIF _generator,
        address _wallet,
        address _donationWallet,
        uint256 _donationRate
    ) Sellable(_wallet, _donationWallet, _donationRate) public {
        pickaxe = _pickaxe;
        crystal = _crystal;
        exchange = _exchange;
        generator = _generator;
        setEstimatedWeight(0);
    }

    // @dev mineCrystals consists of two basic operations that burn pickaxes and mint crystals.
    // @param _pkxAmount uint256 the amount of tokens to be burned
    function mineCrystals(uint256 _pkxAmount) external onlyEOA {
        address _owner = msg.sender;
        require(pickaxe.balanceOf(msg.sender) >= _pkxAmount);
        require(0 < _pkxAmount && _pkxAmount <= 100);

        uint256 _crystalAmount = _getRandom(5);

        uint256[] memory _tokenIds = new uint256[](_crystalAmount);
        uint256[] memory _kinds = new uint256[](_crystalAmount);
        uint256[] memory _weights = new uint256[](_crystalAmount);
        uint256[] memory _genes = new uint256[](_crystalAmount);

        uint256[] memory _crystalWeightsCumsum = new uint256[](100);
        _crystalWeightsCumsum[0] = crystalWeights[0];
        for(uint256 i = 1; i < 100; i++) {
            _crystalWeightsCumsum[i] = _crystalWeightsCumsum[i - 1].add(crystalWeights[i]);
        }
        uint256 _totalWeight = _crystalWeightsCumsum[_crystalWeightsCumsum.length - 1];
        uint256 _weightRandomSum = 0;
        uint256 _weightSum = 0;

        for(i = 0; i < _crystalAmount; i++) {
            _weights[i] = _getRandom(100);
            _weightRandomSum = _weightRandomSum.add(_weights[i]);
        }

        for(i = 0; i < _crystalAmount; i++) {
            // Kind is decided randomly according to remaining crystal weights.
            // That means crystals of large quantity are chosen with high probability.
            _kinds[i] = _getFirstIndex(_getRandom(_totalWeight), _crystalWeightsCumsum);

            // Weight is decided randomly according to estimatedWeight.
            // EstimatedWeight is fixed (calculated in advance) in one mining.
            // EstimatedWeight is randomly divided into each of weight.
            // That means sum of weights is equal to EstimatedWeight.
            uint256 actualWeight = estimatedWeight.mul(_pkxAmount);
            _weights[i] = _weights[i].mul(actualWeight).div(_weightRandomSum);

            // Gene is decided randomly.
            _genes[i] = _generateGene();

            require(_weights[i] > 0);

            _tokenIds[i] = crystal.mint(_owner, _genes[i], _kinds[i], _weights[i]);

            crystalWeights[_kinds[i]] = crystalWeights[_kinds[i]].sub(_weights[i]);

            _weightSum = _weightSum.add(_weights[i]);
        }

        setEstimatedWeight(_weightSum);
        pickaxe.burn(msg.sender, _pkxAmount);

        emit MineCrystals(
        _owner,
        now,
        _tokenIds,
        _kinds,
        _weights,
        _genes
        );
    }

    // @dev meltCrystals consists of two basic operations.
    //      It burns old crystals and mint new crystal.
    //      The weight of new crystal is the same to total weight of bunred crystals.
    // @notice meltCrystals may have bugs. We will fix later.
    // @param uint256[] _tokenIds the token ids of crystals to be melt
    function meltCrystals(uint256[] _tokenIds) external onlyEOA {
        uint256 _length = _tokenIds.length;
        address _owner = msg.sender;

        require(2 <= _length && _length <= 10);

        uint256[] memory _kinds = new uint256[](_length);
        uint256 _weight;
        uint256 _totalWeight = 0;

        for(uint256 i = 0; i < _length; i++) {
            require(crystal.ownerOf(_tokenIds[i]) == _owner);
            (_kinds[i], _weight) = crystal.getCrystalKindWeight(_tokenIds[i]);
            if (i != 0) {
                require(_kinds[i] == _kinds[i - 1]);
            }

            _totalWeight = _totalWeight.add(_weight);
            crystal.burn(_owner, _tokenIds[i]);
        }

        uint256 _gene = _generateGene();
        uint256 _tokenId = crystal.mint(_owner, _gene, _kinds[0], _totalWeight);

        emit MeltCrystals(_owner, now, _tokenIds, _tokenId, _kinds[0], _totalWeight, _gene);
    }

    // @dev create exchange
    // @param uint256 _tokenId tokenId you want to exchange
    // @param uint256 _kind crystal kind you want to get
    // @param uint256 _weight minimum crystal weight you want to get
    function createExchange(uint256 _tokenId, uint256 _kind, uint256 _weight) external onlyEOA {
        ExchangeWrapper memory _ew = ExchangeWrapper({
            id: 0, // specify after
            owner: msg.sender,
            tokenId: _tokenId,
            kind: _kind,
            weight: _weight,
            createdAt: 0
            });

        CrystalWrapper memory _cw = getCrystalWrapper(msg.sender, _tokenId);

        require(crystal.ownerOf(_tokenId) == _cw.owner);
        require(_kind < 100);

        // escrow crystal to exchange contract
        crystal._transferFrom(_cw.owner, exchange, _tokenId);

        _ew.id = exchange.create(_ew.owner, _tokenId, _cw.gene, _cw.kind, _cw.weight, _ew.kind, _ew.weight, now);

        emit CreateExchange(_ew.id, _ew.owner, _ew.tokenId, _cw.gene, _cw.kind, _cw.weight, _ew.kind, _ew.weight, now);
    }

    function getCrystalWrapper(address _owner, uint256 _tokenId) internal returns(CrystalWrapper) {
        CrystalWrapper memory _cw;
        _cw.owner = _owner;
        _cw.tokenId = _tokenId;
        (_cw.gene, _cw.kind, _cw.weight) = crystal.getCrystalGeneKindWeight(_tokenId);
        return _cw;
    }

    // @dev cancel exchange
    // @param uint256 _id exchangeId you want to cancel
    function cancelExchange(uint256 _id) external onlyEOA {
        require(exchange.ownerOf(_id) == msg.sender);

        uint256 _tokenId = exchange.getTokenId(_id);

        CrystalWrapper memory _cw = getCrystalWrapper(msg.sender, _tokenId);

        // withdraw crystal from exchange contract
        crystal._transferFrom(exchange, _cw.owner, _cw.tokenId);

        exchange.remove(_id);

        emit CancelExchange(_id, _cw.owner, _cw.tokenId, _cw.kind, _cw.weight, now);
    }

    // @dev bid exchange
    // @param uint256 _exchangeId exchange id you want to bid
    // @param uint256 _tokenId token id of your crystal to be exchanged
    function bidExchange(uint256 _exchangeId, uint256 _tokenId) external onlyEOA {
        // exchange
        ExchangeWrapper memory _ew;
        _ew.id = _exchangeId;
        (_ew.owner, _ew.tokenId, _ew.kind, _ew.weight, _ew.createdAt) = exchange.getExchange(_ew.id); // check existence

        // crystal of exchanger
        CrystalWrapper memory _cwe = getCrystalWrapper(msg.sender, _tokenId);

        // crystal of creator of exchange
        CrystalWrapper memory _cwo = getCrystalWrapper(_ew.owner, _ew.tokenId);

        require(_cwe.owner != _ew.owner);
        require(_cwe.kind == _ew.kind);
        require(_cwe.weight >= _ew.weight);

        // transfer my crystal to owner of exchange
        crystal._transferFrom(_cwe.owner, _ew.owner, _cwe.tokenId);

        // transfer escrowed crystal to me.
        crystal._transferFrom(exchange, _cwe.owner, _ew.tokenId);

        exchange.remove(_ew.id);

        emit BidExchange(_ew.id, _ew.owner, _ew.tokenId, _cwo.gene, _cwo.kind, _cwo.weight, _cwe.owner, _cwe.tokenId, _cwe.kind, _cwe.weight, now);
    }

    // @dev get index when cumsum[i] exceeds _in first.
    // @param uint256 _min
    // @param uint256[] _sorted array is required to be sorted by ascending order
    function _getFirstIndex(uint256 _min, uint256[] _sorted) public pure returns(uint256) {
        for(uint256 i = 0; i < _sorted.length; i++) {
            if(_min < _sorted[i]) {
                return i;
            }
        }
        return _sorted.length - 1;
    }

    function _transferFromOwner(address _to, uint256 _value) internal {
        pickaxe.transferFromOwner(_to, _value);
    }

    function _generateGene() internal returns(uint256) {
        return _getRandom(~uint256(0));
    }

    function _getRandom(uint256 _max) public returns(uint256){
        bytes32 hash = keccak256(generator.generate());
        uint256 number = (uint256(hash) % _max) + 1;
        //emit RandomGenerated(number);
        return number;
    }

    // @dev change random generator
    // @param RandomGeneratorIF randomGenerator contract address
    function setRandomGenerator(RandomGeneratorIF _generator) external onlyOwner {
        generator = _generator;
    }
}

Contract ABI
[{"constant":false,"inputs":[{"name":"_beneficiary","type":"address"}],"name":"buyPickaxes","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"donationRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_initialBlockNumber","type":"uint256"},{"name":"_currentBlockNumber","type":"uint256"},{"name":"_secondsPerBlock","type":"uint256"}],"name":"_getBlockIndexAtYear","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"_totalWeight","type":"uint256"},{"name":"_yearIndex","type":"uint256"}],"name":"_getWeightUntil","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"_min","type":"uint256"},{"name":"_sorted","type":"uint256[]"}],"name":"_getFirstIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"secondsPerYear","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"blockNumberUpdated","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"currentWeight","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"estimatedWeight","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_secondsPerBlock","type":"uint256"},{"name":"_initialBlockNumber","type":"uint256"},{"name":"_currentBlockNumber","type":"uint256"},{"name":"_totalWeight","type":"uint256"}],"name":"_estimateSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"originalTotalWeight","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_generator","type":"address"}],"name":"setRandomGenerator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"wallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_secondsPerBlock","type":"uint256"},{"name":"_initialBlockNumber","type":"uint256"},{"name":"_currentBlockNumber","type":"uint256"}],"name":"_getYearIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"uint256"}],"name":"cancelExchange","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"secondsPerDay","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"_kind","type":"uint256"},{"name":"_weight","type":"uint256"}],"name":"createExchange","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"secondsPerBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"generator","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_donationWallet","type":"address"}],"name":"setEthereumWallet","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_secondsPerBlock","type":"uint256"}],"name":"_getBlocksPerYear","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_tokenIds","type":"uint256[]"}],"name":"meltCrystals","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"crystal","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_initialBlockNumber","type":"uint256"},{"name":"_currentBlockNumber","type":"uint256"}],"name":"_getBlockIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"_secondsPerBlock","type":"uint256"},{"name":"_currentBlockNumber","type":"uint256"},{"name":"_blockNumberUpdated","type":"uint256"}],"name":"_updateNeeded","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"_secondsPerBlock","type":"uint256"},{"name":"_initialBlockNumber","type":"uint256"},{"name":"_currentBlockNumber","type":"uint256"},{"name":"_totalWeight","type":"uint256"},{"name":"_currentWeight","type":"uint256"}],"name":"_estimateWeight","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"_secondsPerBlock","type":"uint256"}],"name":"_getWaitingBlocks","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"initialBlockNumber","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_pkxAmount","type":"uint256"}],"name":"mineCrystals","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"exchange","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_exchangeId","type":"uint256"},{"name":"_tokenId","type":"uint256"}],"name":"bidExchange","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_max","type":"uint256"}],"name":"_getRandom","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getCrystalWeights","outputs":[{"name":"","type":"uint256[100]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"}],"name":"setWallet","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"donationWallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_WEI_AMOUNT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"pickaxe","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_pickaxe","type":"address"},{"name":"_crystal","type":"address"},{"name":"_exchange","type":"address"},{"name":"_generator","type":"address"},{"name":"_wallet","type":"address"},{"name":"_donationWallet","type":"address"},{"name":"_donationRate","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"minedAt","type":"uint256"},{"indexed":false,"name":"tokenIds","type":"uint256[]"},{"indexed":false,"name":"kinds","type":"uint256[]"},{"indexed":false,"name":"weights","type":"uint256[]"},{"indexed":false,"name":"genes","type":"uint256[]"}],"name":"MineCrystals","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"meltedAt","type":"uint256"},{"indexed":false,"name":"meltedTokenIds","type":"uint256[]"},{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"kind","type":"uint256"},{"indexed":false,"name":"weight","type":"uint256"},{"indexed":false,"name":"gene","type":"uint256"}],"name":"MeltCrystals","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"id","type":"uint256"},{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"ownerTokenId","type":"uint256"},{"indexed":false,"name":"ownerTokenGene","type":"uint256"},{"indexed":false,"name":"ownerTokenKind","type":"uint256"},{"indexed":false,"name":"ownerTokenWeight","type":"uint256"},{"indexed":false,"name":"kind","type":"uint256"},{"indexed":false,"name":"weight","type":"uint256"},{"indexed":false,"name":"createdAt","type":"uint256"}],"name":"CreateExchange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"id","type":"uint256"},{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"ownerTokenId","type":"uint256"},{"indexed":false,"name":"ownerTokenKind","type":"uint256"},{"indexed":false,"name":"ownerTokenWeight","type":"uint256"},{"indexed":false,"name":"cancelledAt","type":"uint256"}],"name":"CancelExchange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"id","type":"uint256"},{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"ownerTokenId","type":"uint256"},{"indexed":false,"name":"ownerTokenGene","type":"uint256"},{"indexed":false,"name":"ownerTokenKind","type":"uint256"},{"indexed":false,"name":"ownerTokenWeight","type":"uint256"},{"indexed":false,"name":"exchanger","type":"address"},{"indexed":false,"name":"exchangerTokenId","type":"uint256"},{"indexed":false,"name":"exchangerTokenKind","type":"uint256"},{"indexed":false,"name":"exchangerTokenWeight","type":"uint256"},{"indexed":false,"name":"bidAt","type":"uint256"}],"name":"BidExchange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"weight","type":"uint256"},{"indexed":false,"name":"nextUpdateBlockNumber","type":"uint256"}],"name":"UpdateEstimatedWeight","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"purchaser","type":"address"},{"indexed":true,"name":"beneficiary","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"TokenPurchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"deposit","type":"uint256"}],"name":"ForwardFunds","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Donation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

Contract Creation Code
6080604052610c8060405190810160405280640ba43b740065ffffffffffff1681526020016434ce555c0065ffffffffffff1681526020016501319718a50065ffffffffffff1681526020016407558bdb0065ffffffffffff1681526020016436e890398065ffffffffffff16815260200164233438e80065ffffffffffff16815260200164988cf6980065ffffffffffff16815260200164c1220d870065ffffffffffff1681526020016401abd388e765ffffffffffff16815260200164b17c9ee70065ffffffffffff168152602001649f6556fe0065ffffffffffff168152602001649d70a92a0065ffffffffffff16815260200164012c3dfa4265ffffffffffff1681526020016407298a93de65ffffffffffff1681526020016417dfcdece465ffffffffffff1681526020016417dfcdece465ffffffffffff1681526020016417dfcdece465ffffffffffff1681526020016401319718a565ffffffffffff1681526020016407558bdb0065ffffffffffff16815260200164012c684c0065ffffffffffff1681526020016404c65c629465ffffffffffff1681526020016404c65c629465ffffffffffff1681526020016402632e314a65ffffffffffff16815260200164012b7a796e65ffffffffffff168152602001640177825f0065ffffffffffff1681526020016404c65c629465ffffffffffff1681526020016417dfcdece465ffffffffffff1681526020016417dfcdece465ffffffffffff1681526020016417dfcdece465ffffffffffff1681526020016417dfcdece465ffffffffffff1681526020016417dfcdece465ffffffffffff1681526020016401ca62a4f765ffffffffffff168152602001640394c549ef65ffffffffffff1681526020016410229a150065ffffffffffff1681526020016402632e314a65ffffffffffff168152602001647f5eb88e8065ffffffffffff168152602001640394c549ef65ffffffffffff1681526020016404c65c629465ffffffffffff168152602001640394c549ef65ffffffffffff168152602001640394c549ef65ffffffffffff1681526020016404c65c629465ffffffffffff168152602001640394c549ef65ffffffffffff1681526020016401ca62a4f765ffffffffffff1681526020016423cfb4e35665ffffffffffff16815260200164157c9fbb9a65ffffffffffff1681526020016417dfcdece465ffffffffffff1681526020016410b643590665ffffffffffff168152602001641319718a5065ffffffffffff168152602001643baf82d03a65ffffffffffff1681526020016501424d5bfe0665ffffffffffff16815260200164befe6f672065ffffffffffff16815260200164ad1694f57565ffffffffffff168152602001646b6f1eaa0265ffffffffffff16815260200164834eec96e665ffffffffffff168152602001647d56f91bad65ffffffffffff16815260200164538f50bd1e65ffffffffffff168152602001643baf82d03a65ffffffffffff16815260200164538f50bd1e65ffffffffffff1681526020016417dfcdece465ffffffffffff16815260200164479f69c6ac65ffffffffffff168152602001643baf82d03a65ffffffffffff168152602001640befe6f67265ffffffffffff16815260200164098cb8c52865ffffffffffff16815260200164479f69c6ac65ffffffffffff16815260200164479f69c6ac65ffffffffffff168152602001637a3c704265ffffffffffff16815260200163d5e9c47365ffffffffffff1681526020016398cb8c5265ffffffffffff1681526020016401319718a565ffffffffffff168152602001645d1c09824665ffffffffffff168152602001648f3ed38d5865ffffffffffff16815260200164834eec96e665ffffffffffff168152602001646b6f1eaa0265ffffffffffff16815260200164538f50bd1e65ffffffffffff16815260200164a71ea17a3c65ffffffffffff16815260200164098cb8c52865ffffffffffff16815260200164098cb8c52865ffffffffffff168152602001637a3c704265ffffffffffff1681526020016417dfcdece465ffffffffffff1681526020016417dfcdece465ffffffffffff168152602001640befe6f67265ffffffffffff1681526020016417dfcdece465ffffffffffff1681526020016407298a93de65ffffffffffff16815260200164098cb8c52865ffffffffffff1681526020016417dfcdece465ffffffffffff1681526020016417dfcdece465ffffffffffff1681526020016417dfcdece465ffffffffffff168152602001642fbf9bd9c865ffffffffffff168152602001642fbf9bd9c865ffffffffffff168152602001648191fc1d0065ffffffffffff16815260200164990a220d0065ffffffffffff16815260200164098cb8c52865ffffffffffff1681526020016417dfcdece465ffffffffffff1681526020016407298a93de65ffffffffffff1681526020016417dfcdece465ffffffffffff1681526020016404c65c629465ffffffffffff1681526020016404c65c629465ffffffffffff1681526020016404c65c629465ffffffffffff1681526020016404c65c629465ffffffffffff168152602001641319718a5065ffffffffffff1681525060059060646200078b9291906200102a565b50600c60695543606a556000606b556000606c556000606d55348015620007b157600080fd5b5060405160e08062004c6c83398101806040528101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050828282336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c860028190555082600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060048190555050505086606e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085606f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084607060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083607160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000a07600062000a14640100000000026401000000009004565b50505050505050620010a1565b60008062000a3c83606b5462000aec6401000000000262003899179091906401000000009004565b606b8190555043915062000a6560695483606d5462000b0b640100000000026401000000009004565b9050801562000ae75762000a98606954606a548465befe6f672000606b5462000b4f640100000000026401000000009004565b606c8190555081606d819055507fb9a2ce1061b71fbf2ee90bb8feed7941f9d6f8b6fe67bce1822774c5fc9844af606c5483604051808381526020018281526020019250505060405180910390a15b505050565b600080828401905083811015151562000b0157fe5b8091505092915050565b600080600083141562000b22576001915062000b47565b62000b3c8562000c4a640100000000026401000000009004565b905080830184101591505b509392505050565b600080600080600062000b748a8a8a8a62000c79640100000000026401000000009004565b935062000b928a8a8a62000dae640100000000026401000000009004565b92508260020a915061271090508386111562000c175762000c0f8262000bf28862000bd5858962000e1a6401000000000262003547179091906401000000009004565b62000e596401000000000262003582179091906401000000009004565b62000e596401000000000262003582179091906401000000009004565b945062000c3d565b62000c3a828262000e596401000000000262003582179091906401000000009004565b94505b5050505095945050505050565b600062000c72826201518062000e596401000000000262003582179091906401000000009004565b9050919050565b600080600080600080600062000ca08b8b8b62000dae640100000000026401000000009004565b9550600162000cc08b8b8e62000e75640100000000026401000000009004565b01945062000d088562000ceb8d8b62000e1a6401000000000262003547179091906401000000009004565b62000e1a6401000000000262003547179091906401000000009004565b93506001860160020a925062000d3a6301e133808462000e1a6401000000000262003547179091906401000000009004565b915062000d9b62000d5b898862000f3d640100000000026401000000009004565b62000d7e848762000e596401000000000262003582179091906401000000009004565b62000aec6401000000000262003899179091906401000000009004565b9050809650505050505050949350505050565b600080600062000dce858562000fa3640100000000026401000000009004565b915062000dea8662000fe0640100000000026401000000009004565b905062000e0f818362000e596401000000000262003582179091906401000000009004565b925050509392505050565b600080600084141562000e31576000915062000e52565b828402905082848281151562000e4357fe5b0414151562000e4e57fe5b8091505b5092915050565b600080828481151562000e6857fe5b0490508091505092915050565b600080600085851015151562000e8a57600080fd5b62000ead8686620010106401000000000262003880179091906401000000009004565b915062000ec98462000fe0640100000000026401000000009004565b905062000f3262000f148262000ef7848662000e596401000000000262003582179091906401000000009004565b62000e1a6401000000000262003547179091906401000000009004565b83620010106401000000000262003880179091906401000000009004565b925050509392505050565b6000806000809150600090505b8381101562000f985762000f886001820160020a8681151562000f6957fe5b048362000aec6401000000000262003899179091906401000000009004565b9150808060010191505062000f4a565b819250505092915050565b600082821015151562000fb557600080fd5b62000fd88383620010106401000000000262003880179091906401000000009004565b905092915050565b600062001009826301e1338062000e596401000000000262003582179091906401000000009004565b9050919050565b60008282111515156200101f57fe5b818303905092915050565b826064810192821562001066579160200282015b8281111562001065578251829065ffffffffffff169055916020019190600101906200103e565b5b50905062001075919062001079565b5090565b6200109e91905b808211156200109a57600081600090555060010162001080565b5090565b90565b613bbb80620010b16000396000f3006080604052600436106101ee576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063032946141461020f5780630d38ffcd1461024557806313c1629c1461027057806314c65687146102c557806314c72e9e14610310578063252e40b1146103945780632c4e722e146103bf57806330b5198f146103ea57806332b85a4414610415578063473533e6146104405780634786cfea1461046b57806349716f5a146104ca5780634bc19fee146104f5578063521eb273146105385780635cb603dd1461058f5780635d3d08a8146105e457806363809953146106115780637909da6f1461063c5780637a7d49371461067d5780637afa1eed146106a8578063815a4876146106ff57806384cb4fec14610742578063889087b1146107835780638da5cb5b146107be578063971a9091146108155780639a6846581461086c578063aa36b52e146108b7578063aa41d60514610910578063b348036914610979578063b3ae65d7146109ba578063c67415f3146109e5578063d2f7265a14610a12578063d3e212c514610a69578063dd1e4e1114610aa0578063ddfa3a6014610ae1578063deaa59df14610b34578063e7b94df414610b77578063e95f206e14610bce578063f2fde38b14610bf9578063fa922e6614610c3c575b6611c37937e08000341015151561020457600080fd5b61020d33610c93565b005b610243600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c93565b005b34801561025157600080fd5b5061025a610da0565b6040518082815260200191505060405180910390f35b34801561027c57600080fd5b506102af600480360381019080803590602001909291908035906020019092919080359060200190929190505050610da6565b6040518082815260200191505060405180910390f35b3480156102d157600080fd5b506102fa6004803603810190808035906020019092919080359060200190929190505050610e1c565b6040518082815260200191505060405180910390f35b34801561031c57600080fd5b5061037e6004803603810190808035906020019092919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290505050610e6f565b6040518082815260200191505060405180910390f35b3480156103a057600080fd5b506103a9610ec3565b6040518082815260200191505060405180910390f35b3480156103cb57600080fd5b506103d4610ecb565b6040518082815260200191505060405180910390f35b3480156103f657600080fd5b506103ff610ed1565b6040518082815260200191505060405180910390f35b34801561042157600080fd5b5061042a610ed7565b6040518082815260200191505060405180910390f35b34801561044c57600080fd5b50610455610edd565b6040518082815260200191505060405180910390f35b34801561047757600080fd5b506104b460048036038101908080359060200190929190803590602001909291908035906020019092919080359060200190929190505050610ee3565b6040518082815260200191505060405180910390f35b3480156104d657600080fd5b506104df610f95565b6040518082815260200191505060405180910390f35b34801561050157600080fd5b50610536600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f9f565b005b34801561054457600080fd5b5061054d61103e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561059b57600080fd5b506105ce600480360381019080803590602001909291908035906020019092919080359060200190929190505050611064565b6040518082815260200191505060405180910390f35b3480156105f057600080fd5b5061060f6004803603810190808035906020019092919050505061109e565b005b34801561061d57600080fd5b50610626611519565b6040518082815260200191505060405180910390f35b34801561064857600080fd5b5061067b600480360381019080803590602001909291908035906020019092919080359060200190929190505050611520565b005b34801561068957600080fd5b506106926119fc565b6040518082815260200191505060405180910390f35b3480156106b457600080fd5b506106bd611a02565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561070b57600080fd5b50610740600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a28565b005b34801561074e57600080fd5b5061076d60048036038101908080359060200190929190505050611ac7565b6040518082815260200191505060405180910390f35b34801561078f57600080fd5b506107bc600480360381019080803590602001908201803590602001919091929391929390505050611ae7565b005b3480156107ca57600080fd5b506107d36120d5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561082157600080fd5b5061082a6120fa565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561087857600080fd5b506108a16004803603810190808035906020019092919080359060200190929190505050612120565b6040518082815260200191505060405180910390f35b3480156108c357600080fd5b506108f660048036038101908080359060200190929190803590602001909291908035906020019092919050505061214c565b604051808215151515815260200191505060405180910390f35b34801561091c57600080fd5b50610963600480360381019080803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919050505061217d565b6040518082815260200191505060405180910390f35b34801561098557600080fd5b506109a460048036038101908080359060200190929190505050612214565b6040518082815260200191505060405180910390f35b3480156109c657600080fd5b506109cf612233565b6040518082815260200191505060405180910390f35b3480156109f157600080fd5b50610a1060048036038101908080359060200190929190505050612239565b005b348015610a1e57600080fd5b50610a27612b3c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610a7557600080fd5b50610a9e6004803603810190808035906020019092919080359060200190929190505050612b62565b005b348015610aac57600080fd5b50610acb60048036038101908080359060200190929190505050613186565b6040518082815260200191505060405180910390f35b348015610aed57600080fd5b50610af66132b1565b6040518082606460200280838360005b83811015610b21578082015181840152602081019050610b06565b5050505090500191505060405180910390f35b348015610b4057600080fd5b50610b75600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506132fc565b005b348015610b8357600080fd5b50610b8c61339b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610bda57600080fd5b50610be36133c1565b6040518082815260200191505060405180910390f35b348015610c0557600080fd5b50610c3a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506133cc565b005b348015610c4857600080fd5b50610c51613521565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6000806611c37937e080003410151515610cac57600080fd5b349150610cde670de0b6b3a7640000610cd06002548561354790919063ffffffff16565b61358290919063ffffffff16565b905081610d10600254610d02670de0b6b3a76400008561354790919063ffffffff16565b61358290919063ffffffff16565b141515610d1c57600080fd5b610d26338261359d565b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f623b3804fa71d67900d064613da8f94b9617215ee90799290593e1745087ad188484604051808381526020018281526020019250505060405180910390a3610d9b61367e565b505050565b60045481565b6000806000858510151515610dba57600080fd5b610dcd868661388090919063ffffffff16565b9150610dd884611ac7565b9050610e11610e0282610df4848661358290919063ffffffff16565b61354790919063ffffffff16565b8361388090919063ffffffff16565b925050509392505050565b6000806000809150600090505b83811015610e6457610e556001820160020a86811515610e4557fe5b048361389990919063ffffffff16565b91508080600101915050610e29565b819250505092915050565b600080600090505b8251811015610eb4578281815181101515610e8e57fe5b90602001906020020151841015610ea757809150610ebc565b8080600101915050610e77565b600183510391505b5092915050565b6301e1338081565b60025481565b606d5481565b606b5481565b606c5481565b6000806000806000806000610ef98b8b8b611064565b95506001610f088b8b8e610da6565b019450610f3085610f228d8b61354790919063ffffffff16565b61354790919063ffffffff16565b93506001860160020a9250610f526301e133808461354790919063ffffffff16565b9150610f82610f618988610e1c565b610f74848761358290919063ffffffff16565b61389990919063ffffffff16565b9050809650505050505050949350505050565b65befe6f67200081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610ffa57600080fd5b80607160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060006110738585612120565b915061107e86611ac7565b9050611093818361358290919063ffffffff16565b925050509392505050565b60006110a8613ad8565b6110b1336138b7565b1515156110bd57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff16607060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15801561116557600080fd5b505af1158015611179573d6000803e3d6000fd5b505050506040513d602081101561118f57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff161415156111c257600080fd5b607060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314ff5ea3846040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15801561125357600080fd5b505af1158015611267573d6000803e3d6000fd5b505050506040513d602081101561127d57600080fd5b8101908080519060200190929190505050915061129a33836138ca565b9050606f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb712535607060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836000015184602001516040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1580156113bf57600080fd5b505af11580156113d3573d6000803e3d6000fd5b50505050607060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634cc82215846040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b15801561146857600080fd5b505af115801561147c573d6000803e3d6000fd5b50505050827fd4d8d3838d177b895f32762da601506feae7134f9f3e3a286d256f79d40c3972826000015183602001518460600151856080015142604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a2505050565b6201518081565b611528613b1e565b611530613ad8565b611539336138b7565b15151561154557600080fd5b60c060405190810160405280600081526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018481526020016000815250915061159733866138ca565b9050806000015173ffffffffffffffffffffffffffffffffffffffff16606f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e876040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15801561164557600080fd5b505af1158015611659573d6000803e3d6000fd5b505050506040513d602081101561166f57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff161415156116a257600080fd5b6064841015156116b157600080fd5b606f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb7125358260000151607060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16886040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1580156117d057600080fd5b505af11580156117e4573d6000803e3d6000fd5b50505050607060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166352638d7583602001518784604001518560600151866080015188606001518960800151426040518963ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200188815260200187815260200186815260200185815260200184815260200183815260200182815260200198505050505050505050602060405180830381600087803b1580156118f557600080fd5b505af1158015611909573d6000803e3d6000fd5b505050506040513d602081101561191f57600080fd5b810190808051906020019092919050505082600001818152505081600001517fb18c9515006d8d9e31fb76eddb92e53ba7e8ec9e6d683e5fcab1e18ec4bb98e4836020015184604001518460400151856060015186608001518860600151896080015142604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019850505050505050505060405180910390a25050505050565b60695481565b607160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a8357600080fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611ae0826301e1338061358290919063ffffffff16565b9050919050565b60008060606000806000806000611afd336138b7565b151515611b0957600080fd5b89899050975033965087600211158015611b245750600a8811155b1515611b2f57600080fd5b87604051908082528060200260200182016040528015611b5e5781602001602082028038833980820191505090505b50955060009350600092505b87831015611ef1578673ffffffffffffffffffffffffffffffffffffffff16606f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8c8c878181101515611bd557fe5b905060200201356040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b158015611c2e57600080fd5b505af1158015611c42573d6000803e3d6000fd5b505050506040513d6020811015611c5857600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16141515611c8b57600080fd5b606f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663af62a7088b8b868181101515611cd757fe5b905060200201356040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808281526020019150506040805180830381600087803b158015611d2f57600080fd5b505af1158015611d43573d6000803e3d6000fd5b505050506040513d6040811015611d5957600080fd5b8101908080519060200190929190805190602001909291905050508785815181101515611d8257fe5b906020019060200201819750828152505050600083141515611dde578560018403815181101515611daf57fe5b906020019060200201518684815181101515611dc757fe5b90602001906020020151141515611ddd57600080fd5b5b611df1858561389990919063ffffffff16565b9350606f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac888c8c878181101515611e4057fe5b905060200201356040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015611ecc57600080fd5b505af1158015611ee0573d6000803e3d6000fd5b505050508280600101935050611b6a565b611ef9613a21565b9150606f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a647e8ec8884896000815181101515611f4a57fe5b90602001906020020151886040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001848152602001838152602001828152602001945050505050602060405180830381600087803b158015611fe857600080fd5b505af1158015611ffc573d6000803e3d6000fd5b505050506040513d602081101561201257600080fd5b81019080805190602001909291905050509050428773ffffffffffffffffffffffffffffffffffffffff167f9a2f4e8b8b46a06a6a22027ad11ae098be40d52fb6263f7c0baf02c4e1bc17a08c8c858b600081518110151561207057fe5b906020019060200201518a8960405180806020018681526020018581526020018481526020018381526020018281038252888882818152602001925060200280828437820191505097505050505050505060405180910390a350505050505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600082821015151561213157600080fd5b612144838361388090919063ffffffff16565b905092915050565b60008060008314156121615760019150612175565b61216a85612214565b905080830184101591505b509392505050565b60008060008060006121918a8a8a8a610ee3565b935061219e8a8a8a611064565b92508260020a91506127109050838611156121f1576121ea826121dc886121ce858961354790919063ffffffff16565b61358290919063ffffffff16565b61358290919063ffffffff16565b9450612207565b612204828261358290919063ffffffff16565b94505b5050505095945050505050565b600061222c826201518061358290919063ffffffff16565b9050919050565b606a5481565b60008060608060608060606000806000806000612255336138b7565b15151561226157600080fd5b339b508c606e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561232257600080fd5b505af1158015612336573d6000803e3d6000fd5b505050506040513d602081101561234c57600080fd5b81019080805190602001909291905050501015151561236a57600080fd5b8c600010801561237b575060648d11155b151561238657600080fd5b6123906005613186565b9a508a6040519080825280602002602001820160405280156123c15781602001602082028038833980820191505090505b5099508a6040519080825280602002602001820160405280156123f35781602001602082028038833980820191505090505b5098508a6040519080825280602002602001820160405280156124255781602001602082028038833980820191505090505b5097508a6040519080825280602002602001820160405280156124575781602001602082028038833980820191505090505b509650606460405190808252806020026020018201604052801561248a5781602001602082028038833980820191505090505b5095506005600060648110151561249d57fe5b01548660008151811015156124ae57fe5b9060200190602002018181525050600194505b6064851015612530576125076005866064811015156124dc57fe5b015487600188038151811015156124ef57fe5b9060200190602002015161389990919063ffffffff16565b868681518110151561251557fe5b906020019060200201818152505084806001019550506124c1565b85600187510381518110151561254257fe5b9060200190602002015193506000925060009150600094505b8a8510156125c25761256d6064613186565b888681518110151561257b57fe5b90602001906020020181815250506125b3888681518110151561259a57fe5b906020019060200201518461389990919063ffffffff16565b9250848060010195505061255b565b600094505b8a8510156128dc576125e16125db85613186565b87610e6f565b89868151811015156125ef57fe5b90602001906020020181815250506126128d606c5461354790919063ffffffff16565b905061265083612642838b8981518110151561262a57fe5b9060200190602002015161354790919063ffffffff16565b61358290919063ffffffff16565b888681518110151561265e57fe5b9060200190602002018181525050612674613a21565b878681518110151561268257fe5b9060200190602002018181525050600088868151811015156126a057fe5b906020019060200201511115156126b657600080fd5b606f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a647e8ec8d898881518110151561270357fe5b906020019060200201518c8981518110151561271b57fe5b906020019060200201518c8a81518110151561273357fe5b906020019060200201516040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001848152602001838152602001828152602001945050505050602060405180830381600087803b1580156127d057600080fd5b505af11580156127e4573d6000803e3d6000fd5b505050506040513d60208110156127fa57600080fd5b81019080805190602001909291905050508a8681518110151561281957fe5b9060200190602002018181525050612878888681518110151561283857fe5b9060200190602002015160058b8881518110151561285257fe5b9060200190602002015160648110151561286857fe5b015461388090919063ffffffff16565b60058a8781518110151561288857fe5b9060200190602002015160648110151561289e57fe5b01819055506128cd88868151811015156128b457fe5b906020019060200201518361389990919063ffffffff16565b915084806001019550506125c7565b6128e582613a33565b606e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac338f6040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156129aa57600080fd5b505af11580156129be573d6000803e3d6000fd5b50505050428c73ffffffffffffffffffffffffffffffffffffffff167f23c59a8ab07b391d91ac8ab3319ad5e959ded915308b151c7ca552c56e8b35a38c8c8c8c6040518080602001806020018060200180602001858103855289818151815260200191508051906020019060200280838360005b83811015612a4e578082015181840152602081019050612a33565b50505050905001858103845288818151815260200191508051906020019060200280838360005b83811015612a90578082015181840152602081019050612a75565b50505050905001858103835287818151815260200191508051906020019060200280838360005b83811015612ad2578082015181840152602081019050612ab7565b50505050905001858103825286818151815260200191508051906020019060200280838360005b83811015612b14578082015181840152602081019050612af9565b505050509050019850505050505050505060405180910390a350505050505050505050505050565b607060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612b6a613b1e565b612b72613ad8565b612b7a613ad8565b612b83336138b7565b151515612b8f57600080fd5b84836000018181525050607060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630b9d584784600001516040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060a060405180830381600087803b158015612c2e57600080fd5b505af1158015612c42573d6000803e3d6000fd5b505050506040513d60a0811015612c5857600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291905050508760200188604001896060018a6080018b60a001858152508581525085815250858152508573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505050505050612cf433856138ca565b9150612d08836020015184604001516138ca565b9050826020015173ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614151515612d4d57600080fd5b82606001518260600151141515612d6357600080fd5b8260800151826080015110151515612d7a57600080fd5b606f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb7125358360000151856020015185602001516040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b158015612e7f57600080fd5b505af1158015612e93573d6000803e3d6000fd5b50505050606f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb712535607060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846000015186604001516040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b158015612fba57600080fd5b505af1158015612fce573d6000803e3d6000fd5b50505050607060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634cc8221584600001516040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b15801561306757600080fd5b505af115801561307b573d6000803e3d6000fd5b5050505082600001517f5514510acd7becd44fa4def480d977880b8c94af90a31acbd616949850f15d5684602001518560400151846040015185606001518660800151886000015189602001518a606001518b6080015142604051808b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018a81526020018981526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019a505050505050505050505060405180910390a25050505050565b6000806000607160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632a1bbc346040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561321157600080fd5b505af1158015613225573d6000803e3d6000fd5b505050506040513d602081101561323b57600080fd5b8101908080519060200190929190505050604051808267ffffffffffffffff1667ffffffffffffffff1678010000000000000000000000000000000000000000000000000281526008019150506040518091039020915060018483600190048115156132a357fe5b060190508092505050919050565b6132b9613b6b565b60056064806020026040519081016040528092919082606480156132f2576020028201915b8154815260200190600101908083116132de575b5050505050905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561335757600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6611c37937e0800081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561342757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561346357600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600084141561355c576000915061357b565b828402905082848281151561356d57fe5b0414151561357757fe5b8091505b5092915050565b600080828481151561359057fe5b0490508091505092915050565b606e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630f18ac0783836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561366257600080fd5b505af1158015613676573d6000803e3d6000fd5b505050505050565b60008060006136986004543461358290919063ffffffff16565b92508234039150600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015613707573d6000803e3d6000fd5b507ff56ba0f53476ddecea8bd2db761e216b2386c1f4c7b53e8667ca6586ac77a6df338385604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a1671bf32a5451a300009050803073ffffffffffffffffffffffffffffffffffffffff163110151561387b57600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561380e573d6000803e3d6000fd5b507f5d8bc849764969eb1bcc6d0a2f55999d0167c1ccec240a4f39cf664ca9c4148e3382604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15b505050565b600082821115151561388e57fe5b818303905092915050565b60008082840190508381101515156138ad57fe5b8091505092915050565b600080823b905060008111915050919050565b6138d2613ad8565b6138da613ad8565b83816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082816020018181525050606f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638c3b6f0e846040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050606060405180830381600087803b1580156139ad57600080fd5b505af11580156139c1573d6000803e3d6000fd5b505050506040513d60608110156139d757600080fd5b810190808051906020019092919080519060200190929190805190602001909291905050508360400184606001856080018381525083815250838152505050508091505092915050565b6000613a2e600019613186565b905090565b600080613a4b83606b5461389990919063ffffffff16565b606b81905550439150613a6360695483606d5461214c565b90508015613ad357613a84606954606a548465befe6f672000606b5461217d565b606c8190555081606d819055507fb9a2ce1061b71fbf2ee90bb8feed7941f9d6f8b6fe67bce1822774c5fc9844af606c5483604051808381526020018281526020019250505060405180910390a15b505050565b60a060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600081525090565b60c06040519081016040528060008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600081525090565b610c80604051908101604052806064906020820280388339808201915050905050905600a165627a7a72305820459e86dc3ddcfbb169995058294fa47fed86bd909aaa082d9f46f3c6b7e881da00290000000000000000000000005116c1d70e3a2cf55a2502d05f1bc17a0518782e000000000000000000000000cfbc9103362aec4ce3089f155c2da2eea1cb7602000000000000000000000000b6e928db347dbaad2c06868b716a2cf488904574000000000000000000000000045f11fc6fbed29b73119f4d51570c7e64af75f30000000000000000000000007b37faf831044d08da0c0e7419e2e31615f43032000000000000000000000000fb6916095ca1df60bb79ce92ce3ea74c37c5d3590000000000000000000000000000000000000000000000000000000000000032


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

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000005116c1d70e3a2cf55a2502d05f1bc17a0518782e
Arg [1] : 000000000000000000000000cfbc9103362aec4ce3089f155c2da2eea1cb7602
Arg [2] : 000000000000000000000000b6e928db347dbaad2c06868b716a2cf488904574
Arg [3] : 000000000000000000000000045f11fc6fbed29b73119f4d51570c7e64af75f3
Arg [4] : 0000000000000000000000007b37faf831044d08da0c0e7419e2e31615f43032
Arg [5] : 000000000000000000000000fb6916095ca1df60bb79ce92ce3ea74c37c5d359
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000032


   Swarm Source:
bzzr://459e86dc3ddcfbb169995058294fa47fed86bd909aaa082d9f46f3c6b7e881da
Block Age transaction Difficulty GasUsed Reward
Block Age Uncle Number Difficulty GasUsed Reward
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.