Sponsored Link:   Revain - How to find moon tokens to invest? See what crypto experts are saying. Read reviews!
Contract Overview | TheAbyssPollManagedFund
Balance: 18,511.022856163209885325 Ether
Ether Value: $10,723,805.76 (@ $579.32/ETH)
Transactions: 17 txns
 Latest 17 txns


TxHash Age From To Value [TxFee]
0x8a6461df29b64dc9142e053075cbc1bf107418c4f29292ea9f54789f8a98606215 days 8 hrs ago0x100c00ddc802e40f969095374b0cc3b3fd0abc0f  IN   TheAbyssPollManagedFund0.01 Ether0.000861
0x322103e6e82a43eb5d015645f4ac4e007b9b5da97e189972434c70eeafc013e736 days 7 hrs ago0x58e47357af4949ba8d5ae5e528f4a6eb719a010f  IN   TheAbyssPollManagedFund0.2 Ether0.001681706937
0x78ba2f5dd1d49928d6f517e9e8e2a6ec162743bf229f1a506075251a64102e8136 days 15 hrs ago0x48b577bef96ff15ca0d02a0c055efdd151526b89  IN   TheAbyssPollManagedFund3 Ether0.000862886
0x2055bad38ca3609fc4f58056bc5048b5fe8545fb06b49f9dd0936ce04751b50836 days 17 hrs ago0x845dbb80bd79d1193c4d3f620dcbf937f54b8064  IN   TheAbyssPollManagedFund0.054598676 Ether0.002083554
0x1d7a78cd6c2dfc884d2be5f8d49a726a49d303c10b9d3bba61e754b4787a601a36 days 19 hrs ago0xe09752295780f187266c4b1a210405f6b071a8a6  IN   TheAbyssPollManagedFund6 Ether0.00063138
0xa4e074af7289908023a6550b5ccdfc9f230d0302a51ee95fd569a72bafaebf2836 days 19 hrs ago0xe09752295780f187266c4b1a210405f6b071a8a6  IN   TheAbyssPollManagedFund6 Ether0.002083554
0x7d8465f6f2fcc2b986a492129430948cfca081301cfaff04d53858ac30ae3f8636 days 19 hrs ago0xe09752295780f187266c4b1a210405f6b071a8a6  IN   TheAbyssPollManagedFund6 Ether0.00063138
0x55ea7385b15c991452dd1a39cf8ce97e37d041bfa7c600f7ecaa2bbb1bf1cc0636 days 19 hrs ago0xe09752295780f187266c4b1a210405f6b071a8a6  IN   TheAbyssPollManagedFund6 Ether0.002083554
0xfc1b408af512bc85638a7f0c8890e4c27ce5f0ded85ef4409cc50dff05f317a236 days 19 hrs ago0xe09752295780f187266c4b1a210405f6b071a8a6  IN   TheAbyssPollManagedFund5 Ether0.002083554
0x39bf94e2c4d6fdd6534820eb6d40abf46864b37048f1b5ff88d08f91b56159a436 days 20 hrs ago0x845dbb80bd79d1193c4d3f620dcbf937f54b8064  IN   TheAbyssPollManagedFund0.062932892 Ether0.002083554
0xde38bcd22d3d2d5aad4b8f8c25c2f4dccfdb92d6fa7b6f6dc20259e93cd6cd4436 days 20 hrs ago0xe09752295780f187266c4b1a210405f6b071a8a6  IN   TheAbyssPollManagedFund1 Ether0.002083554
0x7fb15bdea1b17315aa22d7db9c4188180f77902a174db7d1758f503d88c0fe6f36 days 20 hrs ago0xe09752295780f187266c4b1a210405f6b071a8a6  IN   TheAbyssPollManagedFund1 Ether0.000441966
0x7b3061a7895b3e46a1b5cdf5cfe85bd1b2906ab2328a888b3a543d5f23f53b6036 days 21 hrs ago0x845dbb80bd79d1193c4d3f620dcbf937f54b8064  IN   TheAbyssPollManagedFund0.065016446 Ether0.002083554
0xb7330708b941fb7d181b1be1aa4a6f65d98c3bc570aaabf40591e310130fd7ad37 days 18 hrs ago0x5eaf0a37346ff992199fbc4480c9ccc4137d9c1f  IN   TheAbyssPollManagedFund0 Ether0.00008911
0xc814f164f122e018627b0b9192edce610c15948c3c02b300a9004e7adecc6b0037 days 18 hrs ago0x5eaf0a37346ff992199fbc4480c9ccc4137d9c1f  IN   TheAbyssPollManagedFund0 Ether0.00008818
0x2e5ce1aa38cb2db5c34cc1892afde6166d384d4967175adc559ba35f78ed75bd37 days 18 hrs ago0x5eaf0a37346ff992199fbc4480c9ccc4137d9c1f  IN   TheAbyssPollManagedFund0 Ether0.00008823
0xa8c5c5e0dc368bba43da883ca8065adbdb0c0b60e5a28280380ced447c7eae4137 days 19 hrs ago0x5eaf0a37346ff992199fbc4480c9ccc4137d9c1f  IN    Contract Creation0 Ether0.021427108
[ Download CSV Export  ] 
 Internal Transactions as a result of Contract Execution
 Latest 25 Internal Txns, Click here to View More View All
ParentTxHash Block Age From To Value
0x1359322bfc935d7977317fbbd40bae0bf87a23caf04d8b3b2da0cb5023019fa656239259 days 8 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867282 Ether
0x120098be77c26cbda1f84d4a6defe02becaaf521c08ca3c9968e98759c8ac45856239229 days 8 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867282.8983354 Ether
0x655cafb6916b8bc2c452e585c3114e8c2e22aabc6dcaf93448cc6e71b65157b756239209 days 8 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867285 Ether
0x25efc2211ef5405ed9da9ac816c743cddc5fb565b88930f8fb6b1c84c13d939256239129 days 8 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf78672817 Ether
0x6692873219d1898894d0e55dd9156487d49c23f4f5cda49e44e3ff76a8a179ea56239129 days 8 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf78672810 Ether
0x81fab133fcf31da4343818a747d3ea47b2676376c1a9a393d7faa1718e7c2bf256239129 days 8 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867280.35384615 Ether
0x7aa8ddf52d3038487e9534a84e8a34549d96b2c27aeca2ad45c42699b7a67cb056239109 days 8 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867280.65 Ether
0x5ae49ef7efbea234130c5873bbc39cacb36718d1bbb0b30563782315ceca0a5b56239089 days 8 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867281 Ether
0xb582d20f8d7eb32e4c267874f82d7532716fa22eb37089882d3811592d20fb8656239079 days 8 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867281.5 Ether
0xf70d61b291b2415ffdb79d0aa6895b36d74b11be490c4d8a3544d417d0e62d6c56239069 days 8 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867280.2 Ether
0x68ac1cb2f597cf43713b3faf0f3fd2787c19741280846c1e22efbcc2c1a973b556239049 days 8 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867280.32 Ether
0xd6cb72fca32c0c48979b749ccdef63a8e4c58f7476acd9527861cda78aaa886356239029 days 8 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867280.3 Ether
0xe7fddb0c94c1207ffd7315348436aaca3a1452e90260196da445579d5a524ea256239019 days 8 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867280.2 Ether
0x80b3e374ac31bacc3627f2a80ef119cb379866fd560659e18274ce08aa9756e956239019 days 8 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867280.38 Ether
0xee5cf5a310531be5ca8d92dfe48a439010480e2cfbbb3fffa8cc069f5f850cfe56238979 days 8 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867286.4 Ether
0x888b561e9cbd8665f5b440402abde9622f0fc72c1d59126f28ca89aaf06e1a2256238969 days 8 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867280.44574183 Ether
0x72036c7635ae7159bb778e4eda46867da3e0c4a8320e5c34b1f2c0f57d29d16456238939 days 8 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867280.21 Ether
0xc4f9c7e4a5103b1f08f2140b4b5864ff9a5ac830500a340d54c432515b15aeb456238609 days 8 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867283 Ether
0x3267d736ab587b368810711045d26995039334427cec22545ad059f313a341a056238569 days 8 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867282.2 Ether
0x18eed6638c0216bd6323444cc1664065c68f4a15d30fc480c65bdbc970e893ea56238459 days 8 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867285 Ether
0xbee4941986981edfd218a6bf7a9bbc8f43dff02814663819fd990aff365a52c156238289 days 8 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867280.2229512 Ether
0x774f4304b0e917480db2a3672adc5618419532fbab1215680103ced4b020617d56238199 days 8 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867283 Ether
0xae1029dc65b44c4d272d8734dd996fa6af9189b872aae8923a00f4a063d576ac56238199 days 8 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867288.1 Ether
0xcf8e0af4613f11f7068f0b7b698688632a4870fdb850dc65dea9514f894d0cef56238159 days 8 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867285.4 Ether
0x554088d04b6941b73866733625191b98101a10c7c4c588d8f251b44c32787b9a56237999 days 8 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867280.99 Ether
[ Download CSV Export  ] 
Contract Source Code Verified (Exact match)
Contract Name: PollManagedFund
Compiler Version: v0.4.21+commit.dfe3193c
Optimization Enabled: Yes
Runs (Optimiser):  200



  Contract Source Code   Find Similiar Contracts

pragma solidity ^0.4.21;

// File: contracts/DateTime.sol

