ETH Price: $2,698.27 (+0.94%)

Contract

0xDAb64Dc4A02225F76FccCe35aB9bA53B3735C684
 

Overview

ETH Balance

0.00002746447221 ETH

Eth Value

$0.07 (@ $2,698.27/ETH)

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set CEO57319092018-06-04 17:11:052451 days ago1528132265IN
0xDAb64Dc4...B3735C684
0 ETH0.000258499
Create Person Ge...57231372018-06-03 3:55:442453 days ago1527998144IN
0xDAb64Dc4...B3735C684
0 ETH0.000653384
Create Person Ge...57229612018-06-03 3:12:322453 days ago1527995552IN
0xDAb64Dc4...B3735C684
0 ETH0.000653384
Create Person Ge...57226582018-06-03 1:53:582453 days ago1527990838IN
0xDAb64Dc4...B3735C684
0 ETH0.000653124
Create Person Ge...57226462018-06-03 1:51:252453 days ago1527990685IN
0xDAb64Dc4...B3735C684
0 ETH0.000653124
Create Person Ge...57220372018-06-02 23:13:112453 days ago1527981191IN
0xDAb64Dc4...B3735C684
0 ETH0.000651584
Create Person Ge...57220232018-06-02 23:08:382453 days ago1527980918IN
0xDAb64Dc4...B3735C684
0 ETH0.000816085
Create Person Ge...57220232018-06-02 23:08:382453 days ago1527980918IN
0xDAb64Dc4...B3735C684
0 ETH0.000817365
Create Person Ge...57220212018-06-02 23:08:062453 days ago1527980886IN
0xDAb64Dc4...B3735C684
0 ETH0.000817045
Create Person Ge...57220192018-06-02 23:07:422453 days ago1527980862IN
0xDAb64Dc4...B3735C684
0 ETH0.000815125
Create Person Ge...57220162018-06-02 23:06:532453 days ago1527980813IN
0xDAb64Dc4...B3735C684
0 ETH0.000814485
Create Person Ge...57220122018-06-02 23:06:172453 days ago1527980777IN
0xDAb64Dc4...B3735C684
0 ETH0.000814485
Create Person Ge...57220062018-06-02 23:04:272453 days ago1527980667IN
0xDAb64Dc4...B3735C684
0 ETH0.000813845
Create Person Ge...57219862018-06-02 22:59:022453 days ago1527980342IN
0xDAb64Dc4...B3735C684
0 ETH0.000814165
Create Person Ge...57219842018-06-02 22:58:472453 days ago1527980327IN
0xDAb64Dc4...B3735C684
0 ETH0.00081485
Create Person Ge...57219832018-06-02 22:58:362453 days ago1527980316IN
0xDAb64Dc4...B3735C684
0 ETH0.000814485
Create Person Ge...57219792018-06-02 22:58:162453 days ago1527980296IN
0xDAb64Dc4...B3735C684
0 ETH0.0008185
Create Person Ge...57219782018-06-02 22:58:032453 days ago1527980283IN
0xDAb64Dc4...B3735C684
0 ETH0.000816085
Create Person Ge...57219762018-06-02 22:57:252453 days ago1527980245IN
0xDAb64Dc4...B3735C684
0 ETH0.000817685
Create Person Ge...57219742018-06-02 22:56:312453 days ago1527980191IN
0xDAb64Dc4...B3735C684
0 ETH0.000816725
Create Person Ge...57219722018-06-02 22:56:142453 days ago1527980174IN
0xDAb64Dc4...B3735C684
0 ETH0.000815445
Create Person Ge...57219702018-06-02 22:55:152453 days ago1527980115IN
0xDAb64Dc4...B3735C684
0 ETH0.000816725
Create Person Ge...57219672018-06-02 22:54:272453 days ago1527980067IN
0xDAb64Dc4...B3735C684
0 ETH0.00081485
Create Person Ge...57219652018-06-02 22:54:202453 days ago1527980060IN
0xDAb64Dc4...B3735C684
0 ETH0.000815125
Create Person Ge...57219632018-06-02 22:53:472453 days ago1527980027IN
0xDAb64Dc4...B3735C684
0 ETH0.000815445
View all transactions

Latest 15 internal transactions

Advanced mode:
Parent Transaction Hash Block
From
To
56988742018-05-29 20:28:302457 days ago1527625710
0xDAb64Dc4...B3735C684
0.00006408 ETH
56988742018-05-29 20:28:302457 days ago1527625710
0xDAb64Dc4...B3735C684
0.00003923 ETH
56863332018-05-27 15:32:262460 days ago1527435146
0xDAb64Dc4...B3735C684
0.00028182 ETH
56863332018-05-27 15:32:262460 days ago1527435146
0xDAb64Dc4...B3735C684
0.00017254 ETH
56862902018-05-27 15:21:012460 days ago1527434461
0xDAb64Dc4...B3735C684
0.00129536 ETH
56862902018-05-27 15:21:012460 days ago1527434461
0xDAb64Dc4...B3735C684
0.00079308 ETH
56839562018-05-27 5:14:252460 days ago1527398065
0xDAb64Dc4...B3735C684
0.00614509 ETH
56839562018-05-27 5:14:252460 days ago1527398065
0xDAb64Dc4...B3735C684
0.0037623 ETH
56839562018-05-27 5:14:252460 days ago1527398065
0xDAb64Dc4...B3735C684
0.001 ETH
56838992018-05-27 5:00:002460 days ago1527397200
0xDAb64Dc4...B3735C684
0.005929 ETH
56838992018-05-27 5:00:002460 days ago1527397200
0xDAb64Dc4...B3735C684
0.00363 ETH
56838992018-05-27 5:00:002460 days ago1527397200
0xDAb64Dc4...B3735C684
0.001 ETH
56827702018-05-27 0:14:122460 days ago1527380052
0xDAb64Dc4...B3735C684
0.0049 ETH
56827702018-05-27 0:14:122460 days ago1527380052
0xDAb64Dc4...B3735C684
0.003 ETH
56827702018-05-27 0:14:122460 days ago1527380052
0xDAb64Dc4...B3735C684
0.001 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CelebrityBreederToken

Compiler Version
v0.4.22-nightly.2018.4.12+commit.c3dc67d0

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-05-24
*/

pragma solidity ^0.4.18; // solhint-disable-line



/// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens
/// @author Dieter Shirley <[email protected]> (https://github.com/dete)
contract ERC721 {
  // Required methods
  function approve(address _to, uint256 _tokenId) public;
  function balanceOf(address _owner) public view returns (uint256 balance);
  function implementsERC721() public pure returns (bool);
  function ownerOf(uint256 _tokenId) public view returns (address addr);
  function takeOwnership(uint256 _tokenId) public;
  function totalSupply() public view returns (uint256 total);
  function transferFrom(address _from, address _to, uint256 _tokenId) public;
  function transfer(address _to, uint256 _tokenId) public;

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

  // Optional
  // function name() public view returns (string name);
  // function symbol() public view returns (string symbol);
  // function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256 tokenId);
  // function tokenMetadata(uint256 _tokenId) public view returns (string infoUrl);
}


