Contract 0xf06ae89f70c14a060bec609ffa9cd540bae31c8c

 
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x14327c4e017da87bdca832902a8f9677941dd2ad622d3f48eea8b3d57413bcacMint Reward8755852020-09-28 13:08:55475 days 11 hrs ago0x710981e8bddd736c6796e968115b70697681221a IN  0xf06ae89f70c14a060bec609ffa9cd540bae31c8c0 BNB0.00160828
0xb6d96d97d9ef2cb7a9ae1858c38c7292a5c0dfe6393a9061d7284f004e0baa8fMint Reward7061312020-09-22 15:56:13481 days 8 hrs ago0xd0a5266b2515c3b575e30cbc0cfc775fa4fc6660 IN  0xf06ae89f70c14a060bec609ffa9cd540bae31c8c0 BNB0.00144708
0x8f45630d85181f8eb07cf1476f1c199df0ce85371ca6e2e597649b93ccef26f1Mint Reward5230292020-09-16 7:21:07487 days 17 hrs ago0x016550b47d76b10738c7adbfd463671df077f108 IN  0xf06ae89f70c14a060bec609ffa9cd540bae31c8c0 BNB0.00372126
0xe142221ef21de1682ddc68f3c9be7f494753d398c54fd0b2f1a1a80713e61ceaMint Reward4914562020-09-15 5:02:28488 days 19 hrs ago0x2c8a0ac337be86cebbfce3bc62c6d1df1328323c IN  0xf06ae89f70c14a060bec609ffa9cd540bae31c8c0 BNB0.00284006
0x84eca837bb5f863a8276c4430de0a2915801287ee5352c0bf185cb774405adc1Mint Reward4890142020-09-15 3:00:22488 days 21 hrs ago0x2c8a0ac337be86cebbfce3bc62c6d1df1328323c IN  0xf06ae89f70c14a060bec609ffa9cd540bae31c8c0 BNB0.00393726
0xc52f380b23f3db3ba39b761042fd0658fd07aa3fdd95a6affb6c85ba3b58c374Mint Reward4880602020-09-15 2:12:40488 days 22 hrs ago0xbdfbddc72c07d8da913c2bb136f453313e2340bc IN  0xf06ae89f70c14a060bec609ffa9cd540bae31c8c0 BNB0.00393726
0x3a4f335891ded1e3847ec5cbf9e6062454058a452610691ad7c9a7cdccddabadMint Reward4879942020-09-15 2:09:22488 days 22 hrs ago0x50528f8ba485d0cf3746630ee4545dee4950527c IN  0xf06ae89f70c14a060bec609ffa9cd540bae31c8c0 BNB0.00372126
0x9ad06bc9797b7849fdf47ce337d1ff30c7b1c786f51fe7de95c7911daf64b550Mint Reward4703982020-09-14 11:29:34489 days 13 hrs ago0xbdfbddc72c07d8da913c2bb136f453313e2340bc IN  0xf06ae89f70c14a060bec609ffa9cd540bae31c8c0 BNB0.00372126
0xc5ff8e0e2998e931bfc12f40ef49ccb52b3b6e9f0f33e8c99dd28dad74f8b79fMint Reward4588922020-09-14 1:54:16489 days 22 hrs ago0x50528f8ba485d0cf3746630ee4545dee4950527c IN  0xf06ae89f70c14a060bec609ffa9cd540bae31c8c0 BNB0.00318968
0x730bfa0639dbdcb4218c791023d52c2ed9e65ffdaec2ea8e8131657718cf6345Mint Reward4579652020-09-14 1:07:55489 days 23 hrs ago0x9621d12d63be2b9fbfb1fb03f623e3d9b52e9df9 IN  0xf06ae89f70c14a060bec609ffa9cd540bae31c8c0 BNB0.00284006
0x9ee63a62309cc9302288218f5dc8183525ec95a9e3dc3eaf7ff718fa43737e05Mint Reward4494582020-09-13 18:02:34490 days 6 hrs ago0x9621d12d63be2b9fbfb1fb03f623e3d9b52e9df9 IN  0xf06ae89f70c14a060bec609ffa9cd540bae31c8c0 BNB0.00372126
0xd50baf43aa024419abea2af17cd7c09c3c2ccbbb0244f765d9ef7fbfede0282eMint Reward4395212020-09-13 9:45:43490 days 14 hrs ago0xf7afa8d4142b2092dcd4609ffe8963786b13be19 IN  0xf06ae89f70c14a060bec609ffa9cd540bae31c8c0 BNB0.00284006
0x5ec28e7a43f88f246d5bb7b420e141f4d27224b68715004ef3c4ea290b0b2036Mint Reward4376612020-09-13 8:12:43490 days 16 hrs ago0x42b45a385788e0a9551a2bb9f511080464595abb IN  0xf06ae89f70c14a060bec609ffa9cd540bae31c8c0 BNB0.00284006
0xf9156ec036f7f87ce3f9164c77fea9602a1a03252d5b949d4bcfd5e27d7e8c3eMint Reward4357182020-09-13 6:35:34490 days 17 hrs ago0xaa77f6b131295e73daa04584fda1d0829f810490 IN  0xf06ae89f70c14a060bec609ffa9cd540bae31c8c0 BNB0.00337164
0xc3088852d377b12efbe3b82aa38c6b6c80d7b4c857b509ba7b8ce29a864e4b93Mint Reward4090902020-09-12 8:24:10491 days 16 hrs ago0x9621d12d63be2b9fbfb1fb03f623e3d9b52e9df9 IN  0xf06ae89f70c14a060bec609ffa9cd540bae31c8c0 BNB0.00337164
0x47c1d9e2c86ed2ac4cd32549284c222b4ad64523cd0f081f44feda29bda89a6aMint Reward4090362020-09-12 8:21:28491 days 16 hrs ago0x710981e8bddd736c6796e968115b70697681221a IN  0xf06ae89f70c14a060bec609ffa9cd540bae31c8c0 BNB0.00423726
0x1ec7f293c446a762dd789187b3d60d5ad2483409e2db9eacb989a92585f8576bMint Reward4039282020-09-12 4:06:04491 days 20 hrs ago0x1f14bb397105e22dc758585693fc08a34b17fb63 IN  0xf06ae89f70c14a060bec609ffa9cd540bae31c8c0 BNB0.00337164
0xe8b19acc764343de0c40a4c7cf262e03f3f8a6e9416a98ea35ef949eac9b68fcMint Reward4039172020-09-12 4:05:31491 days 20 hrs ago0x1f14bb397105e22dc758585693fc08a34b17fb63 IN  0xf06ae89f70c14a060bec609ffa9cd540bae31c8c0 BNB0.0028761
0x6aa8a1dd725dd1389a48090e3ad03c7ae790515613d3d5fc94c59e76eb9965f4Mint Reward3930262020-09-11 19:00:58492 days 5 hrs ago0xd7aa3d83689faebec5b5ecf76db80320b6c51490 IN  0xf06ae89f70c14a060bec609ffa9cd540bae31c8c0 BNB0.00337164
0x2862ae96f4f64eccc936d1a2def0b4a5b91ffadc9ed564f161d220ebdfac279bMint Reward3907272020-09-11 17:06:01492 days 7 hrs ago0x115b65464043e9d0ad7422f95d1398b593c0efd3 IN  0xf06ae89f70c14a060bec609ffa9cd540bae31c8c0 BNB0.00400568
[ Download CSV Export 
Latest 1 internal transaction
Parent Txn Hash Block From To Value
0x0576d62efcc8b82dddbb3eb2550e3a8f704603c42c329503fb61197b8e9ab8243614292020-09-10 16:41:07493 days 7 hrs ago 0xa4790135ba4439cdb2efb35fe191dc83d3d627f6  Contract Creation0 BNB
[ Download CSV Export 
Loading

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x7aC2F8D82cefbdc932e68dBfd36AdDc4d606ed6B

Contract Name:
DemaxPair

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2020-09-15
*/

pragma solidity >=0.6.6;


// a library for performing various math operations
library Math {
    function min(uint x, uint y) internal pure returns (uint z) {
        z = x < y ? x : y;
    }

    // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
    function sqrt(uint y) internal pure returns (uint z) {
        if (y > 3) {
            z = y;
            uint x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }
}

// a library for handling binary fixed point numbers (https://en.wikipedia.org/wiki/Q_(number_format))
// range: [0, 2**112 - 1]
// resolution: 1 / 2**112
library UQ112x112 {
    uint224 constant Q112 = 2**112;

    // encode a uint112 as a UQ112x112
    function encode(uint112 y) internal pure returns (uint224 z) {
        z = uint224(y) * Q112; // never overflows
    }

    // divide a UQ112x112 by a uint112, returning a UQ112x112
    function uqdiv(uint224 x, uint112 y) internal pure returns (uint224 z) {
        z = x / uint224(y);
    }
}

interface IDemaxFactory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function contractCodeHash() external view returns (bytes32);
    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function isPair(address pair) external view returns (bool);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);
    function playerPairs(address player, uint index) external view returns (address pair);
    function getPlayerPairCount(address player) external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);
    function addPlayerPair(address player, address _pair) external returns (bool);
}

interface IDgas {
    function amountPerBlock() external view returns (uint);
    function changeInterestRatePerBlock(uint value) external returns (bool);
    function getProductivity(address user) external view returns (uint, uint);
    function increaseProductivity(address user, uint value) external returns (bool);
    function decreaseProductivity(address user, uint value) external returns (bool);
    function take() external view returns (uint);
    function takeWithBlock() external view returns (uint, uint);
    function mint() external returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function upgradeImpl(address _newImpl) external;
    function upgradeGovernance(address _newGovernor) external;
}

interface IDemaxCallee {
    function demaxCall(address sender, uint amount0, uint amount1, bytes calldata data) external;
}

interface IDemaxConfig {
    function governor() external view returns (address);
    function dev() external view returns (address);
    function PERCENT_DENOMINATOR() external view returns (uint);
    function getConfig(bytes32 _name) external view returns (uint minValue, uint maxValue, uint maxSpan, uint value, uint enable);
    function getConfigValue(bytes32 _name) external view returns (uint);
    function changeConfigValue(bytes32 _name, uint _value) external returns (bool);
    function checkToken(address _token) external view returns(bool);
    function checkPair(address tokenA, address tokenB) external view returns (bool);
    function listToken(address _token) external returns (bool);
    function getDefaultListTokens() external returns (address[] memory);
    function platform() external view returns  (address);
    function addToken(address _token) external returns (bool);
}

interface IERC20 {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

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

//SPDX-License-Identifier: MIT
interface IERC2917 is IERC20 {

    /// @dev This emit when interests amount per block is changed by the owner of the contract.
    /// It emits with the old interests amount and the new interests amount.
    event InterestRatePerBlockChanged (uint oldValue, uint newValue);

    /// @dev This emit when a users' productivity has changed
    /// It emits with the user's address and the the value after the change.
    event ProductivityIncreased (address indexed user, uint value);

    /// @dev This emit when a users' productivity has changed
    /// It emits with the user's address and the the value after the change.
    event ProductivityDecreased (address indexed user, uint value);