contract DateTime {
        /*
         *  Date and Time utilities for ethereum contracts
         *
         */
        struct _DateTime {
                uint16 year;
                uint8 month;
                uint8 day;
                uint8 hour;
                uint8 minute;
                uint8 second;
                uint8 weekday;
        }

        uint constant DAY_IN_SECONDS = 86400;
        uint constant YEAR_IN_SECONDS = 31536000;
        uint constant LEAP_YEAR_IN_SECONDS = 31622400;

        uint constant HOUR_IN_SECONDS = 3600;
        uint constant MINUTE_IN_SECONDS = 60;

        uint16 constant ORIGIN_YEAR = 1970;

        function isLeapYear(uint16 year) public pure returns (bool) {
                if (year % 4 != 0) {
                        return false;
                }
                if (year % 100 != 0) {
                        return true;
                }
                if (year % 400 != 0) {
                        return false;
                }
                return true;
        }

        function leapYearsBefore(uint year) public pure returns (uint) {
                year -= 1;
                return year / 4 - year / 100 + year / 400;
        }

        function getDaysInMonth(uint8 month, uint16 year) public pure returns (uint8) {
                if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
                        return 31;
                }
                else if (month == 4 || month == 6 || month == 9 || month == 11) {
                        return 30;
                }
                else if (isLeapYear(year)) {
                        return 29;
                }
                else {
                        return 28;
                }
        }

        function parseTimestamp(uint timestamp) internal pure returns (_DateTime dt) {
                uint secondsAccountedFor = 0;
                uint buf;
                uint8 i;

                // Year
                dt.year = getYear(timestamp);
                buf = leapYearsBefore(dt.year) - leapYearsBefore(ORIGIN_YEAR);

                secondsAccountedFor += LEAP_YEAR_IN_SECONDS * buf;
                secondsAccountedFor += YEAR_IN_SECONDS * (dt.year - ORIGIN_YEAR - buf);

                // Month
                uint secondsInMonth;
                for (i = 1; i <= 12; i++) {
                        secondsInMonth = DAY_IN_SECONDS * getDaysInMonth(i, dt.year);
                        if (secondsInMonth + secondsAccountedFor > timestamp) {
                                dt.month = i;
                                break;
                        }
                        secondsAccountedFor += secondsInMonth;
                }

                // Day
                for (i = 1; i <= getDaysInMonth(dt.month, dt.year); i++) {
                        if (DAY_IN_SECONDS + secondsAccountedFor > timestamp) {
                                dt.day = i;
                                break;
                        }
                        secondsAccountedFor += DAY_IN_SECONDS;
                }

                // Hour
                dt.hour = getHour(timestamp);

                // Minute
                dt.minute = getMinute(timestamp);

                // Second
                dt.second = getSecond(timestamp);

                // Day of week.
                dt.weekday = getWeekday(timestamp);
        }

        function getYear(uint timestamp) public pure returns (uint16) {
                uint secondsAccountedFor = 0;
                uint16 year;
                uint numLeapYears;

                // Year
                year = uint16(ORIGIN_YEAR + timestamp / YEAR_IN_SECONDS);
                numLeapYears = leapYearsBefore(year) - leapYearsBefore(ORIGIN_YEAR);

                secondsAccountedFor += LEAP_YEAR_IN_SECONDS * numLeapYears;
                secondsAccountedFor += YEAR_IN_SECONDS * (year - ORIGIN_YEAR - numLeapYears);

                while (secondsAccountedFor > timestamp) {
                        if (isLeapYear(uint16(year - 1))) {
                                secondsAccountedFor -= LEAP_YEAR_IN_SECONDS;
                        }
                        else {
                                secondsAccountedFor -= YEAR_IN_SECONDS;
                        }
                        year -= 1;
                }
                return year;
        }

        function getMonth(uint timestamp) public pure returns (uint8) {
                return parseTimestamp(timestamp).month;
        }

        function getDay(uint timestamp) public pure returns (uint8) {
                return parseTimestamp(timestamp).day;
        }

        function getHour(uint timestamp) public pure returns (uint8) {
                return uint8((timestamp / 60 / 60) % 24);
        }

        function getMinute(uint timestamp) public pure returns (uint8) {
                return uint8((timestamp / 60) % 60);
        }

        function getSecond(uint timestamp) public pure returns (uint8) {
                return uint8(timestamp % 60);
        }

        function getWeekday(uint timestamp) public pure returns (uint8) {
                return uint8((timestamp / DAY_IN_SECONDS + 4) % 7);
        }

        function toTimestamp(uint16 year, uint8 month, uint8 day) public pure returns (uint timestamp) {
                return toTimestamp(year, month, day, 0, 0, 0);
        }

        function toTimestamp(uint16 year, uint8 month, uint8 day, uint8 hour) public pure returns (uint timestamp) {
                return toTimestamp(year, month, day, hour, 0, 0);
        }

        function toTimestamp(uint16 year, uint8 month, uint8 day, uint8 hour, uint8 minute) public pure returns (uint timestamp) {
                return toTimestamp(year, month, day, hour, minute, 0);
        }

        function toTimestamp(uint16 year, uint8 month, uint8 day, uint8 hour, uint8 minute, uint8 second) public pure returns (uint timestamp) {
                uint16 i;

                // Year
                for (i = ORIGIN_YEAR; i < year; i++) {
                        if (isLeapYear(i)) {
                                timestamp += LEAP_YEAR_IN_SECONDS;
                        }
                        else {
                                timestamp += YEAR_IN_SECONDS;
                        }
                }

                // Month
                uint8[12] memory monthDayCounts;
                monthDayCounts[0] = 31;
                if (isLeapYear(year)) {
                        monthDayCounts[1] = 29;
                }
                else {
                        monthDayCounts[1] = 28;
                }
                monthDayCounts[2] = 31;
                monthDayCounts[3] = 30;
                monthDayCounts[4] = 31;
                monthDayCounts[5] = 30;
                monthDayCounts[6] = 31;
                monthDayCounts[7] = 31;
                monthDayCounts[8] = 30;
                monthDayCounts[9] = 31;
                monthDayCounts[10] = 30;
                monthDayCounts[11] = 31;

                for (i = 1; i < month; i++) {
                        timestamp += DAY_IN_SECONDS * monthDayCounts[i - 1];
                }

                // Day
                timestamp += DAY_IN_SECONDS * (day - 1);

                // Hour
                timestamp += HOUR_IN_SECONDS * (hour);

                // Minute
                timestamp += MINUTE_IN_SECONDS * (minute);

                // Second
                timestamp += second;

                return timestamp;
        }
}

// File: contracts/ISimpleCrowdsale.sol

interface ISimpleCrowdsale {
    function getSoftCap() external view returns(uint256);
    function isContributorInLists(address contributorAddress) external view returns(bool);
    function processReservationFundContribution(
        address contributor,
        uint256 tokenAmount,
        uint256 tokenBonusAmount
    ) external payable;
}

// File: contracts/fund/ICrowdsaleFund.sol

/**
 * @title ICrowdsaleFund
 * @dev Fund methods used by crowdsale contract
 */
interface ICrowdsaleFund {
    /**
    * @dev Function accepts user`s contributed ether and logs contribution
    * @param contributor Contributor wallet address.
    */
    function processContribution(address contributor) external payable;
    /**
    * @dev Function is called on the end of successful crowdsale
    */
    function onCrowdsaleEnd() external;
    /**
    * @dev Function is called if crowdsale failed to reach soft cap
    */
    function enableCrowdsaleRefund() external;
}

// File: contracts/math/SafeMath.sol

/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
contract SafeMath {
    /**
    * @dev constructor
    */
    function SafeMath() public {
    }

    function safeMul(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a * b;
        assert(a == 0 || c / a == b);
        return c;
    }

    function safeDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a / b;
        return c;
    }

    function safeSub(uint256 a, uint256 b) internal pure returns (uint256) {
        assert(a >= b);
        return a - b;
    }

    function safeAdd(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        assert(c >= a);
        return c;
    }
}

// File: contracts/ownership/MultiOwnable.sol

/**
 * @title MultiOwnable
 * @dev The MultiOwnable contract has owners addresses and provides basic authorization control
 * functions, this simplifies the implementation of "users permissions".
 */
contract MultiOwnable {
    address public manager; // address used to set owners
    address[] public owners;
    mapping(address => bool) public ownerByAddress;

    event SetOwners(address[] owners);

    modifier onlyOwner() {
        require(ownerByAddress[msg.sender] == true);
        _;
    }

    /**
     * @dev MultiOwnable constructor sets the manager
     */
    function MultiOwnable() public {
        manager = msg.sender;
    }

    /**
     * @dev Function to set owners addresses
     */
    function setOwners(address[] _owners) public {
        require(msg.sender == manager);
        _setOwners(_owners);

    }

    function _setOwners(address[] _owners) internal {
        for(uint256 i = 0; i < owners.length; i++) {
            ownerByAddress[owners[i]] = false;
        }


        for(uint256 j = 0; j < _owners.length; j++) {
            ownerByAddress[_owners[j]] = true;
        }
        owners = _owners;
        SetOwners(_owners);
    }

    function getOwners() public constant returns (address[]) {
        return owners;
    }
}

// File: contracts/token/IERC20Token.sol

/**
 * @title IERC20Token - ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract IERC20Token {
    string public name;
    string public symbol;
    uint8 public decimals;
    uint256 public totalSupply;

    function balanceOf(address _owner) public constant returns (uint256 balance);
    function transfer(address _to, uint256 _value)  public returns (bool success);
    function transferFrom(address _from, address _to, uint256 _value)  public returns (bool success);
    function approve(address _spender, uint256 _value)  public returns (bool success);
    function allowance(address _owner, address _spender)  public constant returns (uint256 remaining);

    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}

// File: contracts/token/ERC20Token.sol

/**
 * @title ERC20Token - ERC20 base implementation
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract ERC20Token is IERC20Token, SafeMath {
    mapping (address => uint256) public balances;
    mapping (address => mapping (address => uint256)) public allowed;

    function transfer(address _to, uint256 _value) public returns (bool) {
        require(_to != address(0));
        require(balances[msg.sender] >= _value);

        balances[msg.sender] = safeSub(balances[msg.sender], _value);
        balances[_to] = safeAdd(balances[_to], _value);
        Transfer(msg.sender, _to, _value);
        return true;
    }

    function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
        require(_to != address(0));
        require(balances[_from] >= _value && allowed[_from][msg.sender] >= _value);

        balances[_to] = safeAdd(balances[_to], _value);
        balances[_from] = safeSub(balances[_from], _value);
        allowed[_from][msg.sender] = safeSub(allowed[_from][msg.sender], _value);
        Transfer(_from, _to, _value);
        return true;
    }

    function balanceOf(address _owner) public constant returns (uint256) {
        return balances[_owner];
    }

    function approve(address _spender, uint256 _value) public returns (bool) {
        allowed[msg.sender][_spender] = _value;
        Approval(msg.sender, _spender, _value);
        return true;
    }

    function allowance(address _owner, address _spender) public constant returns (uint256) {
      return allowed[_owner][_spender];
    }
}

// File: contracts/token/ITokenEventListener.sol

/**
 * @title ITokenEventListener
 * @dev Interface which should be implemented by token listener
 */
interface ITokenEventListener {
    /**
     * @dev Function is called after token transfer/transferFrom
     * @param _from Sender address
     * @param _to Receiver address
     * @param _value Amount of tokens
     */
    function onTokenTransfer(address _from, address _to, uint256 _value) external;
}

// File: contracts/token/ManagedToken.sol

/**
 * @title ManagedToken
 * @dev ERC20 compatible token with issue and destroy facilities
 * @dev All transfers can be monitored by token event listener
 */
