ETH Price: $3,846.95 (-0.69%)

Contract

0x8Bc67D00253fd60B1aFcCE88B78820413139f4C6
 

Overview

ETH Balance

0.01592 ETH

Eth Value

$61.24 (@ $3,846.95/ETH)

More Info

Private Name Tags

TokenTracker

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Safe Transfer Fr...237043952025-11-01 12:09:3534 hrs ago1761998975IN
CryptoFlowers: CF Token
0 ETH0.000008940.09
Set Approval For...236035962025-10-18 9:19:3515 days ago1760779175IN
CryptoFlowers: CF Token
0 ETH0.000004880.18
Set Approval For...235886732025-10-16 7:14:2317 days ago1760598863IN
CryptoFlowers: CF Token
0 ETH0.000005990.12741538
Set Approval For...235065362025-10-04 19:35:5929 days ago1759606559IN
CryptoFlowers: CF Token
0 ETH0.00000520.20687489
Set Approval For...235023752025-10-04 5:38:3529 days ago1759556315IN
CryptoFlowers: CF Token
0 ETH0.000005330.11335712
Set Approval For...234622962025-09-28 15:09:3535 days ago1759072175IN
CryptoFlowers: CF Token
0 ETH0.000006240.23
Set Approval For...234487292025-09-26 17:38:4737 days ago1758908327IN
CryptoFlowers: CF Token
0 ETH0.000053741.14223351
Set Approval For...234483202025-09-26 16:16:2337 days ago1758903383IN
CryptoFlowers: CF Token
0 ETH0.000104732.22596594
Safe Transfer Fr...234109492025-09-21 10:52:4742 days ago1758451967IN
CryptoFlowers: CF Token
0 ETH0.000013910.14
Set Approval For...233418572025-09-11 19:17:3552 days ago1757618255IN
CryptoFlowers: CF Token
0 ETH0.000019280.76702855
Set Approval For...233320352025-09-10 10:16:3553 days ago1757499395IN
CryptoFlowers: CF Token
0 ETH0.000008720.18544562
Set Approval For...233194962025-09-08 16:13:5955 days ago1757348039IN
CryptoFlowers: CF Token
0 ETH0.000086561.8396323
Set Approval For...233128262025-09-07 17:51:5956 days ago1757267519IN
CryptoFlowers: CF Token
0 ETH0.000005150.19
Set Approval For...233035802025-09-06 10:51:4757 days ago1757155907IN
CryptoFlowers: CF Token
0 ETH0.000005150.19
Set Approval For...232636032025-08-31 20:46:1163 days ago1756673171IN
CryptoFlowers: CF Token
0 ETH0.000010240.21768374
Safe Transfer Fr...232607052025-08-31 11:03:2363 days ago1756638203IN
CryptoFlowers: CF Token
0 ETH0.000115761.16483418
Set Approval For...232531172025-08-30 9:40:1164 days ago1756546811IN
CryptoFlowers: CF Token
0 ETH0.000015260.32439221
Set Approval For...232400842025-08-28 14:02:3566 days ago1756389755IN
CryptoFlowers: CF Token
0 ETH0.000113882.42040026
Set Approval For...232252702025-08-26 12:24:5968 days ago1756211099IN
CryptoFlowers: CF Token
0 ETH0.000014110.3
Set Approval For...232248372025-08-26 10:57:3568 days ago1756205855IN
CryptoFlowers: CF Token
0 ETH0.00000950.35
Set Approval For...232247762025-08-26 10:45:2368 days ago1756205123IN
CryptoFlowers: CF Token
0 ETH0.000015440.32816461
Set Approval For...232183242025-08-25 13:08:5969 days ago1756127339IN
CryptoFlowers: CF Token
0 ETH0.000019420.41292456
Set Approval For...232041352025-08-23 13:38:4771 days ago1755956327IN
CryptoFlowers: CF Token
0 ETH0.000037650.80033281
Set Approval For...232028082025-08-23 9:11:5971 days ago1755940319IN
CryptoFlowers: CF Token
0 ETH0.000058611.24575975
Set Approval For...231881392025-08-21 8:03:1173 days ago1755763391IN
CryptoFlowers: CF Token
0 ETH0.000103272.19491259
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
-126056962021-06-10 8:26:541606 days ago1623313614
CryptoFlowers: CF Token
0.002 ETH
-126056962021-06-10 8:26:541606 days ago1623313614
CryptoFlowers: CF Token
0.007 ETH
-124528482021-05-17 15:54:571630 days ago1621266897
CryptoFlowers: CF Token
0.0049 ETH
-123673172021-05-04 10:52:051643 days ago1620125525
CryptoFlowers: CF Token
0.002 ETH
-123536422021-05-02 8:14:241645 days ago1619943264
CryptoFlowers: CF Token
0.002 ETH
-117460092021-01-28 18:46:141739 days ago1611859574
CryptoFlowers: CF Token
0.002 ETH
-109882182020-10-04 8:12:201855 days ago1601799140
CryptoFlowers: CF Token
0.002 ETH
-109882182020-10-04 8:12:201855 days ago1601799140
CryptoFlowers: CF Token
0.083 ETH
-109876532020-10-04 6:04:061855 days ago1601791446
CryptoFlowers: CF Token
0.002 ETH
-109876532020-10-04 6:04:061855 days ago1601791446
CryptoFlowers: CF Token
0.00297 ETH
-103062662020-06-21 1:53:271960 days ago1592704407
CryptoFlowers: CF Token
0.002 ETH
-102142712020-06-06 20:17:421975 days ago1591474662
CryptoFlowers: CF Token
0.002 ETH
-102096312020-06-06 2:52:571975 days ago1591411977
CryptoFlowers: CF Token
0.002 ETH
-102096312020-06-06 2:52:571975 days ago1591411977
CryptoFlowers: CF Token
0.002 ETH
-101794162020-06-01 10:23:261980 days ago1591007006
CryptoFlowers: CF Token
0.002 ETH
-101688252020-05-30 18:44:391982 days ago1590864279
CryptoFlowers: CF Token
0.002 ETH
-101688252020-05-30 18:44:391982 days ago1590864279
CryptoFlowers: CF Token
0.00197516 ETH
-99555152020-04-27 16:12:242015 days ago1588003944
CryptoFlowers: CF Token
0.002 ETH
-99454772020-04-26 2:39:342016 days ago1587868774
CryptoFlowers: CF Token
0.002 ETH
-99330072020-04-24 4:17:142018 days ago1587701834
CryptoFlowers: CF Token
0.002 ETH
-99330072020-04-24 4:17:142018 days ago1587701834
CryptoFlowers: CF Token
0.001 ETH
-99064632020-04-20 1:43:262022 days ago1587347006
CryptoFlowers: CF Token
0.002 ETH
-98205012020-04-06 19:55:242036 days ago1586202924
CryptoFlowers: CF Token
0.002 ETH
-97481882020-03-26 16:59:402047 days ago1585241980
CryptoFlowers: CF Token
0.002 ETH
-97479292020-03-26 15:55:182047 days ago1585238118
CryptoFlowers: CF Token
0.002 ETH
View All Internal Transactions
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FlowerCore

Compiler Version
v0.4.25+commit.59dbf8f1

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
/**
 *Submitted for verification at Etherscan.io on 2018-12-05
*/

pragma solidity ^0.4.23;

library SafeMath {

    /**
    * @dev Multiplies two numbers, reverts on overflow.
    */
    function mul(uint256 _a, uint256 _b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (_a == 0) {
            return 0;
        }

        uint256 c = _a * _b;
        require(c / _a == _b);

        return c;
    }

    /**
    * @dev Integer division of two numbers truncating the quotient, reverts on division by zero.
    */
    function div(uint256 _a, uint256 _b) internal pure returns (uint256) {
        require(_b > 0); // Solidity only automatically asserts when dividing by 0
        uint256 c = _a / _b;
        // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold

        return c;
    }

    /**
    * @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend).
    */
    function sub(uint256 _a, uint256 _b) internal pure returns (uint256) {
        require(_b <= _a);
        uint256 c = _a - _b;

        return c;
    }

    /**
    * @dev Adds two numbers, reverts on overflow.
    */
    function add(uint256 _a, uint256 _b) internal pure returns (uint256) {
        uint256 c = _a + _b;
        require(c >= _a);

        return c;
    }
}

library AddressUtils {

    /**
    * Returns whether the target address is a contract
    * @dev This function will return false if invoked during the constructor of a contract,
    *  as the code is not actually created until after the constructor finishes.
    * @param addr address to check
    * @return whether the target address is a contract
    */
    function isContract(address addr) internal view returns (bool) {
        uint256 size;
        // XXX Currently there is no better way to check if there is a contract in an address
        // than to check the size of the code at that address.
        // See https://ethereum.stackexchange.com/a/14016/36603
        // for more details about how this works.
        // TODO Check this again before the Serenity release, because all addresses will be
        // contracts then.
        // solium-disable-next-line security/no-inline-assembly
        assembly { size := extcodesize(addr) }
        return size > 0;
    }

}

contract Ownable {
    address public owner;
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor() public {
        owner = msg.sender;
    }

    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }

    function transferOwnership(address newOwner) public onlyOwner {
        require(newOwner != address(0));
        owner = newOwner;
        emit OwnershipTransferred(owner, newOwner);
    }
}

