ETH Price: $3,280.76 (-8.79%)
Gas: 97 Gwei

Contract

0xb3640c4E8b8317CBE65aa4F20c7851996E6B406C
 

Overview

ETH Balance

0.871252993598492571 ETH

Eth Value

$2,858.37 (@ $3,280.76/ETH)

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Withdraw62821842018-09-06 12:11:362020 days ago1536235896IN
0xb3640c4E...96E6B406C
0 ETH0.000760312
Register Name Xn...62341312018-08-29 10:19:142028 days ago1535537954IN
0xb3640c4E...96E6B406C
0 ETH0.000230753
Register Name Xn...62341292018-08-29 10:18:492028 days ago1535537929IN
0xb3640c4E...96E6B406C
0 ETH0.000230753
Withdraw62225722018-08-27 11:14:482030 days ago1535368488IN
0xb3640c4E...96E6B406C
0 ETH0.0012671820
Withdraw62171552018-08-26 13:22:272031 days ago1535289747IN
0xb3640c4E...96E6B406C
0 ETH0.000117444
Withdraw61803952018-08-20 8:30:522038 days ago1534753852IN
0xb3640c4E...96E6B406C
0 ETH0.000316795
Register Name Xn...61708032018-08-18 17:40:342039 days ago1534614034IN
0xb3640c4E...96E6B406C
0 ETH0.000455442
Register Name Xn...61680112018-08-18 6:14:242040 days ago1534572864IN
0xb3640c4E...96E6B406C
0 ETH0.000830252
Withdraw61651202018-08-17 18:12:072040 days ago1534529527IN
0xb3640c4E...96E6B406C
0 ETH0.000190073
Buy Xaddr61651182018-08-17 18:11:202040 days ago1534529480IN
0xb3640c4E...96E6B406C
0.00017737 ETH0.000730033
Buy Xaddr61651152018-08-17 18:10:502040 days ago1534529450IN
0xb3640c4E...96E6B406C
0.00017737 ETH0.000730033
Buy Xaddr61651092018-08-17 18:09:282040 days ago1534529368IN
0xb3640c4E...96E6B406C
0.00017737 ETH0.000730033
Buy Xaddr61651042018-08-17 18:08:302040 days ago1534529310IN
0xb3640c4E...96E6B406C
0.00017737 ETH0.001216735
Buy Xaddr61651022018-08-17 18:08:162040 days ago1534529296IN
0xb3640c4E...96E6B406C
0.00017736 ETH0.000730033
Withdraw61650642018-08-17 17:59:022040 days ago1534528742IN
0xb3640c4E...96E6B406C
0 ETH0.000290156
Withdraw61593592018-08-16 18:52:522041 days ago1534445572IN
0xb3640c4E...96E6B406C
0 ETH0.000253434
Withdraw61592722018-08-16 18:31:442041 days ago1534444304IN
0xb3640c4E...96E6B406C
0 ETH0.0015958433
Withdraw61554082018-08-16 2:56:272042 days ago1534388187IN
0xb3640c4E...96E6B406C
0 ETH0.000316795
Buy Xname61551032018-08-16 1:39:352042 days ago1534383575IN
0xb3640c4E...96E6B406C
0 ETH0.0002393910
Buy Xid61507622018-08-15 8:03:182043 days ago1534320198IN
0xb3640c4E...96E6B406C
0.00008125 ETH0.0063746725
Buy Xid61507622018-08-15 8:03:182043 days ago1534320198IN
0xb3640c4E...96E6B406C
0.00008125 ETH0.0063746725
Buy Xid61507622018-08-15 8:03:182043 days ago1534320198IN
0xb3640c4E...96E6B406C
0.00008125 ETH0.003824815
Buy Xid61507462018-08-15 7:58:032043 days ago1534319883IN
0xb3640c4E...96E6B406C
0.00008125 ETH0.000756882
Withdraw61489782018-08-15 0:51:042043 days ago1534294264IN
0xb3640c4E...96E6B406C
0 ETH0.000495942.6
Withdraw61489652018-08-15 0:48:142043 days ago1534294094IN
0xb3640c4E...96E6B406C
0 ETH0.000250542.7
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Txn Hash Block From To Value
73559462019-03-12 18:40:071833 days ago1552416007
0xb3640c4E...96E6B406C
0.04716058 ETH
73559462019-03-12 18:40:071833 days ago1552416007
0xb3640c4E...96E6B406C
0.00129207 ETH
73525522019-03-12 5:54:381834 days ago1552370078
0xb3640c4E...96E6B406C
0.12861803 ETH
73525522019-03-12 5:54:381834 days ago1552370078
0xb3640c4E...96E6B406C
0.013 ETH
73525522019-03-12 5:54:381834 days ago1552370078
0xb3640c4E...96E6B406C
0.1 ETH
73423672019-03-10 15:56:181835 days ago1552233378
0xb3640c4E...96E6B406C
0.05226564 ETH
73423642019-03-10 15:55:291835 days ago1552233329
0xb3640c4E...96E6B406C
0.00172828 ETH
73391042019-03-10 3:43:381836 days ago1552189418
0xb3640c4E...96E6B406C
0.13529435 ETH
73391042019-03-10 3:43:381836 days ago1552189418
0xb3640c4E...96E6B406C
0.013 ETH
73391042019-03-10 3:43:381836 days ago1552189418
0xb3640c4E...96E6B406C
0.1 ETH
73390942019-03-10 3:40:331836 days ago1552189233
0xb3640c4E...96E6B406C
0.19443206 ETH
73390942019-03-10 3:40:331836 days ago1552189233
0xb3640c4E...96E6B406C
0.013 ETH
73390942019-03-10 3:40:331836 days ago1552189233
0xb3640c4E...96E6B406C
0.1 ETH
65192932018-10-15 10:59:381981 days ago1539601178
0xb3640c4E...96E6B406C
0.003 ETH
65192932018-10-15 10:59:381981 days ago1539601178
0xb3640c4E...96E6B406C
0.1 ETH
62821842018-09-06 12:11:362020 days ago1536235896
0xb3640c4E...96E6B406C
0.0615546 ETH
62225722018-08-27 11:14:482030 days ago1535368488
0xb3640c4E...96E6B406C
0.09560399 ETH
61803952018-08-20 8:30:522038 days ago1534753852
0xb3640c4E...96E6B406C
0.19560334 ETH
61773152018-08-19 19:50:552038 days ago1534708255
0xb3640c4E...96E6B406C
0.1 ETH
61651202018-08-17 18:12:072040 days ago1534529527
0xb3640c4E...96E6B406C
0.00002908 ETH
61651182018-08-17 18:11:202040 days ago1534529480
0xb3640c4E...96E6B406C
0.00002305 ETH
61651152018-08-17 18:10:502040 days ago1534529450
0xb3640c4E...96E6B406C
0.00002305 ETH
61651092018-08-17 18:09:282040 days ago1534529368
0xb3640c4E...96E6B406C
0.00002305 ETH
61651042018-08-17 18:08:302040 days ago1534529310
0xb3640c4E...96E6B406C
0.00002305 ETH
61651022018-08-17 18:08:162040 days ago1534529296
0xb3640c4E...96E6B406C
0.00002305 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
NTech3DLong

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

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

pragma solidity ^0.4.24;

/***********************************************************
 * @title SafeMath v0.1.9
 * @dev Math operations with safety checks that throw on error
 * change notes:  original SafeMath library from OpenZeppelin modified by Inventor
 * - added sqrt
 * - added sq
 * - added pwr 
 * - changed asserts to requires with error log outputs
 * - removed div, its useless
 ***********************************************************/
 library SafeMath {
    /**
    * @dev Multiplies two numbers, throws on overflow.
    */
    function mul(uint256 a, uint256 b) 
        internal 
        pure 
        returns (uint256 c) 
    {
        if (a == 0) {
            return 0;
        }
        c = a * b;
        require(c / a == b, "SafeMath mul failed");
        return c;
    }

    /**
    * @dev Integer division of two numbers, truncating the quotient.
    */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // assert(b > 0); // Solidity automatically throws when dividing by 0
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
        return c;
    }
    
    /**
    * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
    */
    function sub(uint256 a, uint256 b)
        internal
        pure
        returns (uint256) 
    {
        require(b <= a, "SafeMath sub failed");
        return a - b;
    }

    /**
    * @dev Adds two numbers, throws on overflow.
    */
    function add(uint256 a, uint256 b)
        internal
        pure
        returns (uint256 c) 
    {
        c = a + b;
        require(c >= a, "SafeMath add failed");
        return c;
    }
    
    /**
     * @dev gives square root of given x.
     */
    function sqrt(uint256 x)
        internal
        pure
        returns (uint256 y) 
    {
        uint256 z = ((add(x,1)) / 2);
        y = x;
        while (z < y) 
        {
            y = z;
            z = ((add((x / z),z)) / 2);
        }
    }
    
    /**
     * @dev gives square. multiplies x by x
     */
    function sq(uint256 x)
        internal
        pure
        returns (uint256)
    {
        return (mul(x,x));
    }
    
    /**
     * @dev x to the power of y 
     */
    function pwr(uint256 x, uint256 y)
        internal 
        pure 
        returns (uint256)
    {
        if (x==0)
            return (0);
        else if (y==0)
            return (1);
        else 
        {
            uint256 z = x;
            for (uint256 i=1; i < y; i++)
                z = mul(z,x);
            return (z);
        }
    }
}
/***********************************************************
 * NameFilter library
 ***********************************************************/
library NameFilter {
    /**
     * @dev filters name strings
     * -converts uppercase to lower case.  
     * -makes sure it does not start/end with a space
     * -makes sure it does not contain multiple spaces in a row
     * -cannot be only numbers
     * -cannot start with 0x 
     * -restricts characters to A-Z, a-z, 0-9, and space.
     * @return reprocessed string in bytes32 format
     */
    function nameFilter(string _input)
        internal
        pure
        returns(bytes32)
    {
        bytes memory _temp = bytes(_input);
        uint256 _length = _temp.length;
        
        //sorry limited to 32 characters
        require (_length <= 32 && _length > 0, "string must be between 1 and 32 characters");
        // make sure it doesnt start with or end with space
        require(_temp[0] != 0x20 && _temp[_length-1] != 0x20, "string cannot start or end with space");
        // make sure first two characters are not 0x
        if (_temp[0] == 0x30)
        {
            require(_temp[1] != 0x78, "string cannot start with 0x");
            require(_temp[1] != 0x58, "string cannot start with 0X");
        }
        
        // create a bool to track if we have a non number character
        bool _hasNonNumber;
        
        // convert & check
        for (uint256 i = 0; i < _length; i++)
        {
            // if its uppercase A-Z
            if (_temp[i] > 0x40 && _temp[i] < 0x5b)
            {
                // convert to lower case a-z
                _temp[i] = byte(uint(_temp[i]) + 32);
                
                // we have a non number
                if (_hasNonNumber == false)
                    _hasNonNumber = true;
            } else {
                require
                (
                    // require character is a space
                    _temp[i] == 0x20 || 
                    // OR lowercase a-z
                    (_temp[i] > 0x60 && _temp[i] < 0x7b) ||
                    // or 0-9
                    (_temp[i] > 0x2f && _temp[i] < 0x3a),
                    "string contains invalid characters"
                );
                // make sure theres not 2x spaces in a row
                if (_temp[i] == 0x20)
                    require( _temp[i+1] != 0x20, "string cannot contain consecutive spaces");
                
                // see if we have a character other than a number
                if (_hasNonNumber == false && (_temp[i] < 0x30 || _temp[i] > 0x39))
                    _hasNonNumber = true;    
            }
        }
        
        require(_hasNonNumber == true, "string cannot be only numbers");
        
        bytes32 _ret;
        assembly {
            _ret := mload(add(_temp, 32))
        }
        return (_ret);
    }
}
/***********************************************************
 * NTech3DDatasets library
 ***********************************************************/
library NTech3DDatasets {
    struct EventReturns {
        uint256 compressedData;
        uint256 compressedIDs;
        address winnerAddr;         // winner address
        bytes32 winnerName;         // winner name
        uint256 amountWon;          // amount won
        uint256 newPot;             // amount in new pot
        uint256 NTAmount;          // amount distributed to nt
        uint256 genAmount;          // amount distributed to gen
        uint256 potAmount;          // amount added to pot
    }
    struct Player {
        address addr;   // player address
        bytes32 name;   // player name
        uint256 win;    // winnings vault
        uint256 gen;    // general vault
        uint256 aff;    // affiliate vault
        uint256 lrnd;   // last round played
        uint256 laff;   // last affiliate id used
    }
    struct PlayerRounds {
        uint256 eth;    // eth player has added to round (used for eth limiter)
        uint256 keys;   // keys
        uint256 mask;   // player mask 
        uint256 ico;    // ICO phase investment
    }
    struct Round {
        uint256 plyr;   // pID of player in lead
        uint256 team;   // tID of team in lead
        uint256 end;    // time ends/ended
        bool ended;     // has round end function been ran
        uint256 strt;   // time round started
        uint256 keys;   // keys
        uint256 eth;    // total eth in
        uint256 pot;    // eth to pot (during round) / final amount paid to winner (after round ends)
        uint256 mask;   // global mask
        uint256 ico;    // total eth sent in during ICO phase
        uint256 icoGen; // total eth for gen during ICO phase
        uint256 icoAvg; // average key price for ICO phase
        uint256 prevres;    // 上一轮或者奖池互换流入本轮的奖金
    }
    struct TeamFee {
        uint256 gen;    // % of buy in thats paid to key holders of current round
        uint256 nt;    // % of buy in thats paid to nt holders
    }
    struct PotSplit {
        uint256 gen;    // % of pot thats paid to key holders of current round
        uint256 nt;     // % of pot thats paid to NT foundation 
    }
}
/***********************************************************
 interface : OtherNTech3D
 主要用作奖池互换
 ***********************************************************/
interface OtherNTech3D {
    function potSwap() external payable;
}
/***********************************************************
 * NTech3DKeysCalcLong library
 ***********************************************************/
library NTech3DKeysCalcLong {
    using SafeMath for *;
    /**
     * @dev calculates number of keys received given X eth 
     * @param _curEth current amount of eth in contract 
     * @param _newEth eth being spent
     * @return amount of ticket purchased
     */
    function keysRec(uint256 _curEth, uint256 _newEth)
        internal
        pure
        returns (uint256)
    {
        return(keys((_curEth).add(_newEth)).sub(keys(_curEth)));
    }
    
    /**
     * @dev calculates amount of eth received if you sold X keys 
     * @param _curKeys current amount of keys that exist 
     * @param _sellKeys amount of keys you wish to sell
     * @return amount of eth received
     */
    function ethRec(uint256 _curKeys, uint256 _sellKeys)
        internal
        pure
        returns (uint256)
    {
        return((eth(_curKeys)).sub(eth(_curKeys.sub(_sellKeys))));
    }

    /**
     * @dev calculates how many keys would exist with given an amount of eth
     * @param _eth eth "in contract"
     * @return number of keys that would exist
     */
    function keys(uint256 _eth) 
        internal
        pure
        returns(uint256)
    {
        return ((((((_eth).mul(1000000000000000000)).mul(312500000000000000000000000)).add(5624988281256103515625000000000000000000000000000000000000000000)).sqrt()).sub(74999921875000000000000000000000)) / (156250000);
    }
    
    /**
     * @dev calculates how much eth would be in contract given a number of keys
     * @param _keys number of keys "in contract" 
     * @return eth that would exists
     */
    function eth(uint256 _keys) 
        internal
        pure
        returns(uint256)  
    {
        return ((78125000).mul(_keys.sq()).add(((149999843750000).mul(_keys.mul(1000000000000000000))) / (2))) / ((1000000000000000000).sq());
    }
}

/***********************************************************
 * ERC20 interface
 * see https://github.com/ethereum/EIPs/issues/20
 ***********************************************************/
contract ERC20 {
    function totalSupply() public view returns (uint supply);
    function balanceOf( address who ) public view returns (uint value);
    function allowance( address owner, address spender ) public view returns (uint _allowance);

    function transfer( address to, uint value) public returns (bool ok);
    function transferFrom( address from, address to, uint value) public returns (bool ok);
    function approve( address spender, uint value ) public returns (bool ok);

    event Transfer( address indexed from, address indexed to, uint value);
    event Approval( address indexed owner, address indexed spender, uint value);
}
/***********************************************************
 interface : PlayerBookInterface
 ***********************************************************/
interface PlayerBookInterface {
    function getPlayerID(address _addr) external returns (uint256);
    function getPlayerName(uint256 _pID) external view returns (bytes32);
    function getPlayerLAff(uint256 _pID) external view returns (uint256);
    function getPlayerAddr(uint256 _pID) external view returns (address);
    function getNameFee() external view returns (uint256);
    function registerNameXIDFromDapp(address _addr, bytes32 _name, uint256 _affCode, bool _all) external payable returns(bool, uint256);
    function registerNameXaddrFromDapp(address _addr, bytes32 _name, address _affCode, bool _all) external payable returns(bool, uint256);
    function registerNameXnameFromDapp(address _addr, bytes32 _name, bytes32 _affCode, bool _all) external payable returns(bool, uint256);
}
/***********************************************************
 * NTech3DLong contract
 ***********************************************************/