contract CelebrityToken is ERC721 {

  /*** EVENTS ***/

  /// @dev The Birth event is fired whenever a new person comes into existence.
  event Birth(uint256 tokenId, string name, address owner);

  /// @dev The TokenSold event is fired whenever a token is sold.
  event TokenSold(uint256 tokenId, uint256 oldPrice, uint256 newPrice, address prevOwner, address winner, string name);

  /// @dev Transfer event as defined in current draft of ERC721. 
  ///  ownership is assigned, including births.
  event Transfer(address from, address to, uint256 tokenId);

  /*** CONSTANTS ***/

  /// @notice Name and symbol of the non fungible token, as defined in ERC721.
  string public constant NAME = "CryptoCelebrities"; // solhint-disable-line
  string public constant SYMBOL = "CelebrityToken"; // solhint-disable-line

  uint256 private startingPrice = 0.001 ether;
  uint256 private constant PROMO_CREATION_LIMIT = 5000;
  uint256 private firstStepLimit =  0.053613 ether;
  uint256 private secondStepLimit = 0.564957 ether;

  /*** STORAGE ***/

  /// @dev A mapping from person IDs to the address that owns them. All persons have
  ///  some valid owner address.
  mapping (uint256 => address) public personIndexToOwner;

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

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

  // @dev A mapping from PersonIDs to the price of the token.
  mapping (uint256 => uint256) private personIndexToPrice;

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

  uint256 public promoCreatedCount;

  /*** DATATYPES ***/
  struct Person {
    string name;
  }

  Person[] private persons;

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

  /// @dev Access modifier for COO-only functionality
  modifier onlyCOO() {
    require(msg.sender == cooAddress);
    _;
  }

  /// Access modifier for contract owner only functionality
  modifier onlyCLevel() {
    require(
      msg.sender == ceoAddress ||
      msg.sender == cooAddress
    );
    _;
  }

  /*** CONSTRUCTOR ***/
  function CelebrityToken() public {
    ceoAddress = msg.sender;
    cooAddress = msg.sender;
  }

  /*** PUBLIC FUNCTIONS ***/
  /// @notice Grant another address the right to transfer token via takeOwnership() and transferFrom().
  /// @param _to The address to be granted transfer approval. Pass address(0) to
  ///  clear all approvals.
  /// @param _tokenId The ID of the Token that can be transferred if this call succeeds.
  /// @dev Required for ERC-721 compliance.
  function approve(
    address _to,
    uint256 _tokenId
  ) public {
    // Caller must own token.
    require(_owns(msg.sender, _tokenId));

    personIndexToApproved[_tokenId] = _to;

    Approval(msg.sender, _to, _tokenId);
  }

  /// For querying balance of a particular account
  /// @param _owner The address for balance query
  /// @dev Required for ERC-721 compliance.
  function balanceOf(address _owner) public view returns (uint256 balance) {
    return ownershipTokenCount[_owner];
  }

  /// @dev Creates a new promo Person with the given name, with given _price and assignes it to an address.
  function createPromoPerson(address _owner, string _name, uint256 _price) public onlyCOO {
    require(promoCreatedCount < PROMO_CREATION_LIMIT);

    address personOwner = _owner;
    if (personOwner == address(0)) {
      personOwner = cooAddress;
    }

    if (_price <= 0) {
      _price = startingPrice;
    }

    promoCreatedCount++;
    _createPerson(_name, personOwner, _price);
  }

  /// @dev Creates a new Person with the given name.
  function createContractPerson(string _name) public onlyCOO {
    _createPerson(_name, address(this), startingPrice);
  }

  /// @notice Returns all the relevant information about a specific person.
  /// @param _tokenId The tokenId of the person of interest.
  function getPerson(uint256 _tokenId) public view returns (
    string personName,
    uint256 sellingPrice,
    address owner
  ) {
    Person storage person = persons[_tokenId];
    personName = person.name;
    sellingPrice = personIndexToPrice[_tokenId];
    owner = personIndexToOwner[_tokenId];
  }

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

  /// @dev Required for ERC-721 compliance.
  function name() public pure returns (string) {
    return NAME;
  }

  /// For querying owner of token
  /// @param _tokenId The tokenID for owner inquiry
  /// @dev Required for ERC-721 compliance.
  function ownerOf(uint256 _tokenId)
    public
    view
    returns (address owner)
  {
    owner = personIndexToOwner[_tokenId];
    require(owner != address(0));
  }

  function payout(address _to) public onlyCLevel {
    _payout(_to);
  }

  // Allows someone to send ether and obtain the token
  function purchase(uint256 _tokenId) public payable {
    address oldOwner = personIndexToOwner[_tokenId];
    address newOwner = msg.sender;

    uint256 sellingPrice = personIndexToPrice[_tokenId];

    // Making sure token owner is not sending to self
    require(oldOwner != newOwner);

    // Safety check to prevent against an unexpected 0x0 default.
    require(_addressNotNull(newOwner));

    // Making sure sent amount is greater than or equal to the sellingPrice
    require(msg.value >= sellingPrice);

    uint256 payment = uint256(SafeMath.div(SafeMath.mul(sellingPrice, 94), 100));
    uint256 purchaseExcess = SafeMath.sub(msg.value, sellingPrice);

    // Update prices
    if (sellingPrice < firstStepLimit) {
      // first stage
      personIndexToPrice[_tokenId] = SafeMath.div(SafeMath.mul(sellingPrice, 200), 94);
    } else if (sellingPrice < secondStepLimit) {
      // second stage
      personIndexToPrice[_tokenId] = SafeMath.div(SafeMath.mul(sellingPrice, 120), 94);
    } else {
      // third stage
      personIndexToPrice[_tokenId] = SafeMath.div(SafeMath.mul(sellingPrice, 115), 94);
    }

    _transfer(oldOwner, newOwner, _tokenId);

    // Pay previous tokenOwner if owner is not contract
    if (oldOwner != address(this)) {
      oldOwner.transfer(payment); //(1-0.06)
    }

    TokenSold(_tokenId, sellingPrice, personIndexToPrice[_tokenId], oldOwner, newOwner, persons[_tokenId].name);

    msg.sender.transfer(purchaseExcess);
  }

  function priceOf(uint256 _tokenId) public view returns (uint256 price) {
    return personIndexToPrice[_tokenId];
  }

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

    ceoAddress = _newCEO;
  }

  /// @dev Assigns a new address to act as the COO. Only available to the current COO.
  /// @param _newCOO The address of the new COO
  function setCOO(address _newCOO) public onlyCEO {
    require(_newCOO != address(0));

    cooAddress = _newCOO;
  }

  /// @dev Required for ERC-721 compliance.
  function symbol() public pure returns (string) {
    return SYMBOL;
  }

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

    // Safety check to prevent against an unexpected 0x0 default.
    require(_addressNotNull(newOwner));

    // Making sure transfer is approved
    require(_approved(newOwner, _tokenId));

    _transfer(oldOwner, newOwner, _tokenId);
  }

  /// @param _owner The owner whose celebrity tokens we are interested in.
  /// @dev This method MUST NEVER be called by smart contract code. First, it's fairly
  ///  expensive (it walks the entire Persons array looking for persons belonging to owner),
  ///  but it also returns a dynamic array, which is only supported for web3 calls, and
  ///  not contract-to-contract calls.
  function tokensOfOwner(address _owner) public view returns(uint256[] ownerTokens) {
    uint256 tokenCount = balanceOf(_owner);
    if (tokenCount == 0) {
        // Return an empty array
      return new uint256[](0);
    } else {
      uint256[] memory result = new uint256[](tokenCount);
      uint256 totalPersons = totalSupply();
      uint256 resultIndex = 0;

      uint256 personId;
      for (personId = 0; personId <= totalPersons; personId++) {
        if (personIndexToOwner[personId] == _owner) {
          result[resultIndex] = personId;
          resultIndex++;
        }
      }
      return result;
    }
  }

  /// For querying totalSupply of token
  /// @dev Required for ERC-721 compliance.
  function totalSupply() public view returns (uint256 total) {
    return persons.length;
  }

  /// Owner initates the transfer of the token to another account
  /// @param _to The address for the token to be transferred to.
  /// @param _tokenId The ID of the Token that can be transferred if this call succeeds.
  /// @dev Required for ERC-721 compliance.
  function transfer(
    address _to,
    uint256 _tokenId
  ) public {
    require(_owns(msg.sender, _tokenId));
    require(_addressNotNull(_to));

    _transfer(msg.sender, _to, _tokenId);
  }

  /// Third-party initiates transfer of token from address _from to address _to
  /// @param _from The address for the token to be transferred from.
  /// @param _to The address for the token to be transferred to.
  /// @param _tokenId The ID of the Token that can be transferred if this call succeeds.
  /// @dev Required for ERC-721 compliance.
  function transferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  ) public {
    require(_owns(_from, _tokenId));
    require(_approved(_to, _tokenId));
    require(_addressNotNull(_to));

    _transfer(_from, _to, _tokenId);
  }

  /*** PRIVATE FUNCTIONS ***/
  /// Safety check on _to address to prevent against an unexpected 0x0 default.
  function _addressNotNull(address _to) private pure returns (bool) {
    return _to != address(0);
  }

  /// For checking approval of transfer for address _to
  function _approved(address _to, uint256 _tokenId) private view returns (bool) {
    return personIndexToApproved[_tokenId] == _to;
  }

  /// For creating Person
  function _createPerson(string _name, address _owner, uint256 _price) private {
    Person memory _person = Person({
      name: _name
    });
    uint256 newPersonId = persons.push(_person) - 1;

    // It's probably never going to happen, 4 billion tokens are A LOT, but
    // let's just be 100% sure we never let this happen.
    require(newPersonId == uint256(uint32(newPersonId)));

    Birth(newPersonId, _name, _owner);

    personIndexToPrice[newPersonId] = _price;

    // This will assign ownership, and also emit the Transfer event as
    // per ERC721 draft
    _transfer(address(0), _owner, newPersonId);
  }

  /// Check for token ownership
  function _owns(address claimant, uint256 _tokenId) private view returns (bool) {
    return claimant == personIndexToOwner[_tokenId];
  }

  /// For paying out balance on contract
  function _payout(address _to) private {
    if (_to == address(0)) {
      ceoAddress.transfer(this.balance);
    } else {
      _to.transfer(this.balance);
    }
  }

  /// @dev Assigns ownership of a specific Person to an address.
  function _transfer(address _from, address _to, uint256 _tokenId) private {
    // Since the number of persons is capped to 2^32 we can't overflow this
    ownershipTokenCount[_to]++;
    //transfer ownership
    personIndexToOwner[_tokenId] = _to;

    // When creating new persons _from is 0x0, but we can't account that address.
    if (_from != address(0)) {
      ownershipTokenCount[_from]--;
      // clear any previously approved ownership exchange
      delete personIndexToApproved[_tokenId];
    }

    // Emit the transfer event.
    Transfer(_from, _to, _tokenId);
  }
}
library SafeMath {

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

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

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

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

/// @author Artyom Harutyunyan <[email protected]>

contract CelebrityBreederToken is ERC721 {
  
   /// @dev The Birth event is fired whenever a new person comes into existence.
  event Birth(uint256 tokenId, string name, address owner);

  /// @dev The TokenSold event is fired whenever a token is sold.
  event TokenSold(uint256 tokenId, uint256 oldPrice, uint256 newPrice, address prevOwner, address winner, string name);

  /// @dev Transfer event as defined in current draft of ERC721. 
  ///  ownership is assigned, including births.
  event Transfer(address from, address to, uint256 tokenId);
  event Trained(address caller, uint256 tokenId, bool generation);
  event Beaten(address caller, uint256 tokenId, bool generation);
  event SiringPriceEvent(address caller, uint256 tokenId, bool generation, uint price);
  event SellingPriceEvent(address caller, uint256 tokenId, bool generation, uint price);
  event GenesInitialisedEvent(address caller, uint256 tokenId, bool generation, uint genes);
  
  CelebrityToken private CelGen0=CelebrityToken(0xbb5Ed1EdeB5149AF3ab43ea9c7a6963b3C1374F7); //@Artyom Pointing to original CC
  
  string public constant NAME = "CryptoCelebrityBreederCards"; 
  string public constant SYMBOL = "CeleBreedCard"; 

  uint256 public breedingFee = 0.01 ether;
  uint256 public initialTraining = 0.00001 ether;
  uint256 public initialBeating = 0.00002 ether;
  uint256 private constant CreationLimitGen0 = 5000;
  uint256 private constant CreationLimitGen1 = 2500000;
  uint256 public constant MaxValue =  100000000 ether;
  
  mapping (uint256 => address) public personIndexToOwnerGen1;
  mapping (address => uint256) private ownershipTokenCountGen1;
  mapping (uint256 => address) public personIndexToApprovedGen1;
  mapping (uint256 => uint256) private personIndexToPriceGen1;
  mapping (uint256 => address) public ExternalAllowdContractGen0;
  mapping (uint256 => address) public ExternalAllowdContractGen1; 
  mapping (uint256 => uint256) public personIndexToSiringPrice0;
  mapping (uint256 => uint256) public personIndexToSiringPrice1;
  address public CeoAddress; 
  address public DevAddress;
  
   struct Person {
    string name;
    string surname; 
    uint64 genes; 
    uint64 birthTime;
    uint32 fatherId;
    uint32 motherId;
    uint32 readyToBreedWithId;
    uint32 trainedcount;
    uint32 beatencount;
    bool readyToBreedWithGen;
    bool gender;
    bool fatherGeneration;
    bool motherGeneration;
  }
  
  Person[] private PersonsGen0;
  Person[] private PersonsGen1;
  
    modifier onlyCEO() {
    require(msg.sender == CeoAddress);
    _;
  }

  modifier onlyDEV() {
    require(msg.sender == DevAddress);
    _;
  }
  
   modifier onlyPlayers() {
    require(ownershipTokenCountGen1[msg.sender]>0 || CelGen0.balanceOf(msg.sender)>0);
    _;
  }

  /// Access modifier for contract owner only functionality
 /* modifier onlyTopLevel() {
    require(
      msg.sender == CeoAddress ||
      msg.sender == DevAddress
    );
    _;
  }
  */
  function CelebrityBreederToken() public { 
      CeoAddress= msg.sender;
      DevAddress= msg.sender;
  }
    function setBreedingFee(uint256 newfee) external onlyCEO{
      breedingFee=newfee;
  }
  function allowexternalContract(address _to, uint256 _tokenId,bool _tokengeneration) public { 
    // Caller must own token.
    require(_owns(msg.sender, _tokenId, _tokengeneration));
    
    if(_tokengeneration) {
        if(_addressNotNull(_to)) {
            ExternalAllowdContractGen1[_tokenId]=_to;
        }
        else {
             delete ExternalAllowdContractGen1[_tokenId];
        }
    }
    else {
       if(_addressNotNull(_to)) {
            ExternalAllowdContractGen0[_tokenId]=_to;
        }
        else {
             delete ExternalAllowdContractGen0[_tokenId];
        }
    }

  }
  
  
  //@Artyom Required for ERC-721 compliance.
  function approve(address _to, uint256 _tokenId) public { //@Artyom only gen1
    // Caller must own token.
    require(_owns(msg.sender, _tokenId, true));

    personIndexToApprovedGen1[_tokenId] = _to;

    Approval(msg.sender, _to, _tokenId);
  }
  // @Artyom Required for ERC-721 compliance.
  //@Artyom only gen1
   function balanceOf(address _owner) public view returns (uint256 balance) {
    return ownershipTokenCountGen1[_owner];
  }
  
    function getPerson(uint256 _tokenId,bool generation) public view returns ( string name, string surname, uint64 genes,uint64 birthTime, uint32 readyToBreedWithId, uint32 trainedcount,uint32 beatencount,bool readyToBreedWithGen, bool gender) {
    Person person;
    if(generation==false) {
        person = PersonsGen0[_tokenId];
    }
    else {
        person = PersonsGen1[_tokenId];
    }
         
    name = person.name;
    surname=person.surname;
    genes=person.genes;
    birthTime=person.birthTime;
    readyToBreedWithId=person.readyToBreedWithId;
    trainedcount=person.trainedcount;
    beatencount=person.beatencount;
    readyToBreedWithGen=person.readyToBreedWithGen;
    gender=person.gender;

  }
   function getPersonParents(uint256 _tokenId, bool generation) public view returns ( uint32 fatherId, uint32 motherId, bool fatherGeneration, bool motherGeneration) {
    Person person;
    if(generation==false) {
        person = PersonsGen0[_tokenId];
    }
    else {
        person = PersonsGen1[_tokenId];
    }
         
    fatherId=person.fatherId;
    motherId=person.motherId;
    fatherGeneration=person.fatherGeneration;
    motherGeneration=person.motherGeneration;
  }
  // @Artyom Required for ERC-721 compliance.
   function implementsERC721() public pure returns (bool) { 
    return true;
  }

  // @Artyom Required for ERC-721 compliance.
  function name() public pure returns (string) {
    return NAME;
  }

// @Artyom Required for ERC-721 compliance.
  function ownerOf(uint256 _tokenId) public view returns (address owner)
  {
    owner = personIndexToOwnerGen1[_tokenId];
    require(_addressNotNull(owner));
  }
  
  //@Artyom only gen1
   function purchase(uint256 _tokenId) public payable {
    address oldOwner = personIndexToOwnerGen1[_tokenId];
    address newOwner = msg.sender;

    uint256 sellingPrice = personIndexToPriceGen1[_tokenId];
    personIndexToPriceGen1[_tokenId]=MaxValue;

    // Making sure token owner is not sending to self
    require(oldOwner != newOwner);

    // Safety check to prevent against an unexpected 0x0 default.
    require(_addressNotNull(newOwner));

    // Making sure sent amount is greater than or equal to the sellingPrice
    require(msg.value >= sellingPrice);

   // uint256 payment = uint256(SafeMath.div(SafeMath.mul(sellingPrice, 94), 100));
    uint256 purchaseExcess = SafeMath.sub(msg.value, sellingPrice);

    _transfer(oldOwner, newOwner, _tokenId);

    // Pay previous tokenOwner if owner is not contract
    if (oldOwner != address(this)) {
    //  oldOwner.transfer(payment); //(1-0.06) //old code for holding some percents
    oldOwner.transfer(sellingPrice);
    }
    blankbreedingdata(_tokenId,true);

    TokenSold(_tokenId, sellingPrice, personIndexToPriceGen1[_tokenId], oldOwner, newOwner, PersonsGen1[_tokenId].name);

    msg.sender.transfer(purchaseExcess);
  }
  
   //@Artyom only gen1
   function priceOf(uint256 _tokenId) public view returns (uint256 price) {
    return personIndexToPriceGen1[_tokenId];
  }

 
  function setCEO(address _newCEO) external onlyCEO {
    require(_addressNotNull(_newCEO));

    CeoAddress = _newCEO;
  }

 //@Artyom only gen1
 function setprice(uint256 _tokenId, uint256 _price) public {
    require(_owns(msg.sender, _tokenId, true));
    if(_price<=0 || _price>=MaxValue) {
        personIndexToPriceGen1[_tokenId]=MaxValue;
    }
    else {
        personIndexToPriceGen1[_tokenId]=_price;
    }
    SellingPriceEvent(msg.sender,_tokenId,true,_price);
 }
 
  function setDEV(address _newDEV) external onlyDEV {
    require(_addressNotNull(_newDEV));

    DevAddress = _newDEV;
  }
  
    // @Artyom Required for ERC-721 compliance.
  function symbol() public pure returns (string) {
    return SYMBOL;
  }


  // @Artyom Required for ERC-721 compliance.
   //@Artyom only gen1
  function takeOwnership(uint256 _tokenId) public {
    address newOwner = msg.sender;
    address oldOwner = personIndexToOwnerGen1[_tokenId];

    // Safety check to prevent against an unexpected 0x0 default.
    require(_addressNotNull(newOwner));

    // Making sure transfer is approved
    require(_approvedGen1(newOwner, _tokenId));

    _transfer(oldOwner, newOwner, _tokenId);
  }
  
  //@Artyom only gen1
  function tokensOfOwner(address _owner) public view returns(uint256[] ownerTokens) {
    uint256 tokenCount = balanceOf(_owner);
    if (tokenCount == 0) {
        // Return an empty array
      return new uint256[](0);
    } 
    else {
      uint256[] memory result = new uint256[](tokenCount);
      uint256 totalPersons = totalSupply();
      uint256 resultIndex = 0;

      uint256 personId;
      for (personId = 0; personId <= totalPersons; personId++) {
        if (personIndexToOwnerGen1[personId] == _owner) {
          result[resultIndex] = personId;
          resultIndex++;
        }
      }
      return result;
    }
  }
  
   // @Artyom Required for ERC-721 compliance.
   //@Artyom only gen1
   function totalSupply() public view returns (uint256 total) {
    return PersonsGen1.length;
  }

   // @Artyom Required for ERC-721 compliance.
   //@Artyom only gen1
  function transfer( address _to, uint256 _tokenId) public {
    require(_owns(msg.sender, _tokenId, true));
    require(_addressNotNull(_to));

    _transfer(msg.sender, _to, _tokenId);
  }
  
   // @Artyom Required for ERC-721 compliance.
   //@Artyom only gen1
    function transferFrom(address _from, address _to, uint256 _tokenId) public {
    require(_owns(_from, _tokenId, true));
    require(_approvedGen1(_to, _tokenId));
    require(_addressNotNull(_to));

    _transfer(_from, _to, _tokenId);
  }
  
   function _addressNotNull(address _to) private pure returns (bool) {
    return _to != address(0);
  }

  /// For checking approval of transfer for address _to
  function _approvedGen1(address _to, uint256 _tokenId) private view returns (bool) {
    return personIndexToApprovedGen1[_tokenId] == _to;
  }
  //@Artyom only gen0
   function createPersonGen0(string _name, string _surname,uint64 _genes, bool _gender) external onlyCEO returns(uint256) {
    return _birthPerson(_name, _surname ,_genes, _gender, false);
  }
  function SetGene(uint256 tokenId,bool generation, uint64 newgene) public {
     require(_owns(msg.sender, tokenId, generation) || msg.sender==CeoAddress);
     require(newgene<=9999999999 && newgene>=10);
     Person person; //@Artyom reference
    if (generation==false) { 
        person = PersonsGen0[tokenId];
    }
    else {
        person = PersonsGen1[tokenId];
    }
    require(person.genes<=90);
     
    uint64 _gene=newgene;
    uint64 _pointCount=0;
   
   
      for(uint i=0;i<10;i++) {
           _pointCount+=_gene%10;
           _gene=_gene/10;
      }
    //  log(_pointCount,person.genes);
    require(_pointCount==person.genes);
           
    person.genes=newgene;
    GenesInitialisedEvent(msg.sender,tokenId,generation,newgene);
}
 
   function breed(uint256 _mypersonid, bool _mypersongeneration, uint256 _withpersonid, bool  _withpersongeneration, string _boyname, string _girlname) public payable { //@Artyom mother
       require(_owns(msg.sender, _mypersonid, _mypersongeneration));
       require(CreationLimitGen1>totalSupply()+1);
    
    //Mother
    Person person; //@Artyom reference
    if(_mypersongeneration==false) { 
        person = PersonsGen0[_mypersonid];
    }
    else {
        person = PersonsGen1[_mypersonid];
        require(person.gender==false); //@Artyom checking gender for gen1 to be mother in this case
    }

    require(person.genes>90);//@Artyom if its unlocked
    
    uint64 genes1=person.genes;
    //Father
        if(_withpersongeneration==false) { 
        person = PersonsGen0[_withpersonid];
    }
    else {
        person = PersonsGen1[_withpersonid];
       
    }
     
   
     require(readyTobreed(_mypersonid, _mypersongeneration, _withpersonid,  _withpersongeneration));
     require(breedingFee<=msg.value);
   
    
    delete person.readyToBreedWithId;
    person.readyToBreedWithGen=false;
    
   // uint64 genes2=person.genes;
    
       uint64 _generatedGen;
       bool _gender; 
       (_generatedGen,_gender)=_generateGene(genes1,person.genes,_mypersonid,_withpersonid); 
       
     if(_gender) {
       _girlname=_boyname; //@Artyom if gender is true/1 then it should take the boyname
     }
       uint newid=_birthPerson(_girlname, person.surname, _generatedGen, _gender, true);
            PersonsGen1[newid].fatherGeneration=_withpersongeneration; // @ Artyom, did here because stack too deep for function
            PersonsGen1[newid].motherGeneration=_mypersongeneration;
            PersonsGen1[newid].fatherId=uint32(_withpersonid); 
            PersonsGen1[newid].motherId=uint32(_mypersonid);
        
        
       _payout();
  }
  
    function breedOnAuction(uint256 _mypersonid, bool _mypersongeneration, uint256 _withpersonid, bool  _withpersongeneration, string _boyname, string _girlname) public payable { //@Artyom mother
       require(_owns(msg.sender, _mypersonid, _mypersongeneration));
       require(CreationLimitGen1>totalSupply()+1);
       require(!(_mypersonid==_withpersonid && _mypersongeneration==_withpersongeneration));// @Artyom not to breed with self
       require(!((_mypersonid==0 && _mypersongeneration==false) || (_withpersonid==0 && _withpersongeneration==false))); //Not to touch Satoshi
    //Mother
    Person person; //@Artyom reference
    if(_mypersongeneration==false) { 
        person = PersonsGen0[_mypersonid];
    }
    else {
        person = PersonsGen1[_mypersonid];
        require(person.gender==false); //@Artyom checking gender for gen1 to be mother in this case
    }
    
    require(person.genes>90);//@Artyom if its unlocked
    
    address owneroffather;
    uint256 _siringprice;
    uint64 genes1=person.genes;
    //Father
        if(_withpersongeneration==false) { 
        person = PersonsGen0[_withpersonid];
        _siringprice=personIndexToSiringPrice0[_withpersonid];
        owneroffather=CelGen0.ownerOf(_withpersonid);
    }
    else {
        person = PersonsGen1[_withpersonid];
        _siringprice=personIndexToSiringPrice1[_withpersonid];
        owneroffather= personIndexToOwnerGen1[_withpersonid];
    }
     
   require(_siringprice>0 && _siringprice<MaxValue);
   require((breedingFee+_siringprice)<=msg.value);
    
    
//    uint64 genes2=;
    
       uint64 _generatedGen;
       bool _gender; 
       (_generatedGen,_gender)=_generateGene(genes1,person.genes,_mypersonid,_withpersonid); 
       
     if(_gender) {
       _girlname=_boyname; //@Artyom if gender is true/1 then it should take the boyname
     }
       uint newid=_birthPerson(_girlname, person.surname, _generatedGen, _gender, true);
            PersonsGen1[newid].fatherGeneration=_withpersongeneration; // @ Artyom, did here because stack too deep for function
            PersonsGen1[newid].motherGeneration=_mypersongeneration;
            PersonsGen1[newid].fatherId=uint32(_withpersonid); 
            PersonsGen1[newid].motherId=uint32(_mypersonid);
        
        
        owneroffather.transfer(_siringprice);
       _payout();
  }
 
  
  
  function prepareToBreed(uint256 _mypersonid, bool _mypersongeneration, uint256 _withpersonid, bool _withpersongeneration, uint256 _siringprice) external { //@Artyom father
      require(_owns(msg.sender, _mypersonid, _mypersongeneration)); 
      
       Person person; //@Artyom reference
    if(_mypersongeneration==false) {
        person = PersonsGen0[_mypersonid];
        personIndexToSiringPrice0[_mypersonid]=_siringprice;
    }
    else {
        person = PersonsGen1[_mypersonid];
        
        require(person.gender==true);//@Artyom for gen1 checking genders to be male
        personIndexToSiringPrice1[_mypersonid]=_siringprice;
    }
      require(person.genes>90);//@Artyom if its unlocked

       person.readyToBreedWithId=uint32(_withpersonid); 
       person.readyToBreedWithGen=_withpersongeneration;
       SiringPriceEvent(msg.sender,_mypersonid,_mypersongeneration,_siringprice);
      
  }
  
  function readyTobreed(uint256 _mypersonid, bool _mypersongeneration, uint256 _withpersonid, bool _withpersongeneration) public view returns(bool) {

if (_mypersonid==_withpersonid && _mypersongeneration==_withpersongeneration) //Not to fuck Themselves 
return false;

if((_mypersonid==0 && _mypersongeneration==false) || (_withpersonid==0 && _withpersongeneration==false)) //Not to touch Satoshi
return false;

    Person withperson; //@Artyom reference
    if(_withpersongeneration==false) {
        withperson = PersonsGen0[_withpersonid];
    }
    else {
        withperson = PersonsGen1[_withpersonid];
    }
   
   
   if(withperson.readyToBreedWithGen==_mypersongeneration) {
       if(withperson.readyToBreedWithId==_mypersonid) {
       return true;
   }
   }
  
    
    return false;
    
  }
  function _birthPerson(string _name, string _surname, uint64 _genes, bool _gender, bool _generation) private returns(uint256) { // about this steps   
    Person memory _person = Person({
        name: _name,
        surname: _surname,
        genes: _genes,
        birthTime: uint64(now),
        fatherId: 0,
        motherId: 0,
        readyToBreedWithId: 0,
        trainedcount: 0,
        beatencount: 0,
        readyToBreedWithGen: false,
        gender: _gender,
        fatherGeneration: false,
        motherGeneration: false

        
    });
    
    uint256 newPersonId;
    if(_generation==false) {
         newPersonId = PersonsGen0.push(_person) - 1;
    }
    else {
         newPersonId = PersonsGen1.push(_person) - 1;
         personIndexToPriceGen1[newPersonId] = MaxValue; //@Artyom indicating not for sale
          // per ERC721 draft-This will assign ownership, and also emit the Transfer event as
        _transfer(address(0), msg.sender, newPersonId);
        

    }

    Birth(newPersonId, _name, msg.sender);
    return newPersonId;
  }
  function _generateGene(uint64 _genes1,uint64 _genes2,uint256 _mypersonid,uint256 _withpersonid) private returns(uint64,bool) {
       uint64 _gene;
       uint64 _gene1;
       uint64 _gene2;
       uint64 _rand;
       uint256 _finalGene=0;
       bool gender=false;

       for(uint i=0;i<10;i++) {
           _gene1 =_genes1%10;
           _gene2=_genes2%10;
           _genes1=_genes1/10;
           _genes2=_genes2/10;
           _rand=uint64(keccak256(block.blockhash(block.number), i, now,_mypersonid,_withpersonid))%10000;
           
           if(_gene1>=_gene2) {
               _gene=_gene1-_gene2;
           }
           else {
               _gene=_gene2-_gene1;
           }
           
           if(_rand<26) {
               _gene-=3;
           }
            else if(_rand<455) {
                _gene-=2;
           }
            else if(_rand<3173) {
                _gene-=1;
           }
            else if(_rand<6827) {
                
           }
            else if(_rand<9545) {
                _gene+=1;
           }
            else if(_rand<9974) {
                _gene+=2;
           }
            else if(_rand<1000) {
                _gene+=3;
           }
           
           if(_gene>12) //@Artyom to avoid negative overflow
           _gene=0;
           if(_gene>9)
           _gene=9;
           
           _finalGene+=(uint(10)**i)*_gene;
       }
      
      if(uint64(keccak256(block.blockhash(block.number), 11, now,_mypersonid,_withpersonid))%2>0)
      gender=true;
      
      return(uint64(_finalGene),gender);  
  } 
  function _owns(address claimant, uint256 _tokenId,bool _tokengeneration) private view returns (bool) {
   if(_tokengeneration) {
        return ((claimant == personIndexToOwnerGen1[_tokenId]) || (claimant==ExternalAllowdContractGen1[_tokenId]));
   }
   else {
       return ((claimant == CelGen0.personIndexToOwner(_tokenId)) || (claimant==ExternalAllowdContractGen0[_tokenId]));
   }
  }
      
  function _payout() private {
    DevAddress.transfer((this.balance/10)*3);
    CeoAddress.transfer((this.balance/10)*7); 
  }
  
   // @Artyom Required for ERC-721 compliance.
   //@Artyom only gen1
   function _transfer(address _from, address _to, uint256 _tokenId) private {
    // Since the number of persons is capped to 2^32 we can't overflow this
    ownershipTokenCountGen1[_to]++;
    //transfer ownership
    personIndexToOwnerGen1[_tokenId] = _to;

    // When creating new persons _from is 0x0, but we can't account that address.
    if (_addressNotNull(_from)) {
      ownershipTokenCountGen1[_from]--;
      // clear any previously approved ownership exchange
     blankbreedingdata(_tokenId,true);
    }

    // Emit the transfer event.
    Transfer(_from, _to, _tokenId);
  }
  function blankbreedingdata(uint256 _personid, bool _persongeneration) private{
      Person person;
      if(_persongeneration==false) { 
        person = PersonsGen0[_personid];
        delete ExternalAllowdContractGen0[_personid];
        delete personIndexToSiringPrice0[_personid];
    }
    else {
        person = PersonsGen1[_personid];
        delete ExternalAllowdContractGen1[_personid];
        delete personIndexToSiringPrice1[_personid];
    	delete personIndexToApprovedGen1[_personid];
    }
     delete person.readyToBreedWithId;
     delete person.readyToBreedWithGen; 
  }
    function train(uint256 personid, bool persongeneration, uint8 gene) external payable onlyPlayers {
        
        require(gene>=0 && gene<10);
        uint256 trainingPrice=checkTrainingPrice(personid,persongeneration);
        require(msg.value >= trainingPrice);
         Person person; 
    if(persongeneration==false) {
        person = PersonsGen0[personid];
    }
    else {
        person = PersonsGen1[personid];
    }
    
     require(person.genes>90);//@Artyom if its unlocked
     uint gensolo=person.genes/(uint(10)**gene);
    gensolo=gensolo%10;
    require(gensolo<9); //@Artyom not to train after 9
    
          person.genes+=uint64(10)**gene;
          person.trainedcount++;

    uint256 purchaseExcess = SafeMath.sub(msg.value, trainingPrice);
    msg.sender.transfer(purchaseExcess);
    _payout();
    Trained(msg.sender, personid, persongeneration);
    }
    
     function beat(uint256 personid, bool persongeneration, uint8 gene) external payable onlyPlayers {
        require(gene>=0 && gene<10);
        uint256 beatingPrice=checkBeatingPrice(personid,persongeneration);
        require(msg.value >= beatingPrice);
         Person person; 
    if(persongeneration==false) {
        person = PersonsGen0[personid];
    }
    else {
        person = PersonsGen1[personid];
    }
    
    require(person.genes>90);//@Artyom if its unlocked
    uint gensolo=person.genes/(uint(10)**gene);
    gensolo=gensolo%10;
    require(gensolo>0);
          person.genes-=uint64(10)**gene;
          person.beatencount++;

    uint256 purchaseExcess = SafeMath.sub(msg.value, beatingPrice);
    msg.sender.transfer(purchaseExcess);
    _payout();
    Beaten(msg.sender, personid, persongeneration);    
    }
    
    
    function checkTrainingPrice(uint256 personid, bool persongeneration) view returns (uint256) {
         Person person;
    if(persongeneration==false) {
        person = PersonsGen0[personid];
    }
    else {
        person = PersonsGen1[personid];
    }
    
    uint256 _trainingprice= (uint(2)**person.trainedcount) * initialTraining;
    if (_trainingprice > 5 ether)
    _trainingprice=5 ether;
    
    return _trainingprice;
    }
    function checkBeatingPrice(uint256 personid, bool persongeneration) view returns (uint256) {
         Person person;
    if(persongeneration==false) {
        person = PersonsGen0[personid];
    }
    else {
        person = PersonsGen1[personid];
    }
    uint256 _beatingprice=(uint(2)**person.beatencount) * initialBeating;
     if (_beatingprice > 7 ether)
    _beatingprice=7 ether;
    return _beatingprice;
    } 
  
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[{"name":"personid","type":"uint256"},{"name":"persongeneration","type":"bool"},{"name":"gene","type":"uint8"}],"name":"beat","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"CeoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"ExternalAllowdContractGen0","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_mypersonid","type":"uint256"},{"name":"_mypersongeneration","type":"bool"},{"name":"_withpersonid","type":"uint256"},{"name":"_withpersongeneration","type":"bool"}],"name":"readyTobreed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"implementsERC721","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"total","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"personIndexToSiringPrice0","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newCEO","type":"address"}],"name":"setCEO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"generation","type":"bool"}],"name":"getPersonParents","outputs":[{"name":"fatherId","type":"uint32"},{"name":"motherId","type":"uint32"},{"name":"fatherGeneration","type":"bool"},{"name":"motherGeneration","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newfee","type":"uint256"}],"name":"setBreedingFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"},{"name":"_tokengeneration","type":"bool"}],"name":"allowexternalContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"personIndexToOwnerGen1","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"string"},{"name":"_surname","type":"string"},{"name":"_genes","type":"uint64"},{"name":"_gender","type":"bool"}],"name":"createPersonGen0","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newDEV","type":"address"}],"name":"setDEV","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"_price","type":"uint256"}],"name":"setprice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"name":"ownerTokens","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tokenId","type":"uint256"},{"name":"generation","type":"bool"},{"name":"newgene","type":"uint64"}],"name":"SetGene","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"DevAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"personid","type":"uint256"},{"name":"persongeneration","type":"bool"}],"name":"checkBeatingPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"NAME","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"ExternalAllowdContractGen1","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"takeOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"priceOf","outputs":[{"name":"price","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"initialTraining","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_mypersonid","type":"uint256"},{"name":"_mypersongeneration","type":"bool"},{"name":"_withpersonid","type":"uint256"},{"name":"_withpersongeneration","type":"bool"},{"name":"_boyname","type":"string"},{"name":"_girlname","type":"string"}],"name":"breedOnAuction","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"breedingFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"personIndexToSiringPrice1","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MaxValue","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"generation","type":"bool"}],"name":"getPerson","outputs":[{"name":"name","type":"string"},{"name":"surname","type":"string"},{"name":"genes","type":"uint64"},{"name":"birthTime","type":"uint64"},{"name":"readyToBreedWithId","type":"uint32"},{"name":"trainedcount","type":"uint32"},{"name":"beatencount","type":"uint32"},{"name":"readyToBreedWithGen","type":"bool"},{"name":"gender","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"personid","type":"uint256"},{"name":"persongeneration","type":"bool"},{"name":"gene","type":"uint8"}],"name":"train","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_mypersonid","type":"uint256"},{"name":"_mypersongeneration","type":"bool"},{"name":"_withpersonid","type":"uint256"},{"name":"_withpersongeneration","type":"bool"},{"name":"_boyname","type":"string"},{"name":"_girlname","type":"string"}],"name":"breed","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"purchase","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"initialBeating","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"personIndexToApprovedGen1","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"SYMBOL","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"personid","type":"uint256"},{"name":"persongeneration","type":"bool"}],"name":"checkTrainingPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_mypersonid","type":"uint256"},{"name":"_mypersongeneration","type":"bool"},{"name":"_withpersonid","type":"uint256"},{"name":"_withpersongeneration","type":"bool"},{"name":"_siringprice","type":"uint256"}],"name":"prepareToBreed","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"name","type":"string"},{"indexed":false,"name":"owner","type":"address"}],"name":"Birth","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"oldPrice","type":"uint256"},{"indexed":false,"name":"newPrice","type":"uint256"},{"indexed":false,"name":"prevOwner","type":"address"},{"indexed":false,"name":"winner","type":"address"},{"indexed":false,"name":"name","type":"string"}],"name":"TokenSold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"from","type":"address"},{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"caller","type":"address"},{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"generation","type":"bool"}],"name":"Trained","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"caller","type":"address"},{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"generation","type":"bool"}],"name":"Beaten","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"caller","type":"address"},{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"generation","type":"bool"},{"indexed":false,"name":"price","type":"uint256"}],"name":"SiringPriceEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"caller","type":"address"},{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"generation","type":"bool"},{"indexed":false,"name":"price","type":"uint256"}],"name":"SellingPriceEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"caller","type":"address"},{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"generation","type":"bool"},{"indexed":false,"name":"genes","type":"uint256"}],"name":"GenesInitialisedEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"approved","type":"address"},{"indexed":false,"name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"}]