contract ERC721Basic {
    event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
    event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

    function balanceOf(address _owner) public view returns (uint256 _balance);
    function ownerOf(uint256 _tokenId) public view returns (address _owner);
    function exists(uint256 _tokenId) public view returns (bool _exists);

    function approve(address _to, uint256 _tokenId) public;
    function getApproved(uint256 _tokenId) public view returns (address _operator);

    function setApprovalForAll(address _operator, bool _approved) public;
    function isApprovedForAll(address _owner, address _operator) public view returns (bool);

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

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

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

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

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

/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721BasicToken is ERC721Basic {
    using SafeMath for uint256;
    using AddressUtils for address;

    // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    // which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`
    bytes4 public constant ERC721_RECEIVED = 0x150b7a02;

    // Mapping from token ID to owner
    mapping (uint256 => address) internal tokenOwner;

    // Mapping from token ID to approved address
    mapping (uint256 => address) internal tokenApprovals;

    // Mapping from owner to number of owned token
    mapping (address => uint256) internal ownedTokensCount;

    // Mapping from owner to operator approvals
    mapping (address => mapping (address => bool)) internal operatorApprovals;

    /**
    * @dev Guarantees msg.sender is owner of the given token
    * @param _tokenId uint256 ID of the token to validate its ownership belongs to msg.sender
    */
    modifier onlyOwnerOf(uint256 _tokenId) {
        require (ownerOf(_tokenId) == msg.sender);
        _;
    }

    /**
    * @dev Checks msg.sender can transfer a token, by being owner, approved, or operator
    * @param _tokenId uint256 ID of the token to validate
    */
    modifier canTransfer(uint256 _tokenId) {
        require (isApprovedOrOwner(msg.sender, _tokenId));
        _;
    }

    /**
    * @dev Gets the balance of the specified address
    * @param _owner address to query the balance of
    * @return uint256 representing the amount owned by the passed address
    */
    function balanceOf(address _owner) public view returns (uint256) {
        require (_owner != address(0));
        return ownedTokensCount[_owner];
    }

    /**
    * @dev Gets the owner of the specified token ID
    * @param _tokenId uint256 ID of the token to query the owner of
    * @return owner address currently marked as the owner of the given token ID
    */
    function ownerOf(uint256 _tokenId) public view returns (address) {
        address owner = tokenOwner[_tokenId];
        require(owner != address(0));
        return owner;
    }

    function isOwnerOf(address _owner, uint256 _tokenId) public view returns (bool) {
        address owner = ownerOf(_tokenId);
        return owner == _owner;
    }

    /**
    * @dev Returns whether the specified token exists
    * @param _tokenId uint256 ID of the token to query the existence of
    * @return whether the token exists
    */
    function exists(uint256 _tokenId) public view returns (bool) {
        address owner = tokenOwner[_tokenId];
        return owner != address(0);
    }

    /**
    * @dev Approves another address to transfer the given token ID
    * @dev The zero address indicates there is no approved address.
    * @dev There can only be one approved address per token at a given time.
    * @dev Can only be called by the token owner or an approved operator.
    * @param _to address to be approved for the given token ID
    * @param _tokenId uint256 ID of the token to be approved
    */
    function approve(address _to, uint256 _tokenId) public {
        address owner = ownerOf(_tokenId);
        require (_to != owner);
        require (msg.sender == owner || isApprovedForAll(owner, msg.sender));

        tokenApprovals[_tokenId] = _to;
        emit Approval(owner, _to, _tokenId);
    }

    /**
    * @dev Gets the approved address for a token ID, or zero if no address set
    * @param _tokenId uint256 ID of the token to query the approval of
    * @return address currently approved for the given token ID
    */
    function getApproved(uint256 _tokenId) public view returns (address) {
        return tokenApprovals[_tokenId];
    }

    /**
    * @dev Sets or unsets the approval of a given operator
    * @dev An operator is allowed to transfer all tokens of the sender on their behalf
    * @param _to operator address to set the approval
    * @param _approved representing the status of the approval to be set
    */
    function setApprovalForAll(address _to, bool _approved) public {
        require (_to != msg.sender);
        operatorApprovals[msg.sender][_to] = _approved;
        emit ApprovalForAll(msg.sender, _to, _approved);
    }

    /**
    * @dev Tells whether an operator is approved by a given owner
    * @param _owner owner address which you want to query the approval of
    * @param _operator operator address which you want to query the approval of
    * @return bool whether the given operator is approved by the given owner
    */
    function isApprovedForAll(address _owner, address _operator) public view returns (bool) {
        return operatorApprovals[_owner][_operator];
    }

    /**
    * @dev Transfers the ownership of a given token ID to another address
    * @dev Usage of this method is discouraged, use `safeTransferFrom` whenever possible
    * @dev Requires the msg sender to be the owner, approved, or operator
    * @param _from current owner of the token
    * @param _to address to receive the ownership of the given token ID
    * @param _tokenId uint256 ID of the token to be transferred
    */
    function transferFrom(address _from, address _to, uint256 _tokenId) public canTransfer(_tokenId) {
        require (_from != address(0));
        require (_to != address(0));

        clearApproval(_from, _tokenId);
        removeTokenFrom(_from, _tokenId);
        addTokenTo(_to, _tokenId);

        emit Transfer(_from, _to, _tokenId);
    }

    /**
    * @dev Safely transfers the ownership of a given token ID to another address
    * @dev If the target address is a contract, it must implement `onERC721Received`,
    *  which is called upon a safe transfer, and return the magic value
    *  `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
    *  the transfer is reverted.
    * @dev Requires the msg sender to be the owner, approved, or operator
    * @param _from current owner of the token
    * @param _to address to receive the ownership of the given token ID
    * @param _tokenId uint256 ID of the token to be transferred
    */
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) public canTransfer(_tokenId) {
        // solium-disable-next-line arg-overflow
        safeTransferFrom(_from, _to, _tokenId, "");
    }

    /**
    * @dev Safely transfers the ownership of a given token ID to another address
    * @dev If the target address is a contract, it must implement `onERC721Received`,
    *  which is called upon a safe transfer, and return the magic value
    *  `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
    *  the transfer is reverted.
    * @dev Requires the msg sender to be the owner, approved, or operator
    * @param _from current owner of the token
    * @param _to address to receive the ownership of the given token ID
    * @param _tokenId uint256 ID of the token to be transferred
    * @param _data bytes data to send along with a safe transfer check
    */
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes _data) public canTransfer(_tokenId) {
        transferFrom(_from, _to, _tokenId);
        // solium-disable-next-line arg-overflow
        require (checkAndCallSafeTransfer(_from, _to, _tokenId, _data));
    }

    /**
    * @dev Returns whether the given spender can transfer a given token ID
    * @param _spender address of the spender to query
    * @param _tokenId uint256 ID of the token to be transferred
    * @return bool whether the msg.sender is approved for the given token ID,
    *  is an operator of the owner, or is the owner of the token
    */
    function isApprovedOrOwner(address _spender, uint256 _tokenId) internal view returns (bool) {
        address owner = ownerOf(_tokenId);
        // Disable solium check because of
        // https://github.com/duaraghav8/Solium/issues/175
        // solium-disable-next-line operator-whitespace
        return (_spender == owner || getApproved(_tokenId) == _spender || isApprovedForAll(owner, _spender));
    }

    /**
    * @dev Internal function to mint a new token
    * @dev Reverts if the given token ID already exists
    * @param _to The address that will own the minted token
    * @param _tokenId uint256 ID of the token to be minted by the msg.sender
    */
    function _mint(address _to, uint256 _tokenId) internal {
        //require (_to != address(0));
        addTokenTo(_to, _tokenId);
        emit Transfer(address(0), _to, _tokenId);
    }

    /**
    * @dev Internal function to burn a specific token
    * @dev Reverts if the token does not exist
    * @param _tokenId uint256 ID of the token being burned by the msg.sender
    */
    function _burn(address _owner, uint256 _tokenId) internal {
        clearApproval(_owner, _tokenId);
        removeTokenFrom(_owner, _tokenId);
        emit Transfer(_owner, address(0), _tokenId);
    }

    /**
    * @dev Internal function to clear current approval of a given token ID
    * @dev Reverts if the given address is not indeed the owner of the token
    * @param _owner owner of the token
    * @param _tokenId uint256 ID of the token to be transferred
    */
    function clearApproval(address _owner, uint256 _tokenId) internal {
        require (ownerOf(_tokenId) == _owner);
        if (tokenApprovals[_tokenId] != address(0)) {
            tokenApprovals[_tokenId] = address(0);
        }
    }

    /**
    * @dev Internal function to add a token ID to the list of a given address
    * @param _to address representing the new owner of the given token ID
    * @param _tokenId uint256 ID of the token to be added to the tokens list of the given address
    */
    function addTokenTo(address _to, uint256 _tokenId) internal {
        //        require (tokenOwner[_tokenId] == address(0));
        tokenOwner[_tokenId] = _to;
        ownedTokensCount[_to] = ownedTokensCount[_to].add(1);
    }

    /**
    * @dev Internal function to remove a token ID from the list of a given address
    * @param _from address representing the previous owner of the given token ID
    * @param _tokenId uint256 ID of the token to be removed from the tokens list of the given address
    */
    function removeTokenFrom(address _from, uint256 _tokenId) internal {
        require (ownerOf(_tokenId) == _from);
        ownedTokensCount[_from] = ownedTokensCount[_from].sub(1);
        tokenOwner[_tokenId] = address(0);
    }

    /**
    * @dev Internal function to invoke `onERC721Received` on a target address
    * @dev The call is not executed if the target address is not a contract
    * @param _from address representing the previous owner of the given token ID
    * @param _to target address that will receive the tokens
    * @param _tokenId uint256 ID of the token to be transferred
    * @param _data bytes optional data to send along with the call
    * @return whether the call correctly returned the expected magic value
    */
    function checkAndCallSafeTransfer(address _from, address _to, uint256 _tokenId, bytes _data) internal returns (bool) {
        if (!_to.isContract()) {
            return true;
        }
        bytes4 retval = ERC721Receiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data);
        return (retval == ERC721_RECEIVED);
    }
}

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 *  from ERC721 asset contracts.
 */
contract ERC721Receiver {
    /**
    * @dev Magic value to be returned upon successful reception of an NFT
    *  Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`,
    *  which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`
    */
    bytes4 public constant ERC721_RECEIVED = 0x150b7a02;

    /**
    * @notice Handle the receipt of an NFT
    * @dev The ERC721 smart contract calls this function on the recipient
    *  after a `safetransfer`. This function MAY throw to revert and reject the
    *  transfer. This function MUST use 50,000 gas or less. Return of other
    *  than the magic value MUST result in the transaction being reverted.
    *  Note: the contract address is always the message sender.
    * @param _from The sending address
    * @param _tokenId The NFT identifier which is being transfered
    * @param _data Additional data with no specified format
    * @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    */
    function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes _data) public returns(bytes4);
}

contract ERC721Holder is ERC721Receiver {
    function onERC721Received(address, address, uint256, bytes) public returns(bytes4) {
        return ERC721_RECEIVED;
    }
}

/**
 * @title Full ERC721 Token
 * This implementation includes all the required and some optional functionality of the ERC721 standard
 * Moreover, it includes approve all functionality using operator terminology
 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Token is ERC721, ERC721BasicToken {

    // Token name
    string internal name_ = "CryptoFlowers";

    // Token symbol
    string internal symbol_ = "CF";

    // Mapping from owner to list of owned token IDs
    mapping(address => uint256[]) internal ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) internal ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] internal allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) internal allTokensIndex;

    function uint2str(uint i) internal pure returns (string){
        if (i == 0) return "0";
        uint j = i;
        uint length;
        while (j != 0){
            length++;
            j /= 10;
        }
        bytes memory bstr = new bytes(length);
        uint k = length - 1;
        while (i != 0){
            bstr[k--] = byte(48 + i % 10);
            i /= 10;
        }
        return string(bstr);
    }

    function strConcat(string _a, string _b) internal pure returns (string) {
        bytes memory _ba = bytes(_a);
        bytes memory _bb = bytes(_b);
        string memory ab = new string(_ba.length + _bb.length);
        bytes memory bab = bytes(ab);
        uint k = 0;
        for (uint i = 0; i < _ba.length; i++) bab[k++] = _ba[i];
        for (i = 0; i < _bb.length; i++) bab[k++] = _bb[i];

        return string(bab);
    }

    /**
    * @dev Returns an URI for a given token ID
    * @dev Throws if the token ID does not exist. May return an empty string.
    * @notice The user/developper needs to add the tokenID, in the end of URL, to
    * use the URI and get all details. Ex. www.<apiURL>.com/token/<tokenID>
    * @param _tokenId uint256 ID of the token to query
    */
    function tokenURI(uint256 _tokenId) public view returns (string) {
        require(exists(_tokenId));
        string memory infoUrl;
        infoUrl = strConcat('https://cryptoflowers.io/v/', uint2str(_tokenId));
        return infoUrl;
    }

    /**
    * @dev Gets the token ID at a given index of the tokens list of the requested owner
    * @param _owner address owning the tokens list to be accessed
    * @param _index uint256 representing the index to be accessed of the requested tokens list
    * @return uint256 token ID at the given index of the tokens list owned by the requested address
    */
    function tokenOfOwnerByIndex(address _owner, uint256 _index) public view returns (uint256) {
        require (_index < balanceOf(_owner));
        return ownedTokens[_owner][_index];
    }

    /**
    * @dev Gets the total amount of tokens stored by the contract
    * @return uint256 representing the total amount of tokens
    */
    function totalSupply() public view returns (uint256) {
        return allTokens.length - 1;
    }

    /**
    * @dev Gets the token ID at a given index of all the tokens in this contract
    * @dev Reverts if the index is greater or equal to the total number of tokens
    * @param _index uint256 representing the index to be accessed of the tokens list
    * @return uint256 token ID at the given index of the tokens list
    */
    function tokenByIndex(uint256 _index) public view returns (uint256) {
        require (_index <= totalSupply());
        return allTokens[_index];
    }


    /**
    * @dev Internal function to add a token ID to the list of a given address
    * @param _to address representing the new owner of the given token ID
    * @param _tokenId uint256 ID of the token to be added to the tokens list of the given address
    */
    function addTokenTo(address _to, uint256 _tokenId) internal {
        super.addTokenTo(_to, _tokenId);
        uint256 length = ownedTokens[_to].length;
        ownedTokens[_to].push(_tokenId);
        ownedTokensIndex[_tokenId] = length;
    }

    /**
    * @dev Internal function to remove a token ID from the list of a given address
    * @param _from address representing the previous owner of the given token ID
    * @param _tokenId uint256 ID of the token to be removed from the tokens list of the given address
    */
    function removeTokenFrom(address _from, uint256 _tokenId) internal {
        super.removeTokenFrom(_from, _tokenId);

        // To prevent a gap in the array, we store the last token in the index of the token to delete, and
        // then delete the last slot.
        uint256 tokenIndex = ownedTokensIndex[_tokenId];
        uint256 lastTokenIndex = ownedTokens[_from].length.sub(1);
        uint256 lastToken = ownedTokens[_from][lastTokenIndex];

        ownedTokens[_from][tokenIndex] = lastToken;
        // This also deletes the contents at the last position of the array
        ownedTokens[_from].length--;

        // Note that this will handle single-element arrays. In that case, both tokenIndex and lastTokenIndex are going to
        // be zero. Then we can make sure that we will remove _tokenId from the ownedTokens list since we are first swapping
        // the lastToken to the first position, and then dropping the element placed in the last position of the list

        ownedTokensIndex[_tokenId] = 0;
        ownedTokensIndex[lastToken] = tokenIndex;
    }

    /**
    * @dev Gets the token name
    * @return string representing the token name
    */
    function name() public view returns (string) {
        return name_;
    }

    /**
    * @dev Gets the token symbol
    * @return string representing the token symbol
    */
    function symbol() public view returns (string) {
        return symbol_;
    }

    /**
    * @dev Internal function to mint a new token
    * @dev Reverts if the given token ID already exists
    * @param _to address the beneficiary that will own the minted token
    * @param _tokenId uint256 ID of the token to be minted by the msg.sender
    */
    function _mint(address _to, uint256 _tokenId) internal {
        super._mint(_to, _tokenId);

        allTokensIndex[_tokenId] = allTokens.length;
        allTokens.push(_tokenId);
    }

    /**
    * @dev Internal function to burn a specific token
    * @dev Reverts if the token does not exist
    * @param _owner owner of the token to burn
    * @param _tokenId uint256 ID of the token being burned by the msg.sender
    */
    function _burn(address _owner, uint256 _tokenId) internal {
        super._burn(_owner, _tokenId);

        // Reorg all tokens array
        uint256 tokenIndex = allTokensIndex[_tokenId];
        uint256 lastTokenIndex = allTokens.length.sub(1);
        uint256 lastToken = allTokens[lastTokenIndex];

        allTokens[tokenIndex] = lastToken;
        allTokens[lastTokenIndex] = 0;

        allTokens.length--;
        allTokensIndex[_tokenId] = 0;
        allTokensIndex[lastToken] = tokenIndex;
    }

    bytes4 constant InterfaceSignature_ERC165 = 0x01ffc9a7;
    /*
    bytes4(keccak256('supportsInterface(bytes4)'));
    */

    bytes4 constant InterfaceSignature_ERC721Enumerable = 0x780e9d63;
    /*
    bytes4(keccak256('totalSupply()')) ^
    bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) ^
    bytes4(keccak256('tokenByIndex(uint256)'));
    */

    bytes4 constant InterfaceSignature_ERC721Metadata = 0x5b5e139f;
    /*
    bytes4(keccak256('name()')) ^
    bytes4(keccak256('symbol()')) ^
    bytes4(keccak256('tokenURI(uint256)'));
    */

    bytes4 constant InterfaceSignature_ERC721 = 0x80ac58cd;
    /*
    bytes4(keccak256('balanceOf(address)')) ^
    bytes4(keccak256('ownerOf(uint256)')) ^
    bytes4(keccak256('approve(address,uint256)')) ^
    bytes4(keccak256('getApproved(uint256)')) ^
    bytes4(keccak256('setApprovalForAll(address,bool)')) ^
    bytes4(keccak256('isApprovedForAll(address,address)')) ^
    bytes4(keccak256('transferFrom(address,address,uint256)')) ^
    bytes4(keccak256('safeTransferFrom(address,address,uint256)')) ^
    bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)'));
    */

    bytes4 public constant InterfaceSignature_ERC721Optional =- 0x4f558e79;
    /*
    bytes4(keccak256('exists(uint256)'));
    */

    /**
    * @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).
    * @dev Returns true for any standardized interfaces implemented by this contract.
    * @param _interfaceID bytes4 the interface to check for
    * @return true for any standardized interfaces implemented by this contract.
    */
    function supportsInterface(bytes4 _interfaceID) external pure returns (bool)
    {
        return ((_interfaceID == InterfaceSignature_ERC165)
        || (_interfaceID == InterfaceSignature_ERC721)
        || (_interfaceID == InterfaceSignature_ERC721Enumerable)
        || (_interfaceID == InterfaceSignature_ERC721Metadata));
    }

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

}

