Contract 0xD73bE539d6B2076BaB83CA6Ba62DfE189aBC6Bbe

 
Txn Hash Method
Block
From
To
Value
0x3e439604b5368699f3e97ab793be047561bf6c9193aa5b1954fd9b4a93026332Run Plugin Signe...(pending)2021-06-21 4:27:002 days 6 hrs ago0x3ea2046d251f8962f82225147d2dbdd4c586a15c IN Blockchain Cuties: Old BC Token0 Ether(Pending)(Pending)
0x8d8747a0f4774217dd284205f33f6160bf6199daeca38defd0e71f7dfb963580Create Sale Auct...(pending)2021-06-20 12:44:052 days 22 hrs ago0x637f4ddd22e487932782733acc92cd1e50649c36 IN Blockchain Cuties: Old BC Token0 Ether(Pending)(Pending)
0x0353d8dceacbe3bd4c4eabe5c96aacf0f9289188bb3fe4a95e480226bcee636cTransfer(pending)2021-06-20 11:45:252 days 23 hrs ago0x3cc5d3f2d9b2f17070b39022fffbf1b277f2d722 IN Blockchain Cuties: Old BC Token0 Ether(Pending)(Pending)
0x797aa4fe0d30e1da0b087d1a5fe5d3c84d99b2879ebdf7547272887628b99341Create Sale Auct...(pending)2021-06-20 6:53:383 days 3 hrs ago0x3d079971b5a69d23c1658d329fd4d41f82208f5f IN Blockchain Cuties: Old BC Token0 Ether(Pending)(Pending)
0xc84bf8fa4ba210958df73626a2f596047458cd6f0ee4fa5ca7e5b7a578476b84Run Plugin Signe...(pending)2021-06-20 5:56:293 days 4 hrs ago0x3ea2046d251f8962f82225147d2dbdd4c586a15c IN Blockchain Cuties: Old BC Token0 Ether(Pending)(Pending)
0xdb1cb9aaf43b7da7f9c000e811b1eac291f1aa2e9094d0cba151134618397d7eBreed With(pending)2021-06-20 5:56:223 days 4 hrs ago0x4f649670a7ccda1b703505482e35cb67bb83d1fc IN Blockchain Cuties: Old BC Token0 Ether(Pending)(Pending)
0x4e62dd4e8eb0bfcaf51cb75253b41268ea60035c061c3f6c135fe042448970aeBreed With(pending)2021-06-20 5:49:093 days 4 hrs ago0x89107d33521ae41d145107895fc6a73d7109cbbf IN Blockchain Cuties: Old BC Token0.001012 Ether(Pending)(Pending)
0x62406de748156301b60dee811c0f47f7f15be9f269c12241052f12cf90571cd6Create Sale Auct...(pending)2021-06-20 5:39:123 days 5 hrs ago0x56c7f1aebda40980f2eea75a1d515221e4bb3875 IN Blockchain Cuties: Old BC Token0 Ether(Pending)(Pending)
0x90561a4b0321bf65f2e98512d5a61c891baf1ee5f1627beb251d29c5c4773379Breed With(pending)2021-06-20 3:16:593 days 7 hrs ago0xa787b93506ea7fb3e721cd24dd439b024afd634a IN Blockchain Cuties: Old BC Token0.0013 Ether(Pending)(Pending)
0x88da71462c7eb2836105983560ceb735e09c4277cae5ddba06494152e47f1bd7Transfer(pending)2021-06-20 1:13:143 days 9 hrs ago0xe0cc7eed086910ff2041f86c04850a90409b7604 IN Blockchain Cuties: Old BC Token0 Ether(Pending)(Pending)
0x946e7a0a2fd0a066ea8dca478b96fdb76771fa7480d8d08ca396172e86caa5cdTransfer126653872021-06-19 14:40:563 days 20 hrs ago0x6c757bd6d0498d74bdafdd1af96b481b8483f0d0 IN  Blockchain Cuties: Old BC Token0 Ether0.00089866818
0xce6e62023800b5b11394a974008b3518ad5f3095a4dc0c3256e562954d5cbd18Transfer126468122021-06-16 17:18:506 days 17 hrs ago0xd4217127ff704f3b679cf1744b6a50a5e8de4b4b IN  Blockchain Cuties: Old BC Token0 Ether0.00104869821
0x2d90a78ba73ebfc1aad79679370ad8e5768d4d57ba149797da51fa4f960ac12dTransfer126389692021-06-15 12:11:177 days 22 hrs ago0xb12a13c4ef3a0d74f48646fda2c04e1d20968aef IN  Blockchain Cuties: Old BC Token0 Ether0.0004783810
0xc41c8bd32b9b61b5cb388caa4de4e2ba9497bb2be375eff872fda05f6cafa052Set Approval For...126269772021-06-13 15:37:159 days 19 hrs ago0x89c42deef141086e58fdb02fbd4b875419986735 IN  Blockchain Cuties: Old BC Token0 Ether0.000689320814.55
0x2d6f962d9988a3ed5becb481a027e3690b78c38032fe90c1324341c4d7984c90Create Sale Auct...126263302021-06-13 13:11:459 days 21 hrs ago0xf1a45fd48e6ca1078375f9a3c3895944f035a8dc IN  Blockchain Cuties: Old BC Token0 Ether0.0005851755
0x959f4880b6125c179eabfcbf4d669f9355bb3f0bfc7d0778a7a04a0da861740dTransfer126156552021-06-11 21:32:2311 days 13 hrs ago0x959059957332a9171543b6929c0e6a118e2a2b9c IN  Blockchain Cuties: Old BC Token0 Ether0.00105081632
0x537622a6da8fb2983ba79bf401b6dffb929b6e248948797d3c4e1936e3d8e31fTransfer126005242021-06-09 13:12:3613 days 21 hrs ago0x49a0838b4d653afb6b38c221272a217d95811170 IN  Blockchain Cuties: Old BC Token0 Ether0.0003283810
0x1292a7b29f70cad430d7f184fc8d219bb4c9aaec99ef7ba7f7c8f47cb36fe340Set Approval For...125908762021-06-08 1:15:2215 days 9 hrs ago0x38db9216e6250e36dda24b0b641e42e3cdba6ed4 IN  Blockchain Cuties: Old BC Token0 Ether0.000715377615.1
0xc9dec3b175883f0745aeec1dd28117d9b5544871fb005c8a15a57c0bd5847254Transfer125831282021-06-06 20:29:3816 days 14 hrs ago0xeab9f058391b5feace7100edcede0516275255b9 IN  Blockchain Cuties: Old BC Token0 Ether0.00041341515
0x791934c48ea2ab7210440e324edabffe30609844d9a6c738f7e5deffc394712dCreate Sale Auct...125805942021-06-06 11:08:2116 days 23 hrs ago0x972cf7a2e832cf2a627f65b80779236a572f2d28 IN  Blockchain Cuties: Old BC Token0 Ether0.0002210
0xc769c4fb076b456ab8b3c068bed55f8767f52fee85bbdbb69de94995bc071c91Set Approval For...125531272021-06-02 5:22:4121 days 5 hrs ago0x8c2b58db0b9de5383023165110b49097dc2f77d4 IN  Blockchain Cuties: Old BC Token0 Ether0.0009475220
0xc257c94f7c36456474e6c90e6d40d3c066026ce314c549cbda132d17bf542b38Transfer124994092021-05-24 21:14:2829 days 13 hrs ago0x17a5f28b37427528f3ef27add6ba64634b01961f IN  Blockchain Cuties: Old BC Token0 Ether0.003115382462.4
0xc1819c64104349bf5a215c10b0e8f0f344e23cdde9d7431e14e7e59ee216b432Set Metadata Url123831012021-05-06 21:13:3747 days 13 hrs agoBC: Deployer IN  Blockchain Cuties: Old BC Token0 Ether0.00347109474.8
0xe4bdd83b4957088ac7faa24a231d64c5de70cd91fbdb691dd67167f5142ea547Transfer123535532021-05-02 7:54:3952 days 2 hrs ago0x77eae619d31a65757c8befad86b380b6be3e753a IN  Blockchain Cuties: Old BC Token0 Ether0.00071814626
0x1df420c4233de2daceba15b44baf4e7933183c5c8a6dd0a865d9ad95f7d67df8Transfer123535352021-05-02 7:50:5652 days 2 hrs ago0x77eae619d31a65757c8befad86b380b6be3e753a IN  Blockchain Cuties: Old BC Token0 Ether0.00052824
[ Download CSV Export 

OVERVIEW

Collectible crypto game with adventures where you get to play with puppies, lizards, bear cubs, cats and other real and fantasy creatures alike. Each cutie, which is an ERC-721 token.

Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xa85277b058517241a853ee634543661cbe4fbf6a31a35ebdfd892fb7d035f8f2123826072021-05-06 19:21:1847 days 15 hrs ago 0x338ffc2cafc121bc83bf7a610ccc136ba7247b64 Blockchain Cuties: Old BC Token0.793146928589675797 Ether
0xcd3e4ae5a6a980f45e2ac8e300f7438247c1314e1bfe9e9672539cc8f6fb53eb122956892021-04-23 9:31:5361 days 1 hr ago Blockchain Cuties: Old BC Token 0x338ffc2cafc121bc83bf7a610ccc136ba7247b640.01 Ether
0x1837ec3ddb2a84b1d313d1749431ee171bc09935ca22657b7b60fee5fda4376d122022762021-04-08 23:58:0275 days 10 hrs ago Blockchain Cuties: Old BC Token 0x338ffc2cafc121bc83bf7a610ccc136ba7247b640.03 Ether
0xc0e9560ed0fc44bc078160a0f5c11135063fdb34e3a74366133d53436fa705c9121869552021-04-06 15:23:1977 days 19 hrs ago Blockchain Cuties: Old BC Token 0x338ffc2cafc121bc83bf7a610ccc136ba7247b640.03 Ether
0x10cb4b311e395e050d7b0d69a8b16e3a53adbb9846d2aff524d8815bb1fc3d90120450652021-03-15 19:28:3899 days 15 hrs ago Blockchain Cuties: Old BC Token 0x338ffc2cafc121bc83bf7a610ccc136ba7247b640.03 Ether
0x4d32e863e068d61e9d7790cd697bffff81d29c35256787913a10fc52601f9b3a120450652021-03-15 19:28:3899 days 15 hrs ago Blockchain Cuties: Old BC Token 0x338ffc2cafc121bc83bf7a610ccc136ba7247b640.03 Ether
0x2022b5068c72482a1dd060aca60828f3d4f82863c52ae9f8b8174648ef3ef280120450652021-03-15 19:28:3899 days 15 hrs ago Blockchain Cuties: Old BC Token 0x338ffc2cafc121bc83bf7a610ccc136ba7247b640.03 Ether
0x2ddc6345b4333fce43288c16661e433cc33f9042b2a6063102b763214aaea795114767712020-12-18 10:54:53186 days 23 hrs ago Blockchain Cuties: Old BC Token 0x338ffc2cafc121bc83bf7a610ccc136ba7247b640.03 Ether
0x47658f17d8eb4c10f6e9fa602c188632aa47b82b743a121f50ab176539e2686d114349572020-12-12 0:47:34193 days 10 hrs ago Blockchain Cuties: Old BC Token 0x338ffc2cafc121bc83bf7a610ccc136ba7247b640.03 Ether
0x602bcefb4ee69c347ea93dd38f21d8d6cb145a658fee207018be3dd86091591f111882662020-11-04 3:32:04231 days 7 hrs ago Blockchain Cuties: Old BC Token BC: Breeding Market0.003 Ether
0xa73cc7d66bea951a5d8539a44a77b5af126acb0b3a34e0f11ca8c3cfc424eaa3111881432020-11-04 3:04:42231 days 7 hrs ago Blockchain Cuties: Old BC Token BC: Breeding Market0.01 Ether
0x9bd18560a57b82df09a637d4c34400296334e7ae74f950d7a69203bc16eab784111869942020-11-03 22:50:48231 days 11 hrs ago 0xb3651c39430d995547a27d6fa88997ca2b3a1eee Blockchain Cuties: Old BC Token0.001192 Ether
0xf3a63c423fa98a93ec84644b70619caee551c2ea49e1c1576def556d3e320c0d111822232020-11-03 5:10:10232 days 5 hrs ago Blockchain Cuties: Old BC Token BC: Breeding Market0.005 Ether
0x94fdb87115ce7f4122328701ad8836ac7e61f49f026e44294684b6a9525dacd4111812242020-11-03 1:31:56232 days 9 hrs ago 0xb3651c39430d995547a27d6fa88997ca2b3a1eee Blockchain Cuties: Old BC Token0.001108 Ether
0x889887e73de1d4be91e029571c8374d401b78891c1a1c9143dda88c6984478bb111763522020-11-02 7:42:22233 days 3 hrs ago 0xb3651c39430d995547a27d6fa88997ca2b3a1eee Blockchain Cuties: Old BC Token0.001048 Ether
0x837f6f1e81a37436918aee2816231a3256df6df143ce12d7729674d6462f7b3d111754542020-11-02 4:26:06233 days 6 hrs ago Blockchain Cuties: Old BC Token BC: Breeding Market0.006 Ether
0x5ca422ffbe31ed4e036e6c70ef6474755011fb3475f0626d5e72898f6872e8df111737322020-11-01 21:55:00233 days 12 hrs ago Blockchain Cuties: Old BC Token BC: Breeding Market0.001 Ether
0x5ca422ffbe31ed4e036e6c70ef6474755011fb3475f0626d5e72898f6872e8df111737322020-11-01 21:55:00233 days 12 hrs ago 0xb3651c39430d995547a27d6fa88997ca2b3a1eee Blockchain Cuties: Old BC Token0.002027 Ether
0x945ac50fa6ad6def4092a0471401a12b73a4ffb6f6b956114bc5d2a07a41f217111732612020-11-01 20:09:12233 days 14 hrs ago 0xb3651c39430d995547a27d6fa88997ca2b3a1eee Blockchain Cuties: Old BC Token0.001003 Ether
0xe757d390faefa293bc157f421da13c0104e8b830f0ae00fab6e7f9f51f163af2111731912020-11-01 19:53:16233 days 14 hrs ago Blockchain Cuties: Old BC Token BC: Breeding Market0.0065 Ether
0xe757d390faefa293bc157f421da13c0104e8b830f0ae00fab6e7f9f51f163af2111731912020-11-01 19:53:16233 days 14 hrs ago 0xb3651c39430d995547a27d6fa88997ca2b3a1eee Blockchain Cuties: Old BC Token0.007503 Ether
0x3551dc504e9cc094a004bbd2f836c60b379cff9c37d950aee38169b21187836b111664012020-10-31 18:51:23234 days 15 hrs ago Blockchain Cuties: Old BC Token BC: Breeding Market0.002 Ether
0x5e807c73c887ec38465b798945e991ae33e777e4ac6a2116fb6003a66e339b41111280452020-10-25 21:36:23240 days 13 hrs ago 0x3f3f8cf5da801156f31b59635e314af3080ebc72 Blockchain Cuties: Old BC Token0.001 Ether
0x1d3dfcae2adfbc58f222ef5d7e73f6a057a1a62ed916528c8711dc78c0f37d23111173282020-10-24 5:59:45242 days 4 hrs ago Blockchain Cuties: Old BC Token BC: Breeding Market0.002 Ether
0xd97845ba3e00fd140506934b4e626ef18cacb80c06e166d01d13fb9cd0a19587110561392020-10-14 21:03:40251 days 13 hrs ago Blockchain Cuties: Old BC Token BC: Breeding Market0.001 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BlockchainCutiesCore

Compiler Version
v0.4.21+commit.dfe3193c

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-04-25
*/

pragma solidity ^0.4.20;

/// BlockchainCuties: Collectible and breedable cuties on the Ethereum blockchain.
/// https://blockchaincuties.co/


/// @title defined the interface that will be referenced in main Cutie contract
contract GeneMixerInterface {
    /// @dev simply a boolean to indicate this is the contract we expect to be
    function isGeneMixer() external pure returns (bool);

    /// @dev given genes of cutie 1 & 2, return a genetic combination - may have a random factor
    /// @param genes1 genes of mom
    /// @param genes2 genes of dad
    /// @return the genes that are supposed to be passed down the child
    function mixGenes(uint256 genes1, uint256 genes2) public view returns (uint256);

    function canBreed(uint40 momId, uint256 genes1, uint40 dadId, uint256 genes2) public view returns (bool);
}



/// @author https://BlockChainArchitect.iocontract Bank is CutiePluginBase
contract PluginInterface
{
    /// @dev simply a boolean to indicate this is the contract we expect to be
    function isPluginInterface() public pure returns (bool);

    function onRemove() public;

    /// @dev Begins new feature.
    /// @param _cutieId - ID of token to auction, sender must be owner.
    /// @param _parameter - arbitrary parameter
    /// @param _seller - Old owner, if not the message sender
    function run(
        uint40 _cutieId,
        uint256 _parameter,
        address _seller
    ) 
    public
    payable;

    /// @dev Begins new feature, approved and signed by COO.
    /// @param _cutieId - ID of token to auction, sender must be owner.
    /// @param _parameter - arbitrary parameter
    function runSigned(
        uint40 _cutieId,
        uint256 _parameter,
        address _owner
    )
    external
    payable;

    function withdraw() public;
}



/// @title Auction Market for Blockchain Cuties.
/// @author https://BlockChainArchitect.io
contract MarketInterface 
{
    function withdrawEthFromBalance() external;    

    function createAuction(uint40 _cutieId, uint128 _startPrice, uint128 _endPrice, uint40 _duration, address _seller) public payable;

    function bid(uint40 _cutieId) public payable;

    function cancelActiveAuctionWhenPaused(uint40 _cutieId) public;

	function getAuctionInfo(uint40 _cutieId)
        public
        view
        returns
    (
        address seller,
        uint128 startPrice,
        uint128 endPrice,
        uint40 duration,
        uint40 startedAt,
        uint128 featuringFee
    );
}



/// @title BlockchainCuties: Collectible and breedable cuties on the Ethereum blockchain.
/// @author https://BlockChainArchitect.io
/// @dev This is the BlockchainCuties configuration. It can be changed redeploying another version.
contract ConfigInterface
{
    function isConfig() public pure returns (bool);

    function getCooldownIndexFromGeneration(uint16 _generation) public view returns (uint16);
    
    function getCooldownEndTimeFromIndex(uint16 _cooldownIndex) public view returns (uint40);

    function getCooldownIndexCount() public view returns (uint256);
    
    function getBabyGen(uint16 _momGen, uint16 _dadGen) public pure returns (uint16);

    function getTutorialBabyGen(uint16 _dadGen) public pure returns (uint16);

    function getBreedingFee(uint40 _momId, uint40 _dadId) public pure returns (uint256);
}



/// @dev Note: the ERC-165 identifier for this interface is 0xf0b9e5ba
interface ERC721TokenReceiver {
    /// @notice Handle the receipt of an NFT
    /// @dev The ERC721 smart contract calls this function on the recipient
    ///  after a `transfer`. 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,uint256,bytes)"))`
    ///  unless throwing
    function onERC721Received(address _from, uint256 _tokenId, bytes data) external returns(bytes4);
}


/// @title BlockchainCuties: Collectible and breedable cuties on the Ethereum blockchain.
/// @author https://BlockChainArchitect.io
/// @dev This is the main BlockchainCuties contract. For separated logical sections the code is divided in 
// several separately-instantiated sibling contracts that handle auctions and the genetic combination algorithm. 
// By keeping auctions separate it is possible to upgrade them without disrupting the main contract that tracks
// the ownership of the cutie. The genetic combination algorithm is kept separate so that all of the rest of the 
// code can be open-sourced.
// The contracts:
//
//      - BlockchainCuties: The fundamental code, including main data storage, constants and data types, as well as
//             internal functions for managing these items ans ERC-721 implementation.
//             Various addresses and constraints for operations can be executed only by specific roles - 
//             Owner, Operator and Parties.
//             Methods for interacting with additional features (Plugins).
//             The methods for breeding and keeping track of breeding offers, relies on external genetic combination 
//             contract.
//             Public methods for auctioning or bidding or breeding. 
//
//      - SaleMarket and BreedingMarket: The actual auction functionality is handled in two sibling contracts - one
//             for sales and one for breeding. Auction creation and bidding is mostly mediated through this side of 
//             the core contract.
//
//      - Effects: Contracts allow to use item effects on cuties, implemented as plugins. Items are not stored in 
//             blockchain to not overload Ethereum network. Operator generates signatures, and Plugins check it
//             and perform effect.
//
//      - ItemMarket: Plugin contract used to transfer money from buyer to seller.
//
//      - Bank: Plugin contract used to receive payments for payed features.

contract BlockchainCutiesCore /*is ERC721, CutieCoreInterface*/
{
    /// @notice A descriptive name for a collection of NFTs in this contract
    function name() external pure returns (string _name) 
    {
        return "BlockchainCuties"; 
    }

    /// @notice An abbreviated name for NFTs in this contract
    function symbol() external pure returns (string _symbol)
    {
        return "BC";
    }
    
    /// @notice Query if a contract implements an interface
    /// @param interfaceID The interface identifier, as specified in ERC-165
    /// @dev Interface identification is specified in ERC-165. This function
    ///  uses less than 30,000 gas.
    /// @return `true` if the contract implements `interfaceID` and
    ///  `interfaceID` is not 0xffffffff, `false` otherwise
    function supportsInterface(bytes4 interfaceID) external pure returns (bool)
    {
        return
            interfaceID == 0x6466353c || 
            interfaceID == bytes4(keccak256('supportsInterface(bytes4)'));
    }

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

    /// @dev The Birth event is fired as soon as a new cutie is created. This
    ///  is any time a cutie comes into existence through the giveBirth method, as well as
    ///  when a new gen0 cutie is created.
    event Birth(address indexed owner, uint40 cutieId, uint40 momId, uint40 dadId, uint256 genes);

    /// @dev This struct represents a blockchain Cutie. It was ensured that struct fits well into
    ///  exactly two 256-bit words. The order of the members in this structure
    ///  matters because of the Ethereum byte-packing rules.
    ///  Reference: http://solidity.readthedocs.io/en/develop/miscellaneous.html
    struct Cutie
    {
        // The Cutie's genetic code is in these 256-bits. Cutie's genes never change.
        uint256 genes;

        // The timestamp from the block when this cutie was created.
        uint40 birthTime;

        // The minimum timestamp after which the cutie can start breeding
        // again.
        uint40 cooldownEndTime;

        // The cutie's parents ID is set to 0 for gen0 cuties.
        // Because of using 32-bit unsigned integers the limit is 4 billion cuties. 
        // Current Ethereum annual limit is about 500 million transactions.
        uint40 momId;
        uint40 dadId;

        // Set the index in the cooldown array (see below) that means
        // the current cooldown duration for this Cutie. Starts at 0
        // for gen0 cats, and is initialized to floor(generation/2) for others.
        // Incremented by one for each successful breeding, regardless
        // of being cutie mom or cutie dad.
        uint16 cooldownIndex;

        // The "generation number" of the cutie. Cutioes minted by the contract
        // for sale are called "gen0" with generation number of 0. All other cuties' 
        // generation number is the larger of their parents' two generation
        // numbers, plus one (i.e. max(mom.generation, dad.generation) + 1)
        uint16 generation;

        // Some optional data used by external contracts
        // Cutie struct is 2x256 bits long.
        uint64 optional;
    }

    /// @dev An array containing the Cutie struct for all Cuties in existence. The ID
    ///  of each cutie is actually an index into this array. ID 0 is the parent 
    /// of all generation 0 cats, and both parents to itself. It is an invalid genetic code.
    Cutie[] public cuties;

    /// @dev A mapping from cutie IDs to the address that owns them. All cuties have
    ///  some valid owner address, even gen0 cuties are created with a non-zero owner.
    mapping (uint40 => address) public cutieIndexToOwner;

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

    /// @dev A mapping from CutieIDs to an address that has been approved to call
    ///  transferFrom(). A Cutie can have one approved address for transfer
    ///  at any time. A zero value means that there is no outstanding approval.
    mapping (uint40 => address) public cutieIndexToApproved;

    /// @dev A mapping from CutieIDs to an address that has been approved to use
    ///  this Cutie for breeding via breedWith(). A Cutie can have one approved
    ///  address for breeding at any time. A zero value means that there is no outstanding approval.
    mapping (uint40 => address) public sireAllowedToAddress;


    /// @dev The address of the Market contract used to sell cuties. This
    ///  contract used both peer-to-peer sales and the gen0 sales that are
    ///  initiated each 15 minutes.
    MarketInterface public saleMarket;

    /// @dev The address of a custom Market subclassed contract used for breeding
    ///  auctions. Is to be separated from saleMarket as the actions taken on success
    ///  after a sales and breeding auction are quite different.
    MarketInterface public breedingMarket;


    // Modifiers to check that inputs can be safely stored with a certain
    // number of bits.
    modifier canBeStoredIn40Bits(uint256 _value) {
        require(_value <= 0xFFFFFFFFFF);
        _;
    }    

    /// @notice Returns the total number of Cuties in existence.
    /// @dev Required for ERC-721 compliance.
    function totalSupply() external view returns (uint256)
    {
        return cuties.length - 1;
    }

    /// @notice Returns the total number of Cuties in existence.
    /// @dev Required for ERC-721 compliance.
    function _totalSupply() internal view returns (uint256)
    {
        return cuties.length - 1;
    }
    
    // Internal utility functions assume that their input arguments
    // are valid. Public methods sanitize their inputs and follow
    // the required logic.

    /// @dev Checks if a given address is the current owner of a certain Cutie.
    /// @param _claimant the address we are validating against.
    /// @param _cutieId cutie id, only valid when > 0
    function _isOwner(address _claimant, uint40 _cutieId) internal view returns (bool)
    {
        return cutieIndexToOwner[_cutieId] == _claimant;
    }

    /// @dev Checks if a given address currently has transferApproval for a certain Cutie.
    /// @param _claimant the address we are confirming the cutie is approved for.
    /// @param _cutieId cutie id, only valid when > 0
    function _approvedFor(address _claimant, uint40 _cutieId) internal view returns (bool)
    {
        return cutieIndexToApproved[_cutieId] == _claimant;
    }

    /// @dev Marks an address as being approved for transferFrom(), overwriting any previous
    ///  approval. Setting _approved to address(0) clears all transfer approval.
    ///  NOTE: _approve() does NOT send the Approval event. This is done on purpose:
    ///  _approve() and transferFrom() are used together for putting Cuties on auction. 
    ///  There is no value in spamming the log with Approval events in that case.
    function _approve(uint40 _cutieId, address _approved) internal
    {
        cutieIndexToApproved[_cutieId] = _approved;
    }

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

    /// @notice Transfers a Cutie to another address. When transferring to a smart
    ///  contract, ensure that it is aware of ERC-721 (or
    ///  BlockchainCuties specifically), otherwise the Cutie may be lost forever.
    /// @param _to The address of the recipient, can be a user or contract.
    /// @param _cutieId The ID of the Cutie to transfer.
    /// @dev Required for ERC-721 compliance.
    function transfer(address _to, uint256 _cutieId) external whenNotPaused canBeStoredIn40Bits(_cutieId)
    {
        // You can only send your own cutie.
        require(_isOwner(msg.sender, uint40(_cutieId)));

        // Reassign ownership, clear pending approvals, emit Transfer event.
        _transfer(msg.sender, _to, uint40(_cutieId));
    }

    /// @notice Grant another address the right to transfer a perticular Cutie via transferFrom().
    /// This flow is preferred for transferring NFTs to contracts.
    /// @param _to The address to be granted transfer approval. Pass address(0) to clear all approvals.
    /// @param _cutieId The ID of the Cutie that can be transferred if this call succeeds.
    /// @dev Required for ERC-721 compliance.
    function approve(address _to, uint256 _cutieId) external whenNotPaused canBeStoredIn40Bits(_cutieId)
    {
        // Only cutie's owner can grant transfer approval.
        require(_isOwner(msg.sender, uint40(_cutieId)));

        // Registering approval replaces any previous approval.
        _approve(uint40(_cutieId), _to);

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

    /// @notice Transfers the ownership of an NFT from one address to another address.
    /// @dev Throws unless `msg.sender` is the current owner, an authorized
    ///  operator, or the approved address for this NFT. Throws if `_from` is
    ///  not the current owner. Throws if `_to` is the zero address. Throws if
    ///  `_tokenId` is not a valid NFT. When transfer is complete, this function
    ///  checks if `_to` is a smart contract (code size > 0). If so, it calls
    ///  `onERC721Received` on `_to` and throws if the return value is not
    ///  `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`.
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    /// @param data Additional data with no specified format, sent in call to `_to`
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) 
        external whenNotPaused canBeStoredIn40Bits(_tokenId)
    {
        require(_to != address(0));
        require(_to != address(this));
        require(_to != address(saleMarket));
        require(_to != address(breedingMarket));
       
        // Check for approval and valid ownership
        require(_approvedFor(msg.sender, uint40(_tokenId)) || _isApprovedForAll(_from, msg.sender));
        require(_isOwner(_from, uint40(_tokenId)));

        // Reassign ownership, clearing pending approvals and emitting Transfer event.
        _transfer(_from, _to, uint40(_tokenId));
        ERC721TokenReceiver (_to).onERC721Received(_from, _tokenId, data);
    }

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev This works identically to the other function with an extra data parameter,
    ///  except this function just sets data to ""
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) 
        external whenNotPaused canBeStoredIn40Bits(_tokenId)
    {
        require(_to != address(0));
        require(_to != address(this));
        require(_to != address(saleMarket));
        require(_to != address(breedingMarket));
       
        // Check for approval and valid ownership
        require(_approvedFor(msg.sender, uint40(_tokenId)) || _isApprovedForAll(_from, msg.sender));
        require(_isOwner(_from, uint40(_tokenId)));

        // Reassign ownership, clearing pending approvals and emitting Transfer event.
        _transfer(_from, _to, uint40(_tokenId));
    }

    /// @notice Transfer a Cutie owned by another address, for which the calling address
    ///  has been granted transfer approval by the owner.
    /// @param _from The address that owns the Cutie to be transfered.
    /// @param _to Any address, including the caller address, can take ownership of the Cutie.
    /// @param _tokenId The ID of the Cutie to be transferred.
    /// @dev Required for ERC-721 compliance.
    function transferFrom(address _from, address _to, uint256 _tokenId) 
        external whenNotPaused canBeStoredIn40Bits(_tokenId) 
    {
        // Check for approval and valid ownership
        require(_approvedFor(msg.sender, uint40(_tokenId)) || _isApprovedForAll(_from, msg.sender));
        require(_isOwner(_from, uint40(_tokenId)));

        // Reassign ownership, clearing pending approvals and emitting Transfer event.
        _transfer(_from, _to, uint40(_tokenId));
    }

    /// @notice Returns the address currently assigned ownership of a given Cutie.
    /// @dev Required for ERC-721 compliance.
    function ownerOf(uint256 _cutieId)
        external
        view
        canBeStoredIn40Bits(_cutieId)
        returns (address owner)
    {
        owner = cutieIndexToOwner[uint40(_cutieId)];

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

    /// @notice Returns the nth Cutie assigned to an address, with n specified by the
    ///  _index argument.
    /// @param _owner The owner of the Cuties we are interested in.
    /// @param _index The zero-based index of the cutie within the owner's list of cuties.
    ///  Must be less than balanceOf(_owner).
    /// @dev This method must not be called by smart contract code. It will almost
    ///  certainly blow past the block gas limit once there are a large number of
    ///  Cuties in existence. Exists only to allow off-chain queries of ownership.
    ///  Optional method for ERC-721.
    function tokenOfOwnerByIndex(address _owner, uint256 _index)
        external
        view
        returns (uint256 cutieId)
    {
        uint40 count = 0;
        for (uint40 i = 1; i <= _totalSupply(); ++i) {
            if (cutieIndexToOwner[i] == _owner) {
                if (count == _index) {
                    return i;
                } else {
                    count++;
                }
            }
        }
        revert();
    }

    /// @notice Enumerate valid NFTs
    /// @dev Throws if `_index` >= `totalSupply()`.
    /// @param _index A counter less than `totalSupply()`
    /// @return The token identifier for the `_index`th NFT,
    ///  (sort order not specified)
    function tokenByIndex(uint256 _index) external pure returns (uint256)
    {
        return _index;
    }

    /// @dev A mapping from Cuties owner (account) to an address that has been approved to call
    ///  transferFrom() for all cuties, owned by owner.
    ///  Only one approved address is permitted for each account for transfer
    ///  at any time. A zero value means there is no outstanding approval.
    mapping (address => address) public addressToApprovedAll;

    /// @notice Enable or disable approval for a third party ("operator") to manage
    ///  all your asset.
    /// @dev Emits the ApprovalForAll event
    /// @param _operator Address to add to the set of authorized operators.
    /// @param _approved True if the operators is approved, false to revoke approval
    function setApprovalForAll(address _operator, bool _approved) external
    {
        if (_approved)
        {
            addressToApprovedAll[msg.sender] = _operator;
        }
        else
        {
            delete addressToApprovedAll[msg.sender];
        }
        emit ApprovalForAll(msg.sender, _operator, _approved);
    }

    /// @notice Get the approved address for a single NFT
    /// @dev Throws if `_tokenId` is not a valid NFT
    /// @param _tokenId The NFT to find the approved address for
    /// @return The approved address for this NFT, or the zero address if there is none
    function getApproved(uint256 _tokenId) 
        external view canBeStoredIn40Bits(_tokenId) 
        returns (address)
    {
        require(_tokenId <= _totalSupply());

        if (cutieIndexToApproved[uint40(_tokenId)] != address(0))
        {
            return cutieIndexToApproved[uint40(_tokenId)];
        }

        address owner = cutieIndexToOwner[uint40(_tokenId)];
        return addressToApprovedAll[owner];
    }

    /// @notice Query if an address is an authorized operator for another address
    /// @param _owner The address that owns the NFTs
    /// @param _operator The address that acts on behalf of the owner
    /// @return True if `_operator` is an approved operator for `_owner`, false otherwise
    function isApprovedForAll(address _owner, address _operator) external view returns (bool)
    {
        return addressToApprovedAll[_owner] == _operator;
    }

    function _isApprovedForAll(address _owner, address _operator) internal view returns (bool)
    {
        return addressToApprovedAll[_owner] == _operator;
    }

    ConfigInterface public config;

    /// @dev Update the address of the config contract.
    /// @param _address An address of a ConfigInterface contract instance to be used from this point forward.
    function setConfigAddress(address _address) public onlyOwner
    {
        ConfigInterface candidateContract = ConfigInterface(_address);

        require(candidateContract.isConfig());

        // Set the new contract address
        config = candidateContract;
    }

    function getCooldownIndexFromGeneration(uint16 _generation) internal view returns (uint16)
    {
        return config.getCooldownIndexFromGeneration(_generation);
    }

    /// @dev An internal method that creates a new cutie and stores it. This
    ///  method does not check anything and should only be called when the
    ///  input data is valid for sure. Will generate both a Birth event
    ///  and a Transfer event.
    /// @param _momId The cutie ID of the mom of this cutie (zero for gen0)
    /// @param _dadId The cutie ID of the dad of this cutie (zero for gen0)
    /// @param _generation The generation number of this cutie, must be computed by caller.
    /// @param _genes The cutie's genetic code.
    /// @param _owner The initial owner of this cutie, must be non-zero (except for the unCutie, ID 0)
    function _createCutie(
        uint40 _momId,
        uint40 _dadId,
        uint16 _generation,
        uint16 _cooldownIndex,
        uint256 _genes,
        address _owner,
        uint40 _birthTime
    )
        internal
        returns (uint40)
    {
        Cutie memory _cutie = Cutie({
            genes: _genes, 
            birthTime: _birthTime, 
            cooldownEndTime: 0, 
            momId: _momId, 
            dadId: _dadId, 
            cooldownIndex: _cooldownIndex, 
            generation: _generation,
            optional: 0
        });
        uint256 newCutieId256 = cuties.push(_cutie) - 1;

        // Check if id can fit into 40 bits
        require(newCutieId256 <= 0xFFFFFFFFFF);

        uint40 newCutieId = uint40(newCutieId256);

        // emit the birth event
        emit Birth(_owner, newCutieId, _cutie.momId, _cutie.dadId, _cutie.genes);

        // This will assign ownership, as well as emit the Transfer event as
        // per ERC721 draft
        _transfer(0, _owner, newCutieId);

        return newCutieId;
    }
  
    /// @notice Returns all the relevant information about a certain cutie.
    /// @param _id The ID of the cutie of interest.
    function getCutie(uint40 _id)
        external
        view
        returns (
        uint256 genes,
        uint40 birthTime,
        uint40 cooldownEndTime,
        uint40 momId,
        uint40 dadId,
        uint16 cooldownIndex,
        uint16 generation
    ) {
        Cutie storage cutie = cuties[_id];

        genes = cutie.genes;
        birthTime = cutie.birthTime;
        cooldownEndTime = cutie.cooldownEndTime;
        momId = cutie.momId;
        dadId = cutie.dadId;
        cooldownIndex = cutie.cooldownIndex;
        generation = cutie.generation;
    }    
    
    /// @dev Assigns ownership of a particular Cutie to an address.
    function _transfer(address _from, address _to, uint40 _cutieId) internal {
        // since the number of cuties is capped to 2^40
        // there is no way to overflow this
        ownershipTokenCount[_to]++;
        // transfer ownership
        cutieIndexToOwner[_cutieId] = _to;
        // When creating new cuties _from is 0x0, but we cannot account that address.
        if (_from != address(0)) {
            ownershipTokenCount[_from]--;
            // once the cutie is transferred also clear breeding allowances
            delete sireAllowedToAddress[_cutieId];
            // clear any previously approved ownership exchange
            delete cutieIndexToApproved[_cutieId];
        }
        // Emit the transfer event.
        emit Transfer(_from, _to, _cutieId);
    }

    /// @dev For transferring a cutie owned by this contract to the specified address.
    ///  Used to rescue lost cuties. (There is no "proper" flow where this contract
    ///  should be the owner of any Cutie. This function exists for us to reassign
    ///  the ownership of Cuties that users may have accidentally sent to our address.)
    /// @param _cutieId - ID of cutie
    /// @param _recipient - Address to send the cutie to
    function restoreCutieToAddress(uint40 _cutieId, address _recipient) public onlyOperator whenNotPaused {
        require(_isOwner(this, _cutieId));
        _transfer(this, _recipient, _cutieId);
    }

    address ownerAddress;
    address operatorAddress;

    bool public paused = false;

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

    function setOwner(address _newOwner) public onlyOwner
    {
        require(_newOwner != address(0));

        ownerAddress = _newOwner;
    }

    modifier onlyOperator() {
        require(msg.sender == operatorAddress || msg.sender == ownerAddress);
        _;
    }

    function setOperator(address _newOperator) public onlyOwner {
        require(_newOperator != address(0));

        operatorAddress = _newOperator;
    }

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

    modifier whenPaused
    {
        require(paused);
        _;
    }

    function pause() public onlyOwner whenNotPaused
    {
        paused = true;
    }

    string public metadataUrlPrefix = "https://blockchaincuties.co/cutie/";
    string public metadataUrlSuffix = ".svg";

    /// @notice A distinct Uniform Resource Identifier (URI) for a given asset.
    /// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC
    ///  3986. The URI may point to a JSON file that conforms to the "ERC721
    ///  Metadata JSON Schema".
    function tokenURI(uint256 _tokenId) external view returns (string infoUrl)
    {
        return 
            concat(toSlice(metadataUrlPrefix), 
                toSlice(concat(toSlice(uintToString(_tokenId)), toSlice(metadataUrlSuffix))));
    }

    function setMetadataUrl(string _metadataUrlPrefix, string _metadataUrlSuffix) public onlyOwner
    {
        metadataUrlPrefix = _metadataUrlPrefix;
        metadataUrlSuffix = _metadataUrlSuffix;
    }


    mapping(address => PluginInterface) public plugins;
    PluginInterface[] public pluginsArray;
    mapping(uint40 => address) public usedSignes;
    uint40 public minSignId;

    event GenesChanged(uint40 indexed cutieId, uint256 oldValue, uint256 newValue);
    event CooldownEndTimeChanged(uint40 indexed cutieId, uint40 oldValue, uint40 newValue);
    event CooldownIndexChanged(uint40 indexed cutieId, uint16 ololdValue, uint16 newValue);
    event GenerationChanged(uint40 indexed cutieId, uint16 oldValue, uint16 newValue);
    event OptionalChanged(uint40 indexed cutieId, uint64 oldValue, uint64 newValue);
    event SignUsed(uint40 signId, address sender);
    event MinSignSet(uint40 signId);

    /// @dev Sets the reference to the plugin contract.
    /// @param _address - Address of plugin contract.
    function addPlugin(address _address) public onlyOwner
    {
        PluginInterface candidateContract = PluginInterface(_address);

        // verify that a contract is what we expect
        require(candidateContract.isPluginInterface());

        // Set the new contract address
        plugins[_address] = candidateContract;
        pluginsArray.push(candidateContract);
    }

    /// @dev Remove plugin and calls onRemove to cleanup
    function removePlugin(address _address) public onlyOwner
    {
        plugins[_address].onRemove();
        delete plugins[_address];

        uint256 kindex = 0;
        while (kindex < pluginsArray.length)
        {
            if (address(pluginsArray[kindex]) == _address)
            {
                pluginsArray[kindex] = pluginsArray[pluginsArray.length-1];
                pluginsArray.length--;
            }
            else
            {
                kindex++;
            }
        }
    }

    /// @dev Put a cutie up for plugin feature.
    function runPlugin(
        address _pluginAddress,
        uint40 _cutieId,
        uint256 _parameter
    )
        public
        whenNotPaused
        payable
    {
        // If cutie is already on any auction or in adventure, this will throw
        // because it will be owned by the other contract.
        // If _cutieId is 0, then cutie is not used on this feature.
        require(_cutieId == 0 || _isOwner(msg.sender, _cutieId));
        require(address(plugins[_pluginAddress]) != address(0));
        if (_cutieId > 0)
        {
            _approve(_cutieId, _pluginAddress);
        }

        // Plugin contract throws if inputs are invalid and clears
        // transfer after escrowing the cutie.
        plugins[_pluginAddress].run.value(msg.value)(
            _cutieId,
            _parameter,
            msg.sender
        );
    }

    /// @dev Called from plugin contract when using items as effect
    function getGenes(uint40 _id)
        public
        view
        returns (
        uint256 genes
    )
    {
        Cutie storage cutie = cuties[_id];
        genes = cutie.genes;
    }

    /// @dev Called from plugin contract when using items as effect
    function changeGenes(
        uint40 _cutieId,
        uint256 _genes)
        public
        whenNotPaused
    {
        // if caller is registered plugin contract
        require(address(plugins[msg.sender]) != address(0));

        Cutie storage cutie = cuties[_cutieId];
        if (cutie.genes != _genes)
        {
            emit GenesChanged(_cutieId, cutie.genes, _genes);
            cutie.genes = _genes;
        }
    }

    function getCooldownEndTime(uint40 _id)
        public
        view
        returns (
        uint40 cooldownEndTime
    ) {
        Cutie storage cutie = cuties[_id];

        cooldownEndTime = cutie.cooldownEndTime;
    }

    function changeCooldownEndTime(
        uint40 _cutieId,
        uint40 _cooldownEndTime)
        public
        whenNotPaused
    {
        require(address(plugins[msg.sender]) != address(0));

        Cutie storage cutie = cuties[_cutieId];
        if (cutie.cooldownEndTime != _cooldownEndTime)
        {
            emit CooldownEndTimeChanged(_cutieId, cutie.cooldownEndTime, _cooldownEndTime);
            cutie.cooldownEndTime = _cooldownEndTime;
        }
    }

    function getCooldownIndex(uint40 _id)
        public
        view
        returns (
        uint16 cooldownIndex
    ) {
        Cutie storage cutie = cuties[_id];

        cooldownIndex = cutie.cooldownIndex;
    }

    function changeCooldownIndex(
        uint40 _cutieId,
        uint16 _cooldownIndex)
        public
        whenNotPaused
    {
        require(address(plugins[msg.sender]) != address(0));

        Cutie storage cutie = cuties[_cutieId];
        if (cutie.cooldownIndex != _cooldownIndex)
        {
            emit CooldownIndexChanged(_cutieId, cutie.cooldownIndex, _cooldownIndex);
            cutie.cooldownIndex = _cooldownIndex;
        }
    }

    function changeGeneration(
        uint40 _cutieId,
        uint16 _generation)
        public
        whenNotPaused
    {
        require(address(plugins[msg.sender]) != address(0));

        Cutie storage cutie = cuties[_cutieId];
        if (cutie.generation != _generation)
        {
            emit GenerationChanged(_cutieId, cutie.generation, _generation);
            cutie.generation = _generation;
        }
    }

    function getGeneration(uint40 _id)
        public
        view
        returns (uint16 generation)
    {
        Cutie storage cutie = cuties[_id];
        generation = cutie.generation;
    }

    function changeOptional(
        uint40 _cutieId,
        uint64 _optional)
        public
        whenNotPaused
    {
        require(address(plugins[msg.sender]) != address(0));

        Cutie storage cutie = cuties[_cutieId];
        if (cutie.optional != _optional)
        {
            emit OptionalChanged(_cutieId, cutie.optional, _optional);
            cutie.optional = _optional;
        }
    }

    function getOptional(uint40 _id)
        public
        view
        returns (uint64 optional)
    {
        Cutie storage cutie = cuties[_id];
        optional = cutie.optional;
    }

    /// @dev Common function to be used also in backend
    function hashArguments(
        address _pluginAddress,
        uint40 _signId,
        uint40 _cutieId,
        uint128 _value,
        uint256 _parameter)
        public pure returns (bytes32 msgHash)
    {
        msgHash = keccak256(_pluginAddress, _signId, _cutieId, _value, _parameter);
    }

    /// @dev Common function to be used also in backend
    function getSigner(
        address _pluginAddress,
        uint40 _signId,
        uint40 _cutieId,
        uint128 _value,
        uint256 _parameter,
        uint8 _v,
        bytes32 _r,
        bytes32 _s
        )
        public pure returns (address)
    {
        bytes32 msgHash = hashArguments(_pluginAddress, _signId, _cutieId, _value, _parameter);
        return ecrecover(msgHash, _v, _r, _s);
    }

    /// @dev Common function to be used also in backend
    function isValidSignature(
        address _pluginAddress,
        uint40 _signId,
        uint40 _cutieId,
        uint128 _value,
        uint256 _parameter,
        uint8 _v,
        bytes32 _r,
        bytes32 _s
        )
        public
        view
        returns (bool)
    {
        return getSigner(_pluginAddress, _signId, _cutieId, _value, _parameter, _v, _r, _s) == operatorAddress;
    }

    /// @dev Put a cutie up for plugin feature with signature.
    ///  Can be used for items equip, item sales and other features.
    ///  Signatures are generated by Operator role.
    function runPluginSigned(
        address _pluginAddress,
        uint40 _signId,
        uint40 _cutieId,
        uint128 _value,
        uint256 _parameter,
        uint8 _v,
        bytes32 _r,
        bytes32 _s
    )
        public
        whenNotPaused
        payable
    {
        // If cutie is already on any auction or in adventure, this will throw
        // as it will be owned by the other contract.
        // If _cutieId is 0, then cutie is not used on this feature.
        require(_cutieId == 0 || _isOwner(msg.sender, _cutieId));
    
        require(address(plugins[_pluginAddress]) != address(0));    

        require (usedSignes[_signId] == address(0));
        require (_signId >= minSignId);
        // value can also be zero for free calls
        require (_value <= msg.value);

        require (isValidSignature(_pluginAddress, _signId, _cutieId, _value, _parameter, _v, _r, _s));
        
        usedSignes[_signId] = msg.sender;
        emit SignUsed(_signId, msg.sender);

        // Plugin contract throws if inputs are invalid and clears
        // transfer after escrowing the cutie.
        plugins[_pluginAddress].runSigned.value(_value)(
            _cutieId,
            _parameter,
            msg.sender
        );
    }

    /// @dev Sets minimal signId, than can be used.
    ///       All unused signatures less than signId will be cancelled on off-chain server
    ///       and unused items will be transfered back to owner.
    function setMinSign(uint40 _newMinSignId)
        public
        onlyOperator
    {
        require (_newMinSignId > minSignId);
        minSignId = _newMinSignId;
        emit MinSignSet(minSignId);
    }


    event BreedingApproval(address indexed _owner, address indexed _approved, uint256 _tokenId);

    // Set in case the core contract is broken and an upgrade is required
    address public upgradedContractAddress;

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

    /// @notice Creates the main BlockchainCuties smart contract instance.
    function BlockchainCutiesCore() public
    {
        // Starts paused.
        paused = true;

        // the creator of the contract is the initial owner
        ownerAddress = msg.sender;

        // the creator of the contract is also the initial operator
        operatorAddress = msg.sender;

        // start with the mythical cutie 0 - so there are no generation-0 parent issues
        _createCutie(0, 0, 0, 0, uint256(-1), address(0), 0);
    }

    event ContractUpgrade(address newContract);

    /// @dev Aimed to mark the smart contract as upgraded if there is a crucial
    ///  bug. This keeps track of the new contract and indicates that the new address is set. 
    /// Updating to the new contract address is up to the clients. (This contract will
    ///  be paused indefinitely if such an upgrade takes place.)
    /// @param _newAddress new address
    function setUpgradedAddress(address _newAddress) public onlyOwner whenPaused
    {
        require(_newAddress != address(0));
        upgradedContractAddress = _newAddress;
        emit ContractUpgrade(upgradedContractAddress);
    }

    /// @dev Import cuties from previous version of Core contract.
    /// @param _oldAddress Old core contract address
    /// @param _fromIndex (inclusive)
    /// @param _toIndex (inclusive)
    function migrate(address _oldAddress, uint40 _fromIndex, uint40 _toIndex) public onlyOwner whenPaused
    {
        require(_totalSupply() + 1 == _fromIndex);

        BlockchainCutiesCore old = BlockchainCutiesCore(_oldAddress);

        for (uint40 i = _fromIndex; i <= _toIndex; i++)
        {
            uint256 genes;
            uint40 birthTime;
            uint40 cooldownEndTime;
            uint40 momId;
            uint40 dadId;
            uint16 cooldownIndex;
            uint16 generation;            
            (genes, birthTime, cooldownEndTime, momId, dadId, cooldownIndex, generation) = old.getCutie(i);

            Cutie memory _cutie = Cutie({
                genes: genes, 
                birthTime: birthTime, 
                cooldownEndTime: cooldownEndTime, 
                momId: momId, 
                dadId: dadId, 
                cooldownIndex: cooldownIndex, 
                generation: generation,
                optional: 0
            });
            cuties.push(_cutie);
        }
    }

    /// @dev Import cuties from previous version of Core contract (part 2).
    /// @param _oldAddress Old core contract address
    /// @param _fromIndex (inclusive)
    /// @param _toIndex (inclusive)
    function migrate2(address _oldAddress, uint40 _fromIndex, uint40 _toIndex, address saleAddress, address breedingAddress) public onlyOwner whenPaused
    {
        BlockchainCutiesCore old = BlockchainCutiesCore(_oldAddress);
        MarketInterface oldSaleMarket = MarketInterface(saleAddress);
        MarketInterface oldBreedingMarket = MarketInterface(breedingAddress);

        for (uint40 i = _fromIndex; i <= _toIndex; i++)
        {
            address owner = old.ownerOf(i);

            if (owner == saleAddress)
            {
                (owner,,,,,) = oldSaleMarket.getAuctionInfo(i);
            }

            if (owner == breedingAddress)
            {
                (owner,,,,,) = oldBreedingMarket.getAuctionInfo(i);
            }
            _transfer(0, owner, i);
        }
    }

    /// @dev Override unpause so it requires upgradedContractAddress not set, because then the contract was upgraded.
    function unpause() public onlyOwner whenPaused
    {
        require(upgradedContractAddress == address(0));

        paused = false;
    }

    // Counts the number of cuties the contract owner has created.
    uint40 public promoCutieCreatedCount;
    uint40 public gen0CutieCreatedCount;
    uint40 public gen0Limit = 50000;
    uint40 public promoLimit = 5000;

    /// @dev Creates a new gen0 cutie with the given genes and
    ///  creates an auction for it.
    function createGen0Auction(uint256 _genes, uint128 startPrice, uint128 endPrice, uint40 duration) public onlyOperator
    {
        require(gen0CutieCreatedCount < gen0Limit);
        uint40 cutieId = _createCutie(0, 0, 0, 0, _genes, address(this), uint40(now));
        _approve(cutieId, saleMarket);

        saleMarket.createAuction(
            cutieId,
            startPrice,
            endPrice,
            duration,
            address(this)
        );

        gen0CutieCreatedCount++;
    }

    function createPromoCutie(uint256 _genes, address _owner) public onlyOperator
    {
        require(promoCutieCreatedCount < promoLimit);
        if (_owner == address(0)) {
             _owner = operatorAddress;
        }
        promoCutieCreatedCount++;
        gen0CutieCreatedCount++;
        _createCutie(0, 0, 0, 0, _genes, _owner, uint40(now));
    }

    /// @dev Put a cutie up for auction to be dad.
    ///  Performs checks to ensure the cutie can be dad, then
    ///  delegates to reverse auction.
    ///  Optional money amount can be sent to contract to feature auction.
    ///  Pricea are available on web.
    function createBreedingAuction(
        uint40 _cutieId,
        uint128 _startPrice,
        uint128 _endPrice,
        uint40 _duration
    )
        public
        whenNotPaused
        payable
    {
        // Auction contract checks input sizes
        // If cutie is already on any auction, this will throw
        // because it will be owned by the auction contract.
        require(_isOwner(msg.sender, _cutieId));
        require(canBreed(_cutieId));
        _approve(_cutieId, breedingMarket);
        // breeding auction function is called if inputs are invalid and clears
        // transfer and sire approval after escrowing the cutie.
        breedingMarket.createAuction.value(msg.value)(
            _cutieId,
            _startPrice,
            _endPrice,
            _duration,
            msg.sender
        );
    }

    /// @dev Sets the reference to the breeding auction.
    /// @param _breedingAddress - Address of breeding market contract.
    /// @param _saleAddress - Address of sale market contract.
    function setMarketAddress(address _breedingAddress, address _saleAddress) public onlyOwner
    {
        //require(address(breedingMarket) == address(0));
        //require(address(saleMarket) == address(0));

        breedingMarket = MarketInterface(_breedingAddress);
        saleMarket = MarketInterface(_saleAddress);
    }

    /// @dev Completes a breeding auction by bidding.
    ///  Immediately breeds the winning mom with the dad on auction.
    /// @param _dadId - ID of the dad on auction.
    /// @param _momId - ID of the mom owned by the bidder.
    function bidOnBreedingAuction(
        uint40 _dadId,
        uint40 _momId
    )
        public
        payable
        whenNotPaused
        returns (uint256)
    {
        // Auction contract checks input sizes
        require(_isOwner(msg.sender, _momId));
        require(canBreed(_momId));
        require(_canMateViaMarketplace(_momId, _dadId));
        // Take breeding fee
        uint256 fee = getBreedingFee(_momId, _dadId);
        require(msg.value >= fee);

        // breeding auction will throw if the bid fails.
        breedingMarket.bid.value(msg.value - fee)(_dadId);
        return _breedWith(_momId, _dadId);
    }

    /// @dev Put a cutie up for auction.
    ///  Does some ownership trickery for creating auctions in one transaction.
    ///  Optional money amount can be sent to contract to feature auction.
    ///  Pricea are available on web.
    function createSaleAuction(
        uint40 _cutieId,
        uint128 _startPrice,
        uint128 _endPrice,
        uint40 _duration
    )
        public
        whenNotPaused
        payable
    {
        // Auction contract checks input sizes
        // If cutie is already on any auction, this will throw
        // because it will be owned by the auction contract.
        require(_isOwner(msg.sender, _cutieId));
        _approve(_cutieId, saleMarket);
        // Sale auction throws if inputs are invalid and clears
        // transfer and sire approval after escrowing the cutie.
        saleMarket.createAuction.value(msg.value)(
            _cutieId,
            _startPrice,
            _endPrice,
            _duration,
            msg.sender
        );
    }

    /// @dev The address of the sibling contract that is used to implement the genetic combination algorithm.
    GeneMixerInterface geneMixer;

    /// @dev Check if dad has authorized breeding with the mom. True if both dad
    ///  and mom have the same owner, or if the dad has given breeding permission to
    ///  the mom's owner (via approveBreeding()).
    function _isBreedingPermitted(uint40 _dadId, uint40 _momId) internal view returns (bool)
    {
        address momOwner = cutieIndexToOwner[_momId];
        address dadOwner = cutieIndexToOwner[_dadId];

        // Breeding is approved if they have same owner, or if the mom's owner was given
        // permission to breed with the dad.
        return (momOwner == dadOwner || sireAllowedToAddress[_dadId] == momOwner);
    }

    /// @dev Update the address of the genetic contract.
    /// @param _address An address of a GeneMixer contract instance to be used from this point forward.
    function setGeneMixerAddress(address _address) public onlyOwner
    {
        GeneMixerInterface candidateContract = GeneMixerInterface(_address);

        require(candidateContract.isGeneMixer());

        // Set the new contract address
        geneMixer = candidateContract;
    }

    /// @dev Checks that a given cutie is able to breed. Requires that the
    ///  current cooldown is finished (for dads)
    function _canBreed(Cutie _cutie) internal view returns (bool)
    {
        return _cutie.cooldownEndTime <= now;
    }

    /// @notice Grants approval to another user to sire with one of your Cuties.
    /// @param _addr The address that will be able to sire with your Cutie. Set to
    ///  address(0) to clear all breeding approvals for this Cutie.
    /// @param _dadId A Cutie that you own that _addr will now be able to dad with.
    function approveBreeding(address _addr, uint40 _dadId) public whenNotPaused
    {
        require(_isOwner(msg.sender, _dadId));
        sireAllowedToAddress[_dadId] = _addr;
        emit BreedingApproval(msg.sender, _addr, _dadId);
    }

    /// @dev Set the cooldownEndTime for the given Cutie, based on its current cooldownIndex.
    ///  Also increments the cooldownIndex (unless it has hit the cap).
    /// @param _cutie A reference to the Cutie in storage which needs its timer started.
    function _triggerCooldown(uint40 _cutieId, Cutie storage _cutie) internal
    {
        // Compute the end of the cooldown time, based on current cooldownIndex
        uint40 oldValue = _cutie.cooldownIndex;
        _cutie.cooldownEndTime = config.getCooldownEndTimeFromIndex(_cutie.cooldownIndex);
        emit CooldownEndTimeChanged(_cutieId, oldValue, _cutie.cooldownEndTime);

        // Increment the breeding count.
        if (_cutie.cooldownIndex + 1 < config.getCooldownIndexCount()) {
            uint16 oldValue2 = _cutie.cooldownIndex;
            _cutie.cooldownIndex++;
            emit CooldownIndexChanged(_cutieId, oldValue2, _cutie.cooldownIndex);
        }
    }

    /// @notice Checks that a certain cutie is not
    ///  in the middle of a breeding cooldown and is able to breed.
    /// @param _cutieId reference the id of the cutie, any user can inquire about it
    function canBreed(uint40 _cutieId)
        public
        view
        returns (bool)
    {
        require(_cutieId > 0);
        Cutie storage cutie = cuties[_cutieId];
        return _canBreed(cutie);
    }

    /// @dev Check if given mom and dad are a valid mating pair.
    function _canPairMate(
        Cutie storage _mom,
        uint40 _momId,
        Cutie storage _dad,
        uint40 _dadId
    )
        private
        view
        returns(bool)
    {
        // A Cutie can't breed with itself.
        if (_dadId == _momId) { 
            return false; 
        }

        // Cuties can't breed with their parents.
        if (_mom.momId == _dadId) {
            return false;
        }
        if (_mom.dadId == _dadId) {
            return false;
        }

        if (_dad.momId == _momId) {
            return false;
        }
        if (_dad.dadId == _momId) {
            return false;
        }

        // We can short circuit the sibling check (below) if either cat is
        // gen zero (has a mom ID of zero).
        if (_dad.momId == 0) {
            return true;
        }
        if (_mom.momId == 0) {
            return true;
        }

        // Cuties can't breed with full or half siblings.
        if (_dad.momId == _mom.momId) {
            return false;
        }
        if (_dad.momId == _mom.dadId) {
            return false;
        }
        if (_dad.dadId == _mom.momId) {
            return false;
        }
        if (_dad.dadId == _mom.dadId) {
            return false;
        }

        if (geneMixer.canBreed(_momId, _mom.genes, _dadId, _dad.genes)) {
            return true;
        }
        return false;
    }

    /// @notice Checks to see if two cuties can breed together (checks both
    ///  ownership and breeding approvals, but does not check if both cuties are ready for
    ///  breeding).
    /// @param _momId The ID of the proposed mom.
    /// @param _dadId The ID of the proposed dad.
    function canBreedWith(uint40 _momId, uint40 _dadId)
        public
        view
        returns(bool)
    {
        require(_momId > 0);
        require(_dadId > 0);
        Cutie storage mom = cuties[_momId];
        Cutie storage dad = cuties[_dadId];
        return _canPairMate(mom, _momId, dad, _dadId) && _isBreedingPermitted(_dadId, _momId);
    }
    
    /// @dev Internal check to see if a given dad and mom are a valid mating pair for
    ///  breeding via market (this method doesn't check ownership and if mating is allowed).
    function _canMateViaMarketplace(uint40 _momId, uint40 _dadId)
        internal
        view
        returns (bool)
    {
        Cutie storage mom = cuties[_momId];
        Cutie storage dad = cuties[_dadId];
        return _canPairMate(mom, _momId, dad, _dadId);
    }

    function getBreedingFee(uint40 _momId, uint40 _dadId)
        public
        view
        returns (uint256)
    {
        return config.getBreedingFee(_momId, _dadId);
    }


    /// @notice Breed cuties that you own, or for which you
    ///  have previously been given Breeding approval. Will either make your cutie give birth, or will
    ///  fail.
    /// @param _momId The ID of the Cutie acting as mom (will end up give birth if successful)
    /// @param _dadId The ID of the Cutie acting as dad (will begin its breeding cooldown if successful)
    function breedWith(uint40 _momId, uint40 _dadId) 
        public
        whenNotPaused
        payable
        returns (uint40)
    {
        // Caller must own the mom.
        require(_isOwner(msg.sender, _momId));

        // Neither dad nor mom can be on auction during
        // breeding.
        // For mom: The caller of this function can't be the owner of the mom
        //   because the owner of a Cutie on auction is the auction house, and the
        //   auction house will never call breedWith().
        // For dad: Similarly, a dad on auction will be owned by the auction house
        //   and the act of transferring ownership will have cleared any outstanding
        //   breeding approval.
        // Thus we don't need check if either cutie
        // is on auction.

        // Check that mom and dad are both owned by caller, or that the dad
        // has given breeding permission to caller (i.e. mom's owner).
        // Will fail for _dadId = 0
        require(_isBreedingPermitted(_dadId, _momId));

        // Check breeding fee
        require(getBreedingFee(_momId, _dadId) <= msg.value);

        // Grab a reference to the potential mom
        Cutie storage mom = cuties[_momId];

        // Make sure mom's cooldown isn't active, or in the middle of a breeding cooldown
        require(_canBreed(mom));

        // Grab a reference to the potential dad
        Cutie storage dad = cuties[_dadId];

        // Make sure dad cooldown isn't active, or in the middle of a breeding cooldown
        require(_canBreed(dad));

        // Test that these cuties are a valid mating pair.
        require(_canPairMate(
            mom,
            _momId,
            dad,
            _dadId
        ));

        return _breedWith(_momId, _dadId);
    }

    /// @dev Internal utility function to start breeding, assumes that all breeding
    ///  requirements have been checked.
    function _breedWith(uint40 _momId, uint40 _dadId) internal returns (uint40)
    {
        // Grab a reference to the Cuties from storage.
        Cutie storage dad = cuties[_dadId];
        Cutie storage mom = cuties[_momId];

        // Trigger the cooldown for both parents.
        _triggerCooldown(_dadId, dad);
        _triggerCooldown(_momId, mom);

        // Clear breeding permission for both parents.
        delete sireAllowedToAddress[_momId];
        delete sireAllowedToAddress[_dadId];

        // Check that the mom is a valid cutie.
        require(mom.birthTime != 0);

        // Determine the higher generation number of the two parents
        uint16 babyGen = config.getBabyGen(mom.generation, dad.generation);

        // Call the gene mixing operation.
        uint256 childGenes = geneMixer.mixGenes(mom.genes, dad.genes);

        // Make the new cutie
        address owner = cutieIndexToOwner[_momId];
        uint40 cutieId = _createCutie(_momId, _dadId, babyGen, getCooldownIndexFromGeneration(babyGen), childGenes, owner, mom.cooldownEndTime);

        // return the new cutie's ID
        return cutieId;
    }

    mapping(address => uint40) isTutorialPetUsed;

    /// @dev Completes a breeding tutorial cutie (non existing in blockchain)
    ///  with auction by bidding. Immediately breeds with dad on auction.
    /// @param _dadId - ID of the dad on auction.
    function bidOnBreedingAuctionTutorial(
        uint40 _dadId
    )
        public
        payable
        whenNotPaused
        returns (uint)
    {
        require(isTutorialPetUsed[msg.sender] == 0);

        // Take breeding fee
        uint256 fee = getBreedingFee(0, _dadId);
        require(msg.value >= fee);

        // breeding auction will throw if the bid fails.
        breedingMarket.bid.value(msg.value - fee)(_dadId);

        // Grab a reference to the Cuties from storage.
        Cutie storage dad = cuties[_dadId];

        // Trigger the cooldown for parent.
        _triggerCooldown(_dadId, dad);

        // Clear breeding permission for parent.
        delete sireAllowedToAddress[_dadId];

        uint16 babyGen = config.getTutorialBabyGen(dad.generation);

        // tutorial pet genome is zero
        uint256 childGenes = geneMixer.mixGenes(0x0, dad.genes);

        // tutorial pet id is zero
        uint40 cutieId = _createCutie(0, _dadId, babyGen, getCooldownIndexFromGeneration(babyGen), childGenes, msg.sender, 12);

        isTutorialPetUsed[msg.sender] = cutieId;

        // return the new cutie's ID
        return cutieId;
    }

    address party1address;
    address party2address;
    address party3address;
    address party4address;
    address party5address;

    /// @dev Setup project owners
    function setParties(address _party1, address _party2, address _party3, address _party4, address _party5) public onlyOwner
    {
        require(_party1 != address(0));
        require(_party2 != address(0));
        require(_party3 != address(0));
        require(_party4 != address(0));
        require(_party5 != address(0));

        party1address = _party1;
        party2address = _party2;
        party3address = _party3;
        party4address = _party4;
        party5address = _party5;
    }

    /// @dev Reject all Ether which is not from game contracts from being sent here.
    function() external payable {
        require(
            msg.sender == address(saleMarket) ||
            msg.sender == address(breedingMarket) ||
            address(plugins[msg.sender]) != address(0)
        );
    }

    /// @dev The balance transfer from the market and plugins contract
    /// to the CutieCore contract.
    function withdrawBalances() external
    {
        require(
            msg.sender == ownerAddress || 
            msg.sender == operatorAddress);

        saleMarket.withdrawEthFromBalance();
        breedingMarket.withdrawEthFromBalance();
        for (uint32 i = 0; i < pluginsArray.length; ++i)        
        {
            pluginsArray[i].withdraw();
        }
    }

    /// @dev The balance transfer from CutieCore contract to project owners
    function withdrawEthFromBalance() external
    {
        require(
            msg.sender == party1address ||
            msg.sender == party2address ||
            msg.sender == party3address ||
            msg.sender == party4address ||
            msg.sender == party5address ||
            msg.sender == ownerAddress || 
            msg.sender == operatorAddress);

        require(party1address != 0);
        require(party2address != 0);
        require(party3address != 0);
        require(party4address != 0);
        require(party5address != 0);

        uint256 total = address(this).balance;

        party1address.transfer(total*105/1000);
        party2address.transfer(total*105/1000);
        party3address.transfer(total*140/1000);
        party4address.transfer(total*140/1000);
        party5address.transfer(total*510/1000);
    }

/*
 * @title String & slice utility library for Solidity contracts.
 * @author Nick Johnson <[email protected]>
 *
 * @dev Functionality in this library is largely implemented using an
 *      abstraction called a 'slice'. A slice represents a part of a string -
 *      anything from the entire string to a single character, or even no
 *      characters at all (a 0-length slice). Since a slice only has to specify
 *      an offset and a length, copying and manipulating slices is a lot less
 *      expensive than copying and manipulating the strings they reference.
 *
 *      To further reduce gas costs, most functions on slice that need to return
 *      a slice modify the original one instead of allocating a new one; for
 *      instance, `s.split(".")` will return the text up to the first '.',
 *      modifying s to only contain the remainder of the string after the '.'.
 *      In situations where you do not want to modify the original slice, you
 *      can make a copy first with `.copy()`, for example:
 *      `s.copy().split(".")`. Try and avoid using this idiom in loops; since
 *      Solidity has no memory management, it will result in allocating many
 *      short-lived slices that are later discarded.
 *
 *      Functions that return two slices come in two versions: a non-allocating
 *      version that takes the second slice as an argument, modifying it in
 *      place, and an allocating version that allocates and returns the second
 *      slice; see `nextRune` for example.
 *
 *      Functions that have to copy string data will return strings rather than
 *      slices; these can be cast back to slices for further processing if
 *      required.
 *
 *      For convenience, some functions are provided with non-modifying
 *      variants that create a new slice and return both; for instance,
 *      `s.splitNew('.')` leaves s unmodified, and returns two values
 *      corresponding to the left and right parts of the string.
 */

    struct slice
    {
        uint _len;
        uint _ptr;
    }

    /*
     * @dev Returns a slice containing the entire string.
     * @param self The string to make a slice from.
     * @return A newly allocated slice containing the entire string.
     */
    function toSlice(string self) internal pure returns (slice)
    {
        uint ptr;
        assembly {
            ptr := add(self, 0x20)
        }
        return slice(bytes(self).length, ptr);
    }

    function memcpy(uint dest, uint src, uint len) private pure
    {
        // Copy word-length chunks while possible
        for(; len >= 32; len -= 32) {
            assembly {
                mstore(dest, mload(src))
            }
            dest += 32;
            src += 32;
        }

        // Copy remaining bytes
        uint mask = 256 ** (32 - len) - 1;
        assembly {
            let srcpart := and(mload(src), not(mask))
            let destpart := and(mload(dest), mask)
            mstore(dest, or(destpart, srcpart))
        }
    }

    /*
     * @dev Returns a newly allocated string containing the concatenation of
     *      `self` and `other`.
     * @param self The first slice to concatenate.
     * @param other The second slice to concatenate.
     * @return The concatenation of the two strings.
     */
    function concat(slice self, slice other) internal pure returns (string)
    {
        string memory ret = new string(self._len + other._len);
        uint retptr;
        assembly { retptr := add(ret, 32) }
        memcpy(retptr, self._ptr, self._len);
        memcpy(retptr + self._len, other._ptr, other._len);
        return ret;
    }


    function uintToString(uint256 a) internal pure returns (string result)
    {
        string memory r = "";
        do
        {
            uint b = a % 10;
            a /= 10;

            string memory c = "";

            if (b == 0) c = "0";
            else if (b == 1) c = "1";
            else if (b == 2) c = "2";
            else if (b == 3) c = "3";
            else if (b == 4) c = "4";
            else if (b == 5) c = "5";
            else if (b == 6) c = "6";
            else if (b == 7) c = "7";
            else if (b == 8) c = "8";
            else if (b == 9) c = "9";

            r = concat(toSlice(c), toSlice(r));
        }
        while (a > 0);
        result = r;
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"gen0CutieCreatedCount","outputs":[{"name":"","type":"uint40"}],"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":"_cutieId","type":"uint40"}],"name":"canBreed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"_name","type":"string"}],"payable":false,"stateMutability":"pure","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":"_party1","type":"address"},{"name":"_party2","type":"address"},{"name":"_party3","type":"address"},{"name":"_party4","type":"address"},{"name":"_party5","type":"address"}],"name":"setParties","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_cutieId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"upgradedContractAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"addressToApprovedAll","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint40"}],"name":"cutieIndexToApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_dadId","type":"uint40"}],"name":"bidOnBreedingAuctionTutorial","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_genes","type":"uint256"},{"name":"_owner","type":"address"}],"name":"createPromoCutie","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint40"}],"name":"getCooldownIndex","outputs":[{"name":"cooldownIndex","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"cutieId","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint40"}],"name":"getOptional","outputs":[{"name":"optional","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newMinSignId","type":"uint40"}],"name":"setMinSign","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":false,"inputs":[{"name":"_breedingAddress","type":"address"},{"name":"_saleAddress","type":"address"}],"name":"setMarketAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_pluginAddress","type":"address"},{"name":"_signId","type":"uint40"},{"name":"_cutieId","type":"uint40"},{"name":"_value","type":"uint128"},{"name":"_parameter","type":"uint256"},{"name":"_v","type":"uint8"},{"name":"_r","type":"bytes32"},{"name":"_s","type":"bytes32"}],"name":"isValidSignature","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"plugins","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isCutieCore","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_cutieId","type":"uint40"},{"name":"_startPrice","type":"uint128"},{"name":"_endPrice","type":"uint128"},{"name":"_duration","type":"uint40"}],"name":"createSaleAuction","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint40"}],"name":"sireAllowedToAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"breedingMarket","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_cutieId","type":"uint40"},{"name":"_generation","type":"uint16"}],"name":"changeGeneration","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newAddress","type":"address"}],"name":"setUpgradedAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_cutieId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_momId","type":"uint40"},{"name":"_dadId","type":"uint40"}],"name":"getBreedingFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_cutieId","type":"uint40"},{"name":"_optional","type":"uint64"}],"name":"changeOptional","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdrawBalances","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"count","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdrawEthFromBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_cutieId","type":"uint40"},{"name":"_startPrice","type":"uint128"},{"name":"_endPrice","type":"uint128"},{"name":"_duration","type":"uint40"}],"name":"createBreedingAuction","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"config","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_metadataUrlPrefix","type":"string"},{"name":"_metadataUrlSuffix","type":"string"}],"name":"setMetadataUrl","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_oldAddress","type":"address"},{"name":"_fromIndex","type":"uint40"},{"name":"_toIndex","type":"uint40"},{"name":"saleAddress","type":"address"},{"name":"breedingAddress","type":"address"}],"name":"migrate2","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setConfigAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_pluginAddress","type":"address"},{"name":"_cutieId","type":"uint40"},{"name":"_parameter","type":"uint256"}],"name":"runPlugin","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"promoLimit","outputs":[{"name":"","type":"uint40"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minSignId","outputs":[{"name":"","type":"uint40"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_pluginAddress","type":"address"},{"name":"_signId","type":"uint40"},{"name":"_cutieId","type":"uint40"},{"name":"_value","type":"uint128"},{"name":"_parameter","type":"uint256"},{"name":"_v","type":"uint8"},{"name":"_r","type":"bytes32"},{"name":"_s","type":"bytes32"}],"name":"getSigner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"_symbol","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint40"}],"name":"getGenes","outputs":[{"name":"genes","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_pluginAddress","type":"address"},{"name":"_signId","type":"uint40"},{"name":"_cutieId","type":"uint40"},{"name":"_value","type":"uint128"},{"name":"_parameter","type":"uint256"},{"name":"_v","type":"uint8"},{"name":"_r","type":"bytes32"},{"name":"_s","type":"bytes32"}],"name":"runPluginSigned","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint40"}],"name":"getGeneration","outputs":[{"name":"generation","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_genes","type":"uint256"},{"name":"startPrice","type":"uint128"},{"name":"endPrice","type":"uint128"},{"name":"duration","type":"uint40"}],"name":"createGen0Auction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_operator","type":"address"},{"name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"removePlugin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_cutieId","type":"uint40"},{"name":"_recipient","type":"address"}],"name":"restoreCutieToAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_cutieId","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint40"}],"name":"cutieIndexToOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOperator","type":"address"}],"name":"setOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint40"}],"name":"usedSignes","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"},{"name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_pluginAddress","type":"address"},{"name":"_signId","type":"uint40"},{"name":"_cutieId","type":"uint40"},{"name":"_value","type":"uint128"},{"name":"_parameter","type":"uint256"}],"name":"hashArguments","outputs":[{"name":"msgHash","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_momId","type":"uint40"},{"name":"_dadId","type":"uint40"}],"name":"breedWith","outputs":[{"name":"","type":"uint40"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"cuties","outputs":[{"name":"genes","type":"uint256"},{"name":"birthTime","type":"uint40"},{"name":"cooldownEndTime","type":"uint40"},{"name":"momId","type":"uint40"},{"name":"dadId","type":"uint40"},{"name":"cooldownIndex","type":"uint16"},{"name":"generation","type":"uint16"},{"name":"optional","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_cutieId","type":"uint40"},{"name":"_cooldownEndTime","type":"uint40"}],"name":"changeCooldownEndTime","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"metadataUrlPrefix","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"infoUrl","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_cutieId","type":"uint40"},{"name":"_cooldownIndex","type":"uint16"}],"name":"changeCooldownIndex","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"metadataUrlSuffix","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"addPlugin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_momId","type":"uint40"},{"name":"_dadId","type":"uint40"}],"name":"canBreedWith","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"promoCutieCreatedCount","outputs":[{"name":"","type":"uint40"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_cutieId","type":"uint40"},{"name":"_genes","type":"uint256"}],"name":"changeGenes","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setGeneMixerAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"saleMarket","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint40"}],"name":"getCutie","outputs":[{"name":"genes","type":"uint256"},{"name":"birthTime","type":"uint40"},{"name":"cooldownEndTime","type":"uint40"},{"name":"momId","type":"uint40"},{"name":"dadId","type":"uint40"},{"name":"cooldownIndex","type":"uint16"},{"name":"generation","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"gen0Limit","outputs":[{"name":"","type":"uint40"}],"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":false,"inputs":[{"name":"_oldAddress","type":"address"},{"name":"_fromIndex","type":"uint40"},{"name":"_toIndex","type":"uint40"}],"name":"migrate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"pluginsArray","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_dadId","type":"uint40"},{"name":"_momId","type":"uint40"}],"name":"bidOnBreedingAuction","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint40"}],"name":"getCooldownEndTime","outputs":[{"name":"cooldownEndTime","type":"uint40"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"},{"name":"_dadId","type":"uint40"}],"name":"approveBreeding","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_approved","type":"address"},{"indexed":false,"name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"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"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":false,"name":"cutieId","type":"uint40"},{"indexed":false,"name":"momId","type":"uint40"},{"indexed":false,"name":"dadId","type":"uint40"},{"indexed":false,"name":"genes","type":"uint256"}],"name":"Birth","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"cutieId","type":"uint40"},{"indexed":false,"name":"oldValue","type":"uint256"},{"indexed":false,"name":"newValue","type":"uint256"}],"name":"GenesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"cutieId","type":"uint40"},{"indexed":false,"name":"oldValue","type":"uint40"},{"indexed":false,"name":"newValue","type":"uint40"}],"name":"CooldownEndTimeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"cutieId","type":"uint40"},{"indexed":false,"name":"ololdValue","type":"uint16"},{"indexed":false,"name":"newValue","type":"uint16"}],"name":"CooldownIndexChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"cutieId","type":"uint40"},{"indexed":false,"name":"oldValue","type":"uint16"},{"indexed":false,"name":"newValue","type":"uint16"}],"name":"GenerationChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"cutieId","type":"uint40"},{"indexed":false,"name":"oldValue","type":"uint64"},{"indexed":false,"name":"newValue","type":"uint64"}],"name":"OptionalChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"signId","type":"uint40"},{"indexed":false,"name":"sender","type":"address"}],"name":"SignUsed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"signId","type":"uint40"}],"name":"MinSignSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_approved","type":"address"},{"indexed":false,"name":"_tokenId","type":"uint256"}],"name":"BreedingApproval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newContract","type":"address"}],"name":"ContractUpgrade","type":"event"}]