contract ManagedToken is ERC20Token, MultiOwnable {
    bool public allowTransfers = false;
    bool public issuanceFinished = false;

    ITokenEventListener public eventListener;

    event AllowTransfersChanged(bool _newState);
    event Issue(address indexed _to, uint256 _value);
    event Destroy(address indexed _from, uint256 _value);
    event IssuanceFinished();

    modifier transfersAllowed() {
        require(allowTransfers);
        _;
    }

    modifier canIssue() {
        require(!issuanceFinished);
        _;
    }

    /**
     * @dev ManagedToken constructor
     * @param _listener Token listener(address can be 0x0)
     * @param _owners Owners list
     */
    function ManagedToken(address _listener, address[] _owners) public {
        if(_listener != address(0)) {
            eventListener = ITokenEventListener(_listener);
        }
        _setOwners(_owners);
    }

    /**
     * @dev Enable/disable token transfers. Can be called only by owners
     * @param _allowTransfers True - allow False - disable
     */
    function setAllowTransfers(bool _allowTransfers) external onlyOwner {
        allowTransfers = _allowTransfers;
        AllowTransfersChanged(_allowTransfers);
    }

    /**
     * @dev Set/remove token event listener
     * @param _listener Listener address (Contract must implement ITokenEventListener interface)
     */
    function setListener(address _listener) public onlyOwner {
        if(_listener != address(0)) {
            eventListener = ITokenEventListener(_listener);
        } else {
            delete eventListener;
        }
    }

    function transfer(address _to, uint256 _value) public transfersAllowed returns (bool) {
        bool success = super.transfer(_to, _value);
        if(hasListener() && success) {
            eventListener.onTokenTransfer(msg.sender, _to, _value);
        }
        return success;
    }

    function transferFrom(address _from, address _to, uint256 _value) public transfersAllowed returns (bool) {
        bool success = super.transferFrom(_from, _to, _value);
        if(hasListener() && success) {
            eventListener.onTokenTransfer(_from, _to, _value);
        }
        return success;
    }

    function hasListener() internal view returns(bool) {
        if(eventListener == address(0)) {
            return false;
        }
        return true;
    }

    /**
     * @dev Issue tokens to specified wallet
     * @param _to Wallet address
     * @param _value Amount of tokens
     */
    function issue(address _to, uint256 _value) external onlyOwner canIssue {
        totalSupply = safeAdd(totalSupply, _value);
        balances[_to] = safeAdd(balances[_to], _value);
        Issue(_to, _value);
        Transfer(address(0), _to, _value);
    }

    /**
     * @dev Destroy tokens on specified address (Called by owner or token holder)
     * @dev Fund contract address must be in the list of owners to burn token during refund
     * @param _from Wallet address
     * @param _value Amount of tokens to destroy
     */
    function destroy(address _from, uint256 _value) external {
        require(ownerByAddress[msg.sender] || msg.sender == _from);
        require(balances[_from] >= _value);
        totalSupply = safeSub(totalSupply, _value);
        balances[_from] = safeSub(balances[_from], _value);
        Transfer(_from, address(0), _value);
        Destroy(_from, _value);
    }

    /**
     * @dev Increase the amount of tokens that an owner allowed to a spender.
     *
     * approve should be called when allowed[_spender] == 0. To increment
     * allowed value is better to use this function to avoid 2 calls (and wait until
     * the first transaction is mined)
     * From OpenZeppelin StandardToken.sol
     * @param _spender The address which will spend the funds.
     * @param _addedValue The amount of tokens to increase the allowance by.
     */
    function increaseApproval(address _spender, uint _addedValue) public returns (bool) {
        allowed[msg.sender][_spender] = safeAdd(allowed[msg.sender][_spender], _addedValue);
        Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
        return true;
    }

    /**
     * @dev Decrease the amount of tokens that an owner allowed to a spender.
     *
     * approve should be called when allowed[_spender] == 0. To decrement
     * allowed value is better to use this function to avoid 2 calls (and wait until
     * the first transaction is mined)
     * From OpenZeppelin StandardToken.sol
     * @param _spender The address which will spend the funds.
     * @param _subtractedValue The amount of tokens to decrease the allowance by.
     */
    function decreaseApproval(address _spender, uint _subtractedValue) public returns (bool) {
        uint oldValue = allowed[msg.sender][_spender];
        if (_subtractedValue > oldValue) {
            allowed[msg.sender][_spender] = 0;
        } else {
            allowed[msg.sender][_spender] = safeSub(oldValue, _subtractedValue);
        }
        Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
        return true;
    }

    /**
     * @dev Finish token issuance
     * @return True if success
     */
    function finishIssuance() public onlyOwner returns (bool) {
        issuanceFinished = true;
        IssuanceFinished();
        return true;
    }
}

// File: contracts/Fund.sol

contract Fund is ICrowdsaleFund, SafeMath, MultiOwnable {
    enum FundState {
        Crowdsale,
        CrowdsaleRefund,
        TeamWithdraw,
        Refund
    }

    FundState public state = FundState.Crowdsale;
    ManagedToken public token;

    uint256 public constant INITIAL_TAP = 192901234567901; // (wei/sec) == 500 ether/month

    address public teamWallet;
    uint256 public crowdsaleEndDate;

    address public referralTokenWallet;
    address public foundationTokenWallet;
    address public reserveTokenWallet;
    address public bountyTokenWallet;
    address public companyTokenWallet;
    address public advisorTokenWallet;
    address public lockedTokenAddress;
    address public refundManager;

    uint256 public tap;
    uint256 public lastWithdrawTime = 0;
    uint256 public firstWithdrawAmount = 0;

    address public crowdsaleAddress;
    mapping(address => uint256) public contributions;

    event RefundContributor(address tokenHolder, uint256 amountWei, uint256 timestamp);
    event RefundHolder(address tokenHolder, uint256 amountWei, uint256 tokenAmount, uint256 timestamp);
    event Withdraw(uint256 amountWei, uint256 timestamp);
    event RefundEnabled(address initiatorAddress);

    /**
     * @dev Fund constructor
     * @param _teamWallet Withdraw functions transfers ether to this address
     * @param _referralTokenWallet Referral wallet address
     * @param _companyTokenWallet Company wallet address
     * @param _reserveTokenWallet Reserve wallet address
     * @param _bountyTokenWallet Bounty wallet address
     * @param _advisorTokenWallet Advisor wallet address
     * @param _owners Contract owners
     */
    function Fund(
        address _teamWallet,
        address _referralTokenWallet,
        address _foundationTokenWallet,
        address _companyTokenWallet,
        address _reserveTokenWallet,
        address _bountyTokenWallet,
        address _advisorTokenWallet,
        address _refundManager,
        address[] _owners
    ) public
    {
        teamWallet = _teamWallet;
        referralTokenWallet = _referralTokenWallet;
        foundationTokenWallet = _foundationTokenWallet;
        companyTokenWallet = _companyTokenWallet;
        reserveTokenWallet = _reserveTokenWallet;
        bountyTokenWallet = _bountyTokenWallet;
        advisorTokenWallet = _advisorTokenWallet;
        refundManager = _refundManager;
        _setOwners(_owners);
    }

    modifier withdrawEnabled() {
        require(canWithdraw());
        _;
    }

    modifier onlyCrowdsale() {
        require(msg.sender == crowdsaleAddress);
        _;
    }

    function canWithdraw() public returns(bool);

    function setCrowdsaleAddress(address _crowdsaleAddress) public onlyOwner {
        require(crowdsaleAddress == address(0));
        crowdsaleAddress = _crowdsaleAddress;
    }

    function setTokenAddress(address _tokenAddress) public onlyOwner {
        require(address(token) == address(0));
        token = ManagedToken(_tokenAddress);
    }

    function setLockedTokenAddress(address _lockedTokenAddress) public onlyOwner {
        require(address(lockedTokenAddress) == address(0));
        lockedTokenAddress = _lockedTokenAddress;
    }

    /**
     * @dev Process crowdsale contribution
     */
    function processContribution(address contributor) external payable onlyCrowdsale {
        require(state == FundState.Crowdsale);
        uint256 totalContribution = safeAdd(contributions[contributor], msg.value);
        contributions[contributor] = totalContribution;
    }

    /**
     * @dev Callback is called after crowdsale finalization if soft cap is reached
     */
    function onCrowdsaleEnd() external onlyCrowdsale {
        state = FundState.TeamWithdraw;
        ISimpleCrowdsale crowdsale = ISimpleCrowdsale(crowdsaleAddress);
        firstWithdrawAmount = safeDiv(crowdsale.getSoftCap(), 2);
        lastWithdrawTime = now;
        tap = INITIAL_TAP;
        crowdsaleEndDate = now;
    }

    /**
     * @dev Callback is called after crowdsale finalization if soft cap is not reached
     */
    function enableCrowdsaleRefund() external onlyCrowdsale {
        require(state == FundState.Crowdsale);
        state = FundState.CrowdsaleRefund;
    }

    /**
    * @dev Function is called by contributor to refund payments if crowdsale failed to reach soft cap
    */
    function refundCrowdsaleContributor() external {
        require(state == FundState.CrowdsaleRefund);
        require(contributions[msg.sender] > 0);

        uint256 refundAmount = contributions[msg.sender];
        contributions[msg.sender] = 0;
        token.destroy(msg.sender, token.balanceOf(msg.sender));
        msg.sender.transfer(refundAmount);
        RefundContributor(msg.sender, refundAmount, now);
    }

    /**
    * @dev Function is called by owner to refund payments if crowdsale failed to reach soft cap
    */
    function autoRefundCrowdsaleContributor(address contributorAddress) external {
        require(ownerByAddress[msg.sender] == true || msg.sender == refundManager);
        require(state == FundState.CrowdsaleRefund);
        require(contributions[contributorAddress] > 0);

        uint256 refundAmount = contributions[contributorAddress];
        contributions[contributorAddress] = 0;
        token.destroy(contributorAddress, token.balanceOf(contributorAddress));
        contributorAddress.transfer(refundAmount);
        RefundContributor(contributorAddress, refundAmount, now);
    }

    /**
     * @dev Decrease tap amount
     * @param _tap New tap value
     */
    function decTap(uint256 _tap) external onlyOwner {
        require(state == FundState.TeamWithdraw);
        require(_tap < tap);
        tap = _tap;
    }

    function getCurrentTapAmount() public constant returns(uint256) {
        if(state != FundState.TeamWithdraw) {
            return 0;
        }
        return calcTapAmount();
    }

    function calcTapAmount() internal view returns(uint256) {
        uint256 amount = safeMul(safeSub(now, lastWithdrawTime), tap);
        if(address(this).balance < amount) {
            amount = address(this).balance;
        }
        return amount;
    }

    function firstWithdraw() public onlyOwner withdrawEnabled {
        require(firstWithdrawAmount > 0);
        uint256 amount = firstWithdrawAmount;
        firstWithdrawAmount = 0;
        teamWallet.transfer(amount);
        Withdraw(amount, now);
    }

    /**
     * @dev Withdraw tap amount
     */
    function withdraw() public onlyOwner withdrawEnabled {
        require(state == FundState.TeamWithdraw);
        uint256 amount = calcTapAmount();
        lastWithdrawTime = now;
        teamWallet.transfer(amount);
        Withdraw(amount, now);
    }

    // Refund
    /**
     * @dev Called to start refunding
     */
    function enableRefund() internal {
        require(state == FundState.TeamWithdraw);
        state = FundState.Refund;
        token.destroy(lockedTokenAddress, token.balanceOf(lockedTokenAddress));
        token.destroy(companyTokenWallet, token.balanceOf(companyTokenWallet));
        token.destroy(reserveTokenWallet, token.balanceOf(reserveTokenWallet));
        token.destroy(foundationTokenWallet, token.balanceOf(foundationTokenWallet));
        token.destroy(bountyTokenWallet, token.balanceOf(bountyTokenWallet));
        token.destroy(referralTokenWallet, token.balanceOf(referralTokenWallet));
        token.destroy(advisorTokenWallet, token.balanceOf(advisorTokenWallet));
        RefundEnabled(msg.sender);
    }

    /**
    * @dev Function is called by contributor to refund
    * Buy user tokens for refundTokenPrice and destroy them
    */
    function refundTokenHolder() public {
        require(state == FundState.Refund);

        uint256 tokenBalance = token.balanceOf(msg.sender);
        require(tokenBalance > 0);
        uint256 refundAmount = safeDiv(safeMul(tokenBalance, address(this).balance), token.totalSupply());
        require(refundAmount > 0);

        token.destroy(msg.sender, tokenBalance);
        msg.sender.transfer(refundAmount);

        RefundHolder(msg.sender, refundAmount, tokenBalance, now);
    }
}

// File: contracts/fund/IPollManagedFund.sol

/**
 * @title IPollManagedFund
 * @dev Fund callbacks used by polling contracts
 */
interface IPollManagedFund {
    /**
     * @dev TapPoll callback
     * @param agree True if new tap value is accepted by majority of contributors
     * @param _tap New tap value
     */
    function onTapPollFinish(bool agree, uint256 _tap) external;

    /**
     * @dev RefundPoll callback
     * @param agree True if contributors decided to allow refunding
     */
    function onRefundPollFinish(bool agree) external;
}