contract GenomeInterface {
    function isGenome() public pure returns (bool);
    function mixGenes(uint256 genes1, uint256 genes2) public returns (uint256);
}

contract FlowerAdminAccess {
    address public rootAddress;
    address public adminAddress;

    event ContractUpgrade(address newContract);

    address public gen0SellerAddress;
    address public giftHolderAddress;

    bool public stopped = false;

    modifier onlyRoot() {
        require(msg.sender == rootAddress);
        _;
    }

    modifier onlyAdmin()  {
        require(msg.sender == adminAddress);
        _;
    }

    modifier onlyAdministrator() {
        require(msg.sender == rootAddress || msg.sender == adminAddress);
        _;
    }

    function setRoot(address _newRoot) external onlyAdministrator {
        require(_newRoot != address(0));
        rootAddress = _newRoot;
    }

    function setAdmin(address _newAdmin) external onlyRoot {
        require(_newAdmin != address(0));
        adminAddress = _newAdmin;
    }

    modifier whenNotStopped() {
        require(!stopped);
        _;
    }

    modifier whenStopped {
        require(stopped);
        _;
    }

    function setStop() public onlyAdministrator whenNotStopped {
        stopped = true;
    }

    function setStart() public onlyAdministrator whenStopped {
        stopped = false;
    }
}

contract FlowerBase is ERC721Token {

    struct Flower {
        uint256 genes;
        uint64 birthTime;
        uint64 cooldownEndBlock;
        uint32 matronId;
        uint32 sireId;
        uint16 cooldownIndex;
        uint16 generation;
    }

    Flower[] flowers;

    mapping (uint256 => uint256) genomeFlowerIds;

    // Сooldown duration
    uint32[14] public cooldowns = [
    uint32(1 minutes),
    uint32(2 minutes),
    uint32(5 minutes),
    uint32(10 minutes),
    uint32(30 minutes),
    uint32(1 hours),
    uint32(2 hours),
    uint32(4 hours),
    uint32(8 hours),
    uint32(16 hours),
    uint32(1 days),
    uint32(2 days),
    uint32(4 days),
    uint32(7 days)
    ];

    event Birth(address owner, uint256 flowerId, uint256 matronId, uint256 sireId, uint256 genes);
    event Transfer(address from, address to, uint256 tokenId);
    event Money(address from, string actionType, uint256 sum, uint256 cut, uint256 tokenId, uint256 blockNumber);

    function _createFlower(uint256 _matronId, uint256 _sireId, uint256 _generation, uint256 _genes, address _owner) internal returns (uint) {
        require(_matronId == uint256(uint32(_matronId)));
        require(_sireId == uint256(uint32(_sireId)));
        require(_generation == uint256(uint16(_generation)));
        require(checkUnique(_genes));

        uint16 cooldownIndex = uint16(_generation / 2);
        if (cooldownIndex > 13) {
            cooldownIndex = 13;
        }

        Flower memory _flower = Flower({
            genes: _genes,
            birthTime: uint64(now),
            cooldownEndBlock: 0,
            matronId: uint32(_matronId),
            sireId: uint32(_sireId),
            cooldownIndex: cooldownIndex,
            generation: uint16(_generation)
            });

        uint256 newFlowerId = flowers.push(_flower) - 1;

        require(newFlowerId == uint256(uint32(newFlowerId)));

        genomeFlowerIds[_genes] = newFlowerId;

        emit Birth(_owner, newFlowerId, uint256(_flower.matronId), uint256(_flower.sireId), _flower.genes);

        _mint(_owner, newFlowerId);

        return newFlowerId;
    }

    function checkUnique(uint256 _genome) public view returns (bool) {
        uint256 _flowerId = uint256(genomeFlowerIds[_genome]);
        return !(_flowerId > 0);
    }
}

contract FlowerOwnership is FlowerBase, FlowerAdminAccess {
    SaleClockAuction public saleAuction;
    BreedingClockAuction public breedingAuction;

    uint256 public secondsPerBlock = 15;

    function setSecondsPerBlock(uint256 secs) external onlyAdministrator {
        require(secs < cooldowns[0]);
        secondsPerBlock = secs;
    }
}

contract ClockAuctionBase {

    struct Auction {
        address seller;
        uint128 startingPrice;
        uint128 endingPrice;
        uint64 duration;
        uint64 startedAt;
    }

    ERC721Token public nonFungibleContract;

    uint256 public ownerCut;

    mapping (uint256 => Auction) tokenIdToAuction;

    event AuctionCreated(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration);
    event AuctionSuccessful(uint256 tokenId, uint256 totalPrice, address winner);
    event AuctionCancelled(uint256 tokenId);
    event Money(address from, string actionType, uint256 sum, uint256 cut, uint256 tokenId, uint256 blockNumber);

    function isOwnerOf(address _claimant, uint256 _tokenId) internal view returns (bool) {
        return (nonFungibleContract.ownerOf(_tokenId) == _claimant);
    }

    function _escrow(address _owner, uint256 _tokenId) internal {
        nonFungibleContract.transferFrom(_owner, this, _tokenId);
    }

    function _transfer(address _receiver, uint256 _tokenId) internal {
        nonFungibleContract.transferFrom(this, _receiver, _tokenId);
    }

    function _addAuction(uint256 _tokenId, Auction _auction) internal {
        require(_auction.duration >= 1 minutes);

        tokenIdToAuction[_tokenId] = _auction;

        emit AuctionCreated(uint256(_tokenId), uint256(_auction.startingPrice), uint256(_auction.endingPrice), uint256(_auction.duration));
    }

    function _cancelAuction(uint256 _tokenId, address _seller) internal {
        _removeAuction(_tokenId);
        _transfer(_seller, _tokenId);
        emit AuctionCancelled(_tokenId);
    }

    function _bid(uint256 _tokenId, uint256 _bidAmount, address _sender) internal returns (uint256) {
        Auction storage auction = tokenIdToAuction[_tokenId];

        require(_isOnAuction(auction));

        uint256 price = _currentPrice(auction);
        require(_bidAmount >= price);

        address seller = auction.seller;

        _removeAuction(_tokenId);

        if (price > 0) {
            uint256 auctioneerCut = _computeCut(price);
            uint256 sellerProceeds = price - auctioneerCut;
            seller.transfer(sellerProceeds);

            emit Money(_sender, "AuctionSuccessful", price, auctioneerCut, _tokenId, block.number);
        }

        uint256 bidExcess = _bidAmount - price;

        _sender.transfer(bidExcess);

        emit AuctionSuccessful(_tokenId, price, _sender);

        return price;
    }

    function _removeAuction(uint256 _tokenId) internal {
        delete tokenIdToAuction[_tokenId];
    }

    function _isOnAuction(Auction storage _auction) internal view returns (bool) {
        return (_auction.startedAt > 0 && _auction.startedAt < now);
    }

    function _currentPrice(Auction storage _auction) internal view returns (uint256) {
        uint256 secondsPassed = 0;

        if (now > _auction.startedAt) {
            secondsPassed = now - _auction.startedAt;
        }

        return _computeCurrentPrice(_auction.startingPrice, _auction.endingPrice, _auction.duration, secondsPassed);
    }

    function _computeCurrentPrice(uint256 _startingPrice, uint256 _endingPrice, uint256 _duration, uint256 _secondsPassed) internal pure returns (uint256) {
        if (_secondsPassed >= _duration) {
            return _endingPrice;
        } else {
            int256 totalPriceChange = int256(_endingPrice) - int256(_startingPrice);

            int256 currentPriceChange = totalPriceChange * int256(_secondsPassed) / int256(_duration);

            int256 currentPrice = int256(_startingPrice) + currentPriceChange;

            return uint256(currentPrice);
        }
    }

    function _computeCut(uint256 _price) internal view returns (uint256) {
        return uint256(_price * ownerCut / 10000);
    }
}

contract Pausable is Ownable {
    event Pause();
    event Unpause();

    bool public paused = false;

    modifier whenNotPaused() {
        require(!paused);
        _;
    }

    modifier whenPaused {
        require(paused);
        _;
    }

    function pause() public onlyOwner whenNotPaused returns (bool) {
        paused = true;
        emit Pause();
        return true;
    }

    function unpause() public onlyOwner whenPaused returns (bool) {
        paused = false;
        emit Unpause();
        return true;
    }
}

contract ClockAuction is Pausable, ClockAuctionBase {
    bytes4 constant InterfaceSignature_ERC721 = bytes4(0x80ac58cd);
    constructor(address _nftAddress, uint256 _cut) public {
        require(_cut <= 10000);
        ownerCut = _cut;

        ERC721Token candidateContract = ERC721Token(_nftAddress);
        require(candidateContract.supportsInterface(InterfaceSignature_ERC721));
        nonFungibleContract = candidateContract;
    }

    function withdrawBalance() external {
        address nftAddress = address(nonFungibleContract);
        require(msg.sender == owner || msg.sender == nftAddress);
        owner.transfer(address(this).balance);
    }

    function createAuction(uint256 _tokenId, uint256 _startingPrice, uint256 _endingPrice, uint256 _duration, address _seller, uint64 _startAt) external whenNotPaused {
        require(_startingPrice == uint256(uint128(_startingPrice)));
        require(_endingPrice == uint256(uint128(_endingPrice)));
        require(_duration == uint256(uint64(_duration)));
        require(isOwnerOf(msg.sender, _tokenId));
        _escrow(msg.sender, _tokenId);
        uint64 startAt = _startAt;
        if (_startAt == 0) {
            startAt = uint64(now);
        }
        Auction memory auction = Auction(
            _seller,
            uint128(_startingPrice),
            uint128(_endingPrice),
            uint64(_duration),
            uint64(startAt)
        );
        _addAuction(_tokenId, auction);
    }

    function bid(uint256 _tokenId, address _sender) external payable whenNotPaused {
        _bid(_tokenId, msg.value, _sender);
        _transfer(_sender, _tokenId);
    }

    function cancelAuction(uint256 _tokenId) external {
        Auction storage auction = tokenIdToAuction[_tokenId];
        require(_isOnAuction(auction));
        address seller = auction.seller;
        require(msg.sender == seller);
        _cancelAuction(_tokenId, seller);
    }

    function cancelAuctionByAdmin(uint256 _tokenId) onlyOwner external {
        Auction storage auction = tokenIdToAuction[_tokenId];
        require(_isOnAuction(auction));
        _cancelAuction(_tokenId, auction.seller);
    }

    function getAuction(uint256 _tokenId) external view returns (address seller, uint256 startingPrice, uint256 endingPrice, uint256 duration, uint256 startedAt) {
        Auction storage auction = tokenIdToAuction[_tokenId];
        require(_isOnAuction(auction));
        return (auction.seller, auction.startingPrice, auction.endingPrice, auction.duration, auction.startedAt);
    }

    function getCurrentPrice(uint256 _tokenId) external view returns (uint256){
        Auction storage auction = tokenIdToAuction[_tokenId];
        require(_isOnAuction(auction));
        return _currentPrice(auction);
    }

    // TMP
    function getContractBalance() onlyOwner external view returns (uint256) {
        return address(this).balance;
    }
}

contract BreedingClockAuction is ClockAuction {

    bool public isBreedingClockAuction = true;

    constructor(address _nftAddr, uint256 _cut) public ClockAuction(_nftAddr, _cut) {}

    function bid(uint256 _tokenId, address _sender) external payable {
        require(msg.sender == address(nonFungibleContract));
        address seller = tokenIdToAuction[_tokenId].seller;
        _bid(_tokenId, msg.value, _sender);
        _transfer(seller, _tokenId);
    }

    function getCurrentPrice(uint256 _tokenId) external view returns (uint256) {
        Auction storage auction = tokenIdToAuction[_tokenId];
        require(_isOnAuction(auction));
        return _currentPrice(auction);
    }

    function createAuction(uint256 _tokenId, uint256 _startingPrice, uint256 _endingPrice, uint256 _duration, address _seller, uint64 _startAt) external {
        require(_startingPrice == uint256(uint128(_startingPrice)));
        require(_endingPrice == uint256(uint128(_endingPrice)));
        require(_duration == uint256(uint64(_duration)));

        require(msg.sender == address(nonFungibleContract));
        _escrow(_seller, _tokenId);
        uint64 startAt = _startAt;
        if (_startAt == 0) {
            startAt = uint64(now);
        }
        Auction memory auction = Auction(_seller, uint128(_startingPrice), uint128(_endingPrice), uint64(_duration), uint64(startAt));
        _addAuction(_tokenId, auction);
    }
}





contract SaleClockAuction is ClockAuction {

    bool public isSaleClockAuction = true;

    uint256 public gen0SaleCount;
    uint256[5] public lastGen0SalePrices;

    constructor(address _nftAddr, uint256 _cut) public ClockAuction(_nftAddr, _cut) {}

    address public gen0SellerAddress;
    function setGen0SellerAddress(address _newAddress) external {
        require(msg.sender == address(nonFungibleContract));
        gen0SellerAddress = _newAddress;
    }

    function createAuction(uint256 _tokenId, uint256 _startingPrice, uint256 _endingPrice, uint256 _duration, address _seller, uint64 _startAt) external {
        require(_startingPrice == uint256(uint128(_startingPrice)));
        require(_endingPrice == uint256(uint128(_endingPrice)));
        require(_duration == uint256(uint64(_duration)));

        require(msg.sender == address(nonFungibleContract));
        _escrow(_seller, _tokenId);
        uint64 startAt = _startAt;
        if (_startAt == 0) {
            startAt = uint64(now);
        }
        Auction memory auction = Auction(_seller, uint128(_startingPrice), uint128(_endingPrice), uint64(_duration), uint64(startAt));
        _addAuction(_tokenId, auction);
    }

    function bid(uint256 _tokenId) external payable {
        // _bid verifies token ID size
        address seller = tokenIdToAuction[_tokenId].seller;
        uint256 price = _bid(_tokenId, msg.value, msg.sender);
        _transfer(msg.sender, _tokenId);

        // If not a gen0 auction, exit
        if (seller == address(gen0SellerAddress)) {
            // Track gen0 sale prices
            lastGen0SalePrices[gen0SaleCount % 5] = price;
            gen0SaleCount++;
        }
    }

    function bidGift(uint256 _tokenId, address _to) external payable {
        // _bid verifies token ID size
        address seller = tokenIdToAuction[_tokenId].seller;
        uint256 price = _bid(_tokenId, msg.value, msg.sender);
        _transfer(_to, _tokenId);

        // If not a gen0 auction, exit
        if (seller == address(gen0SellerAddress)) {
            // Track gen0 sale prices
            lastGen0SalePrices[gen0SaleCount % 5] = price;
            gen0SaleCount++;
        }
    }

    function averageGen0SalePrice() external view returns (uint256) {
        uint256 sum = 0;
        for (uint256 i = 0; i < 5; i++) {
            sum += lastGen0SalePrices[i];
        }
        return sum / 5;
    }

    function computeCut(uint256 _price) public view returns (uint256) {
        return _computeCut(_price);
    }

    function getSeller(uint256 _tokenId) public view returns (address) {
        return address(tokenIdToAuction[_tokenId].seller);
    }
}

