ETH Price: $3,289.10 (-2.76%)

Contract

0xA98Ad92a642570b83B369C4eb70efefe638bc895
 
Transaction Hash
Method
Block
From
To
Approve209639442024-10-14 12:56:4739 days ago1728910607IN
Fishbank Token
0 ETH0.0017072733.8885286
Approve206337332024-08-29 10:46:1185 days ago1724928371IN
Fishbank Token
0 ETH0.000088381.75438583
Approve206216652024-08-27 18:18:4787 days ago1724782727IN
Fishbank Token
0 ETH0.000121772.41719542
Approve206182152024-08-27 6:45:5987 days ago1724741159IN
Fishbank Token
0 ETH0.000089711.78077482
Transfer204040732024-07-28 9:12:47117 days ago1722157967IN
Fishbank Token
0 ETH0.000129882.26
Transfer From203953472024-07-27 3:58:11118 days ago1722052691IN
Fishbank Token
0 ETH0.000067282.5
Transfer From203953342024-07-27 3:55:35118 days ago1722052535IN
Fishbank Token
0 ETH0.000058772.18379597
Approve203815322024-07-25 5:40:11120 days ago1721886011IN
Fishbank Token
0 ETH0.000150892.99515474
Approve201432822024-06-21 23:09:59153 days ago1719011399IN
Fishbank Token
0 ETH0.000147632.93057088
Approve200660752024-06-11 4:02:59164 days ago1718078579IN
Fishbank Token
0 ETH0.000427828.49203318
Approve196804282024-04-18 6:02:59218 days ago1713420179IN
Fishbank Token
0 ETH0.0003447411.3108613
Approve196804112024-04-18 5:59:35218 days ago1713419975IN
Fishbank Token
0 ETH0.0005502410.92212991
Approve177798022023-07-26 21:00:47484 days ago1690405247IN
Fishbank Token
0 ETH0.0012256740.21374411
Approve176665972023-07-10 23:44:23500 days ago1689032663IN
Fishbank Token
0 ETH0.0007947815.77609679
Approve166136212023-02-12 15:37:11649 days ago1676216231IN
Fishbank Token
0 ETH0.0008141416.16043152
Approve163467642023-01-06 9:11:23686 days ago1672996283IN
Fishbank Token
0 ETH0.0004957616.26567377
Approve163467382023-01-06 9:06:11686 days ago1672995971IN
Fishbank Token
0 ETH0.0007732915.34945175
Approve160636692022-11-27 20:20:35725 days ago1669580435IN
Fishbank Token
0 ETH0.0005298510.5173724
Approve159197082022-11-07 17:42:11746 days ago1667842931IN
Fishbank Token
0 ETH0.0005755218.89000668
Approve159196962022-11-07 17:39:47746 days ago1667842787IN
Fishbank Token
0 ETH0.0009100818.06909305
Transfer From155594852022-09-18 9:17:11796 days ago1663492631IN
Fishbank Token
0 ETH0.000053822
Transfer From155594602022-09-18 9:11:59796 days ago1663492319IN
Fishbank Token
0 ETH0.000053822
Approve139573892022-01-07 8:59:451050 days ago1641545985IN
Fishbank Token
0 ETH0.00383243125.39463948
Approve139573862022-01-07 8:59:081050 days ago1641545948IN
Fishbank Token
0 ETH0.00351522115.01570148
Approve139573822022-01-07 8:58:051050 days ago1641545885IN
Fishbank Token
0 ETH0.00581258115.18503573
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
130195362021-08-13 22:25:361196 days ago1628893536
Fishbank Token
0.02 ETH
90962482019-12-12 20:19:111806 days ago1576181951
Fishbank Token
0.03 ETH
90962482019-12-12 20:19:111806 days ago1576181951
Fishbank Token
0.03 ETH
90962482019-12-12 20:19:111806 days ago1576181951
Fishbank Token
0.03 ETH
90621922019-12-06 19:45:251812 days ago1575661525
Fishbank Token
0.03 ETH
90226242019-11-29 18:59:401819 days ago1575053980
Fishbank Token
0.02 ETH
90226222019-11-29 18:59:101819 days ago1575053950
Fishbank Token
0.03 ETH
90225762019-11-29 18:49:211819 days ago1575053361
Fishbank Token
0.03 ETH
89785342019-11-22 4:59:291827 days ago1574398769
Fishbank Token
0.03 ETH
89693422019-11-20 16:19:591829 days ago1574266799
Fishbank Token
0.03 ETH
89496642019-11-17 9:25:551832 days ago1573982755
Fishbank Token
0.015 ETH
88815132019-11-06 3:30:531843 days ago1573011053
Fishbank Token
0.03 ETH
87820482019-10-21 5:20:551859 days ago1571635255
Fishbank Token
0.03 ETH
87811422019-10-21 1:48:381859 days ago1571622518
Fishbank Token
0.015 ETH
87801082019-10-20 21:51:131859 days ago1571608273
Fishbank Token
0.03 ETH
87766022019-10-20 8:49:501860 days ago1571561390
Fishbank Token
0.03 ETH
86757452019-10-04 12:49:121876 days ago1570193352
Fishbank Token
0.03 ETH
86755072019-10-04 11:51:561876 days ago1570189916
Fishbank Token
0.03 ETH
86437372019-09-29 12:44:031881 days ago1569761043
Fishbank Token
0.03 ETH
86437372019-09-29 12:44:031881 days ago1569761043
Fishbank Token
0.03 ETH
86347082019-09-28 2:42:411882 days ago1569638561
Fishbank Token
0.03 ETH
85811662019-09-19 17:32:241891 days ago1568914344
Fishbank Token
0.03 ETH
85442322019-09-13 23:35:431896 days ago1568417743
Fishbank Token
0.03 ETH
85336862019-09-12 7:56:181898 days ago1568274978
Fishbank Token
0.03 ETH
85247312019-09-10 22:18:061899 days ago1568153886
Fishbank Token
0.03 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Fishbank

Compiler Version
v0.4.21+commit.dfe3193c

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

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

pragma solidity ^0.4.18;


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


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


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


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


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

}








contract Beneficiary is Ownable {

    address public beneficiary;

    function Beneficiary() public {
        beneficiary = msg.sender;
    }

    function setBeneficiary(address _beneficiary) onlyOwner public {
        beneficiary = _beneficiary;
    }


}



contract ChestsStore is Beneficiary {


    struct chestProduct {
        uint256 price; // Price in wei
        bool isLimited; // is limited sale chest
        uint32 limit; // Sell limit
        uint16 boosters; // count of boosters
        uint24 raiseChance;// in 1/10 of percent
        uint24 raiseStrength;// in 1/10 of percent for params or minutes for timebased boosters
        uint8 onlyBoosterType;//If set chest will produce only this type
        uint8 onlyBoosterStrength;
    }


    chestProduct[255] public chestProducts;
    FishbankChests chests;


    function ChestsStore(address _chests) public {
        chests = FishbankChests(_chests);
        //set chests to this address
    }

    function initChestsStore() public onlyOwner {
        // Create basic chests types
        setChestProduct(1, 0, 1, false, 0, 0, 0, 0, 0);
        setChestProduct(2, 15 finney, 3, false, 0, 0, 0, 0, 0);
        setChestProduct(3, 20 finney, 5, false, 0, 0, 0, 0, 0);
    }

    function setChestProduct(uint16 chestId, uint256 price, uint16 boosters, bool isLimited, uint32 limit, uint24 raiseChance, uint24 raiseStrength, uint8 onlyBoosterType, uint8 onlyBoosterStrength) onlyOwner public {
        chestProduct storage newProduct = chestProducts[chestId];
        newProduct.price = price;
        newProduct.boosters = boosters;
        newProduct.isLimited = isLimited;
        newProduct.limit = limit;
        newProduct.raiseChance = raiseChance;
        newProduct.raiseStrength = raiseStrength;
        newProduct.onlyBoosterType = onlyBoosterType;
        newProduct.onlyBoosterStrength = onlyBoosterStrength;
    }

    function setChestPrice(uint16 chestId, uint256 price) onlyOwner public {
        chestProducts[chestId].price = price;
    }

    function buyChest(uint16 _chestId) payable public {
        chestProduct memory tmpChestProduct = chestProducts[_chestId];

        require(tmpChestProduct.price > 0);
        // only chests with price
        require(msg.value >= tmpChestProduct.price);
        //check if enough ether is send
        require(!tmpChestProduct.isLimited || tmpChestProduct.limit > 0);
        //check limits if they exists

        chests.mintChest(msg.sender, tmpChestProduct.boosters, tmpChestProduct.raiseStrength, tmpChestProduct.raiseChance, tmpChestProduct.onlyBoosterType, tmpChestProduct.onlyBoosterStrength);

        if (msg.value > chestProducts[_chestId].price) {//send to much ether send some back
            msg.sender.transfer(msg.value - chestProducts[_chestId].price);
        }

        beneficiary.transfer(chestProducts[_chestId].price);
        //send paid eth to beneficiary

    }


}





contract FishbankBoosters is Ownable {

    struct Booster {
        address owner;
        uint32 duration;
        uint8 boosterType;
        uint24 raiseValue;
        uint8 strength;
        uint32 amount;
    }

    Booster[] public boosters;
    bool public implementsERC721 = true;
    string public name = "Fishbank Boosters";
    string public symbol = "FISHB";
    mapping(uint256 => address) public approved;
    mapping(address => uint256) public balances;
    address public fishbank;
    address public chests;
    address public auction;

    modifier onlyBoosterOwner(uint256 _tokenId) {
        require(boosters[_tokenId].owner == msg.sender);
        _;
    }

    modifier onlyChest() {
        require(chests == msg.sender);
        _;
    }

    function FishbankBoosters() public {
        //nothing yet
    }

    //mints the boosters can only be called by owner. could be a smart contract
    function mintBooster(address _owner, uint32 _duration, uint8 _type, uint8 _strength, uint32 _amount, uint24 _raiseValue) onlyChest public {
        boosters.length ++;

        Booster storage tempBooster = boosters[boosters.length - 1];

        tempBooster.owner = _owner;
        tempBooster.duration = _duration;
        tempBooster.boosterType = _type;
        tempBooster.strength = _strength;
        tempBooster.amount = _amount;
        tempBooster.raiseValue = _raiseValue;

        Transfer(address(0), _owner, boosters.length - 1);
    }

    function setFishbank(address _fishbank) onlyOwner public {
        fishbank = _fishbank;
    }

    function setChests(address _chests) onlyOwner public {
        if (chests != address(0)) {
            revert();
        }
        chests = _chests;
    }

    function setAuction(address _auction) onlyOwner public {
        auction = _auction;
    }

    function getBoosterType(uint256 _tokenId) view public returns (uint8 boosterType) {
        boosterType = boosters[_tokenId].boosterType;
    }

    function getBoosterAmount(uint256 _tokenId) view public returns (uint32 boosterAmount) {
        boosterAmount = boosters[_tokenId].amount;
    }

    function getBoosterDuration(uint256 _tokenId) view public returns (uint32) {
        if (boosters[_tokenId].boosterType == 4 || boosters[_tokenId].boosterType == 2) {
            return boosters[_tokenId].duration + boosters[_tokenId].raiseValue * 60;
        }
        return boosters[_tokenId].duration;
    }

    function getBoosterStrength(uint256 _tokenId) view public returns (uint8 strength) {
        strength = boosters[_tokenId].strength;
    }

    function getBoosterRaiseValue(uint256 _tokenId) view public returns (uint24 raiseValue) {
        raiseValue = boosters[_tokenId].raiseValue;
    }

    //ERC721 functionality
    //could split this to a different contract but doesn't make it easier to read
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    function totalSupply() public view returns (uint256 total) {
        total = boosters.length;
    }

    function balanceOf(address _owner) public view returns (uint256 balance){
        balance = balances[_owner];
    }

    function ownerOf(uint256 _tokenId) public view returns (address owner){
        owner = boosters[_tokenId].owner;
    }

    function _transfer(address _from, address _to, uint256 _tokenId) internal {
        require(boosters[_tokenId].owner == _from);
        //can only transfer if previous owner equals from
        boosters[_tokenId].owner = _to;
        approved[_tokenId] = address(0);
        //reset approved of fish on every transfer
        balances[_from] -= 1;
        //underflow can only happen on 0x
        balances[_to] += 1;
        //overflows only with very very large amounts of fish
        Transfer(_from, _to, _tokenId);
    }

    function transfer(address _to, uint256 _tokenId) public
    onlyBoosterOwner(_tokenId) //check if msg.sender is the owner of this fish
    returns (bool)
    {
        _transfer(msg.sender, _to, _tokenId);
        //after master modifier invoke internal transfer
        return true;
    }

    function approve(address _to, uint256 _tokenId) public
    onlyBoosterOwner(_tokenId)
    {
        approved[_tokenId] = _to;
        Approval(msg.sender, _to, _tokenId);
    }

    function transferFrom(address _from, address _to, uint256 _tokenId) public returns (bool) {
        require(approved[_tokenId] == msg.sender || msg.sender == fishbank || msg.sender == auction);
        //require msg.sender to be approved for this token or to be the fishbank contract
        _transfer(_from, _to, _tokenId);
        //handles event, balances and approval reset
        return true;
    }


    function takeOwnership(uint256 _tokenId) public {
        require(approved[_tokenId] == msg.sender);
        _transfer(ownerOf(_tokenId), msg.sender, _tokenId);
    }


}