608060405273bb5ed1edeb5149af3ab43ea9c7a6963b3c1374f76000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550662386f26fc100006001556509184e72a0006002556512309ce54000600355341561008257600080fd5b33600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550614bfa806101136000396000f30060806040526004361061021a576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063013a83f11461021f57806306fdde0314610258578063095ea7b3146102e65780630b869824146103315780630de7e440146103865780630e14f955146103f15780631051db341461045657806318160ddd1461048357806323b872dd146104ac57806327cae7c01461051757806327d7874c146105565780633befedea146105975780634574dea51461061757806351584916146106425780635423977714610699578063630e0ae6146107045780636352211e1461078957806369288540146107f457806370a0823114610835578063843170081461088a5780638462151c146108bf578063871388c91461095557806389a4c1a0146109a0578063944c8929146109f557806395d89b4114610a40578063a3f4df7e14610ace578063a9059cbb14610b5c578063ade2d19314610ba7578063b2e6ceeb14610c12578063b9186d7d14610c3d578063b944ef3c14610c7c578063c13fb08b14610ca5578063c69cd09d14610d73578063c737338614610d9c578063d230e87514610ddb578063e282969e14610e04578063ec0d69e314610fa5578063ec0ea81614610fde578063efef39a1146110ac578063f2abd01d146110cc578063f4c09c17146110f5578063f76f8d7814611160578063fa28a6b6146111ee578063fa6fc03714611239575b600080fd5b61025660048036038101908080359060200190929190803515159060200190929190803560ff169060200190929190505050611290565b005b341561026357600080fd5b61026b61164a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102ab578082015181840152602081019050610290565b50505050905090810190601f1680156102d85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156102f157600080fd5b61032f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611687565b005b341561033c57600080fd5b610344611759565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561039157600080fd5b6103af6004803603810190808035906020019092919050505061177f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103fc57600080fd5b61043c60048036038101908080359060200190929190803515159060200190929190803590602001909291908035151590602001909291905050506117b2565b604051808215151515815260200191505060405180910390f35b341561046157600080fd5b6104696118ba565b604051808215151515815260200191505060405180910390f35b341561048e57600080fd5b6104966118c3565b6040518082815260200191505060405180910390f35b34156104b757600080fd5b610515600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506118d0565b005b341561052257600080fd5b61054060048036038101908080359060200190929190505050611920565b6040518082815260200191505060405180910390f35b341561056157600080fd5b610595600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611938565b005b34156105a257600080fd5b6105cc600480360381019080803590602001909291908035151590602001909291905050506119ec565b604051808563ffffffff1663ffffffff1681526020018463ffffffff1663ffffffff168152602001831515151581526020018215151515815260200194505050505060405180910390f35b341561062257600080fd5b61064060048036038101908080359060200190929190505050611aa4565b005b341561064d57600080fd5b610697600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803515159060200190929190505050611b0a565b005b34156106a457600080fd5b6106c260048036038101908080359060200190929190505050611c69565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561070f57600080fd5b610773600480360381019080803590602001908201803590602001919091929391929390803590602001908201803590602001919091929391929390803567ffffffffffffffff169060200190929190803515159060200190929190505050611c9c565b6040518082815260200191505060405180910390f35b341561079457600080fd5b6107b260048036038101908080359060200190929190505050611d78565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156107ff57600080fd5b610833600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611dc9565b005b341561084057600080fd5b610874600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e7d565b6040518082815260200191505060405180910390f35b341561089557600080fd5b6108bd6004803603810190808035906020019092919080359060200190929190505050611ec6565b005b34156108ca57600080fd5b6108fe600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611fc2565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610941578082015181840152602081019050610926565b505050509050019250505060405180910390f35b341561096057600080fd5b61099e60048036038101908080359060200190929190803515159060200190929190803567ffffffffffffffff16906020019092919050505061210f565b005b34156109ab57600080fd5b6109b3612388565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610a0057600080fd5b610a2a600480360381019080803590602001909291908035151590602001909291905050506123ae565b6040518082815260200191505060405180910390f35b3415610a4b57600080fd5b610a5361244e565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a93578082015181840152602081019050610a78565b50505050905090810190601f168015610ac05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610ad957600080fd5b610ae161248b565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b21578082015181840152602081019050610b06565b50505050905090810190601f168015610b4e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610b6757600080fd5b610ba5600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506124c4565b005b3415610bb257600080fd5b610bd0600480360381019080803590602001909291905050506124fe565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610c1d57600080fd5b610c3b60048036038101908080359060200190929190505050612531565b005b3415610c4857600080fd5b610c66600480360381019080803590602001909291905050506125a6565b6040518082815260200191505060405180910390f35b3415610c8757600080fd5b610c8f6125c3565b6040518082815260200191505060405180910390f35b610d716004803603810190808035906020019092919080351515906020019092919080359060200190929190803515159060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506125c9565b005b3415610d7e57600080fd5b610d86612af5565b6040518082815260200191505060405180910390f35b3415610da757600080fd5b610dc560048036038101908080359060200190929190505050612afb565b6040518082815260200191505060405180910390f35b3415610de657600080fd5b610dee612b13565b6040518082815260200191505060405180910390f35b3415610e0f57600080fd5b610e3960048036038101908080359060200190929190803515159060200190929190505050612b22565b6040518080602001806020018a67ffffffffffffffff1667ffffffffffffffff1681526020018967ffffffffffffffff1667ffffffffffffffff1681526020018863ffffffff1663ffffffff1681526020018763ffffffff1663ffffffff1681526020018663ffffffff1663ffffffff168152602001851515151581526020018415151515815260200183810383528c818151815260200191508051906020019080838360005b83811015610efb578082015181840152602081019050610ee0565b50505050905090810190601f168015610f285780820380516001836020036101000a031916815260200191505b5083810382528b818151815260200191508051906020019080838360005b83811015610f61578082015181840152602081019050610f46565b50505050905090810190601f168015610f8e5780820380516001836020036101000a031916815260200191505b509b50505050505050505050505060405180910390f35b610fdc60048036038101908080359060200190929190803515159060200190929190803560ff169060200190929190505050612d71565b005b6110aa6004803603810190808035906020019092919080351515906020019092919080359060200190929190803515159060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061312b565b005b6110ca600480360381019080803590602001909291905050506134b7565b005b34156110d757600080fd5b6110df6137d6565b6040518082815260200191505060405180910390f35b341561110057600080fd5b61111e600480360381019080803590602001909291905050506137dc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561116b57600080fd5b61117361380f565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156111b3578082015181840152602081019050611198565b50505050905090810190601f1680156111e05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156111f957600080fd5b61122360048036038101908080359060200190929190803515159060200190929190505050613848565b6040518082815260200191505060405180910390f35b341561124457600080fd5b61128e6004803603810190808035906020019092919080351515906020019092919080359060200190929190803515159060200190929190803590602001909291905050506138e8565b005b6000806000806000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411806113d1575060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b151561139c57600080fd5b5af115156113a957600080fd5b5050506040513d60208110156113be57600080fd5b8101908080519060200190929190505050115b15156113dc57600080fd5b60008560ff16101580156113f35750600a8560ff16105b15156113fe57600080fd5b61140887876123ae565b935083341015151561141957600080fd5b60001515861515141561144a57600e8781548110151561143557fe5b9060005260206000209060040201925061146a565b600f8781548110151561145957fe5b906000526020600020906004020192505b605a8360020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1611151561149b57600080fd5b8460ff16600a0a8360020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff168115156114ce57fe5b049150600a828115156114dd57fe5b0691506000821115156114ef57600080fd5b8460ff16600a0a8360020160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600301600081819054906101000a900463ffffffff168092919060010191906101000a81548163ffffffff021916908363ffffffff160217905550506115803485613a9c565b90503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015156115c257600080fd5b6115ca613ab5565b7fee0cc81767fb293a336247d0b7b2d4a2bd01b9471eb023d895790c4fa4a235b1338888604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182151515158152602001935050505060405180910390a150505050505050565b60606040805190810160405280601b81526020017f43727970746f43656c6562726974794272656564657243617264730000000000815250905090565b61169333826001613bc7565b151561169e57600080fd5b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a35050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60086020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008083861480156117c75750821515851515145b156117d557600091506118b1565b6000861480156117e9575060001515851515145b806118045750600084148015611803575060001515831515145b5b1561181257600091506118b1565b60001515831515141561184357600e8481548110151561182e57fe5b90600052602060002090600402019050611863565b600f8481548110151561185257fe5b906000526020600020906004020190505b8415158160030160049054906101000a900460ff16151514156118ac57858160020160189054906101000a900463ffffffff1663ffffffff1614156118ab57600191506118b1565b5b600091505b50949350505050565b60006001905090565b6000600f80549050905090565b6118dc83826001613bc7565b15156118e757600080fd5b6118f18282613e04565b15156118fc57600080fd5b61190582613e70565b151561191057600080fd5b61191b838383613ea9565b505050565b600a6020528060005260406000206000915090505481565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561199457600080fd5b61199d81613e70565b15156119a857600080fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060008060008015158615151415611a2457600e87815481101515611a0f57fe5b90600052602060002090600402019050611a44565b600f87815481101515611a3357fe5b906000526020600020906004020190505b8060020160109054906101000a900463ffffffff1694508060020160149054906101000a900463ffffffff1693508060030160069054906101000a900460ff1692508060030160079054906101000a900460ff1691505092959194509250565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b0057600080fd5b8060018190555050565b611b15338383613bc7565b1515611b2057600080fd5b8015611bc757611b2f83613e70565b15611b8b57826009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611bc2565b6009600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b611c64565b611bd083613e70565b15611c2c57826008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611c63565b6008600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b5b505050565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611cfa57600080fd5b611d6c87878080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505086868080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505085856000614058565b90509695505050505050565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050611db981613e70565b1515611dc457600080fd5b919050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611e2557600080fd5b611e2e81613e70565b1515611e3957600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611ed233836001613bc7565b1515611edd57600080fd5b600081111580611ef857506a52b7d2dcc80cd2e40000008110155b15611f25576a52b7d2dcc80cd2e40000006007600084815260200190815260200160002081905550611f3e565b8060076000848152602001908152602001600020819055505b7f913e11880c4c308f0b48d197ed7f6f0943891f2440ad527a51d2e06e111460ff3383600184604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018315151515815260200182815260200194505050505060405180910390a15050565b6060600060606000806000611fd687611e7d565b945060008514156120195760006040519080825280602002602001820160405280156120115781602001602082028038833980820191505090505b509550612105565b846040519080825280602002602001820160405280156120485781602001602082028038833980820191505090505b5093506120536118c3565b925060009150600090505b8281111515612101578673ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156120f4578084838151811015156120dd57fe5b906020019060200201818152505081806001019250505b808060010191505061205e565b8395505b5050505050919050565b600080600080612120338888613bc7565b806121785750600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561218357600080fd5b6402540be3ff8567ffffffffffffffff16111580156121ad5750600a8567ffffffffffffffff1610155b15156121b857600080fd5b6000151586151514156121e957600e878154811015156121d457fe5b90600052602060002090600402019350612209565b600f878154811015156121f857fe5b906000526020600020906004020193505b605a8460020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff161115151561223b57600080fd5b84925060009150600090505b600a81101561229157600a8367ffffffffffffffff1681151561226657fe5b0682019150600a8367ffffffffffffffff1681151561228157fe5b0492508080600101915050612247565b8360020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff168267ffffffffffffffff161415156122cb57600080fd5b848460020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fa3538417882555b2b672efa68fe316620fd2b0413107809b0653bbb4f920a66833888888604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001848152602001831515151581526020018267ffffffffffffffff16815260200194505050505060405180910390a150505050505050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080151584151514156123e357600e858154811015156123ce57fe5b90600052602060002090600402019150612403565b600f858154811015156123f257fe5b906000526020600020906004020191505b6003548260030160009054906101000a900463ffffffff1663ffffffff1660020a029050676124fee993bc000081111561244357676124fee993bc000090505b809250505092915050565b60606040805190810160405280600d81526020017f43656c6542726565644361726400000000000000000000000000000000000000815250905090565b6040805190810160405280601b81526020017f43727970746f43656c656272697479427265656465724361726473000000000081525081565b6124d033826001613bc7565b15156124db57600080fd5b6124e482613e70565b15156124ef57600080fd5b6124fa338383613ea9565b5050565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000803391506004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061257682613e70565b151561258157600080fd5b61258b8284613e04565b151561259657600080fd5b6125a1818385613ea9565b505050565b600060076000838152602001908152602001600020549050919050565b60025481565b60008060008060008060006125df338e8e613bc7565b15156125ea57600080fd5b60016125f46118c3565b01622625a011151561260557600080fd5b8a8d14801561261757508915158c1515145b15151561262357600080fd5b60008d1480156126375750600015158c1515145b80612652575060008b1480156126515750600015158a1515145b5b15151561265e57600080fd5b600015158c1515141561268f57600e8d81548110151561267a57fe5b906000526020600020906004020196506126d3565b600f8d81548110151561269e57fe5b90600052602060002090600402019650600015158760030160059054906101000a900460ff1615151415156126d257600080fd5b5b605a8760020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1611151561270457600080fd5b8660020160009054906101000a900467ffffffffffffffff169350600015158a1515141561282a57600e8b81548110151561273b57fe5b90600052602060002090600402019650600a60008c81526020019081526020016000205494506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8c6040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15156127f057600080fd5b5af115156127fd57600080fd5b5050506040513d602081101561281257600080fd5b81019080805190602001909291905050509550612896565b600f8b81548110151561283957fe5b90600052602060002090600402019650600b60008c8152602001908152602001600020549450600460008c815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1695505b6000851180156128b057506a52b7d2dcc80cd2e400000085105b15156128bb57600080fd5b348560015401111515156128ce57600080fd5b6128f2848860020160009054906101000a900467ffffffffffffffff168f8e614653565b80935081945050508115612904578897505b6129ae88886001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129a05780601f10612975576101008083540402835291602001916129a0565b820191906000526020600020905b81548152906001019060200180831161298357829003601f168201915b505050505085856001614058565b905089600f828154811015156129c057fe5b906000526020600020906004020160030160066101000a81548160ff0219169083151502179055508b600f828154811015156129f857fe5b906000526020600020906004020160030160076101000a81548160ff0219169083151502179055508a600f82815481101515612a3057fe5b906000526020600020906004020160020160106101000a81548163ffffffff021916908363ffffffff1602179055508c600f82815481101515612a6f57fe5b906000526020600020906004020160020160146101000a81548163ffffffff021916908363ffffffff1602179055508573ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f193505050501515612ade57600080fd5b612ae6613ab5565b50505050505050505050505050565b60015481565b600b6020528060005260406000206000915090505481565b6a52b7d2dcc80cd2e400000081565b606080600080600080600080600080600015158b15151415612b6257600e8c815481101515612b4d57fe5b90600052602060002090600402019050612b82565b600f8c815481101515612b7157fe5b906000526020600020906004020190505b806000018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612c1a5780601f10612bef57610100808354040283529160200191612c1a565b820191906000526020600020905b815481529060010190602001808311612bfd57829003601f168201915b50505050509950806001018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612cb95780601f10612c8e57610100808354040283529160200191612cb9565b820191906000526020600020905b815481529060010190602001808311612c9c57829003601f168201915b505050505098508060020160009054906101000a900467ffffffffffffffff1697508060020160089054906101000a900467ffffffffffffffff1696508060020160189054906101000a900463ffffffff16955080600201601c9054906101000a900463ffffffff1694508060030160009054906101000a900463ffffffff1693508060030160049054906101000a900460ff1692508060030160059054906101000a900460ff169150509295985092959850929598565b6000806000806000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541180612eb2575060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1515612e7d57600080fd5b5af11515612e8a57600080fd5b5050506040513d6020811015612e9f57600080fd5b8101908080519060200190929190505050115b1515612ebd57600080fd5b60008560ff1610158015612ed45750600a8560ff16105b1515612edf57600080fd5b612ee98787613848565b9350833410151515612efa57600080fd5b600015158615151415612f2b57600e87815481101515612f1657fe5b90600052602060002090600402019250612f4b565b600f87815481101515612f3a57fe5b906000526020600020906004020192505b605a8360020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16111515612f7c57600080fd5b8460ff16600a0a8360020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16811515612faf57fe5b049150600a82811515612fbe57fe5b069150600982101515612fd057600080fd5b8460ff16600a0a8360020160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600201601c81819054906101000a900463ffffffff168092919060010191906101000a81548163ffffffff021916908363ffffffff160217905550506130613485613a9c565b90503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015156130a357600080fd5b6130ab613ab5565b7fdfda1f36e9a72c0e20d2410764fc28694c08c78e70289efc7622f83ef80e30fe338888604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182151515158152602001935050505060405180910390a150505050505050565b600080600080600061313e338c8c613bc7565b151561314957600080fd5b60016131536118c3565b01622625a011151561316457600080fd5b600015158a1515141561319557600e8b81548110151561318057fe5b906000526020600020906004020194506131d9565b600f8b8154811015156131a457fe5b90600052602060002090600402019450600015158560030160059054906101000a900460ff1615151415156131d857600080fd5b5b605a8560020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1611151561320a57600080fd5b8460020160009054906101000a900467ffffffffffffffff16935060001515881515141561325657600e8981548110151561324157fe5b90600052602060002090600402019450613276565b600f8981548110151561326557fe5b906000526020600020906004020194505b6132828b8b8b8b6117b2565b151561328d57600080fd5b346001541115151561329e57600080fd5b8460020160186101000a81549063ffffffff021916905560008560030160046101000a81548160ff0219169083151502179055506132f6848660020160009054906101000a900467ffffffffffffffff168d8c614653565b80935081945050508115613308578695505b6133b286866001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156133a45780601f10613379576101008083540402835291602001916133a4565b820191906000526020600020905b81548152906001019060200180831161338757829003601f168201915b505050505085856001614058565b905087600f828154811015156133c457fe5b906000526020600020906004020160030160066101000a81548160ff02191690831515021790555089600f828154811015156133fc57fe5b906000526020600020906004020160030160076101000a81548160ff02191690831515021790555088600f8281548110151561343457fe5b906000526020600020906004020160020160106101000a81548163ffffffff021916908363ffffffff1602179055508a600f8281548110151561347357fe5b906000526020600020906004020160020160146101000a81548163ffffffff021916908363ffffffff1602179055506134aa613ab5565b5050505050505050505050565b6000806000806004600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169350339250600760008681526020019081526020016000205491506a52b7d2dcc80cd2e400000060076000878152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415151561356a57600080fd5b61357383613e70565b151561357e57600080fd5b81341015151561358d57600080fd5b6135973483613a9c565b90506135a4848487613ea9565b3073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614151561361a578373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050151561361957600080fd5b5b613625856001614934565b7e8201e7bcbf010c2c07de59d6e97cb7e3cf67a46125c49cbc89b9d2cde1f48f858360076000898152602001908152602001600020548787600f8b81548110151561366c57fe5b9060005260206000209060040201600001604051808781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018060200182810382528381815460018160011615610100020316600290048152602001915080546001816001161561010002031660029004801561377c5780601f106137515761010080835404028352916020019161377c565b820191906000526020600020905b81548152906001019060200180831161375f57829003601f168201915b505097505050505050505060405180910390a13373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015156137cf57600080fd5b5050505050565b60035481565b60066020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040805190810160405280600d81526020017f43656c654272656564436172640000000000000000000000000000000000000081525081565b6000806000801515841515141561387d57600e8581548110151561386857fe5b9060005260206000209060040201915061389d565b600f8581548110151561388c57fe5b906000526020600020906004020191505b60025482600201601c9054906101000a900463ffffffff1663ffffffff1660020a029050674563918244f400008111156138dd57674563918244f4000090505b809250505092915050565b60006138f5338787613bc7565b151561390057600080fd5b60001515851515141561394957600e8681548110151561391c57fe5b9060005260206000209060040201905081600a6000888152602001908152602001600020819055506139a5565b600f8681548110151561395857fe5b90600052602060002090600402019050600115158160030160059054906101000a900460ff16151514151561398c57600080fd5b81600b6000888152602001908152602001600020819055505b605a8160020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff161115156139d657600080fd5b838160020160186101000a81548163ffffffff021916908363ffffffff160217905550828160030160046101000a81548160ff0219169083151502179055507f9c9bbfc444fadb4f6ea76eeea0f2096baf957e36bf9dea2e1520dfc82e6934aa33878785604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018315151515815260200182815260200194505050505060405180910390a1505050505050565b6000828211151515613aaa57fe5b818303905092915050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6003600a3073ffffffffffffffffffffffffffffffffffffffff1631811515613b1657fe5b04029081150290604051600060405180830381858888f193505050501515613b3d57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6007600a3073ffffffffffffffffffffffffffffffffffffffff1631811515613b9e57fe5b04029081150290604051600060405180830381858888f193505050501515613bc557600080fd5b565b60008115613ca1576004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480613c9a57506009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b9050613dfd565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663aa1d98af846040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515613d3057600080fd5b5af11515613d3d57600080fd5b5050506040513d6020811015613d5257600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480613dfa57506008600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b90505b9392505050565b60008273ffffffffffffffffffffffffffffffffffffffff166006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613f5383613e70565b15613fb457600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550613fb3816001614934565b5b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b6000614062614a86565b60006101a0604051908101604052808981526020018881526020018767ffffffffffffffff1681526020014267ffffffffffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff1681526020016000151581526020018615158152602001600015158152602001600015158152509150600015158415151415614328576001600e8390806001815401808255809150509060018203906000526020600020906004020160009091929091909150600082015181600001908051906020019061415a929190614b29565b506020820151816001019080519060200190614177929190614b29565b5060408201518160020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160020160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160020160106101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160020160146101000a81548163ffffffff021916908363ffffffff16021790555060c08201518160020160186101000a81548163ffffffff021916908363ffffffff16021790555060e082015181600201601c6101000a81548163ffffffff021916908363ffffffff1602179055506101008201518160030160006101000a81548163ffffffff021916908363ffffffff1602179055506101208201518160030160046101000a81548160ff0219169083151502179055506101408201518160030160056101000a81548160ff0219169083151502179055506101608201518160030160066101000a81548160ff0219169083151502179055506101808201518160030160076101000a81548160ff021916908315150217905550505003905061456d565b6001600f83908060018154018082558091505090600182039060005260206000209060040201600090919290919091506000820151816000019080519060200190614374929190614b29565b506020820151816001019080519060200190614391929190614b29565b5060408201518160020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160020160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160020160106101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160020160146101000a81548163ffffffff021916908363ffffffff16021790555060c08201518160020160186101000a81548163ffffffff021916908363ffffffff16021790555060e082015181600201601c6101000a81548163ffffffff021916908363ffffffff1602179055506101008201518160030160006101000a81548163ffffffff021916908363ffffffff1602179055506101208201518160030160046101000a81548160ff0219169083151502179055506101408201518160030160056101000a81548160ff0219169083151502179055506101608201518160030160066101000a81548160ff0219169083151502179055506101808201518160030160076101000a81548160ff02191690831515021790555050500390506a52b7d2dcc80cd2e4000000600760008381526020019081526020016000208190555061456c60003383613ea9565b5b7fb3b0cf861f168bcdb275c69da97b2543631552ba562628aa3c7317d4a6089ef281893360405180848152602001806020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019080838360005b838110156146095780820151818401526020810190506145ee565b50505050905090810190601f1680156146365780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a1809250505095945050505050565b600080600080600080600080600080925060009150600090505b600a81101561488857600a8d67ffffffffffffffff1681151561468c57fe5b069550600a8c67ffffffffffffffff168115156146a557fe5b069450600a8d67ffffffffffffffff168115156146be57fe5b049c50600a8c67ffffffffffffffff168115156146d757fe5b049b50612710434082428e8e6040518086600019166000191681526020018581526020018481526020018381526020018281526020019550505050505060405180910390206001900467ffffffffffffffff1681151561473357fe5b0693508467ffffffffffffffff168667ffffffffffffffff1610151561475d578486039650614763565b85850396505b601a8467ffffffffffffffff16101561478157600387039650614837565b6101c78467ffffffffffffffff1610156147a057600287039650614836565b610c658467ffffffffffffffff1610156147bf57600187039650614835565b611aab8467ffffffffffffffff1610156147d857614834565b6125498467ffffffffffffffff1610156147f757600187019650614833565b6126f68467ffffffffffffffff16101561481657600287019650614832565b6103e88467ffffffffffffffff161015614831576003870196505b5b5b5b5b5b5b600c8767ffffffffffffffff16111561484f57600096505b60098767ffffffffffffffff16111561486757600996505b8667ffffffffffffffff1681600a0a0283019250808060010191505061466d565b600060024340600b428f8f6040518086600019166000191681526020018560ff167f01000000000000000000000000000000000000000000000000000000000000000281526001018481526020018381526020018281526020019550505050505060405180910390206001900467ffffffffffffffff1681151561490857fe5b0667ffffffffffffffff16111561491e57600191505b8282985098505050505050505094509492505050565b600080151582151514156149b357600e8381548110151561495157fe5b906000526020600020906004020190506008600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a600084815260200190815260200160002060009055614a56565b600f838154811015156149c257fe5b906000526020600020906004020190506009600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600b6000848152602001908152602001600020600090556006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b8060020160186101000a81549063ffffffff02191690558060030160046101000a81549060ff0219169055505050565b6101a0604051908101604052806060815260200160608152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff1681526020016000151581526020016000151581526020016000151581526020016000151581525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614b6a57805160ff1916838001178555614b98565b82800160010185558215614b98579182015b82811115614b97578251825591602001919060010190614b7c565b5b509050614ba59190614ba9565b5090565b614bcb91905b80821115614bc7576000816000905550600101614baf565b5090565b905600a165627a7a723058203ba28f220433460030c0c085caf3a4e47b356096d75eb32a6954e21b1c928d860029