contract NTech3DLong {
    /****************************************************************************************** 
     导入的库
     */
    using SafeMath              for *;
    using NameFilter            for string;
    using NTech3DKeysCalcLong   for uint256;
    /****************************************************************************************** 
     事件
     */
    // 当玩家注册名字时调用
    event onNewName
    (
        uint256 indexed playerID,
        address indexed playerAddress,
        bytes32 indexed playerName,
        bool isNewPlayer,
        uint256 affiliateID,
        address affiliateAddress,
        bytes32 affiliateName,
        uint256 amountPaid,
        uint256 timeStamp
    );
    // 购买完成后或者再次载入时调用
    event onEndTx
    (
        uint256 compressedData,     
        uint256 compressedIDs,      
        bytes32 playerName,
        address playerAddress,
        uint256 ethIn,
        uint256 keysBought,
        address winnerAddr,
        bytes32 winnerName,
        uint256 amountWon,
        uint256 newPot,
        uint256 NTAmount,
        uint256 genAmount,
        uint256 potAmount,
        uint256 airDropPot
    );
    
    // 撤退时调用
    event onWithdraw
    (
        uint256 indexed playerID,
        address playerAddress,
        bytes32 playerName,
        uint256 ethOut,
        uint256 timeStamp
    );
    
    // 当撤退并且分发时调用
    event onWithdrawAndDistribute
    (
        address playerAddress,
        bytes32 playerName,
        uint256 ethOut,
        uint256 compressedData,
        uint256 compressedIDs,
        address winnerAddr,
        bytes32 winnerName,
        uint256 amountWon,
        uint256 newPot,
        uint256 NTAmount,
        uint256 genAmount
    );
    
    // 当一轮时间过后,有玩家试图购买时调用
    event onBuyAndDistribute
    (
        address playerAddress,
        bytes32 playerName,
        uint256 ethIn,
        uint256 compressedData,
        uint256 compressedIDs,
        address winnerAddr,
        bytes32 winnerName,
        uint256 amountWon,
        uint256 newPot,
        uint256 NTAmount,
        uint256 genAmount
    );
    
    //当一轮时间过后,有玩家重载时调用
    event onReLoadAndDistribute
    (
        address playerAddress,
        bytes32 playerName,
        uint256 compressedData,
        uint256 compressedIDs,
        address winnerAddr,
        bytes32 winnerName,
        uint256 amountWon,
        uint256 newPot,
        uint256 NTAmount,
        uint256 genAmount
    );
    
    // 附属账号有支付时调用
    event onAffiliatePayout
    (
        uint256 indexed affiliateID,
        address affiliateAddress,
        bytes32 affiliateName,
        uint256 indexed roundID,
        uint256 indexed buyerID,
        uint256 amount,
        uint256 timeStamp
    );
    
    // 收到奖池存款调用
    event onPotSwapDeposit
    (
        uint256 roundID,
        uint256 amountAddedToPot
    );
    /******************************************************************************************
     合约权限管理
     设计:会设计用户权限管理,
        9 => 管理员角色
        0 => 没有任何权限
     */
    // 用户地址到角色的表
    mapping(address => uint256)     private users ;
    // 初始化
    function initUsers() private {
        // 初始化下列地址帐户为管理员
        users[0x89b2E7Ee504afd522E07F80Ae7b9d4D228AF3fe2] = 9 ;
        users[msg.sender] = 9 ;
    }
    // 是否是管理员
    modifier isAdmin() {
        uint256 role = users[msg.sender];
        require((role==9), "Must be admin.");
        _;
    }
    /******************************************************************************************
     检查是帐户地址还是合约地址   
     */
    modifier isHuman {
        address _addr = msg.sender;
        uint256 _codeLength;
        assembly {_codeLength := extcodesize(_addr)}
        require(_codeLength == 0, "Humans only");
        _;
    }
    /******************************************************************************************
     关联合约定义
     */
    // 玩家信息数据库合约
    PlayerBookInterface constant private PlayerBook = PlayerBookInterface(0x410526CD583AF0bE0530166d53Efcd7da969F7B7);
    
    /******************************************************************************************
     社区地址
     NT基金地址
     代币空投的收款地址
     */
    address public communityAddr_;
    address public NTFoundationAddr_;
    address private NTTokenSeller_ ;
    /****************************************************************************************** 
     设置代币地址
     条件:
     1. 地址不能为空
     2. 管理员
    */ 
    ERC20 private NTToken_ ;
    function setNTToken(address addr) isAdmin() public {
        require(address(addr) != address(0x0), "Empty address not allowed.");
        NTToken_ = ERC20(addr);
    }
    /** 
     将游戏合约中的未用完的代币转走
     条件:
     1. 数值大于0
     2. 管理员
     */
    function transfer(address toAddr, uint256 amount) isAdmin() public returns (bool) {
        require(amount > 0, "Must > 0 ");
        NTToken_.transfer(toAddr, amount);
        return true ;
    }
    /******************************************************************************************
     启动
     */
    bool public activated_ = false;
    modifier isActivated() {
        require(activated_ == true, "its not active yet."); 
        _;
    }
    /**
     TODO
     激活游戏
     条件:
     1、要是管理员
     2、要设定代币地址
     3、要设定用作奖池呼唤的游戏地址
     4、只可以激活一次
     */
    function activate() isAdmin() public {
        // 必须设定代币地址
        require(address(NTToken_) != address(0x0), "Must setup NTToken.");
        // 必须设定社区基金地址
        require(address(communityAddr_) != address(0x0), "Must setup CommunityAddr_.");
        // 必须设定购买NT地址
        require(address(NTTokenSeller_) != address(0x0), "Must setup NTTokenSeller.");
        // 必须设定NT基金地址
        require(address(NTFoundationAddr_) != address(0x0), "Must setup NTFoundationAddr.");
        // 只能激活一次
        require(activated_ == false, "Only once");
        //
        activated_ = true ;
        // 初始化开始轮信息
        rID_ = 1;
        round_[1].strt = now ;
        round_[1].end = now + rndMax_;
    }
    /******************************************************************************************
     合约信息
     */
    string constant public name = "NTech 3D Long Official";  // 合约名称
    string constant public symbol = "NT3D";                 // 合约符号
    /**
     */
    uint256 constant private rndInc_    = 1 minutes;                  // 每购买一个key延迟的时间
    uint256 constant private rndMax_    = 6 hours;                     // 一轮的最长时间

    uint256 private ntOf1Ether_ = 30000;                            // 一个以太兑换30000代币
    /******************************************************************************************
     奖池互换
     */
    OtherNTech3D private otherNTech3D_ ;    // 另外一个游戏接口,主要用作奖池呼唤
    /** 
     设定奖池呼唤的另外一个游戏合约地址
     条件
     1. 管理员权限
     2. 之前没有设定过
     3. 设定的地址不能为空
     */
    function setOtherNTech3D(address _otherNTech3D) isAdmin() public {
        require(address(_otherNTech3D) != address(0x0), "Empty address not allowed.");
        require(address(otherNTech3D_) == address(0x0), "OtherNTech3D has been set.");
        otherNTech3D_ = OtherNTech3D(_otherNTech3D);
    }
    /******************************************************************************************
     判断金额
     */
    modifier isWithinLimits(uint256 _eth) {
        require(_eth >= 1000000000, "Too little");
        require(_eth <= 100000000000000000000000, "Too much");
        _;    
    }

    /******************************************************************************************
     玩家信息
     */
    // 玩家地址 => 玩家ID 
    mapping (address => uint256) public pIDxAddr_;  
    // 玩家名称 => 玩家ID
    mapping (bytes32 => uint256) public pIDxName_;  
    // 玩家ID => 玩家信息
    mapping (uint256 => NTech3DDatasets.Player) public plyr_; 
    // 玩家ID => 游戏轮编号 => 玩家游戏轮信息
    mapping (uint256 => mapping (uint256 => NTech3DDatasets.PlayerRounds)) public plyrRnds_;
    // 玩家ID => 玩家名称 => 
    mapping (uint256 => mapping (bytes32 => bool)) public plyrNames_;
    /******************************************************************************************
     游戏信息
     */
    uint256 public rID_;                    // 当前游戏轮编号 
    uint256 public airDropPot_;             // 空投小奖池
    uint256 public airDropTracker_ = 0;     // 空投小奖池计数
    // 游戏每轮ID => 游戏轮 
    mapping (uint256 => NTech3DDatasets.Round) public round_;
    // 游戏每轮ID -> 团队ID => ETH
    mapping (uint256 => mapping(uint256 => uint256)) public rndTmEth_;
    /******************************************************************************************
     团队信息
     0 : 水鲸队
     1 : 懒熊队
     2 : 玩蛇队
     3 : 疯牛队
     */
    // 团队ID => 分配规则 
    mapping (uint256 => NTech3DDatasets.TeamFee) public fees_; 
    // 团队ID => 分配规则
    mapping (uint256 => NTech3DDatasets.PotSplit) public potSplit_;
    /******************************************************************************************
     构造函数
     */
    
    constructor() public {
        // 水鲸:本轮玩家 30%  空投 6%
        fees_[0] = NTech3DDatasets.TeamFee(30,6);
        // 懒熊:本轮玩家 43%  空投 0%
        fees_[1] = NTech3DDatasets.TeamFee(43,0);
        // 玩蛇:本轮玩家 56%  空投 10%
        fees_[2] = NTech3DDatasets.TeamFee(56,10);
        // 疯牛:本轮玩家 43%  空投 8%
        fees_[3] = NTech3DDatasets.TeamFee(43,8);
        // 此轮奖池分配:
        // 水鲸:本轮玩家 25%
        potSplit_[0] = NTech3DDatasets.PotSplit(15,10);
        // 懒熊:本轮玩家 25%
        potSplit_[1] = NTech3DDatasets.PotSplit(25,0); 
        // 玩蛇:本轮玩家 40%
        potSplit_[2] = NTech3DDatasets.PotSplit(20,20);
        // 疯牛:本轮玩家 40%
        potSplit_[3] = NTech3DDatasets.PotSplit(30,10);
        // 初始化用户管理
        initUsers();
        /**
         */
        NTToken_ = ERC20(address(0x09341B5d43a9b2362141675b9276B777470222Be));
        
        communityAddr_ = address(0x3C07f9f7164Bf72FDBefd9438658fAcD94Ed4439);
        NTTokenSeller_ = address(0x531100a6b3686E6140f170B0920962A5D7A2DD25);
        NTFoundationAddr_ = address(0x89b2E7Ee504afd522E07F80Ae7b9d4D228AF3fe2);
    }
    /******************************************************************************************
     购买
     */
    function buyXid(uint256 _affCode, uint256 _team) isActivated() isHuman() isWithinLimits(msg.value) public payable {
        NTech3DDatasets.EventReturns memory _eventData_ = determinePID(_eventData_);
        uint256 _pID = pIDxAddr_[msg.sender];
        if (_affCode == 0 || _affCode == _pID){
            _affCode = plyr_[_pID].laff;
        }else if (_affCode != plyr_[_pID].laff) {
            plyr_[_pID].laff = _affCode;
        }
        _team = verifyTeam(_team);
        buyCore(_pID, _affCode, _team, _eventData_);
    }
    
    function buyXaddr(address _affCode, uint256 _team) isActivated() isHuman() isWithinLimits(msg.value) public payable {
        NTech3DDatasets.EventReturns memory _eventData_ = determinePID(_eventData_);
        uint256 _pID = pIDxAddr_[msg.sender];
        uint256 _affID;
        if (_affCode == address(0) || _affCode == msg.sender){
            _affID = plyr_[_pID].laff;
        }else{
             _affID = pIDxAddr_[_affCode];
             if (_affID != plyr_[_pID].laff){
                 plyr_[_pID].laff = _affID;
             }
        }
         _team = verifyTeam(_team);
         buyCore(_pID, _affID, _team, _eventData_);
    }

    function buyXname(bytes32 _affCode, uint256 _team) isActivated() isHuman() isWithinLimits(msg.value) public payable {
        NTech3DDatasets.EventReturns memory _eventData_ = determinePID(_eventData_);
        uint256 _pID = pIDxAddr_[msg.sender];
        uint256 _affID;
        if (_affCode == '' || _affCode == plyr_[_pID].name){
            _affID = plyr_[_pID].laff;
        }else{
            _affID = pIDxName_[_affCode];
            if (_affID != plyr_[_pID].laff){
                plyr_[_pID].laff = _affID;
            }
        }
        _team = verifyTeam(_team);
        buyCore(_pID, _affID, _team, _eventData_);
    }

    function reLoadXid(uint256 _affCode, uint256 _team, uint256 _eth) isActivated() isHuman() isWithinLimits(_eth) public {
        NTech3DDatasets.EventReturns memory _eventData_;
        uint256 _pID = pIDxAddr_[msg.sender];
        if (_affCode == 0 || _affCode == _pID){
            _affCode = plyr_[_pID].laff;
        }else if (_affCode != plyr_[_pID].laff) {
            plyr_[_pID].laff = _affCode;
        }
        _team = verifyTeam(_team);
        reLoadCore(_pID, _affCode, _team, _eth, _eventData_);
    }

    function reLoadXaddr(address _affCode, uint256 _team, uint256 _eth) isActivated() isHuman() isWithinLimits(_eth) public {
        NTech3DDatasets.EventReturns memory _eventData_;
        uint256 _pID = pIDxAddr_[msg.sender];
        uint256 _affID;
        if (_affCode == address(0) || _affCode == msg.sender){
            _affID = plyr_[_pID].laff;
        }else{
            _affID = pIDxAddr_[_affCode];
            if (_affID != plyr_[_pID].laff){
                plyr_[_pID].laff = _affID;
            }
        }
        _team = verifyTeam(_team);
        reLoadCore(_pID, _affID, _team, _eth, _eventData_);
    }

    function reLoadXname(bytes32 _affCode, uint256 _team, uint256 _eth) isActivated() isHuman() isWithinLimits(_eth) public {
        NTech3DDatasets.EventReturns memory _eventData_;
        uint256 _pID = pIDxAddr_[msg.sender];
        uint256 _affID;
        if (_affCode == '' || _affCode == plyr_[_pID].name){
            _affID = plyr_[_pID].laff;
        }else{
            _affID = pIDxName_[_affCode];
            if (_affID != plyr_[_pID].laff){
                plyr_[_pID].laff = _affID;
            }
        }
        _team = verifyTeam(_team);
        reLoadCore(_pID, _affID, _team, _eth, _eventData_);
    }
    /**
     撤退
     */
    function withdraw() isActivated() isHuman() public {
        uint256 _rID = rID_;
        uint256 _now = now;
        uint256 _pID = pIDxAddr_[msg.sender];
        uint256 _eth;
        
        if (_now > round_[_rID].end && (round_[_rID].ended == false) && round_[_rID].plyr != 0){
            NTech3DDatasets.EventReturns memory _eventData_;
            round_[_rID].ended = true;
            _eventData_ = endRound(_eventData_);
            // get their earnings
            _eth = withdrawEarnings(_pID);
            if (_eth > 0)
                plyr_[_pID].addr.transfer(_eth);

            _eventData_.compressedData = _eventData_.compressedData + (_now * 1000000000000000000);
            _eventData_.compressedIDs = _eventData_.compressedIDs + _pID;

            emit onWithdrawAndDistribute(
                msg.sender, 
                plyr_[_pID].name, 
                _eth, 
                _eventData_.compressedData, 
                _eventData_.compressedIDs, 
                _eventData_.winnerAddr, 
                _eventData_.winnerName, 
                _eventData_.amountWon, 
                _eventData_.newPot, 
                _eventData_.NTAmount, 
                _eventData_.genAmount
            );                
        }else{
            _eth = withdrawEarnings(_pID);
            if (_eth > 0)
                plyr_[_pID].addr.transfer(_eth);
            emit onWithdraw(
                _pID, 
                msg.sender, 
                plyr_[_pID].name, 
                _eth, 
                _now
            );
        }
    }
    /******************************************************************************************
     注册
     */
    function registerNameXID(string _nameString, uint256 _affCode, bool _all) isHuman() public payable{
        bytes32 _name = _nameString.nameFilter();
        address _addr = msg.sender;
        uint256 _paid = msg.value;
        (bool _isNewPlayer, uint256 _affID) = PlayerBook.registerNameXIDFromDapp.value(_paid)(_addr, _name, _affCode, _all);
        uint256 _pID = pIDxAddr_[_addr];

        emit onNewName(
            _pID, 
            _addr, 
            _name, 
            _isNewPlayer, 
            _affID, 
            plyr_[_affID].addr, 
            plyr_[_affID].name, 
            _paid, 
            now
        );
    }

    function registerNameXaddr(string _nameString, address _affCode, bool _all) isHuman() public payable{
        bytes32 _name = _nameString.nameFilter();
        address _addr = msg.sender;
        uint256 _paid = msg.value;
        (bool _isNewPlayer, uint256 _affID) = PlayerBook.registerNameXaddrFromDapp.value(msg.value)(msg.sender, _name, _affCode, _all);
        
        uint256 _pID = pIDxAddr_[_addr];
        
        emit onNewName(
            _pID, 
            _addr, 
            _name, 
            _isNewPlayer, 
            _affID, 
            plyr_[_affID].addr, 
            plyr_[_affID].name, 
            _paid, 
            now
        );
    }

    function registerNameXname(string _nameString, bytes32 _affCode, bool _all) isHuman() public payable{
        bytes32 _name = _nameString.nameFilter();
        address _addr = msg.sender;
        uint256 _paid = msg.value;
        (bool _isNewPlayer, uint256 _affID) = PlayerBook.registerNameXnameFromDapp.value(msg.value)(msg.sender, _name, _affCode, _all);
        
        uint256 _pID = pIDxAddr_[_addr];
        
        emit onNewName(
            _pID, 
            _addr, 
            _name, 
            _isNewPlayer, 
            _affID, 
            plyr_[_affID].addr, 
            plyr_[_affID].name, 
            _paid, 
            now
        );
    }
    /******************************************************************************************
     获取购买价格
     */
    function getBuyPrice() public view  returns(uint256) {  
        uint256 _rID = rID_;
        uint256 _now = now;

        //if (_now > round_[_rID].strt + rndGap_ && (_now <= round_[_rID].end || (_now > round_[_rID].end && round_[_rID].plyr == 0)))
        if (_now > round_[_rID].strt && (_now <= round_[_rID].end || (_now > round_[_rID].end && round_[_rID].plyr == 0)))
            return ( (round_[_rID].keys.add(1000000000000000000)).ethRec(1000000000000000000) );
        else // rounds over.  need price for new round
            return ( 75000000000000 ); // init
    }
    /******************************************************************************************
     得到剩余时间
     */
    function getTimeLeft() public view returns(uint256) {
        uint256 _rID = rID_;
        uint256 _now = now;

        if (_now < round_[_rID].end)
            //if (_now > round_[_rID].strt + rndGap_)
            if (_now > round_[_rID].strt)
                return( (round_[_rID].end).sub(_now) );
            else
                //return( (round_[_rID].strt + rndGap_).sub(_now) );
                return( (round_[_rID].end).sub(_now) );
        else
            return(0);
    }

    function getPlayerVaults(uint256 _pID) public view returns(uint256 ,uint256, uint256) {
        uint256 _rID = rID_;
        if (now > round_[_rID].end && round_[_rID].ended == false && round_[_rID].plyr != 0){
            // if player is winner 
            if (round_[_rID].plyr == _pID){
                // Added by Huwei
                uint256 _pot = round_[_rID].pot.add(round_[_rID].prevres);
                return
                (
                    // Fix by huwei
                    //(plyr_[_pID].win).add( ((round_[_rID].pot).mul(48)) / 100 ),
                    (plyr_[_pID].win).add( ((_pot).mul(48)) / 100 ),
                    (plyr_[_pID].gen).add(  getPlayerVaultsHelper(_pID, _rID).sub(plyrRnds_[_pID][_rID].mask)   ),
                    plyr_[_pID].aff
                );
            // if player is not the winner
            } else {
                return(
                    plyr_[_pID].win,
                    (plyr_[_pID].gen).add(  getPlayerVaultsHelper(_pID, _rID).sub(plyrRnds_[_pID][_rID].mask)  ),
                    plyr_[_pID].aff
                );
            }
            
        // if round is still going on, or round has ended and round end has been ran
        } else {
            return(
                plyr_[_pID].win,
                (plyr_[_pID].gen).add(calcUnMaskedEarnings(_pID, plyr_[_pID].lrnd)),
                plyr_[_pID].aff
            );
        }
    }

    function getPlayerVaultsHelper(uint256 _pID, uint256 _rID) private view returns(uint256) {
        // Fixed by Huwei
        uint256 _pot = round_[_rID].pot.add(round_[_rID].prevres);
        return(  ((((round_[_rID].mask).add(((((_pot).mul(potSplit_[round_[_rID].team].gen)) / 100).mul(1000000000000000000)) / (round_[_rID].keys))).mul(plyrRnds_[_pID][_rID].keys)) / 1000000000000000000)  );
        //return(  ((((round_[_rID].mask).add(((((round_[_rID].pot).mul(potSplit_[round_[_rID].team].gen)) / 100).mul(1000000000000000000)) / (round_[_rID].keys))).mul(plyrRnds_[_pID][_rID].keys)) / 1000000000000000000)  );
    }
    /**
     得到当前此轮信息
     */
    function getCurrentRoundInfo() public view
        returns(uint256, uint256, uint256, uint256, uint256, uint256, uint256, address, bytes32, uint256, uint256, uint256, uint256, uint256) {
        uint256 _rID = rID_;            
        return
            (
                round_[_rID].ico,             
                _rID,             
                round_[_rID].keys,             
                round_[_rID].end, 
                round_[_rID].strt, 
                round_[_rID].pot,             
                (round_[_rID].team + (round_[_rID].plyr * 10)),
                plyr_[round_[_rID].plyr].addr,
                plyr_[round_[_rID].plyr].name,
                rndTmEth_[_rID][0],
                rndTmEth_[_rID][1],
                rndTmEth_[_rID][2],
                rndTmEth_[_rID][3],
                airDropTracker_ + (airDropPot_ * 1000)
            );     
    }

    function getPlayerInfoByAddress(address _addr) public  view  returns(uint256, bytes32, uint256, uint256, uint256, uint256, uint256){
        uint256 _rID = rID_;
        if (_addr == address(0)) {
            _addr == msg.sender;
        }
        uint256 _pID = pIDxAddr_[_addr];

        return (
            _pID,
            plyr_[_pID].name,
            plyrRnds_[_pID][_rID].keys,
            plyr_[_pID].win,
            (plyr_[_pID].gen).add(calcUnMaskedEarnings(_pID, plyr_[_pID].lrnd)),
            plyr_[_pID].aff,
            plyrRnds_[_pID][_rID].eth
        );
    }

    function buyCore(uint256 _pID, uint256 _affID, uint256 _team, NTech3DDatasets.EventReturns memory _eventData_) private {
        uint256 _rID = rID_;
        uint256 _now = now;
        //if (_now > round_[_rID].strt + rndGap_ && (_now <= round_[_rID].end || (_now > round_[_rID].end && round_[_rID].plyr == 0))) {
            if (_now > round_[_rID].strt && (_now <= round_[_rID].end || (_now > round_[_rID].end && round_[_rID].plyr == 0))) {
            core(_rID, _pID, msg.value, _affID, _team, _eventData_);
        }else{
            if (_now > round_[_rID].end && round_[_rID].ended == false) {
                round_[_rID].ended = true;
                _eventData_ = endRound(_eventData_);

                _eventData_.compressedData = _eventData_.compressedData + (_now * 1000000000000000000);
                _eventData_.compressedIDs = _eventData_.compressedIDs + _pID;
                emit onBuyAndDistribute(
                    msg.sender, 
                    plyr_[_pID].name, 
                    msg.value, 
                    _eventData_.compressedData, 
                    _eventData_.compressedIDs, 
                    _eventData_.winnerAddr, 
                    _eventData_.winnerName, 
                    _eventData_.amountWon, 
                    _eventData_.newPot, 
                    _eventData_.NTAmount, 
                    _eventData_.genAmount
                );
            }
            plyr_[_pID].gen = plyr_[_pID].gen.add(msg.value);
        }
    }

    function reLoadCore(uint256 _pID, uint256 _affID, uint256 _team, uint256 _eth, NTech3DDatasets.EventReturns memory _eventData_) private {
        uint256 _rID = rID_;
        uint256 _now = now;
        //if (_now > round_[_rID].strt + rndGap_ && (_now <= round_[_rID].end || (_now > round_[_rID].end && round_[_rID].plyr == 0))) {
        if (_now > round_[_rID].strt && (_now <= round_[_rID].end || (_now > round_[_rID].end && round_[_rID].plyr == 0))) {
            plyr_[_pID].gen = withdrawEarnings(_pID).sub(_eth);
            core(_rID, _pID, _eth, _affID, _team, _eventData_);
        }else if (_now > round_[_rID].end && round_[_rID].ended == false) {
            round_[_rID].ended = true;
            _eventData_ = endRound(_eventData_);

            _eventData_.compressedData = _eventData_.compressedData + (_now * 1000000000000000000);
            _eventData_.compressedIDs = _eventData_.compressedIDs + _pID;

            emit onReLoadAndDistribute(
                msg.sender, 
                plyr_[_pID].name, 
                _eventData_.compressedData, 
                _eventData_.compressedIDs, 
                _eventData_.winnerAddr, 
                _eventData_.winnerName, 
                _eventData_.amountWon, 
                _eventData_.newPot, 
                _eventData_.NTAmount, 
                _eventData_.genAmount
            );
        }
    }

    function core(uint256 _rID, uint256 _pID, uint256 _eth, uint256 _affID, uint256 _team, NTech3DDatasets.EventReturns memory _eventData_) private{
        if (plyrRnds_[_pID][_rID].keys == 0)
            _eventData_ = managePlayer(_pID, _eventData_);
        // 每轮早期的限制 (5 ether 以下)
        // 智能合约收到的总额达到100 ETH之前,每个以太坊地址最多只能购买总额10个ETH的Key。
        if (round_[_rID].eth < 100000000000000000000 && plyrRnds_[_pID][_rID].eth.add(_eth) > 10000000000000000000){
            uint256 _availableLimit = (10000000000000000000).sub(plyrRnds_[_pID][_rID].eth);
            uint256 _refund = _eth.sub(_availableLimit);
            plyr_[_pID].gen = plyr_[_pID].gen.add(_refund);
            _eth = _availableLimit;
        }
        if (_eth > 1000000000) {
            uint256 _keys = (round_[_rID].eth).keysRec(_eth);

            if (_keys >= 1000000000000000000){
                updateTimer(_keys, _rID);
                if (round_[_rID].plyr != _pID)
                    round_[_rID].plyr = _pID;  
                if (round_[_rID].team != _team)
                    round_[_rID].team = _team; 
                _eventData_.compressedData = _eventData_.compressedData + 100;
            }

            if (_eth >= 100000000000000000){
                // > 0.1 ether, 才有空投
                airDropTracker_++;
                if (airdrop() == true){
                    uint256 _prize;
                    if (_eth >= 10000000000000000000){
                        // <= 10 ether
                        _prize = ((airDropPot_).mul(75)) / 100;
                        plyr_[_pID].win = (plyr_[_pID].win).add(_prize);
                        airDropPot_ = (airDropPot_).sub(_prize);

                        _eventData_.compressedData += 300000000000000000000000000000000;
                    }else if(_eth >= 1000000000000000000 && _eth < 10000000000000000000) {
                        // >= 1 ether and < 10 ether
                        _prize = ((airDropPot_).mul(50)) / 100;
                        plyr_[_pID].win = (plyr_[_pID].win).add(_prize);

                        airDropPot_ = (airDropPot_).sub(_prize);

                        _eventData_.compressedData += 200000000000000000000000000000000;

                    }else if(_eth >= 100000000000000000 && _eth < 1000000000000000000){
                        // >= 0.1 ether and < 1 ether
                        _prize = ((airDropPot_).mul(25)) / 100;
                        plyr_[_pID].win = (plyr_[_pID].win).add(_prize);

                        airDropPot_ = (airDropPot_).sub(_prize);

                        _eventData_.compressedData += 300000000000000000000000000000000;
                    }

                    _eventData_.compressedData += 10000000000000000000000000000000;

                    _eventData_.compressedData += _prize * 1000000000000000000000000000000000;

                    airDropTracker_ = 0;
                }
            }

            _eventData_.compressedData = _eventData_.compressedData + (airDropTracker_ * 1000);

            plyrRnds_[_pID][_rID].keys = _keys.add(plyrRnds_[_pID][_rID].keys);
            plyrRnds_[_pID][_rID].eth = _eth.add(plyrRnds_[_pID][_rID].eth);

            round_[_rID].keys = _keys.add(round_[_rID].keys);
            round_[_rID].eth = _eth.add(round_[_rID].eth);
            rndTmEth_[_rID][_team] = _eth.add(rndTmEth_[_rID][_team]);

            // distribute eth
            _eventData_ = distributeExternal(_rID, _pID, _eth, _affID, _team, _eventData_);
            _eventData_ = distributeInternal(_rID, _pID, _eth, _team, _keys, _eventData_);

            endTx(_pID, _team, _eth, _keys, _eventData_);
        }

    }

    function calcUnMaskedEarnings(uint256 _pID, uint256 _rIDlast) private view returns(uint256) {
        // round_[_rIDlast].mask * plyrRnds_[_pID][_rIDlast].keys / 1000000000000000000 - plyrRnds_[_pID][_rIDlast].mask
        return(  (((round_[_rIDlast].mask).mul(plyrRnds_[_pID][_rIDlast].keys)) / (1000000000000000000)).sub(plyrRnds_[_pID][_rIDlast].mask)  );
    }

    function calcKeysReceived(uint256 _rID, uint256 _eth) public view returns(uint256){
        uint256 _now = now;
        //if (_now > round_[_rID].strt + rndGap_ && (_now <= round_[_rID].end || (_now > round_[_rID].end && round_[_rID].plyr == 0)))
        if (_now > round_[_rID].strt && (_now <= round_[_rID].end || (_now > round_[_rID].end && round_[_rID].plyr == 0)))
            return ( (round_[_rID].eth).keysRec(_eth) );
        else // rounds over.  need keys for new round
            return ( (_eth).keys() );
    }

    function iWantXKeys(uint256 _keys) public view returns(uint256) {
        uint256 _rID = rID_;

        uint256 _now = now;

        //if (_now > round_[_rID].strt + rndGap_ && (_now <= round_[_rID].end || (_now > round_[_rID].end && round_[_rID].plyr == 0)))
        if (_now > round_[_rID].strt && (_now <= round_[_rID].end || (_now > round_[_rID].end && round_[_rID].plyr == 0)))
            return ( (round_[_rID].keys.add(_keys)).ethRec(_keys) );
        else // rounds over.  need price for new round
            return ( (_keys).eth() );
    }
    /**
     interface : PlayerBookReceiverInterface
     */
    function receivePlayerInfo(uint256 _pID, address _addr, bytes32 _name, uint256 _laff) external {
        require (msg.sender == address(PlayerBook), "Called from PlayerBook only");
        if (pIDxAddr_[_addr] != _pID)
            pIDxAddr_[_addr] = _pID;
        if (pIDxName_[_name] != _pID)
            pIDxName_[_name] = _pID;
        if (plyr_[_pID].addr != _addr)
            plyr_[_pID].addr = _addr;
        if (plyr_[_pID].name != _name)
            plyr_[_pID].name = _name;
        if (plyr_[_pID].laff != _laff)
            plyr_[_pID].laff = _laff;
        if (plyrNames_[_pID][_name] == false)
            plyrNames_[_pID][_name] = true;
    }

    function receivePlayerNameList(uint256 _pID, bytes32 _name) external {
        require (msg.sender == address(PlayerBook), "Called from PlayerBook only");
        if(plyrNames_[_pID][_name] == false)
            plyrNames_[_pID][_name] = true;
    }
    /**
     识别玩家
     */
    function determinePID(NTech3DDatasets.EventReturns memory _eventData_) private returns (NTech3DDatasets.EventReturns) {
        uint256 _pID = pIDxAddr_[msg.sender];
        if (_pID == 0){
            _pID = PlayerBook.getPlayerID(msg.sender);
            bytes32 _name = PlayerBook.getPlayerName(_pID);
            uint256 _laff = PlayerBook.getPlayerLAff(_pID);
            pIDxAddr_[msg.sender] = _pID;
            plyr_[_pID].addr = msg.sender;
            if (_name != ""){
                pIDxName_[_name] = _pID;
                plyr_[_pID].name = _name;
                plyrNames_[_pID][_name] = true;
            }
            if (_laff != 0 && _laff != _pID)
                plyr_[_pID].laff = _laff;
            // set the new player bool to true    
            _eventData_.compressedData = _eventData_.compressedData + 1;                
        } 
        return _eventData_ ;
    }
    /**
     识别团队,默认是玩蛇队
     */
    function verifyTeam(uint256 _team) private pure returns (uint256) {
        if (_team < 0 || _team > 3) 
            return(2);
        else
            return(_team);
    }

    function managePlayer(uint256 _pID, NTech3DDatasets.EventReturns memory _eventData_) private returns (NTech3DDatasets.EventReturns) {
        if (plyr_[_pID].lrnd != 0)
            updateGenVault(_pID, plyr_[_pID].lrnd);
        
        plyr_[_pID].lrnd = rID_;

        _eventData_.compressedData = _eventData_.compressedData + 10;

        return _eventData_ ;
    }
    /**
     这轮游戏结束
     */
    function endRound(NTech3DDatasets.EventReturns memory _eventData_) private returns (NTech3DDatasets.EventReturns) {
        uint256 _rID = rID_;
        uint256 _winPID = round_[_rID].plyr;
        uint256 _winTID = round_[_rID].team;
        // grab our pot amount
        // Fixed by Huwei
        //uint256 _pot = round_[_rID].pot;
        uint256 _pot = round_[_rID].pot.add(round_[_rID].prevres);

        // 赢家获取奖池的48%
        uint256 _win = (_pot.mul(48)) / 100;
        // 社区基金获取2%
        uint256 _com = (_pot / 50);
        // 这轮游戏玩家获取的奖金
        uint256 _gen = (_pot.mul(potSplit_[_winTID].gen)) / 100;
        // NT基金获取的奖金
        uint256 _nt = (_pot.mul(potSplit_[_winTID].nt)) / 100;
        // 剩下的奖金
        uint256 _res = (((_pot.sub(_win)).sub(_com)).sub(_gen)).sub(_nt);
        // calculate ppt for round mask
        uint256 _ppt = (_gen.mul(1000000000000000000)) / (round_[_rID].keys);
        uint256 _dust = _gen.sub((_ppt.mul(round_[_rID].keys)) / 1000000000000000000);
        if (_dust > 0){
            _gen = _gen.sub(_dust);
            _res = _res.add(_dust);
        }

        plyr_[_winPID].win = _win.add(plyr_[_winPID].win);
        if(address(communityAddr_)!=address(0x0)) {
            // 将社区基金奖金发到社区奖金地址
            communityAddr_.transfer(_com);
            _com = 0 ;
        }else{
            // 如果没有设置社区地址,那么资金分给下一轮
            _res = SafeMath.add(_res,_com);
            _com = 0 ;
        }
        if(_nt > 0) {
            if(address(NTFoundationAddr_) != address(0x0)) {
                // 分配NT基金奖金
                NTFoundationAddr_.transfer(_nt);
            }else{
                // 如果没有设定,那么资金计入下一轮
                _res = SafeMath.add(_res,_nt);    
                _nt = 0 ; 
            }
        }

        round_[_rID].mask = _ppt.add(round_[_rID].mask);

        _eventData_.compressedData = _eventData_.compressedData + (round_[_rID].end * 1000000);
        _eventData_.compressedIDs = _eventData_.compressedIDs + (_winPID * 100000000000000000000000000) + (_winTID * 100000000000000000);
        _eventData_.winnerAddr = plyr_[_winPID].addr;
        _eventData_.winnerName = plyr_[_winPID].name;
        _eventData_.amountWon = _win;
        _eventData_.genAmount = _gen;
        _eventData_.NTAmount = 0;
        _eventData_.newPot = _res;
        // 下一轮
        rID_++;
        _rID++;
        round_[_rID].strt = now;
        round_[_rID].end = now.add(rndMax_);
        //round_[_rID].end = now.add(rndInit_).add(rndGap_);
        // Fixed by Huwei
        //round_[_rID].pot = _res;
        round_[_rID].prevres = _res;

        return(_eventData_);
    }

    function updateGenVault(uint256 _pID, uint256 _rIDlast) private {
        uint256 _earnings = calcUnMaskedEarnings(_pID, _rIDlast);
        if (_earnings > 0){
            plyr_[_pID].gen = _earnings.add(plyr_[_pID].gen);

            plyrRnds_[_pID][_rIDlast].mask = _earnings.add(plyrRnds_[_pID][_rIDlast].mask);

        }
    }

    function updateTimer(uint256 _keys, uint256 _rID) private {
        uint256 _now = now;

        uint256 _newTime;

        if (_now > round_[_rID].end && round_[_rID].plyr == 0)
            _newTime = (((_keys) / (1000000000000000000)).mul(rndInc_)).add(_now);
        else
            _newTime = (((_keys) / (1000000000000000000)).mul(rndInc_)).add(round_[_rID].end);

        if (_newTime < (rndMax_).add(_now))
            round_[_rID].end = _newTime;
        else
            round_[_rID].end = rndMax_.add(_now);
    }
    /**
     计算空投小奖池
     */
    function airdrop() private  view  returns(bool) {
        uint256 seed = uint256(keccak256(abi.encodePacked(
            (block.timestamp).add
            (block.difficulty).add
            ((uint256(keccak256(abi.encodePacked(block.coinbase)))) / (now)).add
            (block.gaslimit).add
            ((uint256(keccak256(abi.encodePacked(msg.sender)))) / (now)).add
            (block.number)
            
        )));
        if((seed - ((seed / 1000) * 1000)) < airDropTracker_)
            return(true);
        else
            return(false);
    }
    /**
     社区基金
     奖池互换
     分享
     空投
     */ 
    function distributeExternal(uint256 _rID, uint256 _pID, uint256 _eth, uint256 _affID, uint256 _team, NTech3DDatasets.EventReturns memory _eventData_) 
        private returns(NTech3DDatasets.EventReturns){
        // 社区基金2%, 如果没有设置社区基金,则这份空投到用户地址
        uint256 _com = _eth / 50;
        // 奖池互换,如果没有设置,进入到社区基金
        uint256 _long = _eth / 100;
        if(address(otherNTech3D_)!=address(0x0)){
            otherNTech3D_.potSwap.value(_long)();
        }else{
            _com = _com.add(_long);
        }
        // 分享,如果没有分享,进入到社区基金
        uint256 _aff = _eth / 10;
        if (_affID != _pID && plyr_[_affID].name != '') {
            plyr_[_affID].aff = _aff.add(plyr_[_affID].aff);
            emit onAffiliatePayout(
                _affID, 
                plyr_[_affID].addr, 
                plyr_[_affID].name, 
                _rID, 
                _pID, 
                _aff, 
                now
            );
        } else {
            _com = _com.add(_aff);
        }
        // 空投(如果没有设置社区基金地址,那么放入空投)
        uint256 _nt = (_eth.mul(fees_[_team].nt)).div(100);
        if(_com>0){
            if(address(communityAddr_)!=address(0x0)) {
                communityAddr_.transfer(_com);
            }else{
                _nt = _nt.add(_com);      
            }
        }
        if(_nt > 0 ){
            // amount = _nt * ntOf1Ether_ ;
            uint256 amount = _nt.mul(ntOf1Ether_);
            _eventData_.NTAmount = amount.add(_eventData_.NTAmount);
            NTToken_.transfer(msg.sender,amount);
            //
            address(NTTokenSeller_).transfer(_nt);
        }

        return (_eventData_) ; 

    }
    /**
     奖池互换
     */
    function potSwap() external payable {
        // 奖池互换放入下一轮
        uint256 _rID = rID_ + 1;
        // Fixed by Huwei
        //round_[_rID].pot = round_[_rID].pot.add(msg.value);
        round_[_rID].prevres = round_[_rID].prevres.add(msg.value);
        emit onPotSwapDeposit(
            _rID, 
            msg.value
        );
    }
    /** 
     持有者
     空投小奖池
     终极奖池
     */ 
    function distributeInternal(uint256 _rID, uint256 _pID, uint256 _eth, uint256 _team, uint256 _keys, NTech3DDatasets.EventReturns memory _eventData_)
        private returns(NTech3DDatasets.EventReturns) {
        // 持有者的份额 
        uint256 _gen = (_eth.mul(fees_[_team].gen)) / 100;    
        // 空投小奖池 1%
        uint256 _air = (_eth / 100);
        airDropPot_ = airDropPot_.add(_air);
        // 14% = 2% 社区 + 10% 佣金 + 1% 奖池互换 + 1% 空投小奖池
        _eth = _eth.sub(((_eth.mul(14)) / 100).add((_eth.mul(fees_[_team].nt)) / 100));
        // 奖池
        uint256 _pot = _eth.sub(_gen);

        uint256 _dust = updateMasks(_rID, _pID, _gen, _keys);
        if (_dust > 0)
            _gen = _gen.sub(_dust);
        
        round_[_rID].pot = _pot.add(_dust).add(round_[_rID].pot);

        _eventData_.genAmount = _gen.add(_eventData_.genAmount);
        _eventData_.potAmount = _pot;

        return(_eventData_);
    }
    
    function updateMasks(uint256 _rID, uint256 _pID, uint256 _gen, uint256 _keys) private returns(uint256) {
        uint256 _ppt = (_gen.mul(1000000000000000000)) / (round_[_rID].keys);
        round_[_rID].mask = _ppt.add(round_[_rID].mask);
        uint256 _pearn = (_ppt.mul(_keys)) / (1000000000000000000);
        plyrRnds_[_pID][_rID].mask = (((round_[_rID].mask.mul(_keys)) / (1000000000000000000)).sub(_pearn)).add(plyrRnds_[_pID][_rID].mask);
        return(_gen.sub((_ppt.mul(round_[_rID].keys)) / (1000000000000000000)));
    }
    /**
     撤退时的收益
     */
    function withdrawEarnings(uint256 _pID) private returns(uint256) {
        updateGenVault(_pID, plyr_[_pID].lrnd);
        uint256 _earnings = (plyr_[_pID].win).add(plyr_[_pID].gen).add(plyr_[_pID].aff);
        if (_earnings > 0){
            plyr_[_pID].win = 0;
            plyr_[_pID].gen = 0;
            plyr_[_pID].aff = 0;
        }
        return(_earnings);
    }
    /**
     完成交易
     */
    function endTx(uint256 _pID, uint256 _team, uint256 _eth, uint256 _keys, NTech3DDatasets.EventReturns memory _eventData_) private {
        _eventData_.compressedData = _eventData_.compressedData + (now * 1000000000000000000) + (_team * 100000000000000000000000000000);
        _eventData_.compressedIDs = _eventData_.compressedIDs + _pID + (rID_ * 10000000000000000000000000000000000000000000000000000);

        emit onEndTx(
            _eventData_.compressedData,
            _eventData_.compressedIDs,
            plyr_[_pID].name,
            msg.sender,
            _eth,
            _keys,
            _eventData_.winnerAddr,
            _eventData_.winnerName,
            _eventData_.amountWon,
            _eventData_.newPot,
            _eventData_.NTAmount,
            _eventData_.genAmount,
            _eventData_.potAmount,
            airDropPot_
        );
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"getBuyPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_affCode","type":"bytes32"},{"name":"_team","type":"uint256"},{"name":"_eth","type":"uint256"}],"name":"reLoadXname","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"activate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"pIDxAddr_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"airDropTracker_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_otherNTech3D","type":"address"}],"name":"setOtherNTech3D","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"round_","outputs":[{"name":"plyr","type":"uint256"},{"name":"team","type":"uint256"},{"name":"end","type":"uint256"},{"name":"ended","type":"bool"},{"name":"strt","type":"uint256"},{"name":"keys","type":"uint256"},{"name":"eth","type":"uint256"},{"name":"pot","type":"uint256"},{"name":"mask","type":"uint256"},{"name":"ico","type":"uint256"},{"name":"icoGen","type":"uint256"},{"name":"icoAvg","type":"uint256"},{"name":"prevres","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"},{"name":"","type":"bytes32"}],"name":"plyrNames_","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"fees_","outputs":[{"name":"gen","type":"uint256"},{"name":"nt","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"pIDxName_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_affCode","type":"uint256"},{"name":"_team","type":"uint256"},{"name":"_eth","type":"uint256"}],"name":"reLoadXid","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_nameString","type":"string"},{"name":"_affCode","type":"address"},{"name":"_all","type":"bool"}],"name":"registerNameXaddr","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"communityAddr_","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_pID","type":"uint256"},{"name":"_addr","type":"address"},{"name":"_name","type":"bytes32"},{"name":"_laff","type":"uint256"}],"name":"receivePlayerInfo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"name":"rndTmEth_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rID_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_pID","type":"uint256"}],"name":"getPlayerVaults","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"NTFoundationAddr_","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_nameString","type":"string"},{"name":"_affCode","type":"bytes32"},{"name":"_all","type":"bool"}],"name":"registerNameXname","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentRoundInfo","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"address"},{"name":"","type":"bytes32"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_affCode","type":"address"},{"name":"_team","type":"uint256"},{"name":"_eth","type":"uint256"}],"name":"reLoadXaddr","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_affCode","type":"uint256"},{"name":"_team","type":"uint256"}],"name":"buyXid","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_pID","type":"uint256"},{"name":"_name","type":"bytes32"}],"name":"receivePlayerNameList","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_nameString","type":"string"},{"name":"_affCode","type":"uint256"},{"name":"_all","type":"bool"}],"name":"registerNameXID","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_affCode","type":"address"},{"name":"_team","type":"uint256"}],"name":"buyXaddr","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"setNTToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"name":"plyrRnds_","outputs":[{"name":"eth","type":"uint256"},{"name":"keys","type":"uint256"},{"name":"mask","type":"uint256"},{"name":"ico","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_affCode","type":"bytes32"},{"name":"_team","type":"uint256"}],"name":"buyXname","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"toAddr","type":"address"},{"name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"potSplit_","outputs":[{"name":"gen","type":"uint256"},{"name":"nt","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTimeLeft","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_rID","type":"uint256"},{"name":"_eth","type":"uint256"}],"name":"calcKeysReceived","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_keys","type":"uint256"}],"name":"iWantXKeys","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"activated_","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"airDropPot_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"plyr_","outputs":[{"name":"addr","type":"address"},{"name":"name","type":"bytes32"},{"name":"win","type":"uint256"},{"name":"gen","type":"uint256"},{"name":"aff","type":"uint256"},{"name":"lrnd","type":"uint256"},{"name":"laff","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"potSwap","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"getPlayerInfoByAddress","outputs":[{"name":"","type":"uint256"},{"name":"","type":"bytes32"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"playerID","type":"uint256"},{"indexed":true,"name":"playerAddress","type":"address"},{"indexed":true,"name":"playerName","type":"bytes32"},{"indexed":false,"name":"isNewPlayer","type":"bool"},{"indexed":false,"name":"affiliateID","type":"uint256"},{"indexed":false,"name":"affiliateAddress","type":"address"},{"indexed":false,"name":"affiliateName","type":"bytes32"},{"indexed":false,"name":"amountPaid","type":"uint256"},{"indexed":false,"name":"timeStamp","type":"uint256"}],"name":"onNewName","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"compressedData","type":"uint256"},{"indexed":false,"name":"compressedIDs","type":"uint256"},{"indexed":false,"name":"playerName","type":"bytes32"},{"indexed":false,"name":"playerAddress","type":"address"},{"indexed":false,"name":"ethIn","type":"uint256"},{"indexed":false,"name":"keysBought","type":"uint256"},{"indexed":false,"name":"winnerAddr","type":"address"},{"indexed":false,"name":"winnerName","type":"bytes32"},{"indexed":false,"name":"amountWon","type":"uint256"},{"indexed":false,"name":"newPot","type":"uint256"},{"indexed":false,"name":"NTAmount","type":"uint256"},{"indexed":false,"name":"genAmount","type":"uint256"},{"indexed":false,"name":"potAmount","type":"uint256"},{"indexed":false,"name":"airDropPot","type":"uint256"}],"name":"onEndTx","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"playerID","type":"uint256"},{"indexed":false,"name":"playerAddress","type":"address"},{"indexed":false,"name":"playerName","type":"bytes32"},{"indexed":false,"name":"ethOut","type":"uint256"},{"indexed":false,"name":"timeStamp","type":"uint256"}],"name":"onWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"playerAddress","type":"address"},{"indexed":false,"name":"playerName","type":"bytes32"},{"indexed":false,"name":"ethOut","type":"uint256"},{"indexed":false,"name":"compressedData","type":"uint256"},{"indexed":false,"name":"compressedIDs","type":"uint256"},{"indexed":false,"name":"winnerAddr","type":"address"},{"indexed":false,"name":"winnerName","type":"bytes32"},{"indexed":false,"name":"amountWon","type":"uint256"},{"indexed":false,"name":"newPot","type":"uint256"},{"indexed":false,"name":"NTAmount","type":"uint256"},{"indexed":false,"name":"genAmount","type":"uint256"}],"name":"onWithdrawAndDistribute","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"playerAddress","type":"address"},{"indexed":false,"name":"playerName","type":"bytes32"},{"indexed":false,"name":"ethIn","type":"uint256"},{"indexed":false,"name":"compressedData","type":"uint256"},{"indexed":false,"name":"compressedIDs","type":"uint256"},{"indexed":false,"name":"winnerAddr","type":"address"},{"indexed":false,"name":"winnerName","type":"bytes32"},{"indexed":false,"name":"amountWon","type":"uint256"},{"indexed":false,"name":"newPot","type":"uint256"},{"indexed":false,"name":"NTAmount","type":"uint256"},{"indexed":false,"name":"genAmount","type":"uint256"}],"name":"onBuyAndDistribute","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"playerAddress","type":"address"},{"indexed":false,"name":"playerName","type":"bytes32"},{"indexed":false,"name":"compressedData","type":"uint256"},{"indexed":false,"name":"compressedIDs","type":"uint256"},{"indexed":false,"name":"winnerAddr","type":"address"},{"indexed":false,"name":"winnerName","type":"bytes32"},{"indexed":false,"name":"amountWon","type":"uint256"},{"indexed":false,"name":"newPot","type":"uint256"},{"indexed":false,"name":"NTAmount","type":"uint256"},{"indexed":false,"name":"genAmount","type":"uint256"}],"name":"onReLoadAndDistribute","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"affiliateID","type":"uint256"},{"indexed":false,"name":"affiliateAddress","type":"address"},{"indexed":false,"name":"affiliateName","type":"bytes32"},{"indexed":true,"name":"roundID","type":"uint256"},{"indexed":true,"name":"buyerID","type":"uint256"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"timeStamp","type":"uint256"}],"name":"onAffiliatePayout","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"roundID","type":"uint256"},{"indexed":false,"name":"amountAddedToPot","type":"uint256"}],"name":"onPotSwapDeposit","type":"event"}]