contract FishbankChests is Ownable {

    struct Chest {
        address owner;
        uint16 boosters;
        uint16 chestType;
        uint24 raiseChance;//Increace chance to catch bigger chest (1 = 1:10000)
        uint8 onlySpecificType;
        uint8 onlySpecificStrength;
        uint24 raiseStrength;
    }

    Chest[] public chests;
    FishbankBoosters public boosterContract;
    mapping(uint256 => address) public approved;
    mapping(address => uint256) public balances;
    mapping(address => bool) public minters;

    modifier onlyChestOwner(uint256 _tokenId) {
        require(chests[_tokenId].owner == msg.sender);
        _;
    }

    modifier onlyMinters() {
        require(minters[msg.sender]);
        _;
    }

    function FishbankChests(address _boosterAddress) public {
        boosterContract = FishbankBoosters(_boosterAddress);
    }

    function addMinter(address _minter) onlyOwner public {
        minters[_minter] = true;
    }

    function removeMinter(address _minter) onlyOwner public {
        minters[_minter] = false;
    }

    //create a chest

    function mintChest(address _owner, uint16 _boosters, uint24 _raiseStrength, uint24 _raiseChance, uint8 _onlySpecificType, uint8 _onlySpecificStrength) onlyMinters public {

        chests.length++;
        chests[chests.length - 1].owner = _owner;
        chests[chests.length - 1].boosters = _boosters;
        chests[chests.length - 1].raiseStrength = _raiseStrength;
        chests[chests.length - 1].raiseChance = _raiseChance;
        chests[chests.length - 1].onlySpecificType = _onlySpecificType;
        chests[chests.length - 1].onlySpecificStrength = _onlySpecificStrength;
        Transfer(address(0), _owner, chests.length - 1);
    }

    function convertChest(uint256 _tokenId) onlyChestOwner(_tokenId) public {

        Chest memory chest = chests[_tokenId];
        uint16 numberOfBoosters = chest.boosters;

        if (chest.onlySpecificType != 0) {//Specific boosters
            if (chest.onlySpecificType == 1 || chest.onlySpecificType == 3) {
                boosterContract.mintBooster(msg.sender, 2 days, chest.onlySpecificType, chest.onlySpecificStrength, chest.boosters, chest.raiseStrength);
            } else if (chest.onlySpecificType == 5) {//Instant attack
                boosterContract.mintBooster(msg.sender, 0, 5, 1, chest.boosters, chest.raiseStrength);
            } else if (chest.onlySpecificType == 2) {//Freeze
                uint32 freezeTime = 7 days;
                if (chest.onlySpecificStrength == 2) {
                    freezeTime = 14 days;
                } else if (chest.onlySpecificStrength == 3) {
                    freezeTime = 30 days;
                }
                boosterContract.mintBooster(msg.sender, freezeTime, 5, chest.onlySpecificType, chest.boosters, chest.raiseStrength);
            } else if (chest.onlySpecificType == 4) {//Watch
                uint32 watchTime = 12 hours;
                if (chest.onlySpecificStrength == 2) {
                    watchTime = 48 hours;
                } else if (chest.onlySpecificStrength == 3) {
                    watchTime = 3 days;
                }
                boosterContract.mintBooster(msg.sender, watchTime, 4, chest.onlySpecificStrength, chest.boosters, chest.raiseStrength);
            }

        } else {//Regular chest

            for (uint8 i = 0; i < numberOfBoosters; i ++) {
                uint24 random = uint16(keccak256(block.coinbase, block.blockhash(block.number - 1), i, chests.length)) % 1000
                - chest.raiseChance;
                //get random 0 - 9999 minus raiseChance

                if (random > 850) {
                    boosterContract.mintBooster(msg.sender, 2 days, 1, 1, 1, chest.raiseStrength); //Small Agility Booster
                } else if (random > 700) {
                    boosterContract.mintBooster(msg.sender, 7 days, 2, 1, 1, chest.raiseStrength); //Small Freezer
                } else if (random > 550) {
                    boosterContract.mintBooster(msg.sender, 2 days, 3, 1, 1, chest.raiseStrength); //Small Power Booster
                } else if (random > 400) {
                    boosterContract.mintBooster(msg.sender, 12 hours, 4, 1, 1, chest.raiseStrength); //Tiny Watch
                } else if (random > 325) {
                    boosterContract.mintBooster(msg.sender, 48 hours, 4, 2, 1, chest.raiseStrength); //Small Watch
                } else if (random > 250) {
                    boosterContract.mintBooster(msg.sender, 2 days, 1, 2, 1, chest.raiseStrength); //Mid Agility Booster
                } else if (random > 175) {
                    boosterContract.mintBooster(msg.sender, 14 days, 2, 2, 1, chest.raiseStrength); //Mid Freezer
                } else if (random > 100) {
                    boosterContract.mintBooster(msg.sender, 2 days, 3, 2, 1, chest.raiseStrength); //Mid Power Booster
                } else if (random > 80) {
                    boosterContract.mintBooster(msg.sender, 2 days, 1, 3, 1, chest.raiseStrength); //Big Agility Booster
                } else if (random > 60) {
                    boosterContract.mintBooster(msg.sender, 30 days, 2, 3, 1, chest.raiseStrength); //Big Freezer
                } else if (random > 40) {
                    boosterContract.mintBooster(msg.sender, 2 days, 3, 3, 1, chest.raiseStrength); //Big Power Booster
                } else if (random > 20) {
                    boosterContract.mintBooster(msg.sender, 0, 5, 1, 1, 0); //Instant Attack
                } else {
                    boosterContract.mintBooster(msg.sender, 3 days, 4, 3, 1, 0); //Gold Watch
                }
            }
        }

        _transfer(msg.sender, address(0), _tokenId); //burn chest
    }

    //ERC721 functionality
    //could split this to a different contract but doesn't make it easier to read
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    function totalSupply() public view returns (uint256 total) {
        total = chests.length;
    }

    function balanceOf(address _owner) public view returns (uint256 balance){
        balance = balances[_owner];
    }

    function ownerOf(uint256 _tokenId) public view returns (address owner){
        owner = chests[_tokenId].owner;
    }

    function _transfer(address _from, address _to, uint256 _tokenId) internal {
        require(chests[_tokenId].owner == _from); //can only transfer if previous owner equals from
        chests[_tokenId].owner = _to;
        approved[_tokenId] = address(0); //reset approved of fish on every transfer
        balances[_from] -= 1; //underflow can only happen on 0x
        balances[_to] += 1; //overflows only with very very large amounts of fish
        Transfer(_from, _to, _tokenId);
    }

    function transfer(address _to, uint256 _tokenId) public
    onlyChestOwner(_tokenId) //check if msg.sender is the owner of this fish
    returns (bool)
    {
        _transfer(msg.sender, _to, _tokenId);
        //after master modifier invoke internal transfer
        return true;
    }

    function approve(address _to, uint256 _tokenId) public
    onlyChestOwner(_tokenId)
    {
        approved[_tokenId] = _to;
        Approval(msg.sender, _to, _tokenId);
    }

    function transferFrom(address _from, address _to, uint256 _tokenId) public returns (bool) {
        require(approved[_tokenId] == msg.sender);
        //require msg.sender to be approved for this token
        _transfer(_from, _to, _tokenId);
        //handles event, balances and approval reset
        return true;
    }

}





contract FishbankUtils is Ownable {

    uint32[100] cooldowns = [
        720 minutes, 720 minutes, 720 minutes, 720 minutes, 720 minutes, //1-5
        660 minutes, 660 minutes, 660 minutes, 660 minutes, 660 minutes, //6-10
        600 minutes, 600 minutes, 600 minutes, 600 minutes, 600 minutes, //11-15
        540 minutes, 540 minutes, 540 minutes, 540 minutes, 540 minutes, //16-20
        480 minutes, 480 minutes, 480 minutes, 480 minutes, 480 minutes, //21-25
        420 minutes, 420 minutes, 420 minutes, 420 minutes, 420 minutes, //26-30
        360 minutes, 360 minutes, 360 minutes, 360 minutes, 360 minutes, //31-35
        300 minutes, 300 minutes, 300 minutes, 300 minutes, 300 minutes, //36-40
        240 minutes, 240 minutes, 240 minutes, 240 minutes, 240 minutes, //41-45
        180 minutes, 180 minutes, 180 minutes, 180 minutes, 180 minutes, //46-50
        120 minutes, 120 minutes, 120 minutes, 120 minutes, 120 minutes, //51-55
        90 minutes,  90 minutes,  90 minutes,  90 minutes,  90 minutes,  //56-60
        75 minutes,  75 minutes,  75 minutes,  75 minutes,  75 minutes,  //61-65
        60 minutes,  60 minutes,  60 minutes,  60 minutes,  60 minutes,  //66-70
        50 minutes,  50 minutes,  50 minutes,  50 minutes,  50 minutes,  //71-75
        40 minutes,  40 minutes,  40 minutes,  40 minutes,  40 minutes,  //76-80
        30 minutes,  30 minutes,  30 minutes,  30 minutes,  30 minutes,  //81-85
        20 minutes,  20 minutes,  20 minutes,  20 minutes,  20 minutes,  //86-90
        10 minutes,  10 minutes,  10 minutes,  10 minutes,  10 minutes,  //91-95
        5 minutes,   5 minutes,   5 minutes,   5 minutes,   5 minutes    //96-100
    ];


    function setCooldowns(uint32[100] _cooldowns) onlyOwner public {
        cooldowns = _cooldowns;
    }

    function getFishParams(uint256 hashSeed1, uint256 hashSeed2, uint256 fishesLength, address coinbase) external pure returns (uint32[4]) {

        bytes32[5] memory hashSeeds;
        hashSeeds[0] = keccak256(hashSeed1 ^ hashSeed2); //xor both seed from owner and user so no one can cheat
        hashSeeds[1] = keccak256(hashSeeds[0], fishesLength);
        hashSeeds[2] = keccak256(hashSeeds[1], coinbase);
        hashSeeds[3] = keccak256(hashSeeds[2], coinbase, fishesLength);
        hashSeeds[4] = keccak256(hashSeeds[1], hashSeeds[2], hashSeeds[0]);

        uint24[6] memory seeds = [
            uint24(uint(hashSeeds[3]) % 10e6 + 1), //whale chance
            uint24(uint(hashSeeds[0]) % 420 + 1), //power
            uint24(uint(hashSeeds[1]) % 420 + 1), //agility
            uint24(uint(hashSeeds[2]) % 150 + 1), //speed
            uint24(uint(hashSeeds[4]) % 16 + 1), //whale type
            uint24(uint(hashSeeds[4]) % 5000 + 1) //rarity
        ];

        uint32[4] memory fishParams;

        if (seeds[0] == 1000000) {//This is a whale 1:1 000 000 chance

            if (seeds[4] == 1) {//Orca
                fishParams = [140 + uint8(seeds[1] / 42), 140 + uint8(seeds[2] / 42), 75 + uint8(seeds[3] / 6), uint32(500000)];
                if(fishParams[0] == 140) {
                    fishParams[0]++;
                }
                if(fishParams[1] == 140) {
                    fishParams[1]++;
                }
                if(fishParams[2] == 75) {
                    fishParams[2]++;
                }
            } else if (seeds[4] < 4) {//Blue whale
                fishParams = [130 + uint8(seeds[1] / 42), 130 + uint8(seeds[2] / 42), 75 + uint8(seeds[3] / 6), uint32(500000)];
                if(fishParams[0] == 130) {
                    fishParams[0]++;
                }
                if(fishParams[1] == 130) {
                    fishParams[1]++;
                }
                if(fishParams[2] == 75) {
                    fishParams[2]++;
                }
            } else {//Cachalot
                fishParams = [115 + uint8(seeds[1] / 28), 115 + uint8(seeds[2] / 28), 75 + uint8(seeds[3] / 6), uint32(500000)];
                if(fishParams[0] == 115) {
                    fishParams[0]++;
                }
                if(fishParams[1] == 115) {
                    fishParams[1]++;
                }
                if(fishParams[2] == 75) {
                    fishParams[2]++;
                }
            }
        } else {
            if (seeds[5] == 5000) {//Legendary
                fishParams = [85 + uint8(seeds[1] / 14), 85 + uint8(seeds[2] / 14), uint8(50 + seeds[3] / 3), uint32(1000)];
                if(fishParams[0] == 85) {
                    fishParams[0]++;
                }
                if(fishParams[1] == 85) {
                    fishParams[1]++;
                }
            } else if (seeds[5] > 4899) {//Epic
                fishParams = [50 + uint8(seeds[1] / 12), 50 + uint8(seeds[2] / 12), uint8(25 + seeds[3] / 2), uint32(300)];
                if(fishParams[0] == 50) {
                    fishParams[0]++;
                }
                if(fishParams[1] == 50) {
                    fishParams[1]++;
                }

            } else if (seeds[5] > 4000) {//Rare
                fishParams = [20 + uint8(seeds[1] / 14), 20 + uint8(seeds[2] / 14), uint8(25 + seeds[3] / 3), uint32(100)];
                if(fishParams[0] == 20) {
                    fishParams[0]++;
                }
                if(fishParams[1] == 20) {
                    fishParams[1]++;
                }
            } else {//Common
                fishParams = [uint8(seeds[1] / 21), uint8(seeds[2] / 21), uint8(seeds[3] / 3), uint32(36)];
                if (fishParams[0] == 0) {
                    fishParams[0] = 1;
                }
                if (fishParams[1] == 0) {
                    fishParams[1] = 1;
                }
                if (fishParams[2] == 0) {
                    fishParams[2] = 1;
                }
            }
        }

        return fishParams;
    }

    function getCooldown(uint16 speed) external view returns (uint64){
        return uint64(now + cooldowns[speed - 1]);
    }

    //Ceiling function for fish generator
    function ceil(uint base, uint divider) internal pure returns (uint) {
        return base / divider + ((base % divider > 0) ? 1 : 0);
    }
}




/// @title Auction contract for any type of erc721 token
/// @author Fishbank