// File: contracts/poll/BasePoll.sol

/**
 * @title BasePoll
 * @dev Abstract base class for polling contracts
 */
contract BasePoll is SafeMath {
    struct Vote {
        uint256 time;
        uint256 weight;
        bool agree;
    }

    uint256 public constant MAX_TOKENS_WEIGHT_DENOM = 1000;

    IERC20Token public token;
    address public fundAddress;

    uint256 public startTime;
    uint256 public endTime;
    bool checkTransfersAfterEnd;

    uint256 public yesCounter = 0;
    uint256 public noCounter = 0;
    uint256 public totalVoted = 0;

    bool public finalized;
    mapping(address => Vote) public votesByAddress;

    modifier checkTime() {
        require(now >= startTime && now <= endTime);
        _;
    }

    modifier notFinalized() {
        require(!finalized);
        _;
    }

    /**
     * @dev BasePoll constructor
     * @param _tokenAddress ERC20 compatible token contract address
     * @param _fundAddress Fund contract address
     * @param _startTime Poll start time
     * @param _endTime Poll end time
     */
    function BasePoll(address _tokenAddress, address _fundAddress, uint256 _startTime, uint256 _endTime, bool _checkTransfersAfterEnd) public {
        require(_tokenAddress != address(0));
        require(_startTime >= now && _endTime > _startTime);

        token = IERC20Token(_tokenAddress);
        fundAddress = _fundAddress;
        startTime = _startTime;
        endTime = _endTime;
        finalized = false;
        checkTransfersAfterEnd = _checkTransfersAfterEnd;
    }

    /**
     * @dev Process user`s vote
     * @param agree True if user endorses the proposal else False
     */
    function vote(bool agree) public checkTime {
        require(votesByAddress[msg.sender].time == 0);

        uint256 voiceWeight = token.balanceOf(msg.sender);
        uint256 maxVoiceWeight = safeDiv(token.totalSupply(), MAX_TOKENS_WEIGHT_DENOM);
        voiceWeight =  voiceWeight <= maxVoiceWeight ? voiceWeight : maxVoiceWeight;

        if(agree) {
            yesCounter = safeAdd(yesCounter, voiceWeight);
        } else {
            noCounter = safeAdd(noCounter, voiceWeight);

        }

        votesByAddress[msg.sender].time = now;
        votesByAddress[msg.sender].weight = voiceWeight;
        votesByAddress[msg.sender].agree = agree;

        totalVoted = safeAdd(totalVoted, 1);
    }

    /**
     * @dev Revoke user`s vote
     */
    function revokeVote() public checkTime {
        require(votesByAddress[msg.sender].time > 0);

        uint256 voiceWeight = votesByAddress[msg.sender].weight;
        bool agree = votesByAddress[msg.sender].agree;

        votesByAddress[msg.sender].time = 0;
        votesByAddress[msg.sender].weight = 0;
        votesByAddress[msg.sender].agree = false;

        totalVoted = safeSub(totalVoted, 1);
        if(agree) {
            yesCounter = safeSub(yesCounter, voiceWeight);
        } else {
            noCounter = safeSub(noCounter, voiceWeight);
        }
    }

    /**
     * @dev Function is called after token transfer from user`s wallet to check and correct user`s vote
     *
     */
    function onTokenTransfer(address tokenHolder, uint256 amount) public {
        require(msg.sender == fundAddress);
        if(votesByAddress[tokenHolder].time == 0) {
            return;
        }
        if(!checkTransfersAfterEnd) {
             if(finalized || (now < startTime || now > endTime)) {
                 return;
             }
        }

        if(token.balanceOf(tokenHolder) >= votesByAddress[tokenHolder].weight) {
            return;
        }
        uint256 voiceWeight = amount;
        if(amount > votesByAddress[tokenHolder].weight) {
            voiceWeight = votesByAddress[tokenHolder].weight;
        }

        if(votesByAddress[tokenHolder].agree) {
            yesCounter = safeSub(yesCounter, voiceWeight);
        } else {
            noCounter = safeSub(noCounter, voiceWeight);
        }
        votesByAddress[tokenHolder].weight = safeSub(votesByAddress[tokenHolder].weight, voiceWeight);
    }

    /**
     * Finalize poll and call onPollFinish callback with result
     */
    function tryToFinalize() public notFinalized returns(bool) {
        if(now < endTime) {
            return false;
        }
        finalized = true;
        onPollFinish(isSubjectApproved());
        return true;
    }

    function isNowApproved() public view returns(bool) {
        return isSubjectApproved();
    }

    function isSubjectApproved() internal view returns(bool) {
        return yesCounter > noCounter;
    }

    /**
     * @dev callback called after poll finalization
     */
    function onPollFinish(bool agree) internal;
}

// File: contracts/RefundPoll.sol

/**
 * @title RefundPoll
 * @dev Enables fund refund mode
 */
contract RefundPoll is BasePoll {
    uint256 public holdEndTime = 0;

    /**
     * RefundPoll constructor
     * @param _tokenAddress ERC20 compatible token contract address
     * @param _fundAddress Fund contract address
     * @param _startTime Poll start time
     * @param _endTime Poll end time
     */
    function RefundPoll(
        address _tokenAddress,
        address _fundAddress,
        uint256 _startTime,
        uint256 _endTime,
        uint256 _holdEndTime,
        bool _checkTransfersAfterEnd
    ) public
        BasePoll(_tokenAddress, _fundAddress, _startTime, _endTime, _checkTransfersAfterEnd)
    {
        holdEndTime = _holdEndTime;
    }

    function tryToFinalize() public returns(bool) {
        if(holdEndTime > 0 && holdEndTime > endTime) {
            require(now >= holdEndTime);
        } else {
            require(now >= endTime);
        }

        finalized = true;
        onPollFinish(isSubjectApproved());
        return true;
    }

    function isSubjectApproved() internal view returns(bool) {
        return yesCounter > noCounter && yesCounter >= safeDiv(token.totalSupply(), 3);
    }

    function onPollFinish(bool agree) internal {
        IPollManagedFund fund = IPollManagedFund(fundAddress);
        fund.onRefundPollFinish(agree);
    }

}

// File: contracts/TapPoll.sol

/**
 * @title TapPoll
 * @dev Poll to increase tap amount
 */
contract TapPoll is BasePoll {
    uint256 public tap;
    uint256 public minTokensPerc = 0;

    /**
     * TapPoll constructor
     * @param _tap New tap value
     * @param _tokenAddress ERC20 compatible token contract address
     * @param _fundAddress Fund contract address
     * @param _startTime Poll start time
     * @param _endTime Poll end time
     * @param _minTokensPerc - Min percent of tokens from totalSupply where poll is considered to be fulfilled
     */
    function TapPoll(
        uint256 _tap,
        address _tokenAddress,
        address _fundAddress,
        uint256 _startTime,
        uint256 _endTime,
        uint256 _minTokensPerc
    ) public
        BasePoll(_tokenAddress, _fundAddress, _startTime, _endTime, false)
    {
        tap = _tap;
        minTokensPerc = _minTokensPerc;
    }

    function onPollFinish(bool agree) internal {
        IPollManagedFund fund = IPollManagedFund(fundAddress);
        fund.onTapPollFinish(agree, tap);
    }

    function getVotedTokensPerc() public view returns(uint256) {
        return safeDiv(safeMul(safeAdd(yesCounter, noCounter), 100), token.totalSupply());
    }

    function isSubjectApproved() internal view returns(bool) {
        return yesCounter > noCounter && getVotedTokensPerc() >= minTokensPerc;
    }
}

// File: contracts/PollManagedFund.sol

/**
 * @title PollManagedFund
 * @dev Fund controlled by users
 */
contract PollManagedFund is Fund, DateTime, ITokenEventListener {
    uint256 public constant TAP_POLL_DURATION = 3 days;
    uint256 public constant REFUND_POLL_DURATION = 7 days;
    uint256 public constant MAX_VOTED_TOKEN_PERC = 10;

    TapPoll public tapPoll;
    RefundPoll public refundPoll;

    uint256 public minVotedTokensPerc = 0;
    uint256 public secondRefundPollDate = 0;
    bool public isWithdrawEnabled = true;

    uint256[] public refundPollDates = [
        1530403200, // 01.07.2018
        1538352000, // 01.10.2018
        1546300800, // 01.01.2019
        1554076800, // 01.04.2019
        1561939200, // 01.07.2019
        1569888000, // 01.10.2019
        1577836800, // 01.01.2020
        1585699200  // 01.04.2020
    ];

    modifier onlyTokenHolder() {
        require(token.balanceOf(msg.sender) > 0);
        _;
    }

    event TapPollCreated();
    event TapPollFinished(bool approved, uint256 _tap);
    event RefundPollCreated();
    event RefundPollFinished(bool approved);

    /**
     * @dev PollManagedFund constructor
     * params - see Fund constructor
     */
    function PollManagedFund(
        address _teamWallet,
        address _referralTokenWallet,
        address _foundationTokenWallet,
        address _companyTokenWallet,
        address _reserveTokenWallet,
        address _bountyTokenWallet,
        address _advisorTokenWallet,
        address _refundManager,
        address[] _owners
        ) public
    Fund(_teamWallet, _referralTokenWallet, _foundationTokenWallet, _companyTokenWallet, _reserveTokenWallet, _bountyTokenWallet, _advisorTokenWallet, _refundManager, _owners)
    {
    }

    function canWithdraw() public returns(bool) {
        if(
            address(refundPoll) != address(0) &&
            !refundPoll.finalized() &&
            refundPoll.holdEndTime() > 0 &&
            now >= refundPoll.holdEndTime() &&
            refundPoll.isNowApproved()
        ) {
            return false;
        }
        return isWithdrawEnabled;
    }

    /**
     * @dev ITokenEventListener implementation. Notify active poll contracts about token transfers
     */
    function onTokenTransfer(address _from, address /*_to*/, uint256 _value) external {
        require(msg.sender == address(token));
        if(address(tapPoll) != address(0) && !tapPoll.finalized()) {
            tapPoll.onTokenTransfer(_from, _value);
        }
         if(address(refundPoll) != address(0) && !refundPoll.finalized()) {
            refundPoll.onTokenTransfer(_from, _value);
        }
    }

    /**
     * @dev Update minVotedTokensPerc value after tap poll.
     * Set new value == 50% from current voted tokens amount
     */
    function updateMinVotedTokens(uint256 _minVotedTokensPerc) internal {
        uint256 newPerc = safeDiv(_minVotedTokensPerc, 2);
        if(newPerc > MAX_VOTED_TOKEN_PERC) {
            minVotedTokensPerc = MAX_VOTED_TOKEN_PERC;
            return;
        }
        minVotedTokensPerc = newPerc;
    }

    // Tap poll
    function createTapPoll(uint8 tapIncPerc) public onlyOwner {
        require(state == FundState.TeamWithdraw);
        require(tapPoll == address(0));
        require(getDay(now) == 10);
        require(tapIncPerc <= 50);
        uint256 _tap = safeAdd(tap, safeDiv(safeMul(tap, tapIncPerc), 100));
        uint256 startTime = now;
        uint256 endTime = startTime + TAP_POLL_DURATION;
        tapPoll = new TapPoll(_tap, token, this, startTime, endTime, minVotedTokensPerc);
        TapPollCreated();
    }

    function onTapPollFinish(bool agree, uint256 _tap) external {
        require(msg.sender == address(tapPoll) && tapPoll.finalized());
        if(agree) {
            tap = _tap;
        }
        updateMinVotedTokens(tapPoll.getVotedTokensPerc());
        TapPollFinished(agree, _tap);
        delete tapPoll;
    }

    // Refund poll
    function checkRefundPollDate() internal view returns(bool) {
        if(secondRefundPollDate > 0 && now >= secondRefundPollDate && now <= safeAdd(secondRefundPollDate, 1 days)) {
            return true;
        }

        for(uint i; i < refundPollDates.length; i++) {
            if(now >= refundPollDates[i] && now <= safeAdd(refundPollDates[i], 1 days)) {
                return true;
            }
        }
        return false;
    }

    function createRefundPoll() public onlyTokenHolder {
        require(state == FundState.TeamWithdraw);
        require(address(refundPoll) == address(0));
        require(checkRefundPollDate());

        if(secondRefundPollDate > 0 && now > safeAdd(secondRefundPollDate, 1 days)) {
            secondRefundPollDate = 0;
        }

        uint256 startTime = now;
        uint256 endTime = startTime + REFUND_POLL_DURATION;
        bool isFirstRefund = secondRefundPollDate == 0;
        uint256 holdEndTime = 0;

        if(isFirstRefund) {
            holdEndTime = toTimestamp(
                getYear(startTime),
                getMonth(startTime) + 1,
                1
            );
        }
        refundPoll = new RefundPoll(token, this, startTime, endTime, holdEndTime, isFirstRefund);
        RefundPollCreated();
    }

    function onRefundPollFinish(bool agree) external {
        require(msg.sender == address(refundPoll) && refundPoll.finalized());
        if(agree) {
            if(secondRefundPollDate > 0) {
                enableRefund();
            } else {
                uint256 startTime = refundPoll.startTime();
                secondRefundPollDate = toTimestamp(
                    getYear(startTime),
                    getMonth(startTime) + 2,
                    1
                );
                isWithdrawEnabled = false;
            }
        } else {
            secondRefundPollDate = 0;
            isWithdrawEnabled = true;
        }
        RefundPollFinished(agree);

        delete refundPoll;
    }

    function forceRefund() public {
        require(msg.sender == refundManager);
        enableRefund();
    }
}

    Contract ABI  