    /// @dev Return the current contract's interests rate per block.
    /// @return The amount of interests currently producing per each block.
    function interestsPerBlock() external view returns (uint);

    /// @notice Change the current contract's interests rate.
    /// @dev Note the best practice will be restrict the gross product provider's contract address to call this.
    /// @return The true/fase to notice that the value has successfully changed or not, when it succeed, it will emite the InterestRatePerBlockChanged event.
    function changeInterestRatePerBlock(uint value) external returns (bool);

    /// @notice It will get the productivity of given user.
    /// @dev it will return 0 if user has no productivity proved in the contract.
    /// @return user's productivity and overall productivity.
    function getProductivity(address user) external view returns (uint, uint);

    /// @notice increase a user's productivity.
    /// @dev Note the best practice will be restrict the callee to prove of productivity's contract address.
    /// @return true to confirm that the productivity added success.
    function increaseProductivity(address user, uint value) external returns (bool);

    /// @notice decrease a user's productivity.
    /// @dev Note the best practice will be restrict the callee to prove of productivity's contract address.
    /// @return true to confirm that the productivity removed success.
    function decreaseProductivity(address user, uint value) external returns (bool);

    /// @notice take() will return the interests that callee will get at current block height.
    /// @dev it will always calculated by block.number, so it will change when block height changes.
    /// @return amount of the interests that user are able to mint() at current block height.
    function take() external view returns (uint);

    /// @notice similar to take(), but with the block height joined to calculate return.
    /// @dev for instance, it returns (_amount, _block), which means at block height _block, the callee has accumulated _amount of interests.
    /// @return amount of interests and the block height.
    function takeWithBlock() external view returns (uint, uint);

    /// @notice mint the avaiable interests to callee.
    /// @dev once it mint, the amount of interests will transfer to callee's address.
    /// @return the amount of interests minted.
    function mint() external returns (uint);
}

// SPDX-License-Identifier: MIT
/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

// SPDX-License-Identifier: GPL-3.0-or-later
// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
    function safeApprove(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED');
    }

    function safeTransfer(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED');
    }

    function safeTransferFrom(address token, address from, address to, uint value) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED');
    }

    function safeTransferETH(address to, uint value) internal {
        (bool success,) = to.call{value:value}(new bytes(0));
        require(success, 'TransferHelper: ETH_TRANSFER_FAILED');
    }
}

contract BaseShareField {
    using SafeMath for uint;
    
    uint totalProductivity;
    uint accAmountPerShare;
    
    uint public totalShare;
    uint public mintedShare;
    uint public mintCumulation;
    
    address public shareToken;
    
    struct UserInfo {
        uint amount;     // How many tokens the user has provided.
        uint rewardDebt; // Reward debt. 
        uint rewardEarn; // Reward earn and not minted
    }

    mapping(address => UserInfo) public users;
    
    function _setShareToken(address _shareToken) internal {
        shareToken = _shareToken;
    }

    // Update reward variables of the given pool to be up-to-date.
    function _update() internal virtual {
        if (totalProductivity == 0) {
            totalShare = totalShare.add(_currentReward());
            return;
        }
        
        uint256 reward = _currentReward();
        accAmountPerShare = accAmountPerShare.add(reward.mul(1e12).div(totalProductivity));
        totalShare = totalShare.add(reward);
    }
    
    function _currentReward() internal virtual view returns (uint) {
        return mintedShare.add(IERC20(shareToken).balanceOf(address(this))).sub(totalShare);
    }
    
    // Audit user's reward to be up-to-date
    function _audit(address user) internal virtual {
        UserInfo storage userInfo = users[user];
        if (userInfo.amount > 0) {
            uint pending = userInfo.amount.mul(accAmountPerShare).div(1e12).sub(userInfo.rewardDebt);
            userInfo.rewardEarn = userInfo.rewardEarn.add(pending);
            mintCumulation = mintCumulation.add(pending);
            userInfo.rewardDebt = userInfo.amount.mul(accAmountPerShare).div(1e12);
        }
    }

    // External function call
    // This function increase user's productivity and updates the global productivity.
    // the users' actual share percentage will calculated by:
    // Formula:     user_productivity / global_productivity
    function _increaseProductivity(address user, uint value) internal virtual returns (bool) {
        require(value > 0, 'PRODUCTIVITY_VALUE_MUST_BE_GREATER_THAN_ZERO');

        UserInfo storage userInfo = users[user];
        _update();
        _audit(user);

        totalProductivity = totalProductivity.add(value);

        userInfo.amount = userInfo.amount.add(value);
        userInfo.rewardDebt = userInfo.amount.mul(accAmountPerShare).div(1e12);
        return true;
    }

    // External function call 
    // This function will decreases user's productivity by value, and updates the global productivity
    // it will record which block this is happenning and accumulates the area of (productivity * time)
    function _decreaseProductivity(address user, uint value) internal virtual returns (bool) {
        UserInfo storage userInfo = users[user];
        require(value > 0 && userInfo.amount >= value, 'INSUFFICIENT_PRODUCTIVITY');
        
        _update();
        _audit(user);
        
        userInfo.amount = userInfo.amount.sub(value);
        userInfo.rewardDebt = userInfo.amount.mul(accAmountPerShare).div(1e12);
        totalProductivity = totalProductivity.sub(value);
        
        return true;
    }
    
    function _takeWithAddress(address user) internal view returns (uint) {
        UserInfo storage userInfo = users[user];
        uint _accAmountPerShare = accAmountPerShare;
        // uint256 lpSupply = totalProductivity;
        if (totalProductivity != 0) {
            uint reward = _currentReward();
            _accAmountPerShare = _accAmountPerShare.add(reward.mul(1e12).div(totalProductivity));
        }
        return userInfo.amount.mul(_accAmountPerShare).div(1e12).add(userInfo.rewardEarn).sub(userInfo.rewardDebt);
    }

    // External function call
    // When user calls this function, it will calculate how many token will mint to user from his productivity * time
    // Also it calculates global token supply from last time the user mint to this time.
    function _mint(address user) internal virtual returns (uint) {
        _update();
        _audit(user);
        require(users[user].rewardEarn > 0, "NOTHING TO MINT");
        uint amount = users[user].rewardEarn;
        TransferHelper.safeTransfer(shareToken, msg.sender, amount);
        users[user].rewardEarn = 0;
        mintedShare += amount;
        return amount;
    }

    // Returns how many productivity a user has and global has.
    function getProductivity(address user) public virtual view returns (uint, uint) {
        return (users[user].amount, totalProductivity);
    }

    // Returns the current gorss product rate.
    function interestsPerBlock() public virtual view returns (uint) {
        return accAmountPerShare;
    }
    
}

library ConfigNames {
    bytes32 public constant PRODUCE_DGAS_RATE = bytes32('PRODUCE_DGAS_RATE');
    bytes32 public constant SWAP_FEE_PERCENT = bytes32('SWAP_FEE_PERCENT');
    bytes32 public constant LIST_DGAS_AMOUNT = bytes32('LIST_DGAS_AMOUNT');
    bytes32 public constant UNSTAKE_DURATION = bytes32('UNSTAKE_DURATION');
    bytes32 public constant REMOVE_LIQUIDITY_DURATION = bytes32('REMOVE_LIQUIDITY_DURATION');
    bytes32 public constant TOKEN_TO_DGAS_PAIR_MIN_PERCENT = bytes32('TOKEN_TO_DGAS_PAIR_MIN_PERCENT');
    bytes32 public constant LIST_TOKEN_FAILURE_BURN_PRECENT = bytes32('LIST_TOKEN_FAILURE_BURN_PRECENT');
    bytes32 public constant LIST_TOKEN_SUCCESS_BURN_PRECENT = bytes32('LIST_TOKEN_SUCCESS_BURN_PRECENT');
    bytes32 public constant PROPOSAL_DGAS_AMOUNT = bytes32('PROPOSAL_DGAS_AMOUNT');
    bytes32 public constant VOTE_DURATION = bytes32('VOTE_DURATION');
    bytes32 public constant VOTE_REWARD_PERCENT = bytes32('VOTE_REWARD_PERCENT');
    bytes32 public constant TOKEN_PENGDING_SWITCH = bytes32('TOKEN_PENGDING_SWITCH');
    bytes32 public constant TOKEN_PENGDING_TIME = bytes32('TOKEN_PENGDING_TIME');
    bytes32 public constant LIST_TOKEN_SWITCH = bytes32('LIST_TOKEN_SWITCH');
    bytes32 public constant DEV_PRECENT = bytes32('DEV_PRECENT');
}