// Flowers crossing
contract FlowerBreeding is FlowerOwnership {

    // Fee for breeding
    uint256 public autoBirthFee = 2 finney;
    uint256 public giftFee = 2 finney;

    GenomeInterface public geneScience;

    // Set Genome contract address
    function setGenomeContractAddress(address _address) external onlyAdministrator {
        geneScience = GenomeInterface(_address);
    }

    function _isReadyToAction(Flower _flower) internal view returns (bool) {
        return _flower.cooldownEndBlock <= uint64(block.number);
    }

    function isReadyToAction(uint256 _flowerId) public view returns (bool) {
        require(_flowerId > 0);
        Flower storage flower = flowers[_flowerId];
        return _isReadyToAction(flower);
    }

    function _setCooldown(Flower storage _flower) internal {
        _flower.cooldownEndBlock = uint64((cooldowns[_flower.cooldownIndex]/secondsPerBlock) + block.number);

        if (_flower.cooldownIndex < 13) {
            _flower.cooldownIndex += 1;
        }
    }

    function setAutoBirthFee(uint256 val) external onlyAdministrator {
        autoBirthFee = val;
    }

    function setGiftFee(uint256 _fee) external onlyAdministrator {
        giftFee = _fee;
    }

    // Check if a given sire and matron are a valid crossing pair
    function _isValidPair(Flower storage _matron, uint256 _matronId, Flower storage _sire, uint256 _sireId) private view returns(bool) {
        if (_matronId == _sireId) {
            return false;
        }

        // Generation zero can crossing
        if (_sire.matronId == 0 || _matron.matronId == 0) {
            return true;
        }

        // Do not crossing with it parrents
        if (_matron.matronId == _sireId || _matron.sireId == _sireId) {
            return false;
        }
        if (_sire.matronId == _matronId || _sire.sireId == _matronId) {
            return false;
        }

        // Can't crossing with brothers and sisters
        if (_sire.matronId == _matron.matronId || _sire.matronId == _matron.sireId) {
            return false;
        }
        if (_sire.sireId == _matron.matronId || _sire.sireId == _matron.sireId) {
            return false;
        }

        return true;
    }

    function canBreedWith(uint256 _matronId, uint256 _sireId) external view returns (bool) {
        return _canBreedWith(_matronId, _sireId);
    }

    function _canBreedWith(uint256 _matronId, uint256 _sireId) internal view returns (bool) {
        require(_matronId > 0);
        require(_sireId > 0);
        Flower storage matron = flowers[_matronId];
        Flower storage sire = flowers[_sireId];
        return _isValidPair(matron, _matronId, sire, _sireId);
    }

    function _born(uint256 _matronId, uint256 _sireId) internal {
        Flower storage sire = flowers[_sireId];
        Flower storage matron = flowers[_matronId];

        uint16 parentGen = matron.generation;
        if (sire.generation > matron.generation) {
            parentGen = sire.generation;
        }

        uint256 childGenes = geneScience.mixGenes(matron.genes, sire.genes);
        address owner = ownerOf(_matronId);
        uint256 flowerId = _createFlower(_matronId, _sireId, parentGen + 1, childGenes, owner);

        Flower storage child = flowers[flowerId];

        _setCooldown(sire);
        _setCooldown(matron);
        _setCooldown(child);
    }

    // Crossing two of owner flowers
    function breedOwn(uint256 _matronId, uint256 _sireId) external payable whenNotStopped {
        require(msg.value >= autoBirthFee);
        require(isOwnerOf(msg.sender, _matronId));
        require(isOwnerOf(msg.sender, _sireId));

        Flower storage matron = flowers[_matronId];
        require(_isReadyToAction(matron));

        Flower storage sire = flowers[_sireId];
        require(_isReadyToAction(sire));

        require(_isValidPair(matron, _matronId, sire, _sireId));

        _born(_matronId, _sireId);

        gen0SellerAddress.transfer(autoBirthFee);

        emit Money(msg.sender, "BirthFee-own", autoBirthFee, autoBirthFee, _sireId, block.number);
    }
}

// Handles creating auctions for sale and siring
contract FlowerAuction is FlowerBreeding {

    // Set sale auction contract address
    function setSaleAuctionAddress(address _address) external onlyAdministrator {
        SaleClockAuction candidateContract = SaleClockAuction(_address);
        require(candidateContract.isSaleClockAuction());
        saleAuction = candidateContract;
    }

    // Set siring auction contract address
    function setBreedingAuctionAddress(address _address) external onlyAdministrator {
        BreedingClockAuction candidateContract = BreedingClockAuction(_address);
        require(candidateContract.isBreedingClockAuction());
        breedingAuction = candidateContract;
    }

    // Flower sale auction
    function createSaleAuction(uint256 _flowerId, uint256 _startingPrice, uint256 _endingPrice, uint256 _duration) external whenNotStopped {
        require(isOwnerOf(msg.sender, _flowerId));
        require(isReadyToAction(_flowerId));
        approve(saleAuction, _flowerId);
        saleAuction.createAuction(_flowerId, _startingPrice, _endingPrice, _duration, msg.sender, 0);
    }

    // Create siring auction
    function createBreedingAuction(uint256 _flowerId, uint256 _startingPrice, uint256 _endingPrice, uint256 _duration) external whenNotStopped {
        require(isOwnerOf(msg.sender, _flowerId));
        require(isReadyToAction(_flowerId));
        approve(breedingAuction, _flowerId);
        breedingAuction.createAuction(_flowerId, _startingPrice, _endingPrice, _duration, msg.sender, 0);
    }

    // Siring auction complete
    function bidOnBreedingAuction(uint256 _sireId, uint256 _matronId) external payable whenNotStopped {
        require(isOwnerOf(msg.sender, _matronId));
        require(isReadyToAction(_matronId));
        require(isReadyToAction(_sireId));
        require(_canBreedWith(_matronId, _sireId));

        uint256 currentPrice = breedingAuction.getCurrentPrice(_sireId);
        require(msg.value >= currentPrice + autoBirthFee);

        // Siring auction will throw if the bid fails.
        breedingAuction.bid.value(msg.value - autoBirthFee)(_sireId, msg.sender);
        _born(uint32(_matronId), uint32(_sireId));
        gen0SellerAddress.transfer(autoBirthFee);
        emit Money(msg.sender, "BirthFee-bid", autoBirthFee, autoBirthFee, _sireId, block.number);
    }

    // Transfers the balance of the sale auction contract to the Core contract
    function withdrawAuctionBalances() external onlyAdministrator {
        saleAuction.withdrawBalance();
        breedingAuction.withdrawBalance();
    }

    function sendGift(uint256 _flowerId, address _to) external payable whenNotStopped {
        require(isOwnerOf(msg.sender, _flowerId));
        require(isReadyToAction(_flowerId));

        transferFrom(msg.sender, _to, _flowerId);
    }

    function makeGift(uint256 _flowerId) external payable whenNotStopped {
        require(isOwnerOf(msg.sender, _flowerId));
        require(isReadyToAction(_flowerId));
        require(msg.value >= giftFee);

        transferFrom(msg.sender, giftHolderAddress, _flowerId);
        giftHolderAddress.transfer(msg.value);

        emit Money(msg.sender, "MakeGift", msg.value, msg.value, _flowerId, block.number);
    }
}

contract FlowerMinting is FlowerAuction {
    // Constants for gen0 auctions.
    uint256 public constant GEN0_STARTING_PRICE = 10 finney;
    uint256 public constant GEN0_AUCTION_DURATION = 1 days;
    // Counts the number of cats the contract owner has created
    uint256 public promoCreatedCount;
    uint256 public gen0CreatedCount;

    // Create promo flower
    function createPromoFlower(uint256 _genes, address _owner) external onlyAdministrator {
        address flowerOwner = _owner;
        if (flowerOwner == address(0)) {
            flowerOwner = adminAddress;
        }
        promoCreatedCount++;
        gen0CreatedCount++;
        _createFlower(0, 0, 0, _genes, flowerOwner);
    }

    function createGen0Auction(uint256 _genes, uint64 _auctionStartAt) external onlyAdministrator {
        uint256 flowerId = _createFlower(0, 0, 0, _genes, address(gen0SellerAddress));
        tokenApprovals[flowerId] = saleAuction;
        //approve(saleAuction, flowerId);

        gen0CreatedCount++;

        saleAuction.createAuction(flowerId, _computeNextGen0Price(), 0, GEN0_AUCTION_DURATION, address(gen0SellerAddress), _auctionStartAt);
    }

    // Computes the next gen0 auction starting price, given the average of the past 5 prices + 50%.
    function _computeNextGen0Price() internal view returns (uint256) {
        uint256 avePrice = saleAuction.averageGen0SalePrice();

        // Sanity check to ensure we don't overflow arithmetic
        require(avePrice == uint256(uint128(avePrice)));

        uint256 nextPrice = avePrice + (avePrice / 2);

        // We never auction for less than starting price
        if (nextPrice < GEN0_STARTING_PRICE) {
            nextPrice = GEN0_STARTING_PRICE;
        }

        return nextPrice;
    }

    function setGen0SellerAddress(address _newAddress) external onlyAdministrator {
        gen0SellerAddress = _newAddress;
        saleAuction.setGen0SellerAddress(_newAddress);
    }

    function setGiftHolderAddress(address _newAddress) external onlyAdministrator {
        giftHolderAddress = _newAddress;
    }
}

contract FlowerCore is FlowerMinting {

    constructor() public {
        stopped = true;
        rootAddress = msg.sender;
        adminAddress = msg.sender;
        _createFlower(0, 0, 0, uint256(-1), address(0));
    }

    // Get flower information
    function getFlower(uint256 _id) external view returns (bool isReady, uint256 cooldownIndex, uint256 nextActionAt, uint256 birthTime, uint256 matronId, uint256 sireId, uint256 generation, uint256 genes) {
        Flower storage flower = flowers[_id];
        isReady = (flower.cooldownEndBlock <= block.number);
        cooldownIndex = uint256(flower.cooldownIndex);
        nextActionAt = uint256(flower.cooldownEndBlock);
        birthTime = uint256(flower.birthTime);
        matronId = uint256(flower.matronId);
        sireId = uint256(flower.sireId);
        generation = uint256(flower.generation);
        genes = flower.genes;
    }

    // Start the game
    function unstop() public onlyAdministrator whenStopped {
        require(geneScience != address(0));

        super.setStart();
    }

    function withdrawBalance() external onlyAdministrator {
        rootAddress.transfer(address(this).balance);
    }
}

Contract Security Audit

Contract ABI

API
[{"constant":false,"inputs":[{"name":"_newRoot","type":"address"}],"name":"setRoot","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"breedingAuction","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"promoCreatedCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"GEN0_STARTING_PRICE","outputs":[{"name":"","type":"uint256"}],"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":"_genome","type":"uint256"}],"name":"checkUnique","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_flowerId","type":"uint256"}],"name":"isReadyToAction","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"GEN0_AUCTION_DURATION","outputs":[{"name":"","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":false,"inputs":[{"name":"_flowerId","type":"uint256"}],"name":"makeGift","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"giftFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"setStart","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_matronId","type":"uint256"},{"name":"_sireId","type":"uint256"}],"name":"breedOwn","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setBreedingAuctionAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_flowerId","type":"uint256"},{"name":"_startingPrice","type":"uint256"},{"name":"_endingPrice","type":"uint256"},{"name":"_duration","type":"uint256"}],"name":"createSaleAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_matronId","type":"uint256"},{"name":"_sireId","type":"uint256"}],"name":"canBreedWith","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"val","type":"uint256"}],"name":"setAutoBirthFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"exists","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"secs","type":"uint256"}],"name":"setSecondsPerBlock","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_flowerId","type":"uint256"},{"name":"_to","type":"address"}],"name":"sendGift","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[],"name":"withdrawBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"InterfaceSignature_ERC721Optional","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setGenomeContractAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_sireId","type":"uint256"},{"name":"_matronId","type":"uint256"}],"name":"bidOnBreedingAuction","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_newAddress","type":"address"}],"name":"setGen0SellerAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setSaleAuctionAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newAdmin","type":"address"}],"name":"setAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"stopped","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_genes","type":"uint256"},{"name":"_owner","type":"address"}],"name":"createPromoFlower","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"secondsPerBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdrawAuctionBalances","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"setStop","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"cooldowns","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_genes","type":"uint256"},{"name":"_auctionStartAt","type":"uint64"}],"name":"createGen0Auction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint256"}],"name":"getFlower","outputs":[{"name":"isReady","type":"bool"},{"name":"cooldownIndex","type":"uint256"},{"name":"nextActionAt","type":"uint256"},{"name":"birthTime","type":"uint256"},{"name":"matronId","type":"uint256"},{"name":"sireId","type":"uint256"},{"name":"generation","type":"uint256"},{"name":"genes","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rootAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"gen0SellerAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"giftHolderAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"autoBirthFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_fee","type":"uint256"}],"name":"setGiftFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newAddress","type":"address"}],"name":"setGiftHolderAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"isOwnerOf","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_flowerId","type":"uint256"},{"name":"_startingPrice","type":"uint256"},{"name":"_endingPrice","type":"uint256"},{"name":"_duration","type":"uint256"}],"name":"createBreedingAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"saleAuction","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ERC721_RECEIVED","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"gen0CreatedCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"geneScience","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unstop","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"adminAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newContract","type":"address"}],"name":"ContractUpgrade","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"flowerId","type":"uint256"},{"indexed":false,"name":"matronId","type":"uint256"},{"indexed":false,"name":"sireId","type":"uint256"},{"indexed":false,"name":"genes","type":"uint256"}],"name":"Birth","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":"from","type":"address"},{"indexed":false,"name":"actionType","type":"string"},{"indexed":false,"name":"sum","type":"uint256"},{"indexed":false,"name":"cut","type":"uint256"},{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"blockNumber","type":"uint256"}],"name":"Money","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_approved","type":"address"},{"indexed":true,"name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_operator","type":"address"},{"indexed":false,"name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"}]