[{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"owners","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tapIncPerc","type":"uint8"}],"name":"createTapPoll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"TAP_POLL_DURATION","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"REFUND_POLL_DURATION","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"crowdsaleEndDate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_crowdsaleAddress","type":"address"}],"name":"setCrowdsaleAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenAddress","type":"address"}],"name":"setTokenAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"firstWithdrawAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"agree","type":"bool"},{"name":"_tap","type":"uint256"}],"name":"onTapPollFinish","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"crowdsaleAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tap","type":"uint256"}],"name":"decTap","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"enableCrowdsaleRefund","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"timestamp","type":"uint256"}],"name":"getHour","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[],"name":"createRefundPoll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"contributions","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"manager","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"timestamp","type":"uint256"}],"name":"getWeekday","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"teamWallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"refundPollDates","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"onCrowdsaleEnd","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"year","type":"uint16"},{"name":"month","type":"uint8"},{"name":"day","type":"uint8"},{"name":"hour","type":"uint8"},{"name":"minute","type":"uint8"}],"name":"toTimestamp","outputs":[{"name":"timestamp","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"timestamp","type":"uint256"}],"name":"getDay","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"","type":"address"},{"name":"_value","type":"uint256"}],"name":"onTokenTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentTapAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_lockedTokenAddress","type":"address"}],"name":"setLockedTokenAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"year","type":"uint16"},{"name":"month","type":"uint8"},{"name":"day","type":"uint8"},{"name":"hour","type":"uint8"}],"name":"toTimestamp","outputs":[{"name":"timestamp","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"minVotedTokensPerc","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"refundManager","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isWithdrawEnabled","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"agree","type":"bool"}],"name":"onRefundPollFinish","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"timestamp","type":"uint256"}],"name":"getSecond","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"year","type":"uint16"},{"name":"month","type":"uint8"},{"name":"day","type":"uint8"}],"name":"toTimestamp","outputs":[{"name":"timestamp","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"foundationTokenWallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"INITIAL_TAP","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"year","type":"uint16"},{"name":"month","type":"uint8"},{"name":"day","type":"uint8"},{"name":"hour","type":"uint8"},{"name":"minute","type":"uint8"},{"name":"second","type":"uint8"}],"name":"toTimestamp","outputs":[{"name":"timestamp","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"reserveTokenWallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"timestamp","type":"uint256"}],"name":"getYear","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"MAX_VOTED_TOKEN_PERC","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getOwners","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"timestamp","type":"uint256"}],"name":"getMonth","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"lockedTokenAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"year","type":"uint16"}],"name":"isLeapYear","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"contributor","type":"address"}],"name":"processContribution","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"lastWithdrawTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"year","type":"uint256"}],"name":"leapYearsBefore","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"month","type":"uint8"},{"name":"year","type":"uint16"}],"name":"getDaysInMonth","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"secondRefundPollDate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"canWithdraw","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"forceRefund","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"state","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"advisorTokenWallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tapPoll","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"referralTokenWallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bountyTokenWallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"refundPoll","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"contributorAddress","type":"address"}],"name":"autoRefundCrowdsaleContributor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"firstWithdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"ownerByAddress","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"companyTokenWallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_owners","type":"address[]"}],"name":"setOwners","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"timestamp","type":"uint256"}],"name":"getMinute","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[],"name":"refundTokenHolder","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"refundCrowdsaleContributor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_teamWallet","type":"address"},{"name":"_referralTokenWallet","type":"address"},{"name":"_foundationTokenWallet","type":"address"},{"name":"_companyTokenWallet","type":"address"},{"name":"_reserveTokenWallet","type":"address"},{"name":"_bountyTokenWallet","type":"address"},{"name":"_advisorTokenWallet","type":"address"},{"name":"_refundManager","type":"address"},{"name":"_owners","type":"address[]"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"TapPollCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"approved","type":"bool"},{"indexed":false,"name":"_tap","type":"uint256"}],"name":"TapPollFinished","type":"event"},{"anonymous":false,"inputs":[],"name":"RefundPollCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"approved","type":"bool"}],"name":"RefundPollFinished","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenHolder","type":"address"},{"indexed":false,"name":"amountWei","type":"uint256"},{"indexed":false,"name":"timestamp","type":"uint256"}],"name":"RefundContributor","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenHolder","type":"address"},{"indexed":false,"name":"amountWei","type":"uint256"},{"indexed":false,"name":"tokenAmount","type":"uint256"},{"indexed":false,"name":"timestamp","type":"uint256"}],"name":"RefundHolder","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amountWei","type":"uint256"},{"indexed":false,"name":"timestamp","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"initiatorAddress","type":"address"}],"name":"RefundEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owners","type":"address[]"}],"name":"SetOwners","type":"event"}]

  Contract Creation Code Switch To Opcodes View