contract DemaxPair is BaseShareField {
    uint256 public version = 1;
    using SafeMath for uint256;
    using UQ112x112 for uint224;

    uint256 public constant MINIMUM_LIQUIDITY = 10**3;
    bytes4 private constant SELECTOR = bytes4(keccak256(bytes('transfer(address,uint256)')));

    address public FACTORY;
    address public CONFIG;
    address public DGAS;
    address public token0;
    address public token1;

    uint112 private reserve0; // uses single storage slot, accessible via getReserves
    uint112 private reserve1; // uses single storage slot, accessible via getReserves
    uint32 private blockTimestampLast; // uses single storage slot, accessible via getReserves

    uint256 public price0CumulativeLast;
    uint256 public price1CumulativeLast;

    uint256 public totalReward;
    uint256 public remainReward;
    uint256 public totalSupply;
    mapping(address => uint256) public balanceOf;
    event Mint(address indexed from, address indexed to, uint256 value);
    event Burn(address indexed from, address indexed to, uint256 value);
    event MintDGAS(address indexed player, uint256 pairMint, uint256 userMint);
    mapping(address => uint256) public lastMintBlock;

    uint private unlocked = 1;
    modifier lock() {
        require(unlocked == 1, 'Locked');
        unlocked = 0;
        _;
        unlocked = 1;
    }

    function _mint(address to, uint256 value) internal {
        totalSupply = totalSupply.add(value);
        balanceOf[to] = balanceOf[to].add(value);
        emit Mint(address(0), to, value);
    }

    function _burn(address from, uint256 value) internal {
        balanceOf[from] = balanceOf[from].sub(value);
        totalSupply = totalSupply.sub(value);
        emit Burn(from, address(0), value);
    }
    
    function _mintDGAS() internal {
        if(IDgas(DGAS).take() > 0) {
            uint reward = IDgas(DGAS).mint();
            uint devAmount = reward * IDemaxConfig(CONFIG).getConfigValue(ConfigNames.DEV_PRECENT) / 10000;
            address devAddress = IDemaxConfig(CONFIG).dev();
            _safeTransfer(DGAS, devAddress, devAmount);
            remainReward = remainReward.add(reward.sub(devAmount));
        }
    }
    
    function _currentReward() internal override view returns (uint) {
        uint devPercent = IDemaxConfig(CONFIG).getConfigValue(ConfigNames.DEV_PRECENT);
        uint pairReward = IDgas(DGAS).take().mul(10000 - devPercent).div(10000);
        return mintedShare.add(remainReward).add(pairReward).sub(totalShare);
    }

    function getReserves()
        public
        view
        returns (
            uint112 _reserve0,
            uint112 _reserve1,
            uint32 _blockTimestampLast
        )
    {
        _reserve0 = reserve0;
        _reserve1 = reserve1;
        _blockTimestampLast = blockTimestampLast;
    }

    function _safeTransfer(
        address token,
        address to,
        uint256 value
    ) private {
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(SELECTOR, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'DEMAX PAIR : TRANSFER_FAILED');
    }

    event Mint(address indexed sender, uint256 amount0, uint256 amount1);
    event Burn(address indexed sender, uint256 amount0, uint256 amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out,
        address indexed to
    );
    event SwapFee(address indexed token, address indexed to, uint256 amount);
    event Sync(uint112 reserve0, uint112 reserve1);

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

    modifier onlyPlatform {
        address platform = IDemaxConfig(CONFIG).platform();
        require(msg.sender == platform, 'DEMAX PAIR : FORBIDDEN');
        _;
    }

    // called once by the factory at time of deployment
    function initialize(
        address _token0,
        address _token1,
        address _config,
        address _dgas
    ) external {
        require(msg.sender == FACTORY, 'DEMAX PAIR : FORBIDDEN');
        token0 = _token0;
        token1 = _token1;
        CONFIG = _config;
        DGAS = _dgas;
        _setShareToken(DGAS);
    }

    // update reserves and, on the first call per block, price accumulators
    function _update(
        uint256 balance0,
        uint256 balance1,
        uint112 _reserve0,
        uint112 _reserve1
    ) private {
        require(balance0 <= uint112(-1) && balance1 <= uint112(-1), 'DEMAX PAIR : OVERFLOW');
        uint32 blockTimestamp = uint32(block.timestamp % 2**32);
        uint32 timeElapsed = blockTimestamp - blockTimestampLast; // overflow is desired
        if (timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0) {
            // * never overflows, and + overflow is desired
            price0CumulativeLast += uint256(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) * timeElapsed;
            price1CumulativeLast += uint256(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) * timeElapsed;
        }
        reserve0 = uint112(balance0);
        reserve1 = uint112(balance1);
        blockTimestampLast = blockTimestamp;
        emit Sync(reserve0, reserve1);
    }

    // this low-level function should be called from a contract which performs important safety checks
    function mint(address to) external onlyPlatform lock returns (uint256 liquidity) {
        (uint112 _reserve0, uint112 _reserve1, ) = getReserves(); // gas savings
        uint256 balance0 = _balanceOf(token0, address(this));
        uint256 balance1 = _balanceOf(token1, address(this));
        uint256 amount0 = balance0.sub(_reserve0);
        uint256 amount1 = balance1.sub(_reserve1);
        uint256 _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee
        if (_totalSupply == 0) {
            liquidity = Math.sqrt(amount0.mul(amount1)).sub(MINIMUM_LIQUIDITY);
            _mint(address(0), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens
        } else {
            liquidity = Math.min(amount0.mul(_totalSupply) / _reserve0, amount1.mul(_totalSupply) / _reserve1);
        }
        require(liquidity > 0, 'DEMAX PAIR : INSUFFICIENT_LIQUIDITY_MINTED');
        _mint(to, liquidity);
        _mintDGAS();
        _increaseProductivity(to, liquidity);
        lastMintBlock[to] = block.number;
        _update(balance0, balance1, _reserve0, _reserve1);
        emit Mint(msg.sender, amount0, amount1);
    }

    // this low-level function should be called from a contract which performs important safety checks
    function burn(
        address from,
        address to,
        uint256 amount
    ) external onlyPlatform lock returns (uint256 amount0, uint256 amount1) {
        require(
            block.number >=
                lastMintBlock[from] + IDemaxConfig(CONFIG).getConfigValue(ConfigNames.REMOVE_LIQUIDITY_DURATION),
            'DEMAX PLATFORM : REMOVE LIQUIDITY DURATION FAIL'
        );
        (uint112 _reserve0, uint112 _reserve1, ) = getReserves(); // gas savings
        address _token0 = token0; // gas savings
        address _token1 = token1; // gas savings
        uint256 balance0 = _balanceOf(_token0, address(this));
        uint256 balance1 = _balanceOf(_token1, address(this));
        require(balanceOf[from] >= amount, 'DEMAX PAIR : INSUFFICIENT_LIQUIDITY_AMOUNT');

        uint256 _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee
        amount0 = amount.mul(balance0) / _totalSupply; // using balances ensures pro-rata distribution
        amount1 = amount.mul(balance1) / _totalSupply; // using balances ensures pro-rata distribution
        require(amount0 > 0 && amount1 > 0, 'DEMAX PAIR : INSUFFICIENT_LIQUIDITY_BURNED');
        _burn(from, amount);
        _mintDGAS();
        _decreaseProductivity(from, amount);

        _safeTransfer(_token0, to, amount0);
        _safeTransfer(_token1, to, amount1);
        balance0 = _balanceOf(_token0, address(this));
        balance1 = _balanceOf(_token1, address(this));
        _update(balance0, balance1, _reserve0, _reserve1);

        emit Burn(msg.sender, amount0, amount1, to);
    }

    // this low-level function should be called from a contract which performs important safety checks
    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external onlyPlatform lock {
        require(amount0Out > 0 || amount1Out > 0, 'DEMAX PAIR : INSUFFICIENT_OUTPUT_AMOUNT');
        (uint112 _reserve0, uint112 _reserve1, ) = getReserves(); // gas savings
        require(amount0Out < _reserve0 && amount1Out < _reserve1, 'DEMAX PAIR :  INSUFFICIENT_LIQUIDITY');
        uint256 balance0;
        uint256 balance1;
        {
            address _token0 = token0;
            address _token1 = token1;
            require(to != _token0 && to != _token1, 'DEMAX PAIR : INVALID_TO');
            if (amount0Out > 0) _safeTransfer(_token0, to, amount0Out);
            if (amount1Out > 0) _safeTransfer(_token1, to, amount1Out);
            if (data.length > 0) IDemaxCallee(to).demaxCall(msg.sender, amount0Out, amount1Out, data);
            balance0 = _balanceOf(_token0, address(this));
            balance1 = _balanceOf(_token1, address(this));
        }
        uint256 amount0In = balance0 > _reserve0 - amount0Out ? balance0 - (_reserve0 - amount0Out) : 0;
        uint256 amount1In = balance1 > _reserve1 - amount1Out ? balance1 - (_reserve1 - amount1Out) : 0;
        uint256 _amount0Out = amount0Out;
        uint256 _amount1Out = amount1Out;
        require(amount0In > 0 || amount1In > 0, 'DEMAX PAIR : INSUFFICIENT_INPUT_AMOUNT');
        _update(balance0, balance1, _reserve0, _reserve1);
        emit Swap(msg.sender, amount0In, amount1In, _amount0Out, _amount1Out, to);
    }

    function swapFee(
        uint256 amount,
        address token,
        address to
    ) external onlyPlatform {
        if (amount == 0 || token == to) return;
        (uint112 _reserve0, uint112 _reserve1, ) = getReserves();
        require(to != token0 && to != token1, 'DEMAX PAIR : INVALID_TO');
        _safeTransfer(token, to, amount);
        uint256 balance0 = _balanceOf(token0, address(this));
        uint256 balance1 = _balanceOf(token1, address(this));
        _update(balance0, balance1, _reserve0, _reserve1);
        emit SwapFee(token, to , amount);
    }

    function queryReward() external view returns (uint256 rewardAmount, uint256 blockNumber) {
        rewardAmount = _takeWithAddress(msg.sender);
        blockNumber = block.number;
    }

    function mintReward() external lock returns (uint256 userReward) {
        _mintDGAS();
        userReward = _mint(msg.sender);
        remainReward = remainReward.sub(userReward);
        emit MintDGAS(msg.sender, remainReward, userReward);
    }

    function skim(address to) external lock {
        address _token0 = token0;
        address _token1 = token1;
        _safeTransfer(_token0, to, _balanceOf(_token0, address(this)).sub(reserve0));
        _safeTransfer(_token1, to, _balanceOf(_token0, address(this)).sub(reserve1));
    }

    function getDGASReserve() public view returns (uint256) {
        return _balanceOf(DGAS, address(this));
    }

    function _balanceOf(address token, address owner) internal view returns (uint256) {
        if (token == DGAS && owner == address(this)) {
            return IERC20(token).balanceOf(owner).sub(remainReward);
        } else {
            return IERC20(token).balanceOf(owner);
        }
    }

    // force reserves to match balances
    function sync() external lock {
        _update(_balanceOf(token0, address(this)), _balanceOf(token1, address(this)), reserve0, reserve1);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint256","name":"pairMint","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"userMint","type":"uint256"}],"name":"MintDGAS","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1Out","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SwapFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint112","name":"reserve0","type":"uint112"},{"indexed":false,"internalType":"uint112","name":"reserve1","type":"uint112"}],"name":"Sync","type":"event"},{"inputs":[],"name":"CONFIG","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DGAS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FACTORY","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINIMUM_LIQUIDITY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getDGASReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getProductivity","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserves","outputs":[{"internalType":"uint112","name":"_reserve0","type":"uint112"},{"internalType":"uint112","name":"_reserve1","type":"uint112"},{"internalType":"uint32","name":"_blockTimestampLast","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token0","type":"address"},{"internalType":"address","name":"_token1","type":"address"},{"internalType":"address","name":"_config","type":"address"},{"internalType":"address","name":"_dgas","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"interestsPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastMintBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintCumulation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintReward","outputs":[{"internalType":"uint256","name":"userReward","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintedShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price0CumulativeLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price1CumulativeLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"queryReward","outputs":[{"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"remainReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"shareToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"skim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount0Out","type":"uint256"},{"internalType":"uint256","name":"amount1Out","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"swap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"swapFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sync","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"users","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"rewardEarn","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60806040526001600755600160155534801561001a57600080fd5b50600880546001600160a01b03191633179055612a628061003c6000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c8063723c2e2d1161010f578063cf675365116100a2578063f6b911bc11610071578063f6b911bc146104d0578063f8c8765e14610506578063ffc527bf14610544578063fff6cae91461054c576101f0565b8063cf675365146104b0578063d14c9641146104b8578063d21220a7146104c0578063d92e82e4146104c8576101f0565b8063a87430ba116100de578063a87430ba14610436578063ba9a7a561461047a578063bc25cf7714610482578063bfc8b208146104a8576101f0565b8063723c2e2d146103cc578063750142e6146103d45780638b185b35146103dc57806396cda08014610402576101f0565b80632c79db11116101875780635a3d5493116101565780635a3d5493146103705780636a627842146103785780636c9fa59e1461039e57806370a08231146103a6576101f0565b80632c79db11146103505780632dd310001461035857806354fd4d50146103605780635909c0d514610368576101f0565b80631485ff78116101c35780631485ff78146102f9578063174f57af1461030157806318160ddd1461030957806328e964e914610311576101f0565b8063022c0d9f146101f5578063026c4207146102835780630902f1ac1461029d5780630dfe1681146102d5575b600080fd5b6102816004803603608081101561020b57600080fd5b8135916020810135916001600160a01b03604083013516919081019060808101606082013564010000000081111561024257600080fd5b82018360208201111561025457600080fd5b8035906020019184600183028401116401000000008311171561027657600080fd5b509092509050610554565b005b61028b6109ae565b60408051918252519081900360200190f35b6102a56109b4565b604080516001600160701b03948516815292909316602083015263ffffffff168183015290519081900360600190f35b6102dd6109de565b604080516001600160a01b039092168252519081900360200190f35b61028b6109ed565b61028b6109f3565b61028b610aa9565b6103376004803603602081101561032757600080fd5b50356001600160a01b0316610aaf565b6040805192835260208301919091528051918290030190f35b610337610acd565b6102dd610ae1565b61028b610af0565b61028b610af6565b61028b610afc565b61028b6004803603602081101561038e57600080fd5b50356001600160a01b0316610b02565b6102dd610e04565b61028b600480360360208110156103bc57600080fd5b50356001600160a01b0316610e13565b6102dd610e25565b61028b610e34565b61028b600480360360208110156103f257600080fd5b50356001600160a01b0316610e3a565b6102816004803603606081101561041857600080fd5b508035906001600160a01b0360208201358116916040013516610e4c565b61045c6004803603602081101561044c57600080fd5b50356001600160a01b0316611069565b60408051938452602084019290925282820152519081900360600190f35b61028b61108a565b6102816004803603602081101561049857600080fd5b50356001600160a01b0316611090565b61028b611145565b61028b61114b565b61028b611151565b6102dd611157565b6102dd611166565b610337600480360360608110156104e657600080fd5b506001600160a01b03813581169160208101359091169060400135611175565b6102816004803603608081101561051c57600080fd5b506001600160a01b038135811691602081013582169160408201358116916060013516611554565b61028b6115ff565b61028161161d565b6009546040805163097bc71960e31b815290516000926001600160a01b031691634bde38c8916004808301926020929190829003018186803b15801561059957600080fd5b505afa1580156105ad573d6000803e3d6000fd5b505050506040513d60208110156105c357600080fd5b50519050336001600160a01b0382161461061d576040805162461bcd60e51b81526020600482015260166024820152752222a6a0ac102820a4a9101d102327a92124a22222a760511b604482015290519081900360640190fd5b60155460011461065d576040805162461bcd60e51b8152602060048201526006602482015265131bd8dad95960d21b604482015290519081900360640190fd5b6000601555851515806106705750600085115b6106ab5760405162461bcd60e51b81526004018080602001828103825260278152602001806128ec6027913960400191505060405180910390fd5b6000806106b66109b4565b5091509150816001600160701b0316881080156106db5750806001600160701b031687105b6107165760405162461bcd60e51b8152600401808060200182810382526024815260200180612a096024913960400191505060405180910390fd5b600b54600c5460009182916001600160a01b0391821691908116908a1682148015906107545750806001600160a01b03168a6001600160a01b031614155b61079f576040805162461bcd60e51b815260206004820152601760248201527644454d41582050414952203a20494e56414c49445f544f60481b604482015290519081900360640190fd5b8b156107b0576107b0828b8e6116b5565b8a156107c1576107c1818b8d6116b5565b871561087c57896001600160a01b03166321fb6c90338e8e8d8d6040518663ffffffff1660e01b815260040180866001600160a01b03166001600160a01b03168152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509650505050505050600060405180830381600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b505050505b610886823061184f565b9350610892813061184f565b9250505060008a856001600160701b03160383116108b15760006108c0565b8a856001600160701b03160383035b905060008a856001600160701b03160383116108dd5760006108ec565b8a856001600160701b03160383035b90508b8b831515806108fe5750600083115b6109395760405162461bcd60e51b81526004018080602001828103825260268152602001806129136026913960400191505060405180910390fd5b61094586868a8a6119a2565b60408051858152602081018590528082018490526060810183905290516001600160a01b038e169133917fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229181900360800190a350506001601555505050505050505050505050565b60025481565b600d546001600160701b0380821692600160701b830490911691600160e01b900463ffffffff1690565b600b546001600160a01b031681565b60115481565b6000601554600114610a35576040805162461bcd60e51b8152602060048201526006602482015265131bd8dad95960d21b604482015290519081900360640190fd5b6000601555610a42611b69565b610a4b33611dab565b601154909150610a61908263ffffffff611e7716565b60118190556040805191825260208201839052805133927fef84ded3b746df8ce33b8e850942f885a71fa805217f9099d5e006a8f32ca58792908290030190a2600160155590565b60125481565b6001600160a01b031660009081526006602052604081205490549091565b600080610ad933611ec0565b924392509050565b6008546001600160a01b031681565b60075481565b600e5481565b600f5481565b600080600960009054906101000a90046001600160a01b03166001600160a01b0316634bde38c86040518163ffffffff1660e01b815260040160206040518083038186803b158015610b5357600080fd5b505afa158015610b67573d6000803e3d6000fd5b505050506040513d6020811015610b7d57600080fd5b50519050336001600160a01b03821614610bd7576040805162461bcd60e51b81526020600482015260166024820152752222a6a0ac102820a4a9101d102327a92124a22222a760511b604482015290519081900360640190fd5b601554600114610c17576040805162461bcd60e51b8152602060048201526006602482015265131bd8dad95960d21b604482015290519081900360640190fd5b6000601581905580610c276109b4565b50600b549193509150600090610c46906001600160a01b03163061184f565b600c54909150600090610c62906001600160a01b03163061184f565b90506000610c7f836001600160701b03871663ffffffff611e7716565b90506000610c9c836001600160701b03871663ffffffff611e7716565b60125490915080610ce557610cd16103e8610cc5610cc0868663ffffffff611f7016565b611fc9565b9063ffffffff611e7716565b9850610ce060006103e861201a565b610d34565b610d316001600160701b038816610d02858463ffffffff611f7016565b81610d0957fe5b046001600160701b038816610d24858563ffffffff611f7016565b81610d2b57fe5b046120b1565b98505b60008911610d735760405162461bcd60e51b815260040180806020018281038252602a815260200180612989602a913960400191505060405180910390fd5b610d7d8a8a61201a565b610d85611b69565b610d8f8a8a6120c7565b506001600160a01b038a166000908152601460205260409020439055610db7858589896119a2565b6040805184815260208101849052815133927f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f928290030190a25050600160155550949695505050505050565b6005546001600160a01b031681565b60136020526000908152604090205481565b600a546001600160a01b031681565b60105481565b60146020526000908152604090205481565b6009546040805163097bc71960e31b815290516000926001600160a01b031691634bde38c8916004808301926020929190829003018186803b158015610e9157600080fd5b505afa158015610ea5573d6000803e3d6000fd5b505050506040513d6020811015610ebb57600080fd5b50519050336001600160a01b03821614610f15576040805162461bcd60e51b81526020600482015260166024820152752222a6a0ac102820a4a9101d102327a92124a22222a760511b604482015290519081900360640190fd5b831580610f335750816001600160a01b0316836001600160a01b0316145b15610f3d57611063565b600080610f486109b4565b50600b5491935091506001600160a01b03858116911614801590610f7a5750600c546001600160a01b03858116911614155b610fc5576040805162461bcd60e51b815260206004820152601760248201527644454d41582050414952203a20494e56414c49445f544f60481b604482015290519081900360640190fd5b610fd08585886116b5565b600b54600090610fe9906001600160a01b03163061184f565b600c54909150600090611005906001600160a01b03163061184f565b9050611013828286866119a2565b856001600160a01b0316876001600160a01b03167fd58eef465bb0100d5e79f7940ef7ec9eafeff04fa088db4388968231fffaf07d8a6040518082815260200191505060405180910390a3505050505b50505050565b60066020526000908152604090208054600182015460029092015490919083565b6103e881565b6015546001146110d0576040805162461bcd60e51b8152602060048201526006602482015265131bd8dad95960d21b604482015290519081900360640190fd5b6000601555600b54600c54600d546001600160a01b039283169290911690611112908390859061110d906001600160701b0316610cc5843061184f565b6116b5565b600d5461113b908290859061110d90600160701b90046001600160701b0316610cc5873061184f565b5050600160155550565b60015490565b60045481565b60035481565b600c546001600160a01b031681565b6009546001600160a01b031681565b6000806000600960009054906101000a90046001600160a01b03166001600160a01b0316634bde38c86040518163ffffffff1660e01b815260040160206040518083038186803b1580156111c857600080fd5b505afa1580156111dc573d6000803e3d6000fd5b505050506040513d60208110156111f257600080fd5b50519050336001600160a01b0382161461124c576040805162461bcd60e51b81526020600482015260166024820152752222a6a0ac102820a4a9101d102327a92124a22222a760511b604482015290519081900360640190fd5b60155460011461128c576040805162461bcd60e51b8152602060048201526006602482015265131bd8dad95960d21b604482015290519081900360640190fd5b6000601555600954604080516360ccef1960e11b81527f52454d4f56455f4c49515549444954595f4455524154494f4e00000000000000600482015290516001600160a01b039092169163c199de3291602480820192602092909190829003018186803b1580156112fc57600080fd5b505afa158015611310573d6000803e3d6000fd5b505050506040513d602081101561132657600080fd5b50516001600160a01b038716600090815260146020526040902054014310156113805760405162461bcd60e51b815260040180806020018281038252602f81526020018061295a602f913960400191505060405180910390fd5b60008061138b6109b4565b50600b54600c549294509092506001600160a01b03908116911660006113b1833061184f565b905060006113bf833061184f565b6001600160a01b038d166000908152601360205260409020549091508a11156114195760405162461bcd60e51b815260040180806020018281038252602a8152602001806128c2602a913960400191505060405180910390fd5b6012548061142d8c8563ffffffff611f7016565b8161143457fe5b049950806114488c8463ffffffff611f7016565b8161144f57fe5b04985060008a1180156114625750600089115b61149d5760405162461bcd60e51b815260040180806020018281038252602a8152602001806129b3602a913960400191505060405180910390fd5b6114a78d8c612186565b6114af611b69565b6114b98d8c612223565b506114c5858d8c6116b5565b6114d0848d8b6116b5565b6114da853061184f565b92506114e6843061184f565b91506114f4838389896119a2565b604080518b8152602081018b905281516001600160a01b038f169233927fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496929081900390910190a350505050505050600160158190555050935093915050565b6008546001600160a01b031633146115ac576040805162461bcd60e51b81526020600482015260166024820152752222a6a0ac102820a4a9101d102327a92124a22222a760511b604482015290519081900360640190fd5b600b80546001600160a01b03199081166001600160a01b0387811691909117909255600c80548216868416179055600980548216858416179055600a805490911683831617908190556110639116612305565b600a54600090611618906001600160a01b03163061184f565b905090565b60155460011461165d576040805162461bcd60e51b8152602060048201526006602482015265131bd8dad95960d21b604482015290519081900360640190fd5b6000601555600b546116ae9061167c906001600160a01b03163061184f565b600c54611692906001600160a01b03163061184f565b600d546001600160701b0380821691600160701b9004166119a2565b6001601555565b604080518082018252601981527f7472616e7366657228616464726573732c75696e74323536290000000000000060209182015281516001600160a01b0385811660248301526044808301869052845180840390910181526064909201845291810180516001600160e01b031663a9059cbb60e01b1781529251815160009460609489169392918291908083835b602083106117625780518252601f199092019160209182019101611743565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146117c4576040519150601f19603f3d011682016040523d82523d6000602084013e6117c9565b606091505b50915091508180156117f75750805115806117f757508080602001905160208110156117f457600080fd5b50515b611848576040805162461bcd60e51b815260206004820152601c60248201527f44454d41582050414952203a205452414e534645525f4641494c454400000000604482015290519081900360640190fd5b5050505050565b600a546000906001600160a01b03848116911614801561187757506001600160a01b03821630145b1561191757611910601154846001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156118d857600080fd5b505afa1580156118ec573d6000803e3d6000fd5b505050506040513d602081101561190257600080fd5b50519063ffffffff611e7716565b905061199c565b826001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561196d57600080fd5b505afa158015611981573d6000803e3d6000fd5b505050506040513d602081101561199757600080fd5b505190505b92915050565b6001600160701b0384118015906119c057506001600160701b038311155b611a09576040805162461bcd60e51b815260206004820152601560248201527444454d41582050414952203a204f564552464c4f5760581b604482015290519081900360640190fd5b600d5463ffffffff42811691600160e01b90048116820390811615801590611a3957506001600160701b03841615155b8015611a4d57506001600160701b03831615155b15611abe578063ffffffff16611a7b85611a6686612327565b6001600160e01b03169063ffffffff61233916565b600e80546001600160e01b03929092169290920201905563ffffffff8116611aa684611a6687612327565b600f80546001600160e01b0392909216929092020190555b600d80546dffffffffffffffffffffffffffff19166001600160701b03888116919091176dffffffffffffffffffffffffffff60701b1916600160701b8883168102919091176001600160e01b0316600160e01b63ffffffff871602179283905560408051848416815291909304909116602082015281517f1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1929181900390910190a1505050505050565b600a546040805163159090bd60e01b815290516000926001600160a01b03169163159090bd916004808301926020929190829003018186803b158015611bae57600080fd5b505afa158015611bc2573d6000803e3d6000fd5b505050506040513d6020811015611bd857600080fd5b50511115611da957600a5460408051631249c58b60e01b815290516000926001600160a01b031691631249c58b91600480830192602092919082900301818787803b158015611c2657600080fd5b505af1158015611c3a573d6000803e3d6000fd5b505050506040513d6020811015611c5057600080fd5b5051600954604080516360ccef1960e11b81526a11115597d4149150d1539560aa1b60048201529051929350600092612710926001600160a01b03169163c199de32916024808301926020929190829003018186803b158015611cb257600080fd5b505afa158015611cc6573d6000803e3d6000fd5b505050506040513d6020811015611cdc57600080fd5b5051830281611ce757fe5b0490506000600960009054906101000a90046001600160a01b03166001600160a01b03166391cca3db6040518163ffffffff1660e01b815260040160206040518083038186803b158015611d3a57600080fd5b505afa158015611d4e573d6000803e3d6000fd5b505050506040513d6020811015611d6457600080fd5b5051600a54909150611d80906001600160a01b031682846116b5565b611da2611d93848463ffffffff611e7716565b6011549063ffffffff61235e16565b6011555050505b565b6000611db56123b8565b611dbe82612439565b6001600160a01b038216600090815260066020526040902060020154611e1d576040805162461bcd60e51b815260206004820152600f60248201526e1393d512125391c81513c813525395608a1b604482015290519081900360640190fd5b6001600160a01b038083166000908152600660205260409020600201546005549091611e4b911633836124e1565b6001600160a01b038316600090815260066020526040812060020155600380548201905590505b919050565b6000611eb983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612644565b9392505050565b6001600160a01b0381166000908152600660205260408120600154825415611f2c576000611eec6126db565b9050611f28611f1b600054611f0f64e8d4a5100085611f7090919063ffffffff16565b9063ffffffff61281f16565b839063ffffffff61235e16565b9150505b611f688260010154610cc58460020154611f5c64e8d4a51000611f0f878960000154611f7090919063ffffffff16565b9063ffffffff61235e16565b949350505050565b600082611f7f5750600061199c565b82820282848281611f8c57fe5b0414611eb95760405162461bcd60e51b81526004018080602001828103825260218152602001806129396021913960400191505060405180910390fd5b6000600382111561200c575080600160028204015b8181101561200657809150600281828581611ff557fe5b040181611ffe57fe5b049050611fde565b50611e72565b8115611e7257506001919050565b60125461202d908263ffffffff61235e16565b6012556001600160a01b038216600090815260136020526040902054612059908263ffffffff61235e16565b6001600160a01b03831660008181526013602090815260408083209490945583518581529351929391927fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f89281900390910190a35050565b60008183106120c05781611eb9565b5090919050565b60008082116121075760405162461bcd60e51b815260040180806020018281038252602c8152602001806129dd602c913960400191505060405180910390fd5b6001600160a01b03831660009081526006602052604090206121276123b8565b61213084612439565b600054612143908463ffffffff61235e16565b6000558054612158908463ffffffff61235e16565b8082556001546121799164e8d4a5100091611f0f919063ffffffff611f7016565b6001918201559392505050565b6001600160a01b0382166000908152601360205260409020546121af908263ffffffff611e7716565b6001600160a01b0383166000908152601360205260409020556012546121db908263ffffffff611e7716565b6012556040805182815290516000916001600160a01b038516917fbac40739b0d4ca32fa2d82fc91630465ba3eddd1598da6fca393b26fb63b94539181900360200190a35050565b6001600160a01b0382166000908152600660205260408120821580159061224b575080548311155b61229c576040805162461bcd60e51b815260206004820152601960248201527f494e53554646494349454e545f50524f44554354495649545900000000000000604482015290519081900360640190fd5b6122a46123b8565b6122ad84612439565b80546122bf908463ffffffff611e7716565b8082556001546122e09164e8d4a5100091611f0f919063ffffffff611f7016565b60018201556000546122f8908463ffffffff611e7716565b6000555060019392505050565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160701b0316600160701b0290565b60006001600160701b0382166001600160e01b0384168161235657fe5b049392505050565b600082820183811015611eb9576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000546123e1576123d96123ca6126db565b6002549063ffffffff61235e16565b600255611da9565b60006123eb6126db565b905061241d61240e600054611f0f64e8d4a5100085611f7090919063ffffffff16565b6001549063ffffffff61235e16565b600155600254612433908263ffffffff61235e16565b60025550565b6001600160a01b03811660009081526006602052604090208054156124dd5760006124848260010154610cc564e8d4a51000611f0f6001548760000154611f7090919063ffffffff16565b600283015490915061249c908263ffffffff61235e16565b60028301556004546124b4908263ffffffff61235e16565b60045560015482546124d69164e8d4a5100091611f0f9163ffffffff611f7016565b6001830155505b5050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b6020831061255e5780518252601f19909201916020918201910161253f565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146125c0576040519150601f19603f3d011682016040523d82523d6000602084013e6125c5565b606091505b50915091508180156125f35750805115806125f357508080602001905160208110156125f057600080fd5b50515b611848576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b600081848411156126d35760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612698578181015183820152602001612680565b50505050905090810190601f1680156126c55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600954604080516360ccef1960e11b81526a11115597d4149150d1539560aa1b6004820152905160009283926001600160a01b039091169163c199de3291602480820192602092909190829003018186803b15801561273957600080fd5b505afa15801561274d573d6000803e3d6000fd5b505050506040513d602081101561276357600080fd5b5051600a546040805163159090bd60e01b815290519293506000926127f59261271092611f0f92878503926001600160a01b03169163159090bd916004808301926020929190829003018186803b1580156127bd57600080fd5b505afa1580156127d1573d6000803e3d6000fd5b505050506040513d60208110156127e757600080fd5b50519063ffffffff611f7016565b9050612818600254610cc583611f5c60115460035461235e90919063ffffffff16565b9250505090565b6000611eb983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250600081836128ab5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612698578181015183820152602001612680565b5060008385816128b757fe5b049594505050505056fe44454d41582050414952203a20494e53554646494349454e545f4c49515549444954595f414d4f554e5444454d41582050414952203a20494e53554646494349454e545f4f55545055545f414d4f554e5444454d41582050414952203a20494e53554646494349454e545f494e5055545f414d4f554e54536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7744454d415820504c4154464f524d203a2052454d4f5645204c4951554944495459204455524154494f4e204641494c44454d41582050414952203a20494e53554646494349454e545f4c49515549444954595f4d494e54454444454d41582050414952203a20494e53554646494349454e545f4c49515549444954595f4255524e454450524f4455435449564954595f56414c55455f4d5553545f42455f475245415445525f5448414e5f5a45524f44454d41582050414952203a2020494e53554646494349454e545f4c4951554944495459a26469706673582212204d225b722b5690b08726d6af582aa124d1f48f8bd9473e6f7f890e76efeb0db864736f6c63430006060033

Deployed ByteCode Sourcemap

20918:12184:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20918:12184:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;29538:1589:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;29538:1589:0;;;;;;;;-1:-1:-1;;;;;29538:1589:0;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;29538:1589:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;29538:1589:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;29538:1589:0;;-1:-1:-1;29538:1589:0;-1:-1:-1;29538:1589:0;:::i;:::-;;14885:22;;;:::i;:::-;;;;;;;;;;;;;;;;23519:313;;;:::i;:::-;;;;-1:-1:-1;;;;;23519:313:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21300:21;;;:::i;:::-;;;;-1:-1:-1;;;;;21300:21:0;;;;;;;;;;;;;;21749:27;;;:::i;31926:252::-;;;:::i;21783:26::-;;;:::i;19290:145::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;19290:145:0;-1:-1:-1;;;;;19290:145:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;31730:188;;;:::i;21217:22::-;;;:::i;20962:26::-;;;:::i;21630:35::-;;;:::i;21672:::-;;;:::i;26444:1219::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;26444:1219:0;-1:-1:-1;;;;;26444:1219:0;;:::i;14983:25::-;;;:::i;21816:44::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;21816:44:0;-1:-1:-1;;;;;21816:44:0;;:::i;21274:19::-;;;:::i;21716:26::-;;;:::i;22096:48::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;22096:48:0;-1:-1:-1;;;;;22096:48:0;;:::i;31135:587::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;31135:587:0;;;-1:-1:-1;;;;;31135:587:0;;;;;;;;;;;;:::i;15220:41::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;15220:41:0;-1:-1:-1;;;;;15220:41:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;21064:49;;;:::i;32186:292::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;32186:292:0;-1:-1:-1;;;;;32186:292:0;;:::i;19491:107::-;;;:::i;14944:26::-;;;:::i;14914:23::-;;;:::i;21328:21::-;;;:::i;21246:::-;;;:::i;27775:1651::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;27775:1651:0;;;;;;;;;;;;;;;;;:::i;24982:348::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;24982:348:0;;;;;;;;;;;;;;;;;;;;;;;;:::i;32486:113::-;;;:::i;32953:146::-;;;:::i;29538:1589::-;24811:6;;24798:31;;;-1:-1:-1;;;24798:31:0;;;;24779:16;;-1:-1:-1;;;;;24811:6:0;;24798:29;;:31;;;;;;;;;;;;;;24811:6;24798:31;;;2:2:-1;;;;27:1;24;17:12;2:2;24798:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24798:31:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;24798:31:0;;-1:-1:-1;24848:10:0;-1:-1:-1;;;;;24848:22:0;;;24840:57;;;;;-1:-1:-1;;;24840:57:0;;;;;;;;;;;;-1:-1:-1;;;24840:57:0;;;;;;;;;;;;;;;22220:8:::1;;22232:1;22220:13;22212:32;;;::::0;;-1:-1:-1;;;22212:32:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;22212:32:0;;;;;;;;;;;;;::::1;;22266:1;22255:8;:12:::0;29714:14;;;;:32:::2;;;29745:1;29732:10;:14;29714:32;29706:84;;;;-1:-1:-1::0;;;29706:84:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29802:17;29821::::0;29844:13:::2;:11;:13::i;:::-;29801:56;;;;;29904:9;-1:-1:-1::0;;;;;29891:22:0::2;:10;:22;:48;;;;;29930:9;-1:-1:-1::0;;;;;29917:22:0::2;:10;:22;29891:48;29883:97;;;;-1:-1:-1::0;;;29883:97:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30078:6;::::0;30117::::2;::::0;29991:16:::2;::::0;;;-1:-1:-1;;;;;30078:6:0;;::::2;::::0;30117;;::::2;::::0;30146:13;::::2;::::0;::::2;::::0;::::2;::::0;:30:::2;;;30169:7;-1:-1:-1::0;;;;;30163:13:0::2;:2;-1:-1:-1::0;;;;;30163:13:0::2;;;30146:30;30138:66;;;::::0;;-1:-1:-1;;;30138:66:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;30138:66:0;;;;;;;;;;;;;::::2;;30223:14:::0;;30219:58:::2;;30239:38;30253:7;30262:2;30266:10;30239:13;:38::i;:::-;30296:14:::0;;30292:58:::2;;30312:38;30326:7;30335:2;30339:10;30312:13;:38::i;:::-;30369:15:::0;;30365:89:::2;;30399:2;-1:-1:-1::0;;;;;30386:26:0::2;;30413:10;30425;30437;30449:4;;30386:68;;;;;;;;;;;;;-1:-1:-1::0;;;;;30386:68:0::2;-1:-1:-1::0;;;;;30386:68:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;30386:68:0;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;30386:68:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;30386:68:0;;;;30365:89;30480:34;30491:7;30508:4;30480:10;:34::i;:::-;30469:45;;30540:34;30551:7;30568:4;30540:10;:34::i;:::-;30529:45;;22278:1;;30596:17;30639:10;30627:9;-1:-1:-1::0;;;;;30627:22:0::2;;30616:8;:33;:75;;30690:1;30616:75;;;30676:10;30664:9;-1:-1:-1::0;;;;;30664:22:0::2;;30652:8;:35;30616:75;30596:95;;30702:17;30745:10;30733:9;-1:-1:-1::0;;;;;30733:22:0::2;;30722:8;:33;:75;;30796:1;30722:75;;;30782:10;30770:9;-1:-1:-1::0;;;;;30770:22:0::2;;30758:8;:35;30722:75;30702:95:::0;-1:-1:-1;30830:10:0;30873;30902:13;;;;:30:::2;;;30931:1;30919:9;:13;30902:30;30894:81;;;;-1:-1:-1::0;;;30894:81:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30986:49;30994:8;31004;31014:9;31025;30986:7;:49::i;:::-;31051:68;::::0;;;;;::::2;::::0;::::2;::::0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31051:68:0;::::2;::::0;31056:10:::2;::::0;31051:68:::2;::::0;;;;;;;::::2;-1:-1:-1::0;;22301:1:0::1;22290:8;:12:::0;-1:-1:-1;;;;;;;;;;;;29538:1589:0:o;14885:22::-;;;;:::o;23519:313::-;23734:8;;-1:-1:-1;;;;;23734:8:0;;;;-1:-1:-1;;;23765:8:0;;;;;;-1:-1:-1;;;23806:18:0;;;;;23519:313::o;21300:21::-;;;-1:-1:-1;;;;;21300:21:0;;:::o;21749:27::-;;;;:::o;31926:252::-;31971:18;22220:8;;22232:1;22220:13;22212:32;;;;;-1:-1:-1;;;22212:32:0;;;;;;;;;;;;-1:-1:-1;;;22212:32:0;;;;;;;;;;;;;;;22266:1;22255:8;:12;32002:11:::1;:9;:11::i;:::-;32037:17;32043:10;32037:5;:17::i;:::-;32080:12;::::0;32024:30;;-1:-1:-1;32080:28:0::1;::::0;32024:30;32080:28:::1;:16;:28;:::i;:::-;32065:12;:43:::0;;;32124:46:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;32133:10:::1;::::0;32124:46:::1;::::0;;;;;;;::::1;22301:1:::0;22290:8;:12;31926:252;:::o;21783:26::-;;;;:::o;19290:145::-;-1:-1:-1;;;;;19389:11:0;19358:4;19389:11;;;:5;:11;;;;;:18;19409:17;;19389:18;;19290:145::o;31730:188::-;31776:20;31798:19;31845:28;31862:10;31845:16;:28::i;:::-;31830:43;31898:12;;-1:-1:-1;31730:188:0;-1:-1:-1;31730:188:0:o;21217:22::-;;;-1:-1:-1;;;;;21217:22:0;;:::o;20962:26::-;;;;:::o;21630:35::-;;;;:::o;21672:::-;;;;:::o;26444:1219::-;26506:17;24779:16;24811:6;;;;;;;;;-1:-1:-1;;;;;24811:6:0;-1:-1:-1;;;;;24798:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24798:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24798:31:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;24798:31:0;;-1:-1:-1;24848:10:0;-1:-1:-1;;;;;24848:22:0;;;24840:57;;;;;-1:-1:-1;;;24840:57:0;;;;;;;;;;;;-1:-1:-1;;;24840:57:0;;;;;;;;;;;;;;;22220:8:::1;;22232:1;22220:13;22212:32;;;::::0;;-1:-1:-1;;;22212:32:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;22212:32:0;;;;;;;;;;;;;::::1;;22266:1;22255:8;:12:::0;;;22266:1;26579:13:::2;:11;:13::i;:::-;-1:-1:-1::0;26648:6:0::2;::::0;26536:56;;-1:-1:-1;26536:56:0;-1:-1:-1;26618:16:0::2;::::0;26637:33:::2;::::0;-1:-1:-1;;;;;26648:6:0::2;26664:4;26637:10;:33::i;:::-;26711:6;::::0;26618:52;;-1:-1:-1;26681:16:0::2;::::0;26700:33:::2;::::0;-1:-1:-1;;;;;26711:6:0::2;26727:4;26700:10;:33::i;:::-;26681:52:::0;-1:-1:-1;26744:15:0::2;26762:23;:8:::0;-1:-1:-1;;;;;26762:23:0;::::2;;:12;:23;:::i;:::-;26744:41:::0;-1:-1:-1;26796:15:0::2;26814:23;:8:::0;-1:-1:-1;;;;;26814:23:0;::::2;;:12;:23;:::i;:::-;26871:11;::::0;26796:41;;-1:-1:-1;26975:17:0;26971:353:::2;;27021:54;21108:5;27021:31;27031:20;:7:::0;27043;27031:20:::2;:11;:20;:::i;:::-;27021:9;:31::i;:::-;:35:::0;:54:::2;:35;:54;:::i;:::-;27009:66;;27090:36;27104:1;21108:5;27090;:36::i;:::-;26971:353;;;27226:86;-1:-1:-1::0;;;;;27235:37:0;::::2;:25;:7:::0;27247:12;27235:25:::2;:11;:25;:::i;:::-;:37;;;;;;-1:-1:-1::0;;;;;27274:37:0;::::2;:25;:7:::0;27286:12;27274:25:::2;:11;:25;:::i;:::-;:37;;;;;;27226:8;:86::i;:::-;27214:98;;26971:353;27354:1;27342:9;:13;27334:68;;;;-1:-1:-1::0;;;27334:68:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27413:20;27419:2;27423:9;27413:5;:20::i;:::-;27444:11;:9;:11::i;:::-;27466:36;27488:2;27492:9;27466:21;:36::i;:::-;-1:-1:-1::0;;;;;;27513:17:0;::::2;;::::0;;;:13:::2;:17;::::0;;;;27533:12:::2;27513:32:::0;;27556:49:::2;27564:8:::0;27574;27584:9;27595;27556:7:::2;:49::i;:::-;27621:34;::::0;;;;;::::2;::::0;::::2;::::0;;;;;27626:10:::2;::::0;27621:34:::2;::::0;;;;;;::::2;-1:-1:-1::0;;22301:1:0::1;22290:8;:12:::0;-1:-1:-1;26444:1219:0;;;-1:-1:-1;;;;;;26444:1219:0:o;14983:25::-;;;-1:-1:-1;;;;;14983:25:0;;:::o;21816:44::-;;;;;;;;;;;;;:::o;21274:19::-;;;-1:-1:-1;;;;;21274:19:0;;:::o;21716:26::-;;;;:::o;22096:48::-;;;;;;;;;;;;;:::o;31135:587::-;24811:6;;24798:31;;;-1:-1:-1;;;24798:31:0;;;;24779:16;;-1:-1:-1;;;;;24811:6:0;;24798:29;;:31;;;;;;;;;;;;;;24811:6;24798:31;;;2:2:-1;;;;27:1;24;17:12;2:2;24798:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24798:31:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;24798:31:0;;-1:-1:-1;24848:10:0;-1:-1:-1;;;;;24848:22:0;;;24840:57;;;;;-1:-1:-1;;;24840:57:0;;;;;;;;;;;;-1:-1:-1;;;24840:57:0;;;;;;;;;;;;;;;31266:11;;;:26:::1;;;31290:2;-1:-1:-1::0;;;;;31281:11:0::1;:5;-1:-1:-1::0;;;;;31281:11:0::1;;31266:26;31262:39;;;31294:7;;31262:39;31312:17;31331::::0;31354:13:::1;:11;:13::i;:::-;-1:-1:-1::0;31392:6:0::1;::::0;31311:56;;-1:-1:-1;31311:56:0;-1:-1:-1;;;;;;31386:12:0;;::::1;31392:6:::0;::::1;31386:12;::::0;::::1;::::0;:28:::1;;-1:-1:-1::0;31408:6:0::1;::::0;-1:-1:-1;;;;;31402:12:0;;::::1;31408:6:::0;::::1;31402:12;;31386:28;31378:64;;;::::0;;-1:-1:-1;;;31378:64:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31378:64:0;;;;;;;;;;;;;::::1;;31453:32;31467:5;31474:2;31478:6;31453:13;:32::i;:::-;31526:6;::::0;31496:16:::1;::::0;31515:33:::1;::::0;-1:-1:-1;;;;;31526:6:0::1;31542:4;31515:10;:33::i;:::-;31589:6;::::0;31496:52;;-1:-1:-1;31559:16:0::1;::::0;31578:33:::1;::::0;-1:-1:-1;;;;;31589:6:0::1;31605:4;31578:10;:33::i;:::-;31559:52;;31622:49;31630:8;31640;31650:9;31661;31622:7;:49::i;:::-;31702:2;-1:-1:-1::0;;;;;31687:27:0::1;31695:5;-1:-1:-1::0;;;;;31687:27:0::1;;31707:6;31687:27;;;;;;;;;;;;;;;;;;24908:1;;;;;31135:587:::0;;;;:::o;15220:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21064:49::-;21108:5;21064:49;:::o;32186:292::-;22220:8;;22232:1;22220:13;22212:32;;;;;-1:-1:-1;;;22212:32:0;;;;;;;;;;;;-1:-1:-1;;;22212:32:0;;;;;;;;;;;;;;;22266:1;22255:8;:12;32255:6:::1;::::0;32290::::1;::::0;32373:8:::1;::::0;-1:-1:-1;;;;;32255:6:0;;::::1;::::0;32290;;::::1;::::0;32307:76:::1;::::0;32255:6;;32330:2;;32334:48:::1;::::0;-1:-1:-1;;;;;32373:8:0::1;32334:34;32255:6:::0;32362:4:::1;32334:10;:34::i;:48::-;32307:13;:76::i;:::-;32460:8;::::0;32394:76:::1;::::0;32408:7;;32417:2;;32421:48:::1;::::0;-1:-1:-1;;;32460:8:0;::::1;-1:-1:-1::0;;;;;32460:8:0::1;32421:34;32432:7:::0;32449:4:::1;32421:10;:34::i;32394:76::-;-1:-1:-1::0;;22301:1:0;22290:8;:12;-1:-1:-1;32186:292:0:o;19491:107::-;19573:17;;19491:107;:::o;14944:26::-;;;;:::o;14914:23::-;;;;:::o;21328:21::-;;;-1:-1:-1;;;;;21328:21:0;;:::o;21246:::-;;;-1:-1:-1;;;;;21246:21:0;;:::o;27775:1651::-;27901:15;27918;24779:16;24811:6;;;;;;;;;-1:-1:-1;;;;;24811:6:0;-1:-1:-1;;;;;24798:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24798:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24798:31:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;24798:31:0;;-1:-1:-1;24848:10:0;-1:-1:-1;;;;;24848:22:0;;;24840:57;;;;;-1:-1:-1;;;24840:57:0;;;;;;;;;;;;-1:-1:-1;;;24840:57:0;;;;;;;;;;;;;;;22220:8:::1;;22232:1;22220:13;22212:32;;;::::0;;-1:-1:-1;;;22212:32:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;22212:32:0;;;;;;;;;;;;;::::1;;22266:1;22255:8;:12:::0;28036:6:::2;::::0;28023:74:::2;::::0;;-1:-1:-1;;;28023:74:0;;20000:36:::2;28023:74;::::0;::::2;::::0;;;-1:-1:-1;;;;;28036:6:0;;::::2;::::0;28023:35:::2;::::0;:74;;;;;::::2;::::0;;;;;;;;;28036:6;28023:74;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;28023:74:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;28023:74:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::2;4:2;-1:-1:::0;28023:74:0;-1:-1:-1;;;;;28001:19:0;::::2;;::::0;;;:13:::2;28023:74;28001:19:::0;;;;;:96:::2;27968:12;:129;;27946:226;;;;-1:-1:-1::0;;;27946:226:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28184:17;28203::::0;28226:13:::2;:11;:13::i;:::-;-1:-1:-1::0;28283:6:0::2;::::0;28333::::2;::::0;28183:56;;-1:-1:-1;28183:56:0;;-1:-1:-1;;;;;;28283:6:0;;::::2;::::0;28333::::2;28265:15;28384:34;28283:6:::0;28412:4:::2;28384:10;:34::i;:::-;28365:53;;28429:16;28448:34;28459:7;28476:4;28448:10;:34::i;:::-;-1:-1:-1::0;;;;;28501:15:0;::::2;;::::0;;;:9:::2;:15;::::0;;;;;28429:53;;-1:-1:-1;28501:25:0;-1:-1:-1;28501:25:0::2;28493:80;;;;-1:-1:-1::0;;;28493:80:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28609:11;::::0;;28719:20:::2;:6:::0;28730:8;28719:20:::2;:10;:20;:::i;:::-;:35;;;;;;::::0;-1:-1:-1;28846:12:0;28823:20:::2;:6:::0;28834:8;28823:20:::2;:10;:20;:::i;:::-;:35;;;;;;28813:45;;28935:1;28925:7;:11;:26;;;;;28950:1;28940:7;:11;28925:26;28917:81;;;;-1:-1:-1::0;;;28917:81:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29009:19;29015:4;29021:6;29009:5;:19::i;:::-;29039:11;:9;:11::i;:::-;29061:35;29083:4;29089:6;29061:21;:35::i;:::-;;29109;29123:7;29132:2;29136:7;29109:13;:35::i;:::-;29155;29169:7;29178:2;29182:7;29155:13;:35::i;:::-;29212:34;29223:7;29240:4;29212:10;:34::i;:::-;29201:45;;29268:34;29279:7;29296:4;29268:10;:34::i;:::-;29257:45;;29313:49;29321:8;29331;29341:9;29352;29313:7;:49::i;:::-;29380:38;::::0;;;;;::::2;::::0;::::2;::::0;;;;;-1:-1:-1;;;;;29380:38:0;::::2;::::0;29385:10:::2;::::0;29380:38:::2;::::0;;;;;;;;;::::2;22278:1;;;;;;;22301::::1;22290:8;:12;;;;27775:1651:::0;;;;;;;:::o;24982:348::-;25153:7;;-1:-1:-1;;;;;25153:7:0;25139:10;:21;25131:56;;;;;-1:-1:-1;;;25131:56:0;;;;;;;;;;;;-1:-1:-1;;;25131:56:0;;;;;;;;;;;;;;;25198:6;:16;;-1:-1:-1;;;;;;25198:16:0;;;-1:-1:-1;;;;;25198:16:0;;;;;;;;;;25225:6;:16;;;;;;;;;;25252:6;:16;;;;;;;;;;25279:4;:12;;;;;;;;;;;;;25302:20;;25317:4;25302:14;:20::i;32486:113::-;32571:4;;32533:7;;32560:31;;-1:-1:-1;;;;;32571:4:0;32585;32560:10;:31::i;:::-;32553:38;;32486:113;:::o;32953:146::-;22220:8;;22232:1;22220:13;22212:32;;;;;-1:-1:-1;;;22212:32:0;;;;;;;;;;;;-1:-1:-1;;;22212:32:0;;;;;;;;;;;;;;;22266:1;22255:8;:12;33013:6:::1;::::0;32994:97:::1;::::0;33002:33:::1;::::0;-1:-1:-1;;;;;33013:6:0::1;33029:4;33002:10;:33::i;:::-;33048:6;::::0;33037:33:::1;::::0;-1:-1:-1;;;;;33048:6:0::1;33064:4;33037:10;:33::i;:::-;33072:8;::::0;-1:-1:-1;;;;;33072:8:0;;::::1;::::0;-1:-1:-1;;;33082:8:0;::::1;;32994:7;:97::i;:::-;22301:1:::0;22290:8;:12;32953:146::o;23840:326::-;21172:34;;;;;;;;;;;;;;;;;24005:43;;-1:-1:-1;;;;;24005:43:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;24005:43:0;;;;;;25:18:-1;;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;23994:55:0;;;;23959:12;;23973:17;;23994:10;;;24005:43;23994:55;;;25:18:-1;23994:55:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;23994:55:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;23958:91:0;;;;24068:7;:57;;;;-1:-1:-1;24080:11:0;;:16;;:44;;;24111:4;24100:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;24100:24:0;24080:44;24060:98;;;;;-1:-1:-1;;;24060:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;23840:326;;;;;:::o;32607:297::-;32713:4;;32680:7;;-1:-1:-1;;;;;32704:13:0;;;32713:4;;32704:13;:39;;;;-1:-1:-1;;;;;;32721:22:0;;32738:4;32721:22;32704:39;32700:197;;;32767:48;32802:12;;32774:5;-1:-1:-1;;;;;32767:23:0;;32791:5;32767:30;;;;;;;;;;;;;-1:-1:-1;;;;;32767:30:0;-1:-1:-1;;;;;32767:30:0;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32767:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32767:30:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;32767:30:0;;:48;:34;:48;:::i;:::-;32760:55;;;;32700:197;32862:5;-1:-1:-1;;;;;32855:23:0;;32879:5;32855:30;;;;;;;;;;;;;-1:-1:-1;;;;;32855:30:0;-1:-1:-1;;;;;32855:30:0;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32855:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32855:30:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;32855:30:0;;-1:-1:-1;32700:197:0;32607:297;;;;:::o;25415:917::-;-1:-1:-1;;;;;25576:23:0;;;;;:50;;-1:-1:-1;;;;;;25603:23:0;;;25576:50;25568:84;;;;;-1:-1:-1;;;25568:84:0;;;;;;;;;;;;-1:-1:-1;;;25568:84:0;;;;;;;;;;;;;;;25767:18;;25694:23;:15;:23;;;-1:-1:-1;;;25767:18:0;;;;25750:35;;;25823:15;;;;;;:33;;-1:-1:-1;;;;;;25842:14:0;;;;25823:33;:51;;;;-1:-1:-1;;;;;;25860:14:0;;;;25823:51;25819:342;;;26032:11;25976:67;;25984:44;26018:9;25984:27;26001:9;25984:16;:27::i;:::-;-1:-1:-1;;;;;25984:33:0;;:44;:33;:44;:::i;:::-;25952:20;:91;;-1:-1:-1;;;;;25976:53:0;;;;:67;;;;25952:91;;;26082:67;;;26090:44;26124:9;26090:27;26107:9;26090:16;:27::i;:44::-;26058:20;:91;;-1:-1:-1;;;;;26082:53:0;;;;:67;;;;26058:91;;;25819:342;26171:8;:28;;-1:-1:-1;;26171:28:0;-1:-1:-1;;;;;26171:28:0;;;;;;;-1:-1:-1;;;;26210:28:0;-1:-1:-1;;;26210:28:0;;;;;;;;;-1:-1:-1;;;;;26249:35:0;-1:-1:-1;;;26249:35:0;;;;;;;;;26300:24;;;26305:8;;;26300:24;;26315:8;;;;;;;26300:24;;;;;;;;;;;;;;;;;25415:917;;;;;;:::o;22746:431::-;22796:4;;22790:18;;;-1:-1:-1;;;22790:18:0;;;;22811:1;;-1:-1:-1;;;;;22796:4:0;;22790:16;;:18;;;;;;;;;;;;;;22796:4;22790:18;;;2:2:-1;;;;27:1;24;17:12;2:2;22790:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22790:18:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;22790:18:0;:22;22787:383;;;22849:4;;22843:18;;;-1:-1:-1;;;22843:18:0;;;;22829:11;;-1:-1:-1;;;;;22849:4:0;;22843:16;;:18;;;;;;;;;;;;;;22829:11;22849:4;22843:18;;;2:2:-1;;;;27:1;24;17:12;2:2;22843:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22843:18:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;22843:18:0;22915:6;;22902:60;;;-1:-1:-1;;;22902:60:0;;-1:-1:-1;;;22902:60:0;;;;;;22843:18;;-1:-1:-1;22876:14:0;;22965:5;;-1:-1:-1;;;;;22915:6:0;;22902:35;;:60;;;;;22843:18;;22902:60;;;;;;;22915:6;22902:60;;;2:2:-1;;;;27:1;24;17:12;2:2;22902:60:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22902:60:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;22902:60:0;22893:69;;:77;;;;;;22876:94;;22985:18;23019:6;;;;;;;;;-1:-1:-1;;;;;23019:6:0;-1:-1:-1;;;;;23006:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;23006:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23006:26:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;23006:26:0;23061:4;;23006:26;;-1:-1:-1;23047:42:0;;-1:-1:-1;;;;;23061:4:0;23006:26;23079:9;23047:13;:42::i;:::-;23119:39;23136:21;:6;23147:9;23136:21;:10;:21;:::i;:::-;23119:12;;;:39;:16;:39;:::i;:::-;23104:12;:54;-1:-1:-1;;;22787:383:0;22746:431::o;18830:387::-;18885:4;18902:9;:7;:9::i;:::-;18922:12;18929:4;18922:6;:12::i;:::-;-1:-1:-1;;;;;18953:11:0;;18978:1;18953:11;;;:5;:11;;;;;:22;;;18945:54;;;;;-1:-1:-1;;;18945:54:0;;;;;;;;;;;;-1:-1:-1;;;18945:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;19024:11:0;;;19010;19024;;;:5;:11;;;;;:22;;;19085:10;;19024:22;;19057:59;;19085:10;19097;19024:22;19057:27;:59::i;:::-;-1:-1:-1;;;;;19127:11:0;;19152:1;19127:11;;;:5;:11;;;;;:22;;:26;19164:11;:21;;;;;;19179:6;-1:-1:-1;18830:387:0;;;;:::o;9223:136::-;9281:7;9308:43;9312:1;9315;9308:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;9301:50;9223:136;-1:-1:-1;;;9223:136:0:o;18040:542::-;-1:-1:-1;;;;;18148:11:0;;18103:4;18148:11;;;:5;:11;;;;;18196:17;;18278;;:22;18274:184;;18317:11;18331:16;:14;:16::i;:::-;18317:30;;18383:63;18406:39;18427:17;;18406:16;18417:4;18406:6;:10;;:16;;;;:::i;:::-;:20;:39;:20;:39;:::i;:::-;18383:18;;:63;:22;:63;:::i;:::-;18362:84;;18274:184;;18475:99;18554:8;:19;;;18475:74;18529:8;:19;;;18475:49;18519:4;18475:39;18495:18;18475:8;:15;;;:19;;:39;;;;:::i;:49::-;:53;:74;:53;:74;:::i;:99::-;18468:106;18040:542;-1:-1:-1;;;;18040:542:0:o;10113:471::-;10171:7;10416:6;10412:47;;-1:-1:-1;10446:1:0;10439:8;;10412:47;10483:5;;;10487:1;10483;:5;:1;10507:5;;;;;:10;10499:56;;;;-1:-1:-1;;;10499:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;317:303;362:6;389:1;385;:5;381:232;;;-1:-1:-1;411:1:0;444;440;436:5;;:9;460:92;471:1;467;:5;460:92;;;497:1;493:5;;535:1;530;526;522;:5;;;;;;:9;521:15;;;;;;517:19;;460:92;;;381:232;;;;573:6;;569:44;;-1:-1:-1;600:1:0;317:303;;;:::o;22318:200::-;22394:11;;:22;;22410:5;22394:22;:15;:22;:::i;:::-;22380:11;:36;-1:-1:-1;;;;;22443:13:0;;;;;;:9;:13;;;;;;:24;;22461:5;22443:24;:17;:24;:::i;:::-;-1:-1:-1;;;;;22427:13:0;;;;;;:9;:13;;;;;;;;:40;;;;22483:27;;;;;;;22427:13;;;;22483:27;;;;;;;;;;22318:200;;:::o;103:96::-;155:6;182:1;178;:5;:13;;190:1;178:13;;;-1:-1:-1;186:1:0;;174:17;-1:-1:-1;103:96:0:o;16768:490::-;16851:4;16884:1;16876:5;:9;16868:66;;;;-1:-1:-1;;;16868:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16975:11:0;;16947:25;16975:11;;;:5;:11;;;;;16997:9;:7;:9::i;:::-;17017:12;17024:4;17017:6;:12::i;:::-;17062:17;;:28;;17084:5;17062:28;:21;:28;:::i;:::-;17042:17;:48;17121:15;;:26;;17141:5;17121:26;:19;:26;:::i;:::-;17103:44;;;17200:17;;17180:48;;17223:4;;17180:38;;17103:44;17180:38;:19;:38;:::i;:48::-;17158:19;;;;:70;:19;16768:490;-1:-1:-1;;;16768:490:0:o;22526:208::-;-1:-1:-1;;;;;22608:15:0;;;;;;:9;:15;;;;;;:26;;22628:5;22608:26;:19;:26;:::i;:::-;-1:-1:-1;;;;;22590:15:0;;;;;;:9;:15;;;;;:44;22659:11;;:22;;22675:5;22659:22;:15;:22;:::i;:::-;22645:11;:36;22697:29;;;;;;;;22716:1;;-1:-1:-1;;;;;22697:29:0;;;;;;;;;;;;22526:208;;:::o;17505:523::-;-1:-1:-1;;;;;17633:11:0;;17588:4;17633:11;;;:5;:11;;;;;17663:9;;;;;:37;;-1:-1:-1;17676:15:0;;:24;-1:-1:-1;17676:24:0;17663:37;17655:75;;;;;-1:-1:-1;;;17655:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;17751:9;:7;:9::i;:::-;17771:12;17778:4;17771:6;:12::i;:::-;17822:15;;:26;;17842:5;17822:26;:19;:26;:::i;:::-;17804:44;;;17901:17;;17881:48;;17924:4;;17881:38;;17804:44;17881:38;:19;:38;:::i;:48::-;17859:19;;;:70;17960:17;;:28;;17982:5;17960:28;:21;:28;:::i;:::-;17940:17;:48;-1:-1:-1;18016:4:0;;17505:523;-1:-1:-1;;;17505:523:0:o;15274:97::-;15339:10;:24;;-1:-1:-1;;;;;;15339:24:0;-1:-1:-1;;;;;15339:24:0;;;;;;;;;;15274:97::o;889:120::-;-1:-1:-1;;;;;965:10:0;-1:-1:-1;;;965:17:0;;889:120::o;1080:108::-;1140:9;-1:-1:-1;;;;;1170:10:0;;-1:-1:-1;;;;;1166:14:0;;1170:10;1166:14;;;;;;1080:108;-1:-1:-1;;;1080:108:0:o;8759:181::-;8817:7;8849:5;;;8873:6;;;;8865:46;;;;;-1:-1:-1;;;8865:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;15447:368;15498:17;;15494:121;;15550:32;15565:16;:14;:16::i;:::-;15550:10;;;:32;:14;:32;:::i;:::-;15537:10;:45;15597:7;;15494:121;15635:14;15652:16;:14;:16::i;:::-;15635:33;;15699:62;15721:39;15742:17;;15721:16;15732:4;15721:6;:10;;:16;;;;:::i;:39::-;15699:17;;;:62;:21;:62;:::i;:::-;15679:17;:82;15785:10;;:22;;15800:6;15785:22;:14;:22;:::i;:::-;15772:10;:35;-1:-1:-1;15447:368:0:o;16049:468::-;-1:-1:-1;;;;;16135:11:0;;16107:25;16135:11;;;:5;:11;;;;;16161:15;;:19;16157:353;;16197:12;16212:73;16265:8;:19;;;16212:48;16255:4;16212:38;16232:17;;16212:8;:15;;;:19;;:38;;;;:::i;:73::-;16322:19;;;;16197:88;;-1:-1:-1;16322:32:0;;16197:88;16322:32;:23;:32;:::i;:::-;16300:19;;;:54;16386:14;;:27;;16405:7;16386:27;:18;:27;:::i;:::-;16369:14;:44;16470:17;;16450:15;;:48;;16493:4;;16450:38;;;:19;:38;:::i;:48::-;16428:19;;;:70;-1:-1:-1;16157:353:0;16049:468;;:::o;13773:361::-;13968:45;;;-1:-1:-1;;;;;13968:45:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;13968:45:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;13957:57:0;;;;13922:12;;13936:17;;13957:10;;;;13968:45;13957:57;;;25:18:-1;13957:57:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;13957:57:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;13921:93:0;;;;14033:7;:57;;;;-1:-1:-1;14045:11:0;;:16;;:44;;;14076:4;14065:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;14065:24:0;14045:44;14025:101;;;;;-1:-1:-1;;;14025:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;9662:192;9748:7;9784:12;9776:6;;;;9768:29;;;;-1:-1:-1;;;9768:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;9768:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9820:5:0;;;9662:192::o;23189:322::-;23295:6;;23282:60;;;-1:-1:-1;;;23282:60:0;;-1:-1:-1;;;23282:60:0;;;;;;23247:4;;;;-1:-1:-1;;;;;23295:6:0;;;;23282:35;;:60;;;;;;;;;;;;;;;23295:6;23282:60;;;2:2:-1;;;;27:1;24;17:12;2:2;23282:60:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23282:60:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;23282:60:0;23377:4;;23371:18;;;-1:-1:-1;;;23371:18:0;;;;23282:60;;-1:-1:-1;23353:15:0;;23371:53;;23418:5;;23371:42;;23394:18;;;;-1:-1:-1;;;;;23377:4:0;;23371:16;;:18;;;;;23282:60;;23371:18;;;;;;;23377:4;23371:18;;;2:2:-1;;;;27:1;24;17:12;2:2;23371:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23371:18:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;23371:18:0;;:42;:22;:42;:::i;:53::-;23353:71;;23442:61;23492:10;;23442:45;23476:10;23442:29;23458:12;;23442:11;;:15;;:29;;;;:::i;:61::-;23435:68;;;;23189:322;:::o;11060:132::-;11118:7;11145:39;11149:1;11152;11145:39;;;;;;;;;;;;;;;;;11774:7;11809:12;11802:5;11794:28;;;;-1:-1:-1;;;11794:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;11794:28:0;;11833:9;11849:1;11845;:5;;;;;;;11688:278;-1:-1:-1;;;;;11688:278:0:o

Swarm Source

ipfs://4d225b722b5690b08726d6af582aa124d1f48f8bd9473e6f7f890e76efeb0db8
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.