Deployed Bytecode

0x60806040526004361061021a576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063013a83f11461021f57806306fdde0314610258578063095ea7b3146102e65780630b869824146103315780630de7e440146103865780630e14f955146103f15780631051db341461045657806318160ddd1461048357806323b872dd146104ac57806327cae7c01461051757806327d7874c146105565780633befedea146105975780634574dea51461061757806351584916146106425780635423977714610699578063630e0ae6146107045780636352211e1461078957806369288540146107f457806370a0823114610835578063843170081461088a5780638462151c146108bf578063871388c91461095557806389a4c1a0146109a0578063944c8929146109f557806395d89b4114610a40578063a3f4df7e14610ace578063a9059cbb14610b5c578063ade2d19314610ba7578063b2e6ceeb14610c12578063b9186d7d14610c3d578063b944ef3c14610c7c578063c13fb08b14610ca5578063c69cd09d14610d73578063c737338614610d9c578063d230e87514610ddb578063e282969e14610e04578063ec0d69e314610fa5578063ec0ea81614610fde578063efef39a1146110ac578063f2abd01d146110cc578063f4c09c17146110f5578063f76f8d7814611160578063fa28a6b6146111ee578063fa6fc03714611239575b600080fd5b61025660048036038101908080359060200190929190803515159060200190929190803560ff169060200190929190505050611290565b005b341561026357600080fd5b61026b61164a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102ab578082015181840152602081019050610290565b50505050905090810190601f1680156102d85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156102f157600080fd5b61032f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611687565b005b341561033c57600080fd5b610344611759565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561039157600080fd5b6103af6004803603810190808035906020019092919050505061177f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103fc57600080fd5b61043c60048036038101908080359060200190929190803515159060200190929190803590602001909291908035151590602001909291905050506117b2565b604051808215151515815260200191505060405180910390f35b341561046157600080fd5b6104696118ba565b604051808215151515815260200191505060405180910390f35b341561048e57600080fd5b6104966118c3565b6040518082815260200191505060405180910390f35b34156104b757600080fd5b610515600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506118d0565b005b341561052257600080fd5b61054060048036038101908080359060200190929190505050611920565b6040518082815260200191505060405180910390f35b341561056157600080fd5b610595600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611938565b005b34156105a257600080fd5b6105cc600480360381019080803590602001909291908035151590602001909291905050506119ec565b604051808563ffffffff1663ffffffff1681526020018463ffffffff1663ffffffff168152602001831515151581526020018215151515815260200194505050505060405180910390f35b341561062257600080fd5b61064060048036038101908080359060200190929190505050611aa4565b005b341561064d57600080fd5b610697600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803515159060200190929190505050611b0a565b005b34156106a457600080fd5b6106c260048036038101908080359060200190929190505050611c69565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561070f57600080fd5b610773600480360381019080803590602001908201803590602001919091929391929390803590602001908201803590602001919091929391929390803567ffffffffffffffff169060200190929190803515159060200190929190505050611c9c565b6040518082815260200191505060405180910390f35b341561079457600080fd5b6107b260048036038101908080359060200190929190505050611d78565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156107ff57600080fd5b610833600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611dc9565b005b341561084057600080fd5b610874600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e7d565b6040518082815260200191505060405180910390f35b341561089557600080fd5b6108bd6004803603810190808035906020019092919080359060200190929190505050611ec6565b005b34156108ca57600080fd5b6108fe600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611fc2565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610941578082015181840152602081019050610926565b505050509050019250505060405180910390f35b341561096057600080fd5b61099e60048036038101908080359060200190929190803515159060200190929190803567ffffffffffffffff16906020019092919050505061210f565b005b34156109ab57600080fd5b6109b3612388565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610a0057600080fd5b610a2a600480360381019080803590602001909291908035151590602001909291905050506123ae565b6040518082815260200191505060405180910390f35b3415610a4b57600080fd5b610a5361244e565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a93578082015181840152602081019050610a78565b50505050905090810190601f168015610ac05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610ad957600080fd5b610ae161248b565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b21578082015181840152602081019050610b06565b50505050905090810190601f168015610b4e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610b6757600080fd5b610ba5600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506124c4565b005b3415610bb257600080fd5b610bd0600480360381019080803590602001909291905050506124fe565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610c1d57600080fd5b610c3b60048036038101908080359060200190929190505050612531565b005b3415610c4857600080fd5b610c66600480360381019080803590602001909291905050506125a6565b6040518082815260200191505060405180910390f35b3415610c8757600080fd5b610c8f6125c3565b6040518082815260200191505060405180910390f35b610d716004803603810190808035906020019092919080351515906020019092919080359060200190929190803515159060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506125c9565b005b3415610d7e57600080fd5b610d86612af5565b6040518082815260200191505060405180910390f35b3415610da757600080fd5b610dc560048036038101908080359060200190929190505050612afb565b6040518082815260200191505060405180910390f35b3415610de657600080fd5b610dee612b13565b6040518082815260200191505060405180910390f35b3415610e0f57600080fd5b610e3960048036038101908080359060200190929190803515159060200190929190505050612b22565b6040518080602001806020018a67ffffffffffffffff1667ffffffffffffffff1681526020018967ffffffffffffffff1667ffffffffffffffff1681526020018863ffffffff1663ffffffff1681526020018763ffffffff1663ffffffff1681526020018663ffffffff1663ffffffff168152602001851515151581526020018415151515815260200183810383528c818151815260200191508051906020019080838360005b83811015610efb578082015181840152602081019050610ee0565b50505050905090810190601f168015610f285780820380516001836020036101000a031916815260200191505b5083810382528b818151815260200191508051906020019080838360005b83811015610f61578082015181840152602081019050610f46565b50505050905090810190601f168015610f8e5780820380516001836020036101000a031916815260200191505b509b50505050505050505050505060405180910390f35b610fdc60048036038101908080359060200190929190803515159060200190929190803560ff169060200190929190505050612d71565b005b6110aa6004803603810190808035906020019092919080351515906020019092919080359060200190929190803515159060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061312b565b005b6110ca600480360381019080803590602001909291905050506134b7565b005b34156110d757600080fd5b6110df6137d6565b6040518082815260200191505060405180910390f35b341561110057600080fd5b61111e600480360381019080803590602001909291905050506137dc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561116b57600080fd5b61117361380f565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156111b3578082015181840152602081019050611198565b50505050905090810190601f1680156111e05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156111f957600080fd5b61122360048036038101908080359060200190929190803515159060200190929190505050613848565b6040518082815260200191505060405180910390f35b341561124457600080fd5b61128e6004803603810190808035906020019092919080351515906020019092919080359060200190929190803515159060200190929190803590602001909291905050506138e8565b005b6000806000806000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411806113d1575060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b151561139c57600080fd5b5af115156113a957600080fd5b5050506040513d60208110156113be57600080fd5b8101908080519060200190929190505050115b15156113dc57600080fd5b60008560ff16101580156113f35750600a8560ff16105b15156113fe57600080fd5b61140887876123ae565b935083341015151561141957600080fd5b60001515861515141561144a57600e8781548110151561143557fe5b9060005260206000209060040201925061146a565b600f8781548110151561145957fe5b906000526020600020906004020192505b605a8360020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1611151561149b57600080fd5b8460ff16600a0a8360020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff168115156114ce57fe5b049150600a828115156114dd57fe5b0691506000821115156114ef57600080fd5b8460ff16600a0a8360020160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600301600081819054906101000a900463ffffffff168092919060010191906101000a81548163ffffffff021916908363ffffffff160217905550506115803485613a9c565b90503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015156115c257600080fd5b6115ca613ab5565b7fee0cc81767fb293a336247d0b7b2d4a2bd01b9471eb023d895790c4fa4a235b1338888604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182151515158152602001935050505060405180910390a150505050505050565b60606040805190810160405280601b81526020017f43727970746f43656c6562726974794272656564657243617264730000000000815250905090565b61169333826001613bc7565b151561169e57600080fd5b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a35050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60086020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008083861480156117c75750821515851515145b156117d557600091506118b1565b6000861480156117e9575060001515851515145b806118045750600084148015611803575060001515831515145b5b1561181257600091506118b1565b60001515831515141561184357600e8481548110151561182e57fe5b90600052602060002090600402019050611863565b600f8481548110151561185257fe5b906000526020600020906004020190505b8415158160030160049054906101000a900460ff16151514156118ac57858160020160189054906101000a900463ffffffff1663ffffffff1614156118ab57600191506118b1565b5b600091505b50949350505050565b60006001905090565b6000600f80549050905090565b6118dc83826001613bc7565b15156118e757600080fd5b6118f18282613e04565b15156118fc57600080fd5b61190582613e70565b151561191057600080fd5b61191b838383613ea9565b505050565b600a6020528060005260406000206000915090505481565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561199457600080fd5b61199d81613e70565b15156119a857600080fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060008060008015158615151415611a2457600e87815481101515611a0f57fe5b90600052602060002090600402019050611a44565b600f87815481101515611a3357fe5b906000526020600020906004020190505b8060020160109054906101000a900463ffffffff1694508060020160149054906101000a900463ffffffff1693508060030160069054906101000a900460ff1692508060030160079054906101000a900460ff1691505092959194509250565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b0057600080fd5b8060018190555050565b611b15338383613bc7565b1515611b2057600080fd5b8015611bc757611b2f83613e70565b15611b8b57826009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611bc2565b6009600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b611c64565b611bd083613e70565b15611c2c57826008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611c63565b6008600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b5b505050565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611cfa57600080fd5b611d6c87878080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505086868080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505085856000614058565b90509695505050505050565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050611db981613e70565b1515611dc457600080fd5b919050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611e2557600080fd5b611e2e81613e70565b1515611e3957600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611ed233836001613bc7565b1515611edd57600080fd5b600081111580611ef857506a52b7d2dcc80cd2e40000008110155b15611f25576a52b7d2dcc80cd2e40000006007600084815260200190815260200160002081905550611f3e565b8060076000848152602001908152602001600020819055505b7f913e11880c4c308f0b48d197ed7f6f0943891f2440ad527a51d2e06e111460ff3383600184604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018315151515815260200182815260200194505050505060405180910390a15050565b6060600060606000806000611fd687611e7d565b945060008514156120195760006040519080825280602002602001820160405280156120115781602001602082028038833980820191505090505b509550612105565b846040519080825280602002602001820160405280156120485781602001602082028038833980820191505090505b5093506120536118c3565b925060009150600090505b8281111515612101578673ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156120f4578084838151811015156120dd57fe5b906020019060200201818152505081806001019250505b808060010191505061205e565b8395505b5050505050919050565b600080600080612120338888613bc7565b806121785750600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561218357600080fd5b6402540be3ff8567ffffffffffffffff16111580156121ad5750600a8567ffffffffffffffff1610155b15156121b857600080fd5b6000151586151514156121e957600e878154811015156121d457fe5b90600052602060002090600402019350612209565b600f878154811015156121f857fe5b906000526020600020906004020193505b605a8460020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff161115151561223b57600080fd5b84925060009150600090505b600a81101561229157600a8367ffffffffffffffff1681151561226657fe5b0682019150600a8367ffffffffffffffff1681151561228157fe5b0492508080600101915050612247565b8360020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff168267ffffffffffffffff161415156122cb57600080fd5b848460020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fa3538417882555b2b672efa68fe316620fd2b0413107809b0653bbb4f920a66833888888604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001848152602001831515151581526020018267ffffffffffffffff16815260200194505050505060405180910390a150505050505050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080151584151514156123e357600e858154811015156123ce57fe5b90600052602060002090600402019150612403565b600f858154811015156123f257fe5b906000526020600020906004020191505b6003548260030160009054906101000a900463ffffffff1663ffffffff1660020a029050676124fee993bc000081111561244357676124fee993bc000090505b809250505092915050565b60606040805190810160405280600d81526020017f43656c6542726565644361726400000000000000000000000000000000000000815250905090565b6040805190810160405280601b81526020017f43727970746f43656c656272697479427265656465724361726473000000000081525081565b6124d033826001613bc7565b15156124db57600080fd5b6124e482613e70565b15156124ef57600080fd5b6124fa338383613ea9565b5050565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000803391506004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061257682613e70565b151561258157600080fd5b61258b8284613e04565b151561259657600080fd5b6125a1818385613ea9565b505050565b600060076000838152602001908152602001600020549050919050565b60025481565b60008060008060008060006125df338e8e613bc7565b15156125ea57600080fd5b60016125f46118c3565b01622625a011151561260557600080fd5b8a8d14801561261757508915158c1515145b15151561262357600080fd5b60008d1480156126375750600015158c1515145b80612652575060008b1480156126515750600015158a1515145b5b15151561265e57600080fd5b600015158c1515141561268f57600e8d81548110151561267a57fe5b906000526020600020906004020196506126d3565b600f8d81548110151561269e57fe5b90600052602060002090600402019650600015158760030160059054906101000a900460ff1615151415156126d257600080fd5b5b605a8760020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1611151561270457600080fd5b8660020160009054906101000a900467ffffffffffffffff169350600015158a1515141561282a57600e8b81548110151561273b57fe5b90600052602060002090600402019650600a60008c81526020019081526020016000205494506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8c6040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15156127f057600080fd5b5af115156127fd57600080fd5b5050506040513d602081101561281257600080fd5b81019080805190602001909291905050509550612896565b600f8b81548110151561283957fe5b90600052602060002090600402019650600b60008c8152602001908152602001600020549450600460008c815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1695505b6000851180156128b057506a52b7d2dcc80cd2e400000085105b15156128bb57600080fd5b348560015401111515156128ce57600080fd5b6128f2848860020160009054906101000a900467ffffffffffffffff168f8e614653565b80935081945050508115612904578897505b6129ae88886001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129a05780601f10612975576101008083540402835291602001916129a0565b820191906000526020600020905b81548152906001019060200180831161298357829003601f168201915b505050505085856001614058565b905089600f828154811015156129c057fe5b906000526020600020906004020160030160066101000a81548160ff0219169083151502179055508b600f828154811015156129f857fe5b906000526020600020906004020160030160076101000a81548160ff0219169083151502179055508a600f82815481101515612a3057fe5b906000526020600020906004020160020160106101000a81548163ffffffff021916908363ffffffff1602179055508c600f82815481101515612a6f57fe5b906000526020600020906004020160020160146101000a81548163ffffffff021916908363ffffffff1602179055508573ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f193505050501515612ade57600080fd5b612ae6613ab5565b50505050505050505050505050565b60015481565b600b6020528060005260406000206000915090505481565b6a52b7d2dcc80cd2e400000081565b606080600080600080600080600080600015158b15151415612b6257600e8c815481101515612b4d57fe5b90600052602060002090600402019050612b82565b600f8c815481101515612b7157fe5b906000526020600020906004020190505b806000018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612c1a5780601f10612bef57610100808354040283529160200191612c1a565b820191906000526020600020905b815481529060010190602001808311612bfd57829003601f168201915b50505050509950806001018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612cb95780601f10612c8e57610100808354040283529160200191612cb9565b820191906000526020600020905b815481529060010190602001808311612c9c57829003601f168201915b505050505098508060020160009054906101000a900467ffffffffffffffff1697508060020160089054906101000a900467ffffffffffffffff1696508060020160189054906101000a900463ffffffff16955080600201601c9054906101000a900463ffffffff1694508060030160009054906101000a900463ffffffff1693508060030160049054906101000a900460ff1692508060030160059054906101000a900460ff169150509295985092959850929598565b6000806000806000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541180612eb2575060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1515612e7d57600080fd5b5af11515612e8a57600080fd5b5050506040513d6020811015612e9f57600080fd5b8101908080519060200190929190505050115b1515612ebd57600080fd5b60008560ff1610158015612ed45750600a8560ff16105b1515612edf57600080fd5b612ee98787613848565b9350833410151515612efa57600080fd5b600015158615151415612f2b57600e87815481101515612f1657fe5b90600052602060002090600402019250612f4b565b600f87815481101515612f3a57fe5b906000526020600020906004020192505b605a8360020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16111515612f7c57600080fd5b8460ff16600a0a8360020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16811515612faf57fe5b049150600a82811515612fbe57fe5b069150600982101515612fd057600080fd5b8460ff16600a0a8360020160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600201601c81819054906101000a900463ffffffff168092919060010191906101000a81548163ffffffff021916908363ffffffff160217905550506130613485613a9c565b90503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015156130a357600080fd5b6130ab613ab5565b7fdfda1f36e9a72c0e20d2410764fc28694c08c78e70289efc7622f83ef80e30fe338888604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182151515158152602001935050505060405180910390a150505050505050565b600080600080600061313e338c8c613bc7565b151561314957600080fd5b60016131536118c3565b01622625a011151561316457600080fd5b600015158a1515141561319557600e8b81548110151561318057fe5b906000526020600020906004020194506131d9565b600f8b8154811015156131a457fe5b90600052602060002090600402019450600015158560030160059054906101000a900460ff1615151415156131d857600080fd5b5b605a8560020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1611151561320a57600080fd5b8460020160009054906101000a900467ffffffffffffffff16935060001515881515141561325657600e8981548110151561324157fe5b90600052602060002090600402019450613276565b600f8981548110151561326557fe5b906000526020600020906004020194505b6132828b8b8b8b6117b2565b151561328d57600080fd5b346001541115151561329e57600080fd5b8460020160186101000a81549063ffffffff021916905560008560030160046101000a81548160ff0219169083151502179055506132f6848660020160009054906101000a900467ffffffffffffffff168d8c614653565b80935081945050508115613308578695505b6133b286866001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156133a45780601f10613379576101008083540402835291602001916133a4565b820191906000526020600020905b81548152906001019060200180831161338757829003601f168201915b505050505085856001614058565b905087600f828154811015156133c457fe5b906000526020600020906004020160030160066101000a81548160ff02191690831515021790555089600f828154811015156133fc57fe5b906000526020600020906004020160030160076101000a81548160ff02191690831515021790555088600f8281548110151561343457fe5b906000526020600020906004020160020160106101000a81548163ffffffff021916908363ffffffff1602179055508a600f8281548110151561347357fe5b906000526020600020906004020160020160146101000a81548163ffffffff021916908363ffffffff1602179055506134aa613ab5565b5050505050505050505050565b6000806000806004600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169350339250600760008681526020019081526020016000205491506a52b7d2dcc80cd2e400000060076000878152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415151561356a57600080fd5b61357383613e70565b151561357e57600080fd5b81341015151561358d57600080fd5b6135973483613a9c565b90506135a4848487613ea9565b3073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614151561361a578373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050151561361957600080fd5b5b613625856001614934565b7e8201e7bcbf010c2c07de59d6e97cb7e3cf67a46125c49cbc89b9d2cde1f48f858360076000898152602001908152602001600020548787600f8b81548110151561366c57fe5b9060005260206000209060040201600001604051808781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018060200182810382528381815460018160011615610100020316600290048152602001915080546001816001161561010002031660029004801561377c5780601f106137515761010080835404028352916020019161377c565b820191906000526020600020905b81548152906001019060200180831161375f57829003601f168201915b505097505050505050505060405180910390a13373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015156137cf57600080fd5b5050505050565b60035481565b60066020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040805190810160405280600d81526020017f43656c654272656564436172640000000000000000000000000000000000000081525081565b6000806000801515841515141561387d57600e8581548110151561386857fe5b9060005260206000209060040201915061389d565b600f8581548110151561388c57fe5b906000526020600020906004020191505b60025482600201601c9054906101000a900463ffffffff1663ffffffff1660020a029050674563918244f400008111156138dd57674563918244f4000090505b809250505092915050565b60006138f5338787613bc7565b151561390057600080fd5b60001515851515141561394957600e8681548110151561391c57fe5b9060005260206000209060040201905081600a6000888152602001908152602001600020819055506139a5565b600f8681548110151561395857fe5b90600052602060002090600402019050600115158160030160059054906101000a900460ff16151514151561398c57600080fd5b81600b6000888152602001908152602001600020819055505b605a8160020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff161115156139d657600080fd5b838160020160186101000a81548163ffffffff021916908363ffffffff160217905550828160030160046101000a81548160ff0219169083151502179055507f9c9bbfc444fadb4f6ea76eeea0f2096baf957e36bf9dea2e1520dfc82e6934aa33878785604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018315151515815260200182815260200194505050505060405180910390a1505050505050565b6000828211151515613aaa57fe5b818303905092915050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6003600a3073ffffffffffffffffffffffffffffffffffffffff1631811515613b1657fe5b04029081150290604051600060405180830381858888f193505050501515613b3d57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6007600a3073ffffffffffffffffffffffffffffffffffffffff1631811515613b9e57fe5b04029081150290604051600060405180830381858888f193505050501515613bc557600080fd5b565b60008115613ca1576004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480613c9a57506009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b9050613dfd565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663aa1d98af846040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515613d3057600080fd5b5af11515613d3d57600080fd5b5050506040513d6020811015613d5257600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480613dfa57506008600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b90505b9392505050565b60008273ffffffffffffffffffffffffffffffffffffffff166006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613f5383613e70565b15613fb457600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550613fb3816001614934565b5b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b6000614062614a86565b60006101a0604051908101604052808981526020018881526020018767ffffffffffffffff1681526020014267ffffffffffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff1681526020016000151581526020018615158152602001600015158152602001600015158152509150600015158415151415614328576001600e8390806001815401808255809150509060018203906000526020600020906004020160009091929091909150600082015181600001908051906020019061415a929190614b29565b506020820151816001019080519060200190614177929190614b29565b5060408201518160020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160020160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160020160106101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160020160146101000a81548163ffffffff021916908363ffffffff16021790555060c08201518160020160186101000a81548163ffffffff021916908363ffffffff16021790555060e082015181600201601c6101000a81548163ffffffff021916908363ffffffff1602179055506101008201518160030160006101000a81548163ffffffff021916908363ffffffff1602179055506101208201518160030160046101000a81548160ff0219169083151502179055506101408201518160030160056101000a81548160ff0219169083151502179055506101608201518160030160066101000a81548160ff0219169083151502179055506101808201518160030160076101000a81548160ff021916908315150217905550505003905061456d565b6001600f83908060018154018082558091505090600182039060005260206000209060040201600090919290919091506000820151816000019080519060200190614374929190614b29565b506020820151816001019080519060200190614391929190614b29565b5060408201518160020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160020160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160020160106101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160020160146101000a81548163ffffffff021916908363ffffffff16021790555060c08201518160020160186101000a81548163ffffffff021916908363ffffffff16021790555060e082015181600201601c6101000a81548163ffffffff021916908363ffffffff1602179055506101008201518160030160006101000a81548163ffffffff021916908363ffffffff1602179055506101208201518160030160046101000a81548160ff0219169083151502179055506101408201518160030160056101000a81548160ff0219169083151502179055506101608201518160030160066101000a81548160ff0219169083151502179055506101808201518160030160076101000a81548160ff02191690831515021790555050500390506a52b7d2dcc80cd2e4000000600760008381526020019081526020016000208190555061456c60003383613ea9565b5b7fb3b0cf861f168bcdb275c69da97b2543631552ba562628aa3c7317d4a6089ef281893360405180848152602001806020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019080838360005b838110156146095780820151818401526020810190506145ee565b50505050905090810190601f1680156146365780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a1809250505095945050505050565b600080600080600080600080600080925060009150600090505b600a81101561488857600a8d67ffffffffffffffff1681151561468c57fe5b069550600a8c67ffffffffffffffff168115156146a557fe5b069450600a8d67ffffffffffffffff168115156146be57fe5b049c50600a8c67ffffffffffffffff168115156146d757fe5b049b50612710434082428e8e6040518086600019166000191681526020018581526020018481526020018381526020018281526020019550505050505060405180910390206001900467ffffffffffffffff1681151561473357fe5b0693508467ffffffffffffffff168667ffffffffffffffff1610151561475d578486039650614763565b85850396505b601a8467ffffffffffffffff16101561478157600387039650614837565b6101c78467ffffffffffffffff1610156147a057600287039650614836565b610c658467ffffffffffffffff1610156147bf57600187039650614835565b611aab8467ffffffffffffffff1610156147d857614834565b6125498467ffffffffffffffff1610156147f757600187019650614833565b6126f68467ffffffffffffffff16101561481657600287019650614832565b6103e88467ffffffffffffffff161015614831576003870196505b5b5b5b5b5b5b600c8767ffffffffffffffff16111561484f57600096505b60098767ffffffffffffffff16111561486757600996505b8667ffffffffffffffff1681600a0a0283019250808060010191505061466d565b600060024340600b428f8f6040518086600019166000191681526020018560ff167f01000000000000000000000000000000000000000000000000000000000000000281526001018481526020018381526020018281526020019550505050505060405180910390206001900467ffffffffffffffff1681151561490857fe5b0667ffffffffffffffff16111561491e57600191505b8282985098505050505050505094509492505050565b600080151582151514156149b357600e8381548110151561495157fe5b906000526020600020906004020190506008600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a600084815260200190815260200160002060009055614a56565b600f838154811015156149c257fe5b906000526020600020906004020190506009600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600b6000848152602001908152602001600020600090556006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b8060020160186101000a81549063ffffffff02191690558060030160046101000a81549060ff0219169055505050565b6101a0604051908101604052806060815260200160608152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff1681526020016000151581526020016000151581526020016000151581526020016000151581525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614b6a57805160ff1916838001178555614b98565b82800160010185558215614b98579182015b82811115614b97578251825591602001919060010190614b7c565b5b509050614ba59190614ba9565b5090565b614bcb91905b80821115614bc7576000816000905550600101614baf565b5090565b905600a165627a7a723058203ba28f220433460030c0c085caf3a4e47b356096d75eb32a6954e21b1c928d860029

Swarm Source

bzzr://3ba28f220433460030c0c085caf3a4e47b356096d75eb32a6954e21b1c928d86

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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