606060409081526003805460ff199081169091556000600f8190556010819055601581905560165560178054909116600117905561010090519081016040908152635b3819808252635bb163806020830152635c2aad8090820152635ca154806060820152635d194d006080820152635d92970060a0820152635e0be10060c0820152635e83d98060e08201526200009c90601890600862000313565b503415620000a957600080fd5b60405162004a7038038062004a7083398101604052808051919060200180519190602001805191906020018051919060200180519190602001805191906020018051919060200180519190602001805160008054600160a060020a031990811633600160a060020a03908116919091179092556004805482168e84161790556006805482168d84161790556007805482168c8416179055600a805482168b84161790556008805482168a8416179055600980548216898416179055600b80548216888416179055600d8054909116918616919091179055919091019050888888888888888888620001a881640100000000620001c0810262002f521704565b5050505050505050505050505050505050506200041a565b6000805b6001548210156200022657600060026000600185815481101515620001e557fe5b600091825260208083209190910154600160a060020a031683528201929092526040019020805460ff191691151591909117905560019190910190620001c4565b5060005b825181101562000282576001600260008584815181106200024757fe5b90602001906020020151600160a060020a031681526020810191909152604001600020805460ff19169115159190911790556001016200022a565b6001838051620002979291602001906200036b565b507f9465cd279c2de393c5568ae444599e3644e3d1864ca2c05ced8a654df2aea3cb8360405160208082528190810183818151815260200191508051906020019060200280838360005b83811015620002fb578082015183820152602001620002e1565b505050509050019250505060405180910390a1505050565b82805482825590600052602060002090810192821562000359579160200282015b8281111562000359578251829063ffffffff1690559160200191906001019062000334565b5062000367929150620003d3565b5090565b828054828255906000526020600020908101928215620003c5579160200282015b82811115620003c55782518254600160a060020a031916600160a060020a0391909116178255602092909201916001909101906200038c565b5062000367929150620003f3565b620003f091905b80821115620003675760008155600101620003da565b90565b620003f091905b8082111562000367578054600160a060020a0319168155600101620003fa565b614646806200042a6000396000f300606060405260043610620003355763ffffffff60e060020a600035041663025e7c2781146200033a578063026eca12146200036f57806302fc28c4146200038d57806308867fc214620003b5578063192f107614620003cb5780631f35bc4014620003e157806326a4e8d2146200040357806326b52faf146200042557806329c90b63146200043b57806331d2f891146200045957806336e61cf7146200046f5780633b64e77e14620004885780633ccfd60b146200049e5780633e239e1a14620004b457806340e6b00a14620004e357806342e94c9014620004f9578063481c6a75146200051b5780634ac1ad78146200053157806359927044146200054a5780635f58384614620005605780636252c127146200057957806362ba9687146200058f57806365c7284014620005c4578063677ba3d314620005dd578063774a97cf14620006085780637ddbf0ed146200061e5780637f791833146200064057806384219204146200066f57806387174c3e1462000685578063880dc4e6146200069b57806389ea2cb714620006c55780638aa001fc14620006e05780638c8d98a014620006f9578063903171ae14620007225780639054bbb614620007385780639054bdec146200074e57806392a0fd64146200078957806392d66313146200079f578063962c9c8d14620007cf578063a0e67e2b14620007e5578063a324ad241462000850578063a666ff3c1462000869578063a6f0e577146200087f578063a78a651a146200089c578063ab23151114620008b2578063b199993714620008c8578063b238ad0e14620008e1578063b465e52f1462000904578063b51459fe146200091a578063bd7427f81462000930578063c19d93fb1462000946578063c5f5ce211462000981578063cae6b9c51462000997578063cc96019f14620009ad578063d0e6cfec14620009c3578063d66f146d14620009d9578063e2d2a86814620009ef578063e9b5a2f71462000a11578063eb6b192f1462000a27578063f190a7931462000a49578063fa4d36981462000a5f578063fa93f8831462000ab1578063fbbfe8301462000aca578063fc0c546a1462000ae0578063fd2210311462000af6578063ff01ffa81462000b0c575b600080fd5b34156200034657600080fd5b6200035360043562000b22565b604051600160a060020a03909116815260200160405180910390f35b34156200037b57600080fd5b6200038b60ff6004351662000b4b565b005b34156200039957600080fd5b620003a362000cdf565b60405190815260200160405180910390f35b3415620003c157600080fd5b620003a362000ce6565b3415620003d757600080fd5b620003a362000ced565b3415620003ed57600080fd5b6200038b600160a060020a036004351662000cf3565b34156200040f57600080fd5b6200038b600160a060020a036004351662000d57565b34156200043157600080fd5b620003a362000dd3565b34156200044757600080fd5b6200038b600435151560243562000dd9565b34156200046557600080fd5b6200035362000f18565b34156200047b57600080fd5b6200038b60043562000f27565b34156200049457600080fd5b6200038b62000f85565b3415620004aa57600080fd5b6200038b62000fcf565b3415620004c057600080fd5b620004cd600435620010b1565b60405160ff909116815260200160405180910390f35b3415620004ef57600080fd5b6200038b620010cf565b34156200050557600080fd5b620003a3600160a060020a0360043516620012db565b34156200052757600080fd5b62000353620012ed565b34156200053d57600080fd5b620004cd600435620012fc565b34156200055657600080fd5b620003536200130f565b34156200056c57600080fd5b620003a36004356200131e565b34156200058557600080fd5b6200038b6200133e565b34156200059b57600080fd5b620003a361ffff6004351660ff60243581169060443581169060643581169060843516620013e9565b3415620005d057600080fd5b620004cd60043562001406565b3415620005e957600080fd5b6200038b600160a060020a03600435811690602435166044356200141d565b34156200061457600080fd5b620003a362001601565b34156200062a57600080fd5b6200038b600160a060020a036004351662001636565b34156200064c57600080fd5b620003a361ffff6004351660ff602435811690604435811690606435166200169a565b34156200067b57600080fd5b620003a3620016b6565b34156200069157600080fd5b62000353620016bc565b3415620006a757600080fd5b620006b1620016cb565b604051901515815260200160405180910390f35b3415620006d157600080fd5b6200038b6004351515620016d4565b3415620006ec57600080fd5b620004cd60043562001868565b34156200070557600080fd5b620003a361ffff6004351660ff6024358116906044351662001873565b34156200072e57600080fd5b620003536200188f565b34156200074457600080fd5b620003a36200189e565b34156200075a57600080fd5b620003a361ffff6004351660ff60243581169060443581169060643581169060843581169060a43516620018a8565b34156200079557600080fd5b62000353620019fd565b3415620007ab57600080fd5b620007b860043562001a0c565b60405161ffff909116815260200160405180910390f35b3415620007db57600080fd5b620003a362001aa6565b3415620007f157600080fd5b620007fb62001aab565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156200083c57808201518382015260200162000822565b505050509050019250505060405180910390f35b34156200085c57600080fd5b620004cd60043562001b17565b34156200087557600080fd5b6200035362001b2e565b34156200088b57600080fd5b620006b161ffff6004351662001b3d565b6200038b600160a060020a036004351662001b91565b3415620008be57600080fd5b620003a362001c14565b3415620008d457600080fd5b620003a360043562001c1a565b3415620008ed57600080fd5b620004cd60ff6004351661ffff6024351662001c35565b34156200091057600080fd5b620003a362001d0e565b34156200092657600080fd5b620006b162001d14565b34156200093c57600080fd5b6200038b62001eca565b34156200095257600080fd5b6200095c62001ef2565b604051808260038111156200096d57fe5b60ff16815260200191505060405180910390f35b34156200098d57600080fd5b6200035362001efb565b3415620009a357600080fd5b6200035362001f0a565b3415620009b957600080fd5b6200035362001f19565b3415620009cf57600080fd5b6200035362001f28565b3415620009e557600080fd5b6200035362001f37565b3415620009fb57600080fd5b6200038b600160a060020a036004351662001f46565b341562000a1d57600080fd5b6200038b6200214a565b341562000a3357600080fd5b620006b1600160a060020a0360043516620021da565b341562000a5557600080fd5b62000353620021ef565b341562000a6b57600080fd5b6200038b6004602481358181019083013580602081810201604051908101604052809392919081815260200183836020028082843750949650620021fe95505050505050565b341562000abd57600080fd5b620004cd60043562002228565b341562000ad657600080fd5b6200038b62002234565b341562000aec57600080fd5b6200035362002464565b341562000b0257600080fd5b620003a362002478565b341562000b1857600080fd5b6200038b6200247e565b600180548290811062000b3157fe5b600091825260209091200154600160a060020a0316905081565b600160a060020a0333166000908152600260205260408120548190819060ff16151560011462000b7a57600080fd5b60026003805460ff169081111562000b8e57fe5b1462000b9957600080fd5b601354600160a060020a03161562000bb057600080fd5b62000bbb4262001406565b60ff16600a14151562000bcd57600080fd5b603260ff8516111562000bdf57600080fd5b62000c09600e5462000c0362000bfb600e548860ff166200263c565b60646200266a565b62002682565b92504291506203f4808201905082600360019054906101000a9004600160a060020a031630848460155462000c3d620030b8565b958652600160a060020a039485166020870152929093166040808601919091526060850191909152608084019290925260a083015260c09091019051809103906000f080151562000c8d57600080fd5b60138054600160a060020a031916600160a060020a03929092169190911790557f330d2f37998c8839fca77205925adc69e2c4aa616175f8b357f42f84d06c454960405160405180910390a150505050565b6203f48081565b62093a8081565b60055481565b600160a060020a03331660009081526002602052604090205460ff16151560011462000d1e57600080fd5b601154600160a060020a03161562000d3557600080fd5b60118054600160a060020a031916600160a060020a0392909216919091179055565b600160a060020a03331660009081526002602052604090205460ff16151560011462000d8257600080fd5b6003546101009004600160a060020a03161562000d9e57600080fd5b60038054600160a060020a039092166101000274ffffffffffffffffffffffffffffffffffffffff0019909216919091179055565b60105481565b60135433600160a060020a03908116911614801562000e4c5750601354600160a060020a031663b3f05b976040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562000e3357600080fd5b5af1151562000e4157600080fd5b505050604051805190505b151562000e5857600080fd5b811562000e6557600e8190555b60135462000ec890600160a060020a0316632c24909c6040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562000eaa57600080fd5b5af1151562000eb857600080fd5b5050506040518051905062002692565b7fecb94f7dd81b39de2b8d95fa8a4d9f0a8723d7a974187fef4fa5305ca5d162488282604051911515825260208201526040908101905180910390a1505060138054600160a060020a0319169055565b601154600160a060020a031681565b600160a060020a03331660009081526002602052604090205460ff16151560011462000f5257600080fd5b60026003805460ff169081111562000f6657fe5b1462000f7157600080fd5b600e54811062000f8057600080fd5b600e55565b60115433600160a060020a0390811691161462000fa157600080fd5b60006003805460ff169081111562000fb557fe5b1462000fc057600080fd5b6003805460ff19166001179055565b600160a060020a03331660009081526002602052604081205460ff16151560011462000ffa57600080fd5b6200100462001d14565b15156200101057600080fd5b60026003805460ff16908111156200102457fe5b146200102f57600080fd5b62001039620026c2565b42600f55600454909150600160a060020a031681156108fc0282604051600060405180830381858888f1935050505015156200107457600080fd5b7f56ca301a9219608c91e7bcee90e083c19671d2cdcc96752c7af291cee5f9c8c8814260405191825260208201526040908101905180910390a150565b60006018603c8084045b04811515620010c657fe5b0690505b919050565b6000806000806000600360019054906101000a9004600160a060020a0316600160a060020a03166370a082313360405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156200113b57600080fd5b5af115156200114957600080fd5b505050604051805190501115156200116057600080fd5b60026003805460ff16908111156200117457fe5b146200117f57600080fd5b601454600160a060020a0316156200119657600080fd5b620011a06200270a565b1515620011ac57600080fd5b6000601654118015620011ce5750620011cb6016546201518062002682565b42115b15620011da5760006016555b505060165442925062093a808301915015600081156200121c5762001219620012038562001a0c565b6200120e8662001b17565b600101600162001873565b90505b6003546101009004600160a060020a031630858584866200123c620030c9565b600160a060020a0396871681529490951660208501526040808501939093526060840191909152608083015291151560a082015260c0019051809103906000f08015156200128957600080fd5b60148054600160a060020a031916600160a060020a03929092169190911790557fd1a79c97f023d07d5c5533b0887300f81e113759deeb9531a541b93341ceab7f60405160405180910390a150505050565b60126020526000908152604090205481565b600054600160a060020a031681565b60006007600462015180840401620010c6565b600454600160a060020a031681565b60188054829081106200132d57fe5b600091825260209091200154905081565b60115460009033600160a060020a039081169116146200135d57600080fd5b506003805460ff19166002179055601154600160a060020a0316620013d081634d52a5126040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620013b057600080fd5b5af11515620013be57600080fd5b5050506040518051905060026200266a565b6010555042600f81905565af7151902add600e55600555565b6000620013fc86868686866000620018a8565b9695505050505050565b60006200141382620027cf565b6040015192915050565b60035433600160a060020a0390811661010090920416146200143e57600080fd5b601354600160a060020a031615801590620014ae5750601354600160a060020a031663b3f05b976040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200149457600080fd5b5af11515620014a257600080fd5b50505060405180519050155b156200151d57601354600160a060020a031663c734f917848360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b15156200150b57600080fd5b5af115156200151957600080fd5b5050505b601454600160a060020a0316158015906200158d5750601454600160a060020a031663b3f05b976040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200157357600080fd5b5af115156200158157600080fd5b50505060405180519050155b15620015fc57601454600160a060020a031663c734f917848360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1515620015ea57600080fd5b5af11515620015f857600080fd5b5050505b505050565b600060026003805460ff16908111156200161757fe5b14620016265750600062001633565b62001630620026c2565b90505b90565b600160a060020a03331660009081526002602052604090205460ff1615156001146200166157600080fd5b600c54600160a060020a0316156200167857600080fd5b600c8054600160a060020a031916600160a060020a0392909216919091179055565b6000620016ad85858585600080620018a8565b95945050505050565b60155481565b600d54600160a060020a031681565b60175460ff1681565b60145460009033600160a060020a0390811691161480156200174a5750601454600160a060020a031663b3f05b976040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200173157600080fd5b5af115156200173f57600080fd5b505050604051805190505b15156200175657600080fd5b81156200180c576000601654111562001779576200177362002932565b62001806565b601454600160a060020a03166378e979256040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620017b957600080fd5b5af11515620017c757600080fd5b505050604051805190509050620017f8620017e28262001a0c565b620017ed8362001b17565b600201600162001873565b6016556017805460ff191690555b6200181f565b60006016556017805460ff191660011790555b7f9ab7d9b3f53fbde0442a57f23d2eca52d14cd437e392cf8896a96f3647dff6db82604051901515815260200160405180910390a1505060148054600160a060020a0319169055565b6000603c82620010c6565b6000620018878484846000806000620018a8565b949350505050565b600754600160a060020a031681565b65af7151902add81565b600080620018b5620030da565b6107b291505b8861ffff168261ffff1610156200190257620018d78262001b3d565b15620018ec576301e2850083019250620018f6565b6301e13380830192505b600190910190620018bb565b601f8152620019118962001b3d565b156200192457601d60208201526200192c565b601c60208201525b601f60408201819052601e606083018190526080830182905260a0830181905260c0830182905260e0830182905261010083018190526101208301829052610140830152610160820152600191505b8760ff168261ffff161015620019bf578061ffff600019840116600c8110620019a057fe5b602002015160ff1662015180028301925081806001019250506200197b565b6001870360ff166201518002830192508560ff16610e1002830192508460ff16603c02830192508360ff168301925082925050509695505050505050565b600854600160a060020a031681565b6000806107b26301e133808404810190829062001a299062001c1a565b62001a388361ffff1662001c1a565b039050806301e285000283019250806107b2830361ffff16036301e1338002830192505b8483111562001a9e5762001a736001830362001b3d565b1562001a88576301e285008303925062001a92565b6301e13380830392505b60018203915062001a5c565b509392505050565b600a81565b62001ab562003104565b600180548060200260200160405190810160405280929190818152602001828054801562001b0d57602002820191906000526020600020905b8154600160a060020a0316815260019091019060200180831162001aee575b5050505050905090565b600062001b2482620027cf565b6020015192915050565b600c54600160a060020a031681565b6000600382161562001b5257506000620010ca565b606461ffff83160661ffff161562001b6d57506001620010ca565b61019061ffff83160661ffff161562001b8957506000620010ca565b506001919050565b60115460009033600160a060020a0390811691161462001bb057600080fd5b60006003805460ff169081111562001bc457fe5b1462001bcf57600080fd5b600160a060020a03821660009081526012602052604090205462001bf4903462002682565b600160a060020a0390921660009081526012602052604090209190915550565b600f5481565b60001901600061019082046064830460048404030192915050565b60008260ff166001148062001c4d57508260ff166003145b8062001c5c57508260ff166005145b8062001c6b57508260ff166007145b8062001c7a57508260ff166008145b8062001c8957508260ff16600a145b8062001c9857508260ff16600c145b1562001ca75750601f62001d08565b8260ff166004148062001cbd57508260ff166006145b8062001ccc57508260ff166009145b8062001cdb57508260ff16600b145b1562001cea5750601e62001d08565b62001cf58262001b3d565b1562001d045750601d62001d08565b50601c5b92915050565b60165481565b601454600090600160a060020a03161580159062001d875750601454600160a060020a031663b3f05b976040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562001d6d57600080fd5b5af1151562001d7b57600080fd5b50505060405180519050155b801562001dec5750601454600090600160a060020a031663728b482b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562001dd257600080fd5b5af1151562001de057600080fd5b50505060405180519050115b801562001e505750601454600160a060020a031663728b482b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562001e3457600080fd5b5af1151562001e4257600080fd5b505050604051805190504210155b801562001eb15750601454600160a060020a03166380322cbd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562001e9857600080fd5b5af1151562001ea657600080fd5b505050604051805190505b1562001ec05750600062001633565b5060175460ff1690565b600d5433600160a060020a0390811691161462001ee657600080fd5b62001ef062002932565b565b60035460ff1681565b600b54600160a060020a031681565b601354600160a060020a031681565b600654600160a060020a031681565b600954600160a060020a031681565b601454600160a060020a031681565b600160a060020a03331660009081526002602052604081205460ff1615156001148062001f815750600d5433600160a060020a039081169116145b151562001f8d57600080fd5b60016003805460ff169081111562001fa157fe5b1462001fac57600080fd5b600160a060020a0382166000908152601260205260408120541162001fd057600080fd5b50600160a060020a03808216600090815260126020526040808220805492905560035491926101009092049091169063a24835d190849083906370a082319083905160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156200204e57600080fd5b5af115156200205c57600080fd5b5050506040518051905060405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1515620020aa57600080fd5b5af11515620020b857600080fd5b505050600160a060020a0382166108fc82150282604051600060405180830381858888f193505050501515620020ed57600080fd5b7fec44c8b7c9108bd9d48e9a929c78d5a448562d61b1113d016ba7fd99d7dc3c7c8282426040518084600160a060020a0316600160a060020a03168152602001838152602001828152602001935050505060405180910390a15050565b600160a060020a03331660009081526002602052604081205460ff1615156001146200217557600080fd5b6200217f62001d14565b15156200218b57600080fd5b601054600090116200219c57600080fd5b50601080546000909155600454600160a060020a031681156108fc0282604051600060405180830381858888f1935050505015156200107457600080fd5b60026020526000908152604090205460ff1681565b600a54600160a060020a031681565b60005433600160a060020a039081169116146200221a57600080fd5b620022258162002f52565b50565b6000603c8083620010bb565b600080600380805460ff16908111156200224a57fe5b146200225557600080fd5b6003546101009004600160a060020a03166370a082313360405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515620022ab57600080fd5b5af11515620022b957600080fd5b505050604051805192505060008211620022d257600080fd5b6200234f620022ec8330600160a060020a0316316200263c565b6003546101009004600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200233157600080fd5b5af115156200233f57600080fd5b505050604051805190506200266a565b9050600081116200235f57600080fd5b6003546101009004600160a060020a031663a24835d1338460405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1515620023bb57600080fd5b5af11515620023c957600080fd5b5050600160a060020a033316905081156108fc0282604051600060405180830381858888f193505050501515620023ff57600080fd5b7f2fe53133356d775fd6784d23de274186e0721e0d93074ae2392acb8968bb2e51338284426040518085600160a060020a0316600160a060020a0316815260200184815260200183815260200182815260200194505050505060405180910390a15050565b6003546101009004600160a060020a031681565b600e5481565b600060016003805460ff16908111156200249457fe5b146200249f57600080fd5b600160a060020a03331660009081526012602052604081205411620024c357600080fd5b50600160a060020a0333818116600090815260126020526040808220805492905560035491936101009092049091169163a24835d19183906370a082319083905160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156200254057600080fd5b5af115156200254e57600080fd5b5050506040518051905060405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b15156200259c57600080fd5b5af11515620025aa57600080fd5b5050600160a060020a033316905081156108fc0282604051600060405180830381858888f193505050501515620025e057600080fd5b7fec44c8b7c9108bd9d48e9a929c78d5a448562d61b1113d016ba7fd99d7dc3c7c3382426040518084600160a060020a0316600160a060020a03168152602001838152602001828152602001935050505060405180910390a150565b60008282028315806200265a57508284828115156200265757fe5b04145b15156200266357fe5b9392505050565b60008082848115156200267957fe5b04949350505050565b6000828201838110156200266357fe5b6000620026a18260026200266a565b9050600a811115620026b857600a601555620026be565b60158190555b5050565b600080620026e0620026d742600f54620030a5565b600e546200263c565b90508030600160a060020a0316311015620027025750600160a060020a033016315b8091505b5090565b60008060006016541180156200272257506016544210155b80156200273f57506200273b6016546201518062002682565b4211155b156200274f576001915062002706565b601854811015620027c75760188054829081106200276957fe5b9060005260206000209001544210158015620027ae5750620027aa6018828154811015156200279457fe5b9060005260206000209001546201518062002682565b4211155b15620027be576001915062002706565b6001016200274f565b600091505090565b620027d962003116565b6000808080620027e98662001a0c565b61ffff168552620027fc6107b262001c1a565b6200280c865161ffff1662001c1a565b039250826301e285000284019350826107b286600001510361ffff16036301e133800284019350600191505b600c60ff83161162002885576200285182865162001c35565b60ff1662015180029050858482011115620028755760ff8216602086015262002885565b9283019260019091019062002838565b600191505b6200289b8560200151865162001c35565b60ff168260ff16111515620028dc57858462015180011115620028c75760ff82166040860152620028dc565b6201518093909301926001909101906200288a565b620028e786620010b1565b60ff166060860152620028fa8662002228565b60ff1660808601526200290d8662001868565b60ff1660a08601526200292086620012fc565b60ff1660c08601525092949350505050565b60026003805460ff16908111156200294657fe5b146200295157600080fd5b6003805460ff1916811790819055600c54600160a060020a0361010090920482169163a24835d19116826370a082318260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515620029c057600080fd5b5af11515620029ce57600080fd5b5050506040518051905060405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b151562002a1c57600080fd5b5af1151562002a2a57600080fd5b5050600354600a54600160a060020a036101009092048216925063a24835d19116826370a082318260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151562002a9157600080fd5b5af1151562002a9f57600080fd5b5050506040518051905060405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b151562002aed57600080fd5b5af1151562002afb57600080fd5b5050600354600854600160a060020a036101009092048216925063a24835d19116826370a082318260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151562002b6257600080fd5b5af1151562002b7057600080fd5b5050506040518051905060405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b151562002bbe57600080fd5b5af1151562002bcc57600080fd5b5050600354600754600160a060020a036101009092048216925063a24835d19116826370a082318260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151562002c3357600080fd5b5af1151562002c4157600080fd5b5050506040518051905060405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b151562002c8f57600080fd5b5af1151562002c9d57600080fd5b5050600354600954600160a060020a036101009092048216925063a24835d19116826370a082318260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151562002d0457600080fd5b5af1151562002d1257600080fd5b5050506040518051905060405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b151562002d6057600080fd5b5af1151562002d6e57600080fd5b5050600354600654600160a060020a036101009092048216925063a24835d19116826370a082318260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151562002dd557600080fd5b5af1151562002de357600080fd5b5050506040518051905060405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b151562002e3157600080fd5b5af1151562002e3f57600080fd5b5050600354600b54600160a060020a036101009092048216925063a24835d19116826370a082318260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151562002ea657600080fd5b5af1151562002eb457600080fd5b5050506040518051905060405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b151562002f0257600080fd5b5af1151562002f1057600080fd5b5050507f32a9af620b9010e46c598870c64620a9c1b65816b3140fbd73ea13f2e50cdb2333604051600160a060020a03909116815260200160405180910390a1565b6000805b60015482101562002fb85760006002600060018581548110151562002f7757fe5b600091825260208083209190910154600160a060020a031683528201929092526040019020805460ff19169115159190911790556001919091019062002f56565b5060005b8251811015620030145760016002600085848151811062002fd957fe5b90602001906020020151600160a060020a031681526020810191909152604001600020805460ff191691151591909117905560010162002fbc565b60018380516200302992916020019062003152565b507f9465cd279c2de393c5568ae444599e3644e3d1864ca2c05ced8a654df2aea3cb8360405160208082528190810183818151815260200191508051906020019060200280838360005b838110156200308d57808201518382015260200162003073565b505050509050019250505060405180910390a1505050565b600081831015620030b257fe5b50900390565b604051610a6280620031db83390190565b6040516109de8062003c3d83390190565b610180604051908101604052600c815b600081526000199091019060200181620030ea5790505090565b60206040519081016040526000815290565b60e06040519081016040908152600080835260208301819052908201819052606082018190526080820181905260a0820181905260c082015290565b828054828255906000526020600020908101928215620031ac579160200282015b82811115620031ac5782518254600160a060020a031916600160a060020a03919091161782556020929092019160019091019062003173565b506200270692620016339250905b8082111562002706578054600160a060020a0319168155600101620031ba560060606040526000600555600060065560006007556000600b55341561002357600080fd5b60405160c080610a6283398101604052808051919060200180519190602001805191906020018051919060200180519190602001805191508590508484846000600160a060020a038516151561007857600080fd5b42831015801561008757508282115b151561009257600080fd5b60008054600160a060020a03968716600160a060020a03199182161790915560018054959096169416939093179093556002556003919091556008805460ff199081169091556004805492151592909116919091179055600a95909555505050600b919091555061095a806101086000396000f3006060604052600436106100e25763ffffffff60e060020a6000350416632c24909c81146100e75780633197cbb61461010c578063361810261461011f57806341fdade61461014657806343c14b22146101595780634b9f5c981461016e57806364a90292146101865780636f6a97621461019957806378e97925146101ac57806380322cbd146101bf578063a7491b48146101d2578063b3a2273f14610217578063b3f05b971461022a578063c734f9171461023d578063d74689e41461025f578063e82bef2914610272578063fc0c546a146102a1578063fd221031146102b4575b600080fd5b34156100f257600080fd5b6100fa6102c7565b60405190815260200160405180910390f35b341561011757600080fd5b6100fa610345565b341561012a57600080fd5b61013261034b565b604051901515815260200160405180910390f35b341561015157600080fd5b6100fa610393565b341561016457600080fd5b61016c610399565b005b341561017957600080fd5b61016c6004351515610458565b341561019157600080fd5b6100fa6105ee565b34156101a457600080fd5b6100fa6105f4565b34156101b757600080fd5b6100fa6105fa565b34156101ca57600080fd5b610132610600565b34156101dd57600080fd5b6101f1600160a060020a036004351661060a565b604051928352602083019190915215156040808301919091526060909101905180910390f35b341561022257600080fd5b6100fa61062e565b341561023557600080fd5b610132610634565b341561024857600080fd5b61016c600160a060020a036004351660243561063d565b341561026a57600080fd5b6100fa610814565b341561027d57600080fd5b61028561081a565b604051600160a060020a03909116815260200160405180910390f35b34156102ac57600080fd5b610285610829565b34156102bf57600080fd5b6100fa610838565b600061033f6102e46102dd60055460065461083e565b6064610854565b600054600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561032357600080fd5b5af1151561033057600080fd5b50505060405180519050610878565b90505b90565b60035481565b60085460009060ff161561035e57600080fd5b60035442101561037057506000610342565b6008805460ff1916600117905561038d61038861088f565b6108b1565b50600190565b6103e881565b60008060025442101580156103b057506003544211155b15156103bb57600080fd5b600160a060020a033316600090815260096020526040812054116103de57600080fd5b5050600160a060020a033316600090815260096020526040812060018082018054600284018054948690559490915560ff19831690935560075460ff909216916104279161091c565b60075580156104445761043c6005548361091c565b600555610454565b6104506006548361091c565b6006555b5050565b600080600254421015801561046f57506003544211155b151561047a57600080fd5b600160a060020a0333166000908152600960205260409020541561049d57600080fd5b600054600160a060020a03166370a082313360405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156104ed57600080fd5b5af115156104fa57600080fd5b50505060405180516000549093506105689150600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561054957600080fd5b5af1151561055657600080fd5b505050604051805190506103e8610878565b905080821115610578578061057a565b815b915082156105965761058e6005548361083e565b6005556105a6565b6105a26006548361083e565b6006555b33600160a060020a0316600090815260096020526040902042815560018082018490556002909101805460ff19168515151790556007546105e69161083e565b600755505050565b60065481565b600b5481565b60025481565b600061033f61088f565b60096020526000908152604090208054600182015460029092015490919060ff1683565b60075481565b60085460ff1681565b60015460009033600160a060020a0390811691161461065b57600080fd5b600160a060020a038316600090815260096020526040902054151561067f5761080f565b60045460ff1615156106b25760085460ff16806106a857506002544210806106a8575060035442115b156106b25761080f565b600160a060020a03808416600090815260096020526040808220600101549154919291909116906370a082319086905160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561071d57600080fd5b5af1151561072a57600080fd5b505050604051805190501015156107405761080f565b50600160a060020a03821660009081526009602052604090206001015481908111156107845750600160a060020a0382166000908152600960205260409020600101545b600160a060020a03831660009081526009602052604090206002015460ff16156107bc576107b46005548261091c565b6005556107cc565b6107c86006548261091c565b6006555b600160a060020a0383166000908152600960205260409020600101546107f2908261091c565b600160a060020a0384166000908152600960205260409020600101555b505050565b60055481565b600154600160a060020a031681565b600054600160a060020a031681565b600a5481565b60008282018381101561084d57fe5b9392505050565b6000828202831580610870575082848281151561086d57fe5b04145b151561084d57fe5b600080828481151561088657fe5b04949350505050565b600060065460055411801561033f5750600b546108aa6102c7565b1015905090565b600154600a54600160a060020a039091169081906329c90b6390849060405160e060020a63ffffffff851602815291151560048301526024820152604401600060405180830381600087803b151561090857600080fd5b5af1151561091557600080fd5b5050505050565b60008183101561092857fe5b509003905600a165627a7a7230582059b9e61e8cd64d75d9fd9707882faf208afa8c2a4a99bc7f4ed6dd90ad40be26002960606040526000600555600060065560006007556000600a55341561002357600080fd5b60405160c0806109de833981016040528080519190602001805191906020018051919060200180519190602001805191906020018051915086905085858584600160a060020a038516151561007757600080fd5b42831015801561008657508282115b151561009157600080fd5b60008054600160a060020a03968716600160a060020a03199182161790915560018054959096169416939093179093556002556003919091556008805460ff19908116909155600480549215159290911691909117905550600a55505050506108df806100ff6000396000f3006060604052600436106100cc5763ffffffff60e060020a6000350416633197cbb681146100d157806336181026146100f657806341fdade61461011d57806343c14b22146101305780634b9f5c981461014557806364a902921461015d578063728b482b1461017057806378e979251461018357806380322cbd14610196578063a7491b48146101a9578063b3a2273f146101ee578063b3f05b9714610201578063c734f91714610214578063d74689e414610236578063e82bef2914610249578063fc0c546a14610278575b600080fd5b34156100dc57600080fd5b6100e461028b565b60405190815260200160405180910390f35b341561010157600080fd5b610109610291565b604051901515815260200160405180910390f35b341561012857600080fd5b6100e46102f2565b341561013b57600080fd5b6101436102f8565b005b341561015057600080fd5b61014360043515156103b7565b341561016857600080fd5b6100e461054d565b341561017b57600080fd5b6100e4610553565b341561018e57600080fd5b6100e4610559565b34156101a157600080fd5b61010961055f565b34156101b457600080fd5b6101c8600160a060020a036004351661056e565b604051928352602083019190915215156040808301919091526060909101905180910390f35b34156101f957600080fd5b6100e4610592565b341561020c57600080fd5b610109610598565b341561021f57600080fd5b610143600160a060020a03600435166024356105a1565b341561024157600080fd5b6100e4610778565b341561025457600080fd5b61025c61077e565b604051600160a060020a03909116815260200160405180910390f35b341561028357600080fd5b61025c61078d565b60035481565b600080600a541180156102a75750600354600a54115b156102c057600a544210156102bb57600080fd5b6102cf565b6003544210156102cf57600080fd5b6008805460ff191660011790556102ec6102e761079c565b610817565b50600190565b6103e881565b600080600254421015801561030f57506003544211155b151561031a57600080fd5b600160a060020a0333166000908152600960205260408120541161033d57600080fd5b5050600160a060020a033316600090815260096020526040812060018082018054600284018054948690559490915560ff19831690935560075460ff9092169161038691610874565b60075580156103a35761039b60055483610874565b6005556103b3565b6103af60065483610874565b6006555b5050565b60008060025442101580156103ce57506003544211155b15156103d957600080fd5b600160a060020a033316600090815260096020526040902054156103fc57600080fd5b600054600160a060020a03166370a082313360405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561044c57600080fd5b5af1151561045957600080fd5b50505060405180516000549093506104c79150600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156104a857600080fd5b5af115156104b557600080fd5b505050604051805190506103e8610886565b9050808211156104d757806104d9565b815b915082156104f5576104ed6005548361089d565b600555610505565b6105016006548361089d565b6006555b33600160a060020a0316600090815260096020526040902042815560018082018490556002909101805460ff19168515151790556007546105459161089d565b600755505050565b60065481565b600a5481565b60025481565b600061056961079c565b905090565b60096020526000908152604090208054600182015460029092015490919060ff1683565b60075481565b60085460ff1681565b60015460009033600160a060020a039081169116146105bf57600080fd5b600160a060020a03831660009081526009602052604090205415156105e357610773565b60045460ff1615156106165760085460ff168061060c575060025442108061060c575060035442115b1561061657610773565b600160a060020a03808416600090815260096020526040808220600101549154919291909116906370a082319086905160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561068157600080fd5b5af1151561068e57600080fd5b505050604051805190501015156106a457610773565b50600160a060020a03821660009081526009602052604090206001015481908111156106e85750600160a060020a0382166000908152600960205260409020600101545b600160a060020a03831660009081526009602052604090206002015460ff16156107205761071860055482610874565b600555610730565b61072c60065482610874565b6006555b600160a060020a0383166000908152600960205260409020600101546107569082610874565b600160a060020a0384166000908152600960205260409020600101555b505050565b60055481565b600154600160a060020a031681565b600054600160a060020a031681565b6000600654600554118015610569575060005461080d90600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156107ef57600080fd5b5af115156107fc57600080fd5b505050604051805190506003610886565b6005541015905090565b600154600160a060020a0316806389ea2cb78360405160e060020a63ffffffff84160281529015156004820152602401600060405180830381600087803b151561086057600080fd5b5af1151561086d57600080fd5b5050505050565b60008183101561088057fe5b50900390565b600080828481151561089457fe5b04949350505050565b6000828201838110156108ac57fe5b93925050505600a165627a7a7230582008913de14f0f24c71050379b6997cb6e8d4ff163e3e8f3e73edbd6069a08d95f0029a165627a7a72305820933a469c477da45183c7ccef2cc51e8cce1c9f6715277e653a22eb77386679c70029000000000000000000000000e45f9c10f3e4647ac922b0128e688e8e1f220f5f000000000000000000000000f759cae90459c72bb3668fcd8e674f9e1eb9c2c30000000000000000000000009496dbbb9bc9fd78d4735b954569a54fe2a0d9f30000000000000000000000005686508abbff20db6a582643280601ef53b58ddf000000000000000000000000a1568c501e650c83337f8119b6276c0de4aabb0f00000000000000000000000073c2d67e4181ad1926b4b47b56d3d2c198b8760400000000000000000000000011f21536f888def8c7d2c4785f3f70b3ddbca1b90000000000000000000000002d2edbfa6c22c276263dacf1252eb0611bde751d000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000010000000000000000000000005eaf0a37346ff992199fbc4480c9ccc4137d9c1f

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