contract ERC721 {

    function implementsERC721() public pure returns (bool);

    function totalSupply() public view returns (uint256 total);

    function balanceOf(address _owner) public view returns (uint256 balance);

    function ownerOf(uint256 _tokenId) public view returns (address owner);

    function approve(address _to, uint256 _tokenId) public;

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

    function transfer(address _to, uint256 _tokenId) public returns (bool);

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

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

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


contract ERC721Auction is Beneficiary {

    struct Auction {
        address seller;
        uint256 tokenId;
        uint64 auctionBegin;
        uint64 auctionEnd;
        uint256 startPrice;
        uint256 endPrice;
    }

    uint32 public auctionDuration = 7 days;

    ERC721 public ERC721Contract;
    uint256 public fee = 45000; //in 1 10000th of a percent so 4.5% at the start
    uint256 constant FEE_DIVIDER = 1000000;
    mapping(uint256 => Auction) public auctions;

    event AuctionWon(uint256 indexed tokenId, address indexed winner, address indexed seller, uint256 price);

    event AuctionStarted(uint256 indexed tokenId, address indexed seller);

    event AuctionFinalized(uint256 indexed tokenId, address indexed seller);


    function startAuction(uint256 _tokenId, uint256 _startPrice, uint256 _endPrice) external {
        require(ERC721Contract.transferFrom(msg.sender, address(this), _tokenId));
        //Prices must be in range from 0.01 Eth and 10 000 Eth
        require(_startPrice <= 10000 ether && _endPrice <= 10000 ether);
        require(_startPrice >= (1 ether / 100) && _endPrice >= (1 ether / 100));

        Auction memory auction;

        auction.seller = msg.sender;
        auction.tokenId = _tokenId;
        auction.auctionBegin = uint64(now);
        auction.auctionEnd = uint64(now + auctionDuration);
        require(auction.auctionEnd > auction.auctionBegin);
        auction.startPrice = _startPrice;
        auction.endPrice = _endPrice;

        auctions[_tokenId] = auction;

        AuctionStarted(_tokenId, msg.sender);
    }


    function buyAuction(uint256 _tokenId) payable external {
        Auction storage auction = auctions[_tokenId];

        uint256 price = calculateBid(_tokenId);
        uint256 totalFee = price * fee / FEE_DIVIDER; //safe math needed?

        require(price <= msg.value); //revert if not enough ether send

        if (price != msg.value) {//send back to much eth
            msg.sender.transfer(msg.value - price);
        }

        beneficiary.transfer(totalFee);

        auction.seller.transfer(price - totalFee);

        if (!ERC721Contract.transfer(msg.sender, _tokenId)) {
            revert();
            //can't complete transfer if this fails
        }

        AuctionWon(_tokenId, msg.sender, auction.seller, price);

        delete auctions[_tokenId];
        //deletes auction
    }

    function saveToken(uint256 _tokenId) external {
        require(auctions[_tokenId].auctionEnd < now);
        //auction must have ended
        require(ERC721Contract.transfer(auctions[_tokenId].seller, _tokenId));
        //transfer fish back to seller

        AuctionFinalized(_tokenId, auctions[_tokenId].seller);

        delete auctions[_tokenId];
        //delete auction
    }

    function ERC721Auction(address _ERC721Contract) public {
        ERC721Contract = ERC721(_ERC721Contract);
    }

    function setFee(uint256 _fee) onlyOwner public {
        if (_fee > fee) {
            revert(); //fee can only be set to lower value to prevent attacks by owner
        }
        fee = _fee; // all is well set fee
    }

    function calculateBid(uint256 _tokenId) public view returns (uint256) {
        Auction storage auction = auctions[_tokenId];

        if (now >= auction.auctionEnd) {//if auction ended return auction end price
            return auction.endPrice;
        }
        //get hours passed
        uint256 hoursPassed = (now - auction.auctionBegin) / 1 hours;
        uint256 currentPrice;
        //get total hours
        uint16 totalHours = uint16(auctionDuration /1 hours) - 1;

        if (auction.endPrice > auction.startPrice) {
            currentPrice = auction.startPrice + (hoursPassed * (auction.endPrice - auction.startPrice))/ totalHours;
        } else if(auction.endPrice < auction.startPrice) {
            currentPrice = auction.startPrice - (hoursPassed * (auction.startPrice - auction.endPrice))/ totalHours;
        } else {//start and end are the same
            currentPrice = auction.endPrice;
        }

        return uint256(currentPrice);
        //return the price at this very moment
    }

    /// return token if case when need to redeploy auction contract
    function returnToken(uint256 _tokenId) onlyOwner public {
        require(ERC721Contract.transfer(auctions[_tokenId].seller, _tokenId));
        //transfer fish back to seller

        AuctionFinalized(_tokenId, auctions[_tokenId].seller);

        delete auctions[_tokenId];
    }
}


/// @title Core contract of fishbank
/// @author Fishbank

contract Fishbank is ChestsStore {

    struct Fish {
        address owner;
        uint8 activeBooster;
        uint64 boostedTill;
        uint8 boosterStrength;
        uint24 boosterRaiseValue;
        uint64 weight;
        uint16 power;
        uint16 agility;
        uint16 speed;
        bytes16 color;
        uint64 canFightAgain;
        uint64 canBeAttackedAgain;
    }

    struct FishingAttempt {
        address fisher;
        uint256 feePaid;
        address affiliate;
        uint256 seed;
        uint64 deadline;//till when does the contract owner have time to resolve;
    }

    modifier onlyFishOwner(uint256 _tokenId) {
        require(fishes[_tokenId].owner == msg.sender);
        _;
    }

    modifier onlyResolver() {
        require(msg.sender == resolver);
        _;
    }

    modifier onlyMinter() {
        require(msg.sender == minter);
        _;
    }

    Fish[] public fishes;
    address public resolver;
    address public auction;
    address public minter;
    bool public implementsERC721 = true;
    string public name = "Fishbank";
    string public symbol = "FISH";
    bytes32[] public randomHashes;
    uint256 public hashesUsed;
    uint256 public aquariumCost = 1 ether / 100 * 3;//fee for fishing starts at 0.03 ether
    uint256 public resolveTime = 30 minutes;//how long does the contract owner have to resolve hashes
    uint16 public weightLostPartLimit = 5;
    FishbankBoosters public boosters;
    FishbankChests public chests;
    FishbankUtils private utils;


    mapping(bytes32 => FishingAttempt) public pendingFishing;//attempts that need solving;

    mapping(uint256 => address) public approved;
    mapping(address => uint256) public balances;
    mapping(address => bool) public affiliated;

    event AquariumFished(
        bytes32 hash,
        address fisher,
        uint256 feePaid
    ); //event broadcated when someone fishes in aqaurium

    event AquariumResolved(bytes32 hash, address fisher);

    event Attack(
        uint256 attacker,
        uint256 victim,
        uint256 winner,
        uint64 weight,
        uint256 ap, uint256 vp, uint256 random
    );

    event BoosterApplied(uint256 tokenId, uint256 boosterId);

    /// @notice Constructor of the contract. Sets resolver, beneficiary, boosters and chests
    /// @param _boosters the address of the boosters smart contract
    /// @param _chests the address of the chests smart contract

    function Fishbank(address _boosters, address _chests, address _utils) ChestsStore(_chests) public {

        resolver = msg.sender;
        beneficiary = msg.sender;
        boosters = FishbankBoosters(_boosters);
        chests = FishbankChests(_chests);
        utils = FishbankUtils(_utils);
    }

    /// @notice Mints fishes according to params can only be called by the owner
    /// @param _owner array of addresses the fishes should be owned by
    /// @param _weight array of weights for the fishes
    /// @param _power array of power levels for the fishes
    /// @param _agility array of agility levels for the fishes
    /// @param _speed array of speed levels for the fishes
    /// @param _color array of color params for the fishes

    function mintFish(address[] _owner, uint32[] _weight, uint8[] _power, uint8[] _agility, uint8[] _speed, bytes16[] _color) onlyMinter public {

        for (uint i = 0; i < _owner.length; i ++) {
            _mintFish(_owner[i], _weight[i], _power[i], _agility[i], _speed[i], _color[i]);
        }
    }

    /// @notice Internal method for minting a fish
    /// @param _owner address of owner for the fish
    /// @param _weight weight param for fish
    /// @param _power power param for fish
    /// @param _agility agility param for the fish
    /// @param _speed speed param for the fish
    /// @param _color color param for the fish

    function _mintFish(address _owner, uint32 _weight, uint8 _power, uint8 _agility, uint8 _speed, bytes16 _color) internal {

        fishes.length += 1;
        uint256 newFishId = fishes.length - 1;

        Fish storage newFish = fishes[newFishId];

        newFish.owner = _owner;
        newFish.weight = _weight;
        newFish.power = _power;
        newFish.agility = _agility;
        newFish.speed = _speed;
        newFish.color = _color;

        balances[_owner] ++;

        Transfer(address(0), _owner, newFishId);
    }

    function setWeightLostPartLimit(uint8 _weightPart) onlyOwner public {
        weightLostPartLimit = _weightPart;
    }

    /// @notice Sets the cost for fishing in the aquarium
    /// @param _fee new fee for fishing in wei
    function setAquariumCost(uint256 _fee) onlyOwner public {
        aquariumCost = _fee;
    }

    /// @notice Sets address that resolves hashes for fishing can only be called by the owner
    /// @param _resolver address of the resolver
    function setResolver(address _resolver) onlyOwner public {
        resolver = _resolver;
    }


    /// @notice Sets the address getting the proceedings from fishing in the aquarium
    /// @param _beneficiary address of the new beneficiary
    function setBeneficiary(address _beneficiary) onlyOwner public {
        beneficiary = _beneficiary;
    }

    function setAuction(address _auction) onlyOwner public {
        auction = _auction;
    }

    function setBoosters(address _boosters) onlyOwner public {
        boosters = FishbankBoosters(_boosters);
    }

    function setMinter(address _minter) onlyOwner public {
        minter = _minter;
    }

    function setUtils(address _utils) onlyOwner public {
        utils = FishbankUtils(_utils);
    }

    /// batch fishing from 1 to 10 times
    function batchFishAquarium(uint256[] _seeds, address _affiliate) payable public {
        require(_seeds.length > 0 && _seeds.length <= 10);
        require(msg.value >= aquariumCost * _seeds.length);
        //must send enough ether to cover costs
        require(randomHashes.length > hashesUsed + _seeds.length);
        //there needs to be a hash left

        if (msg.value > aquariumCost * _seeds.length) {
            msg.sender.transfer(msg.value - aquariumCost * _seeds.length);
            //send to much ether back
        }

        for (uint256 i = 0; i < _seeds.length; i ++) {
            _fishAquarium(_seeds[i]);
        }

        if(_affiliate != address(0)) {
            pendingFishing[randomHashes[hashesUsed - 1]].affiliate = _affiliate;
        }
    }

    function _fishAquarium(uint256 _seed) internal {
        //this loop prevents from using the same hash as another fishing attempt if the owner submits the same hash multiple times
        while (pendingFishing[randomHashes[hashesUsed]].fisher != address(0)) {
            hashesUsed++;
            //increase hashesUsed and try next one
        }

        FishingAttempt storage newAttempt = pendingFishing[randomHashes[hashesUsed]];

        newAttempt.fisher = msg.sender;
        newAttempt.feePaid = aquariumCost;
        //set the fee paid so it can be returned if the hash doesn't get resolved fast enough
        newAttempt.seed = _seed;
        //sets the seed that gets combined with the random seed of the owner
        newAttempt.deadline = uint64(now + resolveTime);
        //saves deadline after which the fisher can redeem his fishing fee

        hashesUsed++;
        //increase hashes used so it cannot be used again

        AquariumFished(randomHashes[hashesUsed - 1], msg.sender, aquariumCost);
        //broadcast event
    }

    /// @notice Call this to resolve hashes and generate fish/chests
    /// @param _seed seed that corresponds to the hash
    function _resolveAquarium(uint256 _seed) internal {
        bytes32 tempHash = keccak256(_seed);
        FishingAttempt storage tempAttempt = pendingFishing[tempHash];

        require(tempAttempt.fisher != address(0));
        //attempt must be set so we look if fisher is set

        if (tempAttempt.affiliate != address(0) && !affiliated[tempAttempt.fisher]) {//if affiliate is set
            chests.mintChest(tempAttempt.affiliate, 1, 0, 0, 0, 0);
            //Chest with one random booster
            affiliated[tempAttempt.fisher] = true;
        }

        uint32[4] memory fishParams = utils.getFishParams(_seed, tempAttempt.seed, fishes.length, block.coinbase);

        _mintFish(tempAttempt.fisher, fishParams[3], uint8(fishParams[0]), uint8(fishParams[1]), uint8(fishParams[2]), bytes16(keccak256(_seed ^ tempAttempt.seed)));

        beneficiary.transfer(tempAttempt.feePaid);
        AquariumResolved(tempHash, tempAttempt.fisher);
        //broadcast event

        delete pendingFishing[tempHash];
        //delete fishing attempt
    }

    /// @notice Batch resolve fishing attempts
    /// @param _seeds array of seeds that correspond to hashes that need resolving
    function batchResolveAquarium(uint256[] _seeds) onlyResolver public {
        for (uint256 i = 0; i < _seeds.length; i ++) {
            _resolveAquarium(_seeds[i]);
        }
    }


    /// @notice Adds an array of hashes to be used for resolving
    /// @param _hashes array of hashes to add
    function addHash(bytes32[] _hashes) onlyResolver public {
        for (uint i = 0; i < _hashes.length; i ++) {
            randomHashes.push(_hashes[i]);
        }
    }

    /// @notice Call this function to attack another fish
    /// @param _attacker ID of fish that is attacking
    /// @param _victim ID of fish to attack
    function attack(uint256 _attacker, uint256 _victim) onlyFishOwner(_attacker) public {

        Fish memory attacker = fishes[_attacker];
        Fish memory victim = fishes[_victim];

        //check if attacker is sleeping
        if (attacker.activeBooster == 2 && attacker.boostedTill > now) {//if your fish is sleeping auto awake it
            fishes[_attacker].activeBooster = 0;
            attacker.boostedTill = uint64(now);
            //set booster to invalid one so it has no effect
        }

        //check if victim has active sleeping booster
        require(!((victim.activeBooster == 2) && victim.boostedTill >= now));
        //cannot attack a sleeping fish
        require(now >= attacker.canFightAgain);
        //check if attacking fish is cooled down
        require(now >= victim.canBeAttackedAgain);
        //check if victim fish can be attacked again


        if (msg.sender == victim.owner) {
            uint64 weight = attacker.weight < victim.weight ? attacker.weight : victim.weight;
            fishes[_attacker].weight += weight;
            fishes[_victim].weight -= weight;
            fishes[_attacker].canFightAgain = uint64(utils.getCooldown(attacker.speed));

            if (fishes[_victim].weight == 0) {
                _transfer(msg.sender, address(0), _victim);
                balances[fishes[_victim].owner] --;
                //burn token
            } else {
                fishes[_victim].canBeAttackedAgain = uint64(now + 1 hours);
                //set victim cooldown 1 hour
            }

            Attack(_attacker, _victim, _attacker, weight, 0, 0, 0);
            return;
        }

        if (victim.weight < 2 || attacker.weight < 2) {
            revert();
            //revert if one of the fish is below fighting weight
        }

        uint256 AP = getFightingAmounts(attacker, true);
        // get attacker power
        uint256 VP = getFightingAmounts(victim, false);
        // get victim power

        bytes32 randomHash = keccak256(block.coinbase, block.blockhash(block.number - 1), fishes.length);

        uint256 max = AP > VP ? AP : VP;
        uint256 attackRange = max * 2;
        uint256 random = uint256(randomHash) % attackRange + 1;

        uint64 weightLost;

        if (random <= (max + AP - VP)) {
            weightLost = _handleWin(_attacker, _victim);
            Attack(_attacker, _victim, _attacker, weightLost, AP, VP, random);
        } else {
            weightLost = _handleWin(_victim, _attacker);
            Attack(_attacker, _victim, _victim, weightLost, AP, VP, random);
            //broadcast event
        }

        fishes[_attacker].canFightAgain = uint64(utils.getCooldown(attacker.speed));
        fishes[_victim].canBeAttackedAgain = uint64(now + 1 hours);
        //set victim cooldown 1 hour
    }

    /// @notice Handles lost gained weight after fight
    /// @param _winner the winner of the fight
    /// @param _loser the loser of the fight
    function _handleWin(uint256 _winner, uint256 _loser) internal returns (uint64) {
        Fish storage winner = fishes[_winner];
        Fish storage loser = fishes[_loser];

        uint64 fullWeightLost = loser.weight / sqrt(winner.weight);
        uint64 maxWeightLost = loser.weight / weightLostPartLimit;

        uint64 weightLost = maxWeightLost < fullWeightLost ? maxWeightLost : fullWeightLost;

        if (weightLost < 1) {
            weightLost = 1;
            // Minimum 1
        }

        winner.weight += weightLost;
        loser.weight -= weightLost;

        return weightLost;
    }

    /// @notice get attack and defence from fish
    /// @param _fish is Fish token
    /// @param _is_attacker true if fish is attacker otherwise false
    function getFightingAmounts(Fish _fish, bool _is_attacker) internal view returns (uint256){
        return (getFishPower(_fish) * (_is_attacker ? 60 : 40) + getFishAgility(_fish) * (_is_attacker ? 40 : 60)) * _fish.weight;
    }

    /// @notice Apply a booster to a fish
    /// @param _tokenId the fish the booster should be applied to
    /// @param _booster the Id of the booster the token should be applied to
    function applyBooster(uint256 _tokenId, uint256 _booster) onlyFishOwner(_tokenId) public {
        require(msg.sender == boosters.ownerOf(_booster));
        //only owner can do this
        require(boosters.getBoosterAmount(_booster) >= 1);
        Fish storage tempFish = fishes[_tokenId];
        uint8 boosterType = uint8(boosters.getBoosterType(_booster));

        if (boosterType == 1 || boosterType == 2 || boosterType == 3) {//if booster is attack or agility or sleep
            tempFish.boosterStrength = boosters.getBoosterStrength(_booster);
            tempFish.activeBooster = boosterType;
            tempFish.boostedTill = boosters.getBoosterDuration(_booster) * boosters.getBoosterAmount(_booster) + uint64(now);
            tempFish.boosterRaiseValue = boosters.getBoosterRaiseValue(_booster);
        }
        else if (boosterType == 4) {//watch booster
            require(tempFish.boostedTill > uint64(now));
            //revert on using watch on booster that has passed;
            tempFish.boosterStrength = boosters.getBoosterStrength(_booster);
            tempFish.boostedTill += boosters.getBoosterDuration(_booster) * boosters.getBoosterAmount(_booster);
            //add time to booster
        }
        else if (boosterType == 5) {//Instant attack
            require(boosters.getBoosterAmount(_booster) == 1);
            //Can apply only one instant attack booster
            tempFish.canFightAgain = 0;
        }

        require(boosters.transferFrom(msg.sender, address(0), _booster));
        //burn booster

        BoosterApplied(_tokenId, _booster);
    }

    /// @notice square root function used for weight gain/loss
    /// @param x uint64 to get square root from
    function sqrt(uint64 x) pure internal returns (uint64 y) {
        uint64 z = (x + 1) / 2;
        y = x;
        while (z < y) {
            y = z;
            z = (x / z + z) / 2;
        }
    }

    //utlitiy function for easy testing can be removed later
    function doKeccak256(uint256 _input) pure public returns (bytes32) {
        return keccak256(_input);
    }

    function getFishPower(Fish _fish) internal view returns (uint24 power) {
        power = _fish.power;
        if (_fish.activeBooster == 1 && _fish.boostedTill > now) {// check if booster active
            uint24 boosterPower = (10 * _fish.boosterStrength + _fish.boosterRaiseValue + 100) * power / 100 - power;
            if (boosterPower < 1 && _fish.boosterStrength == 1) {
                power += 1;
            } else if (boosterPower < 3 && _fish.boosterStrength == 2) {
                power += 3;
            } else if (boosterPower < 5 && _fish.boosterStrength == 3) {
                power += 5;
            } else {
                power = boosterPower + power;
            }
        }
    }

    function getFishAgility(Fish _fish) internal view returns (uint24 agility) {
        agility = _fish.agility;
        if (_fish.activeBooster == 3 && _fish.boostedTill > now) {// check if booster active
            uint24 boosterPower = (10 * _fish.boosterStrength + _fish.boosterRaiseValue + 100) * agility / 100 - agility;
            if (boosterPower < 1 && _fish.boosterStrength == 1) {
                agility += 1;
            } else if (boosterPower < 3 && _fish.boosterStrength == 2) {
                agility += 3;
            } else if (boosterPower < 5 && _fish.boosterStrength == 3) {
                agility += 5;
            } else {
                agility = boosterPower + agility;
            }
        }
    }


    //ERC721 functionality
    //could split this to a different contract but doesn't make it easier to read
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    function totalSupply() public view returns (uint256 total) {
        total = fishes.length;
    }

    function balanceOf(address _owner) public view returns (uint256 balance){
        balance = balances[_owner];
    }

    function ownerOf(uint256 _tokenId) public view returns (address owner){
        owner = fishes[_tokenId].owner;
    }

    function _transfer(address _from, address _to, uint256 _tokenId) internal {
        require(fishes[_tokenId].owner == _from);
        //can only transfer if previous owner equals from
        fishes[_tokenId].owner = _to;
        approved[_tokenId] = address(0);
        //reset approved of fish on every transfer
        balances[_from] -= 1;
        //underflow can only happen on 0x
        balances[_to] += 1;
        //overflows only with very very large amounts of fish
        Transfer(_from, _to, _tokenId);
    }

    function transfer(address _to, uint256 _tokenId) public
    onlyFishOwner(_tokenId) //check if msg.sender is the owner of this fish
    returns (bool)
    {
        _transfer(msg.sender, _to, _tokenId);
        //after master modifier invoke internal transfer
        return true;
    }

    function approve(address _to, uint256 _tokenId) public
    onlyFishOwner(_tokenId)
    {
        approved[_tokenId] = _to;
        Approval(msg.sender, _to, _tokenId);
    }

    function transferFrom(address _from, address _to, uint256 _tokenId) public returns (bool) {
        require(approved[_tokenId] == msg.sender || msg.sender == auction);
        Fish storage fish = fishes[_tokenId];

        if (msg.sender == auction) {
            fish.activeBooster = 2;
            //Freeze for auction
            fish.boostedTill = uint64(now + 7 days);
            fish.boosterStrength = 1;
        }
        //require msg.sender to be approved for this token
        _transfer(_from, _to, _tokenId);
        //handles event, balances and approval reset
        return true;
    }

    function takeOwnership(uint256 _tokenId) public {
        require(approved[_tokenId] == msg.sender);
        _transfer(ownerOf(_tokenId), msg.sender, _tokenId);
    }

}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"resolver","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"resolveTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_chestId","type":"uint16"}],"name":"buyChest","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minter","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address[]"},{"name":"_weight","type":"uint32[]"},{"name":"_power","type":"uint8[]"},{"name":"_agility","type":"uint8[]"},{"name":"_speed","type":"uint8[]"},{"name":"_color","type":"bytes16[]"}],"name":"mintFish","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"chestId","type":"uint16"},{"name":"price","type":"uint256"},{"name":"boosters","type":"uint16"},{"name":"isLimited","type":"bool"},{"name":"limit","type":"uint32"},{"name":"raiseChance","type":"uint24"},{"name":"raiseStrength","type":"uint24"},{"name":"onlyBoosterType","type":"uint8"},{"name":"onlyBoosterStrength","type":"uint8"}],"name":"setChestProduct","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"implementsERC721","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_seeds","type":"uint256[]"}],"name":"batchResolveAquarium","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"randomHashes","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"total","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"aquariumCost","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_beneficiary","type":"address"}],"name":"setBeneficiary","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":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"balances","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"beneficiary","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"chestProducts","outputs":[{"name":"price","type":"uint256"},{"name":"isLimited","type":"bool"},{"name":"limit","type":"uint32"},{"name":"boosters","type":"uint16"},{"name":"raiseChance","type":"uint24"},{"name":"raiseStrength","type":"uint24"},{"name":"onlyBoosterType","type":"uint8"},{"name":"onlyBoosterStrength","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_resolver","type":"address"}],"name":"setResolver","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"_booster","type":"uint256"}],"name":"applyBooster","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"weightLostPartLimit","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_input","type":"uint256"}],"name":"doKeccak256","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"pendingFishing","outputs":[{"name":"fisher","type":"address"},{"name":"feePaid","type":"uint256"},{"name":"affiliate","type":"address"},{"name":"seed","type":"uint256"},{"name":"deadline","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_utils","type":"address"}],"name":"setUtils","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_weightPart","type":"uint8"}],"name":"setWeightLostPartLimit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"chests","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"approved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"auction","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"initChestsStore","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_seeds","type":"uint256[]"},{"name":"_affiliate","type":"address"}],"name":"batchFishAquarium","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"takeOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"hashesUsed","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_hashes","type":"bytes32[]"}],"name":"addHash","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"fishes","outputs":[{"name":"owner","type":"address"},{"name":"activeBooster","type":"uint8"},{"name":"boostedTill","type":"uint64"},{"name":"boosterStrength","type":"uint8"},{"name":"boosterRaiseValue","type":"uint24"},{"name":"weight","type":"uint64"},{"name":"power","type":"uint16"},{"name":"agility","type":"uint16"},{"name":"speed","type":"uint16"},{"name":"color","type":"bytes16"},{"name":"canFightAgain","type":"uint64"},{"name":"canBeAttackedAgain","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_auction","type":"address"}],"name":"setAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_boosters","type":"address"}],"name":"setBoosters","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"chestId","type":"uint16"},{"name":"price","type":"uint256"}],"name":"setChestPrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"affiliated","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_attacker","type":"uint256"},{"name":"_victim","type":"uint256"}],"name":"attack","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_fee","type":"uint256"}],"name":"setAquariumCost","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"boosters","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_minter","type":"address"}],"name":"setMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_boosters","type":"address"},{"name":"_chests","type":"address"},{"name":"_utils","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"hash","type":"bytes32"},{"indexed":false,"name":"fisher","type":"address"},{"indexed":false,"name":"feePaid","type":"uint256"}],"name":"AquariumFished","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"hash","type":"bytes32"},{"indexed":false,"name":"fisher","type":"address"}],"name":"AquariumResolved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"attacker","type":"uint256"},{"indexed":false,"name":"victim","type":"uint256"},{"indexed":false,"name":"winner","type":"uint256"},{"indexed":false,"name":"weight","type":"uint64"},{"indexed":false,"name":"ap","type":"uint256"},{"indexed":false,"name":"vp","type":"uint256"},{"indexed":false,"name":"random","type":"uint256"}],"name":"Attack","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"boosterId","type":"uint256"}],"name":"BoosterApplied","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"approved","type":"address"},{"indexed":true,"name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":true,"name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

6060604052600161020460146101000a81548160ff0219169083151502179055506040805190810160405280600881526020017f4669736862616e6b00000000000000000000000000000000000000000000000081525061020590805190602001906200006e92919062000342565b506040805190810160405280600481526020017f46495348000000000000000000000000000000000000000000000000000000008152506102069080519060200190620000bd92919062000342565b50666a94d74f4300006102095561070861020a55600561020b60006101000a81548161ffff021916908361ffff1602179055503415620000fc57600080fd5b60405160608062005ec28339810160405280805190602001909190805190602001909190805190602001909190505081336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508061020060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550503361020260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508261020b60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508161020c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508061020d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050620003f1565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200038557805160ff1916838001178555620003b6565b82800160010185558215620003b6579182015b82811115620003b557825182559160200191906001019062000398565b5b509050620003c59190620003c9565b5090565b620003ee91905b80821115620003ea576000816000905550600101620003d0565b5090565b90565b615ac180620004016000396000f300606060405260043610610246576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806304f3bcec1461024b57806305ed76c4146102a0578063064701c6146102c957806306fdde03146102e55780630754617214610373578063082d7187146103c8578063095ea7b3146105625780630f3fc29e146105a45780631051db341461062f57806314c783331461065c57806316709c22146106b657806318160ddd146106f5578063197757951461071e5780631c31f7101461074757806323b872dd1461078057806327e235e3146107f957806338af3eed146108465780633fc83dc91461089b5780634e543b261461093b57806351b3666f146109745780635509b160146109a057806357788716146109d15780636224f93e14610a105780636352211e14610ad35780636995350114610b3657806370a0823114610b6f578063763a639014610bbc578063797f87ba14610be25780637d4061e614610c375780637d9f6db514610c9a5780638da5cb5b14610cef57806395d89b4114610d445780639e39db3814610dd2578063a9059cbb14610de7578063b0f94b1614610e41578063b2e6ceeb14610eaf578063b419dd2d14610ed2578063b5b90a2614610efb578063b68d6f3614610f55578063b8c6f579146110a9578063cbc846d9146110e2578063d1d46d2b1461111b578063dbc6f5481461114b578063e1fa76381461119c578063f2b1be45146111c8578063f2fde38b146111eb578063f37a7d4d14611224578063fca3b5aa14611279575b600080fd5b341561025657600080fd5b61025e6112b2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102ab57600080fd5b6102b36112d9565b6040518082815260200191505060405180910390f35b6102e3600480803561ffff169060200190919050506112e0565b005b34156102f057600080fd5b6102f8611675565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561033857808201518184015260208101905061031d565b50505050905090810190601f1680156103655780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561037e57600080fd5b610386611714565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103d357600080fd5b610560600480803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190505061173b565b005b341561056d57600080fd5b6105a2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611856565b005b34156105af57600080fd5b61062d600480803561ffff1690602001909190803590602001909190803561ffff16906020019091908035151590602001909190803563ffffffff1690602001909190803562ffffff1690602001909190803562ffffff1690602001909190803560ff1690602001909190803560ff16906020019091905050611985565b005b341561063a57600080fd5b610642611aea565b604051808215151515815260200191505060405180910390f35b341561066757600080fd5b6106b4600480803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091905050611afe565b005b34156106c157600080fd5b6106d76004808035906020019091905050611b9c565b60405180826000191660001916815260200191505060405180910390f35b341561070057600080fd5b610708611bc1565b6040518082815260200191505060405180910390f35b341561072957600080fd5b610731611bcf565b6040518082815260200191505060405180910390f35b341561075257600080fd5b61077e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611bd6565b005b341561078b57600080fd5b6107df600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611c75565b604051808215151515815260200191505060405180910390f35b341561080457600080fd5b610830600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611e3a565b6040518082815260200191505060405180910390f35b341561085157600080fd5b610859611e53565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156108a657600080fd5b6108bc6004808035906020019091905050611e79565b60405180898152602001881515151581526020018763ffffffff1663ffffffff1681526020018661ffff1661ffff1681526020018562ffffff1662ffffff1681526020018462ffffff1662ffffff1681526020018360ff1660ff1681526020018260ff1660ff1681526020019850505050505050505060405180910390f35b341561094657600080fd5b610972600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611f29565b005b341561097f57600080fd5b61099e6004808035906020019091908035906020019091905050611fc9565b005b34156109ab57600080fd5b6109b3612b0b565b604051808261ffff1661ffff16815260200191505060405180910390f35b34156109dc57600080fd5b6109f26004808035906020019091905050612b20565b60405180826000191660001916815260200191505060405180910390f35b3415610a1b57600080fd5b610a35600480803560001916906020019091905050612b3f565b604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018267ffffffffffffffff1667ffffffffffffffff1681526020019550505050505060405180910390f35b3415610ade57600080fd5b610af46004808035906020019091905050612bca565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610b4157600080fd5b610b6d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612c15565b005b3415610b7a57600080fd5b610ba6600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612cb5565b6040518082815260200191505060405180910390f35b3415610bc757600080fd5b610be0600480803560ff16906020019091905050612cff565b005b3415610bed57600080fd5b610bf5612d7e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610c4257600080fd5b610c586004808035906020019091905050612da5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610ca557600080fd5b610cad612dd9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610cfa57600080fd5b610d02612e00565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610d4f57600080fd5b610d57612e25565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d97578082015181840152602081019050610d7c565b50505050905090810190601f168015610dc45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610ddd57600080fd5b610de5612ec4565b005b3415610df257600080fd5b610e27600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050612f72565b604051808215151515815260200191505060405180910390f35b610ead60048080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613006565b005b3415610eba57600080fd5b610ed060048080359060200190919050506131a1565b005b3415610edd57600080fd5b610ee5613225565b6040518082815260200191505060405180910390f35b3415610f0657600080fd5b610f5360048080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190505061322c565b005b3415610f6057600080fd5b610f7660048080359060200190919050506132f1565b604051808d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018c60ff1660ff1681526020018b67ffffffffffffffff1667ffffffffffffffff1681526020018a60ff1660ff1681526020018962ffffff1662ffffff1681526020018867ffffffffffffffff1667ffffffffffffffff1681526020018761ffff1661ffff1681526020018661ffff1661ffff1681526020018561ffff1661ffff168152602001846fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff191681526020018367ffffffffffffffff1667ffffffffffffffff1681526020018267ffffffffffffffff1667ffffffffffffffff1681526020019c5050505050505050505050505060405180910390f35b34156110b457600080fd5b6110e0600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613441565b005b34156110ed57600080fd5b611119600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506134e1565b005b341561112657600080fd5b611149600480803561ffff16906020019091908035906020019091905050613581565b005b341561115657600080fd5b611182600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506135ff565b604051808215151515815260200191505060405180910390f35b34156111a757600080fd5b6111c66004808035906020019091908035906020019091905050613620565b005b34156111d357600080fd5b6111e960048080359060200190919050506143a2565b005b34156111f657600080fd5b611222600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050614408565b005b341561122f57600080fd5b61123761455d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561128457600080fd5b6112b0600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050614584565b005b61020260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61020a5481565b6112e8615766565b60028261ffff1660ff811015156112fb57fe5b600202016101006040519081016040529081600082015481526020016001820160009054906101000a900460ff161515151581526020016001820160019054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160059054906101000a900461ffff1661ffff1661ffff1681526020016001820160079054906101000a900462ffffff1662ffffff1662ffffff16815260200160018201600a9054906101000a900462ffffff1662ffffff1662ffffff16815260200160018201600d9054906101000a900460ff1660ff1660ff16815260200160018201600e9054906101000a900460ff1660ff1660ff168152505090506000816000015111151561140c57600080fd5b8060000151341015151561141f57600080fd5b8060200151158061143a57506000816040015163ffffffff16115b151561144557600080fd5b61020060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c2356d233383606001518460a0015185608001518660c001518760e001516040518763ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018661ffff1661ffff1681526020018562ffffff1662ffffff1681526020018462ffffff1662ffffff1681526020018360ff1660ff1681526020018260ff1660ff1681526020019650505050505050600060405180830381600087803b151561156657600080fd5b5af1151561157357600080fd5b50505060028261ffff1660ff8110151561158957fe5b60020201600001543411156115f5573373ffffffffffffffffffffffffffffffffffffffff166108fc60028461ffff1660ff811015156115c557fe5b600202016000015434039081150290604051600060405180830381858888f1935050505015156115f457600080fd5b5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc60028461ffff1660ff8110151561164457fe5b60020201600001549081150290604051600060405180830381858888f19350505050151561167157600080fd5b5050565b6102058054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561170c5780601f106116e15761010080835404028352916020019161170c565b820191906000526020600020905b8154815290600101906020018083116116ef57829003601f168201915b505050505081565b61020460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061020460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561179a57600080fd5b600090505b865181101561184d5761184087828151811015156117b957fe5b9060200190602002015187838151811015156117d157fe5b9060200190602002015187848151811015156117e957fe5b90602001906020020151878581518110151561180157fe5b90602001906020020151878681518110151561181957fe5b90602001906020020151878781518110151561183157fe5b90602001906020020151614624565b808060010191505061179f565b50505050505050565b803373ffffffffffffffffffffffffffffffffffffffff166102018281548110151561187e57fe5b906000526020600020906003020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156118d257600080fd5b8261020f600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156119e257600080fd5b60028a61ffff1660ff811015156119f557fe5b600202019050888160000181905550878160010160056101000a81548161ffff021916908361ffff160217905550868160010160006101000a81548160ff021916908315150217905550858160010160016101000a81548163ffffffff021916908363ffffffff160217905550848160010160076101000a81548162ffffff021916908362ffffff1602179055508381600101600a6101000a81548162ffffff021916908362ffffff1602179055508281600101600d6101000a81548160ff021916908360ff1602179055508181600101600e6101000a81548160ff021916908360ff16021790555050505050505050505050565b61020460149054906101000a900460ff1681565b600061020260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b5d57600080fd5b600090505b8151811015611b9857611b8b8282815181101515611b7c57fe5b9060200190602002015161483a565b8080600101915050611b62565b5050565b61020781815481101515611bac57fe5b90600052602060002090016000915090505481565b600061020180549050905090565b6102095481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c3157600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000803373ffffffffffffffffffffffffffffffffffffffff1661020f600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611d34575061020360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515611d3f57600080fd5b61020183815481101515611d4f57fe5b9060005260206000209060030201905061020360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611e235760028160000160146101000a81548160ff021916908360ff16021790555062093a8042018160000160156101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600181600001601d6101000a81548160ff021916908360ff1602179055505b611e2e858585614e8d565b60019150509392505050565b6102106020528060005260406000206000915090505481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60028160ff81101515611e8857fe5b600202016000915090508060000154908060010160009054906101000a900460ff16908060010160019054906101000a900463ffffffff16908060010160059054906101000a900461ffff16908060010160079054906101000a900462ffffff169080600101600a9054906101000a900462ffffff169080600101600d9054906101000a900460ff169080600101600e9054906101000a900460ff16905088565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611f8457600080fd5b8061020260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080833373ffffffffffffffffffffffffffffffffffffffff1661020182815481101515611ff457fe5b906000526020600020906003020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561204857600080fd5b61020b60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15156120d957600080fd5b5af115156120e657600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561212957600080fd5b600161020b60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630f99da4a866040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15156121bc57600080fd5b5af115156121c957600080fd5b5050506040518051905063ffffffff16101515156121e657600080fd5b610201858154811015156121f657fe5b9060005260206000209060030201925061020b60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166365113528856040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561229757600080fd5b5af115156122a457600080fd5b50505060405180519050915060018260ff1614806122c5575060028260ff16145b806122d3575060038260ff16145b156126095761020b60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631027e242856040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561236957600080fd5b5af1151561237657600080fd5b5050506040518051905083600001601d6101000a81548160ff021916908360ff160217905550818360000160146101000a81548160ff021916908360ff1602179055504261020b60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630f99da4a866040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561244b57600080fd5b5af1151561245857600080fd5b5050506040518051905061020b60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2a9ba05876040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15156124f357600080fd5b5af1151561250057600080fd5b505050604051805190500263ffffffff16018360000160156101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555061020b60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630f8ef9f8856040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15156125cd57600080fd5b5af115156125da57600080fd5b505050604051805190508360010160006101000a81548162ffffff021916908362ffffff1602179055506129a9565b60048260ff1614156128b2574267ffffffffffffffff168360000160159054906101000a900467ffffffffffffffff1667ffffffffffffffff1611151561264f57600080fd5b61020b60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631027e242856040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15156126e057600080fd5b5af115156126ed57600080fd5b5050506040518051905083600001601d6101000a81548160ff021916908360ff16021790555061020b60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630f99da4a856040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15156127a457600080fd5b5af115156127b157600080fd5b5050506040518051905061020b60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2a9ba05866040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561284c57600080fd5b5af1151561285957600080fd5b505050604051805190500263ffffffff168360000160158282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506129a8565b60058260ff1614156129a757600161020b60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630f99da4a866040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561295157600080fd5b5af1151561295e57600080fd5b5050506040518051905063ffffffff1614151561297a57600080fd5b60008360020160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b5b61020b60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd336000876040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1515612aa357600080fd5b5af11515612ab057600080fd5b505050604051805190501515612ac557600080fd5b7fa308815bb97242b3add8af5f65bc57d951176a0b0ee1cc7e51638e0da14920738585604051808381526020018281526020019250505060405180910390a15050505050565b61020b60009054906101000a900461ffff1681565b6000816040518082815260200191505060405180910390209050919050565b61020e6020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154908060040160009054906101000a900467ffffffffffffffff16905085565b600061020182815481101515612bdc57fe5b906000526020600020906003020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612c7057600080fd5b8061020d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061021060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612d5a57600080fd5b8060ff1661020b60006101000a81548161ffff021916908361ffff16021790555050565b61020c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61020f6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61020360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6102068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612ebc5780601f10612e9157610100808354040283529160200191612ebc565b820191906000526020600020905b815481529060010190602001808311612e9f57829003601f168201915b505050505081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612f1f57600080fd5b612f36600160006001600080600080600080611985565b612f53600266354a6ba7a180006003600080600080600080611985565b612f70600366470de4df8200006005600080600080600080611985565b565b6000813373ffffffffffffffffffffffffffffffffffffffff1661020182815481101515612f9c57fe5b906000526020600020906003020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515612ff057600080fd5b612ffb338585614e8d565b600191505092915050565b600080835111801561301a5750600a835111155b151561302557600080fd5b82516102095402341015151561303a57600080fd5b825161020854016102078054905011151561305457600080fd5b825161020954023411156130ab573373ffffffffffffffffffffffffffffffffffffffff166108fc8451610209540234039081150290604051600060405180830381858888f1935050505015156130aa57600080fd5b5b600090505b82518110156130e6576130d983828151811015156130ca57fe5b906020019060200201516150ba565b80806001019150506130b0565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151561319c578161020e60006102076001610208540381548110151561313857fe5b9060005260206000209001546000191660001916815260200190815260200160002060020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b505050565b3373ffffffffffffffffffffffffffffffffffffffff1661020f600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561320f57600080fd5b61322261321b82612bca565b3383614e8d565b50565b6102085481565b600061020260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561328b57600080fd5b600090505b81518110156132ed5761020780548060010182816132ae91906157c8565b9160005260206000209001600084848151811015156132c957fe5b90602001906020020151909190915090600019169055508080600101915050613290565b5050565b6102018181548110151561330157fe5b90600052602060002090600302016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a900460ff16908060000160159054906101000a900467ffffffffffffffff169080600001601d9054906101000a900460ff16908060010160009054906101000a900462ffffff16908060010160039054906101000a900467ffffffffffffffff169080600101600b9054906101000a900461ffff169080600101600d9054906101000a900461ffff169080600101600f9054906101000a900461ffff16908060020160009054906101000a900470010000000000000000000000000000000002908060020160109054906101000a900467ffffffffffffffff16908060020160189054906101000a900467ffffffffffffffff1690508c565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561349c57600080fd5b8061020360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561353c57600080fd5b8061020b60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156135dc57600080fd5b8060028361ffff1660ff811015156135f057fe5b60020201600001819055505050565b6102116020528060005260406000206000915054906101000a900460ff1681565b6136286157f4565b6136306157f4565b6000806000806000806000808b3373ffffffffffffffffffffffffffffffffffffffff166102018281548110151561366457fe5b906000526020600020906003020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156136b857600080fd5b6102018d8154811015156136c857fe5b906000526020600020906003020161018060405190810160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900460ff1660ff1660ff1681526020016000820160159054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601d9054906101000a900460ff1660ff1660ff1681526020016001820160009054906101000a900462ffffff1662ffffff1662ffffff1681526020016001820160039054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160018201600b9054906101000a900461ffff1661ffff1661ffff16815260200160018201600d9054906101000a900461ffff1661ffff1661ffff16815260200160018201600f9054906101000a900461ffff1661ffff1661ffff1681526020016002820160009054906101000a9004700100000000000000000000000000000000026fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff191681526020016002820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016002820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509a506102018c81548110151561391d57fe5b906000526020600020906003020161018060405190810160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900460ff1660ff1660ff1681526020016000820160159054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601d9054906101000a900460ff1660ff1660ff1681526020016001820160009054906101000a900462ffffff1662ffffff1662ffffff1681526020016001820160039054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160018201600b9054906101000a900461ffff1661ffff1661ffff16815260200160018201600d9054906101000a900461ffff1661ffff1661ffff16815260200160018201600f9054906101000a900461ffff1661ffff1661ffff1681526020016002820160009054906101000a9004700100000000000000000000000000000000026fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff191681526020016002820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016002820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050995060028b6020015160ff16148015613b865750428b6040015167ffffffffffffffff16115b15613be75760006102018e815481101515613b9d57fe5b906000526020600020906003020160000160146101000a81548160ff021916908360ff160217905550428b6040019067ffffffffffffffff16908167ffffffffffffffff16815250505b60028a6020015160ff16148015613c0c5750428a6040015167ffffffffffffffff1610155b151515613c1857600080fd5b8a610140015167ffffffffffffffff164210151515613c3657600080fd5b89610160015167ffffffffffffffff164210151515613c5457600080fd5b896000015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415614039578960a0015167ffffffffffffffff168b60a0015167ffffffffffffffff1610613cb9578960a00151613cbf565b8a60a001515b9850886102018e815481101515613cd257fe5b906000526020600020906003020160010160038282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550886102018d815481101515613d3357fe5b906000526020600020906003020160010160038282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555061020d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ff429fc88c61010001516040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808261ffff1661ffff168152602001915050602060405180830381600087803b1515613e2157600080fd5b5af11515613e2e57600080fd5b505050604051805190506102018e815481101515613e4857fe5b906000526020600020906003020160020160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006102018d815481101515613e9157fe5b906000526020600020906003020160010160039054906101000a900467ffffffffffffffff1667ffffffffffffffff161415613f6a57613ed33360008e614e8d565b61021060006102018e815481101515613ee857fe5b906000526020600020906003020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550613fb7565b610e1042016102018d815481101515613f7f57fe5b906000526020600020906003020160020160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b7f737ee67d38af00f653596ea4e3350216f7c1192ecbfab7263ab95cfde44ac4058d8d8f8c6000806000604051808881526020018781526020018681526020018567ffffffffffffffff1667ffffffffffffffff16815260200184815260200183815260200182815260200197505050505050505060405180910390a1614393565b60028a60a0015167ffffffffffffffff161080614064575060028b60a0015167ffffffffffffffff16105b1561406e57600080fd5b6140798b60016152e2565b97506140868a60006152e2565b965041600143034061020180549050604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401836000191660001916815260200182815260200193505050506040518091039020955086881161410a578661410c565b875b9450600285029350600184876001900481151561412557fe5b060192508688860103831115156141c2576141408d8d61533a565b91507f737ee67d38af00f653596ea4e3350216f7c1192ecbfab7263ab95cfde44ac4058d8d8f858c8c89604051808881526020018781526020018681526020018567ffffffffffffffff1667ffffffffffffffff16815260200184815260200183815260200182815260200197505050505050505060405180910390a161424a565b6141cc8c8e61533a565b91507f737ee67d38af00f653596ea4e3350216f7c1192ecbfab7263ab95cfde44ac4058d8d8e858c8c89604051808881526020018781526020018681526020018567ffffffffffffffff1667ffffffffffffffff16815260200184815260200183815260200182815260200197505050505050505060405180910390a15b61020d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ff429fc88c61010001516040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808261ffff1661ffff168152602001915050602060405180830381600087803b15156142e857600080fd5b5af115156142f557600080fd5b505050604051805190506102018e81548110151561430f57fe5b906000526020600020906003020160020160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550610e1042016102018d81548110151561435b57fe5b906000526020600020906003020160020160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b50505050505050505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156143fd57600080fd5b806102098190555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561446357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561449f57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61020b60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156145df57600080fd5b8061020460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060016102018181805490500191508161464091906158be565b506001610201805490500391506102018281548110151561465d57fe5b90600052602060002090600302019050878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508663ffffffff168160010160036101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508560ff1681600101600b6101000a81548161ffff021916908361ffff1602179055508460ff1681600101600d6101000a81548161ffff021916908361ffff1602179055508360ff1681600101600f6101000a81548161ffff021916908361ffff160217905550828160020160006101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555061021060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550818873ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050505050565b6000806148456158f0565b83604051808281526020019150506040518091039020925061020e600084600019166000191681526020019081526020016000209150600073ffffffffffffffffffffffffffffffffffffffff168260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156148db57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168260020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141580156149ab575061021160008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15614b5e5761020c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c2356d238360020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660016000806000806040518763ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018661ffff1681526020018562ffffff1681526020018462ffffff1681526020018360ff1681526020018260ff1681526020019650505050505050600060405180830381600087803b1515614ad057600080fd5b5af11515614add57600080fd5b505050600161021160008460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b61020d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bdd7908b85846003015461020180549050416040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001945050505050608060405180830381600087803b1515614c3d57600080fd5b5af11515614c4a57600080fd5b505050604051806080016040529050614cf28260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826003600481101515614c9057fe5b6020020151836000600481101515614ca457fe5b6020020151846001600481101515614cb857fe5b6020020151856002600481101515614ccc57fe5b602002015187600301548a18604051808281526020019150506040518091039020614624565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc83600101549081150290604051600060405180830381858888f193505050501515614d5857600080fd5b7fc68a0d9516a961dd6a8877cfeee3727698e55a18f46a8591bedce0f0e785df33838360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a161020e60008460001916600019168152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018201600090556002820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560038201600090556004820160006101000a81549067ffffffffffffffff0219169055505050505050565b8273ffffffffffffffffffffffffffffffffffffffff1661020182815481101515614eb457fe5b906000526020600020906003020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515614f0857600080fd5b8161020182815481101515614f1957fe5b906000526020600020906003020160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600061020f600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600161021060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550600161021060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60005b600073ffffffffffffffffffffffffffffffffffffffff1661020e6000610207610208548154811015156150ed57fe5b9060005260206000209001546000191660001916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561516857610208600081548092919060010191905055506150bd565b61020e60006102076102085481548110151561518057fe5b906000526020600020900154600019166000191681526020019081526020016000209050338160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061020954816001018190555081816003018190555061020a5442018160040160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550610208600081548092919060010191905055507fef94156a2f812e69556eed38c92924cd876b114a20297e82345e5d29d336e2376102076001610208540381548110151561527657fe5b90600052602060002090015433610209546040518084600019166000191681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b60008260a00151826152f557603c6152f8565b60285b60ff16615304856154f5565b0283615311576028615314565b603c5b60ff16615320866155ea565b020162ffffff160267ffffffffffffffff16905092915050565b6000806000806000806102018881548110151561535357fe5b906000526020600020906003020194506102018781548110151561537357fe5b906000526020600020906003020193506153a48560010160039054906101000a900467ffffffffffffffff166156df565b67ffffffffffffffff168460010160039054906101000a900467ffffffffffffffff1667ffffffffffffffff168115156153da57fe5b04925061020b60009054906101000a900461ffff1661ffff168460010160039054906101000a900467ffffffffffffffff1667ffffffffffffffff1681151561541f57fe5b0491508267ffffffffffffffff168267ffffffffffffffff16106154435782615445565b815b905060018167ffffffffffffffff16101561545f57600190505b808560010160038282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550808460010160038282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550809550505050505092915050565b6000808260e0015161ffff1691506003836020015160ff16148015615527575042836040015167ffffffffffffffff16115b156155e45781606483606486608001518760600151600a0260ff1601010262ffffff1681151561555357fe5b0403905060018162ffffff1610801561557357506001836060015160ff16145b15615583576001820191506155e3565b60038162ffffff1610801561559f57506002836060015160ff16145b156155af576003820191506155e2565b60058162ffffff161080156155cb57506003836060015160ff16145b156155db576005820191506155e1565b81810191505b5b5b5b50919050565b6000808260c0015161ffff1691506001836020015160ff1614801561561c575042836040015167ffffffffffffffff16115b156156d95781606483606486608001518760600151600a0260ff1601010262ffffff1681151561564857fe5b0403905060018162ffffff1610801561566857506001836060015160ff16145b15615678576001820191506156d8565b60038162ffffff1610801561569457506002836060015160ff16145b156156a4576003820191506156d7565b60058162ffffff161080156156c057506003836060015160ff16145b156156d0576005820191506156d6565b81810191505b5b5b5b50919050565b60008060026001840167ffffffffffffffff168115156156fb57fe5b0490508291505b8167ffffffffffffffff168167ffffffffffffffff161015615760578091506002818267ffffffffffffffff168567ffffffffffffffff1681151561574357fe5b040167ffffffffffffffff1681151561575857fe5b049050615702565b50919050565b6101006040519081016040528060008152602001600015158152602001600063ffffffff168152602001600061ffff168152602001600062ffffff168152602001600062ffffff168152602001600060ff168152602001600060ff1681525090565b8154818355818115116157ef578183600052602060002091820191016157ee919061591e565b5b505050565b61018060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600060ff168152602001600067ffffffffffffffff168152602001600060ff168152602001600062ffffff168152602001600067ffffffffffffffff168152602001600061ffff168152602001600061ffff168152602001600061ffff16815260200160006fffffffffffffffffffffffffffffffff19168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff1681525090565b8154818355818115116158eb576003028160030283600052602060002091820191016158ea9190615943565b5b505050565b6080604051908101604052806004905b600063ffffffff168152602001906001900390816159005790505090565b61594091905b8082111561593c576000816000905550600101615924565b5090565b90565b615a9291905b80821115615a8e57600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a81549060ff02191690556000820160156101000a81549067ffffffffffffffff021916905560008201601d6101000a81549060ff02191690556001820160006101000a81549062ffffff02191690556001820160036101000a81549067ffffffffffffffff021916905560018201600b6101000a81549061ffff021916905560018201600d6101000a81549061ffff021916905560018201600f6101000a81549061ffff02191690556002820160006101000a8154906fffffffffffffffffffffffffffffffff02191690556002820160106101000a81549067ffffffffffffffff02191690556002820160186101000a81549067ffffffffffffffff021916905550600301615949565b5090565b905600a165627a7a72305820c54e82a25b1f2611814f97a7b42581ae02b30240240d3962379aaa9d8a0c8fd60029000000000000000000000000f15f61643eea73be40ad9b72c09ed381fac7a25600000000000000000000000096e666c387b1d25b490a33cdb5a32b8a1f91d3b6000000000000000000000000fa82a58605aff1f44d32b41904e7a43710f69d44

Deployed Bytecode

0x606060405260043610610246576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806304f3bcec1461024b57806305ed76c4146102a0578063064701c6146102c957806306fdde03146102e55780630754617214610373578063082d7187146103c8578063095ea7b3146105625780630f3fc29e146105a45780631051db341461062f57806314c783331461065c57806316709c22146106b657806318160ddd146106f5578063197757951461071e5780631c31f7101461074757806323b872dd1461078057806327e235e3146107f957806338af3eed146108465780633fc83dc91461089b5780634e543b261461093b57806351b3666f146109745780635509b160146109a057806357788716146109d15780636224f93e14610a105780636352211e14610ad35780636995350114610b3657806370a0823114610b6f578063763a639014610bbc578063797f87ba14610be25780637d4061e614610c375780637d9f6db514610c9a5780638da5cb5b14610cef57806395d89b4114610d445780639e39db3814610dd2578063a9059cbb14610de7578063b0f94b1614610e41578063b2e6ceeb14610eaf578063b419dd2d14610ed2578063b5b90a2614610efb578063b68d6f3614610f55578063b8c6f579146110a9578063cbc846d9146110e2578063d1d46d2b1461111b578063dbc6f5481461114b578063e1fa76381461119c578063f2b1be45146111c8578063f2fde38b146111eb578063f37a7d4d14611224578063fca3b5aa14611279575b600080fd5b341561025657600080fd5b61025e6112b2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102ab57600080fd5b6102b36112d9565b6040518082815260200191505060405180910390f35b6102e3600480803561ffff169060200190919050506112e0565b005b34156102f057600080fd5b6102f8611675565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561033857808201518184015260208101905061031d565b50505050905090810190601f1680156103655780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561037e57600080fd5b610386611714565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103d357600080fd5b610560600480803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190505061173b565b005b341561056d57600080fd5b6105a2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611856565b005b34156105af57600080fd5b61062d600480803561ffff1690602001909190803590602001909190803561ffff16906020019091908035151590602001909190803563ffffffff1690602001909190803562ffffff1690602001909190803562ffffff1690602001909190803560ff1690602001909190803560ff16906020019091905050611985565b005b341561063a57600080fd5b610642611aea565b604051808215151515815260200191505060405180910390f35b341561066757600080fd5b6106b4600480803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091905050611afe565b005b34156106c157600080fd5b6106d76004808035906020019091905050611b9c565b60405180826000191660001916815260200191505060405180910390f35b341561070057600080fd5b610708611bc1565b6040518082815260200191505060405180910390f35b341561072957600080fd5b610731611bcf565b6040518082815260200191505060405180910390f35b341561075257600080fd5b61077e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611bd6565b005b341561078b57600080fd5b6107df600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611c75565b604051808215151515815260200191505060405180910390f35b341561080457600080fd5b610830600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611e3a565b6040518082815260200191505060405180910390f35b341561085157600080fd5b610859611e53565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156108a657600080fd5b6108bc6004808035906020019091905050611e79565b60405180898152602001881515151581526020018763ffffffff1663ffffffff1681526020018661ffff1661ffff1681526020018562ffffff1662ffffff1681526020018462ffffff1662ffffff1681526020018360ff1660ff1681526020018260ff1660ff1681526020019850505050505050505060405180910390f35b341561094657600080fd5b610972600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611f29565b005b341561097f57600080fd5b61099e6004808035906020019091908035906020019091905050611fc9565b005b34156109ab57600080fd5b6109b3612b0b565b604051808261ffff1661ffff16815260200191505060405180910390f35b34156109dc57600080fd5b6109f26004808035906020019091905050612b20565b60405180826000191660001916815260200191505060405180910390f35b3415610a1b57600080fd5b610a35600480803560001916906020019091905050612b3f565b604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018267ffffffffffffffff1667ffffffffffffffff1681526020019550505050505060405180910390f35b3415610ade57600080fd5b610af46004808035906020019091905050612bca565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610b4157600080fd5b610b6d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612c15565b005b3415610b7a57600080fd5b610ba6600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612cb5565b6040518082815260200191505060405180910390f35b3415610bc757600080fd5b610be0600480803560ff16906020019091905050612cff565b005b3415610bed57600080fd5b610bf5612d7e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610c4257600080fd5b610c586004808035906020019091905050612da5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610ca557600080fd5b610cad612dd9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610cfa57600080fd5b610d02612e00565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610d4f57600080fd5b610d57612e25565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d97578082015181840152602081019050610d7c565b50505050905090810190601f168015610dc45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610ddd57600080fd5b610de5612ec4565b005b3415610df257600080fd5b610e27600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050612f72565b604051808215151515815260200191505060405180910390f35b610ead60048080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613006565b005b3415610eba57600080fd5b610ed060048080359060200190919050506131a1565b005b3415610edd57600080fd5b610ee5613225565b6040518082815260200191505060405180910390f35b3415610f0657600080fd5b610f5360048080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190505061322c565b005b3415610f6057600080fd5b610f7660048080359060200190919050506132f1565b604051808d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018c60ff1660ff1681526020018b67ffffffffffffffff1667ffffffffffffffff1681526020018a60ff1660ff1681526020018962ffffff1662ffffff1681526020018867ffffffffffffffff1667ffffffffffffffff1681526020018761ffff1661ffff1681526020018661ffff1661ffff1681526020018561ffff1661ffff168152602001846fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff191681526020018367ffffffffffffffff1667ffffffffffffffff1681526020018267ffffffffffffffff1667ffffffffffffffff1681526020019c5050505050505050505050505060405180910390f35b34156110b457600080fd5b6110e0600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613441565b005b34156110ed57600080fd5b611119600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506134e1565b005b341561112657600080fd5b611149600480803561ffff16906020019091908035906020019091905050613581565b005b341561115657600080fd5b611182600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506135ff565b604051808215151515815260200191505060405180910390f35b34156111a757600080fd5b6111c66004808035906020019091908035906020019091905050613620565b005b34156111d357600080fd5b6111e960048080359060200190919050506143a2565b005b34156111f657600080fd5b611222600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050614408565b005b341561122f57600080fd5b61123761455d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561128457600080fd5b6112b0600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050614584565b005b61020260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61020a5481565b6112e8615766565b60028261ffff1660ff811015156112fb57fe5b600202016101006040519081016040529081600082015481526020016001820160009054906101000a900460ff161515151581526020016001820160019054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160059054906101000a900461ffff1661ffff1661ffff1681526020016001820160079054906101000a900462ffffff1662ffffff1662ffffff16815260200160018201600a9054906101000a900462ffffff1662ffffff1662ffffff16815260200160018201600d9054906101000a900460ff1660ff1660ff16815260200160018201600e9054906101000a900460ff1660ff1660ff168152505090506000816000015111151561140c57600080fd5b8060000151341015151561141f57600080fd5b8060200151158061143a57506000816040015163ffffffff16115b151561144557600080fd5b61020060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c2356d233383606001518460a0015185608001518660c001518760e001516040518763ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018661ffff1661ffff1681526020018562ffffff1662ffffff1681526020018462ffffff1662ffffff1681526020018360ff1660ff1681526020018260ff1660ff1681526020019650505050505050600060405180830381600087803b151561156657600080fd5b5af1151561157357600080fd5b50505060028261ffff1660ff8110151561158957fe5b60020201600001543411156115f5573373ffffffffffffffffffffffffffffffffffffffff166108fc60028461ffff1660ff811015156115c557fe5b600202016000015434039081150290604051600060405180830381858888f1935050505015156115f457600080fd5b5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc60028461ffff1660ff8110151561164457fe5b60020201600001549081150290604051600060405180830381858888f19350505050151561167157600080fd5b5050565b6102058054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561170c5780601f106116e15761010080835404028352916020019161170c565b820191906000526020600020905b8154815290600101906020018083116116ef57829003601f168201915b505050505081565b61020460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061020460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561179a57600080fd5b600090505b865181101561184d5761184087828151811015156117b957fe5b9060200190602002015187838151811015156117d157fe5b9060200190602002015187848151811015156117e957fe5b90602001906020020151878581518110151561180157fe5b90602001906020020151878681518110151561181957fe5b90602001906020020151878781518110151561183157fe5b90602001906020020151614624565b808060010191505061179f565b50505050505050565b803373ffffffffffffffffffffffffffffffffffffffff166102018281548110151561187e57fe5b906000526020600020906003020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156118d257600080fd5b8261020f600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156119e257600080fd5b60028a61ffff1660ff811015156119f557fe5b600202019050888160000181905550878160010160056101000a81548161ffff021916908361ffff160217905550868160010160006101000a81548160ff021916908315150217905550858160010160016101000a81548163ffffffff021916908363ffffffff160217905550848160010160076101000a81548162ffffff021916908362ffffff1602179055508381600101600a6101000a81548162ffffff021916908362ffffff1602179055508281600101600d6101000a81548160ff021916908360ff1602179055508181600101600e6101000a81548160ff021916908360ff16021790555050505050505050505050565b61020460149054906101000a900460ff1681565b600061020260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b5d57600080fd5b600090505b8151811015611b9857611b8b8282815181101515611b7c57fe5b9060200190602002015161483a565b8080600101915050611b62565b5050565b61020781815481101515611bac57fe5b90600052602060002090016000915090505481565b600061020180549050905090565b6102095481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c3157600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000803373ffffffffffffffffffffffffffffffffffffffff1661020f600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611d34575061020360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515611d3f57600080fd5b61020183815481101515611d4f57fe5b9060005260206000209060030201905061020360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611e235760028160000160146101000a81548160ff021916908360ff16021790555062093a8042018160000160156101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600181600001601d6101000a81548160ff021916908360ff1602179055505b611e2e858585614e8d565b60019150509392505050565b6102106020528060005260406000206000915090505481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60028160ff81101515611e8857fe5b600202016000915090508060000154908060010160009054906101000a900460ff16908060010160019054906101000a900463ffffffff16908060010160059054906101000a900461ffff16908060010160079054906101000a900462ffffff169080600101600a9054906101000a900462ffffff169080600101600d9054906101000a900460ff169080600101600e9054906101000a900460ff16905088565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611f8457600080fd5b8061020260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080833373ffffffffffffffffffffffffffffffffffffffff1661020182815481101515611ff457fe5b906000526020600020906003020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561204857600080fd5b61020b60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15156120d957600080fd5b5af115156120e657600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561212957600080fd5b600161020b60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630f99da4a866040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15156121bc57600080fd5b5af115156121c957600080fd5b5050506040518051905063ffffffff16101515156121e657600080fd5b610201858154811015156121f657fe5b9060005260206000209060030201925061020b60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166365113528856040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561229757600080fd5b5af115156122a457600080fd5b50505060405180519050915060018260ff1614806122c5575060028260ff16145b806122d3575060038260ff16145b156126095761020b60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631027e242856040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561236957600080fd5b5af1151561237657600080fd5b5050506040518051905083600001601d6101000a81548160ff021916908360ff160217905550818360000160146101000a81548160ff021916908360ff1602179055504261020b60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630f99da4a866040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561244b57600080fd5b5af1151561245857600080fd5b5050506040518051905061020b60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2a9ba05876040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15156124f357600080fd5b5af1151561250057600080fd5b505050604051805190500263ffffffff16018360000160156101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555061020b60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630f8ef9f8856040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15156125cd57600080fd5b5af115156125da57600080fd5b505050604051805190508360010160006101000a81548162ffffff021916908362ffffff1602179055506129a9565b60048260ff1614156128b2574267ffffffffffffffff168360000160159054906101000a900467ffffffffffffffff1667ffffffffffffffff1611151561264f57600080fd5b61020b60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631027e242856040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15156126e057600080fd5b5af115156126ed57600080fd5b5050506040518051905083600001601d6101000a81548160ff021916908360ff16021790555061020b60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630f99da4a856040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15156127a457600080fd5b5af115156127b157600080fd5b5050506040518051905061020b60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2a9ba05866040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561284c57600080fd5b5af1151561285957600080fd5b505050604051805190500263ffffffff168360000160158282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506129a8565b60058260ff1614156129a757600161020b60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630f99da4a866040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561295157600080fd5b5af1151561295e57600080fd5b5050506040518051905063ffffffff1614151561297a57600080fd5b60008360020160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b5b61020b60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd336000876040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1515612aa357600080fd5b5af11515612ab057600080fd5b505050604051805190501515612ac557600080fd5b7fa308815bb97242b3add8af5f65bc57d951176a0b0ee1cc7e51638e0da14920738585604051808381526020018281526020019250505060405180910390a15050505050565b61020b60009054906101000a900461ffff1681565b6000816040518082815260200191505060405180910390209050919050565b61020e6020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154908060040160009054906101000a900467ffffffffffffffff16905085565b600061020182815481101515612bdc57fe5b906000526020600020906003020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612c7057600080fd5b8061020d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061021060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612d5a57600080fd5b8060ff1661020b60006101000a81548161ffff021916908361ffff16021790555050565b61020c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61020f6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61020360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6102068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612ebc5780601f10612e9157610100808354040283529160200191612ebc565b820191906000526020600020905b815481529060010190602001808311612e9f57829003601f168201915b505050505081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612f1f57600080fd5b612f36600160006001600080600080600080611985565b612f53600266354a6ba7a180006003600080600080600080611985565b612f70600366470de4df8200006005600080600080600080611985565b565b6000813373ffffffffffffffffffffffffffffffffffffffff1661020182815481101515612f9c57fe5b906000526020600020906003020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515612ff057600080fd5b612ffb338585614e8d565b600191505092915050565b600080835111801561301a5750600a835111155b151561302557600080fd5b82516102095402341015151561303a57600080fd5b825161020854016102078054905011151561305457600080fd5b825161020954023411156130ab573373ffffffffffffffffffffffffffffffffffffffff166108fc8451610209540234039081150290604051600060405180830381858888f1935050505015156130aa57600080fd5b5b600090505b82518110156130e6576130d983828151811015156130ca57fe5b906020019060200201516150ba565b80806001019150506130b0565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151561319c578161020e60006102076001610208540381548110151561313857fe5b9060005260206000209001546000191660001916815260200190815260200160002060020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b505050565b3373ffffffffffffffffffffffffffffffffffffffff1661020f600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561320f57600080fd5b61322261321b82612bca565b3383614e8d565b50565b6102085481565b600061020260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561328b57600080fd5b600090505b81518110156132ed5761020780548060010182816132ae91906157c8565b9160005260206000209001600084848151811015156132c957fe5b90602001906020020151909190915090600019169055508080600101915050613290565b5050565b6102018181548110151561330157fe5b90600052602060002090600302016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a900460ff16908060000160159054906101000a900467ffffffffffffffff169080600001601d9054906101000a900460ff16908060010160009054906101000a900462ffffff16908060010160039054906101000a900467ffffffffffffffff169080600101600b9054906101000a900461ffff169080600101600d9054906101000a900461ffff169080600101600f9054906101000a900461ffff16908060020160009054906101000a900470010000000000000000000000000000000002908060020160109054906101000a900467ffffffffffffffff16908060020160189054906101000a900467ffffffffffffffff1690508c565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561349c57600080fd5b8061020360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561353c57600080fd5b8061020b60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156135dc57600080fd5b8060028361ffff1660ff811015156135f057fe5b60020201600001819055505050565b6102116020528060005260406000206000915054906101000a900460ff1681565b6136286157f4565b6136306157f4565b6000806000806000806000808b3373ffffffffffffffffffffffffffffffffffffffff166102018281548110151561366457fe5b906000526020600020906003020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156136b857600080fd5b6102018d8154811015156136c857fe5b906000526020600020906003020161018060405190810160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900460ff1660ff1660ff1681526020016000820160159054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601d9054906101000a900460ff1660ff1660ff1681526020016001820160009054906101000a900462ffffff1662ffffff1662ffffff1681526020016001820160039054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160018201600b9054906101000a900461ffff1661ffff1661ffff16815260200160018201600d9054906101000a900461ffff1661ffff1661ffff16815260200160018201600f9054906101000a900461ffff1661ffff1661ffff1681526020016002820160009054906101000a9004700100000000000000000000000000000000026fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff191681526020016002820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016002820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509a506102018c81548110151561391d57fe5b906000526020600020906003020161018060405190810160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900460ff1660ff1660ff1681526020016000820160159054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601d9054906101000a900460ff1660ff1660ff1681526020016001820160009054906101000a900462ffffff1662ffffff1662ffffff1681526020016001820160039054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160018201600b9054906101000a900461ffff1661ffff1661ffff16815260200160018201600d9054906101000a900461ffff1661ffff1661ffff16815260200160018201600f9054906101000a900461ffff1661ffff1661ffff1681526020016002820160009054906101000a9004700100000000000000000000000000000000026fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff191681526020016002820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016002820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050995060028b6020015160ff16148015613b865750428b6040015167ffffffffffffffff16115b15613be75760006102018e815481101515613b9d57fe5b906000526020600020906003020160000160146101000a81548160ff021916908360ff160217905550428b6040019067ffffffffffffffff16908167ffffffffffffffff16815250505b60028a6020015160ff16148015613c0c5750428a6040015167ffffffffffffffff1610155b151515613c1857600080fd5b8a610140015167ffffffffffffffff164210151515613c3657600080fd5b89610160015167ffffffffffffffff164210151515613c5457600080fd5b896000015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415614039578960a0015167ffffffffffffffff168b60a0015167ffffffffffffffff1610613cb9578960a00151613cbf565b8a60a001515b9850886102018e815481101515613cd257fe5b906000526020600020906003020160010160038282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550886102018d815481101515613d3357fe5b906000526020600020906003020160010160038282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555061020d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ff429fc88c61010001516040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808261ffff1661ffff168152602001915050602060405180830381600087803b1515613e2157600080fd5b5af11515613e2e57600080fd5b505050604051805190506102018e815481101515613e4857fe5b906000526020600020906003020160020160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006102018d815481101515613e9157fe5b906000526020600020906003020160010160039054906101000a900467ffffffffffffffff1667ffffffffffffffff161415613f6a57613ed33360008e614e8d565b61021060006102018e815481101515613ee857fe5b906000526020600020906003020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550613fb7565b610e1042016102018d815481101515613f7f57fe5b906000526020600020906003020160020160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b7f737ee67d38af00f653596ea4e3350216f7c1192ecbfab7263ab95cfde44ac4058d8d8f8c6000806000604051808881526020018781526020018681526020018567ffffffffffffffff1667ffffffffffffffff16815260200184815260200183815260200182815260200197505050505050505060405180910390a1614393565b60028a60a0015167ffffffffffffffff161080614064575060028b60a0015167ffffffffffffffff16105b1561406e57600080fd5b6140798b60016152e2565b97506140868a60006152e2565b965041600143034061020180549050604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401836000191660001916815260200182815260200193505050506040518091039020955086881161410a578661410c565b875b9450600285029350600184876001900481151561412557fe5b060192508688860103831115156141c2576141408d8d61533a565b91507f737ee67d38af00f653596ea4e3350216f7c1192ecbfab7263ab95cfde44ac4058d8d8f858c8c89604051808881526020018781526020018681526020018567ffffffffffffffff1667ffffffffffffffff16815260200184815260200183815260200182815260200197505050505050505060405180910390a161424a565b6141cc8c8e61533a565b91507f737ee67d38af00f653596ea4e3350216f7c1192ecbfab7263ab95cfde44ac4058d8d8e858c8c89604051808881526020018781526020018681526020018567ffffffffffffffff1667ffffffffffffffff16815260200184815260200183815260200182815260200197505050505050505060405180910390a15b61020d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ff429fc88c61010001516040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808261ffff1661ffff168152602001915050602060405180830381600087803b15156142e857600080fd5b5af115156142f557600080fd5b505050604051805190506102018e81548110151561430f57fe5b906000526020600020906003020160020160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550610e1042016102018d81548110151561435b57fe5b906000526020600020906003020160020160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b50505050505050505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156143fd57600080fd5b806102098190555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561446357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561449f57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61020b60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156145df57600080fd5b8061020460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060016102018181805490500191508161464091906158be565b506001610201805490500391506102018281548110151561465d57fe5b90600052602060002090600302019050878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508663ffffffff168160010160036101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508560ff1681600101600b6101000a81548161ffff021916908361ffff1602179055508460ff1681600101600d6101000a81548161ffff021916908361ffff1602179055508360ff1681600101600f6101000a81548161ffff021916908361ffff160217905550828160020160006101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555061021060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550818873ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050505050565b6000806148456158f0565b83604051808281526020019150506040518091039020925061020e600084600019166000191681526020019081526020016000209150600073ffffffffffffffffffffffffffffffffffffffff168260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156148db57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168260020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141580156149ab575061021160008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15614b5e5761020c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c2356d238360020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660016000806000806040518763ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018661ffff1681526020018562ffffff1681526020018462ffffff1681526020018360ff1681526020018260ff1681526020019650505050505050600060405180830381600087803b1515614ad057600080fd5b5af11515614add57600080fd5b505050600161021160008460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b61020d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bdd7908b85846003015461020180549050416040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001945050505050608060405180830381600087803b1515614c3d57600080fd5b5af11515614c4a57600080fd5b505050604051806080016040529050614cf28260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826003600481101515614c9057fe5b6020020151836000600481101515614ca457fe5b6020020151846001600481101515614cb857fe5b6020020151856002600481101515614ccc57fe5b602002015187600301548a18604051808281526020019150506040518091039020614624565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc83600101549081150290604051600060405180830381858888f193505050501515614d5857600080fd5b7fc68a0d9516a961dd6a8877cfeee3727698e55a18f46a8591bedce0f0e785df33838360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a161020e60008460001916600019168152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018201600090556002820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560038201600090556004820160006101000a81549067ffffffffffffffff0219169055505050505050565b8273ffffffffffffffffffffffffffffffffffffffff1661020182815481101515614eb457fe5b906000526020600020906003020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515614f0857600080fd5b8161020182815481101515614f1957fe5b906000526020600020906003020160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600061020f600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600161021060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550600161021060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60005b600073ffffffffffffffffffffffffffffffffffffffff1661020e6000610207610208548154811015156150ed57fe5b9060005260206000209001546000191660001916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561516857610208600081548092919060010191905055506150bd565b61020e60006102076102085481548110151561518057fe5b906000526020600020900154600019166000191681526020019081526020016000209050338160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061020954816001018190555081816003018190555061020a5442018160040160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550610208600081548092919060010191905055507fef94156a2f812e69556eed38c92924cd876b114a20297e82345e5d29d336e2376102076001610208540381548110151561527657fe5b90600052602060002090015433610209546040518084600019166000191681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b60008260a00151826152f557603c6152f8565b60285b60ff16615304856154f5565b0283615311576028615314565b603c5b60ff16615320866155ea565b020162ffffff160267ffffffffffffffff16905092915050565b6000806000806000806102018881548110151561535357fe5b906000526020600020906003020194506102018781548110151561537357fe5b906000526020600020906003020193506153a48560010160039054906101000a900467ffffffffffffffff166156df565b67ffffffffffffffff168460010160039054906101000a900467ffffffffffffffff1667ffffffffffffffff168115156153da57fe5b04925061020b60009054906101000a900461ffff1661ffff168460010160039054906101000a900467ffffffffffffffff1667ffffffffffffffff1681151561541f57fe5b0491508267ffffffffffffffff168267ffffffffffffffff16106154435782615445565b815b905060018167ffffffffffffffff16101561545f57600190505b808560010160038282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550808460010160038282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550809550505050505092915050565b6000808260e0015161ffff1691506003836020015160ff16148015615527575042836040015167ffffffffffffffff16115b156155e45781606483606486608001518760600151600a0260ff1601010262ffffff1681151561555357fe5b0403905060018162ffffff1610801561557357506001836060015160ff16145b15615583576001820191506155e3565b60038162ffffff1610801561559f57506002836060015160ff16145b156155af576003820191506155e2565b60058162ffffff161080156155cb57506003836060015160ff16145b156155db576005820191506155e1565b81810191505b5b5b5b50919050565b6000808260c0015161ffff1691506001836020015160ff1614801561561c575042836040015167ffffffffffffffff16115b156156d95781606483606486608001518760600151600a0260ff1601010262ffffff1681151561564857fe5b0403905060018162ffffff1610801561566857506001836060015160ff16145b15615678576001820191506156d8565b60038162ffffff1610801561569457506002836060015160ff16145b156156a4576003820191506156d7565b60058162ffffff161080156156c057506003836060015160ff16145b156156d0576005820191506156d6565b81810191505b5b5b5b50919050565b60008060026001840167ffffffffffffffff168115156156fb57fe5b0490508291505b8167ffffffffffffffff168167ffffffffffffffff161015615760578091506002818267ffffffffffffffff168567ffffffffffffffff1681151561574357fe5b040167ffffffffffffffff1681151561575857fe5b049050615702565b50919050565b6101006040519081016040528060008152602001600015158152602001600063ffffffff168152602001600061ffff168152602001600062ffffff168152602001600062ffffff168152602001600060ff168152602001600060ff1681525090565b8154818355818115116157ef578183600052602060002091820191016157ee919061591e565b5b505050565b61018060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600060ff168152602001600067ffffffffffffffff168152602001600060ff168152602001600062ffffff168152602001600067ffffffffffffffff168152602001600061ffff168152602001600061ffff168152602001600061ffff16815260200160006fffffffffffffffffffffffffffffffff19168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff1681525090565b8154818355818115116158eb576003028160030283600052602060002091820191016158ea9190615943565b5b505050565b6080604051908101604052806004905b600063ffffffff168152602001906001900390816159005790505090565b61594091905b8082111561593c576000816000905550600101615924565b5090565b90565b615a9291905b80821115615a8e57600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a81549060ff02191690556000820160156101000a81549067ffffffffffffffff021916905560008201601d6101000a81549060ff02191690556001820160006101000a81549062ffffff02191690556001820160036101000a81549067ffffffffffffffff021916905560018201600b6101000a81549061ffff021916905560018201600d6101000a81549061ffff021916905560018201600f6101000a81549061ffff02191690556002820160006101000a8154906fffffffffffffffffffffffffffffffff02191690556002820160106101000a81549067ffffffffffffffff02191690556002820160186101000a81549067ffffffffffffffff021916905550600301615949565b5090565b905600a165627a7a72305820c54e82a25b1f2611814f97a7b42581ae02b30240240d3962379aaa9d8a0c8fd60029

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

000000000000000000000000f15f61643eea73be40ad9b72c09ed381fac7a25600000000000000000000000096e666c387b1d25b490a33cdb5a32b8a1f91d3b6000000000000000000000000fa82a58605aff1f44d32b41904e7a43710f69d44

-----Decoded View---------------
Arg [0] : _boosters (address): 0xF15F61643eEa73be40aD9b72c09ED381faC7A256
Arg [1] : _chests (address): 0x96e666c387B1d25B490A33CDB5a32b8A1F91D3B6
Arg [2] : _utils (address): 0xFA82A58605AFf1F44d32b41904E7A43710f69d44

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000f15f61643eea73be40ad9b72c09ed381fac7a256
Arg [1] : 00000000000000000000000096e666c387b1d25b490a33cdb5a32b8a1f91d3b6
Arg [2] : 000000000000000000000000fa82a58605aff1f44d32b41904e7a43710f69d44


Swarm Source

bzzr://c54e82a25b1f2611814f97a7b42581ae02b30240240d3962379aaa9d8a0c8fd6

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

OVERVIEW

A peer-to-peer (P2P) player-versus-player (PvP) game for growing, fighting and trading unique digital fish with community-driven economy and immutable gaming assets based on smart contracts running on the Ethereum blockchain.

Validator Index Block Amount
View All Withdrawals

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

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