60606040818152600a805460a060020a60ff02191690555190810160405280602281526020017f68747470733a2f2f626c6f636b636861696e6375746965732e636f2f6375746981526020017f652f000000000000000000000000000000000000000000000000000000000000815250600b90805162000084929160200190620004e0565b5060408051908101604052600481527f2e737667000000000000000000000000000000000000000000000000000000006020820152600c908051620000ce929160200190620004e0565b506011805469ffffffffff0000000000191666c350000000000017605060020a64ffffffffff0219166b13880000000000000000000017905534156200011357600080fd5b600a805460098054600160a060020a033316600160a060020a0319918216811790925560a060020a60ff02199092167401000000000000000000000000000000000000000017919091161790556200018260008080806000198180640100000000620047076200018982021704565b5062000620565b60006200019562000565565b600080610100604051908101604090815288825264ffffffffff808816602084015260009183018290528d811660608401528c16608083015261ffff808b1660a08401528b1660c083015260e082018190528054919450600191808301620001fe8382620005a9565b6000928352602090922086916002020181518155602082015160018201805464ffffffffff191664ffffffffff9290921691909117905560408201518160010160056101000a81548164ffffffffff021916908364ffffffffff160217905550606082015181600101600a6101000a81548164ffffffffff021916908364ffffffffff160217905550608082015181600101600f6101000a81548164ffffffffff021916908364ffffffffff16021790555060a08201518160010160146101000a81548161ffff021916908361ffff16021790555060c08201518160010160166101000a81548161ffff021916908361ffff16021790555060e08201516001909101805467ffffffffffffffff92909216780100000000000000000000000000000000000000000000000002600160c060020a039092169190911790555003915064ffffffffff8211156200035257600080fd5b5080600160a060020a0386167f689df1285a731b7022f6ff5c63e6b7c58c891df5b4530f12b7be0ec9ad03ecdb8260608601518660800151875160405164ffffffffff9485168152928416602084015292166040808301919091526060820192909252608001905180910390a2620003db6000878364010000000062004975620003e982021704565b9a9950505050505050505050565b600160a060020a0380831660008181526002602090815260408083208054600190810190915564ffffffffff8716845290915290208054600160a060020a03191690911790558316156200048c57600160a060020a0383166000908152600260209081526040808320805460001901905564ffffffffff84168352600482528083208054600160a060020a03199081169091556003909252909120805490911690555b81600160a060020a031683600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405164ffffffffff909116815260200160405180910390a3505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200052357805160ff191683800117855562000553565b8280016001018555821562000553579182015b828111156200055357825182559160200191906001019062000536565b5062000561929150620005dd565b5090565b6101006040519081016040908152600080835260208301819052908201819052606082018190526080820181905260a0820181905260c0820181905260e082015290565b815481835581811511620005d857600202816002028360005260206000209182019101620005d89190620005fd565b505050565b620005fa91905b80821115620005615760008155600101620005e4565b90565b620005fa91905b8082111562000561576000808255600182015560020162000604565b61551e80620006306000396000f3006060604052600436106103ac5763ffffffff60e060020a60003504166219a46b811461040857806301ffc9a71461043557806305910b911461047e57806306fdde031461049b578063081812fc1461052557806308ba7ee714610557578063095ea7b31461058e5780630da2e088146105b05780630dca63e8146105c357806310e9678b146105e257806313af4035146105ff57806318160ddd1461061e5780631bbfce0e14610643578063210fcbf61461065557806323b872dd146106775780632917f1621461069f5780632f745c59146106d35780633e6d4e12146106f55780633f4ba83a1461072f57806340a92f0f1461074257806342842e0e1461075f578063430c73c51461078757806345c7a092146107ac5780634b12e643146107f65780634d6a813a146108155780634f6ccce71461082857806350bc6bba1461083e578063551799131461086b5780635a390a5f146108885780635a3f88f01461089b5780635c975abb146108bf5780635f24f6fe146108d25780636352211e146108f157806366dc860a146109075780636c2959361461092a5780636ccbb0ab1461095457806370a0823114610967578063776247c41461098657806378a6c6d21461099957806379502c55146109c657806379edfa7d146109d9578063839daf1d14610a6c57806383a12de914610aaa5780638456cb5914610ac9578063887e0c0714610adc578063889231c114610afd5780638f9a57ef14610b1057806394e50e7a14610b2357806395d89b4114610b6d578063999d394714610b805780639ad73f2014610b9d5780639c91ae2014610bdc5780639de8302f14610bf9578063a22cb46514610c2b578063a4d95b6414610c4f578063a86ee74614610c6e578063a9059cbb14610c97578063b1d9549714610cb9578063b3ab15fb14610cd6578063b5113bf614610cf5578063b88d4fde14610d12578063bdad811214610d49578063c30bc5ef14610d87578063c44f217414610d9f578063c479142114610e16578063c7047fa714610e39578063c87b56dd14610e4c578063cf7e69f814610e62578063d4d6d36614610e86578063d8867fc814610e99578063d997933f14610eb8578063e09ef83e14610edb578063e1af915d14610eee578063e205842414610f0e578063e33607da14610f2d578063e39bdfab14610f40578063e515a4d114610fab578063e985e9c514610fbe578063edc9f18214610fe3578063f3ca087314611012578063f3cb180514611028578063f6dfcff714611040578063fb43b2a21461105d575b60055433600160a060020a03908116911614806103d7575060065433600160a060020a039081169116145b806103fb5750600160a060020a033381166000908152600d60205260409020541615155b151561040657600080fd5b005b341561041357600080fd5b61041b611086565b60405164ffffffffff909116815260200160405180910390f35b341561044057600080fd5b61046a7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1960043516611093565b604051901515815260200160405180910390f35b341561048957600080fd5b61046a64ffffffffff60043516611155565b34156104a657600080fd5b6104ae61122e565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156104ea5780820151838201526020016104d2565b50505050905090810190601f1680156105175780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561053057600080fd5b61053b600435611270565b604051600160a060020a03909116815260200160405180910390f35b341561056257600080fd5b610406600160a060020a0360043581169060243581169060443581169060643581169060843516611325565b341561059957600080fd5b610406600160a060020a0360043516602435611408565b34156105bb57600080fd5b61053b61149d565b34156105ce57600080fd5b61053b600160a060020a03600435166114b5565b34156105ed57600080fd5b61053b64ffffffffff600435166114d0565b341561060a57600080fd5b610406600160a060020a03600435166114eb565b341561062957600080fd5b61063161153d565b60405190815260200160405180910390f35b61063164ffffffffff60043516611547565b341561066057600080fd5b610406600435600160a060020a03602435166117a0565b341561068257600080fd5b610406600160a060020a03600435811690602435166044356118c2565b34156106aa57600080fd5b6106bc64ffffffffff60043516611937565b60405161ffff909116815260200160405180910390f35b34156106de57600080fd5b610631600160a060020a0360043516602435611976565b341561070057600080fd5b61071264ffffffffff600435166119f5565b60405167ffffffffffffffff909116815260200160405180910390f35b341561073a57600080fd5b610406611a3a565b341561074d57600080fd5b61040664ffffffffff60043516611aac565b341561076a57600080fd5b610406600160a060020a0360043581169060243516604435611b57565b341561079257600080fd5b610406600160a060020a0360043581169060243516611bed565b34156107b757600080fd5b61046a600160a060020a036004351664ffffffffff602435811690604435166001608060020a036064351660843560ff60a4351660c43560e435611c36565b341561080157600080fd5b61053b600160a060020a0360043516611c6c565b341561082057600080fd5b61046a611c87565b341561083357600080fd5b61063160043561126d565b61040664ffffffffff6004358116906001608060020a036024358116916044359091169060643516611c8c565b341561087657600080fd5b61053b64ffffffffff60043516611d67565b341561089357600080fd5b61053b611d82565b34156108a657600080fd5b61040664ffffffffff6004351661ffff60243516611d91565b34156108ca57600080fd5b61046a611ea2565b34156108dd57600080fd5b610406600160a060020a0360043516611eb2565b34156108fc57600080fd5b61053b600435611f78565b341561091257600080fd5b61063164ffffffffff60043581169060243516611fbb565b341561093557600080fd5b61040664ffffffffff6004351667ffffffffffffffff60243516612031565b341561095f57600080fd5b610406612159565b341561097257600080fd5b610631600160a060020a03600435166122c0565b341561099157600080fd5b6104066122db565b61040664ffffffffff6004358116906001608060020a036024358116916044359091169060643516612533565b34156109d157600080fd5b61053b61260b565b34156109e457600080fd5b61040660046024813581810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052818152929190602084018383808284375094965061261a95505050505050565b3415610a7757600080fd5b610406600160a060020a0360043581169064ffffffffff602435811691604435909116906064358116906084351661265c565b3415610ab557600080fd5b610406600160a060020a0360043516612886565b3415610ad457600080fd5b610406612928565b610406600160a060020a036004351664ffffffffff60243516604435612980565b3415610b0857600080fd5b61041b612a8e565b3415610b1b57600080fd5b61041b612aa2565b3415610b2e57600080fd5b61053b600160a060020a036004351664ffffffffff602435811690604435166001608060020a036064351660843560ff60a4351660c43560e435612aaf565b3415610b7857600080fd5b6104ae612b30565b3415610b8b57600080fd5b61063164ffffffffff60043516612b71565b610406600160a060020a036004351664ffffffffff602435811690604435166001608060020a036064351660843560ff60a4351660c43560e435612ba2565b3415610be757600080fd5b6106bc64ffffffffff60043516612d91565b3415610c0457600080fd5b6104066004356001608060020a036024358116906044351664ffffffffff60643516612dd0565b3415610c3657600080fd5b610406600160a060020a03600435166024351515612f0a565b3415610c5a57600080fd5b610406600160a060020a0360043516612fb8565b3415610c7957600080fd5b61040664ffffffffff60043516600160a060020a0360243516613125565b3415610ca257600080fd5b610406600160a060020a0360043516602435613192565b3415610cc457600080fd5b61053b64ffffffffff600435166131dc565b3415610ce157600080fd5b610406600160a060020a03600435166131f7565b3415610d0057600080fd5b61053b64ffffffffff60043516613249565b3415610d1d57600080fd5b610406600160a060020a0360048035821691602480359091169160443591606435908101910135613264565b3415610d5457600080fd5b610631600160a060020a036004351664ffffffffff602435811690604435166001608060020a03606435166084356133db565b61041b64ffffffffff60043581169060243516613478565b3415610daa57600080fd5b610db5600435613688565b60405197885264ffffffffff9687166020890152948616604080890191909152938616606088015291909416608086015261ffff93841660a086015290921660c084015267ffffffffffffffff1660e0830152610100909101905180910390f35b3415610e2157600080fd5b61040664ffffffffff60043581169060243516613709565b3415610e4457600080fd5b6104ae61381a565b3415610e5757600080fd5b6104ae6004356138b8565b3415610e6d57600080fd5b61040664ffffffffff6004351661ffff602435166139f0565b3415610e9157600080fd5b6104ae613aff565b3415610ea457600080fd5b610406600160a060020a0360043516613b6a565b3415610ec357600080fd5b61046a64ffffffffff60043581169060243516613c56565b3415610ee657600080fd5b61041b613cea565b3415610ef957600080fd5b61040664ffffffffff60043516602435613d14565b3415610f1957600080fd5b610406600160a060020a0360043516613dd0565b3415610f3857600080fd5b61053b613e72565b3415610f4b57600080fd5b610f5d64ffffffffff60043516613e81565b60405196875264ffffffffff958616602088015293851660408088019190915292851660608701529316608085015261ffff92831660a0850152911660c083015260e0909101905180910390f35b3415610fb657600080fd5b61041b613f0b565b3415610fc957600080fd5b61046a600160a060020a0360043581169060243516613f21565b3415610fee57600080fd5b610406600160a060020a036004351664ffffffffff60243581169060443516613f43565b341561101d57600080fd5b61053b600435614230565b61063164ffffffffff60043581169060243516614258565b341561104b57600080fd5b61041b64ffffffffff60043516614347565b341561106857600080fd5b610406600160a060020a036004351664ffffffffff6024351661438b565b60115464ffffffffff1681565b60007f6466353c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff198316148061114f57506040517f737570706f727473496e74657266616365286279746573342900000000000000815260190160405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b92915050565b60008064ffffffffff831681901161116c57600080fd5b6000805464ffffffffff851690811061118157fe5b906000526020600020906002020190506112258161010060405190810160409081528254825260019092015464ffffffffff8082166020840152650100000000008204811693830193909352605060020a810483166060830152607860020a8104909216608082015260a060020a820461ffff90811660a083015260b060020a83041660c082015260c060020a90910467ffffffffffffffff1660e0820152614431565b91505b50919050565b61123661537d565b60408051908101604052601081527f426c6f636b636861696e43757469657300000000000000000000000000000000602082015290505b90565b6000808264ffffffffff81111561128657600080fd5b61128e61153d565b84111561129a57600080fd5b64ffffffffff8416600090815260036020526040902054600160a060020a0316156112e65764ffffffffff8416600090815260036020526040902054600160a060020a0316925061131e565b64ffffffffff8416600090815260016020908152604080832054600160a060020a039081168085526007909352922054909116935091505b5050919050565b60095433600160a060020a0390811691161461134057600080fd5b600160a060020a038516151561135557600080fd5b600160a060020a038416151561136a57600080fd5b600160a060020a038316151561137f57600080fd5b600160a060020a038216151561139457600080fd5b600160a060020a03811615156113a957600080fd5b60148054600160a060020a0319908116600160a060020a03978816179091556015805482169587169590951790945560168054851693861693909317909255601780548416918516919091179055601880549092169216919091179055565b600a5460a060020a900460ff161561141f57600080fd5b8064ffffffffff81111561143257600080fd5b61143c3383614448565b151561144757600080fd5b611451828461446f565b82600160a060020a031633600160a060020a03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405190815260200160405180910390a3505050565b601054650100000000009004600160a060020a031681565b600760205260009081526040902054600160a060020a031681565b600360205260009081526040902054600160a060020a031681565b60095433600160a060020a0390811691161461150657600080fd5b600160a060020a038116151561151b57600080fd5b60098054600160a060020a031916600160a060020a0392909216919091179055565b6000546000190190565b600080600080600080600a60149054906101000a900460ff1615151561156c57600080fd5b600160a060020a03331660009081526013602052604090205464ffffffffff161561159657600080fd5b6115a1600088611fbb565b945034859010156115b157600080fd5b600654600160a060020a031663c170fd54348790038960405160e060020a63ffffffff851602815264ffffffffff90911660048201526024016000604051808303818588803b151561160257600080fd5b5af1151561160f57600080fd5b5050505060008764ffffffffff1681548110151561162957fe5b9060005260206000209060020201935061164387856144a6565b64ffffffffff8716600090815260046020526040908190208054600160a060020a03191690556008546001860154600160a060020a039091169163656e8d6f9160b060020a900461ffff16905160e060020a63ffffffff841602815261ffff9091166004820152602401602060405180830381600087803b15156116c657600080fd5b5af115156116d357600080fd5b50505060405180516012548654919550600160a060020a03169150638d8b1b889060009060405160e060020a63ffffffff851602815260048101929092526024820152604401602060405180830381600087803b151561173257600080fd5b5af1151561173f57600080fd5b5050506040518051905091506117646000888561175b8761469d565b8633600c614707565b33600160a060020a03166000908152601360205260409020805464ffffffffff191664ffffffffff929092169182179055979650505050505050565b600a5433600160a060020a03908116911614806117cb575060095433600160a060020a039081169116145b15156117d657600080fd5b601154601054605060020a90910464ffffffffff908116790100000000000000000000000000000000000000000000000000909204161061181657600080fd5b600160a060020a03811615156118345750600a54600160a060020a03165b60108054600164ffffffffff790100000000000000000000000000000000000000000000000000808404821683018216027fffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffff909316929092179092556011805480831690930190911664ffffffffff199092169190911790556118bd6000808080868642614707565b505050565b600a5460a060020a900460ff16156118d957600080fd5b8064ffffffffff8111156118ec57600080fd5b6118f6338361494e565b8061190657506119068433613f21565b151561191157600080fd5b61191b8483614448565b151561192657600080fd5b611931848484614975565b50505050565b60008060008364ffffffffff1681548110151561195057fe5b600091825260209091206002909102016001015460a060020a900461ffff169392505050565b60008060015b61198461153d565b64ffffffffff8216116119e85764ffffffffff8116600090815260016020526040902054600160a060020a03868116911614156119e057838264ffffffffff1614156119d9578064ffffffffff1692506119ed565b6001909101905b60010161197c565b600080fd5b505092915050565b60008060008364ffffffffff16815481101515611a0e57fe5b600091825260209091206002909102016001015460c060020a900467ffffffffffffffff169392505050565b60095433600160a060020a03908116911614611a5557600080fd5b600a5460a060020a900460ff161515611a6d57600080fd5b601054650100000000009004600160a060020a031615611a8c57600080fd5b600a805474ff000000000000000000000000000000000000000019169055565b600a5433600160a060020a0390811691161480611ad7575060095433600160a060020a039081169116145b1515611ae257600080fd5b60105464ffffffffff90811690821611611afb57600080fd5b6010805464ffffffffff191664ffffffffff83811691909117918290557f61adbe79b14a8cd89d2e6b327307808e258e0e9a9da800e5c9c5cf5b20efc91c911660405164ffffffffff909116815260200160405180910390a150565b600a5460a060020a900460ff1615611b6e57600080fd5b8064ffffffffff811115611b8157600080fd5b600160a060020a0383161515611b9657600080fd5b30600160a060020a031683600160a060020a031614151515611bb757600080fd5b600554600160a060020a0384811691161415611bd257600080fd5b600654600160a060020a03848116911614156118ec57600080fd5b60095433600160a060020a03908116911614611c0857600080fd5b60068054600160a060020a03938416600160a060020a03199182161790915560058054929093169116179055565b600a54600090600160a060020a0316611c558a8a8a8a8a8a8a8a612aaf565b600160a060020a0316149998505050505050505050565b600d60205260009081526040902054600160a060020a031681565b600190565b600a5460a060020a900460ff1615611ca357600080fd5b611cad3385614448565b1515611cb857600080fd5b600554611ccf908590600160a060020a031661446f565b600554600160a060020a031663c1d1faf334868686863360405160e060020a63ffffffff891602815264ffffffffff95861660048201526001608060020a0394851660248201529290931660448301529092166064830152600160a060020a0316608482015260a4016000604051808303818588803b1515611d5057600080fd5b5af11515611d5d57600080fd5b5050505050505050565b600460205260009081526040902054600160a060020a031681565b600654600160a060020a031681565b600a5460009060a060020a900460ff1615611dab57600080fd5b600160a060020a033381166000908152600d6020526040902054161515611dd157600080fd5b6000805464ffffffffff8516908110611de657fe5b60009182526020909120600290910201600181015490915061ffff83811660b060020a90920416146118bd57600181015464ffffffffff8416907f253c1885cda0cc3462691396c0720f0b8d26a408db39c442f6cba580aa2bacbe9060b060020a900461ffff168460405161ffff9283168152911660208201526040908101905180910390a260018101805461ffff841660b060020a0277ffff0000000000000000000000000000000000000000000019909116179055505050565b600a5460a060020a900460ff1681565b60095433600160a060020a03908116911614611ecd57600080fd5b600a5460a060020a900460ff161515611ee557600080fd5b600160a060020a0381161515611efa57600080fd5b6010805478ffffffffffffffffffffffffffffffffffffffff0000000000191665010000000000600160a060020a03848116820292909217928390557f450db8da6efbe9c22f2347f7c2021231df1fc58d3ae9a2fa75d39fa446199305920416604051600160a060020a03909116815260200160405180910390a150565b60008164ffffffffff811115611f8d57600080fd5b64ffffffffff8316600090815260016020526040902054600160a060020a0316915081151561122857600080fd5b600854600090600160a060020a03166366dc860a848460405160e060020a63ffffffff851602815264ffffffffff928316600482015291166024820152604401602060405180830381600087803b151561201457600080fd5b5af1151561202157600080fd5b5050506040518051949350505050565b600a5460009060a060020a900460ff161561204b57600080fd5b600160a060020a033381166000908152600d602052604090205416151561207157600080fd5b6000805464ffffffffff851690811061208657fe5b60009182526020909120600290910201600181015490915067ffffffffffffffff83811660c060020a90920416146118bd57600181015464ffffffffff8416907f0e4fadd6d53b262b076fce73fbf5c344b680a42f10f095326782f42d56b9beb29060c060020a900467ffffffffffffffff168460405167ffffffffffffffff9283168152911660208201526040908101905180910390a260018101805467ffffffffffffffff841660c060020a0277ffffffffffffffffffffffffffffffffffffffffffffffff909116179055505050565b60095460009033600160a060020a03908116911614806121875750600a5433600160a060020a039081169116145b151561219257600080fd5b600554600160a060020a031663776247c46040518163ffffffff1660e060020a028152600401600060405180830381600087803b15156121d157600080fd5b5af115156121de57600080fd5b5050600654600160a060020a0316905063776247c46040518163ffffffff1660e060020a028152600401600060405180830381600087803b151561222157600080fd5b5af1151561222e57600080fd5b505050600090505b600e5463ffffffff821610156122bd57600e805463ffffffff831690811061225a57fe5b600091825260209091200154600160a060020a0316633ccfd60b6040518163ffffffff1660e060020a028152600401600060405180830381600087803b15156122a257600080fd5b5af115156122af57600080fd5b505050806001019050612236565b50565b600160a060020a031660009081526002602052604090205490565b60145460009033600160a060020a0390811691161480612309575060155433600160a060020a039081169116145b80612322575060165433600160a060020a039081169116145b8061233b575060175433600160a060020a039081169116145b80612354575060185433600160a060020a039081169116145b8061236d575060095433600160a060020a039081169116145b806123865750600a5433600160a060020a039081169116145b151561239157600080fd5b601454600160a060020a031615156123a857600080fd5b601554600160a060020a031615156123bf57600080fd5b601654600160a060020a031615156123d657600080fd5b601754600160a060020a031615156123ed57600080fd5b601854600160a060020a0316151561240457600080fd5b50601454600160a060020a033081163191166108fc6103e860698402049081150290604051600060405180830381858888f19350505050151561244657600080fd5b601554600160a060020a03166103e8606983020480156108fc0290604051600060405180830381858888f19350505050151561248157600080fd5b601654600160a060020a03166103e8608c83020480156108fc0290604051600060405180830381858888f1935050505015156124bc57600080fd5b601754600160a060020a03166103e8608c83020480156108fc0290604051600060405180830381858888f1935050505015156124f757600080fd5b601854600160a060020a03166103e86101fe83020480156108fc0290604051600060405180830381858888f1935050505015156122bd57600080fd5b600a5460a060020a900460ff161561254a57600080fd5b6125543385614448565b151561255f57600080fd5b61256884611155565b151561257357600080fd5b60065461258a908590600160a060020a031661446f565b600654600160a060020a031663c1d1faf334868686863360405160e060020a63ffffffff891602815264ffffffffff95861660048201526001608060020a0394851660248201529290931660448301529092166064830152600160a060020a0316608482015260a4016000604051808303818588803b1515611d5057600080fd5b600854600160a060020a031681565b60095433600160a060020a0390811691161461263557600080fd5b600b82805161264892916020019061538f565b50600c8180516118bd92916020019061538f565b600954600090819081908190819033600160a060020a0390811691161461268257600080fd5b600a5460a060020a900460ff16151561269a57600080fd5b8994508693508592508891505b64ffffffffff8089169083161161287a5784600160a060020a0316636352211e8360405160e060020a63ffffffff841602815264ffffffffff9091166004820152602401602060405180830381600087803b151561270457600080fd5b5af1151561271157600080fd5b50505060405180519050905086600160a060020a031681600160a060020a031614156127c05783600160a060020a0316639ccaec988360405160e060020a63ffffffff841602815264ffffffffff909116600482015260240160c060405180830381600087803b151561278357600080fd5b5af1151561279057600080fd5b50505060405180519060200180519060200180519060200180519060200180519060200180515094955050505050505b85600160a060020a031681600160a060020a031614156128635782600160a060020a0316639ccaec988360405160e060020a63ffffffff841602815264ffffffffff909116600482015260240160c060405180830381600087803b151561282657600080fd5b5af1151561283357600080fd5b50505060405180519060200180519060200180519060200180519060200180519060200180515094955050505050505b61286f60008284614975565b6001909101906126a7565b50505050505050505050565b60095460009033600160a060020a039081169116146128a457600080fd5b5080600160a060020a03811663dcb31b826040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156128e357600080fd5b5af115156128f057600080fd5b50505060405180519050151561290557600080fd5b60088054600160a060020a031916600160a060020a039290921691909117905550565b60095433600160a060020a0390811691161461294357600080fd5b600a5460a060020a900460ff161561295a57600080fd5b600a805474ff0000000000000000000000000000000000000000191660a060020a179055565b600a5460a060020a900460ff161561299757600080fd5b64ffffffffff821615806129b057506129b03383614448565b15156129bb57600080fd5b600160a060020a038381166000908152600d60205260409020541615156129e157600080fd5b60008264ffffffffff1611156129fb576129fb828461446f565b600160a060020a038084166000908152600d602052604090819020549091169063a055d4559034908590859033905160e060020a63ffffffff871602815264ffffffffff90931660048401526024830191909152600160a060020a031660448201526064016000604051808303818588803b1515612a7857600080fd5b5af11515612a8557600080fd5b50505050505050565b601154605060020a900464ffffffffff1681565b60105464ffffffffff1681565b600080612abf8a8a8a8a8a6133db565b90506001818686866040516000815260200160405260405193845260ff9092166020808501919091526040808501929092526060840192909252608090920191516020810390808403906000865af11515612b1957600080fd5b5050602060405103519a9950505050505050505050565b612b3861537d565b60408051908101604052600281527f42430000000000000000000000000000000000000000000000000000000000006020820152905090565b60008060008364ffffffffff16815481101515612b8a57fe5b60009182526020909120600290910201549392505050565b600a5460a060020a900460ff1615612bb957600080fd5b64ffffffffff86161580612bd25750612bd23387614448565b1515612bdd57600080fd5b600160a060020a038881166000908152600d6020526040902054161515612c0357600080fd5b64ffffffffff87166000908152600f6020526040902054600160a060020a031615612c2d57600080fd5b60105464ffffffffff9081169088161015612c4757600080fd5b346001608060020a0386161115612c5d57600080fd5b612c6d8888888888888888611c36565b1515612c7857600080fd5b64ffffffffff87166000908152600f6020526040908190208054600160a060020a03191633600160a060020a038116919091179091557f3b213e544d7183ac9b8a682aa7ad1d52d0b2c05c7aba9bf7bc025d7b3847b63e918991905164ffffffffff9092168252600160a060020a031660208201526040908101905180910390a1600160a060020a038089166000908152600d6020526040908190205490911690639652713e9087908990889033905160e060020a63ffffffff871602815264ffffffffff90931660048401526024830191909152600160a060020a031660448201526064016000604051808303818588803b1515612d7657600080fd5b5af11515612d8357600080fd5b505050505050505050505050565b60008060008364ffffffffff16815481101515612daa57fe5b600091825260209091206002909102016001015460b060020a900461ffff169392505050565b600a5460009033600160a060020a0390811691161480612dfe575060095433600160a060020a039081169116145b1515612e0957600080fd5b60115464ffffffffff6501000000000082048116911610612e2957600080fd5b612e3a600080600080893042614707565b600554909150612e54908290600160a060020a031661446f565b600554600160a060020a031663c1d1faf3828686863060405160e060020a63ffffffff881602815264ffffffffff95861660048201526001608060020a0394851660248201529290931660448301529092166064830152600160a060020a0316608482015260a401600060405180830381600087803b1515612ed557600080fd5b5af11515612ee257600080fd5b50506011805464ffffffffff8082166001011664ffffffffff19909116179055505050505050565b8015612f445733600160a060020a0390811660009081526007602052604090208054600160a060020a031916918416919091179055612f6b565b600160a060020a03331660009081526007602052604090208054600160a060020a03191690555b81600160a060020a031633600160a060020a03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051901515815260200160405180910390a35050565b60095460009033600160a060020a03908116911614612fd657600080fd5b600160a060020a038083166000908152600d6020526040908190205490911690631195236990518163ffffffff1660e060020a028152600401600060405180830381600087803b151561302857600080fd5b5af1151561303557600080fd5b50505050600160a060020a0381166000908152600d602052604081208054600160a060020a03191690555b600e548110156131215781600160a060020a0316600e8281548110151561308357fe5b600091825260209091200154600160a060020a0316141561311857600e805460001981019081106130b057fe5b600091825260209091200154600e8054600160a060020a0390921691839081106130d657fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600e80549061311290600019830161540d565b5061311c565b6001015b613060565b5050565b600a5433600160a060020a0390811691161480613150575060095433600160a060020a039081169116145b151561315b57600080fd5b600a5460a060020a900460ff161561317257600080fd5b61317c3083614448565b151561318757600080fd5b613121308284614975565b600a5460a060020a900460ff16156131a957600080fd5b8064ffffffffff8111156131bc57600080fd5b6131c63383614448565b15156131d157600080fd5b6118bd338484614975565b600160205260009081526040902054600160a060020a031681565b60095433600160a060020a0390811691161461321257600080fd5b600160a060020a038116151561322757600080fd5b600a8054600160a060020a031916600160a060020a0392909216919091179055565b600f60205260009081526040902054600160a060020a031681565b600a5460a060020a900460ff161561327b57600080fd5b8264ffffffffff81111561328e57600080fd5b600160a060020a03851615156132a357600080fd5b30600160a060020a031685600160a060020a0316141515156132c457600080fd5b600554600160a060020a03868116911614156132df57600080fd5b600654600160a060020a03868116911614156132fa57600080fd5b613304338561494e565b8061331457506133148633613f21565b151561331f57600080fd5b6133298685614448565b151561333457600080fd5b61333f868686614975565b84600160a060020a031663f0b9e5ba8786868660405160e060020a63ffffffff8716028152600160a060020a0385166004820190815260248201859052606060448301908152606483018490529091608401848480828437820191505095505050505050602060405180830381600087803b15156133bc57600080fd5b5af115156133c957600080fd5b50505060405180515050505050505050565b60008585858585604051600160a060020a03959095166c0100000000000000000000000002855264ffffffffff9384167b0100000000000000000000000000000000000000000000000000000090810260148701529290931690910260198401526001608060020a031670010000000000000000000000000000000002601e830152602e820152604e016040518091039020905095945050505050565b600a546000908190819060a060020a900460ff161561349657600080fd5b6134a03386614448565b15156134ab57600080fd5b6134b58486614a6b565b15156134c057600080fd5b346134cb8686611fbb565b11156134d657600080fd5b6000805464ffffffffff87169081106134eb57fe5b9060005260206000209060020201915061358f8261010060405190810160409081528254825260019092015464ffffffffff8082166020840152650100000000008204811693830193909352605060020a810483166060830152607860020a8104909216608082015260a060020a820461ffff90811660a083015260b060020a83041660c082015260c060020a90910467ffffffffffffffff1660e0820152614431565b151561359a57600080fd5b6000805464ffffffffff86169081106135af57fe5b906000526020600020906002020190506136538161010060405190810160409081528254825260019092015464ffffffffff8082166020840152650100000000008204811693830193909352605060020a810483166060830152607860020a8104909216608082015260a060020a820461ffff90811660a083015260b060020a83041660c082015260c060020a90910467ffffffffffffffff1660e0820152614431565b151561365e57600080fd5b61366a82868387614ad4565b151561367557600080fd5b61367f8585614d2a565b95945050505050565b600080548290811061369657fe5b60009182526020909120600290910201805460019091015490915064ffffffffff80821691650100000000008104821691605060020a8204811691607860020a81049091169061ffff60a060020a820481169160b060020a81049091169067ffffffffffffffff60c060020a9091041688565b600a5460009060a060020a900460ff161561372357600080fd5b600160a060020a033381166000908152600d602052604090205416151561374957600080fd5b6000805464ffffffffff851690811061375e57fe5b60009182526020909120600290910201600181015490915064ffffffffff8381166501000000000090920416146118bd57600181015464ffffffffff808516917fd82e4273ca71de0024aece65309941bf92bf97c355ca08ed03de5d18c09b38189165010000000000909104168460405164ffffffffff9283168152911660208201526040908101905180910390a260018101805464ffffffffff8416650100000000000269ffffffffff000000000019909116179055505050565b600b8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156138b05780601f10613885576101008083540402835291602001916138b0565b820191906000526020600020905b81548152906001019060200180831161389357829003601f168201915b505050505081565b6138c061537d565b61114f613966600b8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561395c5780601f106139315761010080835404028352916020019161395c565b820191906000526020600020905b81548152906001019060200180831161393f57829003601f168201915b5050505050614f32565b6139eb61397861397d61397887614f5a565b614f32565b6139eb600c8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561395c5780601f106139315761010080835404028352916020019161395c565b615270565b600a5460009060a060020a900460ff1615613a0a57600080fd5b600160a060020a033381166000908152600d6020526040902054161515613a3057600080fd5b6000805464ffffffffff8516908110613a4557fe5b60009182526020909120600290910201600181015490915061ffff83811660a060020a90920416146118bd57600181015464ffffffffff8416907f0b95606a57983e48ae4c9631df8d2e17766c3017421531c1004a4882888ef2749060a060020a900461ffff168460405161ffff9283168152911660208201526040908101905180910390a260018101805461ffff841660a060020a0275ffff000000000000000000000000000000000000000019909116179055505050565b600c8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156138b05780601f10613885576101008083540402835291602001916138b0565b60095460009033600160a060020a03908116911614613b8857600080fd5b5080600160a060020a0381166394a892336040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515613bc757600080fd5b5af11515613bd457600080fd5b505050604051805190501515613be957600080fd5b600160a060020a038281166000908152600d602052604090208054600160a060020a031916918316919091179055600e805460018101613c29838261540d565b5060009182526020909120018054600160a060020a031916600160a060020a039290921691909117905550565b6000808064ffffffffff8516819011613c6e57600080fd5b600064ffffffffff851611613c8257600080fd5b6000805464ffffffffff8716908110613c9757fe5b9060005260206000209060020201915060008464ffffffffff16815481101515613cbd57fe5b90600052602060002090600202019050613cd982868387614ad4565b801561367f575061367f8486614a6b565b601054790100000000000000000000000000000000000000000000000000900464ffffffffff1681565b600a5460009060a060020a900460ff1615613d2e57600080fd5b600160a060020a033381166000908152600d6020526040902054161515613d5457600080fd5b6000805464ffffffffff8516908110613d6957fe5b906000526020600020906002020190508181600001541415156118bd578264ffffffffff167fbecce9a2928a6d9bbe3755bd02387af9dbe05d1ecfa05028c33d7245e24a860c82600001548460405191825260208201526040908101905180910390a25550565b60095460009033600160a060020a03908116911614613dee57600080fd5b5080600160a060020a0381166390da7c3c6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515613e2d57600080fd5b5af11515613e3a57600080fd5b505050604051805190501515613e4f57600080fd5b60128054600160a060020a031916600160a060020a039290921691909117905550565b600554600160a060020a031681565b60008060008060008060008060008964ffffffffff16815481101515613ea357fe5b600091825260209091206002909102018054600190910154909a64ffffffffff8083169b5065010000000000830481169a50605060020a830481169950607860020a830416975061ffff60a060020a83048116975060b060020a909204909116945092505050565b60115465010000000000900464ffffffffff1681565b600160a060020a03918216600090815260076020526040902054821691161490565b6000806000806000806000806000613f59615431565b60095433600160a060020a03908116911614613f7457600080fd5b600a5460a060020a900460ff161515613f8c57600080fd5b8b64ffffffffff16613f9c61153d565b60010114613fa957600080fd5b8c99508b98505b64ffffffffff808c16908a16116142215789600160a060020a031663e39bdfab8a60405160e060020a63ffffffff841602815264ffffffffff909116600482015260240160e060405180830381600087803b151561400d57600080fd5b5af1151561401a57600080fd5b5050506040518051906020018051906020018051906020018051906020018051906020018051906020018051969e50949c50929a50909850965094509092506101009050604051908101604052808981526020018864ffffffffff1681526020018764ffffffffff1681526020018664ffffffffff1681526020018564ffffffffff1681526020018461ffff1681526020018361ffff168152602001600067ffffffffffffffff168152509050600080548060010182816140db9190615475565b6000928352602090922083916002020181518155602082015160018201805464ffffffffff191664ffffffffff9290921691909117905560408201518160010160056101000a81548164ffffffffff021916908364ffffffffff160217905550606082015181600101600a6101000a81548164ffffffffff021916908364ffffffffff160217905550608082015181600101600f6101000a81548164ffffffffff021916908364ffffffffff16021790555060a08201518160010160146101000a81548161ffff021916908361ffff16021790555060c08201518160010160166101000a81548161ffff021916908361ffff16021790555060e08201516001918201805467ffffffffffffffff9290921660c060020a0277ffffffffffffffffffffffffffffffffffffffffffffffff9092169190911790559a909a019950613fb09050565b50505050505050505050505050565b600e80548290811061423e57fe5b600091825260209091200154600160a060020a0316905081565b600a54600090819060a060020a900460ff161561427457600080fd5b61427e3384614448565b151561428957600080fd5b61429283611155565b151561429d57600080fd5b6142a783856152dc565b15156142b257600080fd5b6142bc8385611fbb565b905034819010156142cc57600080fd5b600654600160a060020a031663c170fd54348390038660405160e060020a63ffffffff851602815264ffffffffff90911660048201526024016000604051808303818588803b151561431d57600080fd5b5af1151561432a57600080fd5b505050506143388385614d2a565b64ffffffffff16949350505050565b60008060008364ffffffffff1681548110151561436057fe5b600091825260209091206002909102016001015465010000000000900464ffffffffff169392505050565b600a5460a060020a900460ff16156143a257600080fd5b6143ac3382614448565b15156143b757600080fd5b64ffffffffff8116600090815260046020526040908190208054600160a060020a031916600160a060020a038581169182179092559133909116907fe53f1ce10d7caafaafcb8d2857c06db87da891294ba914f8436e31b905e1e0e79084905164ffffffffff909116815260200160405180910390a35050565b600042826040015164ffffffffff16111592915050565b64ffffffffff16600090815260016020526040902054600160a060020a0391821691161490565b64ffffffffff9190911660009081526003602052604090208054600160a060020a031916600160a060020a03909216919091179055565b600181015460085460a060020a90910461ffff1690600090600160a060020a03166306347def8360405160e060020a63ffffffff841602815261ffff9091166004820152602401602060405180830381600087803b151561450657600080fd5b5af1151561451357600080fd5b505050604051805160018501805469ffffffffff000000000019166501000000000064ffffffffff9384168102919091179182905587831693507fd82e4273ca71de0024aece65309941bf92bf97c355ca08ed03de5d18c09b3818928692919091041660405164ffffffffff9283168152911660208201526040908101905180910390a2600854600160a060020a031663732606fc6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156145d657600080fd5b5af115156145e357600080fd5b505050604051805160018086015461ffff60a060020a9091048116909101161015905061193157506001808301805461ffff60a060020a80830482169485018216810275ffff000000000000000000000000000000000000000019909316929092179283905564ffffffffff8716927f0b95606a57983e48ae4c9631df8d2e17766c3017421531c1004a4882888ef27492859291041660405161ffff9283168152911660208201526040908101905180910390a250505050565b600854600090600160a060020a0316635757dcdf8360405160e060020a63ffffffff841602815261ffff9091166004820152602401602060405180830381600087803b15156146eb57600080fd5b5af115156146f857600080fd5b50505060405180519392505050565b6000614711615431565b600080610100604051908101604090815288825264ffffffffff808816602084015260009183018290528d811660608401528c16608083015261ffff808b1660a08401528b1660c083015260e0820181905280549194506001918083016147788382615475565b6000928352602090922086916002020181518155602082015160018201805464ffffffffff191664ffffffffff9290921691909117905560408201518160010160056101000a81548164ffffffffff021916908364ffffffffff160217905550606082015181600101600a6101000a81548164ffffffffff021916908364ffffffffff160217905550608082015181600101600f6101000a81548164ffffffffff021916908364ffffffffff16021790555060a08201518160010160146101000a81548161ffff021916908361ffff16021790555060c08201518160010160166101000a81548161ffff021916908361ffff16021790555060e08201516001909101805467ffffffffffffffff9290921660c060020a0277ffffffffffffffffffffffffffffffffffffffffffffffff9092169190911790555003915064ffffffffff8211156148c757600080fd5b5080600160a060020a0386167f689df1285a731b7022f6ff5c63e6b7c58c891df5b4530f12b7be0ec9ad03ecdb8260608601518660800151875160405164ffffffffff9485168152928416602084015292166040808301919091526060820192909252608001905180910390a261494060008783614975565b9a9950505050505050505050565b64ffffffffff16600090815260036020526040902054600160a060020a0391821691161490565b600160a060020a0380831660008181526002602090815260408083208054600190810190915564ffffffffff8716845290915290208054600160a060020a0319169091179055831615614a1757600160a060020a0383166000908152600260209081526040808320805460001901905564ffffffffff84168352600482528083208054600160a060020a03199081169091556003909252909120805490911690555b81600160a060020a031683600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405164ffffffffff909116815260200160405180910390a3505050565b64ffffffffff8082166000908152600160205260408082205492851682528120549091600160a060020a0390811691168082148061367f575064ffffffffff8516600090815260046020526040902054600160a060020a03908116908316149250505092915050565b60008364ffffffffff168264ffffffffff161415614af457506000614d22565b600185015464ffffffffff838116605060020a909204161415614b1957506000614d22565b600185015464ffffffffff838116607860020a909204161415614b3e57506000614d22565b600183015464ffffffffff858116605060020a909204161415614b6357506000614d22565b600183015464ffffffffff858116607860020a909204161415614b8857506000614d22565b6001830154605060020a900464ffffffffff161515614ba957506001614d22565b6001850154605060020a900464ffffffffff161515614bca57506001614d22565b60018581015490840154605060020a9182900464ffffffffff90811692909104161415614bf957506000614d22565b60018086015490840154605060020a900464ffffffffff908116607860020a909204161415614c2a57506000614d22565b60018086015490840154607860020a900464ffffffffff908116605060020a909204161415614c5b57506000614d22565b60018581015490840154607860020a9182900464ffffffffff90811692909104161415614c8a57506000614d22565b60125485548454600160a060020a039092169163c868a569918791869060405160e060020a63ffffffff871602815264ffffffffff94851660048201526024810193909352921660448201526064810191909152608401602060405180830381600087803b1515614cfa57600080fd5b5af11515614d0757600080fd5b5050506040518051905015614d1e57506001614d22565b5060005b949350505050565b6000806000806000806000808864ffffffffff16815481101515614d4a57fe5b9060005260206000209060020201955060008964ffffffffff16815481101515614d7057fe5b90600052602060002090600202019450614d8a88876144a6565b614d9489866144a6565b64ffffffffff808a166000908152600460205260408082208054600160a060020a03199081169091558b841683529120805490911690556001860154161515614ddc57600080fd5b60085460018681015490880154600160a060020a0390921691631af97fb79161ffff60b060020a91829004811692919091041660405160e060020a63ffffffff851602815261ffff928316600482015291166024820152604401602060405180830381600087803b1515614e4f57600080fd5b5af11515614e5c57600080fd5b505050604051805160125487548954929750600160a060020a039091169250638d8b1b889160405160e060020a63ffffffff851602815260048101929092526024820152604401602060405180830381600087803b1515614ebc57600080fd5b5af11515614ec957600080fd5b505050604051805164ffffffffff8b16600090815260016020526040902054909450600160a060020a03169250614f259050898986614f078161469d565b60018a01548890889065010000000000900464ffffffffff16614707565b9998505050505050505050565b614f3a6154a1565b602082016040805190810160405280845181526020019190915292915050565b614f6261537d565b614f6a61537d565b6000614f7461537d565b60206040519081016040526000815292505b600a808604950691506020604051908101604052600081529050811515614fe25760408051908101604052600181527f300000000000000000000000000000000000000000000000000000000000000060208201529050615242565b81600114156150265760408051908101604052600181527f310000000000000000000000000000000000000000000000000000000000000060208201529050615242565b816002141561506a5760408051908101604052600181527f320000000000000000000000000000000000000000000000000000000000000060208201529050615242565b81600314156150ae5760408051908101604052600181527f330000000000000000000000000000000000000000000000000000000000000060208201529050615242565b81600414156150f25760408051908101604052600181527f340000000000000000000000000000000000000000000000000000000000000060208201529050615242565b81600514156151365760408051908101604052600181527f350000000000000000000000000000000000000000000000000000000000000060208201529050615242565b816006141561517a5760408051908101604052600181527f360000000000000000000000000000000000000000000000000000000000000060208201529050615242565b81600714156151be5760408051908101604052600181527f370000000000000000000000000000000000000000000000000000000000000060208201529050615242565b81600814156152025760408051908101604052600181527f380000000000000000000000000000000000000000000000000000000000000060208201529050615242565b81600914156152425760408051908101604052600181527f3900000000000000000000000000000000000000000000000000000000000000602082015290505b61525761524e82614f32565b6139eb85614f32565b9250600085111561526757614f86565b50909392505050565b61527861537d565b61528061537d565b600083518551016040518059106152945750595b818152601f19601f8301168101602001604052905091506020820190506152c18186602001518751615338565b6152d48551820185602001518651615338565b509392505050565b6000806000808564ffffffffff168154811015156152f657fe5b9060005260206000209060020201915060008464ffffffffff1681548110151561531c57fe5b9060005260206000209060020201905061367f82868387614ad4565b60005b6020821061535e578251845260208401935060208301925060208203915061533b565b6001826020036101000a03905080198351168185511617909352505050565b60206040519081016040526000815290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106153d057805160ff19168380011785556153fd565b828001600101855582156153fd579182015b828111156153fd5782518255916020019190600101906153e2565b506154099291506154b8565b5090565b8154818355818115116118bd576000838152602090206118bd9181019083016154b8565b6101006040519081016040908152600080835260208301819052908201819052606082018190526080820181905260a0820181905260c0820181905260e082015290565b8154818355818115116118bd576002028160020283600052602060002091820191016118bd91906154d2565b604080519081016040526000808252602082015290565b61126d91905b8082111561540957600081556001016154be565b61126d91905b8082111561540957600080825560018201556002016154d85600a165627a7a72305820fccbe691abb06d9806ab2748d7bf4cc1482eac0cf5def2e6910ac841da66403b0029

Swarm Source

bzzr://fccbe691abb06d9806ab2748d7bf4cc1482eac0cf5def2e6910ac841da66403b
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.