60806040526004805460a060020a60ff02191690556175306005556000600e553480156200002c57600080fd5b50604080518082018252601e808252600660208084019182526000808052601180835294517f4ad3b33220dddc71b994a52d72c06b10862965f7d926534c05c00fb7e819e7b75591517f4ad3b33220dddc71b994a52d72c06b10862965f7d926534c05c00fb7e819e7b85584518086018652602b808252818301848152600180865287855292517f17bc176d2408558f6e4111feebc3cab4e16b63e967be91cde721f4c8a488b55255517f17bc176d2408558f6e4111feebc3cab4e16b63e967be91cde721f4c8a488b553558651808801885260388152600a818501818152600280885289875292517f08037d7b151cc412d25674a4e66b334d9ae9d2e5517a7feaae5cdb828bf1c62855517f08037d7b151cc412d25674a4e66b334d9ae9d2e5517a7feaae5cdb828bf1c629558851808a018a529283526008838601908152600380885298865292517f9bfbaa59f8e10e7868f8b402de9d605a390c45ddaebd8c9de3c6f31e733c87ff5591517f9bfbaa59f8e10e7868f8b402de9d605a390c45ddaebd8c9de3c6f31e733c88005587518089018952600f8152808501838152868052601280875291517f7e7fa33969761a458e04f477e039a608702b4f924981d6653935a8319a08ad7b55517f7e7fa33969761a458e04f477e039a608702b4f924981d6653935a8319a08ad7c558851808a018a5260198152808601878152948752818652517f71a67924699a20698523213e55fe499d539379d7769cd5567e2c45d583f815a35592517f71a67924699a20698523213e55fe499d539379d7769cd5567e2c45d583f815a455875180890189526014808252818601908152918652838552517f8e1fee8c88a9e04123b21e90cae2727a7715bf522a1e46eb5934ccd05203a6b255517f8e1fee8c88a9e04123b21e90cae2727a7715bf522a1e46eb5934ccd05203a6b3558651808801909752938652858201938452939091529190915290517f0f36ad39aee03e7108cc48f54934702a5f0d4066f10344cebf8198978d86976a55517f0f36ad39aee03e7108cc48f54934702a5f0d4066f10344cebf8198978d86976b556200034b640100000000620003d5810204565b60048054600160a060020a03199081167309341b5d43a9b2362141675b9276b777470222be17909155600180548216733c07f9f7164bf72fdbefd9438658facd94ed443917905560038054821673531100a6b3686e6140f170b0920962a5d7a2dd25179055600280549091167389b2e7ee504afd522e07f80ae7b9d4d228af3fe21790556200040d565b6000602081905260097ff25715a569b1a79ae52abfbdc79bc4bfb1801cbc0f53c65f2e725338f898a573819055338252604090912055565b615800806200041d6000396000f3006080604052600436106101f85763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663018a25e881146101fd57806306fdde0314610224578063079ce327146102ae5780630f15f4c0146102ce57806310f01eba146102e357806311a09ae7146103045780631bf678cf1461031957806324c33d331461033a5780632660316e146103b75780632ce21999146103e65780632e19ebdc14610417578063349cdcac1461042f5780633ccfd60b1461044d5780633ddd4698146104625780633f03aab4146104be57806349cc635d146104ef5780635893d48114610519578063624ae5c014610534578063630664341461054957806363c194f11461057f578063685ffd8314610594578063747dff42146105e757806382bfc739146106725780638f38f309146106995780638f7140ea146106a7578063921dec21146106c257806395d89b411461071557806398a0871d1461072a5780639ae5dc9114610741578063a2bccae914610762578063a65b37a1146107a3578063a9059cbb146107b1578063c519500e146107d5578063c7e284b8146107ed578063ce89c80c14610802578063cf8080001461081d578063d53b267914610835578063d87574e01461084a578063de7874f31461085f578063ed78cf4a146108b9578063ee0b5d8b146108c1575b600080fd5b34801561020957600080fd5b5061021261091a565b60408051918252519081900360200190f35b34801561023057600080fd5b506102396109db565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561027357818101518382015260200161025b565b50505050905090810190601f1680156102a05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102ba57600080fd5b506102cc600435602435604435610a12565b005b3480156102da57600080fd5b506102cc610c04565b3480156102ef57600080fd5b50610212600160a060020a0360043516610ec5565b34801561031057600080fd5b50610212610ed7565b34801561032557600080fd5b506102cc600160a060020a0360043516610edd565b34801561034657600080fd5b50610352600435611024565b604080519d8e5260208e019c909c528c8c019a909a5297151560608c015260808b019690965260a08a019490945260c089019290925260e088015261010087015261012086015261014085015261016084015261018083015251908190036101a00190f35b3480156103c357600080fd5b506103d260043560243561108f565b604080519115158252519081900360200190f35b3480156103f257600080fd5b506103fe6004356110af565b6040805192835260208301919091528051918290030190f35b34801561042357600080fd5b506102126004356110c8565b34801561043b57600080fd5b506102cc6004356024356044356110da565b34801561045957600080fd5b506102cc6112a6565b6040805160206004803580820135601f81018490048402850184019095528484526102cc94369492936024939284019190819084018382808284375094975050600160a060020a0385351695505050505060200135151561161a565b3480156104ca57600080fd5b506104d36117d3565b60408051600160a060020a039092168252519081900360200190f35b3480156104fb57600080fd5b506102cc600435600160a060020a03602435166044356064356117e2565b34801561052557600080fd5b506102126004356024356119ad565b34801561054057600080fd5b506102126119ca565b34801561055557600080fd5b506105616004356119d0565b60408051938452602084019290925282820152519081900360600190f35b34801561058b57600080fd5b506104d3611b8f565b6040805160206004803580820135601f81018490048402850184019095528484526102cc943694929360249392840191908190840183828082843750949750508435955050505050602001351515611b9e565b3480156105f357600080fd5b506105fc611c7e565b604080519e8f5260208f019d909d528d8d019b909b5260608d019990995260808c019790975260a08b019590955260c08a0193909352600160a060020a0390911660e08901526101008801526101208701526101408601526101608501526101808401526101a083015251908190036101c00190f35b34801561067e57600080fd5b506102cc600160a060020a0360043516602435604435611e7c565b6102cc60043560243561205e565b3480156106b357600080fd5b506102cc60043560243561222b565b6040805160206004803580820135601f81018490048402850184019095528484526102cc9436949293602493928401919081908401838280828437509497505084359550505050506020013515156122e2565b34801561072157600080fd5b506102396123c2565b6102cc600160a060020a03600435166024356123f9565b34801561074d57600080fd5b506102cc600160a060020a03600435166125f6565b34801561076e57600080fd5b5061077d6004356024356126dc565b604080519485526020850193909352838301919091526060830152519081900360800190f35b6102cc60043560243561270e565b3480156107bd57600080fd5b506103d2600160a060020a03600435166024356128f1565b3480156107e157600080fd5b506103fe600435612a4a565b3480156107f957600080fd5b50610212612a63565b34801561080e57600080fd5b50610212600435602435612aea565b34801561082957600080fd5b50610212600435612b85565b34801561084157600080fd5b506103d2612c33565b34801561085657600080fd5b50610212612c43565b34801561086b57600080fd5b50610877600435612c49565b60408051600160a060020a0390981688526020880196909652868601949094526060860192909252608085015260a084015260c0830152519081900360e00190f35b6102cc612c90565b3480156108cd57600080fd5b506108e2600160a060020a0360043516612d0e565b604080519788526020880196909652868601949094526060860192909252608085015260a084015260c0830152519081900360e00190f35b600c546000818152600f602052604081206004015490919042908111801561098457506000828152600f60205260409020600201548111158061098457506000828152600f60205260409020600201548111801561098457506000828152600f6020526040902054155b156109cc576000828152600f60205260409020600501546109c590670de0b6b3a7640000906109b9908263ffffffff612de316565b9063ffffffff612e4416565b92506109d6565b6544364c5bb00092505b505090565b60408051808201909152601681527f4e54656368203344204c6f6e67204f6666696369616c00000000000000000000602082015281565b610a1a6156db565b600454600090819060a060020a900460ff161515600114610a73576040805160e560020a62461bcd0281526020600482015260136024820152600080516020615755833981519152604482015290519081900360640190fd5b33803b8015610aba576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615735833981519152604482015290519081900360640190fd5b85633b9aca00811015610b05576040805160e560020a62461bcd02815260206004820152600a6024820152600080516020615795833981519152604482015290519081900360640190fd5b69152d02c7e14af6800000811115610b55576040805160e560020a62461bcd02815260206004820152600860248201526000805160206157b5833981519152604482015290519081900360640190fd5b336000908152600760205260409020549450881580610b84575060008581526009602052604090206001015489145b15610ba2576000858152600960205260409020600601549350610be1565b6000898152600860209081526040808320548884526009909252909120600601549094508414610be15760008581526009602052604090206006018490555b610bea88612e71565b9750610bf985858a8a8a612e96565b505050505050505050565b3360009081526020819052604090205460098114610c5a576040805160e560020a62461bcd02815260206004820152600e6024820152600080516020615775833981519152604482015290519081900360640190fd5b600454600160a060020a03161515610cbc576040805160e560020a62461bcd02815260206004820152601360248201527f4d757374207365747570204e54546f6b656e2e00000000000000000000000000604482015290519081900360640190fd5b600154600160a060020a03161515610d1e576040805160e560020a62461bcd02815260206004820152601a60248201527f4d75737420736574757020436f6d6d756e697479416464725f2e000000000000604482015290519081900360640190fd5b600354600160a060020a03161515610d80576040805160e560020a62461bcd02815260206004820152601960248201527f4d757374207365747570204e54546f6b656e53656c6c65722e00000000000000604482015290519081900360640190fd5b600254600160a060020a03161515610de2576040805160e560020a62461bcd02815260206004820152601c60248201527f4d757374207365747570204e54466f756e646174696f6e416464722e00000000604482015290519081900360640190fd5b60045460a060020a900460ff1615610e44576040805160e560020a62461bcd02815260206004820152600960248201527f4f6e6c79206f6e63650000000000000000000000000000000000000000000000604482015290519081900360640190fd5b506004805474ff0000000000000000000000000000000000000000191660a060020a1790556001600c819055600052600f602052427f169f97de0d9a84d840042b17d3c6b9638b3d6fd9024c9eb0c7a306a17b49f893819055615460017f169f97de0d9a84d840042b17d3c6b9638b3d6fd9024c9eb0c7a306a17b49f89155565b60076020526000908152604090205481565b600e5481565b3360009081526020819052604090205460098114610f33576040805160e560020a62461bcd02815260206004820152600e6024820152600080516020615775833981519152604482015290519081900360640190fd5b600160a060020a0382161515610f93576040805160e560020a62461bcd02815260206004820152601a60248201527f456d7074792061646472657373206e6f7420616c6c6f7765642e000000000000604482015290519081900360640190fd5b600654600160a060020a031615610ff4576040805160e560020a62461bcd02815260206004820152601a60248201527f4f746865724e54656368334420686173206265656e207365742e000000000000604482015290519081900360640190fd5b506006805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600f60205260009081526040902080546001820154600283015460038401546004850154600586015460068701546007880154600889015460098a0154600a8b0154600b8c0154600c909c01549a9b999a989960ff909816989697959694959394929391929091908d565b600b60209081526000928352604080842090915290825290205460ff1681565b6011602052600090815260409020805460019091015482565b60086020526000908152604090205481565b6110e26156db565b60045460009060a060020a900460ff161515600114611139576040805160e560020a62461bcd0281526020600482015260136024820152600080516020615755833981519152604482015290519081900360640190fd5b33803b8015611180576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615735833981519152604482015290519081900360640190fd5b84633b9aca008110156111cb576040805160e560020a62461bcd02815260206004820152600a6024820152600080516020615795833981519152604482015290519081900360640190fd5b69152d02c7e14af680000081111561121b576040805160e560020a62461bcd02815260206004820152600860248201526000805160206157b5833981519152604482015290519081900360640190fd5b33600090815260076020526040902054935087158061123957508388145b15611257576000848152600960205260409020600601549750611284565b60008481526009602052604090206006015488146112845760008481526009602052604090206006018890555b61128d87612e71565b965061129c8489898989612e96565b5050505050505050565b6000806000806112b46156db565b60045460a060020a900460ff161515600114611308576040805160e560020a62461bcd0281526020600482015260136024820152600080516020615755833981519152604482015290519081900360640190fd5b33803b801561134f576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615735833981519152604482015290519081900360640190fd5b600c5433600090815260076020908152604080832054848452600f9092529091206002015491985042975095508611801561139c57506000878152600f602052604090206003015460ff16155b80156113b557506000878152600f602052604090205415155b1561155b576000878152600f60205260409020600301805460ff191660011790556113df836130ae565b92506113ea856134ff565b9350600084111561143b57600085815260096020526040808220549051600160a060020a039091169186156108fc02918791818181858888f19350505050158015611439573d6000803e3d6000fd5b505b85670de0b6b3a764000002836000015101836000018181525050848360200151018360200181815250507f0bd0dba8ab932212fa78150cdb7b0275da72e255875967b5cad11464cf71bedc3360096000888152602001908152602001600020600101548686600001518760200151886040015189606001518a608001518b60a001518c60c001518d60e00151604051808c600160a060020a0316600160a060020a031681526020018b600019166000191681526020018a815260200189815260200188815260200187600160a060020a0316600160a060020a0316815260200186600019166000191681526020018581526020018481526020018381526020018281526020019b50505050505050505050505060405180910390a1611611565b611564856134ff565b935060008411156115b557600085815260096020526040808220549051600160a060020a039091169186156108fc02918791818181858888f193505050501580156115b3573d6000803e3d6000fd5b505b6000858152600960209081526040918290206001015482513381529182015280820186905260608101889052905186917f8f36579a548bc439baa172a6521207464154da77f411e2da3db2f53affe6cc3a919081900360800190a25b50505050505050565b6000808080808033803b8015611668576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615735833981519152604482015290519081900360640190fd5b6116718b613592565b604080517faa4d490b000000000000000000000000000000000000000000000000000000008152336004820181905260248201849052600160a060020a038e1660448301528c151560648301528251939b50995034985073410526cd583af0be0530166d53efcd7da969f7b79263aa4d490b928a926084808201939182900301818588803b15801561170257600080fd5b505af1158015611716573d6000803e3d6000fd5b50505050506040513d604081101561172d57600080fd5b508051602091820151600160a060020a03808b1660008181526007865260408082205485835260098852918190208054600190910154825188151581529889018790529416878201526060870193909352608086018c90524260a0870152915193995091975095508a92909186917fdd6176433ff5026bbce96b068584b7bbe3514227e72df9c630b749ae87e64442919081900360c00190a45050505050505050505050565b600154600160a060020a031681565b3373410526cd583af0be0530166d53efcd7da969f7b71461184d576040805160e560020a62461bcd02815260206004820152601b60248201527f43616c6c65642066726f6d20506c61796572426f6f6b206f6e6c790000000000604482015290519081900360640190fd5b600160a060020a038316600090815260076020526040902054841461188857600160a060020a03831660009081526007602052604090208490555b60008281526008602052604090205484146118af5760008281526008602052604090208490555b600084815260096020526040902054600160a060020a03848116911614611905576000848152600960205260409020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0385161790555b60008481526009602052604090206001015482146119325760008481526009602052604090206001018290555b600084815260096020526040902060060154811461195f5760008481526009602052604090206006018190555b6000848152600b6020908152604080832085845290915290205460ff1615156119a7576000848152600b602090815260408083208584529091529020805460ff191660011790555b50505050565b601060209081526000928352604080842090915290825290205481565b600c5481565b600c546000818152600f602052604081206002015490918291829190829042118015611a0e57506000828152600f602052604090206003015460ff16155b8015611a2757506000828152600f602052604090205415155b15611b5e576000828152600f6020526040902054861415611b22576000828152600f60205260409020600c810154600790910154611a6a9163ffffffff612de316565b9050611aab6064611a8283603063ffffffff613da516565b811515611a8b57fe5b60008981526009602052604090206002015491900463ffffffff612de316565b6000878152600a60209081526040808320868452909152902060020154611b0490611ae690611ada8a87613e1c565b9063ffffffff613f0b16565b6000898152600960205260409020600301549063ffffffff612de316565b60008881526009602052604090206004015491965094509250611b86565b6000868152600960209081526040808320600290810154600a8452828520878652909352922090910154611b0490611ae690611ada8a87613e1c565b60008681526009602052604090206002810154600590910154611b0490611ae6908990613f6b565b50509193909250565b600254600160a060020a031681565b6000808080808033803b8015611bec576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615735833981519152604482015290519081900360640190fd5b611bf58b613592565b604080517f745ea0c1000000000000000000000000000000000000000000000000000000008152336004820181905260248201849052604482018e90528c151560648301528251939b50995034985073410526cd583af0be0530166d53efcd7da969f7b79263745ea0c1928a926084808201939182900301818588803b15801561170257600080fd5b6000806000806000806000806000806000806000806000600c549050600f60008281526020019081526020016000206009015481600f600084815260200190815260200160002060050154600f600085815260200190815260200160002060020154600f600086815260200190815260200160002060040154600f600087815260200190815260200160002060070154600f600088815260200190815260200160002060000154600a02600f6000898152602001908152602001600020600101540160096000600f60008b815260200190815260200160002060000154815260200190815260200160002060000160009054906101000a9004600160a060020a031660096000600f60008c815260200190815260200160002060000154815260200190815260200160002060010154601060008b8152602001908152602001600020600080815260200190815260200160002054601060008c815260200190815260200160002060006001815260200190815260200160002054601060008d815260200190815260200160002060006002815260200190815260200160002054601060008e815260200190815260200160002060006003815260200190815260200160002054600d546103e802600e54019e509e509e509e509e509e509e509e509e509e509e509e509e509e5050909192939495969798999a9b9c9d565b611e846156db565b600454600090819060a060020a900460ff161515600114611edd576040805160e560020a62461bcd0281526020600482015260136024820152600080516020615755833981519152604482015290519081900360640190fd5b33803b8015611f24576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615735833981519152604482015290519081900360640190fd5b85633b9aca00811015611f6f576040805160e560020a62461bcd02815260206004820152600a6024820152600080516020615795833981519152604482015290519081900360640190fd5b69152d02c7e14af6800000811115611fbf576040805160e560020a62461bcd02815260206004820152600860248201526000805160206157b5833981519152604482015290519081900360640190fd5b336000908152600760205260409020549450600160a060020a0389161580611fef5750600160a060020a03891633145b1561200d576000858152600960205260409020600601549350610be1565b600160a060020a0389166000908152600760209081526040808320548884526009909252909120600601549094508414610be1576000858152600960205260409020600601849055610bea88612e71565b6120666156db565b60045460009060a060020a900460ff1615156001146120bd576040805160e560020a62461bcd0281526020600482015260136024820152600080516020615755833981519152604482015290519081900360640190fd5b33803b8015612104576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615735833981519152604482015290519081900360640190fd5b34633b9aca0081101561214f576040805160e560020a62461bcd02815260206004820152600a6024820152600080516020615795833981519152604482015290519081900360640190fd5b69152d02c7e14af680000081111561219f576040805160e560020a62461bcd02815260206004820152600860248201526000805160206157b5833981519152604482015290519081900360640190fd5b6121a885613fc8565b3360009081526007602052604090205490955093508615806121c957508387145b156121e7576000848152600960205260409020600601549650612214565b60008481526009602052604090206006015487146122145760008481526009602052604090206006018790555b61221d86612e71565b95506116118488888861427c565b3373410526cd583af0be0530166d53efcd7da969f7b714612296576040805160e560020a62461bcd02815260206004820152601b60248201527f43616c6c65642066726f6d20506c61796572426f6f6b206f6e6c790000000000604482015290519081900360640190fd5b6000828152600b6020908152604080832084845290915290205460ff1615156122de576000828152600b602090815260408083208484529091529020805460ff191660011790555b5050565b6000808080808033803b8015612330576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615735833981519152604482015290519081900360640190fd5b6123398b613592565b604080517fc0942dfd000000000000000000000000000000000000000000000000000000008152336004820181905260248201849052604482018e90528c151560648301528251939b50995034985073410526cd583af0be0530166d53efcd7da969f7b79263c0942dfd928a926084808201939182900301818588803b15801561170257600080fd5b60408051808201909152600481527f4e54334400000000000000000000000000000000000000000000000000000000602082015281565b6124016156db565b600454600090819060a060020a900460ff16151560011461245a576040805160e560020a62461bcd0281526020600482015260136024820152600080516020615755833981519152604482015290519081900360640190fd5b33803b80156124a1576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615735833981519152604482015290519081900360640190fd5b34633b9aca008110156124ec576040805160e560020a62461bcd02815260206004820152600a6024820152600080516020615795833981519152604482015290519081900360640190fd5b69152d02c7e14af680000081111561253c576040805160e560020a62461bcd02815260206004820152600860248201526000805160206157b5833981519152604482015290519081900360640190fd5b61254586613fc8565b336000908152600760205260409020549096509450600160a060020a03881615806125785750600160a060020a03881633145b156125965760008581526009602052604090206006015493506125df565b600160a060020a03881660009081526007602090815260408083205488845260099092529091206006015490945084146125df5760008581526009602052604090206006018490555b6125e887612e71565b965061129c8585898961427c565b336000908152602081905260409020546009811461264c576040805160e560020a62461bcd02815260206004820152600e6024820152600080516020615775833981519152604482015290519081900360640190fd5b600160a060020a03821615156126ac576040805160e560020a62461bcd02815260206004820152601a60248201527f456d7074792061646472657373206e6f7420616c6c6f7765642e000000000000604482015290519081900360640190fd5b506004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600a60209081526000928352604080842090915290825290208054600182015460028301546003909301549192909184565b6127166156db565b600454600090819060a060020a900460ff16151560011461276f576040805160e560020a62461bcd0281526020600482015260136024820152600080516020615755833981519152604482015290519081900360640190fd5b33803b80156127b6576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615735833981519152604482015290519081900360640190fd5b34633b9aca00811015612801576040805160e560020a62461bcd02815260206004820152600a6024820152600080516020615795833981519152604482015290519081900360640190fd5b69152d02c7e14af6800000811115612851576040805160e560020a62461bcd02815260206004820152600860248201526000805160206157b5833981519152604482015290519081900360640190fd5b61285a86613fc8565b33600090815260076020526040902054909650945087158061288c575060008581526009602052604090206001015488145b156128aa5760008581526009602052604090206006015493506125df565b60008881526008602090815260408083205488845260099092529091206006015490945084146125df5760008581526009602052604090206006018490556125e887612e71565b3360009081526020819052604081205460098114612947576040805160e560020a62461bcd02815260206004820152600e6024820152600080516020615775833981519152604482015290519081900360640190fd5b6000831161299f576040805160e560020a62461bcd02815260206004820152600960248201527f4d757374203e2030200000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60048054604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a0388811694820194909452602481018790529051929091169163a9059cbb916044808201926020929091908290030181600087803b158015612a1257600080fd5b505af1158015612a26573d6000803e3d6000fd5b505050506040513d6020811015612a3c57600080fd5b5060019250505b5092915050565b6012602052600090815260409020805460019091015482565b600c546000818152600f60205260408120600201549091904290811015612ae1576000828152600f6020526040902060040154811115612abf576000828152600f60205260409020600201546109c5908263ffffffff613f0b16565b6000828152600f60205260409020600201546109c5908263ffffffff613f0b16565b600092506109d6565b6000828152600f6020526040812060040154429081118015612b4e57506000848152600f602052604090206002015481111580612b4e57506000848152600f602052604090206002015481118015612b4e57506000848152600f6020526040902054155b15612b7c576000848152600f6020526040902060060154612b75908463ffffffff6144b216565b9150612a43565b612b75836144d3565b600c546000818152600f6020526040812060040154909190429081118015612bef57506000828152600f602052604090206002015481111580612bef57506000828152600f602052604090206002015481118015612bef57506000828152600f6020526040902054155b15612c23576000828152600f6020526040902060050154612c1c9085906109b9908263ffffffff612de316565b9250612c2c565b612c1c8461454b565b5050919050565b60045460a060020a900460ff1681565b600d5481565b6009602052600090815260409020805460018201546002830154600384015460048501546005860154600690960154600160a060020a039095169593949293919290919087565b600c80546001016000818152600f6020526040902090910154612cb9903463ffffffff612de316565b6000828152600f6020908152604091829020600c01929092558051838152349281019290925280517f74b1d2f771e0eff1b2c36c38499febdbea80fe4013bdace4fc4b653322c2895c9281900390910190a150565b6000806000806000806000806000600c54915050600160a060020a0389166000908152600760209081526040808320548084526009808452828520600180820154600a8752858820898952875294872001549583905293526002830154600590930154909384939091612da490612d86908690613f6b565b6000878152600960205260409020600301549063ffffffff612de316565b600095865260096020908152604080882060040154600a83528189209989529890915290952054939e929d50909b509950919750919550909350915050565b81810182811015612e3e576040805160e560020a62461bcd02815260206004820152601360248201527f536166654d61746820616464206661696c656400000000000000000000000000604482015290519081900360640190fd5b92915050565b6000612e6a612e61612e5c858563ffffffff613f0b16565b61454b565b611ada8561454b565b9392505050565b600080821080612e815750600382115b15612e8e57506002612e91565b50805b919050565b600c546000818152600f6020526040902060040154429081118015612efd57506000828152600f602052604090206002015481111580612efd57506000828152600f602052604090206002015481118015612efd57506000828152600f6020526040902054155b15612f3457612f0f84611ada896134ff565b600088815260096020526040902060030155612f2f8288868989886145b8565b611611565b6000828152600f602052604090206002015481118015612f6657506000828152600f602052604090206003015460ff16155b15611611576000828152600f60205260409020600301805460ff19166001179055612f90836130ae565b925080670de0b6b3a764000002836000015101836000018181525050868360200151018360200181815250507f88261ac70d02d5ea73e54fa6da17043c974de1021109573ec1f6f57111c823dd33600960008a815260200190815260200160002060010154856000015186602001518760400151886060015189608001518a60a001518b60c001518c60e00151604051808b600160a060020a0316600160a060020a031681526020018a6000191660001916815260200189815260200188815260200187600160a060020a0316600160a060020a0316815260200186600019166000191681526020018581526020018481526020018381526020018281526020019a505050505050505050505060405180910390a150505050505050565b6130b66156db565b600c80546000818152600f6020526040812080546001820154948201546007909201549394909390929182918291829182918291829182916130fd9163ffffffff612de316565b9750606461311289603063ffffffff613da516565b81151561311b57fe5b04965060328860008b8152601260205260409020549190049650606490613149908a9063ffffffff613da516565b81151561315257fe5b60008b815260126020526040902060010154919004955060649061317d908a9063ffffffff613da516565b81151561318657fe5b0493506131a184611ada87818a818e8e63ffffffff613f0b16565b60008c8152600f60205260409020600501549093506131ce86670de0b6b3a764000063ffffffff613da516565b8115156131d757fe5b60008d8152600f6020526040902060050154919004925061322590670de0b6b3a76400009061320d90859063ffffffff613da516565b81151561321657fe5b8791900463ffffffff613f0b16565b9050600081111561325557613240858263ffffffff613f0b16565b9450613252838263ffffffff612de316565b92505b60008a81526009602052604090206002015461327890889063ffffffff612de316565b60008b815260096020526040902060020155600154600160a060020a0316156132df57600154604051600160a060020a039091169087156108fc029088906000818181858888f193505050501580156132d5573d6000803e3d6000fd5b50600095506132f0565b6132e98387612de3565b9250600095505b600084111561335b57600254600160a060020a03161561334a57600254604051600160a060020a039091169085156108fc029086906000818181858888f19350505050158015613344573d6000803e3d6000fd5b5061335b565b6133548385612de3565b9250600093505b60008b8152600f602052604090206008015461337e90839063ffffffff612de316565b600f60008d815260200190815260200160002060080181905550600f60008c815260200190815260200160002060020154620f4240028d60000151018d60000181815250508867016345785d8a0000028a6a52b7d2dcc80cd2e4000000028e6020015101018d6020018181525050600960008b815260200190815260200160002060000160009054906101000a9004600160a060020a03168d60400190600160a060020a03169081600160a060020a031681525050600960008b8152602001908152602001600020600101548d606001906000191690816000191681525050868d6080018181525050848d60e001818152505060008d60c0018181525050828d60a0018181525050600c600081548092919060010191905055508a806001019b505042600f60008d8152602001908152602001600020600401819055506134d061546042612de390919063ffffffff16565b60008c8152600f602052604090206002810191909155600c018390558c9b505050505050505050505050919050565b600081815260096020526040812060050154819061351e908490614b09565b60008381526009602052604090206004810154600382015460029092015461355c92613550919063ffffffff612de316565b9063ffffffff612de316565b905060008111156135885760008381526009602052604081206002810182905560038101829055600401555b8091505b50919050565b80516000908290828080602084118015906135ad5750600084115b1515613629576040805160e560020a62461bcd02815260206004820152602a60248201527f737472696e67206d757374206265206265747765656e203120616e642033322060448201527f6368617261637465727300000000000000000000000000000000000000000000606482015290519081900360840190fd5b84600081518110151561363857fe5b90602001015160f860020a900460f860020a02600160f860020a031916602060f860020a021415801561369f5750846001850381518110151561367757fe5b90602001015160f860020a900460f860020a02600160f860020a031916602060f860020a0214155b151561371b576040805160e560020a62461bcd02815260206004820152602560248201527f737472696e672063616e6e6f74207374617274206f7220656e6420776974682060448201527f7370616365000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b84600081518110151561372a57fe5b90602001015160f860020a900460f860020a02600160f860020a031916603060f860020a02141561386d5784600181518110151561376457fe5b90602001015160f860020a900460f860020a02600160f860020a031916607860f860020a02141515156137e1576040805160e560020a62461bcd02815260206004820152601b60248201527f737472696e672063616e6e6f7420737461727420776974682030780000000000604482015290519081900360640190fd5b8460018151811015156137f057fe5b90602001015160f860020a900460f860020a02600160f860020a031916605860f860020a021415151561386d576040805160e560020a62461bcd02815260206004820152601b60248201527f737472696e672063616e6e6f7420737461727420776974682030580000000000604482015290519081900360640190fd5b600091505b83821015613d3d5784517f4000000000000000000000000000000000000000000000000000000000000000908690849081106138aa57fe5b90602001015160f860020a900460f860020a02600160f860020a03191611801561391e575084517f5b00000000000000000000000000000000000000000000000000000000000000908690849081106138ff57fe5b90602001015160f860020a900460f860020a02600160f860020a031916105b1561398b57848281518110151561393157fe5b90602001015160f860020a900460f860020a0260f860020a900460200160f860020a02858381518110151561396257fe5b906020010190600160f860020a031916908160001a90535082151561398657600192505b613d32565b848281518110151561399957fe5b90602001015160f860020a900460f860020a02600160f860020a031916602060f860020a021480613a69575084517f6000000000000000000000000000000000000000000000000000000000000000908690849081106139f557fe5b90602001015160f860020a900460f860020a02600160f860020a031916118015613a69575084517f7b0000000000000000000000000000000000000000000000000000000000000090869084908110613a4a57fe5b90602001015160f860020a900460f860020a02600160f860020a031916105b80613b13575084517f2f0000000000000000000000000000000000000000000000000000000000000090869084908110613a9f57fe5b90602001015160f860020a900460f860020a02600160f860020a031916118015613b13575084517f3a0000000000000000000000000000000000000000000000000000000000000090869084908110613af457fe5b90602001015160f860020a900460f860020a02600160f860020a031916105b1515613b8f576040805160e560020a62461bcd02815260206004820152602260248201527f737472696e6720636f6e7461696e7320696e76616c696420636861726163746560448201527f7273000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b8482815181101515613b9d57fe5b90602001015160f860020a900460f860020a02600160f860020a031916602060f860020a021415613c7c578482600101815181101515613bd957fe5b90602001015160f860020a900460f860020a02600160f860020a031916602060f860020a0214151515613c7c576040805160e560020a62461bcd02815260206004820152602860248201527f737472696e672063616e6e6f7420636f6e7461696e20636f6e7365637574697660448201527f6520737061636573000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b82158015613d28575084517f300000000000000000000000000000000000000000000000000000000000000090869084908110613cb557fe5b90602001015160f860020a900460f860020a02600160f860020a0319161080613d28575084517f390000000000000000000000000000000000000000000000000000000000000090869084908110613d0957fe5b90602001015160f860020a900460f860020a02600160f860020a031916115b15613d3257600192505b600190910190613872565b600183151514613d97576040805160e560020a62461bcd02815260206004820152601d60248201527f737472696e672063616e6e6f74206265206f6e6c79206e756d62657273000000604482015290519081900360640190fd5b505050506020015192915050565b6000821515613db657506000612e3e565b50818102818382811515613dc657fe5b0414612e3e576040805160e560020a62461bcd02815260206004820152601360248201527f536166654d617468206d756c206661696c656400000000000000000000000000604482015290519081900360640190fd5b6000818152600f60205260408120600c8101546007909101548291613e47919063ffffffff612de316565b6000858152600a602090815260408083208784528252808320600190810154600f8452828520600581015492015485526012909352922054929350670de0b6b3a764000092613ef992613eed91613ec4908690606490613eae908a9063ffffffff613da516565b811515613eb757fe5b049063ffffffff613da516565b811515613ecd57fe5b6000898152600f602052604090206008015491900463ffffffff612de316565b9063ffffffff613da516565b811515613f0257fe5b04949350505050565b600082821115613f65576040805160e560020a62461bcd02815260206004820152601360248201527f536166654d61746820737562206661696c656400000000000000000000000000604482015290519081900360640190fd5b50900390565b6000828152600a6020908152604080832084845282528083206002810154600190910154600f90935290832060080154612e6a92670de0b6b3a764000091613fb291613da5565b811515613fbb57fe5b049063ffffffff613f0b16565b613fd06156db565b33600090815260076020526040812054908082151561427357604080517fe56556a9000000000000000000000000000000000000000000000000000000008152336004820152905173410526cd583af0be0530166d53efcd7da969f7b79163e56556a99160248083019260209291908290030181600087803b15801561405557600080fd5b505af1158015614069573d6000803e3d6000fd5b505050506040513d602081101561407f57600080fd5b5051604080517f82e37b2c00000000000000000000000000000000000000000000000000000000815260048101839052905191945073410526cd583af0be0530166d53efcd7da969f7b7916382e37b2c916024808201926020929091908290030181600087803b1580156140f257600080fd5b505af1158015614106573d6000803e3d6000fd5b505050506040513d602081101561411c57600080fd5b5051604080517fe3c08adf00000000000000000000000000000000000000000000000000000000815260048101869052905191935073410526cd583af0be0530166d53efcd7da969f7b79163e3c08adf916024808201926020929091908290030181600087803b15801561418f57600080fd5b505af11580156141a3573d6000803e3d6000fd5b505050506040513d60208110156141b957600080fd5b505133600081815260076020908152604080832088905587835260099091529020805473ffffffffffffffffffffffffffffffffffffffff1916909117905590508115614242576000828152600860209081526040808320869055858352600982528083206001908101869055600b8352818420868552909252909120805460ff191690911790555b80158015906142515750828114155b1561426b5760008381526009602052604090206006018190555b845160010185525b50929392505050565b600c546000818152600f60205260409020600401544290811180156142e357506000828152600f6020526040902060020154811115806142e357506000828152600f6020526040902060020154811180156142e357506000828152600f6020526040902054155b156142fb576142f68287348888886145b8565b6144aa565b6000828152600f60205260409020600201548111801561432d57506000828152600f602052604090206003015460ff16155b15614475576000828152600f60205260409020600301805460ff19166001179055614357836130ae565b925080670de0b6b3a764000002836000015101836000018181525050858360200151018360200181815250507fa7801a70b37e729a11492aad44fd3dba89b4149f0609dc0f6837bf9e57e2671a3360096000898152602001908152602001600020600101543486600001518760200151886040015189606001518a608001518b60a001518c60c001518d60e00151604051808c600160a060020a0316600160a060020a031681526020018b600019166000191681526020018a815260200189815260200188815260200187600160a060020a0316600160a060020a0316815260200186600019166000191681526020018581526020018481526020018381526020018281526020019b50505050505050505050505060405180910390a15b600086815260096020526040902060030154614497903463ffffffff612de316565b6000878152600960205260409020600301555b505050505050565b6000612e6a6144c0846144d3565b611ada6144d3868663ffffffff612de316565b60006309502f9061453b6d03b2a1d15167e7c5699bfde00000611ada6145367a0dac7055469777a6122ee4310dd6c14410500f29048400000000006135506b01027e72f1f1281308800000613eed8a670de0b6b3a764000063ffffffff613da516565b614ba0565b81151561454457fe5b0492915050565b600061455e670de0b6b3a7640000614bf3565b61453b600261459161457e86670de0b6b3a764000063ffffffff613da516565b65886c8f6730709063ffffffff613da516565b81151561459a57fe5b046135506145a786614bf3565b6304a817c89063ffffffff613da516565b6000858152600a6020908152604080832089845290915281206001015481908190819015156145ee576145eb8986614bff565b94505b60008a8152600f602052604090206006015468056bc75e2d6310000011801561464857506000898152600a602090815260408083208d8452909152902054678ac7230489e8000090614646908a63ffffffff612de316565b115b156146cf576000898152600a602090815260408083208d845290915290205461468090678ac7230489e800009063ffffffff613f0b16565b9350614692888563ffffffff613f0b16565b60008a8152600960205260409020600301549093506146b7908463ffffffff612de316565b60008a81526009602052604090206003015592965086925b633b9aca00881115614afd5760008a8152600f60205260409020600601546146fd908963ffffffff6144b216565b9150670de0b6b3a7640000821061477457614718828b614c5f565b60008a8152600f6020526040902054891461473f5760008a8152600f602052604090208990555b60008a8152600f6020526040902060010154861461476c5760008a8152600f602052604090206001018690555b845160640185525b67016345785d8a000088106149b457600e80546001019055614794614d3b565b1515600114156149b457678ac7230489e80000881061483557600d546064906147c490604b63ffffffff613da516565b8115156147cd57fe5b60008b81526009602052604090206002015491900491506147f4908263ffffffff612de316565b60008a815260096020526040902060020155600d54614819908263ffffffff613f0b16565b600d5584516d0eca8847c4129106ce8300000000018552614989565b670de0b6b3a764000088101580156148545750678ac7230489e8000088105b156148e157600d5460649061487090603263ffffffff613da516565b81151561487957fe5b60008b81526009602052604090206002015491900491506148a0908263ffffffff612de316565b60008a815260096020526040902060020155600d546148c5908263ffffffff613f0b16565b600d5584516d09dc5ada82b70b59df0200000000018552614989565b67016345785d8a000088101580156149005750670de0b6b3a764000088105b1561498957600d5460649061491c90601963ffffffff613da516565b81151561492557fe5b60008b815260096020526040902060020154919004915061494c908263ffffffff612de316565b60008a815260096020526040902060020155600d54614971908263ffffffff613f0b16565b600d5584516d0eca8847c4129106ce83000000000185525b84516d314dc6448d9338c15b0a000000008202016c7e37be2022c0914b26800000000185526000600e555b600e5485516103e89091020185526000898152600a602090815260408083208d84529091529020600101546149f090839063ffffffff612de316565b60008a8152600a602090815260408083208e84529091529020600181019190915554614a1d908990612de3565b60008a8152600a602090815260408083208e8452825280832093909355600f90522060050154614a5490839063ffffffff612de316565b60008b8152600f60205260409020600581019190915560060154614a7f90899063ffffffff612de316565b60008b8152600f60209081526040808320600601939093556010815282822089835290522054614ab690899063ffffffff612de316565b60008b81526010602090815260408083208a8452909152902055614ade8a8a8a8a8a8a614f52565b9450614aee8a8a8a89868a6152b8565b9450614afd89878a8589615426565b50505050505050505050565b6000614b158383613f6b565b90506000811115614b9b57600083815260096020526040902060030154614b4390829063ffffffff612de316565b600084815260096020908152604080832060030193909355600a815282822085835290522060020154614b7d90829063ffffffff612de316565b6000848152600a602090815260408083208684529091529020600201555b505050565b6000806002614bb0846001612de3565b811515614bb957fe5b0490508291505b8181101561358c578091506002614be28285811515614bdb57fe5b0483612de3565b811515614beb57fe5b049050614bc0565b6000612e3e8283613da5565b614c076156db565b60008381526009602052604090206005015415614c3b57600083815260096020526040902060050154614c3b908490614b09565b50600c546000838152600960205260409020600501558051600a0181528092915050565b6000818152600f602052604081206002015442919082118015614c8e57506000838152600f6020526040902054155b15614cb257614cab82613550603c670de0b6b3a764000088613eb7565b9050614cdf565b6000838152600f6020526040902060020154614cdc90613550603c670de0b6b3a764000088613eb7565b90505b614cf16154608363ffffffff612de316565b811015614d11576000838152600f602052604090206002018190556119a7565b614d236154608363ffffffff612de316565b6000848152600f602052604090206002015550505050565b600080614eac4361355042336040516020018082600160a060020a0316600160a060020a03166c010000000000000000000000000281526014019150506040516020818303038152906040526040518082805190602001908083835b60208310614db65780518252601f199092019160209182019101614d97565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912092505050811515614dec57fe5b046135504561355042416040516020018082600160a060020a0316600160a060020a03166c010000000000000000000000000281526014019150506040516020818303038152906040526040518082805190602001908083835b60208310614e655780518252601f199092019160209182019101614e46565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912092505050811515614e9b57fe5b04613550424463ffffffff612de316565b604051602001808281526020019150506040516020818303038152906040526040518082805190602001908083835b60208310614efa5780518252601f199092019160209182019101614edb565b5181516020939093036101000a60001901801990911692169190911790526040519201829003909120600e5490945092506103e89150839050046103e80282031015614f495760019150614f4e565b600091505b5090565b614f5a6156db565b6006546032860490606487049060009081908190600160a060020a03161561500657600660009054906101000a9004600160a060020a0316600160a060020a031663ed78cf4a856040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016000604051808303818588803b158015614fe857600080fd5b505af1158015614ffc573d6000803e3d6000fd5b5050505050615019565b615016858563ffffffff612de316565b94505b600a8a0492508a891415801561503f575060008981526009602052604090206001015415155b156150df5760008981526009602052604090206004015461506790849063ffffffff612de316565b60008a815260096020908152604091829020600481019390935582546001909301548251600160a060020a03909416845290830152818101859052426060830152518c918e918c917f590bbc0fc16915a85269a48f74783c39842b7ae9eceb7c295c95dbe8b3ec7331919081900360800190a46150f2565b6150ef858463ffffffff612de316565b94505b6000888152601160205260409020600101546151289060649061511c908d9063ffffffff613da516565b9063ffffffff61559416565b9150600085111561519757600154600160a060020a03161561518457600154604051600160a060020a039091169086156108fc029087906000818181858888f1935050505015801561517e573d6000803e3d6000fd5b50615197565b615194828663ffffffff612de316565b91505b60008211156152a8576005546151b490839063ffffffff613da516565b90506151cd8760c0015182612de390919063ffffffff16565b60c088015260048054604080517fa9059cbb00000000000000000000000000000000000000000000000000000000815233938101939093526024830184905251600160a060020a039091169163a9059cbb9160448083019260209291908290030181600087803b15801561524057600080fd5b505af1158015615254573d6000803e3d6000fd5b505050506040513d602081101561526a57600080fd5b5050600354604051600160a060020a039091169083156108fc029084906000818181858888f193505050501580156152a6573d6000803e3d6000fd5b505b50949a9950505050505050505050565b6152c06156db565b6000848152601160205260408120548190819081906064906152e9908b9063ffffffff613da516565b8115156152f257fe5b04935060648904925061531083600d54612de390919063ffffffff16565b600d556000888152601160205260409020600101546153819061537490606490615341908d9063ffffffff613da516565b81151561534a57fe5b04606461535e8d600e63ffffffff613da516565b81151561536757fe5b049063ffffffff612de316565b8a9063ffffffff613f0b16565b9850615393898563ffffffff613f0b16565b91506153a18b8b868a6155a2565b905060008111156153bf576153bc848263ffffffff613f0b16565b93505b60008b8152600f60205260409020600701546153e590613550848463ffffffff612de316565b60008c8152600f602052604090206007015560e086015161540d90859063ffffffff612de316565b60e0870152506101008501525091979650505050505050565b836c01431e0fae6d7217caa00000000242670de0b6b3a76400000282600001510101816000018181525050600c54751aba4714957d300d0e549208b31adb100000000000000285826020015101018160200181815250507f500e72a0e114930aebdbcb371ccdbf43922c49f979794b5de4257ff7e310c7468160000151826020015160096000898152602001908152602001600020600101543387878760400151886060015189608001518a60a001518b60c001518c60e001518d6101000151600d54604051808f81526020018e81526020018d600019166000191681526020018c600160a060020a0316600160a060020a031681526020018b81526020018a815260200189600160a060020a0316600160a060020a0316815260200188600019166000191681526020018781526020018681526020018581526020018481526020018381526020018281526020019e50505050505050505050505050505060405180910390a15050505050565b6000808284811515613f0257fe5b6000848152600f6020526040812060050154819081906155d086670de0b6b3a764000063ffffffff613da516565b8115156155d957fe5b6000898152600f6020526040902060080154919004925061560190839063ffffffff612de316565b6000888152600f6020526040902060080155670de0b6b3a764000061562c838663ffffffff613da516565b81151561563557fe5b6000888152600a602090815260408083208c8452825280832060020154600f9092529091206008015492909104925061568891613550908490670de0b6b3a764000090613fb2908a63ffffffff613da516565b6000878152600a602090815260408083208b8452825280832060020193909355600f905220600501546156d090670de0b6b3a76400009061320d90859063ffffffff613da516565b979650505050505050565b6101206040519081016040528060008152602001600081526020016000600160a060020a031681526020016000801916815260200160008152602001600081526020016000815260200160008152602001600081525090560048756d616e73206f6e6c79000000000000000000000000000000000000000000697473206e6f7420616374697665207965742e000000000000000000000000004d7573742062652061646d696e2e000000000000000000000000000000000000546f6f206c6974746c6500000000000000000000000000000000000000000000546f6f206d756368000000000000000000000000000000000000000000000000a165627a7a7230582014785a19f98eb6f4f9adfc80b78a9a7005075298cadf6f3146e6f2cbd1ee8fce0029