60c0604052600d60808190527f43727970746f466c6f776572730000000000000000000000000000000000000060a090815262000040916004919062000644565b506040805180820190915260028082527f43460000000000000000000000000000000000000000000000000000000000006020909201918252620000879160059162000644565b50604080516101c081018252603c81526078602082015261012c9181019190915261025860608201526107086080820152610e1060a0820152611c2060c082015261384060e082015261708061010082015261e100610120820152620151806101408201526202a3006101608201526205460061018082015262093a806101a08201526200011a90600c90600e620006c9565b506011805460a060020a60ff0219169055600f60145566071afd498d000060158190556016553480156200014d57600080fd5b506011805460a060020a60ff02191674010000000000000000000000000000000000000000179055600e8054600160a060020a031990811633908117909255600f80549091169091179055620001b36000808060001981640100000000620001ba810204565b50620007e8565b600080620001c762000768565b600063ffffffff89168914620001dc57600080fd5b63ffffffff88168814620001ef57600080fd5b61ffff871687146200020057600080fd5b62000214866401000000006200049d810204565b15156200022057600080fd5b600287049250600d8361ffff1611156200023957600d92505b50506040805160e08101825285815267ffffffffffffffff42811660208301908152600093830184815263ffffffff808d16606086019081528c82166080870190815261ffff808a1660a089019081528e821660c08a01908152600a80546001810182559b52895160028c027fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a881019190915597517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a990980180549751955194519251915184167a0100000000000000000000000000000000000000000000000000000260d060020a61ffff02199290941678010000000000000000000000000000000000000000000000000260c060020a61ffff0219938816740100000000000000000000000000000000000000000260a060020a63ffffffff021996891670010000000000000000000000000000000002608060020a63ffffffff0219988d166801000000000000000002604060020a608060020a03199c909d1667ffffffffffffffff19909b169a909a179a909a169a909a179590951696909617929092169590951716949094179190911691909117909155909190811681146200040057600080fd5b6000868152600b602090815260409182902083905560608085015160808087015187518651600160a060020a038d16815295860188905263ffffffff938416868801529216928401929092529082015290517f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad59181900360a00190a1620004918582640100000000620004b1810204565b98975050505050505050565b6000908152600b6020526040812054111590565b620004cb82826401000000006200339e6200051082021704565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3015550565b62000525828264010000000062000561810204565b6040518190600160a060020a038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006200057d8383640100000000620031f2620005ba82021704565b50600160a060020a039091166000908152600660209081526040808320805460018101825590845282842081018590559383526007909152902055565b6000818152602081815260408083208054600160a060020a031916600160a060020a038716908117909155835260029091529020546200060a9060016401000000006200062a81026200338c1704565b600160a060020a0390921660009081526002602052604090209190915550565b6000828201838110156200063d57600080fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200068757805160ff1916838001178555620006b7565b82800160010185558215620006b7579182015b82811115620006b75782518255916020019190600101906200069a565b50620006c5929150620007a4565b5090565b6002830191839082156200075a5791602002820160005b838211156200072657835183826101000a81548163ffffffff021916908363ffffffff1602179055509260200192600401602081600301049283019260010302620006e0565b8015620007585782816101000a81549063ffffffff021916905560040160208160030104928301926001030262000726565b505b50620006c5929150620007c4565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b620007c191905b80821115620006c55760008155600101620007ab565b90565b620007c191905b80821115620006c557805463ffffffff19168155600101620007cb565b61349380620007f86000396000f3006080604052600436106102db5763ffffffff60e060020a6000350416623ba1ed81146102e05780630168605e1461030357806301ffc9a71461033457806305e455461461036a57806306fdde0314610391578063081812fc1461041b578063095ea7b3146104335780630e583df0146104575780631051db341461046c5780631280177d14610481578063174e7d551461049957806318160ddd146104b157806319c2f201146104c657806323b872dd146104db5780632933199a146105055780632f745c5914610510578063338d8fcf1461053457806335975a3714610549578063377173421461055e5780633d5e92961461056c5780633d7d3f5a1461058d57806342842e0e146105ae57806346d22c70146105d85780634b85fd55146105f35780634f558e791461060b5780634f6ccce7146106235780635663896e1461063b5780635b1fe0cb146106535780635fd8c7101461066a578063624de3d91461067f57806362ac302d146106b15780636352211e146106d25780636a226077146106ea5780636cf1cb29146106f85780636fbde40d14610719578063704b6c021461073a57806370a082311461075b57806375f12b211461077c5780637a530f03146107915780637a7d4937146107b557806391876e57146107ca57806392cf1d49146107df57806395d89b41146107f45780639d6fac6f146108095780639f0e19861461083a578063a22cb4651461085f578063a9203f3c14610885578063aaa2b8c8146108e0578063af39e9dd146108f5578063af8c4bf01461090a578063b0c35c051461091f578063b857ee7214610934578063b88d4fde1461094c578063bb4056c2146109bb578063c5b8f772146109dc578063c87b56dd14610a00578063e074118714610a18578063e6cbe35114610a39578063e985e9c514610a4e578063ecc98ce414610a75578063f1ca941014610a8a578063f2b47d5214610a9f578063f8bd71c714610ab4578063fc6f946814610ac9575b600080fd5b3480156102ec57600080fd5b50610301600160a060020a0360043516610ade565b005b34801561030f57600080fd5b50610318610b43565b60408051600160a060020a039092168252519081900360200190f35b34801561034057600080fd5b50610356600160e060020a031960043516610b52565b604080519115158252519081900360200190f35b34801561037657600080fd5b5061037f610c23565b60408051918252519081900360200190f35b34801561039d57600080fd5b506103a6610c29565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103e05781810151838201526020016103c8565b50505050905090810190601f16801561040d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561042757600080fd5b50610318600435610cc0565b34801561043f57600080fd5b50610301600160a060020a0360043516602435610cdb565b34801561046357600080fd5b5061037f610d84565b34801561047857600080fd5b50610356610d8f565b34801561048d57600080fd5b50610356600435610d94565b3480156104a557600080fd5b50610356600435610da8565b3480156104bd57600080fd5b5061037f610e68565b3480156104d257600080fd5b5061037f610e72565b3480156104e757600080fd5b50610301600160a060020a0360043581169060243516604435610e79565b610301600435610f1e565b34801561051c57600080fd5b5061037f600160a060020a0360043516602435611044565b34801561054057600080fd5b5061037f611091565b34801561055557600080fd5b50610301611097565b6103016004356024356110fd565b34801561057857600080fd5b50610301600160a060020a03600435166113a6565b34801561059957600080fd5b50610301600435602435604435606435611472565b3480156105ba57600080fd5b50610301600160a060020a036004358116906024351660443561156d565b3480156105e457600080fd5b506103566004356024356115a5565b3480156105ff57600080fd5b506103016004356115b1565b34801561061757600080fd5b506103566004356115e4565b34801561062f57600080fd5b5061037f600435611601565b34801561064757600080fd5b50610301600435611637565b610301600435600160a060020a036024351661167e565b34801561067657600080fd5b506103016116cd565b34801561068b57600080fd5b50610694611738565b60408051600160e060020a03199092168252519081900360200190f35b3480156106bd57600080fd5b50610301600160a060020a036004351661175c565b3480156106de57600080fd5b506103186004356117ac565b6103016004356024356117d0565b34801561070457600080fd5b50610301600160a060020a0360043516611a4c565b34801561072557600080fd5b50610301600160a060020a0360043516611b11565b34801561074657600080fd5b50610301600160a060020a0360043516611bdd565b34801561076757600080fd5b5061037f600160a060020a0360043516611c2b565b34801561078857600080fd5b50610356611c5e565b34801561079d57600080fd5b50610301600435600160a060020a0360243516611c6e565b3480156107c157600080fd5b5061037f611ce2565b3480156107d657600080fd5b50610301611ce8565b3480156107eb57600080fd5b50610301611de8565b34801561080057600080fd5b506103a6611e53565b34801561081557600080fd5b50610821600435611eb4565b6040805163ffffffff9092168252519081900360200190f35b34801561084657600080fd5b5061030160043567ffffffffffffffff60243516611ee1565b34801561086b57600080fd5b50610301600160a060020a0360043516602435151561200e565b34801561089157600080fd5b5061089d600435612092565b6040805198151589526020890197909752878701959095526060870193909352608086019190915260a085015260c084015260e083015251908190036101000190f35b3480156108ec57600080fd5b50610318612127565b34801561090157600080fd5b50610318612136565b34801561091657600080fd5b50610318612145565b34801561092b57600080fd5b5061037f612154565b34801561094057600080fd5b5061030160043561215a565b34801561095857600080fd5b50604080516020601f60643560048181013592830184900484028501840190955281845261030194600160a060020a03813581169560248035909216956044359536956084940191819084018382808284375094975061218d9650505050505050565b3480156109c757600080fd5b50610301600160a060020a03600435166121c5565b3480156109e857600080fd5b50610356600160a060020a0360043516602435612215565b348015610a0c57600080fd5b506103a6600435612239565b348015610a2457600080fd5b50610301600435602435604435606435612297565b348015610a4557600080fd5b50610318612374565b348015610a5a57600080fd5b50610356600160a060020a0360043581169060243516612383565b348015610a8157600080fd5b506106946123b1565b348015610a9657600080fd5b5061037f6123d5565b348015610aab57600080fd5b506103186123db565b348015610ac057600080fd5b506103016123ea565b348015610ad557600080fd5b50610318612451565b600e54600160a060020a0316331480610b015750600f54600160a060020a031633145b1515610b0c57600080fd5b600160a060020a0381161515610b2157600080fd5b600e8054600160a060020a031916600160a060020a0392909216919091179055565b601354600160a060020a031681565b6000600160e060020a031982167f01ffc9a7000000000000000000000000000000000000000000000000000000001480610bb55750600160e060020a031982167f80ac58cd00000000000000000000000000000000000000000000000000000000145b80610be95750600160e060020a031982167f780e9d6300000000000000000000000000000000000000000000000000000000145b80610c1d5750600160e060020a031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b92915050565b60185481565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610cb55780601f10610c8a57610100808354040283529160200191610cb5565b820191906000526020600020905b815481529060010190602001808311610c9857829003601f168201915b505050505090505b90565b600090815260016020526040902054600160a060020a031690565b6000610ce6826117ac565b9050600160a060020a038381169082161415610d0157600080fd5b33600160a060020a0382161480610d1d5750610d1d8133612383565b1515610d2857600080fd5b6000828152600160205260408082208054600160a060020a031916600160a060020a0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b662386f26fc1000081565b600190565b6000908152600b6020526040812054111590565b600080808311610db757600080fd5b600a805484908110610dc557fe5b60009182526020918290206040805160e081018252600290930290910180548352600181015467ffffffffffffffff808216958501959095526801000000000000000081049094169183019190915263ffffffff608060020a84048116606084015260a060020a840416608083015261ffff60c060020a8404811660a084015260d060020a90930490921660c0820152909150610e6190612460565b9392505050565b6008546000190190565b6201518081565b80610e843382612477565b1515610e8f57600080fd5b600160a060020a0384161515610ea457600080fd5b600160a060020a0383161515610eb957600080fd5b610ec384836124d6565b610ecd8483612538565b610ed7838361263f565b8183600160a060020a031685600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b60115460a060020a900460ff1615610f3557600080fd5b610f3f3382612215565b1515610f4a57600080fd5b610f5381610da8565b1515610f5e57600080fd5b601654341015610f6d57600080fd5b601154610f85903390600160a060020a031683610e79565b601154604051600160a060020a03909116903480156108fc02916000818181858888f19350505050158015610fbe573d6000803e3d6000fd5b5060408051338152348183018190526060820152608081018390524360a082015260c0602082018190526008908201527f4d616b654769667400000000000000000000000000000000000000000000000060e082015290517fe9aedacc72b677369110630875d3947e6bcba15202e2444a09ab0d5e9eacaa78918190036101000190a150565b600061104f83611c2b565b821061105a57600080fd5b600160a060020a038316600090815260066020526040902080548390811061107e57fe5b9060005260206000200154905092915050565b60165481565b600e54600160a060020a03163314806110ba5750600f54600160a060020a031633145b15156110c557600080fd5b60115460a060020a900460ff1615156110dd57600080fd5b6011805474ff000000000000000000000000000000000000000019169055565b601154600090819060a060020a900460ff161561111957600080fd5b60155434101561112857600080fd5b6111323385612215565b151561113d57600080fd5b6111473384612215565b151561115257600080fd5b600a80548590811061116057fe5b60009182526020918290206040805160e081018252600290930290910180548352600181015467ffffffffffffffff808216958501959095526801000000000000000081049094169183019190915263ffffffff608060020a84048116606084015260a060020a840416608083015261ffff60c060020a8404811660a084015260d060020a90930490921660c08201529092506111fc90612460565b151561120757600080fd5b600a80548490811061121557fe5b60009182526020918290206040805160e081018252600290930290910180548352600181015467ffffffffffffffff808216958501959095526801000000000000000081049094169183019190915263ffffffff608060020a84048116606084015260a060020a840416608083015261ffff60c060020a8404811660a084015260d060020a90930490921660c08201529091506112b190612460565b15156112bc57600080fd5b6112c882858386612688565b15156112d357600080fd5b6112dd8484612807565b601054601554604051600160a060020a039092169181156108fc0291906000818181858888f19350505050158015611319573d6000803e3d6000fd5b50601554604080513381528082018390526060810192909252608082018590524360a083015260c060208301819052600c908301527f42697274684665652d6f776e000000000000000000000000000000000000000060e0830152517fe9aedacc72b677369110630875d3947e6bcba15202e2444a09ab0d5e9eacaa78918190036101000190a150505050565b600e54600090600160a060020a03163314806113cc5750600f54600160a060020a031633145b15156113d757600080fd5b81905080600160a060020a03166312b91aca6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561141857600080fd5b505af115801561142c573d6000803e3d6000fd5b505050506040513d602081101561144257600080fd5b5051151561144f57600080fd5b60138054600160a060020a031916600160a060020a039290921691909117905550565b60115460a060020a900460ff161561148957600080fd5b6114933385612215565b151561149e57600080fd5b6114a784610da8565b15156114b257600080fd5b6012546114c890600160a060020a031685610cdb565b601254604080517f6d2a7c8b00000000000000000000000000000000000000000000000000000000815260048101879052602481018690526044810185905260648101849052336084820152600060a482018190529151600160a060020a0390931692636d2a7c8b9260c48084019391929182900301818387803b15801561154f57600080fd5b505af1158015611563573d6000803e3d6000fd5b5050505050505050565b806115783382612477565b151561158357600080fd5b61159f848484602060405190810160405280600081525061218d565b50505050565b6000610e618383612992565b600e54600160a060020a03163314806115d45750600f54600160a060020a031633145b15156115df57600080fd5b601555565b600090815260208190526040902054600160a060020a0316151590565b600061160b610e68565b82111561161757600080fd5b600880548390811061162557fe5b90600052602060002001549050919050565b600e54600160a060020a031633148061165a5750600f54600160a060020a031633145b151561166557600080fd5b600c5463ffffffff16811061167957600080fd5b601455565b60115460a060020a900460ff161561169557600080fd5b61169f3383612215565b15156116aa57600080fd5b6116b382610da8565b15156116be57600080fd5b6116c9338284610e79565b5050565b600e54600160a060020a03163314806116f05750600f54600160a060020a031633145b15156116fb57600080fd5b600e54604051600160a060020a0390911690303180156108fc02916000818181858888f19350505050158015611735573d6000803e3d6000fd5b50565b7fb0aa71870000000000000000000000000000000000000000000000000000000081565b600e54600160a060020a031633148061177f5750600f54600160a060020a031633145b151561178a57600080fd5b60178054600160a060020a031916600160a060020a0392909216919091179055565b600081815260208190526040812054600160a060020a0316801515610c1d57600080fd5b60115460009060a060020a900460ff16156117ea57600080fd5b6117f43383612215565b15156117ff57600080fd5b61180882610da8565b151561181357600080fd5b61181c83610da8565b151561182757600080fd5b6118318284612992565b151561183c57600080fd5b601354604080517fc55d0f56000000000000000000000000000000000000000000000000000000008152600481018690529051600160a060020a039092169163c55d0f56916024808201926020929091908290030181600087803b1580156118a357600080fd5b505af11580156118b7573d6000803e3d6000fd5b505050506040513d60208110156118cd57600080fd5b505160155490915081013410156118e357600080fd5b601354601554604080517f9f04996d000000000000000000000000000000000000000000000000000000008152600481018790523360248201529051600160a060020a0390931692639f04996d9234039160448082019260009290919082900301818588803b15801561195557600080fd5b505af1158015611969573d6000803e3d6000fd5b50505050506119848263ffffffff168463ffffffff16612807565b601054601554604051600160a060020a039092169181156108fc0291906000818181858888f193505050501580156119c0573d6000803e3d6000fd5b50601554604080513381528082018390526060810192909252608082018590524360a083015260c060208301819052600c908301527f42697274684665652d626964000000000000000000000000000000000000000060e0830152517fe9aedacc72b677369110630875d3947e6bcba15202e2444a09ab0d5e9eacaa78918190036101000190a1505050565b600e54600160a060020a0316331480611a6f5750600f54600160a060020a031633145b1515611a7a57600080fd5b60108054600160a060020a031916600160a060020a03838116918217909255601254604080517f6cf1cb29000000000000000000000000000000000000000000000000000000008152600481019390935251921691636cf1cb299160248082019260009290919082900301818387803b158015611af657600080fd5b505af1158015611b0a573d6000803e3d6000fd5b5050505050565b600e54600090600160a060020a0316331480611b375750600f54600160a060020a031633145b1515611b4257600080fd5b81905080600160a060020a03166385b861886040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611b8357600080fd5b505af1158015611b97573d6000803e3d6000fd5b505050506040513d6020811015611bad57600080fd5b50511515611bba57600080fd5b60128054600160a060020a031916600160a060020a039290921691909117905550565b600e54600160a060020a03163314611bf457600080fd5b600160a060020a0381161515611c0957600080fd5b600f8054600160a060020a031916600160a060020a0392909216919091179055565b6000600160a060020a0382161515611c4257600080fd5b50600160a060020a031660009081526002602052604090205490565b60115460a060020a900460ff1681565b600e54600090600160a060020a0316331480611c945750600f54600160a060020a031633145b1515611c9f57600080fd5b5080600160a060020a0381161515611cbf5750600f54600160a060020a03165b60188054600190810190915560198054909101905561159f600080808685612a01565b60145481565b600e54600160a060020a0316331480611d0b5750600f54600160a060020a031633145b1515611d1657600080fd5b601260009054906101000a9004600160a060020a0316600160a060020a0316635fd8c7106040518163ffffffff1660e060020a028152600401600060405180830381600087803b158015611d6957600080fd5b505af1158015611d7d573d6000803e3d6000fd5b50505050601360009054906101000a9004600160a060020a0316600160a060020a0316635fd8c7106040518163ffffffff1660e060020a028152600401600060405180830381600087803b158015611dd457600080fd5b505af115801561159f573d6000803e3d6000fd5b600e54600160a060020a0316331480611e0b5750600f54600160a060020a031633145b1515611e1657600080fd5b60115460a060020a900460ff1615611e2d57600080fd5b6011805474ff0000000000000000000000000000000000000000191660a060020a179055565b60058054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610cb55780601f10610c8a57610100808354040283529160200191610cb5565b600c81600e8110611ec157fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b600e54600090600160a060020a0316331480611f075750600f54600160a060020a031633145b1515611f1257600080fd5b601054611f3090600090819081908790600160a060020a0316612a01565b6012805460008381526001602081905260409091208054600160a060020a031916600160a060020a03938416179055601980549091019055905491925016636d2a7c8b82611f7c612cc3565b6010546040805160e060020a63ffffffff871602815260048101949094526024840192909252600060448401819052620151806064850152600160a060020a03909116608484015267ffffffffffffffff871660a4840152905160c48084019382900301818387803b158015611ff157600080fd5b505af1158015612005573d6000803e3d6000fd5b50505050505050565b600160a060020a03821633141561202457600080fd5b336000818152600360209081526040808320600160a060020a03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b6000806000806000806000806000600a8a8154811015156120af57fe5b6000918252602090912060016002909202019081015490544367ffffffffffffffff6801000000000000000084048116918211159e61ffff60c060020a860481169f50929d509084169b5063ffffffff608060020a850481169b5060a060020a850416995060d060020a909304169650945092505050565b600e54600160a060020a031681565b601054600160a060020a031681565b601154600160a060020a031681565b60155481565b600e54600160a060020a031633148061217d5750600f54600160a060020a031633145b151561218857600080fd5b601655565b816121983382612477565b15156121a357600080fd5b6121ae858585610e79565b6121ba85858585612d8c565b1515611b0a57600080fd5b600e54600160a060020a03163314806121e85750600f54600160a060020a031633145b15156121f357600080fd5b60118054600160a060020a031916600160a060020a0392909216919091179055565b600080612221836117ac565b600160a060020a039081169416939093149392505050565b606080612245836115e4565b151561225057600080fd5b610e616040805190810160405280601b81526020017f68747470733a2f2f63727970746f666c6f776572732e696f2f762f000000000081525061229285612ef9565b613004565b60115460a060020a900460ff16156122ae57600080fd5b6122b83385612215565b15156122c357600080fd5b6122cc84610da8565b15156122d757600080fd5b6013546122ed90600160a060020a031685610cdb565b601354604080517f6d2a7c8b00000000000000000000000000000000000000000000000000000000815260048101879052602481018690526044810185905260648101849052336084820152600060a482018190529151600160a060020a0390931692636d2a7c8b9260c48084019391929182900301818387803b15801561154f57600080fd5b601254600160a060020a031681565b600160a060020a03918216600090815260036020908152604080832093909416825291909152205460ff1690565b7f150b7a020000000000000000000000000000000000000000000000000000000081565b60195481565b601754600160a060020a031681565b600e54600160a060020a031633148061240d5750600f54600160a060020a031633145b151561241857600080fd5b60115460a060020a900460ff16151561243057600080fd5b601754600160a060020a0316151561244757600080fd5b61244f611097565b565b600f54600160a060020a031681565b6040015167ffffffffffffffff4381169116111590565b600080612483836117ac565b905080600160a060020a031684600160a060020a031614806124be575083600160a060020a03166124b384610cc0565b600160a060020a0316145b806124ce57506124ce8185612383565b949350505050565b81600160a060020a03166124e9826117ac565b600160a060020a0316146124fc57600080fd5b600081815260016020526040902054600160a060020a0316156116c95760009081526001602052604090208054600160a060020a031916905550565b60008060006125478585613153565b600084815260076020908152604080832054600160a060020a038916845260069092529091205490935061258290600163ffffffff6131db16565b600160a060020a0386166000908152600660205260409020805491935090839081106125aa57fe5b90600052602060002001549050806006600087600160a060020a0316600160a060020a03168152602001908152602001600020848154811015156125ea57fe5b6000918252602080832090910192909255600160a060020a03871681526006909152604090208054906126219060001983016133e4565b50600093845260076020526040808520859055908452909220555050565b600061264b83836131f2565b50600160a060020a039091166000908152600660209081526040808320805460018101825590845282842081018590559383526007909152902055565b60008184141561269a575060006124ce565b6001830154608060020a900463ffffffff1615806126c757506001850154608060020a900463ffffffff16155b156126d4575060016124ce565b6001850154608060020a900463ffffffff168214806127035750600185015460a060020a900463ffffffff1682145b15612710575060006124ce565b6001830154608060020a900463ffffffff1684148061273f5750600183015460a060020a900463ffffffff1684145b1561274c575060006124ce565b60018581015490840154608060020a9182900463ffffffff90811692909104161480612797575060018086015490840154608060020a900463ffffffff90811660a060020a90920416145b156127a4575060006124ce565b6001808601549084015460a060020a900463ffffffff908116608060020a9092041614806127ef57506001858101549084015460a060020a9182900463ffffffff9081169290910416145b156127fc575060006124ce565b506001949350505050565b6000806000806000806000600a8881548110151561282157fe5b90600052602060002090600202019650600a8981548110151561284057fe5b600091825260209091206001600290920201818101549189015490975061ffff60d060020a92839004811697509190041685101561288b57600187015460d060020a900461ffff1694505b60175486548854604080517f8d8b1b880000000000000000000000000000000000000000000000000000000081526004810193909352602483019190915251600160a060020a0390921691638d8b1b88916044808201926020929091908290030181600087803b1580156128fe57600080fd5b505af1158015612912573d6000803e3d6000fd5b505050506040513d602081101561292857600080fd5b50519350612935896117ac565b925061294b89898760010161ffff168787612a01565b9150600a8281548110151561295c57fe5b9060005260206000209060020201905061297587613252565b61297e86613252565b61298781613252565b505050505050505050565b600080808085116129a257600080fd5b600084116129af57600080fd5b600a8054869081106129bd57fe5b90600052602060002090600202019150600a848154811015156129dc57fe5b906000526020600020906002020190506129f882868387612688565b95945050505050565b600080612a0c61340d565b600063ffffffff89168914612a2057600080fd5b63ffffffff88168814612a3257600080fd5b61ffff87168714612a4257600080fd5b612a4b86610d94565b1515612a5657600080fd5b600287049250600d8361ffff161115612a6e57600d92505b50506040805160e08101825285815267ffffffffffffffff42811660208301908152600093830184815263ffffffff808d16606086019081528c82166080870190815261ffff808a1660a089019081528e821660c08a01908152600a80546001810182559b52895160028c027fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a881019190915597517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a9909801805497519551945192519151841660d060020a027fffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffff9290941660c060020a0279ffff0000000000000000000000000000000000000000000000001993881660a060020a0277ffffffff000000000000000000000000000000000000000019968916608060020a0273ffffffff0000000000000000000000000000000019988d1668010000000000000000026fffffffffffffffff0000000000000000199c909d1667ffffffffffffffff19909b169a909a179a909a169a909a17959095169690961792909216959095171694909417919091169190911790915590919081168114612c3157600080fd5b6000868152600b602090815260409182902083905560608085015160808087015187518651600160a060020a038d16815295860188905263ffffffff938416868801529216928401929092529082015290517f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad59181900360a00190a1612cb78582613335565b98975050505050505050565b6000806000601260009054906101000a9004600160a060020a0316600160a060020a031663eac9d94c6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015612d1b57600080fd5b505af1158015612d2f573d6000803e3d6000fd5b505050506040513d6020811015612d4557600080fd5b505191506fffffffffffffffffffffffffffffffff82168214612d6757600080fd5b50600281048101662386f26fc10000811015610c1d5750662386f26fc1000092915050565b600080612da185600160a060020a0316613384565b1515612db05760019150612ef0565b6040517f150b7a020000000000000000000000000000000000000000000000000000000081523360048201818152600160a060020a03898116602485015260448401889052608060648501908152875160848601528751918a169463150b7a0294938c938b938b93909160a490910190602085019080838360005b83811015612e43578181015183820152602001612e2b565b50505050905090810190601f168015612e705780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015612e9257600080fd5b505af1158015612ea6573d6000803e3d6000fd5b505050506040513d6020811015612ebc57600080fd5b5051600160e060020a031981167f150b7a020000000000000000000000000000000000000000000000000000000014925090505b50949350505050565b60606000808281851515612f425760408051808201909152600181527f300000000000000000000000000000000000000000000000000000000000000060208201529450612ffb565b8593505b8315612f5d57600190920191600a84049350612f46565b826040519080825280601f01601f191660200182016040528015612f8b578160200160208202803883390190505b5091505060001982015b8515612ff757815160001982019160f860020a6030600a8a060102918491908110612fbc57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a86049550612f95565b8194505b50505050919050565b606080606080606060008088955087945084518651016040519080825280601f01601f191660200182016040528015613047578160200160208202803883390190505b50935083925060009150600090505b85518110156130cc57858181518110151561306d57fe5b90602001015160f860020a900460f860020a02838380600101945081518110151561309457fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101613056565b5060005b84518110156131465784818151811015156130e757fe5b90602001015160f860020a900460f860020a02838380600101945081518110151561310e57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001016130d0565b5090979650505050505050565b81600160a060020a0316613166826117ac565b600160a060020a03161461317957600080fd5b600160a060020a0382166000908152600260205260409020546131a390600163ffffffff6131db16565b600160a060020a0390921660009081526002602090815260408083209490945591815290819052208054600160a060020a0319169055565b600080838311156131eb57600080fd5b5050900390565b6000818152602081815260408083208054600160a060020a031916600160a060020a0387169081179091558352600290915290205461323290600161338c565b600160a060020a0390921660009081526002602052604090209190915550565b6014546001820154439190600c9060c060020a900461ffff16600e811061327557fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff168115156132a057fe5b6001840180546fffffffffffffffff0000000000000000191668010000000000000000939092049390930167ffffffffffffffff16919091021790819055600d60c060020a90910461ffff161015611735576001818101805461ffff60c060020a80830482169094011690920279ffff0000000000000000000000000000000000000000000000001990921691909117905550565b61333f828261339e565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3015550565b6000903b1190565b600082820183811015610e6157600080fd5b6133a8828261263f565b6040518190600160a060020a038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b81548183558181111561340857600083815260209020613408918101908301613449565b505050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b610cbd91905b80821115613463576000815560010161344f565b50905600a165627a7a723058207cc1ac9088c6f0bcdb19cba8d05ec31456cf1d6b9f6925157d63f2c8315e3bbf0029