-----Decoded View---------------
Found 11 constructor arguments :
Arg [0] : 000000000000000000000000e45f9c10f3e4647ac922b0128e688e8e1f220f5f
Arg [1] : 000000000000000000000000f759cae90459c72bb3668fcd8e674f9e1eb9c2c3
Arg [2] : 0000000000000000000000009496dbbb9bc9fd78d4735b954569a54fe2a0d9f3
Arg [3] : 0000000000000000000000005686508abbff20db6a582643280601ef53b58ddf
Arg [4] : 000000000000000000000000a1568c501e650c83337f8119b6276c0de4aabb0f
Arg [5] : 00000000000000000000000073c2d67e4181ad1926b4b47b56d3d2c198b87604
Arg [6] : 00000000000000000000000011f21536f888def8c7d2c4785f3f70b3ddbca1b9
Arg [7] : 0000000000000000000000002d2edbfa6c22c276263dacf1252eb0611bde751d
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [10] : 0000000000000000000000005eaf0a37346ff992199fbc4480c9ccc4137d9c1f


   Swarm Source:
bzzr://933a469c477da45183c7ccef2cc51e8cce1c9f6715277e653a22eb77386679c7

 

View All
Block Age txn Difficulty GasUsed Reward
View All
Block Age UncleNumber Difficulty GasUsed Reward
Make sure to use the "downvote" button for any spammy posts, and the "upvote" for interesting conversations.