Deployed Bytecode

0x6080604052600436106101f85763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663018a25e881146101fd57806306fdde0314610224578063079ce327146102ae5780630f15f4c0146102ce57806310f01eba146102e357806311a09ae7146103045780631bf678cf1461031957806324c33d331461033a5780632660316e146103b75780632ce21999146103e65780632e19ebdc14610417578063349cdcac1461042f5780633ccfd60b1461044d5780633ddd4698146104625780633f03aab4146104be57806349cc635d146104ef5780635893d48114610519578063624ae5c014610534578063630664341461054957806363c194f11461057f578063685ffd8314610594578063747dff42146105e757806382bfc739146106725780638f38f309146106995780638f7140ea146106a7578063921dec21146106c257806395d89b411461071557806398a0871d1461072a5780639ae5dc9114610741578063a2bccae914610762578063a65b37a1146107a3578063a9059cbb146107b1578063c519500e146107d5578063c7e284b8146107ed578063ce89c80c14610802578063cf8080001461081d578063d53b267914610835578063d87574e01461084a578063de7874f31461085f578063ed78cf4a146108b9578063ee0b5d8b146108c1575b600080fd5b34801561020957600080fd5b5061021261091a565b60408051918252519081900360200190f35b34801561023057600080fd5b506102396109db565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561027357818101518382015260200161025b565b50505050905090810190601f1680156102a05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102ba57600080fd5b506102cc600435602435604435610a12565b005b3480156102da57600080fd5b506102cc610c04565b3480156102ef57600080fd5b50610212600160a060020a0360043516610ec5565b34801561031057600080fd5b50610212610ed7565b34801561032557600080fd5b506102cc600160a060020a0360043516610edd565b34801561034657600080fd5b50610352600435611024565b604080519d8e5260208e019c909c528c8c019a909a5297151560608c015260808b019690965260a08a019490945260c089019290925260e088015261010087015261012086015261014085015261016084015261018083015251908190036101a00190f35b3480156103c357600080fd5b506103d260043560243561108f565b604080519115158252519081900360200190f35b3480156103f257600080fd5b506103fe6004356110af565b6040805192835260208301919091528051918290030190f35b34801561042357600080fd5b506102126004356110c8565b34801561043b57600080fd5b506102cc6004356024356044356110da565b34801561045957600080fd5b506102cc6112a6565b6040805160206004803580820135601f81018490048402850184019095528484526102cc94369492936024939284019190819084018382808284375094975050600160a060020a0385351695505050505060200135151561161a565b3480156104ca57600080fd5b506104d36117d3565b60408051600160a060020a039092168252519081900360200190f35b3480156104fb57600080fd5b506102cc600435600160a060020a03602435166044356064356117e2565b34801561052557600080fd5b506102126004356024356119ad565b34801561054057600080fd5b506102126119ca565b34801561055557600080fd5b506105616004356119d0565b60408051938452602084019290925282820152519081900360600190f35b34801561058b57600080fd5b506104d3611b8f565b6040805160206004803580820135601f81018490048402850184019095528484526102cc943694929360249392840191908190840183828082843750949750508435955050505050602001351515611b9e565b3480156105f357600080fd5b506105fc611c7e565b604080519e8f5260208f019d909d528d8d019b909b5260608d019990995260808c019790975260a08b019590955260c08a0193909352600160a060020a0390911660e08901526101008801526101208701526101408601526101608501526101808401526101a083015251908190036101c00190f35b34801561067e57600080fd5b506102cc600160a060020a0360043516602435604435611e7c565b6102cc60043560243561205e565b3480156106b357600080fd5b506102cc60043560243561222b565b6040805160206004803580820135601f81018490048402850184019095528484526102cc9436949293602493928401919081908401838280828437509497505084359550505050506020013515156122e2565b34801561072157600080fd5b506102396123c2565b6102cc600160a060020a03600435166024356123f9565b34801561074d57600080fd5b506102cc600160a060020a03600435166125f6565b34801561076e57600080fd5b5061077d6004356024356126dc565b604080519485526020850193909352838301919091526060830152519081900360800190f35b6102cc60043560243561270e565b3480156107bd57600080fd5b506103d2600160a060020a03600435166024356128f1565b3480156107e157600080fd5b506103fe600435612a4a565b3480156107f957600080fd5b50610212612a63565b34801561080e57600080fd5b50610212600435602435612aea565b34801561082957600080fd5b50610212600435612b85565b34801561084157600080fd5b506103d2612c33565b34801561085657600080fd5b50610212612c43565b34801561086b57600080fd5b50610877600435612c49565b60408051600160a060020a0390981688526020880196909652868601949094526060860192909252608085015260a084015260c0830152519081900360e00190f35b6102cc612c90565b3480156108cd57600080fd5b506108e2600160a060020a0360043516612d0e565b604080519788526020880196909652868601949094526060860192909252608085015260a084015260c0830152519081900360e00190f35b600c546000818152600f602052604081206004015490919042908111801561098457506000828152600f60205260409020600201548111158061098457506000828152600f60205260409020600201548111801561098457506000828152600f6020526040902054155b156109cc576000828152600f60205260409020600501546109c590670de0b6b3a7640000906109b9908263ffffffff612de316565b9063ffffffff612e4416565b92506109d6565b6544364c5bb00092505b505090565b60408051808201909152601681527f4e54656368203344204c6f6e67204f6666696369616c00000000000000000000602082015281565b610a1a6156db565b600454600090819060a060020a900460ff161515600114610a73576040805160e560020a62461bcd0281526020600482015260136024820152600080516020615755833981519152604482015290519081900360640190fd5b33803b8015610aba576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615735833981519152604482015290519081900360640190fd5b85633b9aca00811015610b05576040805160e560020a62461bcd02815260206004820152600a6024820152600080516020615795833981519152604482015290519081900360640190fd5b69152d02c7e14af6800000811115610b55576040805160e560020a62461bcd02815260206004820152600860248201526000805160206157b5833981519152604482015290519081900360640190fd5b336000908152600760205260409020549450881580610b84575060008581526009602052604090206001015489145b15610ba2576000858152600960205260409020600601549350610be1565b6000898152600860209081526040808320548884526009909252909120600601549094508414610be15760008581526009602052604090206006018490555b610bea88612e71565b9750610bf985858a8a8a612e96565b505050505050505050565b3360009081526020819052604090205460098114610c5a576040805160e560020a62461bcd02815260206004820152600e6024820152600080516020615775833981519152604482015290519081900360640190fd5b600454600160a060020a03161515610cbc576040805160e560020a62461bcd02815260206004820152601360248201527f4d757374207365747570204e54546f6b656e2e00000000000000000000000000604482015290519081900360640190fd5b600154600160a060020a03161515610d1e576040805160e560020a62461bcd02815260206004820152601a60248201527f4d75737420736574757020436f6d6d756e697479416464725f2e000000000000604482015290519081900360640190fd5b600354600160a060020a03161515610d80576040805160e560020a62461bcd02815260206004820152601960248201527f4d757374207365747570204e54546f6b656e53656c6c65722e00000000000000604482015290519081900360640190fd5b600254600160a060020a03161515610de2576040805160e560020a62461bcd02815260206004820152601c60248201527f4d757374207365747570204e54466f756e646174696f6e416464722e00000000604482015290519081900360640190fd5b60045460a060020a900460ff1615610e44576040805160e560020a62461bcd02815260206004820152600960248201527f4f6e6c79206f6e63650000000000000000000000000000000000000000000000604482015290519081900360640190fd5b506004805474ff0000000000000000000000000000000000000000191660a060020a1790556001600c819055600052600f602052427f169f97de0d9a84d840042b17d3c6b9638b3d6fd9024c9eb0c7a306a17b49f893819055615460017f169f97de0d9a84d840042b17d3c6b9638b3d6fd9024c9eb0c7a306a17b49f89155565b60076020526000908152604090205481565b600e5481565b3360009081526020819052604090205460098114610f33576040805160e560020a62461bcd02815260206004820152600e6024820152600080516020615775833981519152604482015290519081900360640190fd5b600160a060020a0382161515610f93576040805160e560020a62461bcd02815260206004820152601a60248201527f456d7074792061646472657373206e6f7420616c6c6f7765642e000000000000604482015290519081900360640190fd5b600654600160a060020a031615610ff4576040805160e560020a62461bcd02815260206004820152601a60248201527f4f746865724e54656368334420686173206265656e207365742e000000000000604482015290519081900360640190fd5b506006805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600f60205260009081526040902080546001820154600283015460038401546004850154600586015460068701546007880154600889015460098a0154600a8b0154600b8c0154600c909c01549a9b999a989960ff909816989697959694959394929391929091908d565b600b60209081526000928352604080842090915290825290205460ff1681565b6011602052600090815260409020805460019091015482565b60086020526000908152604090205481565b6110e26156db565b60045460009060a060020a900460ff161515600114611139576040805160e560020a62461bcd0281526020600482015260136024820152600080516020615755833981519152604482015290519081900360640190fd5b33803b8015611180576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615735833981519152604482015290519081900360640190fd5b84633b9aca008110156111cb576040805160e560020a62461bcd02815260206004820152600a6024820152600080516020615795833981519152604482015290519081900360640190fd5b69152d02c7e14af680000081111561121b576040805160e560020a62461bcd02815260206004820152600860248201526000805160206157b5833981519152604482015290519081900360640190fd5b33600090815260076020526040902054935087158061123957508388145b15611257576000848152600960205260409020600601549750611284565b60008481526009602052604090206006015488146112845760008481526009602052604090206006018890555b61128d87612e71565b965061129c8489898989612e96565b5050505050505050565b6000806000806112b46156db565b60045460a060020a900460ff161515600114611308576040805160e560020a62461bcd0281526020600482015260136024820152600080516020615755833981519152604482015290519081900360640190fd5b33803b801561134f576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615735833981519152604482015290519081900360640190fd5b600c5433600090815260076020908152604080832054848452600f9092529091206002015491985042975095508611801561139c57506000878152600f602052604090206003015460ff16155b80156113b557506000878152600f602052604090205415155b1561155b576000878152600f60205260409020600301805460ff191660011790556113df836130ae565b92506113ea856134ff565b9350600084111561143b57600085815260096020526040808220549051600160a060020a039091169186156108fc02918791818181858888f19350505050158015611439573d6000803e3d6000fd5b505b85670de0b6b3a764000002836000015101836000018181525050848360200151018360200181815250507f0bd0dba8ab932212fa78150cdb7b0275da72e255875967b5cad11464cf71bedc3360096000888152602001908152602001600020600101548686600001518760200151886040015189606001518a608001518b60a001518c60c001518d60e00151604051808c600160a060020a0316600160a060020a031681526020018b600019166000191681526020018a815260200189815260200188815260200187600160a060020a0316600160a060020a0316815260200186600019166000191681526020018581526020018481526020018381526020018281526020019b50505050505050505050505060405180910390a1611611565b611564856134ff565b935060008411156115b557600085815260096020526040808220549051600160a060020a039091169186156108fc02918791818181858888f193505050501580156115b3573d6000803e3d6000fd5b505b6000858152600960209081526040918290206001015482513381529182015280820186905260608101889052905186917f8f36579a548bc439baa172a6521207464154da77f411e2da3db2f53affe6cc3a919081900360800190a25b50505050505050565b6000808080808033803b8015611668576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615735833981519152604482015290519081900360640190fd5b6116718b613592565b604080517faa4d490b000000000000000000000000000000000000000000000000000000008152336004820181905260248201849052600160a060020a038e1660448301528c151560648301528251939b50995034985073410526cd583af0be0530166d53efcd7da969f7b79263aa4d490b928a926084808201939182900301818588803b15801561170257600080fd5b505af1158015611716573d6000803e3d6000fd5b50505050506040513d604081101561172d57600080fd5b508051602091820151600160a060020a03808b1660008181526007865260408082205485835260098852918190208054600190910154825188151581529889018790529416878201526060870193909352608086018c90524260a0870152915193995091975095508a92909186917fdd6176433ff5026bbce96b068584b7bbe3514227e72df9c630b749ae87e64442919081900360c00190a45050505050505050505050565b600154600160a060020a031681565b3373410526cd583af0be0530166d53efcd7da969f7b71461184d576040805160e560020a62461bcd02815260206004820152601b60248201527f43616c6c65642066726f6d20506c61796572426f6f6b206f6e6c790000000000604482015290519081900360640190fd5b600160a060020a038316600090815260076020526040902054841461188857600160a060020a03831660009081526007602052604090208490555b60008281526008602052604090205484146118af5760008281526008602052604090208490555b600084815260096020526040902054600160a060020a03848116911614611905576000848152600960205260409020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0385161790555b60008481526009602052604090206001015482146119325760008481526009602052604090206001018290555b600084815260096020526040902060060154811461195f5760008481526009602052604090206006018190555b6000848152600b6020908152604080832085845290915290205460ff1615156119a7576000848152600b602090815260408083208584529091529020805460ff191660011790555b50505050565b601060209081526000928352604080842090915290825290205481565b600c5481565b600c546000818152600f602052604081206002015490918291829190829042118015611a0e57506000828152600f602052604090206003015460ff16155b8015611a2757506000828152600f602052604090205415155b15611b5e576000828152600f6020526040902054861415611b22576000828152600f60205260409020600c810154600790910154611a6a9163ffffffff612de316565b9050611aab6064611a8283603063ffffffff613da516565b811515611a8b57fe5b60008981526009602052604090206002015491900463ffffffff612de316565b6000878152600a60209081526040808320868452909152902060020154611b0490611ae690611ada8a87613e1c565b9063ffffffff613f0b16565b6000898152600960205260409020600301549063ffffffff612de316565b60008881526009602052604090206004015491965094509250611b86565b6000868152600960209081526040808320600290810154600a8452828520878652909352922090910154611b0490611ae690611ada8a87613e1c565b60008681526009602052604090206002810154600590910154611b0490611ae6908990613f6b565b50509193909250565b600254600160a060020a031681565b6000808080808033803b8015611bec576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615735833981519152604482015290519081900360640190fd5b611bf58b613592565b604080517f745ea0c1000000000000000000000000000000000000000000000000000000008152336004820181905260248201849052604482018e90528c151560648301528251939b50995034985073410526cd583af0be0530166d53efcd7da969f7b79263745ea0c1928a926084808201939182900301818588803b15801561170257600080fd5b6000806000806000806000806000806000806000806000600c549050600f60008281526020019081526020016000206009015481600f600084815260200190815260200160002060050154600f600085815260200190815260200160002060020154600f600086815260200190815260200160002060040154600f600087815260200190815260200160002060070154600f600088815260200190815260200160002060000154600a02600f6000898152602001908152602001600020600101540160096000600f60008b815260200190815260200160002060000154815260200190815260200160002060000160009054906101000a9004600160a060020a031660096000600f60008c815260200190815260200160002060000154815260200190815260200160002060010154601060008b8152602001908152602001600020600080815260200190815260200160002054601060008c815260200190815260200160002060006001815260200190815260200160002054601060008d815260200190815260200160002060006002815260200190815260200160002054601060008e815260200190815260200160002060006003815260200190815260200160002054600d546103e802600e54019e509e509e509e509e509e509e509e509e509e509e509e509e509e5050909192939495969798999a9b9c9d565b611e846156db565b600454600090819060a060020a900460ff161515600114611edd576040805160e560020a62461bcd0281526020600482015260136024820152600080516020615755833981519152604482015290519081900360640190fd5b33803b8015611f24576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615735833981519152604482015290519081900360640190fd5b85633b9aca00811015611f6f576040805160e560020a62461bcd02815260206004820152600a6024820152600080516020615795833981519152604482015290519081900360640190fd5b69152d02c7e14af6800000811115611fbf576040805160e560020a62461bcd02815260206004820152600860248201526000805160206157b5833981519152604482015290519081900360640190fd5b336000908152600760205260409020549450600160a060020a0389161580611fef5750600160a060020a03891633145b1561200d576000858152600960205260409020600601549350610be1565b600160a060020a0389166000908152600760209081526040808320548884526009909252909120600601549094508414610be1576000858152600960205260409020600601849055610bea88612e71565b6120666156db565b60045460009060a060020a900460ff1615156001146120bd576040805160e560020a62461bcd0281526020600482015260136024820152600080516020615755833981519152604482015290519081900360640190fd5b33803b8015612104576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615735833981519152604482015290519081900360640190fd5b34633b9aca0081101561214f576040805160e560020a62461bcd02815260206004820152600a6024820152600080516020615795833981519152604482015290519081900360640190fd5b69152d02c7e14af680000081111561219f576040805160e560020a62461bcd02815260206004820152600860248201526000805160206157b5833981519152604482015290519081900360640190fd5b6121a885613fc8565b3360009081526007602052604090205490955093508615806121c957508387145b156121e7576000848152600960205260409020600601549650612214565b60008481526009602052604090206006015487146122145760008481526009602052604090206006018790555b61221d86612e71565b95506116118488888861427c565b3373410526cd583af0be0530166d53efcd7da969f7b714612296576040805160e560020a62461bcd02815260206004820152601b60248201527f43616c6c65642066726f6d20506c61796572426f6f6b206f6e6c790000000000604482015290519081900360640190fd5b6000828152600b6020908152604080832084845290915290205460ff1615156122de576000828152600b602090815260408083208484529091529020805460ff191660011790555b5050565b6000808080808033803b8015612330576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615735833981519152604482015290519081900360640190fd5b6123398b613592565b604080517fc0942dfd000000000000000000000000000000000000000000000000000000008152336004820181905260248201849052604482018e90528c151560648301528251939b50995034985073410526cd583af0be0530166d53efcd7da969f7b79263c0942dfd928a926084808201939182900301818588803b15801561170257600080fd5b60408051808201909152600481527f4e54334400000000000000000000000000000000000000000000000000000000602082015281565b6124016156db565b600454600090819060a060020a900460ff16151560011461245a576040805160e560020a62461bcd0281526020600482015260136024820152600080516020615755833981519152604482015290519081900360640190fd5b33803b80156124a1576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615735833981519152604482015290519081900360640190fd5b34633b9aca008110156124ec576040805160e560020a62461bcd02815260206004820152600a6024820152600080516020615795833981519152604482015290519081900360640190fd5b69152d02c7e14af680000081111561253c576040805160e560020a62461bcd02815260206004820152600860248201526000805160206157b5833981519152604482015290519081900360640190fd5b61254586613fc8565b336000908152600760205260409020549096509450600160a060020a03881615806125785750600160a060020a03881633145b156125965760008581526009602052604090206006015493506125df565b600160a060020a03881660009081526007602090815260408083205488845260099092529091206006015490945084146125df5760008581526009602052604090206006018490555b6125e887612e71565b965061129c8585898961427c565b336000908152602081905260409020546009811461264c576040805160e560020a62461bcd02815260206004820152600e6024820152600080516020615775833981519152604482015290519081900360640190fd5b600160a060020a03821615156126ac576040805160e560020a62461bcd02815260206004820152601a60248201527f456d7074792061646472657373206e6f7420616c6c6f7765642e000000000000604482015290519081900360640190fd5b506004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600a60209081526000928352604080842090915290825290208054600182015460028301546003909301549192909184565b6127166156db565b600454600090819060a060020a900460ff16151560011461276f576040805160e560020a62461bcd0281526020600482015260136024820152600080516020615755833981519152604482015290519081900360640190fd5b33803b80156127b6576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020615735833981519152604482015290519081900360640190fd5b34633b9aca00811015612801576040805160e560020a62461bcd02815260206004820152600a6024820152600080516020615795833981519152604482015290519081900360640190fd5b69152d02c7e14af6800000811115612851576040805160e560020a62461bcd02815260206004820152600860248201526000805160206157b5833981519152604482015290519081900360640190fd5b61285a86613fc8565b33600090815260076020526040902054909650945087158061288c575060008581526009602052604090206001015488145b156128aa5760008581526009602052604090206006015493506125df565b60008881526008602090815260408083205488845260099092529091206006015490945084146125df5760008581526009602052604090206006018490556125e887612e71565b3360009081526020819052604081205460098114612947576040805160e560020a62461bcd02815260206004820152600e6024820152600080516020615775833981519152604482015290519081900360640190fd5b6000831161299f576040805160e560020a62461bcd02815260206004820152600960248201527f4d757374203e2030200000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60048054604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a0388811694820194909452602481018790529051929091169163a9059cbb916044808201926020929091908290030181600087803b158015612a1257600080fd5b505af1158015612a26573d6000803e3d6000fd5b505050506040513d6020811015612a3c57600080fd5b5060019250505b5092915050565b6012602052600090815260409020805460019091015482565b600c546000818152600f60205260408120600201549091904290811015612ae1576000828152600f6020526040902060040154811115612abf576000828152600f60205260409020600201546109c5908263ffffffff613f0b16565b6000828152600f60205260409020600201546109c5908263ffffffff613f0b16565b600092506109d6565b6000828152600f6020526040812060040154429081118015612b4e57506000848152600f602052604090206002015481111580612b4e57506000848152600f602052604090206002015481118015612b4e57506000848152600f6020526040902054155b15612b7c576000848152600f6020526040902060060154612b75908463ffffffff6144b216565b9150612a43565b612b75836144d3565b600c546000818152600f6020526040812060040154909190429081118015612bef57506000828152600f602052604090206002015481111580612bef57506000828152600f602052604090206002015481118015612bef57506000828152600f6020526040902054155b15612c23576000828152600f6020526040902060050154612c1c9085906109b9908263ffffffff612de316565b9250612c2c565b612c1c8461454b565b5050919050565b60045460a060020a900460ff1681565b600d5481565b6009602052600090815260409020805460018201546002830154600384015460048501546005860154600690960154600160a060020a039095169593949293919290919087565b600c80546001016000818152600f6020526040902090910154612cb9903463ffffffff612de316565b6000828152600f6020908152604091829020600c01929092558051838152349281019290925280517f74b1d2f771e0eff1b2c36c38499febdbea80fe4013bdace4fc4b653322c2895c9281900390910190a150565b6000806000806000806000806000600c54915050600160a060020a0389166000908152600760209081526040808320548084526009808452828520600180820154600a8752858820898952875294872001549583905293526002830154600590930154909384939091612da490612d86908690613f6b565b6000878152600960205260409020600301549063ffffffff612de316565b600095865260096020908152604080882060040154600a83528189209989529890915290952054939e929d50909b509950919750919550909350915050565b81810182811015612e3e576040805160e560020a62461bcd02815260206004820152601360248201527f536166654d61746820616464206661696c656400000000000000000000000000604482015290519081900360640190fd5b92915050565b6000612e6a612e61612e5c858563ffffffff613f0b16565b61454b565b611ada8561454b565b9392505050565b600080821080612e815750600382115b15612e8e57506002612e91565b50805b919050565b600c546000818152600f6020526040902060040154429081118015612efd57506000828152600f602052604090206002015481111580612efd57506000828152600f602052604090206002015481118015612efd57506000828152600f6020526040902054155b15612f3457612f0f84611ada896134ff565b600088815260096020526040902060030155612f2f8288868989886145b8565b611611565b6000828152600f602052604090206002015481118015612f6657506000828152600f602052604090206003015460ff16155b15611611576000828152600f60205260409020600301805460ff19166001179055612f90836130ae565b925080670de0b6b3a764000002836000015101836000018181525050868360200151018360200181815250507f88261ac70d02d5ea73e54fa6da17043c974de1021109573ec1f6f57111c823dd33600960008a815260200190815260200160002060010154856000015186602001518760400151886060015189608001518a60a001518b60c001518c60e00151604051808b600160a060020a0316600160a060020a031681526020018a6000191660001916815260200189815260200188815260200187600160a060020a0316600160a060020a0316815260200186600019166000191681526020018581526020018481526020018381526020018281526020019a505050505050505050505060405180910390a150505050505050565b6130b66156db565b600c80546000818152600f6020526040812080546001820154948201546007909201549394909390929182918291829182918291829182916130fd9163ffffffff612de316565b9750606461311289603063ffffffff613da516565b81151561311b57fe5b04965060328860008b8152601260205260409020549190049650606490613149908a9063ffffffff613da516565b81151561315257fe5b60008b815260126020526040902060010154919004955060649061317d908a9063ffffffff613da516565b81151561318657fe5b0493506131a184611ada87818a818e8e63ffffffff613f0b16565b60008c8152600f60205260409020600501549093506131ce86670de0b6b3a764000063ffffffff613da516565b8115156131d757fe5b60008d8152600f6020526040902060050154919004925061322590670de0b6b3a76400009061320d90859063ffffffff613da516565b81151561321657fe5b8791900463ffffffff613f0b16565b9050600081111561325557613240858263ffffffff613f0b16565b9450613252838263ffffffff612de316565b92505b60008a81526009602052604090206002015461327890889063ffffffff612de316565b60008b815260096020526040902060020155600154600160a060020a0316156132df57600154604051600160a060020a039091169087156108fc029088906000818181858888f193505050501580156132d5573d6000803e3d6000fd5b50600095506132f0565b6132e98387612de3565b9250600095505b600084111561335b57600254600160a060020a03161561334a57600254604051600160a060020a039091169085156108fc029086906000818181858888f19350505050158015613344573d6000803e3d6000fd5b5061335b565b6133548385612de3565b9250600093505b60008b8152600f602052604090206008015461337e90839063ffffffff612de316565b600f60008d815260200190815260200160002060080181905550600f60008c815260200190815260200160002060020154620f4240028d60000151018d60000181815250508867016345785d8a0000028a6a52b7d2dcc80cd2e4000000028e6020015101018d6020018181525050600960008b815260200190815260200160002060000160009054906101000a9004600160a060020a03168d60400190600160a060020a03169081600160a060020a031681525050600960008b8152602001908152602001600020600101548d606001906000191690816000191681525050868d6080018181525050848d60e001818152505060008d60c0018181525050828d60a0018181525050600c600081548092919060010191905055508a806001019b505042600f60008d8152602001908152602001600020600401819055506134d061546042612de390919063ffffffff16565b60008c8152600f602052604090206002810191909155600c018390558c9b505050505050505050505050919050565b600081815260096020526040812060050154819061351e908490614b09565b60008381526009602052604090206004810154600382015460029092015461355c92613550919063ffffffff612de316565b9063ffffffff612de316565b905060008111156135885760008381526009602052604081206002810182905560038101829055600401555b8091505b50919050565b80516000908290828080602084118015906135ad5750600084115b1515613629576040805160e560020a62461bcd02815260206004820152602a60248201527f737472696e67206d757374206265206265747765656e203120616e642033322060448201527f6368617261637465727300000000000000000000000000000000000000000000606482015290519081900360840190fd5b84600081518110151561363857fe5b90602001015160f860020a900460f860020a02600160f860020a031916602060f860020a021415801561369f5750846001850381518110151561367757fe5b90602001015160f860020a900460f860020a02600160f860020a031916602060f860020a0214155b151561371b576040805160e560020a62461bcd02815260206004820152602560248201527f737472696e672063616e6e6f74207374617274206f7220656e6420776974682060448201527f7370616365000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b84600081518110151561372a57fe5b90602001015160f860020a900460f860020a02600160f860020a031916603060f860020a02141561386d5784600181518110151561376457fe5b90602001015160f860020a900460f860020a02600160f860020a031916607860f860020a02141515156137e1576040805160e560020a62461bcd02815260206004820152601b60248201527f737472696e672063616e6e6f7420737461727420776974682030780000000000604482015290519081900360640190fd5b8460018151811015156137f057fe5b90602001015160f860020a900460f860020a02600160f860020a031916605860f860020a021415151561386d576040805160e560020a62461bcd02815260206004820152601b60248201527f737472696e672063616e6e6f7420737461727420776974682030580000000000604482015290519081900360640190fd5b600091505b83821015613d3d5784517f4000000000000000000000000000000000000000000000000000000000000000908690849081106138aa57fe5b90602001015160f860020a900460f860020a02600160f860020a03191611801561391e575084517f5b00000000000000000000000000000000000000000000000000000000000000908690849081106138ff57fe5b90602001015160f860020a900460f860020a02600160f860020a031916105b1561398b57848281518110151561393157fe5b90602001015160f860020a900460f860020a0260f860020a900460200160f860020a02858381518110151561396257fe5b906020010190600160f860020a031916908160001a90535082151561398657600192505b613d32565b848281518110151561399957fe5b90602001015160f860020a900460f860020a02600160f860020a031916602060f860020a021480613a69575084517f6000000000000000000000000000000000000000000000000000000000000000908690849081106139f557fe5b90602001015160f860020a900460f860020a02600160f860020a031916118015613a69575084517f7b0000000000000000000000000000000000000000000000000000000000000090869084908110613a4a57fe5b90602001015160f860020a900460f860020a02600160f860020a031916105b80613b13575084517f2f0000000000000000000000000000000000000000000000000000000000000090869084908110613a9f57fe5b90602001015160f860020a900460f860020a02600160f860020a031916118015613b13575084517f3a0000000000000000000000000000000000000000000000000000000000000090869084908110613af457fe5b90602001015160f860020a900460f860020a02600160f860020a031916105b1515613b8f576040805160e560020a62461bcd02815260206004820152602260248201527f737472696e6720636f6e7461696e7320696e76616c696420636861726163746560448201527f7273000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b8482815181101515613b9d57fe5b90602001015160f860020a900460f860020a02600160f860020a031916602060f860020a021415613c7c578482600101815181101515613bd957fe5b90602001015160f860020a900460f860020a02600160f860020a031916602060f860020a0214151515613c7c576040805160e560020a62461bcd02815260206004820152602860248201527f737472696e672063616e6e6f7420636f6e7461696e20636f6e7365637574697660448201527f6520737061636573000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b82158015613d28575084517f300000000000000000000000000000000000000000000000000000000000000090869084908110613cb557fe5b90602001015160f860020a900460f860020a02600160f860020a0319161080613d28575084517f390000000000000000000000000000000000000000000000000000000000000090869084908110613d0957fe5b90602001015160f860020a900460f860020a02600160f860020a031916115b15613d3257600192505b600190910190613872565b600183151514613d97576040805160e560020a62461bcd02815260206004820152601d60248201527f737472696e672063616e6e6f74206265206f6e6c79206e756d62657273000000604482015290519081900360640190fd5b505050506020015192915050565b6000821515613db657506000612e3e565b50818102818382811515613dc657fe5b0414612e3e576040805160e560020a62461bcd02815260206004820152601360248201527f536166654d617468206d756c206661696c656400000000000000000000000000604482015290519081900360640190fd5b6000818152600f60205260408120600c8101546007909101548291613e47919063ffffffff612de316565b6000858152600a602090815260408083208784528252808320600190810154600f8452828520600581015492015485526012909352922054929350670de0b6b3a764000092613ef992613eed91613ec4908690606490613eae908a9063ffffffff613da516565b811515613eb757fe5b049063ffffffff613da516565b811515613ecd57fe5b6000898152600f602052604090206008015491900463ffffffff612de316565b9063ffffffff613da516565b811515613f0257fe5b04949350505050565b600082821115613f65576040805160e560020a62461bcd02815260206004820152601360248201527f536166654d61746820737562206661696c656400000000000000000000000000604482015290519081900360640190fd5b50900390565b6000828152600a6020908152604080832084845282528083206002810154600190910154600f90935290832060080154612e6a92670de0b6b3a764000091613fb291613da5565b811515613fbb57fe5b049063ffffffff613f0b16565b613fd06156db565b33600090815260076020526040812054908082151561427357604080517fe56556a9000000000000000000000000000000000000000000000000000000008152336004820152905173410526cd583af0be0530166d53efcd7da969f7b79163e56556a99160248083019260209291908290030181600087803b15801561405557600080fd5b505af1158015614069573d6000803e3d6000fd5b505050506040513d602081101561407f57600080fd5b5051604080517f82e37b2c00000000000000000000000000000000000000000000000000000000815260048101839052905191945073410526cd583af0be0530166d53efcd7da969f7b7916382e37b2c916024808201926020929091908290030181600087803b1580156140f257600080fd5b505af1158015614106573d6000803e3d6000fd5b505050506040513d602081101561411c57600080fd5b5051604080517fe3c08adf00000000000000000000000000000000000000000000000000000000815260048101869052905191935073410526cd583af0be0530166d53efcd7da969f7b79163e3c08adf916024808201926020929091908290030181600087803b15801561418f57600080fd5b505af11580156141a3573d6000803e3d6000fd5b505050506040513d60208110156141b957600080fd5b505133600081815260076020908152604080832088905587835260099091529020805473ffffffffffffffffffffffffffffffffffffffff1916909117905590508115614242576000828152600860209081526040808320869055858352600982528083206001908101869055600b8352818420868552909252909120805460ff191690911790555b80158015906142515750828114155b1561426b5760008381526009602052604090206006018190555b845160010185525b50929392505050565b600c546000818152600f60205260409020600401544290811180156142e357506000828152600f6020526040902060020154811115806142e357506000828152600f6020526040902060020154811180156142e357506000828152600f6020526040902054155b156142fb576142f68287348888886145b8565b6144aa565b6000828152600f60205260409020600201548111801561432d57506000828152600f602052604090206003015460ff16155b15614475576000828152600f60205260409020600301805460ff19166001179055614357836130ae565b925080670de0b6b3a764000002836000015101836000018181525050858360200151018360200181815250507fa7801a70b37e729a11492aad44fd3dba89b4149f0609dc0f6837bf9e57e2671a3360096000898152602001908152602001600020600101543486600001518760200151886040015189606001518a608001518b60a001518c60c001518d60e00151604051808c600160a060020a0316600160a060020a031681526020018b600019166000191681526020018a815260200189815260200188815260200187600160a060020a0316600160a060020a0316815260200186600019166000191681526020018581526020018481526020018381526020018281526020019b50505050505050505050505060405180910390a15b600086815260096020526040902060030154614497903463ffffffff612de316565b6000878152600960205260409020600301555b505050505050565b6000612e6a6144c0846144d3565b611ada6144d3868663ffffffff612de316565b60006309502f9061453b6d03b2a1d15167e7c5699bfde00000611ada6145367a0dac7055469777a6122ee4310dd6c14410500f29048400000000006135506b01027e72f1f1281308800000613eed8a670de0b6b3a764000063ffffffff613da516565b614ba0565b81151561454457fe5b0492915050565b600061455e670de0b6b3a7640000614bf3565b61453b600261459161457e86670de0b6b3a764000063ffffffff613da516565b65886c8f6730709063ffffffff613da516565b81151561459a57fe5b046135506145a786614bf3565b6304a817c89063ffffffff613da516565b6000858152600a6020908152604080832089845290915281206001015481908190819015156145ee576145eb8986614bff565b94505b60008a8152600f602052604090206006015468056bc75e2d6310000011801561464857506000898152600a602090815260408083208d8452909152902054678ac7230489e8000090614646908a63ffffffff612de316565b115b156146cf576000898152600a602090815260408083208d845290915290205461468090678ac7230489e800009063ffffffff613f0b16565b9350614692888563ffffffff613f0b16565b60008a8152600960205260409020600301549093506146b7908463ffffffff612de316565b60008a81526009602052604090206003015592965086925b633b9aca00881115614afd5760008a8152600f60205260409020600601546146fd908963ffffffff6144b216565b9150670de0b6b3a7640000821061477457614718828b614c5f565b60008a8152600f6020526040902054891461473f5760008a8152600f602052604090208990555b60008a8152600f6020526040902060010154861461476c5760008a8152600f602052604090206001018690555b845160640185525b67016345785d8a000088106149b457600e80546001019055614794614d3b565b1515600114156149b457678ac7230489e80000881061483557600d546064906147c490604b63ffffffff613da516565b8115156147cd57fe5b60008b81526009602052604090206002015491900491506147f4908263ffffffff612de316565b60008a815260096020526040902060020155600d54614819908263ffffffff613f0b16565b600d5584516d0eca8847c4129106ce8300000000018552614989565b670de0b6b3a764000088101580156148545750678ac7230489e8000088105b156148e157600d5460649061487090603263ffffffff613da516565b81151561487957fe5b60008b81526009602052604090206002015491900491506148a0908263ffffffff612de316565b60008a815260096020526040902060020155600d546148c5908263ffffffff613f0b16565b600d5584516d09dc5ada82b70b59df0200000000018552614989565b67016345785d8a000088101580156149005750670de0b6b3a764000088105b1561498957600d5460649061491c90601963ffffffff613da516565b81151561492557fe5b60008b815260096020526040902060020154919004915061494c908263ffffffff612de316565b60008a815260096020526040902060020155600d54614971908263ffffffff613f0b16565b600d5584516d0eca8847c4129106ce83000000000185525b84516d314dc6448d9338c15b0a000000008202016c7e37be2022c0914b26800000000185526000600e555b600e5485516103e89091020185526000898152600a602090815260408083208d84529091529020600101546149f090839063ffffffff612de316565b60008a8152600a602090815260408083208e84529091529020600181019190915554614a1d908990612de3565b60008a8152600a602090815260408083208e8452825280832093909355600f90522060050154614a5490839063ffffffff612de316565b60008b8152600f60205260409020600581019190915560060154614a7f90899063ffffffff612de316565b60008b8152600f60209081526040808320600601939093556010815282822089835290522054614ab690899063ffffffff612de316565b60008b81526010602090815260408083208a8452909152902055614ade8a8a8a8a8a8a614f52565b9450614aee8a8a8a89868a6152b8565b9450614afd89878a8589615426565b50505050505050505050565b6000614b158383613f6b565b90506000811115614b9b57600083815260096020526040902060030154614b4390829063ffffffff612de316565b600084815260096020908152604080832060030193909355600a815282822085835290522060020154614b7d90829063ffffffff612de316565b6000848152600a602090815260408083208684529091529020600201555b505050565b6000806002614bb0846001612de3565b811515614bb957fe5b0490508291505b8181101561358c578091506002614be28285811515614bdb57fe5b0483612de3565b811515614beb57fe5b049050614bc0565b6000612e3e8283613da5565b614c076156db565b60008381526009602052604090206005015415614c3b57600083815260096020526040902060050154614c3b908490614b09565b50600c546000838152600960205260409020600501558051600a0181528092915050565b6000818152600f602052604081206002015442919082118015614c8e57506000838152600f6020526040902054155b15614cb257614cab82613550603c670de0b6b3a764000088613eb7565b9050614cdf565b6000838152600f6020526040902060020154614cdc90613550603c670de0b6b3a764000088613eb7565b90505b614cf16154608363ffffffff612de316565b811015614d11576000838152600f602052604090206002018190556119a7565b614d236154608363ffffffff612de316565b6000848152600f602052604090206002015550505050565b600080614eac4361355042336040516020018082600160a060020a0316600160a060020a03166c010000000000000000000000000281526014019150506040516020818303038152906040526040518082805190602001908083835b60208310614db65780518252601f199092019160209182019101614d97565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912092505050811515614dec57fe5b046135504561355042416040516020018082600160a060020a0316600160a060020a03166c010000000000000000000000000281526014019150506040516020818303038152906040526040518082805190602001908083835b60208310614e655780518252601f199092019160209182019101614e46565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912092505050811515614e9b57fe5b04613550424463ffffffff612de316565b604051602001808281526020019150506040516020818303038152906040526040518082805190602001908083835b60208310614efa5780518252601f199092019160209182019101614edb565b5181516020939093036101000a60001901801990911692169190911790526040519201829003909120600e5490945092506103e89150839050046103e80282031015614f495760019150614f4e565b600091505b5090565b614f5a6156db565b6006546032860490606487049060009081908190600160a060020a03161561500657600660009054906101000a9004600160a060020a0316600160a060020a031663ed78cf4a856040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016000604051808303818588803b158015614fe857600080fd5b505af1158015614ffc573d6000803e3d6000fd5b5050505050615019565b615016858563ffffffff612de316565b94505b600a8a0492508a891415801561503f575060008981526009602052604090206001015415155b156150df5760008981526009602052604090206004015461506790849063ffffffff612de316565b60008a815260096020908152604091829020600481019390935582546001909301548251600160a060020a03909416845290830152818101859052426060830152518c918e918c917f590bbc0fc16915a85269a48f74783c39842b7ae9eceb7c295c95dbe8b3ec7331919081900360800190a46150f2565b6150ef858463ffffffff612de316565b94505b6000888152601160205260409020600101546151289060649061511c908d9063ffffffff613da516565b9063ffffffff61559416565b9150600085111561519757600154600160a060020a03161561518457600154604051600160a060020a039091169086156108fc029087906000818181858888f1935050505015801561517e573d6000803e3d6000fd5b50615197565b615194828663ffffffff612de316565b91505b60008211156152a8576005546151b490839063ffffffff613da516565b90506151cd8760c0015182612de390919063ffffffff16565b60c088015260048054604080517fa9059cbb00000000000000000000000000000000000000000000000000000000815233938101939093526024830184905251600160a060020a039091169163a9059cbb9160448083019260209291908290030181600087803b15801561524057600080fd5b505af1158015615254573d6000803e3d6000fd5b505050506040513d602081101561526a57600080fd5b5050600354604051600160a060020a039091169083156108fc029084906000818181858888f193505050501580156152a6573d6000803e3d6000fd5b505b50949a9950505050505050505050565b6152c06156db565b6000848152601160205260408120548190819081906064906152e9908b9063ffffffff613da516565b8115156152f257fe5b04935060648904925061531083600d54612de390919063ffffffff16565b600d556000888152601160205260409020600101546153819061537490606490615341908d9063ffffffff613da516565b81151561534a57fe5b04606461535e8d600e63ffffffff613da516565b81151561536757fe5b049063ffffffff612de316565b8a9063ffffffff613f0b16565b9850615393898563ffffffff613f0b16565b91506153a18b8b868a6155a2565b905060008111156153bf576153bc848263ffffffff613f0b16565b93505b60008b8152600f60205260409020600701546153e590613550848463ffffffff612de316565b60008c8152600f602052604090206007015560e086015161540d90859063ffffffff612de316565b60e0870152506101008501525091979650505050505050565b836c01431e0fae6d7217caa00000000242670de0b6b3a76400000282600001510101816000018181525050600c54751aba4714957d300d0e549208b31adb100000000000000285826020015101018160200181815250507f500e72a0e114930aebdbcb371ccdbf43922c49f979794b5de4257ff7e310c7468160000151826020015160096000898152602001908152602001600020600101543387878760400151886060015189608001518a60a001518b60c001518c60e001518d6101000151600d54604051808f81526020018e81526020018d600019166000191681526020018c600160a060020a0316600160a060020a031681526020018b81526020018a815260200189600160a060020a0316600160a060020a0316815260200188600019166000191681526020018781526020018681526020018581526020018481526020018381526020018281526020019e50505050505050505050505050505060405180910390a15050505050565b6000808284811515613f0257fe5b6000848152600f6020526040812060050154819081906155d086670de0b6b3a764000063ffffffff613da516565b8115156155d957fe5b6000898152600f6020526040902060080154919004925061560190839063ffffffff612de316565b6000888152600f6020526040902060080155670de0b6b3a764000061562c838663ffffffff613da516565b81151561563557fe5b6000888152600a602090815260408083208c8452825280832060020154600f9092529091206008015492909104925061568891613550908490670de0b6b3a764000090613fb2908a63ffffffff613da516565b6000878152600a602090815260408083208b8452825280832060020193909355600f905220600501546156d090670de0b6b3a76400009061320d90859063ffffffff613da516565b979650505050505050565b6101206040519081016040528060008152602001600081526020016000600160a060020a031681526020016000801916815260200160008152602001600081526020016000815260200160008152602001600081525090560048756d616e73206f6e6c79000000000000000000000000000000000000000000697473206e6f7420616374697665207965742e000000000000000000000000004d7573742062652061646d696e2e000000000000000000000000000000000000546f6f206c6974746c6500000000000000000000000000000000000000000000546f6f206d756368000000000000000000000000000000000000000000000000a165627a7a7230582014785a19f98eb6f4f9adfc80b78a9a7005075298cadf6f3146e6f2cbd1ee8fce0029

Swarm Source

bzzr://14785a19f98eb6f4f9adfc80b78a9a7005075298cadf6f3146e6f2cbd1ee8fce

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Txn Hash Block Value Eth2 PubKey Valid
View All Deposits
[ 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.