Deployed Bytecode

0x6080604052600436106102db5763ffffffff60e060020a6000350416623ba1ed81146102e05780630168605e1461030357806301ffc9a71461033457806305e455461461036a57806306fdde0314610391578063081812fc1461041b578063095ea7b3146104335780630e583df0146104575780631051db341461046c5780631280177d14610481578063174e7d551461049957806318160ddd146104b157806319c2f201146104c657806323b872dd146104db5780632933199a146105055780632f745c5914610510578063338d8fcf1461053457806335975a3714610549578063377173421461055e5780633d5e92961461056c5780633d7d3f5a1461058d57806342842e0e146105ae57806346d22c70146105d85780634b85fd55146105f35780634f558e791461060b5780634f6ccce7146106235780635663896e1461063b5780635b1fe0cb146106535780635fd8c7101461066a578063624de3d91461067f57806362ac302d146106b15780636352211e146106d25780636a226077146106ea5780636cf1cb29146106f85780636fbde40d14610719578063704b6c021461073a57806370a082311461075b57806375f12b211461077c5780637a530f03146107915780637a7d4937146107b557806391876e57146107ca57806392cf1d49146107df57806395d89b41146107f45780639d6fac6f146108095780639f0e19861461083a578063a22cb4651461085f578063a9203f3c14610885578063aaa2b8c8146108e0578063af39e9dd146108f5578063af8c4bf01461090a578063b0c35c051461091f578063b857ee7214610934578063b88d4fde1461094c578063bb4056c2146109bb578063c5b8f772146109dc578063c87b56dd14610a00578063e074118714610a18578063e6cbe35114610a39578063e985e9c514610a4e578063ecc98ce414610a75578063f1ca941014610a8a578063f2b47d5214610a9f578063f8bd71c714610ab4578063fc6f946814610ac9575b600080fd5b3480156102ec57600080fd5b50610301600160a060020a0360043516610ade565b005b34801561030f57600080fd5b50610318610b43565b60408051600160a060020a039092168252519081900360200190f35b34801561034057600080fd5b50610356600160e060020a031960043516610b52565b604080519115158252519081900360200190f35b34801561037657600080fd5b5061037f610c23565b60408051918252519081900360200190f35b34801561039d57600080fd5b506103a6610c29565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103e05781810151838201526020016103c8565b50505050905090810190601f16801561040d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561042757600080fd5b50610318600435610cc0565b34801561043f57600080fd5b50610301600160a060020a0360043516602435610cdb565b34801561046357600080fd5b5061037f610d84565b34801561047857600080fd5b50610356610d8f565b34801561048d57600080fd5b50610356600435610d94565b3480156104a557600080fd5b50610356600435610da8565b3480156104bd57600080fd5b5061037f610e68565b3480156104d257600080fd5b5061037f610e72565b3480156104e757600080fd5b50610301600160a060020a0360043581169060243516604435610e79565b610301600435610f1e565b34801561051c57600080fd5b5061037f600160a060020a0360043516602435611044565b34801561054057600080fd5b5061037f611091565b34801561055557600080fd5b50610301611097565b6103016004356024356110fd565b34801561057857600080fd5b50610301600160a060020a03600435166113a6565b34801561059957600080fd5b50610301600435602435604435606435611472565b3480156105ba57600080fd5b50610301600160a060020a036004358116906024351660443561156d565b3480156105e457600080fd5b506103566004356024356115a5565b3480156105ff57600080fd5b506103016004356115b1565b34801561061757600080fd5b506103566004356115e4565b34801561062f57600080fd5b5061037f600435611601565b34801561064757600080fd5b50610301600435611637565b610301600435600160a060020a036024351661167e565b34801561067657600080fd5b506103016116cd565b34801561068b57600080fd5b50610694611738565b60408051600160e060020a03199092168252519081900360200190f35b3480156106bd57600080fd5b50610301600160a060020a036004351661175c565b3480156106de57600080fd5b506103186004356117ac565b6103016004356024356117d0565b34801561070457600080fd5b50610301600160a060020a0360043516611a4c565b34801561072557600080fd5b50610301600160a060020a0360043516611b11565b34801561074657600080fd5b50610301600160a060020a0360043516611bdd565b34801561076757600080fd5b5061037f600160a060020a0360043516611c2b565b34801561078857600080fd5b50610356611c5e565b34801561079d57600080fd5b50610301600435600160a060020a0360243516611c6e565b3480156107c157600080fd5b5061037f611ce2565b3480156107d657600080fd5b50610301611ce8565b3480156107eb57600080fd5b50610301611de8565b34801561080057600080fd5b506103a6611e53565b34801561081557600080fd5b50610821600435611eb4565b6040805163ffffffff9092168252519081900360200190f35b34801561084657600080fd5b5061030160043567ffffffffffffffff60243516611ee1565b34801561086b57600080fd5b50610301600160a060020a0360043516602435151561200e565b34801561089157600080fd5b5061089d600435612092565b6040805198151589526020890197909752878701959095526060870193909352608086019190915260a085015260c084015260e083015251908190036101000190f35b3480156108ec57600080fd5b50610318612127565b34801561090157600080fd5b50610318612136565b34801561091657600080fd5b50610318612145565b34801561092b57600080fd5b5061037f612154565b34801561094057600080fd5b5061030160043561215a565b34801561095857600080fd5b50604080516020601f60643560048181013592830184900484028501840190955281845261030194600160a060020a03813581169560248035909216956044359536956084940191819084018382808284375094975061218d9650505050505050565b3480156109c757600080fd5b50610301600160a060020a03600435166121c5565b3480156109e857600080fd5b50610356600160a060020a0360043516602435612215565b348015610a0c57600080fd5b506103a6600435612239565b348015610a2457600080fd5b50610301600435602435604435606435612297565b348015610a4557600080fd5b50610318612374565b348015610a5a57600080fd5b50610356600160a060020a0360043581169060243516612383565b348015610a8157600080fd5b506106946123b1565b348015610a9657600080fd5b5061037f6123d5565b348015610aab57600080fd5b506103186123db565b348015610ac057600080fd5b506103016123ea565b348015610ad557600080fd5b50610318612451565b600e54600160a060020a0316331480610b015750600f54600160a060020a031633145b1515610b0c57600080fd5b600160a060020a0381161515610b2157600080fd5b600e8054600160a060020a031916600160a060020a0392909216919091179055565b601354600160a060020a031681565b6000600160e060020a031982167f01ffc9a7000000000000000000000000000000000000000000000000000000001480610bb55750600160e060020a031982167f80ac58cd00000000000000000000000000000000000000000000000000000000145b80610be95750600160e060020a031982167f780e9d6300000000000000000000000000000000000000000000000000000000145b80610c1d5750600160e060020a031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b92915050565b60185481565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610cb55780601f10610c8a57610100808354040283529160200191610cb5565b820191906000526020600020905b815481529060010190602001808311610c9857829003601f168201915b505050505090505b90565b600090815260016020526040902054600160a060020a031690565b6000610ce6826117ac565b9050600160a060020a038381169082161415610d0157600080fd5b33600160a060020a0382161480610d1d5750610d1d8133612383565b1515610d2857600080fd5b6000828152600160205260408082208054600160a060020a031916600160a060020a0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b662386f26fc1000081565b600190565b6000908152600b6020526040812054111590565b600080808311610db757600080fd5b600a805484908110610dc557fe5b60009182526020918290206040805160e081018252600290930290910180548352600181015467ffffffffffffffff808216958501959095526801000000000000000081049094169183019190915263ffffffff608060020a84048116606084015260a060020a840416608083015261ffff60c060020a8404811660a084015260d060020a90930490921660c0820152909150610e6190612460565b9392505050565b6008546000190190565b6201518081565b80610e843382612477565b1515610e8f57600080fd5b600160a060020a0384161515610ea457600080fd5b600160a060020a0383161515610eb957600080fd5b610ec384836124d6565b610ecd8483612538565b610ed7838361263f565b8183600160a060020a031685600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b60115460a060020a900460ff1615610f3557600080fd5b610f3f3382612215565b1515610f4a57600080fd5b610f5381610da8565b1515610f5e57600080fd5b601654341015610f6d57600080fd5b601154610f85903390600160a060020a031683610e79565b601154604051600160a060020a03909116903480156108fc02916000818181858888f19350505050158015610fbe573d6000803e3d6000fd5b5060408051338152348183018190526060820152608081018390524360a082015260c0602082018190526008908201527f4d616b654769667400000000000000000000000000000000000000000000000060e082015290517fe9aedacc72b677369110630875d3947e6bcba15202e2444a09ab0d5e9eacaa78918190036101000190a150565b600061104f83611c2b565b821061105a57600080fd5b600160a060020a038316600090815260066020526040902080548390811061107e57fe5b9060005260206000200154905092915050565b60165481565b600e54600160a060020a03163314806110ba5750600f54600160a060020a031633145b15156110c557600080fd5b60115460a060020a900460ff1615156110dd57600080fd5b6011805474ff000000000000000000000000000000000000000019169055565b601154600090819060a060020a900460ff161561111957600080fd5b60155434101561112857600080fd5b6111323385612215565b151561113d57600080fd5b6111473384612215565b151561115257600080fd5b600a80548590811061116057fe5b60009182526020918290206040805160e081018252600290930290910180548352600181015467ffffffffffffffff808216958501959095526801000000000000000081049094169183019190915263ffffffff608060020a84048116606084015260a060020a840416608083015261ffff60c060020a8404811660a084015260d060020a90930490921660c08201529092506111fc90612460565b151561120757600080fd5b600a80548490811061121557fe5b60009182526020918290206040805160e081018252600290930290910180548352600181015467ffffffffffffffff808216958501959095526801000000000000000081049094169183019190915263ffffffff608060020a84048116606084015260a060020a840416608083015261ffff60c060020a8404811660a084015260d060020a90930490921660c08201529091506112b190612460565b15156112bc57600080fd5b6112c882858386612688565b15156112d357600080fd5b6112dd8484612807565b601054601554604051600160a060020a039092169181156108fc0291906000818181858888f19350505050158015611319573d6000803e3d6000fd5b50601554604080513381528082018390526060810192909252608082018590524360a083015260c060208301819052600c908301527f42697274684665652d6f776e000000000000000000000000000000000000000060e0830152517fe9aedacc72b677369110630875d3947e6bcba15202e2444a09ab0d5e9eacaa78918190036101000190a150505050565b600e54600090600160a060020a03163314806113cc5750600f54600160a060020a031633145b15156113d757600080fd5b81905080600160a060020a03166312b91aca6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561141857600080fd5b505af115801561142c573d6000803e3d6000fd5b505050506040513d602081101561144257600080fd5b5051151561144f57600080fd5b60138054600160a060020a031916600160a060020a039290921691909117905550565b60115460a060020a900460ff161561148957600080fd5b6114933385612215565b151561149e57600080fd5b6114a784610da8565b15156114b257600080fd5b6012546114c890600160a060020a031685610cdb565b601254604080517f6d2a7c8b00000000000000000000000000000000000000000000000000000000815260048101879052602481018690526044810185905260648101849052336084820152600060a482018190529151600160a060020a0390931692636d2a7c8b9260c48084019391929182900301818387803b15801561154f57600080fd5b505af1158015611563573d6000803e3d6000fd5b5050505050505050565b806115783382612477565b151561158357600080fd5b61159f848484602060405190810160405280600081525061218d565b50505050565b6000610e618383612992565b600e54600160a060020a03163314806115d45750600f54600160a060020a031633145b15156115df57600080fd5b601555565b600090815260208190526040902054600160a060020a0316151590565b600061160b610e68565b82111561161757600080fd5b600880548390811061162557fe5b90600052602060002001549050919050565b600e54600160a060020a031633148061165a5750600f54600160a060020a031633145b151561166557600080fd5b600c5463ffffffff16811061167957600080fd5b601455565b60115460a060020a900460ff161561169557600080fd5b61169f3383612215565b15156116aa57600080fd5b6116b382610da8565b15156116be57600080fd5b6116c9338284610e79565b5050565b600e54600160a060020a03163314806116f05750600f54600160a060020a031633145b15156116fb57600080fd5b600e54604051600160a060020a0390911690303180156108fc02916000818181858888f19350505050158015611735573d6000803e3d6000fd5b50565b7fb0aa71870000000000000000000000000000000000000000000000000000000081565b600e54600160a060020a031633148061177f5750600f54600160a060020a031633145b151561178a57600080fd5b60178054600160a060020a031916600160a060020a0392909216919091179055565b600081815260208190526040812054600160a060020a0316801515610c1d57600080fd5b60115460009060a060020a900460ff16156117ea57600080fd5b6117f43383612215565b15156117ff57600080fd5b61180882610da8565b151561181357600080fd5b61181c83610da8565b151561182757600080fd5b6118318284612992565b151561183c57600080fd5b601354604080517fc55d0f56000000000000000000000000000000000000000000000000000000008152600481018690529051600160a060020a039092169163c55d0f56916024808201926020929091908290030181600087803b1580156118a357600080fd5b505af11580156118b7573d6000803e3d6000fd5b505050506040513d60208110156118cd57600080fd5b505160155490915081013410156118e357600080fd5b601354601554604080517f9f04996d000000000000000000000000000000000000000000000000000000008152600481018790523360248201529051600160a060020a0390931692639f04996d9234039160448082019260009290919082900301818588803b15801561195557600080fd5b505af1158015611969573d6000803e3d6000fd5b50505050506119848263ffffffff168463ffffffff16612807565b601054601554604051600160a060020a039092169181156108fc0291906000818181858888f193505050501580156119c0573d6000803e3d6000fd5b50601554604080513381528082018390526060810192909252608082018590524360a083015260c060208301819052600c908301527f42697274684665652d626964000000000000000000000000000000000000000060e0830152517fe9aedacc72b677369110630875d3947e6bcba15202e2444a09ab0d5e9eacaa78918190036101000190a1505050565b600e54600160a060020a0316331480611a6f5750600f54600160a060020a031633145b1515611a7a57600080fd5b60108054600160a060020a031916600160a060020a03838116918217909255601254604080517f6cf1cb29000000000000000000000000000000000000000000000000000000008152600481019390935251921691636cf1cb299160248082019260009290919082900301818387803b158015611af657600080fd5b505af1158015611b0a573d6000803e3d6000fd5b5050505050565b600e54600090600160a060020a0316331480611b375750600f54600160a060020a031633145b1515611b4257600080fd5b81905080600160a060020a03166385b861886040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611b8357600080fd5b505af1158015611b97573d6000803e3d6000fd5b505050506040513d6020811015611bad57600080fd5b50511515611bba57600080fd5b60128054600160a060020a031916600160a060020a039290921691909117905550565b600e54600160a060020a03163314611bf457600080fd5b600160a060020a0381161515611c0957600080fd5b600f8054600160a060020a031916600160a060020a0392909216919091179055565b6000600160a060020a0382161515611c4257600080fd5b50600160a060020a031660009081526002602052604090205490565b60115460a060020a900460ff1681565b600e54600090600160a060020a0316331480611c945750600f54600160a060020a031633145b1515611c9f57600080fd5b5080600160a060020a0381161515611cbf5750600f54600160a060020a03165b60188054600190810190915560198054909101905561159f600080808685612a01565b60145481565b600e54600160a060020a0316331480611d0b5750600f54600160a060020a031633145b1515611d1657600080fd5b601260009054906101000a9004600160a060020a0316600160a060020a0316635fd8c7106040518163ffffffff1660e060020a028152600401600060405180830381600087803b158015611d6957600080fd5b505af1158015611d7d573d6000803e3d6000fd5b50505050601360009054906101000a9004600160a060020a0316600160a060020a0316635fd8c7106040518163ffffffff1660e060020a028152600401600060405180830381600087803b158015611dd457600080fd5b505af115801561159f573d6000803e3d6000fd5b600e54600160a060020a0316331480611e0b5750600f54600160a060020a031633145b1515611e1657600080fd5b60115460a060020a900460ff1615611e2d57600080fd5b6011805474ff0000000000000000000000000000000000000000191660a060020a179055565b60058054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610cb55780601f10610c8a57610100808354040283529160200191610cb5565b600c81600e8110611ec157fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b600e54600090600160a060020a0316331480611f075750600f54600160a060020a031633145b1515611f1257600080fd5b601054611f3090600090819081908790600160a060020a0316612a01565b6012805460008381526001602081905260409091208054600160a060020a031916600160a060020a03938416179055601980549091019055905491925016636d2a7c8b82611f7c612cc3565b6010546040805160e060020a63ffffffff871602815260048101949094526024840192909252600060448401819052620151806064850152600160a060020a03909116608484015267ffffffffffffffff871660a4840152905160c48084019382900301818387803b158015611ff157600080fd5b505af1158015612005573d6000803e3d6000fd5b50505050505050565b600160a060020a03821633141561202457600080fd5b336000818152600360209081526040808320600160a060020a03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b6000806000806000806000806000600a8a8154811015156120af57fe5b6000918252602090912060016002909202019081015490544367ffffffffffffffff6801000000000000000084048116918211159e61ffff60c060020a860481169f50929d509084169b5063ffffffff608060020a850481169b5060a060020a850416995060d060020a909304169650945092505050565b600e54600160a060020a031681565b601054600160a060020a031681565b601154600160a060020a031681565b60155481565b600e54600160a060020a031633148061217d5750600f54600160a060020a031633145b151561218857600080fd5b601655565b816121983382612477565b15156121a357600080fd5b6121ae858585610e79565b6121ba85858585612d8c565b1515611b0a57600080fd5b600e54600160a060020a03163314806121e85750600f54600160a060020a031633145b15156121f357600080fd5b60118054600160a060020a031916600160a060020a0392909216919091179055565b600080612221836117ac565b600160a060020a039081169416939093149392505050565b606080612245836115e4565b151561225057600080fd5b610e616040805190810160405280601b81526020017f68747470733a2f2f63727970746f666c6f776572732e696f2f762f000000000081525061229285612ef9565b613004565b60115460a060020a900460ff16156122ae57600080fd5b6122b83385612215565b15156122c357600080fd5b6122cc84610da8565b15156122d757600080fd5b6013546122ed90600160a060020a031685610cdb565b601354604080517f6d2a7c8b00000000000000000000000000000000000000000000000000000000815260048101879052602481018690526044810185905260648101849052336084820152600060a482018190529151600160a060020a0390931692636d2a7c8b9260c48084019391929182900301818387803b15801561154f57600080fd5b601254600160a060020a031681565b600160a060020a03918216600090815260036020908152604080832093909416825291909152205460ff1690565b7f150b7a020000000000000000000000000000000000000000000000000000000081565b60195481565b601754600160a060020a031681565b600e54600160a060020a031633148061240d5750600f54600160a060020a031633145b151561241857600080fd5b60115460a060020a900460ff16151561243057600080fd5b601754600160a060020a0316151561244757600080fd5b61244f611097565b565b600f54600160a060020a031681565b6040015167ffffffffffffffff4381169116111590565b600080612483836117ac565b905080600160a060020a031684600160a060020a031614806124be575083600160a060020a03166124b384610cc0565b600160a060020a0316145b806124ce57506124ce8185612383565b949350505050565b81600160a060020a03166124e9826117ac565b600160a060020a0316146124fc57600080fd5b600081815260016020526040902054600160a060020a0316156116c95760009081526001602052604090208054600160a060020a031916905550565b60008060006125478585613153565b600084815260076020908152604080832054600160a060020a038916845260069092529091205490935061258290600163ffffffff6131db16565b600160a060020a0386166000908152600660205260409020805491935090839081106125aa57fe5b90600052602060002001549050806006600087600160a060020a0316600160a060020a03168152602001908152602001600020848154811015156125ea57fe5b6000918252602080832090910192909255600160a060020a03871681526006909152604090208054906126219060001983016133e4565b50600093845260076020526040808520859055908452909220555050565b600061264b83836131f2565b50600160a060020a039091166000908152600660209081526040808320805460018101825590845282842081018590559383526007909152902055565b60008184141561269a575060006124ce565b6001830154608060020a900463ffffffff1615806126c757506001850154608060020a900463ffffffff16155b156126d4575060016124ce565b6001850154608060020a900463ffffffff168214806127035750600185015460a060020a900463ffffffff1682145b15612710575060006124ce565b6001830154608060020a900463ffffffff1684148061273f5750600183015460a060020a900463ffffffff1684145b1561274c575060006124ce565b60018581015490840154608060020a9182900463ffffffff90811692909104161480612797575060018086015490840154608060020a900463ffffffff90811660a060020a90920416145b156127a4575060006124ce565b6001808601549084015460a060020a900463ffffffff908116608060020a9092041614806127ef57506001858101549084015460a060020a9182900463ffffffff9081169290910416145b156127fc575060006124ce565b506001949350505050565b6000806000806000806000600a8881548110151561282157fe5b90600052602060002090600202019650600a8981548110151561284057fe5b600091825260209091206001600290920201818101549189015490975061ffff60d060020a92839004811697509190041685101561288b57600187015460d060020a900461ffff1694505b60175486548854604080517f8d8b1b880000000000000000000000000000000000000000000000000000000081526004810193909352602483019190915251600160a060020a0390921691638d8b1b88916044808201926020929091908290030181600087803b1580156128fe57600080fd5b505af1158015612912573d6000803e3d6000fd5b505050506040513d602081101561292857600080fd5b50519350612935896117ac565b925061294b89898760010161ffff168787612a01565b9150600a8281548110151561295c57fe5b9060005260206000209060020201905061297587613252565b61297e86613252565b61298781613252565b505050505050505050565b600080808085116129a257600080fd5b600084116129af57600080fd5b600a8054869081106129bd57fe5b90600052602060002090600202019150600a848154811015156129dc57fe5b906000526020600020906002020190506129f882868387612688565b95945050505050565b600080612a0c61340d565b600063ffffffff89168914612a2057600080fd5b63ffffffff88168814612a3257600080fd5b61ffff87168714612a4257600080fd5b612a4b86610d94565b1515612a5657600080fd5b600287049250600d8361ffff161115612a6e57600d92505b50506040805160e08101825285815267ffffffffffffffff42811660208301908152600093830184815263ffffffff808d16606086019081528c82166080870190815261ffff808a1660a089019081528e821660c08a01908152600a80546001810182559b52895160028c027fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a881019190915597517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a9909801805497519551945192519151841660d060020a027fffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffff9290941660c060020a0279ffff0000000000000000000000000000000000000000000000001993881660a060020a0277ffffffff000000000000000000000000000000000000000019968916608060020a0273ffffffff0000000000000000000000000000000019988d1668010000000000000000026fffffffffffffffff0000000000000000199c909d1667ffffffffffffffff19909b169a909a179a909a169a909a17959095169690961792909216959095171694909417919091169190911790915590919081168114612c3157600080fd5b6000868152600b602090815260409182902083905560608085015160808087015187518651600160a060020a038d16815295860188905263ffffffff938416868801529216928401929092529082015290517f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad59181900360a00190a1612cb78582613335565b98975050505050505050565b6000806000601260009054906101000a9004600160a060020a0316600160a060020a031663eac9d94c6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015612d1b57600080fd5b505af1158015612d2f573d6000803e3d6000fd5b505050506040513d6020811015612d4557600080fd5b505191506fffffffffffffffffffffffffffffffff82168214612d6757600080fd5b50600281048101662386f26fc10000811015610c1d5750662386f26fc1000092915050565b600080612da185600160a060020a0316613384565b1515612db05760019150612ef0565b6040517f150b7a020000000000000000000000000000000000000000000000000000000081523360048201818152600160a060020a03898116602485015260448401889052608060648501908152875160848601528751918a169463150b7a0294938c938b938b93909160a490910190602085019080838360005b83811015612e43578181015183820152602001612e2b565b50505050905090810190601f168015612e705780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015612e9257600080fd5b505af1158015612ea6573d6000803e3d6000fd5b505050506040513d6020811015612ebc57600080fd5b5051600160e060020a031981167f150b7a020000000000000000000000000000000000000000000000000000000014925090505b50949350505050565b60606000808281851515612f425760408051808201909152600181527f300000000000000000000000000000000000000000000000000000000000000060208201529450612ffb565b8593505b8315612f5d57600190920191600a84049350612f46565b826040519080825280601f01601f191660200182016040528015612f8b578160200160208202803883390190505b5091505060001982015b8515612ff757815160001982019160f860020a6030600a8a060102918491908110612fbc57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a86049550612f95565b8194505b50505050919050565b606080606080606060008088955087945084518651016040519080825280601f01601f191660200182016040528015613047578160200160208202803883390190505b50935083925060009150600090505b85518110156130cc57858181518110151561306d57fe5b90602001015160f860020a900460f860020a02838380600101945081518110151561309457fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101613056565b5060005b84518110156131465784818151811015156130e757fe5b90602001015160f860020a900460f860020a02838380600101945081518110151561310e57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001016130d0565b5090979650505050505050565b81600160a060020a0316613166826117ac565b600160a060020a03161461317957600080fd5b600160a060020a0382166000908152600260205260409020546131a390600163ffffffff6131db16565b600160a060020a0390921660009081526002602090815260408083209490945591815290819052208054600160a060020a0319169055565b600080838311156131eb57600080fd5b5050900390565b6000818152602081815260408083208054600160a060020a031916600160a060020a0387169081179091558352600290915290205461323290600161338c565b600160a060020a0390921660009081526002602052604090209190915550565b6014546001820154439190600c9060c060020a900461ffff16600e811061327557fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff168115156132a057fe5b6001840180546fffffffffffffffff0000000000000000191668010000000000000000939092049390930167ffffffffffffffff16919091021790819055600d60c060020a90910461ffff161015611735576001818101805461ffff60c060020a80830482169094011690920279ffff0000000000000000000000000000000000000000000000001990921691909117905550565b61333f828261339e565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3015550565b6000903b1190565b600082820183811015610e6157600080fd5b6133a8828261263f565b6040518190600160a060020a038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b81548183558181111561340857600083815260209020613408918101908301613449565b505050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b610cbd91905b80821115613463576000815560010161344f565b50905600a165627a7a723058207cc1ac9088c6f0bcdb19cba8d05ec31456cf1d6b9f6925157d63f2c8315e3bbf0029

Swarm Source

bzzr://7cc1ac9088c6f0bcdb19cba8d05ec31456cf1d6b9f6925157d63f2c8315e3bbf

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

OVERVIEW

CryptoFlowers is an internet collectibles game, focused on selecting and discovering new wonderful and beautiful breeds of fancy flowers.

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.