ETH Price: $3,686.66 (+2.65%)

Contract

0xe3f3869dDD41C23Eff3630F58E5bFA584C770D67
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

TokenTracker

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Approve202952922024-07-13 4:46:59140 days ago1720846019IN
Lock3r: LK3R Token
0 ETH0.000034881.43535168
Approve191999852024-02-10 20:09:59294 days ago1707595799IN
Lock3r: LK3R Token
0 ETH0.0007608831.30331982
Approve190787612024-01-24 20:04:59311 days ago1706126699IN
Lock3r: LK3R Token
0 ETH0.0003064312.60684492
Approve190786142024-01-24 19:35:23311 days ago1706124923IN
Lock3r: LK3R Token
0 ETH0.0002953812.1524194
Approve189403092024-01-05 9:53:23330 days ago1704448403IN
Lock3r: LK3R Token
0 ETH0.0003955816.27435427
Approve189340622024-01-04 12:47:11331 days ago1704372431IN
Lock3r: LK3R Token
0 ETH0.0005163921.24453599
Approve175398012023-06-23 4:07:35526 days ago1687493255IN
Lock3r: LK3R Token
0 ETH0.0004664219.18888376
Approve170233372023-04-11 7:19:47599 days ago1681197587IN
Lock3r: LK3R Token
0 ETH0.000610825.12889787
Approve166544372023-02-18 8:49:11651 days ago1676710151IN
Lock3r: LK3R Token
0 ETH0.0005926624.38236616
Approve162881512022-12-29 4:52:35702 days ago1672289555IN
Lock3r: LK3R Token
0 ETH0.0003626314.91904933
Approve161824012022-12-14 10:41:23717 days ago1671014483IN
Lock3r: LK3R Token
0 ETH0.000678414.56096629
Approve155307972022-09-14 3:44:38808 days ago1663127078IN
Lock3r: LK3R Token
0 ETH0.000115374.74671656
Approve151194822022-07-11 5:27:40873 days ago1657517260IN
Lock3r: LK3R Token
0 ETH0.0002874611.8262667
Approve148657632022-05-29 9:40:47916 days ago1653817247IN
Lock3r: LK3R Token
0 ETH0.0003902314.83391761
Approve148657612022-05-29 9:40:03916 days ago1653817203IN
Lock3r: LK3R Token
0 ETH0.0003270713.45607364
Approve146570992022-04-26 0:59:43950 days ago1650934783IN
Lock3r: LK3R Token
0 ETH0.0009745340.09266376
Transfer From143779532022-03-13 11:06:59993 days ago1647169619IN
Lock3r: LK3R Token
0 ETH0.0012541525.09105179
Approve131616152021-09-04 21:16:331183 days ago1630790193IN
Lock3r: LK3R Token
0 ETH0.00252518103.88724608
Transfer131177512021-08-29 2:39:171189 days ago1630204757IN
Lock3r: LK3R Token
0 ETH0.03379545650
Approve126981692021-06-24 17:31:031255 days ago1624555863IN
Lock3r: LK3R Token
0 ETH0.0002289315.73
Approve126891482021-06-23 7:45:341256 days ago1624434334IN
Lock3r: LK3R Token
0 ETH0.0002619718
Approve125902112021-06-07 22:49:171272 days ago1623106157IN
Lock3r: LK3R Token
0 ETH0.0002328616.00000145
Approve123487522021-05-01 14:09:391309 days ago1619878179IN
Lock3r: LK3R Token
0 ETH0.001742537.4
Approve123466152021-05-01 6:14:201309 days ago1619849660IN
Lock3r: LK3R Token
0 ETH0.0012113626
Approve123311172021-04-28 20:32:401312 days ago1619641960IN
Lock3r: LK3R Token
0 ETH0.0023079879
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Lock3r

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-11-19
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.6.12;
pragma experimental ABIEncoderV2;



/**
 /$$                           /$$        /$$$$$$                  /$$   /$$             /$$                                       /$$      
| $$                          | $$       /$$__  $$                | $$$ | $$            | $$                                      | $$      
| $$        /$$$$$$   /$$$$$$$| $$   /$$|__/  \ $$  /$$$$$$       | $$$$| $$  /$$$$$$  /$$$$$$   /$$  /$$  /$$  /$$$$$$   /$$$$$$ | $$   /$$
| $$       /$$__  $$ /$$_____/| $$  /$$/   /$$$$$/ /$$__  $$      | $$ $$ $$ /$$__  $$|_  $$_/  | $$ | $$ | $$ /$$__  $$ /$$__  $$| $$  /$$/
| $$      | $$  \ $$| $$      | $$$$$$/   |___  $$| $$  \__/      | $$  $$$$| $$$$$$$$  | $$    | $$ | $$ | $$| $$  \ $$| $$  \__/| $$$$$$/ 
| $$      | $$  | $$| $$      | $$_  $$  /$$  \ $$| $$            | $$\  $$$| $$_____/  | $$ /$$| $$ | $$ | $$| $$  | $$| $$      | $$_  $$ 
| $$$$$$$$|  $$$$$$/|  $$$$$$$| $$ \  $$|  $$$$$$/| $$            | $$ \  $$|  $$$$$$$  |  $$$$/|  $$$$$/$$$$/|  $$$$$$/| $$      | $$ \  $$
|________/ \______/  \_______/|__/  \__/ \______/ |__/            |__/  \__/ \_______/   \___/   \_____/\___/  \______/ |__/      |__/  \__/

 /$$$$$$$$        /$$                                  /$$$$$$                        /$$                                    /$$    
|__  $$__/       | $$                                 /$$__  $$                      | $$                                   | $$    
   | $$  /$$$$$$ | $$   /$$  /$$$$$$  /$$$$$$$       | $$  \__/  /$$$$$$  /$$$$$$$  /$$$$$$    /$$$$$$  /$$$$$$   /$$$$$$$ /$$$$$$  
   | $$ /$$__  $$| $$  /$$/ /$$__  $$| $$__  $$      | $$       /$$__  $$| $$__  $$|_  $$_/   /$$__  $$|____  $$ /$$_____/|_  $$_/  
   | $$| $$  \ $$| $$$$$$/ | $$$$$$$$| $$  \ $$      | $$      | $$  \ $$| $$  \ $$  | $$    | $$  \__/ /$$$$$$$| $$        | $$    
   | $$| $$  | $$| $$_  $$ | $$_____/| $$  | $$      | $$    $$| $$  | $$| $$  | $$  | $$ /$$| $$      /$$__  $$| $$        | $$ /$$
   | $$|  $$$$$$/| $$ \  $$|  $$$$$$$| $$  | $$      |  $$$$$$/|  $$$$$$/| $$  | $$  |  $$$$/| $$     |  $$$$$$$|  $$$$$$$  |  $$$$/
   |__/ \______/ |__/  \__/ \_______/|__/  |__/       \______/  \______/ |__/  |__/   \___/  |__/      \_______/ \_______/   \___/  

 * 
*/


// From https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/Math.sol
// Subject to the MIT license.
/**
 * @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(uint a, uint b) internal pure returns (uint) {
        uint c = a + b;
        require(c >= a, "add: +");

        return c;
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting with custom message on overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint a, uint b, string memory errorMessage) internal pure returns (uint) {
        uint c = a + b;
        require(c >= a, errorMessage);

        return c;
    }

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

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

        uint c = a * b;
        require(c / a == b, "mul: *");

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint a, uint b, string memory errorMessage) internal pure returns (uint) {
        // 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;
        }

        uint c = a * b;
        require(c / a == b, errorMessage);

        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(uint a, uint b) internal pure returns (uint) {
        return div(a, b, "div: /");
    }

    /**
     * @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(uint a, uint b, string memory errorMessage) internal pure returns (uint) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint 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(uint a, uint b) internal pure returns (uint) {
        return mod(a, b, "mod: %");
    }

    /**
     * @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(uint a, uint b, string memory errorMessage) internal pure returns (uint) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor () internal {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

    /**
     * @dev Converts an `address` into `address payable`. Note that this is
     * simply a type cast: the actual underlying value is not changed.
     *
     * _Available since v2.4.0._
     */
    function toPayable(address account) internal pure returns (address payable) {
        return address(uint160(account));
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     *
     * _Available since v2.4.0._
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient");

        // solhint-disable-next-line avoid-call-value
        (bool success, ) = recipient.call{value:amount}("");
        require(success, "Address: reverted");
    }
}

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: < 0");
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves.

        // A Solidity high level call has three parts:
        //  1. The target address is checked to verify it contains contract code
        //  2. The call itself is made, and success asserted
        //  3. The return value is decoded, which in turn checks the size of the returned data.
        // solhint-disable-next-line max-line-length
        require(address(token).isContract(), "SafeERC20: !contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "SafeERC20: low-level call failed");

        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: !succeed");
        }
    }
}

library Lock3rV1Library {
    function getReserve(address pair, address reserve) external view returns (uint) {
        (uint _r0, uint _r1,) = IUniswapV2Pair(pair).getReserves();
        if (IUniswapV2Pair(pair).token0() == reserve) {
            return _r0;
        } else if (IUniswapV2Pair(pair).token1() == reserve) {
            return _r1;
        } else {
            return 0;
        }
    }

}

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

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure 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);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Fund(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function fund(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

interface IGovernance {
    function proposeJob(address job) external;
    function slash(address bonded, address locker, uint amount) external;
}

interface ILock3rV1Helper {
    function getQuoteLimit(uint gasUsed) external view returns (uint);
}

contract Lock3r is ReentrancyGuard {
    using SafeMath for uint;
    using SafeERC20 for IERC20;

    /// @notice Lock3r Helper to set max prices for the ecosystem
    ILock3rV1Helper public LK3RH;

    /// @notice EIP-20 token name for this token //Joe Biden
    string public constant name = "Lock3r";

    /// @notice EIP-20 token symbol for this token // is
    string public constant symbol = "LK3R";

    /// @notice EIP-20 token decimals for this token //POTUS - God Bless America
    uint8 public constant decimals = 18;

    /// @notice Total number of tokens in circulation
    uint public totalSupply = 200000e18; // Total Supply = 200,000 - No more can be created/minted thanks to @sosoliditycrew on TG

    /// @notice A record of each accounts delegate
    mapping (address => address) public delegates;

    /// @notice A record of votes checkpoints for each account, by index
    mapping (address => mapping (uint32 => Checkpoint)) public checkpoints;

    /// @notice The number of checkpoints for each account
    mapping (address => uint32) public numCheckpoints;

    mapping (address => mapping (address => uint)) internal allowances;
    mapping (address => uint) internal balances;

    /// @notice The EIP-712 typehash for the contract's domain
    bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint chainId,address verifyingContract)");
    bytes32 public immutable DOMAINSEPARATOR;

    /// @notice The EIP-712 typehash for the delegation struct used by the contract
    bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint nonce,uint expiry)");

    /// @notice The EIP-712 typehash for the permit struct used by the contract
    bytes32 public constant PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint value,uint nonce,uint deadline)");


    /// @notice A record of states for signing / validating signatures
    mapping (address => uint) public nonces;

    /// @notice An event thats emitted when an account changes its delegate
    event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);

    /// @notice An event thats emitted when a delegate account's vote balance changes
    event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance);

    /// @notice A checkpoint for marking number of votes from a given block
    struct Checkpoint {
        uint32 fromBlock;
        uint votes;
    }

    /**
     * @notice Delegate votes from `msg.sender` to `delegatee`
     * @param delegatee The address to delegate votes to
     */
    function delegate(address delegatee) public {
        _delegate(msg.sender, delegatee);
    }

    /**
     * @notice Delegates votes from signatory to `delegatee`
     * @param delegatee The address to delegate votes to
     * @param nonce The contract state required to match the signature
     * @param expiry The time at which to expire the signature
     * @param v The recovery byte of the signature
     * @param r Half of the ECDSA signature pair
     * @param s Half of the ECDSA signature pair
     */
    function delegateBySig(address delegatee, uint nonce, uint expiry, uint8 v, bytes32 r, bytes32 s) public {
        bytes32 structHash = keccak256(abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry));
        bytes32 digest = keccak256(abi.encodePacked("\x19\x01", DOMAINSEPARATOR, structHash));
        address signatory = ecrecover(digest, v, r, s);
        require(signatory != address(0), "delegateBySig: sig");
        require(nonce == nonces[signatory]++, "delegateBySig: nonce");
        require(now <= expiry, "delegateBySig: expired");
        _delegate(signatory, delegatee);
    }

    /**
     * @notice Gets the current votes balance for `account`
     * @param account The address to get votes balance
     * @return The number of current votes for `account`
     */
    function getCurrentVotes(address account) external view returns (uint) {
        uint32 nCheckpoints = numCheckpoints[account];
        return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0;
    }

    /**
     * @notice Determine the prior number of votes for an account as of a block number
     * @dev Block number must be a finalized block or else this function will revert to prevent misinformation.
     * @param account The address of the account to check
     * @param blockNumber The block number to get the vote balance at
     * @return The number of votes the account had as of the given block
     */
    function getPriorVotes(address account, uint blockNumber) public view returns (uint) {
        require(blockNumber < block.number, "getPriorVotes:");

        uint32 nCheckpoints = numCheckpoints[account];
        if (nCheckpoints == 0) {
            return 0;
        }

        // First check most recent balance
        if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) {
            return checkpoints[account][nCheckpoints - 1].votes;
        }

        // Next check implicit zero balance
        if (checkpoints[account][0].fromBlock > blockNumber) {
            return 0;
        }

        uint32 lower = 0;
        uint32 upper = nCheckpoints - 1;
        while (upper > lower) {
            uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow
            Checkpoint memory cp = checkpoints[account][center];
            if (cp.fromBlock == blockNumber) {
                return cp.votes;
            } else if (cp.fromBlock < blockNumber) {
                lower = center;
            } else {
                upper = center - 1;
            }
        }
        return checkpoints[account][lower].votes;
    }

    function _delegate(address delegator, address delegatee) internal {
        address currentDelegate = delegates[delegator];
        uint delegatorBalance = votes[delegator].add(bonds[delegator][address(this)]);
        delegates[delegator] = delegatee;

        emit DelegateChanged(delegator, currentDelegate, delegatee);

        _moveDelegates(currentDelegate, delegatee, delegatorBalance);
    }

    function _moveDelegates(address srcRep, address dstRep, uint amount) internal {
        if (srcRep != dstRep && amount > 0) {
            if (srcRep != address(0)) {
                uint32 srcRepNum = numCheckpoints[srcRep];
                uint srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0;
                uint srcRepNew = srcRepOld.sub(amount, "_moveVotes: underflows");
                _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
            }

            if (dstRep != address(0)) {
                uint32 dstRepNum = numCheckpoints[dstRep];
                uint dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0;
                uint dstRepNew = dstRepOld.add(amount);
                _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
            }
        }
    }

    function _writeCheckpoint(address delegatee, uint32 nCheckpoints, uint oldVotes, uint newVotes) internal {
      uint32 blockNumber = safe32(block.number, "_writeCheckpoint: 32 bits");

      if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) {
          checkpoints[delegatee][nCheckpoints - 1].votes = newVotes;
      } else {
          checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes);
          numCheckpoints[delegatee] = nCheckpoints + 1;
      }

      emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
    }

    function safe32(uint n, string memory errorMessage) internal pure returns (uint32) {
        require(n < 2**32, errorMessage);
        return uint32(n);
    }

    /// @notice The standard EIP-20 transfer event
    event Transfer(address indexed from, address indexed to, uint amount);

    /// @notice The standard EIP-20 approval event
    event Approval(address indexed owner, address indexed spender, uint amount);

    /// @notice Submit a job
    event SubmitJob(address indexed job, address indexed liquidity, address indexed provider, uint block, uint credit);

    /// @notice Apply credit to a job
    event ApplyCredit(address indexed job, address indexed liquidity, address indexed provider, uint block, uint credit);

    /// @notice Remove credit for a job
    event RemoveJob(address indexed job, address indexed liquidity, address indexed provider, uint block, uint credit);

    /// @notice Unbond credit for a job
    event UnbondJob(address indexed job, address indexed liquidity, address indexed provider, uint block, uint credit);

    /// @notice Added a Job
    event JobAdded(address indexed job, uint block, address governance);

    /// @notice Removed a job
    event JobRemoved(address indexed job, uint block, address governance);

    /// @notice Worked a job
    event LockerWorked(address indexed credit, address indexed job, address indexed locker, uint block, uint amount);

    /// @notice Locker bonding
    event LockerBonding(address indexed locker, uint block, uint active, uint bond);

    /// @notice Locker bonded
    event LockerBonded(address indexed locker, uint block, uint activated, uint bond);

    /// @notice Locker unbonding
    event LockerUnbonding(address indexed locker, uint block, uint deactive, uint bond);

    /// @notice Locker unbound
    event LockerUnbound(address indexed locker, uint block, uint deactivated, uint bond);
    
    /// @notice Locker slashed
    event LockerSlashed(address indexed locker, address indexed slasher, uint block, uint slash);
      
      /// @notice Locker disputed
    event LockerDispute(address indexed locker, uint block);
    
    /// @notice Locker resolved
    event LockerResolved(address indexed locker, uint block);

    event AddCredit(address indexed credit, address indexed job, address indexed creditor, uint block, uint amount);
    
     /// @notice Locker rights approved to be spent by spender
    event LockerRightApproval(address indexed owner, address indexed bonding ,address indexed spender, bool allowed);

    /// @notice Locker right transfered to a new address
    event LockerRightTransfered(address indexed from, address indexed to, address indexed bond);


    /// @notice 2 days to bond to become a locker
    uint public BOND = 2 days;
    /// @notice 7 days to unbond to remove funds from being a locker
    uint public UNBOND = 7 days;
    /// @notice 2 days till liquidity can be bound
    uint public LIQUIDITYBOND = 2 days;

    /// @notice direct liquidity fee 0.3% - This can be modified via governance contract
    uint public FEE = 30;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
    uint constant public BASE = 10000;

    /// @notice address used for ETH transfers
    address constant public ETH = address(0xE);

    /// @notice tracks all current bondings (time)
    mapping(address => mapping(address => uint)) public bondings;
    /// @notice tracks all current unbondings (time)
    mapping(address => mapping(address => uint)) public unbondings;
    /// @notice allows for partial unbonding
    mapping(address => mapping(address => uint)) public partialUnbonding;
    /// @notice tracks all current pending bonds (amount)
    mapping(address => mapping(address => uint)) public pendingbonds;
    /// @notice tracks how much a locker has bonded
    mapping(address => mapping(address => uint)) public bonds;
    /// @notice tracks underlying votes (that don't have bond)
    mapping(address => uint) public votes;

    /// @notice total bonded (totalSupply for bonds)
    uint public totalBonded = 0;
    /// @notice tracks when a locker was first registered
    mapping(address => uint) public firstSeen;
    	
    /// @notice tracks if a locker has a pending dispute
    mapping(address => bool) public disputes;

    /// @notice tracks last job performed for a locker
    mapping(address => uint) public lastJob;
    /// @notice tracks the total job executions for a locker
    mapping(address => uint) public workCompleted;
    /// @notice list of all jobs registered for the locker system
    mapping(address => bool) public jobs;
    /// @notice the current credit available for a job
    mapping(address => mapping(address => uint)) public credits;
    /// @notice the balances for the liquidity providers
    mapping(address => mapping(address => mapping(address => uint))) public liquidityProvided;
    /// @notice liquidity unbonding days
    mapping(address => mapping(address => mapping(address => uint))) public liquidityUnbonding;
    /// @notice liquidity unbonding amounts
    mapping(address => mapping(address => mapping(address => uint))) public liquidityAmountsUnbonding;
    /// @dev job proposal delay
    mapping(address => uint) public jobProposalDelay;
    /// @notice liquidity apply date
    mapping(address => mapping(address => mapping(address => uint))) public liquidityApplied;
    /// @notice liquidity amount to apply
    mapping(address => mapping(address => mapping(address => uint))) public liquidityAmount;

    /// @notice list of all current lockers
    mapping(address => bool) public lockers;
    /// @notice blacklist of lockers not allowed to participate
    mapping(address => bool) public blacklist;
    
    //Allowances of transfer rights of locker rights
    //first address is user,second is the spender,3rd is the bonding that may be allowed to be spent,finally last is bool if its allowed
    mapping(address => mapping (address => mapping(address => bool))) internal LockerAllowances;

    /// @notice traversable array of lockers to make external management easier
    address[] public lockerList;
    /// @notice traversable array of jobs to make external management easier
    address[] public jobList;

    /// @notice governance address for the governance contract
    address public governance;
    address public pendingGovernance;
    
     /// @notice treasury address for the treasury contract
    address public treasury;

    /// @notice the liquidity token supplied by users paying for jobs
    mapping(address => bool) public liquidityAccepted;

    address[] public liquidityPairs;

    uint internal _gasUsed;
    
    // Ethereum 101 - Constructors can only be called once
    constructor() public {  
        // Set governance for this token
        governance = msg.sender;
        // Set Treasury for this token
        treasury = msg.sender;
        balances[msg.sender] = balances[msg.sender].add(totalSupply);
        // Supply needs to start in the hands of the contract creator
        emit Transfer (address(0),msg.sender, totalSupply);
        DOMAINSEPARATOR = keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name)), _getChainId(), address(this)));
    }
    
    
    modifier onlyGovernance(){
        require(msg.sender == governance);
        _;
    }
    

    /**
     * @notice Add ETH credit to a job to be paid out for work
     * @param job the job being credited
     */
    function addCreditETH(address job) external payable {
        require(jobs[job], "addCreditETH: !job");
        uint _fee = msg.value.mul(FEE).div(BASE);
        credits[job][ETH] = credits[job][ETH].add(msg.value.sub(_fee));
        payable(governance).transfer(_fee);

        emit AddCredit(ETH, job, msg.sender, block.number, msg.value);
    }

    /**
     * @notice Add credit to a job to be paid out for work
     * @param credit the credit being assigned to the job
     * @param job the job being credited
     * @param amount the amount of credit being added to the job
     */
    function addCredit(address credit, address job, uint amount) external nonReentrant {
        require(jobs[job], "addCreditETH: !job");
        uint _before = IERC20(credit).balanceOf(address(this));
        IERC20(credit).safeTransferFrom(msg.sender, address(this), amount);
        uint _received = IERC20(credit).balanceOf(address(this)).sub(_before);
        uint _fee = _received.mul(FEE).div(BASE);
        credits[job][credit] = credits[job][credit].add(_received.sub(_fee));
        IERC20(credit).safeTransfer(governance, _fee);

        emit AddCredit(credit, job, msg.sender, block.number, _received);
    }

    /**
     * @notice Add non transferable votes for governance
     * @param voter to add the votes to
     * @param amount of votes to add
     */
    function addVotes(address voter, uint amount) external onlyGovernance{
        _activate(voter, address(this));
        votes[voter] = votes[voter].add(amount);
        totalBonded = totalBonded.add(amount);
        _moveDelegates(address(0), delegates[voter], amount);
    }

    /**
     * @notice Remove non transferable votes for governance
     * @param voter to subtract the votes
     * @param amount of votes to remove
     */
    function removeVotes(address voter, uint amount) external onlyGovernance{
        votes[voter] = votes[voter].sub(amount);
        totalBonded = totalBonded.sub(amount);
        _moveDelegates(delegates[voter], address(0), amount);
    }

    /**
     * @notice Add credit to a job to be paid out for work
     * @param job the job being credited
     * @param amount the amount of credit being added to the job
     */
    function addLK3RCredit(address job, uint amount) external onlyGovernance{
        require(jobs[job], "addLK3RCredit: !job");
        credits[job][address(this)] = credits[job][address(this)].add(amount);
        _fund(address(this), amount);

        emit AddCredit(address(this), job, msg.sender, block.number, amount);
    }

    /**
     * @notice Approve a liquidity pair for being accepted in future
     * @param liquidity the liquidity no longer accepted
     */
    function approveLiquidity(address liquidity) external onlyGovernance{
        require(!liquidityAccepted[liquidity], "approveLiquidity: !pair");
        liquidityAccepted[liquidity] = true;
        liquidityPairs.push(liquidity);
    }

    /**
     * @notice Revoke a liquidity pair from being accepted in future
     * @param liquidity the liquidity no longer accepted
     */
    function revokeLiquidity(address liquidity) external onlyGovernance{
        liquidityAccepted[liquidity] = false;
    }
    
    /**
     * @notice Set new liquidity fee from governance
     * @param newFee the new fee for further liquidity adds
     */
    function setLiquidityFee(uint newFee) external onlyGovernance{
        FEE = newFee;
    }

    /**
     * @notice Set bonding delay from governance
     * @param newBond the new bonding delay
     */
    function setBondingDelay(uint newBond) external onlyGovernance{
        BOND = newBond;
    }

    /**
     * @notice Set bonding delay from governance
     * @param newUnbond the new unbonding delay
     */
    function setUnbondingDelay(uint newUnbond) external onlyGovernance{
        UNBOND = newUnbond;
    }

    /**
     * @notice Set liquidity bonding delay from governance
     * @param newLiqBond the new liquidity bonding delay
     */
    function setLiquidityBondingDelay(uint newLiqBond) external onlyGovernance{
        LIQUIDITYBOND = newLiqBond;
    }

    /**
     * @notice Displays all accepted liquidity pairs
     */
    function pairs() external view returns (address[] memory) {
        return liquidityPairs;
    }

    /**
     * @notice Allows liquidity providers to submit jobs
     * @param liquidity the liquidity being added
     * @param job the job to assign credit to
     * @param amount the amount of liquidity tokens to use
     */
    function addLiquidityToJob(address liquidity, address job, uint amount) external nonReentrant {
        require(liquidityAccepted[liquidity], "addLiquidityToJob: !pair");
        IERC20(liquidity).safeTransferFrom(msg.sender, address(this), amount);
        liquidityProvided[msg.sender][liquidity][job] = liquidityProvided[msg.sender][liquidity][job].add(amount);

        liquidityApplied[msg.sender][liquidity][job] = now;
        liquidityAmount[msg.sender][liquidity][job] = liquidityAmount[msg.sender][liquidity][job].add(amount);

        if (!jobs[job] && jobProposalDelay[job].add(UNBOND) < now) {
            IGovernance(governance).proposeJob(job);
            jobProposalDelay[job] = now;
        }
        emit SubmitJob(job, liquidity, msg.sender, block.number, amount);
    }

    /**
     * @notice Applies the credit provided in addLiquidityToJob to the job
     * @param provider the liquidity provider
     * @param liquidity the pair being added as liquidity
     * @param job the job that is receiving the credit
     */
    function applyCreditToJob(address provider, address liquidity, address job) external {
        require(liquidityAccepted[liquidity], "addLiquidityToJob: !pair");
        require(liquidityApplied[provider][liquidity][job] != 0, "credit: no bond");
        require(block.timestamp.sub(liquidityApplied[provider][liquidity][job].add(LIQUIDITYBOND)) >= 0, "credit: bonding");
        uint _liquidity = Lock3rV1Library.getReserve(liquidity, address(this));
        uint _credit = _liquidity.mul(liquidityAmount[provider][liquidity][job]).div(IERC20(liquidity).totalSupply());
        _fund(address(this), _credit);
        credits[job][address(this)] = credits[job][address(this)].add(_credit);
        liquidityAmount[provider][liquidity][job] = 0;

        emit ApplyCredit(job, liquidity, provider, block.number, _credit);
    }

    /**
     * @notice Unbond liquidity for a job
     * @param liquidity the pair being unbound
     * @param job the job being unbound from
     * @param amount the amount of liquidity being removed
     */
    function unbondLiquidityFromJob(address liquidity, address job, uint amount) external {
        require(liquidityAmount[msg.sender][liquidity][job] == 0, "credit: pending credit");
        liquidityUnbonding[msg.sender][liquidity][job] = now;
        liquidityAmountsUnbonding[msg.sender][liquidity][job] = liquidityAmountsUnbonding[msg.sender][liquidity][job].add(amount);
        require(liquidityAmountsUnbonding[msg.sender][liquidity][job] <= liquidityProvided[msg.sender][liquidity][job], "unbondLiquidityFromJob: insufficient funds");

        uint _liquidity = Lock3rV1Library.getReserve(liquidity, address(this));
        uint _credit = _liquidity.mul(amount).div(IERC20(liquidity).totalSupply());
        if (_credit > credits[job][address(this)]) {
            _burn(address(this), credits[job][address(this)]);
            credits[job][address(this)] = 0;
        } else {
            _burn(address(this), _credit);
            credits[job][address(this)] = credits[job][address(this)].sub(_credit);
        }

        emit UnbondJob(job, liquidity, msg.sender, block.number, amount);
    }

    /**
     * @notice Allows liquidity providers to remove liquidity
     * @param liquidity the pair being unbound
     * @param job the job being unbound from
     */
    function removeLiquidityFromJob(address liquidity, address job) external {
        require(liquidityUnbonding[msg.sender][liquidity][job] != 0, "removeJob: unbond");
        require(block.timestamp.sub(liquidityUnbonding[msg.sender][liquidity][job].add(UNBOND)) >= 0 , "removeJob: unbonding");
        uint _amount = liquidityAmountsUnbonding[msg.sender][liquidity][job];
        liquidityProvided[msg.sender][liquidity][job] = liquidityProvided[msg.sender][liquidity][job].sub(_amount);
        liquidityAmountsUnbonding[msg.sender][liquidity][job] = 0;
        IERC20(liquidity).safeTransfer(msg.sender, _amount);

        emit RemoveJob(job, liquidity, msg.sender, block.number, _amount);
    }

    /**
     * @notice Allows treasury to fund new tokens to a job contract
     * @param amount the amount of tokens to fund to a job contract
     * Only Governance can fund a job contract from the treasury
     */
    function fund(uint amount) external onlyGovernance{
        _fund(treasury, amount);
    }

    /**
     * @notice burn owned tokens
     * @param amount the amount of tokens to burn
     */
    function burn(uint amount) external {
        _burn(msg.sender, amount);
    }

    function _fund(address dst, uint amount) internal {
        // transfer the amount to the recipient
        //Unit test job contracts cannot be funded if the treasury has insufficient funds
        require(balances[treasury] >= (amount), "treasury: exceeds balance");
        balances[dst] = balances[dst].add(amount);
        balances[treasury] = balances[treasury].sub(amount);
        emit Transfer(treasury, dst, amount);
    }

    function _burn(address dst, uint amount) internal {
        require(dst != address(0), "_burn: zero address");
        balances[dst] = balances[dst].sub(amount, "_burn: exceeds balance");
        totalSupply = totalSupply.sub(amount);
        emit Transfer(dst, address(0), amount);
    }

    /**
     * @notice Implemented by jobs to show that a locker performed work
     * @param locker address of the locker that performed the work
     */
    function worked(address locker) external {
        workReceipt(locker, LK3RH.getQuoteLimit(_gasUsed.sub(gasleft())));
    }
    
    /**
     * @notice Implemented by jobs to show that a locker performed work and get paid in ETH
     * @param locker address of the locker that performed the work
     */
    function workedETH(address locker) external {
        receiptETH(locker, LK3RH.getQuoteLimit(_gasUsed.sub(gasleft())));
    }
    
    /**
     * @notice Implemented by jobs to show that a locker performed work
     * @param locker address of the locker that performed the work
     * @param amount the reward that should be allocated
     */
    function workReceipt(address locker, uint amount) public {
        require(jobs[msg.sender], "workReceipt: !job");
        require(amount <= LK3RH.getQuoteLimit(_gasUsed.sub(gasleft())), "workReceipt: max limit");
        credits[msg.sender][address(this)] = credits[msg.sender][address(this)].sub(amount, "workReceipt: insuffient funds");
        lastJob[locker] = now;
        _reward(locker, amount);
        workCompleted[locker] = workCompleted[locker].add(amount);
        emit LockerWorked(address(this), msg.sender, locker, block.number, amount);
    }

    /**
     * @notice Implemented by jobs to show that a locker performed work
     * @param credit the asset being awarded to the locker
     * @param locker address of the locker that performed the work
     * @param amount the reward that should be allocated
     */
    function receipt(address credit, address locker, uint amount) external {
        require(jobs[msg.sender], "receipt: !job");
        credits[msg.sender][credit] = credits[msg.sender][credit].sub(amount, "workReceipt: insuffient funds");
        lastJob[locker] = now;
        IERC20(credit).safeTransfer(locker, amount);
        emit LockerWorked(credit, msg.sender, locker, block.number, amount);
    }

    /**
     * @notice Implemented by jobs to show that a locker performed work
     * @param locker address of the locker that performed the work
     * @param amount the amount of ETH sent to the locker
     */
    function receiptETH(address locker, uint amount) public {
        require(jobs[msg.sender], "receipt: !job");
        credits[msg.sender][ETH] = credits[msg.sender][ETH].sub(amount, "workReceipt: insuffient funds");
        lastJob[locker] = now;
        payable(locker).transfer(amount);
        emit LockerWorked(ETH, msg.sender, locker, block.number, amount);
    }
    
    
    function _reward(address _from, uint _amount) internal {
        bonds[_from][address(this)] = bonds[_from][address(this)].add(_amount);
        totalBonded = totalBonded.add(_amount);
        _moveDelegates(address(0), delegates[_from], _amount);
        emit Transfer(msg.sender, _from, _amount);
    }

    function _bond(address bonding, address _from, uint _amount) internal {
        bonds[_from][bonding] = bonds[_from][bonding].add(_amount);
        if (bonding == address(this)) {
            totalBonded = totalBonded.add(_amount);
            _moveDelegates(address(0), delegates[_from], _amount);
        }
    }

    function _unbond(address bonding, address _from, uint _amount) internal {
        bonds[_from][bonding] = bonds[_from][bonding].sub(_amount);
        if (bonding == address(this)) {
            totalBonded = totalBonded.sub(_amount);
            _moveDelegates(delegates[_from], address(0), _amount);
        }

    }

    /**
     * @notice Allows governance to add new job systems
     * @param job address of the contract for which work should be performed
     */
    function addJob(address job) external onlyGovernance{
        require(!jobs[job], "addJob: job known");
        jobs[job] = true;
        jobList.push(job);
        emit JobAdded(job, block.number, msg.sender);
    }

    /**
     * @notice Full listing of all jobs ever added
     * @return array blob
     */
    function getJobs() external view returns (address[] memory) {
        return jobList;
    }

    /**
     * @notice Allows governance to remove a job from the systems
     * @param job address of the contract for which work should be performed
     */
    function removeJob(address job) external onlyGovernance{
        jobs[job] = false;
        emit JobRemoved(job, block.number, msg.sender);
    }

    /**
     * @notice Allows governance to change the Lock3rHelper for max spend
     * @param _lk3rh new helper address to set
     */
    function setLock3rHelper(ILock3rV1Helper _lk3rh) external onlyGovernance{
        LK3RH = ILock3rV1Helper(_lk3rh);
    }

    /**
     * @notice Allows governance to change governance (for future upgradability)
     * @param _governance new governance address to set
     */
    function setGovernance(address _governance) external onlyGovernance {
        pendingGovernance = _governance;
    }

    /**
     * @notice Allows pendingGovernance to accept their role as governances(protection pattern)
     */
    function acceptGovernance() external {
        require(msg.sender == pendingGovernance, "acceptGovernance: !pendingGov");
        governance = pendingGovernance;
    }
    
    /**
     * @notice Allows treasury to change treasury(for future upgradability)
     * @param _treasury new treasury address to set
     */
    function setTreasury(address _treasury) external onlyGovernance{
        treasury = _treasury;
    }

    /**
     * @notice confirms if the current locker is registered, can be used for general (non critical) functions
     * @param locker the locker being investigated
     * @return true/false if the address is a locker
     */
    function isLocker(address locker) public returns (bool) {
        _gasUsed = gasleft();
        return lockers[locker];
    }

    /**
     * @notice confirms if the current locker is registered and has a minimum bond, should be used for protected functions
     * @param locker the locker being investigated
     * @param minBond the minimum requirement for the asset provided in bond
     * @param earned the total funds earned in the lockers lifetime
     * @param age the age of the locker in the system
     * @return true/false if the address is a locker and has more than the bond
     */
    function isMinLocker(address locker, uint minBond, uint earned, uint age) external returns (bool) {
        _gasUsed = gasleft();
        return lockers[locker]
                && bonds[locker][address(this)].add(votes[locker]) >= minBond
                && workCompleted[locker] >= earned
                && now.sub(firstSeen[locker]) >= age;
    }

    /**
     * @notice confirms if the current locker is registered and has a minimum bond, should be used for protected functions
     * @param locker the locker being investigated
     * @param bond the bound asset being evaluated
     * @param minBond the minimum requirement for the asset provided in bond
     * @param earned the total funds earned in the lockers lifetime
     * @param age the age of the locker in the system
     * @return true/false if the address is a locker and has more than the bond
     */
    function isBondedLocker(address locker, address bond, uint minBond, uint earned, uint age) external returns (bool) {
        _gasUsed = gasleft();
        return lockers[locker]
                && bonds[locker][bond] >= minBond
                && workCompleted[locker] >= earned
                && now.sub(firstSeen[locker]) >= age;
    }

    /**
     * @notice begin the bonding process for a new locker
     * @param bonding the asset being bound
     * @param amount the amount of bonding asset being bound
     */
    function bond(address bonding, uint amount) external nonReentrant {
        require(!blacklist[msg.sender], "blacklisted");
        bondings[msg.sender][bonding] = now;
        if (bonding == address(this)) {
            _transferTokens(msg.sender, address(this), amount);
        } else {
            uint _before = IERC20(bonding).balanceOf(address(this));
            IERC20(bonding).safeTransferFrom(msg.sender, address(this), amount);
            amount = IERC20(bonding).balanceOf(address(this)).sub(_before);
        }
        pendingbonds[msg.sender][bonding] = pendingbonds[msg.sender][bonding].add(amount);
        emit LockerBonding(msg.sender, block.number, bondings[msg.sender][bonding], amount);
    }

    /**
     * @notice get full list of lockers in the system
     */
    function getLockers() external view returns (address[] memory) {
        return lockerList;
    }

   /**
     * @notice Does initial data initialization of locker entry
     * @param sender the address to init data for
     */
    function doDataInit(address sender) internal {
        if (firstSeen[sender] == 0) {
          firstSeen[sender] = now;
          lockerList.push(sender);
          lastJob[sender] = now;
        }
    }

    /**
     * @notice allows a locker to activate/register themselves after bonding
     * @param bonding the asset being activated as bond collateral
     */
    function activate(address bonding) external {
        require(!blacklist[msg.sender], "blacklisted");
        //In this part we changed the check of bonding time being lesser than now to check if current time is > bonding time
        require(bondings[msg.sender][bonding] != 0 && block.timestamp.sub(bondings[msg.sender][bonding].add(BOND)) >= 0, "bonding");
        //Setup initial data
        doDataInit(msg.sender);
        _activate(msg.sender, bonding);
    }

    function _activate(address locker, address bonding) internal {
        lockers[locker] = true;
        _bond(bonding, locker, pendingbonds[locker][bonding]);
        pendingbonds[locker][bonding] = 0;
        emit LockerBonded(locker, block.number, block.timestamp, bonds[locker][bonding]);
    }

    /**
     * @notice allows a locker to transfer their locker rights and bonds to another address
     * @param bonding the asset being transfered to new address as bond collateral
     * @param from the address locker rights and bonding amount is transfered from
     * @param to the address locker rights and bonding amount is transfered to
     */
    function transferLockerRight(address bonding,address from,address to) public {
     
        require(isLocker(from));
        require(msg.sender == from || LockerAllowances[from][msg.sender][bonding]);
        require(bondings[from][bonding] != 0 && block.timestamp.sub(bondings[from][bonding].add(BOND)) >= 0);

        doDataInit(to);

        //Set the user calling locker stat to false
        lockers[from] = false;
        //Set the to addr locker stat to true
        lockers[to] = true;

        //Unbond from sender
        uint currentbond = bonds[from][bonding];
        _unbond(bonding,from,currentbond);
        //Bond to receiver
        _bond(bonding,to,currentbond);
        //remove rights for this address after transfer is done from caller
        LockerAllowances[from][msg.sender][bonding] = false;
        emit LockerRightTransfered(from,to,bonding);
    }

    /**
     * @notice begin the unbonding process to stop being a locker
     * @param bonding the asset being unbound
     * @param amount allows for partial unbonding
     */
    function unbond(address bonding, uint amount) external {
        unbondings[msg.sender][bonding] = now;
        _unbond(bonding, msg.sender, amount);
        partialUnbonding[msg.sender][bonding] = partialUnbonding[msg.sender][bonding].add(amount);
        emit LockerUnbonding(msg.sender, block.number, unbondings[msg.sender][bonding], amount);
    }

    /**
     * @notice withdraw funds after unbonding has finished
     * @param bonding the asset to withdraw from the bonding pool
     */
    function withdraw(address bonding) external nonReentrant {
        require(unbondings[msg.sender][bonding] != 0 &&block.timestamp.sub(unbondings[msg.sender][bonding].add(UNBOND)) >= 0, "withdraw: unbonding");
        require(!disputes[msg.sender], "disputes");

        if (bonding == address(this)) {
            _transferTokens(address(this), msg.sender, partialUnbonding[msg.sender][bonding]);
        } else {
            IERC20(bonding).safeTransfer(msg.sender, partialUnbonding[msg.sender][bonding]);
        }
        emit LockerUnbound(msg.sender, block.number, block.timestamp, partialUnbonding[msg.sender][bonding]);
        partialUnbonding[msg.sender][bonding] = 0;
    }
    
    /**
     * @notice blacklists a locker from participating in the network
     * @param locker the address being slashed
     */
    function revoke(address locker) external onlyGovernance{
        lockers[locker] = false;
        blacklist[locker] = true;
        IGovernance(governance).slash(address(this), locker, bonds[locker][address(this)]);
    }
    

    /**
     * @notice Get the number of tokens `spender` is approved to spend on behalf of `account`
     * @param account The address of the account holding the funds
     * @param spender The address of the account spending the funds
     * @return The number of tokens approved
     */
    function allowance(address account, address spender) external view returns (uint) {
        return allowances[account][spender];
    }

    /**
     * @notice Approve `spender` to transfer up to `amount` from `src`
     * @dev This will overwrite the approval amount for `spender`
     *  and is subject to issues noted [here](https://eips.ethereum.org/EIPS/eip-20#approve)
     * @param spender The address of the account which may transfer tokens
     * @param amount The number of tokens that are approved (2^256-1 means infinite)
     * @return Whether or not the approval succeeded
     */
    function approve(address spender, uint amount) public returns (bool) {
        allowances[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);
        return true;
    }
    
    /**
     * @notice Approve `spender` to transfer Locker rights
     * @param spender The address of the account which may transfer locker rights
     * @param fAllow whether this spender should be able to transfer rights
     * @return Whether or not the approval succeeded
     */
    function lockerightapprove(address spender,address bonding,bool fAllow) public returns (bool) {
        LockerAllowances[msg.sender][spender][bonding] = fAllow;

        emit LockerRightApproval(msg.sender, bonding,spender, fAllow);
        return true;
    }

    /**
     * @notice Triggers an approval from owner to spends
     * @param owner The address to approve from
     * @param spender The address to be approved
     * @param amount The number of tokens that are approved (2^256-1 means infinite)
     * @param deadline The time at which to expire the signature
     * @param v The recovery byte of the signature
     * @param r Half of the ECDSA signature pair
     * @param s Half of the ECDSA signature pair
     */
    function permit(address owner, address spender, uint amount, uint deadline, uint8 v, bytes32 r, bytes32 s) external {
        bytes32 structHash = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, amount, nonces[owner]++, deadline));
        bytes32 digest = keccak256(abi.encodePacked("\x19\x01", DOMAINSEPARATOR, structHash));
        address signatory = ecrecover(digest, v, r, s);
        require(signatory != address(0), "permit: signature");
        require(signatory == owner, "permit: unauthorized");
        require(now <= deadline, "permit: expired");

        allowances[owner][spender] = amount;

        emit Approval(owner, spender, amount);
    }

    /**
     * @notice Get the number of tokens held by the `account`
     * @param account The address of the account to get the balance of
     * @return The number of tokens held
     */
    function balanceOf(address account) external view returns (uint) {
        return balances[account];
    }

    /**
     * @notice Transfer `amount` tokens from `msg.sender` to `dst`
     * @param dst The address of the destination account
     * @param amount The number of tokens to transfer
     * @return Whether or not the transfer succeeded
     */
    function transfer(address dst, uint amount) public returns (bool) {
        _transferTokens(msg.sender, dst, amount);
        return true;
    }

    /**
     * @notice Transfer `amount` tokens from `src` to `dst`
     * @param src The address of the source account
     * @param dst The address of the destination account
     * @param amount The number of tokens to transfer
     * @return Whether or not the transfer succeeded
     */
    function transferFrom(address src, address dst, uint amount) external returns (bool) {
        address spender = msg.sender;
        uint spenderAllowance = allowances[src][spender];

        if (spender != src && spenderAllowance != uint(-1)) {
            uint newAllowance = spenderAllowance.sub(amount, "transferFrom: exceeds spender allowance");
            allowances[src][spender] = newAllowance;

            emit Approval(src, spender, newAllowance);
        }

        _transferTokens(src, dst, amount);
        return true;
    }

    function _transferTokens(address src, address dst, uint amount) internal {
        require(src != address(0), "_transferTokens: zero address");
        require(dst != address(0), "_transferTokens: zero address");

        balances[src] = balances[src].sub(amount, "_transferTokens: exceeds balance");
        balances[dst] = balances[dst].add(amount, "_transferTokens: overflows");
        emit Transfer(src, dst, amount);
    }

    function _getChainId() internal pure returns (uint) {
        uint chainId;
        assembly { chainId := chainid() }
        return chainId;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"credit","type":"address"},{"indexed":true,"internalType":"address","name":"job","type":"address"},{"indexed":true,"internalType":"address","name":"creditor","type":"address"},{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AddCredit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"job","type":"address"},{"indexed":true,"internalType":"address","name":"liquidity","type":"address"},{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"credit","type":"uint256"}],"name":"ApplyCredit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"job","type":"address"},{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":false,"internalType":"address","name":"governance","type":"address"}],"name":"JobAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"job","type":"address"},{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":false,"internalType":"address","name":"governance","type":"address"}],"name":"JobRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"locker","type":"address"},{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"activated","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bond","type":"uint256"}],"name":"LockerBonded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"locker","type":"address"},{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"active","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bond","type":"uint256"}],"name":"LockerBonding","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"locker","type":"address"},{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"}],"name":"LockerDispute","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"locker","type":"address"},{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"}],"name":"LockerResolved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"bonding","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"bool","name":"allowed","type":"bool"}],"name":"LockerRightApproval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"address","name":"bond","type":"address"}],"name":"LockerRightTransfered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"locker","type":"address"},{"indexed":true,"internalType":"address","name":"slasher","type":"address"},{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"slash","type":"uint256"}],"name":"LockerSlashed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"locker","type":"address"},{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"deactive","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bond","type":"uint256"}],"name":"LockerUnbonding","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"locker","type":"address"},{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"deactivated","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bond","type":"uint256"}],"name":"LockerUnbound","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"credit","type":"address"},{"indexed":true,"internalType":"address","name":"job","type":"address"},{"indexed":true,"internalType":"address","name":"locker","type":"address"},{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LockerWorked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"job","type":"address"},{"indexed":true,"internalType":"address","name":"liquidity","type":"address"},{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"credit","type":"uint256"}],"name":"RemoveJob","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"job","type":"address"},{"indexed":true,"internalType":"address","name":"liquidity","type":"address"},{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"credit","type":"uint256"}],"name":"SubmitJob","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":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"job","type":"address"},{"indexed":true,"internalType":"address","name":"liquidity","type":"address"},{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"credit","type":"uint256"}],"name":"UnbondJob","type":"event"},{"inputs":[],"name":"BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BOND","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAINSEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LIQUIDITYBOND","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LK3RH","outputs":[{"internalType":"contract ILock3rV1Helper","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNBOND","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"bonding","type":"address"}],"name":"activate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"credit","type":"address"},{"internalType":"address","name":"job","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"job","type":"address"}],"name":"addCreditETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"job","type":"address"}],"name":"addJob","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"job","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addLK3RCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"liquidity","type":"address"},{"internalType":"address","name":"job","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addLiquidityToJob","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"voter","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addVotes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"provider","type":"address"},{"internalType":"address","name":"liquidity","type":"address"},{"internalType":"address","name":"job","type":"address"}],"name":"applyCreditToJob","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"liquidity","type":"address"}],"name":"approveLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"bonding","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"bond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"bondings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"bonds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint256","name":"votes","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"credits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"disputes","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"firstSeen","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"fund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getJobs","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLockers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"locker","type":"address"},{"internalType":"address","name":"bond","type":"address"},{"internalType":"uint256","name":"minBond","type":"uint256"},{"internalType":"uint256","name":"earned","type":"uint256"},{"internalType":"uint256","name":"age","type":"uint256"}],"name":"isBondedLocker","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"locker","type":"address"}],"name":"isLocker","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"locker","type":"address"},{"internalType":"uint256","name":"minBond","type":"uint256"},{"internalType":"uint256","name":"earned","type":"uint256"},{"internalType":"uint256","name":"age","type":"uint256"}],"name":"isMinLocker","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"jobList","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"jobProposalDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"jobs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastJob","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"liquidityAccepted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"liquidityAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"liquidityAmountsUnbonding","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"liquidityApplied","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"liquidityPairs","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"liquidityProvided","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"liquidityUnbonding","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lockerList","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"address","name":"bonding","type":"address"},{"internalType":"bool","name":"fAllow","type":"bool"}],"name":"lockerightapprove","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lockers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pairs","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"partialUnbonding","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingGovernance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"pendingbonds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"credit","type":"address"},{"internalType":"address","name":"locker","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"receipt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"locker","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"receiptETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"job","type":"address"}],"name":"removeJob","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"liquidity","type":"address"},{"internalType":"address","name":"job","type":"address"}],"name":"removeLiquidityFromJob","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"voter","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"removeVotes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"locker","type":"address"}],"name":"revoke","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"liquidity","type":"address"}],"name":"revokeLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBond","type":"uint256"}],"name":"setBondingDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"}],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLiqBond","type":"uint256"}],"name":"setLiquidityBondingDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"setLiquidityFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ILock3rV1Helper","name":"_lk3rh","type":"address"}],"name":"setLock3rHelper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newUnbond","type":"uint256"}],"name":"setUnbondingDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBonded","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":"dst","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"bonding","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"transferLockerRight","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"bonding","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unbond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"liquidity","type":"address"},{"internalType":"address","name":"job","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unbondLiquidityFromJob","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"unbondings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"votes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"bonding","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"workCompleted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"locker","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"workReceipt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"locker","type":"address"}],"name":"worked","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"locker","type":"address"}],"name":"workedETH","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a0604052692a5a058fc295ed0000006002556202a30060095562093a80600a556202a300600b55601e600c5560006013553480156200003e57600080fd5b506001600090815560258054336001600160a01b03199182168117909255602780549091168217905560025490825260076020908152604090922054620000919290919062000184811b6200418b17901c565b33600081815260076020526040808220939093556002549251919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91620000db9162000204565b60405180910390a36040805180820190915260068152652637b1b599b960d11b6020909101527f797cfab58fcb15f590eb8e4252d5c228ff88f94f907e119e80c4393a946e8f357fff9dbcec6fef64c1aeb29e2d61f1af9293c5a09910e935b9ffa66bd97238d10e6200014d620001bc565b30604051602001620001639493929190620001c0565b60408051601f1981840301815291905280516020909101206080526200020d565b600082820183811015620001b55760405162461bcd60e51b8152600401620001ac90620001e4565b60405180910390fd5b9392505050565b4690565b938452602084019290925260408301526001600160a01b0316606082015260800190565b6020808252600690820152656164643a202b60d01b604082015260600190565b90815260200190565b608051615ae5620002326000398061155152806138a55280613d0a5250615ae56000f3fe6080604052600436106105595760003560e01c8063782d6fe1116102bd578063c3cda52011610180578063def70844116100e7578063f1127ed8116100a0578063f9f92be41161007a578063f9f92be414611093578063fe0f0d8c146110b3578063fede7008146110d3578063ffb0a4a0146110f357610559565b8063f1127ed81461103b578063f39c38a014611069578063f57cb3821461107e57610559565b8063def7084414610f91578063e326ac4314610fb1578063e7a324dc14610fd1578063eb421f3b14610fe6578063ec342ad014611006578063f0f442601461101b57610559565b8063d454019d11610139578063d454019d14610ed1578063d505accf14610ef1578063d8bff5a514610f11578063dd62ed3e14610f31578063de63298d14610f51578063deac354114610f7157610559565b8063c3cda52014610e1c578063c3fc0e1d14610e3c578063c5198abc14610e5c578063c57981b514610e7c578063ca1d209d14610e91578063ce6a088014610eb157610559565b80639e3369b611610224578063ab033ea9116101dd578063ab033ea914610d67578063b0103b1a14610d87578063b4b5ea5714610da7578063b600702a14610dc7578063bb49096d14610de7578063c1c1d21814610e0757610559565b80639e3369b614610ca7578063a39744b514610cc7578063a457f6fe14610ce7578063a515366a14610d07578063a5d059ca14610d27578063a9059cbb14610d4757610559565b806385f399661161027657806385f3996614610bf257806388b4ac8314610c125780638d9acd2e14610c32578063945dd26e14610c5257806395d89b4114610c725780639af7728414610c8757610559565b8063782d6fe114610b485780637ecebe0014610b685780638071198914610b88578063814ee60a14610ba85780638322fff214610bbd57806383baa69314610bd257610559565b80633d1f0bb911610420578063603b4d141161038757806368581ebd1161034057806370a082311161031a57806370a0823114610ac857806374a8f10314610ae857806375b12c1814610b085780637724ff6814610b2857610559565b806368581ebd14610a665780636dab5dcf14610a885780636fcfff4514610a9b57610559565b8063603b4d14146109bc578063603c6860146109d157806361d027b3146109f1578063637cd7f014610a0657806364bb43ee14610a2657806367da318414610a4657610559565b806351cff8d9116103d957806351cff8d91461090757806352a4de2914610927578063587cde1e146109475780635aa6e675146109675780635c19a95c1461097c5780635feeb7941461099c57610559565b80633d1f0bb91461085257806342966c68146108725780634395d8ba1461089257806344d96e95146108b25780634b3fde21146108c75780634f039447146108e757610559565b806320606b70116104c45780632fe23dbd1161047d5780632fe23dbd1461079b57806330adf81f146107bb578063313ce567146107d0578063357bf15c146107f257806337feca8414610812578063392c4c6c1461083257610559565b806320606b70146106f15780632119a62a14610706578063238efcbc1461072657806323b872dd1461073b5780632c8e7a211461075b5780632ec63d7c1461077b57610559565b806318160ddd1161051657806318160ddd146106475780631992d2061461065c5780631b44555e1461067c5780631b7a1fb21461069c5780631c5a9d9c146106bc5780631df0de13146106dc57610559565b806302175fa41461055e57806306fdde0314610580578063095ea7b3146105ab5780630c33c522146105d85780631101eb41146106055780631778e29c14610625575b600080fd5b34801561056a57600080fd5b5061057e610579366004615192565b611108565b005b34801561058c57600080fd5b50610595611124565b6040516105a2919061533b565b60405180910390f35b3480156105b757600080fd5b506105cb6105c6366004615082565b611146565b6040516105a291906152b1565b3480156105e457600080fd5b506105f86105f3366004615192565b6111b1565b6040516105a291906151f9565b34801561061157600080fd5b5061057e610620366004614f84565b6111d8565b34801561063157600080fd5b5061063a61154f565b6040516105a291906152bc565b34801561065357600080fd5b5061063a611573565b34801561066857600080fd5b5061063a610677366004614efb565b611579565b34801561068857600080fd5b5061063a610697366004614ea7565b61159c565b3480156106a857600080fd5b506105f86106b7366004615192565b6115ae565b3480156106c857600080fd5b5061057e6106d7366004614ea7565b6115bb565b3480156106e857600080fd5b5061063a61168a565b3480156106fd57600080fd5b5061063a611690565b34801561071257600080fd5b5061057e610721366004615082565b6116b4565b34801561073257600080fd5b5061057e6117fb565b34801561074757600080fd5b506105cb610756366004614f84565b611849565b34801561076757600080fd5b506105cb610776366004614ea7565b611930565b34801561078757600080fd5b506105cb610796366004614ea7565b611944565b3480156107a757600080fd5b5061057e6107b6366004615192565b611968565b3480156107c757600080fd5b5061063a611984565b3480156107dc57600080fd5b506107e56119a8565b6040516105a29190615a0b565b3480156107fe57600080fd5b5061057e61080d366004615192565b6119ad565b34801561081e57600080fd5b5061063a61082d366004614ec3565b6119c9565b34801561083e57600080fd5b506105cb61084d3660046150ad565b6119e6565b34801561085e57600080fd5b506105cb61086d366004614ea7565b611aa7565b34801561087e57600080fd5b5061057e61088d366004615192565b611abc565b34801561089e57600080fd5b5061057e6108ad366004614efb565b611ac6565b3480156108be57600080fd5b5061063a611da4565b3480156108d357600080fd5b5061057e6108e2366004615082565b611daa565b3480156108f357600080fd5b5061057e610902366004615192565b611f8e565b34801561091357600080fd5b5061057e610922366004614ea7565b611faa565b34801561093357600080fd5b5061057e610942366004614f84565b612185565b34801561095357600080fd5b506105f8610962366004614ea7565b6123ff565b34801561097357600080fd5b506105f861241a565b34801561098857600080fd5b5061057e610997366004614ea7565b612429565b3480156109a857600080fd5b5061057e6109b7366004614ea7565b612433565b3480156109c857600080fd5b5061063a6124c3565b3480156109dd57600080fd5b5061057e6109ec366004614ec3565b6124c9565b3480156109fd57600080fd5b506105f8612687565b348015610a1257600080fd5b5061063a610a21366004614ec3565b612696565b348015610a3257600080fd5b5061057e610a41366004614ea7565b6126b3565b348015610a5257600080fd5b5061063a610a61366004614ec3565b6126eb565b348015610a7257600080fd5b50610a7b612708565b6040516105a29190615264565b61057e610a96366004614ea7565b61276a565b348015610aa757600080fd5b50610abb610ab6366004614ea7565b6128a5565b6040516105a291906159e4565b348015610ad457600080fd5b5061063a610ae3366004614ea7565b6128bd565b348015610af457600080fd5b5061057e610b03366004614ea7565b6128d8565b348015610b1457600080fd5b5061057e610b23366004614efb565b612995565b348015610b3457600080fd5b5061063a610b43366004614ea7565b612b3c565b348015610b5457600080fd5b5061063a610b63366004615082565b612b4e565b348015610b7457600080fd5b5061063a610b83366004614ea7565b612d37565b348015610b9457600080fd5b5061057e610ba3366004614ea7565b612d49565b348015610bb457600080fd5b50610a7b612dbd565b348015610bc957600080fd5b506105f8612e1d565b348015610bde57600080fd5b5061063a610bed366004614efb565b612e22565b348015610bfe57600080fd5b5061057e610c0d366004614ea7565b612e45565b348015610c1e57600080fd5b5061057e610c2d366004614f84565b612ed5565b348015610c3e57600080fd5b5061057e610c4d366004614f84565b61314a565b348015610c5e57600080fd5b5061057e610c6d366004614ea7565b61326f565b348015610c7e57600080fd5b506105956132a8565b348015610c9357600080fd5b5061063a610ca2366004614ec3565b6132c8565b348015610cb357600080fd5b506105cb610cc2366004614fc4565b6132e5565b348015610cd357600080fd5b5061063a610ce2366004614ec3565b613395565b348015610cf357600080fd5b506105f8610d02366004615192565b6133b2565b348015610d1357600080fd5b5061057e610d22366004615082565b6133bf565b348015610d3357600080fd5b5061057e610d42366004615082565b6135cd565b348015610d5357600080fd5b506105cb610d62366004615082565b6136a9565b348015610d7357600080fd5b5061057e610d82366004614ea7565b6136bf565b348015610d9357600080fd5b506105cb610da2366004614ea7565b6136f8565b348015610db357600080fd5b5061063a610dc2366004614ea7565b61370d565b348015610dd357600080fd5b5061057e610de2366004614ea7565b613771565b348015610df357600080fd5b5061063a610e02366004614efb565b613827565b348015610e1357600080fd5b5061063a61384a565b348015610e2857600080fd5b5061057e610e373660046150e7565b613850565b348015610e4857600080fd5b5061057e610e57366004615082565b6139dc565b348015610e6857600080fd5b5061057e610e77366004614ea7565b613ada565b348015610e8857600080fd5b5061063a613bc1565b348015610e9d57600080fd5b5061057e610eac366004615192565b613bc7565b348015610ebd57600080fd5b5061057e610ecc366004615082565b613bf4565b348015610edd57600080fd5b5061063a610eec366004614ea7565b613c81565b348015610efd57600080fd5b5061057e610f0c366004615014565b613c93565b348015610f1d57600080fd5b5061063a610f2c366004614ea7565b613e8d565b348015610f3d57600080fd5b5061063a610f4c366004614ec3565b613e9f565b348015610f5d57600080fd5b5061057e610f6c366004615082565b613eca565b348015610f7d57600080fd5b5061063a610f8c366004614ec3565b613f5c565b348015610f9d57600080fd5b5061063a610fac366004614efb565b613f79565b348015610fbd57600080fd5b5061063a610fcc366004614ea7565b613f9c565b348015610fdd57600080fd5b5061063a613fae565b348015610ff257600080fd5b506105cb611001366004614ea7565b613fd2565b34801561101257600080fd5b5061063a613fe7565b34801561102757600080fd5b5061057e611036366004614ea7565b613fed565b34801561104757600080fd5b5061105b611056366004615141565b614026565b6040516105a29291906159f5565b34801561107557600080fd5b506105f8614053565b34801561108a57600080fd5b506105f8614062565b34801561109f57600080fd5b506105cb6110ae366004614ea7565b614071565b3480156110bf57600080fd5b506105cb6110ce366004614f45565b614086565b3480156110df57600080fd5b5061063a6110ee366004614efb565b614108565b3480156110ff57600080fd5b50610a7b61412b565b6025546001600160a01b0316331461111f57600080fd5b600955565b604051806040016040528060068152602001652637b1b599b960d11b81525081565b3360008181526006602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061119f9086906152bc565b60405180910390a35060015b92915050565b602481815481106111be57fe5b6000918252602090912001546001600160a01b0316905081565b336000908152601f602090815260408083206001600160a01b03878116855290835281842090861684529091529020541561122e5760405162461bcd60e51b81526004016112259061578c565b60405180910390fd5b336000818152601b602090815260408083206001600160a01b03888116808652918452828520908816808652908452828520429055948452601c835281842090845282528083209383529290522054611287908261418b565b336000818152601c602090815260408083206001600160a01b03898116808652918452828520908916808652818552838620889055958552601a84528285209185529083528184209484529382529091205491905210156112fa5760405162461bcd60e51b81526004016112259061559a565b60405163cbc3ab5360e01b81526000907306dec17b57c15446578efdce3380de3433f44da49063cbc3ab5390611336908790309060040161520d565b60206040518083038186803b15801561134e57600080fd5b505af4158015611362573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138691906151aa565b9050600061140e856001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156113c657600080fd5b505afa1580156113da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113fe91906151aa565b61140884866141b0565b906141ea565b6001600160a01b0385166000908152601960209081526040808320308452909152902054909150811115611494576001600160a01b03841660009081526019602090815260408083203080855292529091205461146b9190614215565b6001600160a01b03841660009081526019602090815260408083203084529091528120556114f1565b61149e3082614215565b6001600160a01b03841660009081526019602090815260408083203084529091529020546114cc90826142f0565b6001600160a01b03851660009081526019602090815260408083203084529091529020555b336001600160a01b0316856001600160a01b0316856001600160a01b03167f6d962fe34dd0cf9a9df3e12a7b8ddfe5f790b3f11668553455d7b52db70a07be43876040516115409291906159c0565b60405180910390a45050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60025481565b601f60209081526000938452604080852082529284528284209052825290205481565b60176020526000908152604090205481565b602981815481106111be57fe5b3360009081526021602052604090205460ff16156115eb5760405162461bcd60e51b815260040161122590615813565b336000908152600d602090815260408083206001600160a01b0385168452909152902054158015906116585750600954336000908152600d602090815260408083206001600160a01b038616845290915281205490916116559161164e9161418b565b42906142f0565b10155b6116745760405162461bcd60e51b8152600401611225906153d5565b61167d3361431b565b61168733826143a0565b50565b600b5481565b7f797cfab58fcb15f590eb8e4252d5c228ff88f94f907e119e80c4393a946e8f3581565b3360009081526018602052604090205460ff166116e35760405162461bcd60e51b815260040161122590615898565b604080518082018252601d81527f776f726b526563656970743a20696e7375666669656e742066756e647300000060208083019190915233600090815260198252838120600e8252909152919091205461173e918390614456565b336000908152601960209081526040808320600e84528252808320939093556001600160a01b0385168083526016909152828220429055915183156108fc0291849190818181858888f1935050505015801561179e573d6000803e3d6000fd5b50816001600160a01b0316336001600160a01b0316600e6001600160a01b03167f7d3fc7e21dbdbae0ba4917fc7f31b9a0e31bc627c1dfa1b6638af5e4ede319e443856040516117ef9291906159c0565b60405180910390a45050565b6026546001600160a01b031633146118255760405162461bcd60e51b8152600401611225906156ff565b602654602580546001600160a01b0319166001600160a01b03909216919091179055565b6001600160a01b03831660008181526006602090815260408083203380855292528220549192909190821480159061188357506000198114155b156119195760006118af85604051806060016040528060278152602001615a8960279139849190614456565b6001600160a01b03808916600081815260066020908152604080832094891680845294909152908190208490555192935090917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061190f9085906152bc565b60405180910390a3505b611924868686614482565b50600195945050505050565b602080526000908152604090205460ff1681565b60005a602a55506001600160a01b0316600090815260208052604090205460ff1690565b6025546001600160a01b0316331461197f57600080fd5b600b55565b7f5fae9ec55a1e547936e0e74d606b44cd5f912f9adcd0bba561fea62d570259e981565b601281565b6025546001600160a01b031633146119c457600080fd5b600c55565b600d60209081526000928352604080842090915290825290205481565b60005a602a556001600160a01b038516600090815260208052604090205460ff168015611a4a57506001600160a01b03851660009081526012602090815260408083205460118352818420308552909252909120548591611a47919061418b565b10155b8015611a6e57506001600160a01b0385166000908152601760205260409020548311155b8015611a9e57506001600160a01b0385166000908152601460205260409020548290611a9b9042906142f0565b10155b95945050505050565b60186020526000908152604090205460ff1681565b6116873382614215565b6001600160a01b03821660009081526028602052604090205460ff16611afe5760405162461bcd60e51b815260040161122590615861565b6001600160a01b038084166000908152601e602090815260408083208685168452825280832093851683529290522054611b4a5760405162461bcd60e51b815260040161122590615838565b600b546001600160a01b038085166000908152601e60209081526040808320878516845282528083209386168352929052908120549091611b8e9161164e9161418b565b1015611bac5760405162461bcd60e51b815260040161122590615980565b60405163cbc3ab5360e01b81526000907306dec17b57c15446578efdce3380de3433f44da49063cbc3ab5390611be8908690309060040161520d565b60206040518083038186803b158015611c0057600080fd5b505af4158015611c14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c3891906151aa565b90506000611ceb846001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611c7857600080fd5b505afa158015611c8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb091906151aa565b6001600160a01b038088166000908152601f602090815260408083208a851684528252808320938916835292905220546114089085906141b0565b9050611cf730826145d8565b6001600160a01b0383166000908152601960209081526040808320308452909152902054611d25908261418b565b6001600160a01b038085166000818152601960209081526040808320308452825280832095909555898416808352601f8252858320948a168084529482528583208484529091528482209190915592517fa90666688fb32254f45a367c38fbcd5f2664432b061a4354d9d3c9a7abcbec5b9061154090439087906159c0565b60135481565b3360009081526018602052604090205460ff16611dd95760405162461bcd60e51b815260040161122590615955565b6001546001600160a01b031663525ea631611df75a602a54906142f0565b6040518263ffffffff1660e01b8152600401611e1391906152bc565b60206040518083038186803b158015611e2b57600080fd5b505afa158015611e3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6391906151aa565b811115611e825760405162461bcd60e51b8152600401611225906156cf565b604080518082018252601d81527f776f726b526563656970743a20696e7375666669656e742066756e6473000000602080830191909152336000908152601982528381203082529091529190912054611edc918390614456565b3360009081526019602090815260408083203084528252808320939093556001600160a01b03851682526016905220429055611f1882826146b1565b6001600160a01b038216600090815260176020526040902054611f3b908261418b565b6001600160a01b03831660008181526017602052604090819020929092559051339030907f7d3fc7e21dbdbae0ba4917fc7f31b9a0e31bc627c1dfa1b6638af5e4ede319e4906117ef90439087906159c0565b6025546001600160a01b03163314611fa557600080fd5b600a55565b60026000541415611fcd5760405162461bcd60e51b8152600401611225906158bf565b60026000908155338152600e602090815260408083206001600160a01b0385168452909152902054158015906120375750600a54336000908152600e602090815260408083206001600160a01b038616845290915281205490916120349161164e9161418b565b10155b6120535760405162461bcd60e51b81526004016112259061542b565b3360009081526015602052604090205460ff16156120835760405162461bcd60e51b81526004016112259061565f565b6001600160a01b0381163014156120c857336000818152600f602090815260408083206001600160a01b03861684529091529020546120c3913091614482565b6120f7565b336000818152600f602090815260408083206001600160a01b0386168085529252909120546120f79290614769565b336000818152600f602090815260408083206001600160a01b0386168452909152908190205490517fbac746a470313079568cd81c87546028484b062a3909acd207dfb77bdb8554e59161214e91439142916159ce565b60405180910390a2336000908152600f602090815260408083206001600160a01b0394909416835292905290812081905560019055565b600260005414156121a85760405162461bcd60e51b8152600401611225906158bf565b600260009081556001600160a01b03841681526028602052604090205460ff166121e45760405162461bcd60e51b815260040161122590615861565b6121f96001600160a01b0384163330846147c4565b336000908152601a602090815260408083206001600160a01b0387811685529083528184209086168452909152902054612233908261418b565b336000818152601a602090815260408083206001600160a01b0389811680865291845282852090891680865290845282852096909655848452601e835281842081855283528184208685528352818420429055938352601f8252808320938352928152828220938252929092529020546122ad908261418b565b336000908152601f602090815260408083206001600160a01b038881168552908352818420908716845282528083209390935560189052205460ff1615801561231b5750600a546001600160a01b0383166000908152601d60205260409020544291612319919061418b565b105b1561239e5760255460405163dc380cbb60e01b81526001600160a01b039091169063dc380cbb906123509085906004016151f9565b600060405180830381600087803b15801561236a57600080fd5b505af115801561237e573d6000803e3d6000fd5b5050506001600160a01b0383166000908152601d60205260409020429055505b336001600160a01b0316836001600160a01b0316836001600160a01b03167fe1cb44a16adbd63a44f65c279b23b8f447b2c6e120a2bc7f004758b446e05ed143856040516123ed9291906159c0565b60405180910390a45050600160005550565b6003602052600090815260409020546001600160a01b031681565b6025546001600160a01b031681565b61168733826147eb565b6001546116879082906001600160a01b031663525ea6316124575a602a54906142f0565b6040518263ffffffff1660e01b815260040161247391906152bc565b60206040518083038186803b15801561248b57600080fd5b505afa15801561249f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e291906151aa565b600a5481565b336000908152601b602090815260408083206001600160a01b03868116855290835281842090851684529091529020546125155760405162461bcd60e51b815260040161122590615736565b600a54336000908152601b602090815260408083206001600160a01b038781168552908352818420908616845290915281205490916125579161164e9161418b565b10156125755760405162461bcd60e51b815260040161122590615681565b336000818152601c602090815260408083206001600160a01b0387811680865291845282852090871680865290845282852054958552601a84528285209185529083528184209084529091529020546125ce90826142f0565b336000818152601a602090815260408083206001600160a01b0389811680865291845282852090891680865290845282852096909655848452601c835281842081855283528184209584529490915281205561262b919083614769565b336001600160a01b0316836001600160a01b0316836001600160a01b03167fb69fc9f6d19ed402461251491f86c736bfcbe966e9584d3fb8a0057b313b6920438560405161267a9291906159c0565b60405180910390a4505050565b6027546001600160a01b031681565b601960209081526000928352604080842090915290825290205481565b6025546001600160a01b031633146126ca57600080fd5b6001600160a01b03166000908152602860205260409020805460ff19169055565b600f60209081526000928352604080842090915290825290205481565b6060602480548060200260200160405190810160405280929190818152602001828054801561276057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612742575b5050505050905090565b6001600160a01b03811660009081526018602052604090205460ff166127a25760405162461bcd60e51b8152600401611225906157bc565b60006127bf612710611408600c54346141b090919063ffffffff16565b90506127f96127ce34836142f0565b6001600160a01b0384166000908152601960209081526040808320600e84529091529020549061418b565b6001600160a01b038084166000908152601960209081526040808320600e8452909152808220939093556025549251929091169183156108fc0291849190818181858888f19350505050158015612854573d6000803e3d6000fd5b50336001600160a01b0316826001600160a01b0316600e6001600160a01b03167fb97975ea9bf5ae2173b9ea765214622396032aba11cd5cc1450c760ac80d059a43346040516117ef9291906159c0565b60056020526000908152604090205463ffffffff1681565b6001600160a01b031660009081526007602052604090205490565b6025546001600160a01b031633146128ef57600080fd5b6001600160a01b03808216600090815260208080526040808320805460ff199081169091556021835281842080549091166001179055602554601183528184203080865293529281902054905163e74f823960e01b8152929093169263e74f82399261296092918691600401615227565b600060405180830381600087803b15801561297a57600080fd5b505af115801561298e573d6000803e3d6000fd5b5050505050565b61299e82611944565b6129a757600080fd5b336001600160a01b03831614806129eb57506001600160a01b03808316600090815260226020908152604080832033845282528083209387168352929052205460ff165b6129f457600080fd5b6001600160a01b038083166000908152600d602090815260408083209387168352929052205415801590612a6057506009546001600160a01b038084166000908152600d602090815260408083209388168352929052908120549091612a5d9161164e9161418b565b10155b612a6957600080fd5b612a728161431b565b6001600160a01b03808316600081815260208080526040808320805460ff1990811690915586861684528184208054909116600117905592825260118152828220938716825292909252902054612aca84848361489a565b612ad5848383614933565b6001600160a01b03808416600081815260226020908152604080832033845282528083208986168085529252808320805460ff19169055519093861692917f2d741352ba12ee72af4a9a3e3b3876daf926254d82fad9ea2bb18e87ea30b72791a450505050565b601d6020526000908152604090205481565b6000438210612b6f5760405162461bcd60e51b8152600401611225906158f6565b6001600160a01b03831660009081526005602052604090205463ffffffff1680612b9d5760009150506111ab565b6001600160a01b038416600090815260046020908152604080832063ffffffff600019860181168552925290912054168310612c0c576001600160a01b03841660009081526004602090815260408083206000199490940163ffffffff168352929052206001015490506111ab565b6001600160a01b038416600090815260046020908152604080832083805290915290205463ffffffff16831015612c475760009150506111ab565b600060001982015b8163ffffffff168163ffffffff161115612d0057600282820363ffffffff16048103612c79614e7f565b506001600160a01b038716600090815260046020908152604080832063ffffffff808616855290835292819020815180830190925280549093168082526001909301549181019190915290871415612cdb576020015194506111ab9350505050565b805163ffffffff16871115612cf257819350612cf9565b6001820392505b5050612c4f565b506001600160a01b038516600090815260046020908152604080832063ffffffff9094168352929052206001015491505092915050565b60086020526000908152604090205481565b6025546001600160a01b03163314612d6057600080fd5b6001600160a01b03811660008181526018602052604090819020805460ff19169055517f2ca18fdfae50f1042480d285d21f6706aa6abbd567d60a044b5bec07ccfee64890612db290439033906159a9565b60405180910390a250565b60606023805480602002602001604051908101604052809291908181526020018280548015612760576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311612742575050505050905090565b600e81565b601c60209081526000938452604080852082529284528284209052825290205481565b6001546116879082906001600160a01b031663525ea631612e695a602a54906142f0565b6040518263ffffffff1660e01b8152600401612e8591906152bc565b60206040518083038186803b158015612e9d57600080fd5b505afa158015612eb1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072191906151aa565b60026000541415612ef85760405162461bcd60e51b8152600401611225906158bf565b600260009081556001600160a01b03831681526018602052604090205460ff16612f345760405162461bcd60e51b8152600401611225906157bc565b6040516370a0823160e01b81526000906001600160a01b038516906370a0823190612f639030906004016151f9565b60206040518083038186803b158015612f7b57600080fd5b505afa158015612f8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fb391906151aa565b9050612fca6001600160a01b0385163330856147c4565b600061305282866001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401612ffc91906151f9565b60206040518083038186803b15801561301457600080fd5b505afa158015613028573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061304c91906151aa565b906142f0565b90506000613071612710611408600c54856141b090919063ffffffff16565b90506130ac61308083836142f0565b6001600160a01b038088166000908152601960209081526040808320938c16835292905220549061418b565b6001600160a01b0380871660009081526019602090815260408083208b85168085529252909120929092556025546130e692911683614769565b336001600160a01b0316856001600160a01b0316876001600160a01b03167fb97975ea9bf5ae2173b9ea765214622396032aba11cd5cc1450c760ac80d059a43866040516131359291906159c0565b60405180910390a45050600160005550505050565b3360009081526018602052604090205460ff166131795760405162461bcd60e51b815260040161122590615898565b604080518082018252601d81527f776f726b526563656970743a20696e7375666669656e742066756e6473000000602080830191909152336000908152601982528381206001600160a01b038816825290915291909120546131dc918390614456565b3360009081526019602090815260408083206001600160a01b0388811680865291845282852095909555938616835260169091529020429055613220908383614769565b816001600160a01b0316336001600160a01b0316846001600160a01b03167f7d3fc7e21dbdbae0ba4917fc7f31b9a0e31bc627c1dfa1b6638af5e4ede319e4438560405161267a9291906159c0565b6025546001600160a01b0316331461328657600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60405180604001604052806004815260200163262599a960e11b81525081565b600e60209081526000928352604080842090915290825290205481565b60005a602a556001600160a01b038616600090815260208052604090205460ff16801561333757506001600160a01b038087166000908152601160209081526040808320938916835292905220548411155b801561335b57506001600160a01b0386166000908152601760205260409020548311155b801561338b57506001600160a01b03861660009081526014602052604090205482906133889042906142f0565b10155b9695505050505050565b601160209081526000928352604080842090915290825290205481565b602381815481106111be57fe5b600260005414156133e25760405162461bcd60e51b8152600401611225906158bf565b600260009081553381526021602052604090205460ff16156134165760405162461bcd60e51b815260040161122590615813565b336000908152600d602090815260408083206001600160a01b03861680855292529091204290553014156134545761344f333083614482565b61351e565b6040516370a0823160e01b81526000906001600160a01b038416906370a08231906134839030906004016151f9565b60206040518083038186803b15801561349b57600080fd5b505afa1580156134af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134d391906151aa565b90506134ea6001600160a01b0384163330856147c4565b61351a81846001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401612ffc91906151f9565b9150505b3360009081526010602090815260408083206001600160a01b038616845290915290205461354c908261418b565b3360008181526010602090815260408083206001600160a01b03881680855290835281842095909555838352600d825280832094835293905282902054915190917ff70597a6fefc4f533a2329cb1dce863f3661a889db77d6ded02cedeca504ba56916135bc91439186906159ce565b60405180910390a250506001600055565b336000818152600e602090815260408083206001600160a01b038716845290915290204290556135ff9083908361489a565b336000908152600f602090815260408083206001600160a01b038616845290915290205461362d908261418b565b336000818152600f602090815260408083206001600160a01b03881680855290835281842095909555838352600e825280832094835293905282902054915190917f565117769b73385ad12786409df21084e3cc400c84936d78734fda9fd499b23e9161369d91439186906159ce565b60405180910390a25050565b60006136b6338484614482565b50600192915050565b6025546001600160a01b031633146136d657600080fd5b602680546001600160a01b0319166001600160a01b0392909216919091179055565b60156020526000908152604090205460ff1681565b6001600160a01b03811660009081526005602052604081205463ffffffff168061373857600061376a565b6001600160a01b038316600090815260046020908152604080832063ffffffff60001986011684529091529020600101545b9392505050565b6025546001600160a01b0316331461378857600080fd5b6001600160a01b03811660009081526028602052604090205460ff16156137c15760405162461bcd60e51b815260040161122590615563565b6001600160a01b03166000818152602860205260408120805460ff191660019081179091556029805491820181559091527fcb7c14ce178f56e2e8d86ab33ebc0ae081ba8556a00cd122038841867181caac0180546001600160a01b0319169091179055565b601b60209081526000938452604080852082529284528284209052825290205481565b60095481565b60007f1ac861a6a8532f3704e1768564a53a32774f00d6cf20ccbbdf60ab61378302bc87878760405160200161388994939291906152f9565b60405160208183030381529060405280519060200120905060007f0000000000000000000000000000000000000000000000000000000000000000826040516020016138d69291906151de565b604051602081830303815290604052805190602001209050600060018287878760405160008152602001604052604051613913949392919061531d565b6020604051602081039080840390855afa158015613935573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166139685760405162461bcd60e51b8152600401611225906154af565b6001600160a01b038116600090815260086020526040902080546001810190915588146139a75760405162461bcd60e51b8152600401611225906154db565b864211156139c75760405162461bcd60e51b81526004016112259061536e565b6139d1818a6147eb565b505050505050505050565b6025546001600160a01b031633146139f357600080fd5b6001600160a01b03821660009081526018602052604090205460ff16613a2b5760405162461bcd60e51b815260040161122590615632565b6001600160a01b0382166000908152601960209081526040808320308452909152902054613a59908261418b565b6001600160a01b038316600090815260196020908152604080832030808552925290912091909155613a8b90826145d8565b336001600160a01b0316826001600160a01b0316306001600160a01b03167fb97975ea9bf5ae2173b9ea765214622396032aba11cd5cc1450c760ac80d059a43856040516117ef9291906159c0565b6025546001600160a01b03163314613af157600080fd5b6001600160a01b03811660009081526018602052604090205460ff1615613b2a5760405162461bcd60e51b815260040161122590615761565b6001600160a01b038116600081815260186020526040808220805460ff191660019081179091556024805491820181559092527f7cd332d19b93bcabe3cce7ca0c18a052f57e5fd03b4758a09f30f5ddc4b22ec490910180546001600160a01b03191683179055517f3d9884fbd11fce9188657c4bcfda7491d3316ce97bd234d981b7be1f012a852f90612db290439033906159a9565b600c5481565b6025546001600160a01b03163314613bde57600080fd5b602754611687906001600160a01b0316826145d8565b6025546001600160a01b03163314613c0b57600080fd5b6001600160a01b038216600090815260126020526040902054613c2e90826142f0565b6001600160a01b038316600090815260126020526040902055601354613c5490826142f0565b6013556001600160a01b03808316600090815260036020526040812054613c7d921690836149c7565b5050565b60166020526000908152604090205481565b6001600160a01b03871660009081526008602090815260408083208054600181019091559051613cee927f5fae9ec55a1e547936e0e74d606b44cd5f912f9adcd0bba561fea62d570259e9928c928c928c92918c91016152c5565b60405160208183030381529060405280519060200120905060007f000000000000000000000000000000000000000000000000000000000000000082604051602001613d3b9291906151de565b604051602081830303815290604052805190602001209050600060018287878760405160008152602001604052604051613d78949392919061531d565b6020604051602081039080840390855afa158015613d9a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116613dcd5760405162461bcd60e51b8152600401611225906157e8565b896001600160a01b0316816001600160a01b031614613dfe5760405162461bcd60e51b8152600401611225906155e4565b86421115613e1e5760405162461bcd60e51b815260040161122590615486565b6001600160a01b03808b166000818152600660209081526040808320948e1680845294909152908190208b9055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590613e79908c906152bc565b60405180910390a350505050505050505050565b60126020526000908152604090205481565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b6025546001600160a01b03163314613ee157600080fd5b613eeb82306143a0565b6001600160a01b038216600090815260126020526040902054613f0e908261418b565b6001600160a01b038316600090815260126020526040902055601354613f34908261418b565b6013556001600160a01b03808316600090815260036020526040812054613c7d9216836149c7565b601060209081526000928352604080842090915290825290205481565b601a60209081526000938452604080852082529284528284209052825290205481565b60146020526000908152604090205481565b7f1ac861a6a8532f3704e1768564a53a32774f00d6cf20ccbbdf60ab61378302bc81565b60286020526000908152604090205460ff1681565b61271081565b6025546001600160a01b0316331461400457600080fd5b602780546001600160a01b0319166001600160a01b0392909216919091179055565b60046020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b6026546001600160a01b031681565b6001546001600160a01b031681565b60216020526000908152604090205460ff1681565b3360008181526022602090815260408083206001600160a01b038881168086529184528285209088168086529352818420805460ff19168715151790559051929390927f94b7929e43e6508db4db6437b7af23083fd8429704c427e0617884fd8fb23a92906140f69087906152b1565b60405180910390a45060019392505050565b601e60209081526000938452604080852082529284528284209052825290205481565b60606029805480602002602001604051908101604052809291908181526020018280548015612760576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311612742575050505050905090565b60008282018381101561376a5760405162461bcd60e51b8152600401611225906156af565b6000826141bf575060006111ab565b828202828482816141cc57fe5b041461376a5760405162461bcd60e51b815260040161122590615612565b600061376a8383604051806040016040528060068152602001656469763a202f60d01b815250614b45565b6001600160a01b03821661423b5760405162461bcd60e51b815260040161122590615509565b60408051808201825260168152755f6275726e3a20657863656564732062616c616e636560501b6020808301919091526001600160a01b03851660009081526007909152919091205461428f918390614456565b6001600160a01b0383166000908152600760205260409020556002546142b590826142f0565b6002556040516000906001600160a01b03841690600080516020615a69833981519152906142e49085906152bc565b60405180910390a35050565b600061376a8383604051806040016040528060068152602001657375623a202d60d01b815250614456565b6001600160a01b038116600090815260146020526040902054611687576001600160a01b03166000818152601460209081526040808320429081905560238054600181019091557fd57b2b5166478fd4318d2acc6cc2c704584312bdd8781b32d5d06abda57f42300180546001600160a01b0319169095179094556016909152902055565b6001600160a01b03808316600090815260208080526040808320805460ff1916600117905560108252808320938516835292905220546143e39082908490614933565b6001600160a01b0380831660008181526010602090815260408083209486168084529482528083208390558383526011825280832094835293905282902054915190917f3d19c3fddbd0aeb7831c8a9983375778d0d4ec45185720eae1475d6a0647eb6e9161369d9143914291906159ce565b6000818484111561447a5760405162461bcd60e51b8152600401611225919061533b565b505050900390565b6001600160a01b0383166144a85760405162461bcd60e51b81526004016112259061591e565b6001600160a01b0382166144ce5760405162461bcd60e51b81526004016112259061591e565b60408051808201825260208082527f5f7472616e73666572546f6b656e733a20657863656564732062616c616e6365818301526001600160a01b038616600090815260079091529190912054614525918390614456565b6001600160a01b0380851660009081526007602081815260408084209590955584518086018652601a81527f5f7472616e73666572546f6b656e733a206f766572666c6f777300000000000081830152938716835252919091205461458b918390614b7c565b6001600160a01b038084166000818152600760205260409081902093909355915190851690600080516020615a69833981519152906145cb9085906152bc565b60405180910390a3505050565b6027546001600160a01b03166000908152600760205260409020548111156146125760405162461bcd60e51b81526004016112259061539e565b6001600160a01b038216600090815260076020526040902054614635908261418b565b6001600160a01b03808416600090815260076020526040808220939093556027549091168152205461466790826142f0565b602780546001600160a01b039081166000908152600760205260409081902093909355905491518482169290911690600080516020615a69833981519152906142e49085906152bc565b6001600160a01b03821660009081526011602090815260408083203084529091529020546146df908261418b565b6001600160a01b0383166000908152601160209081526040808320308452909152902055601354614710908261418b565b6013556001600160a01b038083166000908152600360205260408120546147389216836149c7565b816001600160a01b0316336001600160a01b0316600080516020615a69833981519152836040516142e491906152bc565b6147bf8363a9059cbb60e01b848460405160240161478892919061524b565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614bac565b505050565b6147e5846323b872dd60e01b85858560405160240161478893929190615227565b50505050565b6001600160a01b038083166000818152600360209081526040808320546011835281842030855283528184205494845260129092528220549316929091614832919061418b565b6001600160a01b0385811660008181526003602052604080822080546001600160a01b031916898616908117909155905194955093928616927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46147e58284836149c7565b6001600160a01b038083166000908152601160209081526040808320938716835292905220546148ca90826142f0565b6001600160a01b038084166000908152601160209081526040808320938816808452939091529020919091553014156147bf5760135461490a90826142f0565b6013556001600160a01b038083166000908152600360205260408120546147bf921690836149c7565b6001600160a01b03808316600090815260116020908152604080832093871683529290522054614963908261418b565b6001600160a01b038084166000908152601160209081526040808320938816808452939091529020919091553014156147bf576013546149a3908261418b565b6013556001600160a01b038083166000908152600360205260408120546147bf9216835b816001600160a01b0316836001600160a01b0316141580156149e95750600081115b156147bf576001600160a01b03831615614ab4576001600160a01b03831660009081526005602052604081205463ffffffff169081614a29576000614a5b565b6001600160a01b038516600090815260046020908152604080832063ffffffff60001987011684529091529020600101545b90506000614aa284604051806040016040528060168152602001755f6d6f7665566f7465733a20756e646572666c6f777360501b815250846144569092919063ffffffff16565b9050614ab086848484614c91565b5050505b6001600160a01b038216156147bf576001600160a01b03821660009081526005602052604081205463ffffffff169081614aef576000614b21565b6001600160a01b038416600090815260046020908152604080832063ffffffff60001987011684529091529020600101545b90506000614b2f828561418b565b9050614b3d85848484614c91565b505050505050565b60008183614b665760405162461bcd60e51b8152600401611225919061533b565b506000838581614b7257fe5b0495945050505050565b60008383018285821015614ba35760405162461bcd60e51b8152600401611225919061533b565b50949350505050565b614bbe826001600160a01b0316614e13565b614bda5760405162461bcd60e51b815260040161122590615458565b60006060836001600160a01b031683604051614bf691906151c2565b6000604051808303816000865af19150503d8060008114614c33576040519150601f19603f3d011682016040523d82523d6000602084013e614c38565b606091505b509150915081614c5a5760405162461bcd60e51b8152600401611225906153f6565b8051156147e55780806020019051810190614c759190615176565b6147e55760405162461bcd60e51b815260040161122590615536565b6000614cd2436040518060400160405280601981526020017f5f7772697465436865636b706f696e743a203332206269747300000000000000815250614e4f565b905060008463ffffffff16118015614d1b57506001600160a01b038516600090815260046020908152604080832063ffffffff6000198901811685529252909120548282169116145b15614d58576001600160a01b038516600090815260046020908152604080832063ffffffff60001989011684529091529020600101829055614dc9565b60408051808201825263ffffffff808416825260208083018681526001600160a01b038a166000818152600484528681208b8616825284528681209551865490861663ffffffff19918216178755925160019687015590815260059092529390208054928801909116919092161790555b846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051614e049291906159c0565b60405180910390a25050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590614e4757508115155b949350505050565b6000816401000000008410614e775760405162461bcd60e51b8152600401611225919061533b565b509192915050565b604080518082019091526000808252602082015290565b803560ff811681146111ab57600080fd5b600060208284031215614eb8578081fd5b813561376a81615a45565b60008060408385031215614ed5578081fd5b8235614ee081615a45565b91506020830135614ef081615a45565b809150509250929050565b600080600060608486031215614f0f578081fd5b8335614f1a81615a45565b92506020840135614f2a81615a45565b91506040840135614f3a81615a45565b809150509250925092565b600080600060608486031215614f59578283fd5b8335614f6481615a45565b92506020840135614f7481615a45565b91506040840135614f3a81615a5a565b600080600060608486031215614f98578283fd5b8335614fa381615a45565b92506020840135614fb381615a45565b929592945050506040919091013590565b600080600080600060a08688031215614fdb578081fd5b8535614fe681615a45565b94506020860135614ff681615a45565b94979496505050506040830135926060810135926080909101359150565b600080600080600080600060e0888a03121561502e578182fd5b873561503981615a45565b9650602088013561504981615a45565b955060408801359450606088013593506150668960808a01614e96565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215615094578182fd5b823561509f81615a45565b946020939093013593505050565b600080600080608085870312156150c2578384fd5b84356150cd81615a45565b966020860135965060408601359560600135945092505050565b60008060008060008060c087890312156150ff578182fd5b863561510a81615a45565b955060208701359450604087013593506151278860608901614e96565b92506080870135915060a087013590509295509295509295565b60008060408385031215615153578182fd5b823561515e81615a45565b9150602083013563ffffffff81168114614ef0578182fd5b600060208284031215615187578081fd5b815161376a81615a5a565b6000602082840312156151a3578081fd5b5035919050565b6000602082840312156151bb578081fd5b5051919050565b600082516151d4818460208701615a19565b9190910192915050565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b818110156152a55783516001600160a01b031683529284019291840191600101615280565b50909695505050505050565b901515815260200190565b90815260200190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b9384526001600160a01b039290921660208401526040830152606082015260800190565b93845260ff9290921660208401526040830152606082015260800190565b600060208252825180602084015261535a816040850160208701615a19565b601f01601f19169190910160400192915050565b60208082526016908201527519195b1959d85d19509e54da59ce88195e1c1a5c995960521b604082015260600190565b60208082526019908201527f74726561737572793a20657863656564732062616c616e636500000000000000604082015260600190565b602080825260079082015266626f6e64696e6760c81b604082015260600190565b6020808252818101527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604082015260600190565b60208082526013908201527277697468647261773a20756e626f6e64696e6760681b604082015260600190565b60208082526014908201527314d85999515490cc8c0e880858dbdb9d1c9858dd60621b604082015260600190565b6020808252600f908201526e1c195c9b5a5d0e88195e1c1a5c9959608a1b604082015260600190565b60208082526012908201527164656c656761746542795369673a2073696760701b604082015260600190565b60208082526014908201527364656c656761746542795369673a206e6f6e636560601b604082015260600190565b6020808252601390820152725f6275726e3a207a65726f206164647265737360681b604082015260600190565b60208082526013908201527214d85999515490cc8c0e88085cdd58d8d95959606a1b604082015260600190565b60208082526017908201527f617070726f76654c69717569646974793a202170616972000000000000000000604082015260600190565b6020808252602a908201527f756e626f6e644c697175696469747946726f6d4a6f623a20696e73756666696360408201526969656e742066756e647360b01b606082015260800190565b6020808252601490820152731c195c9b5a5d0e881d5b985d5d1a1bdc9a5e995960621b604082015260600190565b60208082526006908201526536bab61d101560d11b604082015260600190565b60208082526013908201527230b232262599a921b932b234ba1d1010b537b160691b604082015260600190565b602080825260089082015267646973707574657360c01b604082015260600190565b60208082526014908201527372656d6f76654a6f623a20756e626f6e64696e6760601b604082015260600190565b6020808252600690820152656164643a202b60d01b604082015260600190565b6020808252601690820152751ddbdc9ad49958d95a5c1d0e881b585e081b1a5b5a5d60521b604082015260600190565b6020808252601d908201527f616363657074476f7665726e616e63653a202170656e64696e67476f76000000604082015260600190565b6020808252601190820152701c995b5bdd99529bd88e881d5b989bdb99607a1b604082015260600190565b60208082526011908201527030b2322537b11d103537b11035b737bbb760791b604082015260600190565b60208082526016908201527518dc99591a5d0e881c195b991a5b99c818dc99591a5d60521b604082015260600190565b60208082526012908201527130b23221b932b234ba22aa241d1010b537b160711b604082015260600190565b6020808252601190820152707065726d69743a207369676e617475726560781b604082015260600190565b6020808252600b908201526a189b1858dadb1a5cdd195960aa1b604082015260600190565b6020808252600f908201526e18dc99591a5d0e881b9bc8189bdb99608a1b604082015260600190565b60208082526018908201527f6164644c6971756964697479546f4a6f623a2021706169720000000000000000604082015260600190565b6020808252600d908201526c3932b1b2b4b83a1d1010b537b160991b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252600e908201526d33b2ba283934b7b92b37ba32b99d60911b604082015260600190565b6020808252601d908201527f5f7472616e73666572546f6b656e733a207a65726f2061646472657373000000604082015260600190565b6020808252601190820152703bb7b935a932b1b2b4b83a1d1010b537b160791b604082015260600190565b6020808252600f908201526e6372656469743a20626f6e64696e6760881b604082015260600190565b9182526001600160a01b0316602082015260400190565b918252602082015260400190565b9283526020830191909152604082015260600190565b63ffffffff91909116815260200190565b63ffffffff929092168252602082015260400190565b60ff91909116815260200190565b60005b83811015615a34578181015183820152602001615a1c565b838111156147e55750506000910152565b6001600160a01b038116811461168757600080fd5b801515811461168757600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef7472616e7366657246726f6d3a2065786365656473207370656e64657220616c6c6f77616e6365a26469706673582212207f0a09b5db53377fc3d552fce89dd72d48c63a7bbdbec497aa284add8299189164736f6c634300060c0033

Deployed Bytecode

0x6080604052600436106105595760003560e01c8063782d6fe1116102bd578063c3cda52011610180578063def70844116100e7578063f1127ed8116100a0578063f9f92be41161007a578063f9f92be414611093578063fe0f0d8c146110b3578063fede7008146110d3578063ffb0a4a0146110f357610559565b8063f1127ed81461103b578063f39c38a014611069578063f57cb3821461107e57610559565b8063def7084414610f91578063e326ac4314610fb1578063e7a324dc14610fd1578063eb421f3b14610fe6578063ec342ad014611006578063f0f442601461101b57610559565b8063d454019d11610139578063d454019d14610ed1578063d505accf14610ef1578063d8bff5a514610f11578063dd62ed3e14610f31578063de63298d14610f51578063deac354114610f7157610559565b8063c3cda52014610e1c578063c3fc0e1d14610e3c578063c5198abc14610e5c578063c57981b514610e7c578063ca1d209d14610e91578063ce6a088014610eb157610559565b80639e3369b611610224578063ab033ea9116101dd578063ab033ea914610d67578063b0103b1a14610d87578063b4b5ea5714610da7578063b600702a14610dc7578063bb49096d14610de7578063c1c1d21814610e0757610559565b80639e3369b614610ca7578063a39744b514610cc7578063a457f6fe14610ce7578063a515366a14610d07578063a5d059ca14610d27578063a9059cbb14610d4757610559565b806385f399661161027657806385f3996614610bf257806388b4ac8314610c125780638d9acd2e14610c32578063945dd26e14610c5257806395d89b4114610c725780639af7728414610c8757610559565b8063782d6fe114610b485780637ecebe0014610b685780638071198914610b88578063814ee60a14610ba85780638322fff214610bbd57806383baa69314610bd257610559565b80633d1f0bb911610420578063603b4d141161038757806368581ebd1161034057806370a082311161031a57806370a0823114610ac857806374a8f10314610ae857806375b12c1814610b085780637724ff6814610b2857610559565b806368581ebd14610a665780636dab5dcf14610a885780636fcfff4514610a9b57610559565b8063603b4d14146109bc578063603c6860146109d157806361d027b3146109f1578063637cd7f014610a0657806364bb43ee14610a2657806367da318414610a4657610559565b806351cff8d9116103d957806351cff8d91461090757806352a4de2914610927578063587cde1e146109475780635aa6e675146109675780635c19a95c1461097c5780635feeb7941461099c57610559565b80633d1f0bb91461085257806342966c68146108725780634395d8ba1461089257806344d96e95146108b25780634b3fde21146108c75780634f039447146108e757610559565b806320606b70116104c45780632fe23dbd1161047d5780632fe23dbd1461079b57806330adf81f146107bb578063313ce567146107d0578063357bf15c146107f257806337feca8414610812578063392c4c6c1461083257610559565b806320606b70146106f15780632119a62a14610706578063238efcbc1461072657806323b872dd1461073b5780632c8e7a211461075b5780632ec63d7c1461077b57610559565b806318160ddd1161051657806318160ddd146106475780631992d2061461065c5780631b44555e1461067c5780631b7a1fb21461069c5780631c5a9d9c146106bc5780631df0de13146106dc57610559565b806302175fa41461055e57806306fdde0314610580578063095ea7b3146105ab5780630c33c522146105d85780631101eb41146106055780631778e29c14610625575b600080fd5b34801561056a57600080fd5b5061057e610579366004615192565b611108565b005b34801561058c57600080fd5b50610595611124565b6040516105a2919061533b565b60405180910390f35b3480156105b757600080fd5b506105cb6105c6366004615082565b611146565b6040516105a291906152b1565b3480156105e457600080fd5b506105f86105f3366004615192565b6111b1565b6040516105a291906151f9565b34801561061157600080fd5b5061057e610620366004614f84565b6111d8565b34801561063157600080fd5b5061063a61154f565b6040516105a291906152bc565b34801561065357600080fd5b5061063a611573565b34801561066857600080fd5b5061063a610677366004614efb565b611579565b34801561068857600080fd5b5061063a610697366004614ea7565b61159c565b3480156106a857600080fd5b506105f86106b7366004615192565b6115ae565b3480156106c857600080fd5b5061057e6106d7366004614ea7565b6115bb565b3480156106e857600080fd5b5061063a61168a565b3480156106fd57600080fd5b5061063a611690565b34801561071257600080fd5b5061057e610721366004615082565b6116b4565b34801561073257600080fd5b5061057e6117fb565b34801561074757600080fd5b506105cb610756366004614f84565b611849565b34801561076757600080fd5b506105cb610776366004614ea7565b611930565b34801561078757600080fd5b506105cb610796366004614ea7565b611944565b3480156107a757600080fd5b5061057e6107b6366004615192565b611968565b3480156107c757600080fd5b5061063a611984565b3480156107dc57600080fd5b506107e56119a8565b6040516105a29190615a0b565b3480156107fe57600080fd5b5061057e61080d366004615192565b6119ad565b34801561081e57600080fd5b5061063a61082d366004614ec3565b6119c9565b34801561083e57600080fd5b506105cb61084d3660046150ad565b6119e6565b34801561085e57600080fd5b506105cb61086d366004614ea7565b611aa7565b34801561087e57600080fd5b5061057e61088d366004615192565b611abc565b34801561089e57600080fd5b5061057e6108ad366004614efb565b611ac6565b3480156108be57600080fd5b5061063a611da4565b3480156108d357600080fd5b5061057e6108e2366004615082565b611daa565b3480156108f357600080fd5b5061057e610902366004615192565b611f8e565b34801561091357600080fd5b5061057e610922366004614ea7565b611faa565b34801561093357600080fd5b5061057e610942366004614f84565b612185565b34801561095357600080fd5b506105f8610962366004614ea7565b6123ff565b34801561097357600080fd5b506105f861241a565b34801561098857600080fd5b5061057e610997366004614ea7565b612429565b3480156109a857600080fd5b5061057e6109b7366004614ea7565b612433565b3480156109c857600080fd5b5061063a6124c3565b3480156109dd57600080fd5b5061057e6109ec366004614ec3565b6124c9565b3480156109fd57600080fd5b506105f8612687565b348015610a1257600080fd5b5061063a610a21366004614ec3565b612696565b348015610a3257600080fd5b5061057e610a41366004614ea7565b6126b3565b348015610a5257600080fd5b5061063a610a61366004614ec3565b6126eb565b348015610a7257600080fd5b50610a7b612708565b6040516105a29190615264565b61057e610a96366004614ea7565b61276a565b348015610aa757600080fd5b50610abb610ab6366004614ea7565b6128a5565b6040516105a291906159e4565b348015610ad457600080fd5b5061063a610ae3366004614ea7565b6128bd565b348015610af457600080fd5b5061057e610b03366004614ea7565b6128d8565b348015610b1457600080fd5b5061057e610b23366004614efb565b612995565b348015610b3457600080fd5b5061063a610b43366004614ea7565b612b3c565b348015610b5457600080fd5b5061063a610b63366004615082565b612b4e565b348015610b7457600080fd5b5061063a610b83366004614ea7565b612d37565b348015610b9457600080fd5b5061057e610ba3366004614ea7565b612d49565b348015610bb457600080fd5b50610a7b612dbd565b348015610bc957600080fd5b506105f8612e1d565b348015610bde57600080fd5b5061063a610bed366004614efb565b612e22565b348015610bfe57600080fd5b5061057e610c0d366004614ea7565b612e45565b348015610c1e57600080fd5b5061057e610c2d366004614f84565b612ed5565b348015610c3e57600080fd5b5061057e610c4d366004614f84565b61314a565b348015610c5e57600080fd5b5061057e610c6d366004614ea7565b61326f565b348015610c7e57600080fd5b506105956132a8565b348015610c9357600080fd5b5061063a610ca2366004614ec3565b6132c8565b348015610cb357600080fd5b506105cb610cc2366004614fc4565b6132e5565b348015610cd357600080fd5b5061063a610ce2366004614ec3565b613395565b348015610cf357600080fd5b506105f8610d02366004615192565b6133b2565b348015610d1357600080fd5b5061057e610d22366004615082565b6133bf565b348015610d3357600080fd5b5061057e610d42366004615082565b6135cd565b348015610d5357600080fd5b506105cb610d62366004615082565b6136a9565b348015610d7357600080fd5b5061057e610d82366004614ea7565b6136bf565b348015610d9357600080fd5b506105cb610da2366004614ea7565b6136f8565b348015610db357600080fd5b5061063a610dc2366004614ea7565b61370d565b348015610dd357600080fd5b5061057e610de2366004614ea7565b613771565b348015610df357600080fd5b5061063a610e02366004614efb565b613827565b348015610e1357600080fd5b5061063a61384a565b348015610e2857600080fd5b5061057e610e373660046150e7565b613850565b348015610e4857600080fd5b5061057e610e57366004615082565b6139dc565b348015610e6857600080fd5b5061057e610e77366004614ea7565b613ada565b348015610e8857600080fd5b5061063a613bc1565b348015610e9d57600080fd5b5061057e610eac366004615192565b613bc7565b348015610ebd57600080fd5b5061057e610ecc366004615082565b613bf4565b348015610edd57600080fd5b5061063a610eec366004614ea7565b613c81565b348015610efd57600080fd5b5061057e610f0c366004615014565b613c93565b348015610f1d57600080fd5b5061063a610f2c366004614ea7565b613e8d565b348015610f3d57600080fd5b5061063a610f4c366004614ec3565b613e9f565b348015610f5d57600080fd5b5061057e610f6c366004615082565b613eca565b348015610f7d57600080fd5b5061063a610f8c366004614ec3565b613f5c565b348015610f9d57600080fd5b5061063a610fac366004614efb565b613f79565b348015610fbd57600080fd5b5061063a610fcc366004614ea7565b613f9c565b348015610fdd57600080fd5b5061063a613fae565b348015610ff257600080fd5b506105cb611001366004614ea7565b613fd2565b34801561101257600080fd5b5061063a613fe7565b34801561102757600080fd5b5061057e611036366004614ea7565b613fed565b34801561104757600080fd5b5061105b611056366004615141565b614026565b6040516105a29291906159f5565b34801561107557600080fd5b506105f8614053565b34801561108a57600080fd5b506105f8614062565b34801561109f57600080fd5b506105cb6110ae366004614ea7565b614071565b3480156110bf57600080fd5b506105cb6110ce366004614f45565b614086565b3480156110df57600080fd5b5061063a6110ee366004614efb565b614108565b3480156110ff57600080fd5b50610a7b61412b565b6025546001600160a01b0316331461111f57600080fd5b600955565b604051806040016040528060068152602001652637b1b599b960d11b81525081565b3360008181526006602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061119f9086906152bc565b60405180910390a35060015b92915050565b602481815481106111be57fe5b6000918252602090912001546001600160a01b0316905081565b336000908152601f602090815260408083206001600160a01b03878116855290835281842090861684529091529020541561122e5760405162461bcd60e51b81526004016112259061578c565b60405180910390fd5b336000818152601b602090815260408083206001600160a01b03888116808652918452828520908816808652908452828520429055948452601c835281842090845282528083209383529290522054611287908261418b565b336000818152601c602090815260408083206001600160a01b03898116808652918452828520908916808652818552838620889055958552601a84528285209185529083528184209484529382529091205491905210156112fa5760405162461bcd60e51b81526004016112259061559a565b60405163cbc3ab5360e01b81526000907306dec17b57c15446578efdce3380de3433f44da49063cbc3ab5390611336908790309060040161520d565b60206040518083038186803b15801561134e57600080fd5b505af4158015611362573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138691906151aa565b9050600061140e856001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156113c657600080fd5b505afa1580156113da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113fe91906151aa565b61140884866141b0565b906141ea565b6001600160a01b0385166000908152601960209081526040808320308452909152902054909150811115611494576001600160a01b03841660009081526019602090815260408083203080855292529091205461146b9190614215565b6001600160a01b03841660009081526019602090815260408083203084529091528120556114f1565b61149e3082614215565b6001600160a01b03841660009081526019602090815260408083203084529091529020546114cc90826142f0565b6001600160a01b03851660009081526019602090815260408083203084529091529020555b336001600160a01b0316856001600160a01b0316856001600160a01b03167f6d962fe34dd0cf9a9df3e12a7b8ddfe5f790b3f11668553455d7b52db70a07be43876040516115409291906159c0565b60405180910390a45050505050565b7f5a3dfca44a313ca16dddc0070662dd642da082c35477329ae406fa2ef181963881565b60025481565b601f60209081526000938452604080852082529284528284209052825290205481565b60176020526000908152604090205481565b602981815481106111be57fe5b3360009081526021602052604090205460ff16156115eb5760405162461bcd60e51b815260040161122590615813565b336000908152600d602090815260408083206001600160a01b0385168452909152902054158015906116585750600954336000908152600d602090815260408083206001600160a01b038616845290915281205490916116559161164e9161418b565b42906142f0565b10155b6116745760405162461bcd60e51b8152600401611225906153d5565b61167d3361431b565b61168733826143a0565b50565b600b5481565b7f797cfab58fcb15f590eb8e4252d5c228ff88f94f907e119e80c4393a946e8f3581565b3360009081526018602052604090205460ff166116e35760405162461bcd60e51b815260040161122590615898565b604080518082018252601d81527f776f726b526563656970743a20696e7375666669656e742066756e647300000060208083019190915233600090815260198252838120600e8252909152919091205461173e918390614456565b336000908152601960209081526040808320600e84528252808320939093556001600160a01b0385168083526016909152828220429055915183156108fc0291849190818181858888f1935050505015801561179e573d6000803e3d6000fd5b50816001600160a01b0316336001600160a01b0316600e6001600160a01b03167f7d3fc7e21dbdbae0ba4917fc7f31b9a0e31bc627c1dfa1b6638af5e4ede319e443856040516117ef9291906159c0565b60405180910390a45050565b6026546001600160a01b031633146118255760405162461bcd60e51b8152600401611225906156ff565b602654602580546001600160a01b0319166001600160a01b03909216919091179055565b6001600160a01b03831660008181526006602090815260408083203380855292528220549192909190821480159061188357506000198114155b156119195760006118af85604051806060016040528060278152602001615a8960279139849190614456565b6001600160a01b03808916600081815260066020908152604080832094891680845294909152908190208490555192935090917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061190f9085906152bc565b60405180910390a3505b611924868686614482565b50600195945050505050565b602080526000908152604090205460ff1681565b60005a602a55506001600160a01b0316600090815260208052604090205460ff1690565b6025546001600160a01b0316331461197f57600080fd5b600b55565b7f5fae9ec55a1e547936e0e74d606b44cd5f912f9adcd0bba561fea62d570259e981565b601281565b6025546001600160a01b031633146119c457600080fd5b600c55565b600d60209081526000928352604080842090915290825290205481565b60005a602a556001600160a01b038516600090815260208052604090205460ff168015611a4a57506001600160a01b03851660009081526012602090815260408083205460118352818420308552909252909120548591611a47919061418b565b10155b8015611a6e57506001600160a01b0385166000908152601760205260409020548311155b8015611a9e57506001600160a01b0385166000908152601460205260409020548290611a9b9042906142f0565b10155b95945050505050565b60186020526000908152604090205460ff1681565b6116873382614215565b6001600160a01b03821660009081526028602052604090205460ff16611afe5760405162461bcd60e51b815260040161122590615861565b6001600160a01b038084166000908152601e602090815260408083208685168452825280832093851683529290522054611b4a5760405162461bcd60e51b815260040161122590615838565b600b546001600160a01b038085166000908152601e60209081526040808320878516845282528083209386168352929052908120549091611b8e9161164e9161418b565b1015611bac5760405162461bcd60e51b815260040161122590615980565b60405163cbc3ab5360e01b81526000907306dec17b57c15446578efdce3380de3433f44da49063cbc3ab5390611be8908690309060040161520d565b60206040518083038186803b158015611c0057600080fd5b505af4158015611c14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c3891906151aa565b90506000611ceb846001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611c7857600080fd5b505afa158015611c8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb091906151aa565b6001600160a01b038088166000908152601f602090815260408083208a851684528252808320938916835292905220546114089085906141b0565b9050611cf730826145d8565b6001600160a01b0383166000908152601960209081526040808320308452909152902054611d25908261418b565b6001600160a01b038085166000818152601960209081526040808320308452825280832095909555898416808352601f8252858320948a168084529482528583208484529091528482209190915592517fa90666688fb32254f45a367c38fbcd5f2664432b061a4354d9d3c9a7abcbec5b9061154090439087906159c0565b60135481565b3360009081526018602052604090205460ff16611dd95760405162461bcd60e51b815260040161122590615955565b6001546001600160a01b031663525ea631611df75a602a54906142f0565b6040518263ffffffff1660e01b8152600401611e1391906152bc565b60206040518083038186803b158015611e2b57600080fd5b505afa158015611e3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6391906151aa565b811115611e825760405162461bcd60e51b8152600401611225906156cf565b604080518082018252601d81527f776f726b526563656970743a20696e7375666669656e742066756e6473000000602080830191909152336000908152601982528381203082529091529190912054611edc918390614456565b3360009081526019602090815260408083203084528252808320939093556001600160a01b03851682526016905220429055611f1882826146b1565b6001600160a01b038216600090815260176020526040902054611f3b908261418b565b6001600160a01b03831660008181526017602052604090819020929092559051339030907f7d3fc7e21dbdbae0ba4917fc7f31b9a0e31bc627c1dfa1b6638af5e4ede319e4906117ef90439087906159c0565b6025546001600160a01b03163314611fa557600080fd5b600a55565b60026000541415611fcd5760405162461bcd60e51b8152600401611225906158bf565b60026000908155338152600e602090815260408083206001600160a01b0385168452909152902054158015906120375750600a54336000908152600e602090815260408083206001600160a01b038616845290915281205490916120349161164e9161418b565b10155b6120535760405162461bcd60e51b81526004016112259061542b565b3360009081526015602052604090205460ff16156120835760405162461bcd60e51b81526004016112259061565f565b6001600160a01b0381163014156120c857336000818152600f602090815260408083206001600160a01b03861684529091529020546120c3913091614482565b6120f7565b336000818152600f602090815260408083206001600160a01b0386168085529252909120546120f79290614769565b336000818152600f602090815260408083206001600160a01b0386168452909152908190205490517fbac746a470313079568cd81c87546028484b062a3909acd207dfb77bdb8554e59161214e91439142916159ce565b60405180910390a2336000908152600f602090815260408083206001600160a01b0394909416835292905290812081905560019055565b600260005414156121a85760405162461bcd60e51b8152600401611225906158bf565b600260009081556001600160a01b03841681526028602052604090205460ff166121e45760405162461bcd60e51b815260040161122590615861565b6121f96001600160a01b0384163330846147c4565b336000908152601a602090815260408083206001600160a01b0387811685529083528184209086168452909152902054612233908261418b565b336000818152601a602090815260408083206001600160a01b0389811680865291845282852090891680865290845282852096909655848452601e835281842081855283528184208685528352818420429055938352601f8252808320938352928152828220938252929092529020546122ad908261418b565b336000908152601f602090815260408083206001600160a01b038881168552908352818420908716845282528083209390935560189052205460ff1615801561231b5750600a546001600160a01b0383166000908152601d60205260409020544291612319919061418b565b105b1561239e5760255460405163dc380cbb60e01b81526001600160a01b039091169063dc380cbb906123509085906004016151f9565b600060405180830381600087803b15801561236a57600080fd5b505af115801561237e573d6000803e3d6000fd5b5050506001600160a01b0383166000908152601d60205260409020429055505b336001600160a01b0316836001600160a01b0316836001600160a01b03167fe1cb44a16adbd63a44f65c279b23b8f447b2c6e120a2bc7f004758b446e05ed143856040516123ed9291906159c0565b60405180910390a45050600160005550565b6003602052600090815260409020546001600160a01b031681565b6025546001600160a01b031681565b61168733826147eb565b6001546116879082906001600160a01b031663525ea6316124575a602a54906142f0565b6040518263ffffffff1660e01b815260040161247391906152bc565b60206040518083038186803b15801561248b57600080fd5b505afa15801561249f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e291906151aa565b600a5481565b336000908152601b602090815260408083206001600160a01b03868116855290835281842090851684529091529020546125155760405162461bcd60e51b815260040161122590615736565b600a54336000908152601b602090815260408083206001600160a01b038781168552908352818420908616845290915281205490916125579161164e9161418b565b10156125755760405162461bcd60e51b815260040161122590615681565b336000818152601c602090815260408083206001600160a01b0387811680865291845282852090871680865290845282852054958552601a84528285209185529083528184209084529091529020546125ce90826142f0565b336000818152601a602090815260408083206001600160a01b0389811680865291845282852090891680865290845282852096909655848452601c835281842081855283528184209584529490915281205561262b919083614769565b336001600160a01b0316836001600160a01b0316836001600160a01b03167fb69fc9f6d19ed402461251491f86c736bfcbe966e9584d3fb8a0057b313b6920438560405161267a9291906159c0565b60405180910390a4505050565b6027546001600160a01b031681565b601960209081526000928352604080842090915290825290205481565b6025546001600160a01b031633146126ca57600080fd5b6001600160a01b03166000908152602860205260409020805460ff19169055565b600f60209081526000928352604080842090915290825290205481565b6060602480548060200260200160405190810160405280929190818152602001828054801561276057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612742575b5050505050905090565b6001600160a01b03811660009081526018602052604090205460ff166127a25760405162461bcd60e51b8152600401611225906157bc565b60006127bf612710611408600c54346141b090919063ffffffff16565b90506127f96127ce34836142f0565b6001600160a01b0384166000908152601960209081526040808320600e84529091529020549061418b565b6001600160a01b038084166000908152601960209081526040808320600e8452909152808220939093556025549251929091169183156108fc0291849190818181858888f19350505050158015612854573d6000803e3d6000fd5b50336001600160a01b0316826001600160a01b0316600e6001600160a01b03167fb97975ea9bf5ae2173b9ea765214622396032aba11cd5cc1450c760ac80d059a43346040516117ef9291906159c0565b60056020526000908152604090205463ffffffff1681565b6001600160a01b031660009081526007602052604090205490565b6025546001600160a01b031633146128ef57600080fd5b6001600160a01b03808216600090815260208080526040808320805460ff199081169091556021835281842080549091166001179055602554601183528184203080865293529281902054905163e74f823960e01b8152929093169263e74f82399261296092918691600401615227565b600060405180830381600087803b15801561297a57600080fd5b505af115801561298e573d6000803e3d6000fd5b5050505050565b61299e82611944565b6129a757600080fd5b336001600160a01b03831614806129eb57506001600160a01b03808316600090815260226020908152604080832033845282528083209387168352929052205460ff165b6129f457600080fd5b6001600160a01b038083166000908152600d602090815260408083209387168352929052205415801590612a6057506009546001600160a01b038084166000908152600d602090815260408083209388168352929052908120549091612a5d9161164e9161418b565b10155b612a6957600080fd5b612a728161431b565b6001600160a01b03808316600081815260208080526040808320805460ff1990811690915586861684528184208054909116600117905592825260118152828220938716825292909252902054612aca84848361489a565b612ad5848383614933565b6001600160a01b03808416600081815260226020908152604080832033845282528083208986168085529252808320805460ff19169055519093861692917f2d741352ba12ee72af4a9a3e3b3876daf926254d82fad9ea2bb18e87ea30b72791a450505050565b601d6020526000908152604090205481565b6000438210612b6f5760405162461bcd60e51b8152600401611225906158f6565b6001600160a01b03831660009081526005602052604090205463ffffffff1680612b9d5760009150506111ab565b6001600160a01b038416600090815260046020908152604080832063ffffffff600019860181168552925290912054168310612c0c576001600160a01b03841660009081526004602090815260408083206000199490940163ffffffff168352929052206001015490506111ab565b6001600160a01b038416600090815260046020908152604080832083805290915290205463ffffffff16831015612c475760009150506111ab565b600060001982015b8163ffffffff168163ffffffff161115612d0057600282820363ffffffff16048103612c79614e7f565b506001600160a01b038716600090815260046020908152604080832063ffffffff808616855290835292819020815180830190925280549093168082526001909301549181019190915290871415612cdb576020015194506111ab9350505050565b805163ffffffff16871115612cf257819350612cf9565b6001820392505b5050612c4f565b506001600160a01b038516600090815260046020908152604080832063ffffffff9094168352929052206001015491505092915050565b60086020526000908152604090205481565b6025546001600160a01b03163314612d6057600080fd5b6001600160a01b03811660008181526018602052604090819020805460ff19169055517f2ca18fdfae50f1042480d285d21f6706aa6abbd567d60a044b5bec07ccfee64890612db290439033906159a9565b60405180910390a250565b60606023805480602002602001604051908101604052809291908181526020018280548015612760576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311612742575050505050905090565b600e81565b601c60209081526000938452604080852082529284528284209052825290205481565b6001546116879082906001600160a01b031663525ea631612e695a602a54906142f0565b6040518263ffffffff1660e01b8152600401612e8591906152bc565b60206040518083038186803b158015612e9d57600080fd5b505afa158015612eb1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072191906151aa565b60026000541415612ef85760405162461bcd60e51b8152600401611225906158bf565b600260009081556001600160a01b03831681526018602052604090205460ff16612f345760405162461bcd60e51b8152600401611225906157bc565b6040516370a0823160e01b81526000906001600160a01b038516906370a0823190612f639030906004016151f9565b60206040518083038186803b158015612f7b57600080fd5b505afa158015612f8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fb391906151aa565b9050612fca6001600160a01b0385163330856147c4565b600061305282866001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401612ffc91906151f9565b60206040518083038186803b15801561301457600080fd5b505afa158015613028573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061304c91906151aa565b906142f0565b90506000613071612710611408600c54856141b090919063ffffffff16565b90506130ac61308083836142f0565b6001600160a01b038088166000908152601960209081526040808320938c16835292905220549061418b565b6001600160a01b0380871660009081526019602090815260408083208b85168085529252909120929092556025546130e692911683614769565b336001600160a01b0316856001600160a01b0316876001600160a01b03167fb97975ea9bf5ae2173b9ea765214622396032aba11cd5cc1450c760ac80d059a43866040516131359291906159c0565b60405180910390a45050600160005550505050565b3360009081526018602052604090205460ff166131795760405162461bcd60e51b815260040161122590615898565b604080518082018252601d81527f776f726b526563656970743a20696e7375666669656e742066756e6473000000602080830191909152336000908152601982528381206001600160a01b038816825290915291909120546131dc918390614456565b3360009081526019602090815260408083206001600160a01b0388811680865291845282852095909555938616835260169091529020429055613220908383614769565b816001600160a01b0316336001600160a01b0316846001600160a01b03167f7d3fc7e21dbdbae0ba4917fc7f31b9a0e31bc627c1dfa1b6638af5e4ede319e4438560405161267a9291906159c0565b6025546001600160a01b0316331461328657600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60405180604001604052806004815260200163262599a960e11b81525081565b600e60209081526000928352604080842090915290825290205481565b60005a602a556001600160a01b038616600090815260208052604090205460ff16801561333757506001600160a01b038087166000908152601160209081526040808320938916835292905220548411155b801561335b57506001600160a01b0386166000908152601760205260409020548311155b801561338b57506001600160a01b03861660009081526014602052604090205482906133889042906142f0565b10155b9695505050505050565b601160209081526000928352604080842090915290825290205481565b602381815481106111be57fe5b600260005414156133e25760405162461bcd60e51b8152600401611225906158bf565b600260009081553381526021602052604090205460ff16156134165760405162461bcd60e51b815260040161122590615813565b336000908152600d602090815260408083206001600160a01b03861680855292529091204290553014156134545761344f333083614482565b61351e565b6040516370a0823160e01b81526000906001600160a01b038416906370a08231906134839030906004016151f9565b60206040518083038186803b15801561349b57600080fd5b505afa1580156134af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134d391906151aa565b90506134ea6001600160a01b0384163330856147c4565b61351a81846001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401612ffc91906151f9565b9150505b3360009081526010602090815260408083206001600160a01b038616845290915290205461354c908261418b565b3360008181526010602090815260408083206001600160a01b03881680855290835281842095909555838352600d825280832094835293905282902054915190917ff70597a6fefc4f533a2329cb1dce863f3661a889db77d6ded02cedeca504ba56916135bc91439186906159ce565b60405180910390a250506001600055565b336000818152600e602090815260408083206001600160a01b038716845290915290204290556135ff9083908361489a565b336000908152600f602090815260408083206001600160a01b038616845290915290205461362d908261418b565b336000818152600f602090815260408083206001600160a01b03881680855290835281842095909555838352600e825280832094835293905282902054915190917f565117769b73385ad12786409df21084e3cc400c84936d78734fda9fd499b23e9161369d91439186906159ce565b60405180910390a25050565b60006136b6338484614482565b50600192915050565b6025546001600160a01b031633146136d657600080fd5b602680546001600160a01b0319166001600160a01b0392909216919091179055565b60156020526000908152604090205460ff1681565b6001600160a01b03811660009081526005602052604081205463ffffffff168061373857600061376a565b6001600160a01b038316600090815260046020908152604080832063ffffffff60001986011684529091529020600101545b9392505050565b6025546001600160a01b0316331461378857600080fd5b6001600160a01b03811660009081526028602052604090205460ff16156137c15760405162461bcd60e51b815260040161122590615563565b6001600160a01b03166000818152602860205260408120805460ff191660019081179091556029805491820181559091527fcb7c14ce178f56e2e8d86ab33ebc0ae081ba8556a00cd122038841867181caac0180546001600160a01b0319169091179055565b601b60209081526000938452604080852082529284528284209052825290205481565b60095481565b60007f1ac861a6a8532f3704e1768564a53a32774f00d6cf20ccbbdf60ab61378302bc87878760405160200161388994939291906152f9565b60405160208183030381529060405280519060200120905060007f5a3dfca44a313ca16dddc0070662dd642da082c35477329ae406fa2ef1819638826040516020016138d69291906151de565b604051602081830303815290604052805190602001209050600060018287878760405160008152602001604052604051613913949392919061531d565b6020604051602081039080840390855afa158015613935573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166139685760405162461bcd60e51b8152600401611225906154af565b6001600160a01b038116600090815260086020526040902080546001810190915588146139a75760405162461bcd60e51b8152600401611225906154db565b864211156139c75760405162461bcd60e51b81526004016112259061536e565b6139d1818a6147eb565b505050505050505050565b6025546001600160a01b031633146139f357600080fd5b6001600160a01b03821660009081526018602052604090205460ff16613a2b5760405162461bcd60e51b815260040161122590615632565b6001600160a01b0382166000908152601960209081526040808320308452909152902054613a59908261418b565b6001600160a01b038316600090815260196020908152604080832030808552925290912091909155613a8b90826145d8565b336001600160a01b0316826001600160a01b0316306001600160a01b03167fb97975ea9bf5ae2173b9ea765214622396032aba11cd5cc1450c760ac80d059a43856040516117ef9291906159c0565b6025546001600160a01b03163314613af157600080fd5b6001600160a01b03811660009081526018602052604090205460ff1615613b2a5760405162461bcd60e51b815260040161122590615761565b6001600160a01b038116600081815260186020526040808220805460ff191660019081179091556024805491820181559092527f7cd332d19b93bcabe3cce7ca0c18a052f57e5fd03b4758a09f30f5ddc4b22ec490910180546001600160a01b03191683179055517f3d9884fbd11fce9188657c4bcfda7491d3316ce97bd234d981b7be1f012a852f90612db290439033906159a9565b600c5481565b6025546001600160a01b03163314613bde57600080fd5b602754611687906001600160a01b0316826145d8565b6025546001600160a01b03163314613c0b57600080fd5b6001600160a01b038216600090815260126020526040902054613c2e90826142f0565b6001600160a01b038316600090815260126020526040902055601354613c5490826142f0565b6013556001600160a01b03808316600090815260036020526040812054613c7d921690836149c7565b5050565b60166020526000908152604090205481565b6001600160a01b03871660009081526008602090815260408083208054600181019091559051613cee927f5fae9ec55a1e547936e0e74d606b44cd5f912f9adcd0bba561fea62d570259e9928c928c928c92918c91016152c5565b60405160208183030381529060405280519060200120905060007f5a3dfca44a313ca16dddc0070662dd642da082c35477329ae406fa2ef181963882604051602001613d3b9291906151de565b604051602081830303815290604052805190602001209050600060018287878760405160008152602001604052604051613d78949392919061531d565b6020604051602081039080840390855afa158015613d9a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116613dcd5760405162461bcd60e51b8152600401611225906157e8565b896001600160a01b0316816001600160a01b031614613dfe5760405162461bcd60e51b8152600401611225906155e4565b86421115613e1e5760405162461bcd60e51b815260040161122590615486565b6001600160a01b03808b166000818152600660209081526040808320948e1680845294909152908190208b9055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590613e79908c906152bc565b60405180910390a350505050505050505050565b60126020526000908152604090205481565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b6025546001600160a01b03163314613ee157600080fd5b613eeb82306143a0565b6001600160a01b038216600090815260126020526040902054613f0e908261418b565b6001600160a01b038316600090815260126020526040902055601354613f34908261418b565b6013556001600160a01b03808316600090815260036020526040812054613c7d9216836149c7565b601060209081526000928352604080842090915290825290205481565b601a60209081526000938452604080852082529284528284209052825290205481565b60146020526000908152604090205481565b7f1ac861a6a8532f3704e1768564a53a32774f00d6cf20ccbbdf60ab61378302bc81565b60286020526000908152604090205460ff1681565b61271081565b6025546001600160a01b0316331461400457600080fd5b602780546001600160a01b0319166001600160a01b0392909216919091179055565b60046020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b6026546001600160a01b031681565b6001546001600160a01b031681565b60216020526000908152604090205460ff1681565b3360008181526022602090815260408083206001600160a01b038881168086529184528285209088168086529352818420805460ff19168715151790559051929390927f94b7929e43e6508db4db6437b7af23083fd8429704c427e0617884fd8fb23a92906140f69087906152b1565b60405180910390a45060019392505050565b601e60209081526000938452604080852082529284528284209052825290205481565b60606029805480602002602001604051908101604052809291908181526020018280548015612760576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311612742575050505050905090565b60008282018381101561376a5760405162461bcd60e51b8152600401611225906156af565b6000826141bf575060006111ab565b828202828482816141cc57fe5b041461376a5760405162461bcd60e51b815260040161122590615612565b600061376a8383604051806040016040528060068152602001656469763a202f60d01b815250614b45565b6001600160a01b03821661423b5760405162461bcd60e51b815260040161122590615509565b60408051808201825260168152755f6275726e3a20657863656564732062616c616e636560501b6020808301919091526001600160a01b03851660009081526007909152919091205461428f918390614456565b6001600160a01b0383166000908152600760205260409020556002546142b590826142f0565b6002556040516000906001600160a01b03841690600080516020615a69833981519152906142e49085906152bc565b60405180910390a35050565b600061376a8383604051806040016040528060068152602001657375623a202d60d01b815250614456565b6001600160a01b038116600090815260146020526040902054611687576001600160a01b03166000818152601460209081526040808320429081905560238054600181019091557fd57b2b5166478fd4318d2acc6cc2c704584312bdd8781b32d5d06abda57f42300180546001600160a01b0319169095179094556016909152902055565b6001600160a01b03808316600090815260208080526040808320805460ff1916600117905560108252808320938516835292905220546143e39082908490614933565b6001600160a01b0380831660008181526010602090815260408083209486168084529482528083208390558383526011825280832094835293905282902054915190917f3d19c3fddbd0aeb7831c8a9983375778d0d4ec45185720eae1475d6a0647eb6e9161369d9143914291906159ce565b6000818484111561447a5760405162461bcd60e51b8152600401611225919061533b565b505050900390565b6001600160a01b0383166144a85760405162461bcd60e51b81526004016112259061591e565b6001600160a01b0382166144ce5760405162461bcd60e51b81526004016112259061591e565b60408051808201825260208082527f5f7472616e73666572546f6b656e733a20657863656564732062616c616e6365818301526001600160a01b038616600090815260079091529190912054614525918390614456565b6001600160a01b0380851660009081526007602081815260408084209590955584518086018652601a81527f5f7472616e73666572546f6b656e733a206f766572666c6f777300000000000081830152938716835252919091205461458b918390614b7c565b6001600160a01b038084166000818152600760205260409081902093909355915190851690600080516020615a69833981519152906145cb9085906152bc565b60405180910390a3505050565b6027546001600160a01b03166000908152600760205260409020548111156146125760405162461bcd60e51b81526004016112259061539e565b6001600160a01b038216600090815260076020526040902054614635908261418b565b6001600160a01b03808416600090815260076020526040808220939093556027549091168152205461466790826142f0565b602780546001600160a01b039081166000908152600760205260409081902093909355905491518482169290911690600080516020615a69833981519152906142e49085906152bc565b6001600160a01b03821660009081526011602090815260408083203084529091529020546146df908261418b565b6001600160a01b0383166000908152601160209081526040808320308452909152902055601354614710908261418b565b6013556001600160a01b038083166000908152600360205260408120546147389216836149c7565b816001600160a01b0316336001600160a01b0316600080516020615a69833981519152836040516142e491906152bc565b6147bf8363a9059cbb60e01b848460405160240161478892919061524b565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614bac565b505050565b6147e5846323b872dd60e01b85858560405160240161478893929190615227565b50505050565b6001600160a01b038083166000818152600360209081526040808320546011835281842030855283528184205494845260129092528220549316929091614832919061418b565b6001600160a01b0385811660008181526003602052604080822080546001600160a01b031916898616908117909155905194955093928616927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46147e58284836149c7565b6001600160a01b038083166000908152601160209081526040808320938716835292905220546148ca90826142f0565b6001600160a01b038084166000908152601160209081526040808320938816808452939091529020919091553014156147bf5760135461490a90826142f0565b6013556001600160a01b038083166000908152600360205260408120546147bf921690836149c7565b6001600160a01b03808316600090815260116020908152604080832093871683529290522054614963908261418b565b6001600160a01b038084166000908152601160209081526040808320938816808452939091529020919091553014156147bf576013546149a3908261418b565b6013556001600160a01b038083166000908152600360205260408120546147bf9216835b816001600160a01b0316836001600160a01b0316141580156149e95750600081115b156147bf576001600160a01b03831615614ab4576001600160a01b03831660009081526005602052604081205463ffffffff169081614a29576000614a5b565b6001600160a01b038516600090815260046020908152604080832063ffffffff60001987011684529091529020600101545b90506000614aa284604051806040016040528060168152602001755f6d6f7665566f7465733a20756e646572666c6f777360501b815250846144569092919063ffffffff16565b9050614ab086848484614c91565b5050505b6001600160a01b038216156147bf576001600160a01b03821660009081526005602052604081205463ffffffff169081614aef576000614b21565b6001600160a01b038416600090815260046020908152604080832063ffffffff60001987011684529091529020600101545b90506000614b2f828561418b565b9050614b3d85848484614c91565b505050505050565b60008183614b665760405162461bcd60e51b8152600401611225919061533b565b506000838581614b7257fe5b0495945050505050565b60008383018285821015614ba35760405162461bcd60e51b8152600401611225919061533b565b50949350505050565b614bbe826001600160a01b0316614e13565b614bda5760405162461bcd60e51b815260040161122590615458565b60006060836001600160a01b031683604051614bf691906151c2565b6000604051808303816000865af19150503d8060008114614c33576040519150601f19603f3d011682016040523d82523d6000602084013e614c38565b606091505b509150915081614c5a5760405162461bcd60e51b8152600401611225906153f6565b8051156147e55780806020019051810190614c759190615176565b6147e55760405162461bcd60e51b815260040161122590615536565b6000614cd2436040518060400160405280601981526020017f5f7772697465436865636b706f696e743a203332206269747300000000000000815250614e4f565b905060008463ffffffff16118015614d1b57506001600160a01b038516600090815260046020908152604080832063ffffffff6000198901811685529252909120548282169116145b15614d58576001600160a01b038516600090815260046020908152604080832063ffffffff60001989011684529091529020600101829055614dc9565b60408051808201825263ffffffff808416825260208083018681526001600160a01b038a166000818152600484528681208b8616825284528681209551865490861663ffffffff19918216178755925160019687015590815260059092529390208054928801909116919092161790555b846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051614e049291906159c0565b60405180910390a25050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590614e4757508115155b949350505050565b6000816401000000008410614e775760405162461bcd60e51b8152600401611225919061533b565b509192915050565b604080518082019091526000808252602082015290565b803560ff811681146111ab57600080fd5b600060208284031215614eb8578081fd5b813561376a81615a45565b60008060408385031215614ed5578081fd5b8235614ee081615a45565b91506020830135614ef081615a45565b809150509250929050565b600080600060608486031215614f0f578081fd5b8335614f1a81615a45565b92506020840135614f2a81615a45565b91506040840135614f3a81615a45565b809150509250925092565b600080600060608486031215614f59578283fd5b8335614f6481615a45565b92506020840135614f7481615a45565b91506040840135614f3a81615a5a565b600080600060608486031215614f98578283fd5b8335614fa381615a45565b92506020840135614fb381615a45565b929592945050506040919091013590565b600080600080600060a08688031215614fdb578081fd5b8535614fe681615a45565b94506020860135614ff681615a45565b94979496505050506040830135926060810135926080909101359150565b600080600080600080600060e0888a03121561502e578182fd5b873561503981615a45565b9650602088013561504981615a45565b955060408801359450606088013593506150668960808a01614e96565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215615094578182fd5b823561509f81615a45565b946020939093013593505050565b600080600080608085870312156150c2578384fd5b84356150cd81615a45565b966020860135965060408601359560600135945092505050565b60008060008060008060c087890312156150ff578182fd5b863561510a81615a45565b955060208701359450604087013593506151278860608901614e96565b92506080870135915060a087013590509295509295509295565b60008060408385031215615153578182fd5b823561515e81615a45565b9150602083013563ffffffff81168114614ef0578182fd5b600060208284031215615187578081fd5b815161376a81615a5a565b6000602082840312156151a3578081fd5b5035919050565b6000602082840312156151bb578081fd5b5051919050565b600082516151d4818460208701615a19565b9190910192915050565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b818110156152a55783516001600160a01b031683529284019291840191600101615280565b50909695505050505050565b901515815260200190565b90815260200190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b9384526001600160a01b039290921660208401526040830152606082015260800190565b93845260ff9290921660208401526040830152606082015260800190565b600060208252825180602084015261535a816040850160208701615a19565b601f01601f19169190910160400192915050565b60208082526016908201527519195b1959d85d19509e54da59ce88195e1c1a5c995960521b604082015260600190565b60208082526019908201527f74726561737572793a20657863656564732062616c616e636500000000000000604082015260600190565b602080825260079082015266626f6e64696e6760c81b604082015260600190565b6020808252818101527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604082015260600190565b60208082526013908201527277697468647261773a20756e626f6e64696e6760681b604082015260600190565b60208082526014908201527314d85999515490cc8c0e880858dbdb9d1c9858dd60621b604082015260600190565b6020808252600f908201526e1c195c9b5a5d0e88195e1c1a5c9959608a1b604082015260600190565b60208082526012908201527164656c656761746542795369673a2073696760701b604082015260600190565b60208082526014908201527364656c656761746542795369673a206e6f6e636560601b604082015260600190565b6020808252601390820152725f6275726e3a207a65726f206164647265737360681b604082015260600190565b60208082526013908201527214d85999515490cc8c0e88085cdd58d8d95959606a1b604082015260600190565b60208082526017908201527f617070726f76654c69717569646974793a202170616972000000000000000000604082015260600190565b6020808252602a908201527f756e626f6e644c697175696469747946726f6d4a6f623a20696e73756666696360408201526969656e742066756e647360b01b606082015260800190565b6020808252601490820152731c195c9b5a5d0e881d5b985d5d1a1bdc9a5e995960621b604082015260600190565b60208082526006908201526536bab61d101560d11b604082015260600190565b60208082526013908201527230b232262599a921b932b234ba1d1010b537b160691b604082015260600190565b602080825260089082015267646973707574657360c01b604082015260600190565b60208082526014908201527372656d6f76654a6f623a20756e626f6e64696e6760601b604082015260600190565b6020808252600690820152656164643a202b60d01b604082015260600190565b6020808252601690820152751ddbdc9ad49958d95a5c1d0e881b585e081b1a5b5a5d60521b604082015260600190565b6020808252601d908201527f616363657074476f7665726e616e63653a202170656e64696e67476f76000000604082015260600190565b6020808252601190820152701c995b5bdd99529bd88e881d5b989bdb99607a1b604082015260600190565b60208082526011908201527030b2322537b11d103537b11035b737bbb760791b604082015260600190565b60208082526016908201527518dc99591a5d0e881c195b991a5b99c818dc99591a5d60521b604082015260600190565b60208082526012908201527130b23221b932b234ba22aa241d1010b537b160711b604082015260600190565b6020808252601190820152707065726d69743a207369676e617475726560781b604082015260600190565b6020808252600b908201526a189b1858dadb1a5cdd195960aa1b604082015260600190565b6020808252600f908201526e18dc99591a5d0e881b9bc8189bdb99608a1b604082015260600190565b60208082526018908201527f6164644c6971756964697479546f4a6f623a2021706169720000000000000000604082015260600190565b6020808252600d908201526c3932b1b2b4b83a1d1010b537b160991b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252600e908201526d33b2ba283934b7b92b37ba32b99d60911b604082015260600190565b6020808252601d908201527f5f7472616e73666572546f6b656e733a207a65726f2061646472657373000000604082015260600190565b6020808252601190820152703bb7b935a932b1b2b4b83a1d1010b537b160791b604082015260600190565b6020808252600f908201526e6372656469743a20626f6e64696e6760881b604082015260600190565b9182526001600160a01b0316602082015260400190565b918252602082015260400190565b9283526020830191909152604082015260600190565b63ffffffff91909116815260200190565b63ffffffff929092168252602082015260400190565b60ff91909116815260200190565b60005b83811015615a34578181015183820152602001615a1c565b838111156147e55750506000910152565b6001600160a01b038116811461168757600080fd5b801515811461168757600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef7472616e7366657246726f6d3a2065786365656473207370656e64657220616c6c6f77616e6365a26469706673582212207f0a09b5db53377fc3d552fce89dd72d48c63a7bbdbec497aa284add8299189164736f6c634300060c0033

Libraries Used


Deployed Bytecode Sourcemap

23727:44781:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43843:95;;;;;;;;;;-1:-1:-1;43843:95:0;;;;;:::i;:::-;;:::i;:::-;;24000:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64388:205;;;;;;;;;;-1:-1:-1;64388:205:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;38922:24::-;;;;;;;;;;-1:-1:-1;38922:24:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;46976:1118::-;;;;;;;;;;-1:-1:-1;46976:1118:0;;;;;:::i;:::-;;:::i;25159:40::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24333:35::-;;;;;;;;;;;;;:::i;38131:87::-;;;;;;;;;;-1:-1:-1;38131:87:0;;;;;:::i;:::-;;:::i;37141:45::-;;;;;;;;;;-1:-1:-1;37141:45:0;;;;;:::i;:::-;;:::i;39318:31::-;;;;;;;;;;-1:-1:-1;39318:31:0;;;;;:::i;:::-;;:::i;59652:473::-;;;;;;;;;;-1:-1:-1;59652:473:0;;;;;:::i;:::-;;:::i;34495:34::-;;;;;;;;;;;;;:::i;25033:119::-;;;;;;;;;;;;;:::i;52570:374::-;;;;;;;;;;-1:-1:-1;52570:374:0;;;;;:::i;:::-;;:::i;55507:170::-;;;;;;;;;;;;;:::i;67350:553::-;;;;;;;;;;-1:-1:-1;67350:553:0;;;;;:::i;:::-;;:::i;38272:39::-;;;;;;;;;;-1:-1:-1;38272:39:0;;;;;:::i;:::-;;:::i;56182:128::-;;;;;;;;;;-1:-1:-1;56182:128:0;;;;;:::i;:::-;;:::i;44310:119::-;;;;;;;;;;-1:-1:-1;44310:119:0;;;;;:::i;:::-;;:::i;25494:128::-;;;;;;;;;;;;;:::i;24234:35::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;43630:92::-;;;;;;;;;;-1:-1:-1;43630:92:0;;;;;:::i;:::-;;:::i;36000:60::-;;;;;;;;;;-1:-1:-1;36000:60:0;;;;;:::i;:::-;;:::i;56795:355::-;;;;;;;;;;-1:-1:-1;56795:355:0;;;;;:::i;:::-;;:::i;37260:36::-;;;;;;;;;;-1:-1:-1;37260:36:0;;;;;:::i;:::-;;:::i;49416:80::-;;;;;;;;;;-1:-1:-1;49416:80:0;;;;;:::i;:::-;;:::i;45916:837::-;;;;;;;;;;-1:-1:-1;45916:837:0;;;;;:::i;:::-;;:::i;36722:27::-;;;;;;;;;;;;;:::i;51082:568::-;;;;;;;;;;-1:-1:-1;51082:568:0;;;;;:::i;:::-;;:::i;44063:103::-;;;;;;;;;;-1:-1:-1;44063:103:0;;;;;:::i;:::-;;:::i;62400:694::-;;;;;;;;;;-1:-1:-1;62400:694:0;;;;;:::i;:::-;;:::i;44849:803::-;;;;;;;;;;-1:-1:-1;44849:803:0;;;;;:::i;:::-;;:::i;24519:45::-;;;;;;;;;;-1:-1:-1;24519:45:0;;;;;:::i;:::-;;:::i;39019:25::-;;;;;;;;;;;;;:::i;26431:95::-;;;;;;;;;;-1:-1:-1;26431:95:0;;;;;:::i;:::-;;:::i;50410:125::-;;;;;;;;;;-1:-1:-1;50410:125:0;;;;;:::i;:::-;;:::i;34409:27::-;;;;;;;;;;;;;:::i;48277:706::-;;;;;;;;;;-1:-1:-1;48277:706:0;;;;;:::i;:::-;;:::i;39157:23::-;;;;;;;;;;;;;:::i;37359:59::-;;;;;;;;;;-1:-1:-1;37359:59:0;;;;;:::i;:::-;;:::i;43363:122::-;;;;;;;;;;-1:-1:-1;43363:122:0;;;;;:::i;:::-;;:::i;36236:68::-;;;;;;;;;;-1:-1:-1;36236:68:0;;;;;:::i;:::-;;:::i;54418:93::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;40201:354::-;;;;;;:::i;:::-;;:::i;24786:49::-;;;;;;;;;;-1:-1:-1;24786:49:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;66527:108::-;;;;;;;;;;-1:-1:-1;66527:108:0;;;;;:::i;:::-;;:::i;63242:225::-;;;;;;;;;;-1:-1:-1;63242:225:0;;;;;:::i;:::-;;:::i;60801:899::-;;;;;;;;;;-1:-1:-1;60801:899:0;;;;;:::i;:::-;;:::i;37900:48::-;;;;;;;;;;-1:-1:-1;37900:48:0;;;;;:::i;:::-;;:::i;28416:1191::-;;;;;;;;;;-1:-1:-1;28416:1191:0;;;;;:::i;:::-;;:::i;25705:39::-;;;;;;;;;;-1:-1:-1;25705:39:0;;;;;:::i;:::-;;:::i;54682:148::-;;;;;;;;;;-1:-1:-1;54682:148:0;;;;;:::i;:::-;;:::i;59031:99::-;;;;;;;;;;;;;:::i;35897:42::-;;;;;;;;;;;;;:::i;37763:97::-;;;;;;;;;;-1:-1:-1;37763:97:0;;;;;:::i;:::-;;:::i;50726:127::-;;;;;;;;;;-1:-1:-1;50726:127:0;;;;;:::i;:::-;;:::i;40808:627::-;;;;;;;;;;-1:-1:-1;40808:627:0;;;;;:::i;:::-;;:::i;51935:409::-;;;;;;;;;;-1:-1:-1;51935:409:0;;;;;:::i;:::-;;:::i;54979:122::-;;;;;;;;;;-1:-1:-1;54979:122:0;;;;;:::i;:::-;;:::i;24105:38::-;;;;;;;;;;;;;:::i;36121:62::-;;;;;;;;;;-1:-1:-1;36121:62:0;;;;;:::i;:::-;;:::i;57687:344::-;;;;;;;;;;-1:-1:-1;57687:344:0;;;;;:::i;:::-;;:::i;36494:57::-;;;;;;;;;;-1:-1:-1;36494:57:0;;;;;:::i;:::-;;:::i;38810:27::-;;;;;;;;;;-1:-1:-1;38810:27:0;;;;;:::i;:::-;;:::i;58223:727::-;;;;;;;;;;-1:-1:-1;58223:727:0;;;;;:::i;:::-;;:::i;61891:356::-;;;;;;;;;;-1:-1:-1;61891:356:0;;;;;:::i;:::-;;:::i;66896:147::-;;;;;;;;;;-1:-1:-1;66896:147:0;;;;;:::i;:::-;;:::i;55266:118::-;;;;;;;;;;-1:-1:-1;55266:118:0;;;;;:::i;:::-;;:::i;36928:40::-;;;;;;;;;;-1:-1:-1;36928:40:0;;;;;:::i;:::-;;:::i;27765:220::-;;;;;;;;;;-1:-1:-1;27765:220:0;;;;;:::i;:::-;;:::i;42970:239::-;;;;;;;;;;-1:-1:-1;42970:239:0;;;;;:::i;:::-;;:::i;37621:90::-;;;;;;;;;;-1:-1:-1;37621:90:0;;;;;:::i;:::-;;:::i;34307:25::-;;;;;;;;;;;;;:::i;26960:604::-;;;;;;;;;;-1:-1:-1;26960:604:0;;;;;:::i;:::-;;:::i;42484:332::-;;;;;;;;;;-1:-1:-1;42484:332:0;;;;;:::i;:::-;;:::i;54092:221::-;;;;;;;;;;-1:-1:-1;54092:221:0;;;;;:::i;:::-;;:::i;34628:20::-;;;;;;;;;;;;;:::i;49213:92::-;;;;;;;;;;-1:-1:-1;49213:92:0;;;;;:::i;:::-;;:::i;42049:241::-;;;;;;;;;;-1:-1:-1;42049:241:0;;;;;:::i;:::-;;:::i;37033:39::-;;;;;;;;;;-1:-1:-1;37033:39:0;;;;;:::i;:::-;;:::i;65648:676::-;;;;;;;;;;-1:-1:-1;65648:676:0;;;;;:::i;:::-;;:::i;36622:37::-;;;;;;;;;;-1:-1:-1;36622:37:0;;;;;:::i;:::-;;:::i;63777:136::-;;;;;;;;;;-1:-1:-1;63777:136:0;;;;;:::i;:::-;;:::i;41598:280::-;;;;;;;;;;-1:-1:-1;41598:280:0;;;;;:::i;:::-;;:::i;36370:64::-;;;;;;;;;;-1:-1:-1;36370:64:0;;;;;:::i;:::-;;:::i;37483:89::-;;;;;;;;;;-1:-1:-1;37483:89:0;;;;;:::i;:::-;;:::i;36815:41::-;;;;;;;;;;-1:-1:-1;36815:41:0;;;;;:::i;:::-;;:::i;25293:111::-;;;;;;;;;;;;;:::i;39260:49::-;;;;;;;;;;-1:-1:-1;39260:49:0;;;;;:::i;:::-;;:::i;35807:33::-;;;;;;;;;;;;;:::i;55837:102::-;;;;;;;;;;-1:-1:-1;55837:102:0;;;;;:::i;:::-;;:::i;24647:70::-;;;;;;;;;;-1:-1:-1;24647:70:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;39051:32::-;;;;;;;;;;;;;:::i;23901:28::-;;;;;;;;;;;;;:::i;38383:41::-;;;;;;;;;;-1:-1:-1;38383:41:0;;;;;:::i;:::-;;:::i;64897:264::-;;;;;;;;;;-1:-1:-1;64897:264:0;;;;;:::i;:::-;;:::i;37993:88::-;;;;;;;;;;-1:-1:-1;37993:88:0;;;;;:::i;:::-;;:::i;44509:98::-;;;;;;;;;;;;;:::i;43843:95::-;40032:10;;-1:-1:-1;;;;;40032:10:0;40018;:24;40010:33;;;;;;43916:4:::1;:14:::0;43843:95::o;24000:38::-;;;;;;;;;;;;;;-1:-1:-1;;;24000:38:0;;;;:::o;64388:205::-;64479:10;64451:4;64468:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;64468:31:0;;;;;;;;;;:40;;;64526:37;64451:4;;64468:31;;64526:37;;;;64502:6;;64526:37;:::i;:::-;;;;;;;;-1:-1:-1;64581:4:0;64388:205;;;;;:::o;38922:24::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38922:24:0;;-1:-1:-1;38922:24:0;:::o;46976:1118::-;47097:10;47081:27;;;;:15;:27;;;;;;;;-1:-1:-1;;;;;47081:38:0;;;;;;;;;;;:43;;;;;;;;;;;:48;47073:83;;;;-1:-1:-1;;;47073:83:0;;;;;;;:::i;:::-;;;;;;;;;47186:10;47167:30;;;;:18;:30;;;;;;;;-1:-1:-1;;;;;47167:41:0;;;;;;;;;;;;:46;;;;;;;;;;;;47216:3;47167:52;;47286:37;;;:25;:37;;;;;:48;;;;;;;;:53;;;;;;;;:65;;47344:6;47286:57;:65::i;:::-;47256:10;47230:37;;;;:25;:37;;;;;;;;-1:-1:-1;;;;;47230:48:0;;;;;;;;;;;;:53;;;;;;;;;;;;:121;;;47427:29;;;:17;:29;;;;;:40;;;;;;;;;:45;;;;;;;;;;47370:53;;;-1:-1:-1;47370:102:0;47362:157;;;;-1:-1:-1;;;47362:157:0;;;;;;;:::i;:::-;47550:52;;-1:-1:-1;;;47550:52:0;;47532:15;;47550;;:26;;:52;;47577:9;;47596:4;;47550:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47532:70;;47613:12;47628:59;47662:9;-1:-1:-1;;;;;47655:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47628:22;:10;47643:6;47628:14;:22::i;:::-;:26;;:59::i;:::-;-1:-1:-1;;;;;47712:12:0;;;;;;:7;:12;;;;;;;;47733:4;47712:27;;;;;;;;47613:74;;-1:-1:-1;47702:37:0;;47698:312;;;-1:-1:-1;;;;;47777:12:0;;;;;;:7;:12;;;;;;;;47770:4;47777:27;;;;;;;;;47756:49;;47770:4;47756:5;:49::i;:::-;-1:-1:-1;;;;;47820:12:0;;47850:1;47820:12;;;:7;:12;;;;;;;;47841:4;47820:27;;;;;;;:31;47698:312;;;47884:29;47898:4;47905:7;47884:5;:29::i;:::-;-1:-1:-1;;;;;47958:12:0;;;;;;:7;:12;;;;;;;;47979:4;47958:27;;;;;;;;:40;;47990:7;47958:31;:40::i;:::-;-1:-1:-1;;;;;47928:12:0;;;;;;:7;:12;;;;;;;;47949:4;47928:27;;;;;;;:70;47698:312;48053:10;-1:-1:-1;;;;;48027:59:0;48042:9;-1:-1:-1;;;;;48027:59:0;48037:3;-1:-1:-1;;;;;48027:59:0;;48065:12;48079:6;48027:59;;;;;;;:::i;:::-;;;;;;;;46976:1118;;;;;:::o;25159:40::-;;;:::o;24333:35::-;;;;:::o;38131:87::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37141:45::-;;;;;;;;;;;;;:::o;39318:31::-;;;;;;;;;;59652:473;59726:10;59716:21;;;;:9;:21;;;;;;;;59715:22;59707:46;;;;-1:-1:-1;;;59707:46:0;;;;;;;:::i;:::-;59907:10;59898:20;;;;:8;:20;;;;;;;;-1:-1:-1;;;;;59898:29:0;;;;;;;;;;:34;;;;:103;;-1:-1:-1;59990:4:0;;59965:10;60000:1;59956:20;;;:8;:20;;;;;;;;-1:-1:-1;;;;;59956:29:0;;;;;;;;;;60000:1;;59936:60;;59956:39;;:33;:39::i;:::-;59936:15;;:19;:60::i;:::-;:65;;59898:103;59890:123;;;;-1:-1:-1;;;59890:123:0;;;;;;;:::i;:::-;60054:22;60065:10;60054;:22::i;:::-;60087:30;60097:10;60109:7;60087:9;:30::i;:::-;59652:473;:::o;34495:34::-;;;;:::o;25033:119::-;25075:77;25033:119;:::o;52570:374::-;52650:10;52645:16;;;;:4;:16;;;;;;;;52637:42;;;;-1:-1:-1;;;52637:42:0;;;;;;;:::i;:::-;52717:69;;;;;;;;;;;;;;;;;;;;52725:10;-1:-1:-1;52717:19:0;;;:7;:19;;;;;35935:3;52717:24;;;;;;;;;;:69;;52746:6;;52717:28;:69::i;:::-;52698:10;52690:19;;;;:7;:19;;;;;;;;35935:3;52690:24;;;;;;;:96;;;;-1:-1:-1;;;;;52797:15:0;;;;;:7;:15;;;;;;52815:3;52797:21;;52829:32;;;;;;;52854:6;;52829:32;;52690:19;52829:32;52854:6;52797:15;52829:32;;;;;;;;;;;;;;;;;;;;;52907:6;-1:-1:-1;;;;;52877:59:0;52895:10;-1:-1:-1;;;;;52877:59:0;35935:3;-1:-1:-1;;;;;52877:59:0;;52915:12;52929:6;52877:59;;;;;;;:::i;:::-;;;;;;;;52570:374;;:::o;55507:170::-;55577:17;;-1:-1:-1;;;;;55577:17:0;55563:10;:31;55555:73;;;;-1:-1:-1;;;55555:73:0;;;;;;;:::i;:::-;55652:17;;55639:10;:30;;-1:-1:-1;;;;;;55639:30:0;-1:-1:-1;;;;;55652:17:0;;;55639:30;;;;;;55507:170::o;67350:553::-;-1:-1:-1;;;;;67509:15:0;;67429:4;67509:15;;;:10;:15;;;;;;;;67464:10;67509:24;;;;;;;;67429:4;;67464:10;;67509:24;67550:14;;;;;:46;;;-1:-1:-1;;67568:16:0;:28;;67550:46;67546:282;;;67613:17;67633:71;67654:6;67633:71;;;;;;;;;;;;;;;;;:16;;:71;:20;:71::i;:::-;-1:-1:-1;;;;;67719:15:0;;;;;;;:10;:15;;;;;;;;:24;;;;;;;;;;;;;;:39;;;67780:36;67613:91;;-1:-1:-1;67719:24:0;;67780:36;;;;67613:91;;67780:36;:::i;:::-;;;;;;;;67546:282;;67840:33;67856:3;67861;67866:6;67840:15;:33::i;:::-;-1:-1:-1;67891:4:0;;67350:553;-1:-1:-1;;;;;67350:553:0:o;38272:39::-;;;;;;;;;;;;;;;:::o;56182:128::-;56232:4;56260:9;56249:8;:20;-1:-1:-1;;;;;;56287:15:0;;;;;:7;:15;;;;;;;;;56182:128::o;44310:119::-;40032:10;;-1:-1:-1;;;;;40032:10:0;40018;:24;40010:33;;;;;;44395:13:::1;:26:::0;44310:119::o;25494:128::-;25536:86;25494:128;:::o;24234:35::-;24267:2;24234:35;:::o;43630:92::-;40032:10;;-1:-1:-1;;;;;40032:10:0;40018;:24;40010:33;;;;;;43702:3:::1;:12:::0;43630:92::o;36000:60::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;56795:355::-;56887:4;56915:9;56904:8;:20;-1:-1:-1;;;;;56942:15:0;;;;;;:7;:15;;;;;;;;:94;;;;-1:-1:-1;;;;;;57011:13:0;;;;;;:5;:13;;;;;;;;;56978:5;:13;;;;;57000:4;56978:28;;;;;;;;;57029:7;;56978:47;;:28;:32;:47::i;:::-;:58;;56942:94;:146;;;;-1:-1:-1;;;;;;57057:21:0;;;;;;:13;:21;;;;;;:31;-1:-1:-1;57057:31:0;56942:146;:200;;;;-1:-1:-1;;;;;;57117:17:0;;;;;;:9;:17;;;;;;57139:3;;57109:26;;:3;;:7;:26::i;:::-;:33;;56942:200;56935:207;56795:355;-1:-1:-1;;;;;56795:355:0:o;37260:36::-;;;;;;;;;;;;;;;:::o;49416:80::-;49463:25;49469:10;49481:6;49463:5;:25::i;45916:837::-;-1:-1:-1;;;;;46020:28:0;;;;;;:17;:28;;;;;;;;46012:65;;;;-1:-1:-1;;;46012:65:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;46096:26:0;;;;;;;:16;:26;;;;;;;;:37;;;;;;;;;;:42;;;;;;;;;;46088:75;;;;-1:-1:-1;;;46088:75:0;;;;;;;:::i;:::-;46249:13;;-1:-1:-1;;;;;46202:26:0;;;46268:1;46202:26;;;:16;:26;;;;;;;;:37;;;;;;;;;;:42;;;;;;;;;;;;46268:1;;46182:82;;46202:61;;:46;:61::i;46182:82::-;:87;;46174:115;;;;-1:-1:-1;;;46174:115:0;;;;;;;:::i;:::-;46318:52;;-1:-1:-1;;;46318:52:0;;46300:15;;46318;;:26;;:52;;46345:9;;46364:4;;46318:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46300:70;;46381:12;46396:94;46465:9;-1:-1:-1;;;;;46458:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46411:25:0;;;;;;;:15;:25;;;;;;;;:36;;;;;;;;;;:41;;;;;;;;;;46396:57;;:10;;:14;:57::i;:94::-;46381:109;;46501:29;46515:4;46522:7;46501:5;:29::i;:::-;-1:-1:-1;;;;;46571:12:0;;;;;;:7;:12;;;;;;;;46592:4;46571:27;;;;;;;;:40;;46603:7;46571:31;:40::i;:::-;-1:-1:-1;;;;;46541:12:0;;;;;;;:7;:12;;;;;;;;46562:4;46541:27;;;;;;;:70;;;;46622:25;;;;;;:15;:25;;;;;:36;;;;;;;;;;;;:41;;;;;;;;;:45;;;;46685:60;;;;;;46723:12;;46737:7;;46685:60;:::i;36722:27::-;;;;:::o;51082:568::-;51163:10;51158:16;;;;:4;:16;;;;;;;;51150:46;;;;-1:-1:-1;;;51150:46:0;;;;;;;:::i;:::-;51225:5;;-1:-1:-1;;;;;51225:5:0;:19;51245:23;51258:9;51245:8;;;:12;:23::i;:::-;51225:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51215:6;:54;;51207:89;;;;-1:-1:-1;;;51207:89:0;;;;;;;:::i;:::-;51344:79;;;;;;;;;;;;;;;;;;;;51352:10;-1:-1:-1;51344:19:0;;;:7;:19;;;;;51372:4;51344:34;;;;;;;;;;:79;;51383:6;;51344:38;:79::i;:::-;51315:10;51307:19;;;;:7;:19;;;;;;;;51335:4;51307:34;;;;;;;:116;;;;-1:-1:-1;;;;;51434:15:0;;;;:7;:15;;;51452:3;51434:21;;51466:23;51442:6;51482;51466:7;:23::i;:::-;-1:-1:-1;;;;;51524:21:0;;;;;;:13;:21;;;;;;:33;;51550:6;51524:25;:33::i;:::-;-1:-1:-1;;;;;51500:21:0;;;;;;:13;:21;;;;;;;:57;;;;51573:69;;51601:10;;51594:4;;51573:69;;;;51621:12;;51635:6;;51573:69;:::i;44063:103::-;40032:10;;-1:-1:-1;;;;;40032:10:0;40018;:24;40010:33;;;;;;44140:6:::1;:18:::0;44063:103::o;62400:694::-;10323:1;10929:7;;:19;;10921:63;;;;-1:-1:-1;;;10921:63:0;;;;;;;:::i;:::-;10323:1;11062:7;:18;;;62487:10:::1;62476:22:::0;;:10:::1;:22;::::0;;;;;;;-1:-1:-1;;;;;62476:31:0;::::1;::::0;;;;;;;;:36;;::::1;::::0;:108:::1;;-1:-1:-1::0;62571:6:0::1;::::0;62546:10:::1;62583:1;62535:22:::0;;;:10:::1;:22;::::0;;;;;;;-1:-1:-1;;;;;62535:31:0;::::1;::::0;;;;;;;;62583:1;;62515:64:::1;::::0;62535:43:::1;::::0;:35:::1;:43::i;62515:64::-;:69;;62476:108;62468:140;;;;-1:-1:-1::0;;;62468:140:0::1;;;;;;;:::i;:::-;62637:10;62628:20;::::0;;;:8:::1;:20;::::0;;;;;::::1;;62627:21;62619:42;;;;-1:-1:-1::0;;;62619:42:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;62678:24:0;::::1;62697:4;62678:24;62674:250;;;62750:10;62762:28;::::0;;;:16:::1;:28;::::0;;;;;;;-1:-1:-1;;;;;62762:37:0;::::1;::::0;;;;;;;;62719:81:::1;::::0;62743:4:::1;::::0;62719:15:::1;:81::i;:::-;62674:250;;;62862:10;62874:28;::::0;;;:16:::1;:28;::::0;;;;;;;-1:-1:-1;;;;;62874:37:0;::::1;::::0;;;;;;;;;62833:79:::1;::::0;62862:10;62833:28:::1;:79::i;:::-;62953:10;62996:28;::::0;;;:16:::1;:28;::::0;;;;;;;-1:-1:-1;;;;;62996:37:0;::::1;::::0;;;;;;;;;;62939:95;;::::1;::::0;::::1;::::0;62965:12:::1;::::0;62979:15:::1;::::0;62939:95:::1;:::i;:::-;;;;;;;;63062:10;63085:1;63045:28:::0;;;:16:::1;:28;::::0;;;;;;;-1:-1:-1;;;;;63045:37:0;;;::::1;::::0;;;;;;;;:41;;;10279:1;11241:22;;62400:694::o;44849:803::-;10323:1;10929:7;;:19;;10921:63;;;;-1:-1:-1;;;10921:63:0;;;;;;;:::i;:::-;10323:1;11062:7;:18;;;-1:-1:-1;;;;;44962:28:0;::::1;::::0;;:17:::1;:28;::::0;;;;;::::1;;44954:65;;;;-1:-1:-1::0;;;44954:65:0::1;;;;;;;:::i;:::-;45030:69;-1:-1:-1::0;;;;;45030:34:0;::::1;45065:10;45085:4;45092:6:::0;45030:34:::1;:69::i;:::-;45176:10;45158:29;::::0;;;:17:::1;:29;::::0;;;;;;;-1:-1:-1;;;;;45158:40:0;;::::1;::::0;;;;;;;;:45;;::::1;::::0;;;;;;;;:57:::1;::::0;45208:6;45158:49:::1;:57::i;:::-;45128:10;45110:29;::::0;;;:17:::1;:29;::::0;;;;;;;-1:-1:-1;;;;;45110:40:0;;::::1;::::0;;;;;;;;;:45;;::::1;::::0;;;;;;;;;:105;;;;45228:28;;;:16:::1;:28:::0;;;;;:39;;;;;;;;:44;;;;;;;;45275:3:::1;45228:50:::0;;45335:27;;;:15:::1;:27:::0;;;;;:38;;;;;;;;;:43;;;;;;;;;;:55:::1;::::0;45383:6;45335:47:::1;:55::i;:::-;45305:10;45289:27;::::0;;;:15:::1;:27;::::0;;;;;;;-1:-1:-1;;;;;45289:38:0;;::::1;::::0;;;;;;;;:43;;::::1;::::0;;;;;;;:101;;;;45408:4:::1;:9:::0;;;;::::1;;45407:10;:53:::0;::::1;;;-1:-1:-1::0;45447:6:0::1;::::0;-1:-1:-1;;;;;45421:21:0;::::1;;::::0;;;:16:::1;:21;::::0;;;;;45457:3:::1;::::0;45421:33:::1;::::0;:21;:25:::1;:33::i;:::-;:39;45407:53;45403:167;;;45489:10;::::0;45477:39:::1;::::0;-1:-1:-1;;;45477:39:0;;-1:-1:-1;;;;;45489:10:0;;::::1;::::0;45477:34:::1;::::0;:39:::1;::::0;45512:3;;45477:39:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;;;;;;45531:21:0;::::1;;::::0;;;:16:::1;:21;::::0;;;;45555:3:::1;45531:27:::0;;-1:-1:-1;45403:167:0::1;45611:10;-1:-1:-1::0;;;;;45585:59:0::1;45600:9;-1:-1:-1::0;;;;;45585:59:0::1;45595:3;-1:-1:-1::0;;;;;45585:59:0::1;;45623:12;45637:6;45585:59;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;10279:1:0;11241:7;:22;-1:-1:-1;44849:803:0:o;24519:45::-;;;;;;;;;;;;-1:-1:-1;;;;;24519:45:0;;:::o;39019:25::-;;;-1:-1:-1;;;;;39019:25:0;;:::o;26431:95::-;26486:32;26496:10;26508:9;26486;:32::i;50410:125::-;50482:5;;50462:65;;50474:6;;-1:-1:-1;;;;;50482:5:0;:19;50502:23;50515:9;50502:8;;;:12;:23::i;:::-;50482:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;34409:27::-;;;;:::o;48277:706::-;48388:10;48369:30;;;;:18;:30;;;;;;;;-1:-1:-1;;;;;48369:41:0;;;;;;;;;;;:46;;;;;;;;;;;48361:81;;;;-1:-1:-1;;;48361:81:0;;;;;;;:::i;:::-;48532:6;;48500:10;48544:1;48481:30;;;:18;:30;;;;;;;;-1:-1:-1;;;;;48481:41:0;;;;;;;;;;;:46;;;;;;;;;;;48544:1;;48461:79;;48481:58;;:50;:58::i;48461:79::-;:84;;48453:118;;;;-1:-1:-1;;;48453:118:0;;;;;;;:::i;:::-;48623:10;48582:12;48597:37;;;:25;:37;;;;;;;;-1:-1:-1;;;;;48597:48:0;;;;;;;;;;;;:53;;;;;;;;;;;;;48709:29;;;:17;:29;;;;;:40;;;;;;;;;:45;;;;;;;;;:58;;48597:53;48709:49;:58::i;:::-;48679:10;48661:29;;;;:17;:29;;;;;;;;-1:-1:-1;;;;;48661:40:0;;;;;;;;;;;;:45;;;;;;;;;;;;:106;;;;48778:37;;;:25;:37;;;;;:48;;;;;;;;:53;;;;;;;;;:57;48846:51;;48661:40;48889:7;48846:30;:51::i;:::-;48941:10;-1:-1:-1;;;;;48915:60:0;48930:9;-1:-1:-1;;;;;48915:60:0;48925:3;-1:-1:-1;;;;;48915:60:0;;48953:12;48967:7;48915:60;;;;;;;:::i;:::-;;;;;;;;48277:706;;;:::o;39157:23::-;;;-1:-1:-1;;;;;39157:23:0;;:::o;37359:59::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;43363:122::-;40032:10;;-1:-1:-1;;;;;40032:10:0;40018;:24;40010:33;;;;;;-1:-1:-1;;;;;43441:28:0::1;43472:5;43441:28:::0;;;:17:::1;:28;::::0;;;;:36;;-1:-1:-1;;43441:36:0::1;::::0;;43363:122::o;36236:68::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;54418:93::-;54460:16;54496:7;54489:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54489:14:0;;;;;;;;;;;;;;;;;;;;;;;54418:93;:::o;40201:354::-;-1:-1:-1;;;;;40272:9:0;;;;;;:4;:9;;;;;;;;40264:40;;;;-1:-1:-1;;;40264:40:0;;;;;;;:::i;:::-;40315:9;40327:28;35835:5;40327:18;40341:3;;40327:9;:13;;:18;;;;:::i;:28::-;40315:40;-1:-1:-1;40386:42:0;40408:19;:9;40315:40;40408:13;:19::i;:::-;-1:-1:-1;;;;;40386:12:0;;;;;;:7;:12;;;;;;;;35935:3;40386:17;;;;;;;;;:21;:42::i;:::-;-1:-1:-1;;;;;40366:12:0;;;;;;;:7;:12;;;;;;;;35935:3;40366:17;;;;;;;;:62;;;;40447:10;;40439:34;;40447:10;;;;;40439:34;;;;;40468:4;;40439:34;;40366:12;40439:34;40468:4;40447:10;40439:34;;;;;;;;;;;;;;;;;;;;;40511:10;-1:-1:-1;;;;;40491:56:0;40506:3;-1:-1:-1;;;;;40491:56:0;35935:3;-1:-1:-1;;;;;40491:56:0;;40523:12;40537:9;40491:56;;;;;;;:::i;24786:49::-;;;;;;;;;;;;;;;:::o;66527:108::-;-1:-1:-1;;;;;66610:17:0;66586:4;66610:17;;;:8;:17;;;;;;;66527:108::o;63242:225::-;40032:10;;-1:-1:-1;;;;;40032:10:0;40018;:24;40010:33;;;;;;-1:-1:-1;;;;;63308:15:0;;::::1;63326:5;63308:15:::0;;;:7:::1;:15:::0;;;;;;;:23;;-1:-1:-1;;63308:23:0;;::::1;::::0;;;63342:9:::1;:17:::0;;;;;:24;;;;::::1;63308:23:::0;63342:24:::1;::::0;;63389:10:::1;::::0;63430:5:::1;:13:::0;;;;;63415:4:::1;63430:28:::0;;;;;;;;;;63377:82;;-1:-1:-1;;;63377:82:0;;63389:10;;;::::1;::::0;63377:29:::1;::::0;:82:::1;::::0;63415:4;63316:6;;63377:82:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;63242:225:::0;:::o;60801:899::-;60904:14;60913:4;60904:8;:14::i;:::-;60896:23;;;;;;60938:10;-1:-1:-1;;;;;60938:18:0;;;;:65;;-1:-1:-1;;;;;;60960:22:0;;;;;;;:16;:22;;;;;;;;60983:10;60960:34;;;;;;;:43;;;;;;;;;;;;60938:65;60930:74;;;;;;-1:-1:-1;;;;;61023:14:0;;;;;;;:8;:14;;;;;;;;:23;;;;;;;;;;:28;;;;:91;;-1:-1:-1;61103:4:0;;-1:-1:-1;;;;;61075:14:0;;;61113:1;61075:14;;;:8;:14;;;;;;;;:23;;;;;;;;;;;;61113:1;;61055:54;;61075:33;;:27;:33::i;61055:54::-;:59;;61023:91;61015:100;;;;;;61128:14;61139:2;61128:10;:14::i;:::-;-1:-1:-1;;;;;61208:13:0;;;61224:5;61208:13;;;:7;:13;;;;;;;:21;;-1:-1:-1;;61208:21:0;;;;;;61287:11;;;;;;;;:18;;;;;61208:21;61287:18;;;61367:11;;;:5;:11;;;;;:20;;;;;;;;;;;;61398:33;61379:7;61216:4;61367:20;61398:7;:33::i;:::-;61470:29;61476:7;61484:2;61487:11;61470:5;:29::i;:::-;-1:-1:-1;;;;;61587:22:0;;;61633:5;61587:22;;;:16;:22;;;;;;;;61610:10;61587:34;;;;;;;:43;;;;;;;;;;;:51;;-1:-1:-1;;61587:51:0;;;61654:38;61587:43;;61654:38;;;61587:22;61654:38;;;60801:899;;;;:::o;37900:48::-;;;;;;;;;;;;;:::o;28416:1191::-;28495:4;28534:12;28520:11;:26;28512:53;;;;-1:-1:-1;;;28512:53:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28600:23:0;;28578:19;28600:23;;;:14;:23;;;;;;;;28638:17;28634:58;;28679:1;28672:8;;;;;28634:58;-1:-1:-1;;;;;28752:20:0;;;;;;:11;:20;;;;;;;;:38;-1:-1:-1;;28773:16:0;;28752:38;;;;;;;;;:48;;:63;-1:-1:-1;28748:147:0;;-1:-1:-1;;;;;28839:20:0;;;;;;:11;:20;;;;;;;;-1:-1:-1;;28860:16:0;;;;28839:38;;;;;;;;28875:1;28839:44;;;-1:-1:-1;28832:51:0;;28748:147;-1:-1:-1;;;;;28956:20:0;;;;;;:11;:20;;;;;;;;:23;;;;;;;;:33;:23;:33;:47;-1:-1:-1;28952:88:0;;;29027:1;29020:8;;;;;28952:88;29052:12;-1:-1:-1;;29094:16:0;;29121:428;29136:5;29128:13;;:5;:13;;;29121:428;;;29200:1;29183:13;;;29182:19;;;29174:27;;29243:20;;:::i;:::-;-1:-1:-1;;;;;;29266:20:0;;;;;;:11;:20;;;;;;;;:28;;;;;;;;;;;;;29243:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29313:27;;29309:229;;;29368:8;;;;-1:-1:-1;29361:15:0;;-1:-1:-1;;;;29361:15:0;29309:229;29402:12;;:26;;;-1:-1:-1;29398:140:0;;;29457:6;29449:14;;29398:140;;;29521:1;29512:6;:10;29504:18;;29398:140;29121:428;;;;;-1:-1:-1;;;;;;29566:20:0;;;;;;:11;:20;;;;;;;;:27;;;;;;;;;;:33;;;;-1:-1:-1;;28416:1191:0;;;;:::o;25705:39::-;;;;;;;;;;;;;:::o;54682:148::-;40032:10;;-1:-1:-1;;;;;40032:10:0;40018;:24;40010:33;;;;;;-1:-1:-1;;;;;54748:9:0;::::1;54760:5;54748:9:::0;;;:4:::1;:9;::::0;;;;;;:17;;-1:-1:-1;;54748:17:0::1;::::0;;54781:41;::::1;::::0;::::1;::::0;54797:12:::1;::::0;54811:10:::1;::::0;54781:41:::1;:::i;:::-;;;;;;;;54682:148:::0;:::o;59031:99::-;59076:16;59112:10;59105:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;59105:17:0;;;;;;;;;;;;;;;;;;;;;;59031:99;:::o;35897:42::-;35935:3;35897:42;:::o;37763:97::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50726:127::-;50800:5;;50781:64;;50792:6;;-1:-1:-1;;;;;50800:5:0;:19;50820:23;50833:9;50820:8;;;:12;:23::i;:::-;50800:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;40808:627::-;10323:1;10929:7;;:19;;10921:63;;;;-1:-1:-1;;;10921:63:0;;;;;;;:::i;:::-;10323:1;11062:7;:18;;;-1:-1:-1;;;;;40910:9:0;::::1;::::0;;:4:::1;:9;::::0;;;;;::::1;;40902:40;;;;-1:-1:-1::0;;;40902:40:0::1;;;;;;;:::i;:::-;40968:39;::::0;-1:-1:-1;;;40968:39:0;;40953:12:::1;::::0;-1:-1:-1;;;;;40968:24:0;::::1;::::0;::::1;::::0;:39:::1;::::0;41001:4:::1;::::0;40968:39:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40953:54:::0;-1:-1:-1;41018:66:0::1;-1:-1:-1::0;;;;;41018:31:0;::::1;41050:10;41070:4;41077:6:::0;41018:31:::1;:66::i;:::-;41095:14;41112:52;41156:7;41119:6;-1:-1:-1::0;;;;;41112:24:0::1;;41145:4;41112:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43:::0;::::1;:52::i;:::-;41095:69;;41175:9;41187:28;35835:5;41187:18;41201:3;;41187:9;:13;;:18;;;;:::i;:28::-;41175:40:::0;-1:-1:-1;41249:45:0::1;41274:19;:9:::0;41175:40;41274:13:::1;:19::i;:::-;-1:-1:-1::0;;;;;41249:12:0;;::::1;;::::0;;;:7:::1;:12;::::0;;;;;;;:20;;::::1;::::0;;;;;;;;:24:::1;:45::i;:::-;-1:-1:-1::0;;;;;41226:12:0;;::::1;;::::0;;;:7:::1;:12;::::0;;;;;;;:20;;::::1;::::0;;;;;;;;:68;;;;41333:10:::1;::::0;41305:45:::1;::::0;41226:20;41333:10:::1;41345:4:::0;41305:27:::1;:45::i;:::-;41391:10;-1:-1:-1::0;;;;;41368:59:0::1;41386:3;-1:-1:-1::0;;;;;41368:59:0::1;41378:6;-1:-1:-1::0;;;;;41368:59:0::1;;41403:12;41417:9;41368:59;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;10279:1:0;11241:7;:22;-1:-1:-1;;;;40808:627:0:o;51935:409::-;52030:10;52025:16;;;;:4;:16;;;;;;;;52017:42;;;;-1:-1:-1;;;52017:42:0;;;;;;;:::i;:::-;52100:72;;;;;;;;;;;;;;;;;;;;52108:10;-1:-1:-1;52100:19:0;;;:7;:19;;;;;-1:-1:-1;;;;;52100:27:0;;;;;;;;;;;;:72;;52132:6;;52100:31;:72::i;:::-;52078:10;52070:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;52070:27:0;;;;;;;;;;;;:102;;;;52183:15;;;;;:7;:15;;;;;52201:3;52183:21;;52215:43;;52191:6;52251;52215:27;:43::i;:::-;52307:6;-1:-1:-1;;;;;52274:62:0;52295:10;-1:-1:-1;;;;;52274:62:0;52287:6;-1:-1:-1;;;;;52274:62:0;;52315:12;52329:6;52274:62;;;;;;;:::i;54979:122::-;40032:10;;-1:-1:-1;;;;;40032:10:0;40018;:24;40010:33;;;;;;55062:5:::1;:31:::0;;-1:-1:-1;;;;;;55062:31:0::1;-1:-1:-1::0;;;;;55062:31:0;;;::::1;::::0;;;::::1;::::0;;54979:122::o;24105:38::-;;;;;;;;;;;;;;-1:-1:-1;;;24105:38:0;;;;:::o;36121:62::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;57687:344::-;57796:4;57824:9;57813:8;:20;-1:-1:-1;;;;;57851:15:0;;;;;;:7;:15;;;;;;;;:66;;;;-1:-1:-1;;;;;;57887:13:0;;;;;;;:5;:13;;;;;;;;:19;;;;;;;;;;:30;-1:-1:-1;57887:30:0;57851:66;:118;;;;-1:-1:-1;;;;;;57938:21:0;;;;;;:13;:21;;;;;;:31;-1:-1:-1;57938:31:0;57851:118;:172;;;;-1:-1:-1;;;;;;57998:17:0;;;;;;:9;:17;;;;;;58020:3;;57990:26;;:3;;:7;:26::i;:::-;:33;;57851:172;57844:179;57687:344;-1:-1:-1;;;;;;57687:344:0:o;36494:57::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;38810:27::-;;;;;;;;;;58223:727;10323:1;10929:7;;:19;;10921:63;;;;-1:-1:-1;;;10921:63:0;;;;;;;:::i;:::-;10323:1;11062:7;:18;;;58319:10:::1;58309:21:::0;;:9:::1;:21;::::0;;;;;::::1;;58308:22;58300:46;;;;-1:-1:-1::0;;;58300:46:0::1;;;;;;;:::i;:::-;58366:10;58357:20;::::0;;;:8:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;58357:29:0;::::1;::::0;;;;;;;;58389:3:::1;58357:35:::0;;58426:4:::1;58407:24;58403:354;;;58448:50;58464:10;58484:4;58491:6;58448:15;:50::i;:::-;58403:354;;;58546:40;::::0;-1:-1:-1;;;58546:40:0;;58531:12:::1;::::0;-1:-1:-1;;;;;58546:25:0;::::1;::::0;::::1;::::0;:40:::1;::::0;58580:4:::1;::::0;58546:40:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58531:55:::0;-1:-1:-1;58601:67:0::1;-1:-1:-1::0;;;;;58601:32:0;::::1;58634:10;58654:4;58661:6:::0;58601:32:::1;:67::i;:::-;58692:53;58737:7;58699;-1:-1:-1::0;;;;;58692:25:0::1;;58726:4;58692:40;;;;;;;;;;;;;;;:::i;:53::-;58683:62;;58403:354;;58816:10;58803:24;::::0;;;:12:::1;:24;::::0;;;;;;;-1:-1:-1;;;;;58803:33:0;::::1;::::0;;;;;;;;:45:::1;::::0;58841:6;58803:37:::1;:45::i;:::-;58780:10;58767:24;::::0;;;:12:::1;:24;::::0;;;;;;;-1:-1:-1;;;;;58767:33:0;::::1;::::0;;;;;;;;;:81;;;;58904:20;;;:8:::1;:20:::0;;;;;:29;;;;;;;;;;58864:78;;58780:10;;58864:78:::1;::::0;::::1;::::0;58890:12:::1;::::0;58935:6;;58864:78:::1;:::i;:::-;;;;;;;;-1:-1:-1::0;;10279:1:0;11241:7;:22;58223:727::o;61891:356::-;61968:10;61957:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;61957:31:0;;;;;;;;;61991:3;61957:37;;62005:36;;61980:7;;62034:6;62005:7;:36::i;:::-;62109:10;62092:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;62092:37:0;;;;;;;;;;:49;;62134:6;62092:41;:49::i;:::-;62069:10;62052:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;62052:37:0;;;;;;;;;;;:89;;;;62199:22;;;:10;:22;;;;;:31;;;;;;;;;;62157:82;;62069:10;;62157:82;;;;62185:12;;62232:6;;62157:82;:::i;:::-;;;;;;;;61891:356;;:::o;66896:147::-;66956:4;66973:40;66989:10;67001:3;67006:6;66973:15;:40::i;:::-;-1:-1:-1;67031:4:0;66896:147;;;;:::o;55266:118::-;40032:10;;-1:-1:-1;;;;;40032:10:0;40018;:24;40010:33;;;;;;55345:17:::1;:31:::0;;-1:-1:-1;;;;;;55345:31:0::1;-1:-1:-1::0;;;;;55345:31:0;;;::::1;::::0;;;::::1;::::0;;55266:118::o;36928:40::-;;;;;;;;;;;;;;;:::o;27765:220::-;-1:-1:-1;;;;;27869:23:0;;27830:4;27869:23;;;:14;:23;;;;;;;;27910:16;:67;;27976:1;27910:67;;;-1:-1:-1;;;;;27929:20:0;;;;;;:11;:20;;;;;;;;:38;-1:-1:-1;;27950:16:0;;27929:38;;;;;;;;27965:1;27929:44;;27910:67;27903:74;27765:220;-1:-1:-1;;;27765:220:0:o;42970:239::-;40032:10;;-1:-1:-1;;;;;40032:10:0;40018;:24;40010:33;;;;;;-1:-1:-1;;;;;43058:28:0;::::1;;::::0;;;:17:::1;:28;::::0;;;;;::::1;;43057:29;43049:65;;;;-1:-1:-1::0;;;43049:65:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;43125:28:0::1;;::::0;;;:17:::1;:28;::::0;;;;:35;;-1:-1:-1;;43125:35:0::1;43156:4;43125:35:::0;;::::1;::::0;;;43171:14:::1;:30:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;43171:30:0::1;::::0;;::::1;::::0;;42970:239::o;37621:90::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34307:25::-;;;;:::o;26960:604::-;27076:18;25339:65;27139:9;27150:5;27157:6;27107:57;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27097:68;;;;;;27076:89;;27176:14;27232:15;27249:10;27203:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27193:68;;;;;;27176:85;;27272:17;27292:26;27302:6;27310:1;27313;27316;27292:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27292:26:0;;-1:-1:-1;;27292:26:0;;;-1:-1:-1;;;;;;;27337:23:0;;27329:54;;;;-1:-1:-1;;;27329:54:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27411:17:0;;;;;;:6;:17;;;;;:19;;;;;;;;27402:28;;27394:61;;;;-1:-1:-1;;;27394:61:0;;;;;;;:::i;:::-;27481:6;27474:3;:13;;27466:48;;;;-1:-1:-1;;;27466:48:0;;;;;;;:::i;:::-;27525:31;27535:9;27546;27525;:31::i;:::-;26960:604;;;;;;;;;:::o;42484:332::-;40032:10;;-1:-1:-1;;;;;40032:10:0;40018;:24;40010:33;;;;;;-1:-1:-1;;;;;42575:9:0;::::1;;::::0;;;:4:::1;:9;::::0;;;;;::::1;;42567:41;;;;-1:-1:-1::0;;;42567:41:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;42649:12:0;::::1;;::::0;;;:7:::1;:12;::::0;;;;;;;42670:4:::1;42649:27:::0;;;;;;;;:39:::1;::::0;42681:6;42649:31:::1;:39::i;:::-;-1:-1:-1::0;;;;;42619:12:0;::::1;;::::0;;;:7:::1;:12;::::0;;;;;;;42640:4:::1;42619:27:::0;;;;;;;;:69;;;;42699:28:::1;::::0;42720:6;42699:5:::1;:28::i;:::-;42775:10;-1:-1:-1::0;;;;;42745:63:0::1;42770:3;-1:-1:-1::0;;;;;42745:63:0::1;42763:4;-1:-1:-1::0;;;;;42745:63:0::1;;42787:12;42801:6;42745:63;;;;;;;:::i;54092:221::-:0;40032:10;;-1:-1:-1;;;;;40032:10:0;40018;:24;40010:33;;;;;;-1:-1:-1;;;;;54164:9:0;::::1;;::::0;;;:4:::1;:9;::::0;;;;;::::1;;54163:10;54155:40;;;;-1:-1:-1::0;;;54155:40:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;54206:9:0;::::1;;::::0;;;:4:::1;:9;::::0;;;;;:16;;-1:-1:-1;;54206:16:0::1;54218:4;54206:16:::0;;::::1;::::0;;;54233:7:::1;:17:::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;-1:-1:-1;;;;;;54233:17:0::1;::::0;::::1;::::0;;54266:39;::::1;::::0;::::1;::::0;54280:12:::1;::::0;54294:10:::1;::::0;54266:39:::1;:::i;34628:20::-:0;;;;:::o;49213:92::-;40032:10;;-1:-1:-1;;;;;40032:10:0;40018;:24;40010:33;;;;;;49280:8:::1;::::0;49274:23:::1;::::0;-1:-1:-1;;;;;49280:8:0::1;49290:6:::0;49274:5:::1;:23::i;42049:241::-:0;40032:10;;-1:-1:-1;;;;;40032:10:0;40018;:24;40010:33;;;;;;-1:-1:-1;;;;;42147:12:0;::::1;;::::0;;;:5:::1;:12;::::0;;;;;:24:::1;::::0;42164:6;42147:16:::1;:24::i;:::-;-1:-1:-1::0;;;;;42132:12:0;::::1;;::::0;;;:5:::1;:12;::::0;;;;:39;42196:11:::1;::::0;:23:::1;::::0;42212:6;42196:15:::1;:23::i;:::-;42182:11;:37:::0;-1:-1:-1;;;;;42245:16:0;;::::1;;::::0;;;:9:::1;:16;::::0;;;;;42230:52:::1;::::0;42245:16:::1;::::0;42275:6;42230:14:::1;:52::i;:::-;42049:241:::0;;:::o;37033:39::-;;;;;;;;;;;;;:::o;65648:676::-;-1:-1:-1;;;;;65858:13:0;;65775:18;65858:13;;;:6;:13;;;;;;;;:15;;;;;;;;65806:78;;;;25536:86;;65834:5;;65841:7;;65850:6;;65858:15;65875:8;;65806:78;;:::i;:::-;;;;;;;;;;;;;65796:89;;;;;;65775:110;;65896:14;65952:15;65969:10;65923:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65913:68;;;;;;65896:85;;65992:17;66012:26;66022:6;66030:1;66033;66036;66012:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;66012:26:0;;-1:-1:-1;;66012:26:0;;;-1:-1:-1;;;;;;;66057:23:0;;66049:53;;;;-1:-1:-1;;;66049:53:0;;;;;;;:::i;:::-;66134:5;-1:-1:-1;;;;;66121:18:0;:9;-1:-1:-1;;;;;66121:18:0;;66113:51;;;;-1:-1:-1;;;66113:51:0;;;;;;;:::i;:::-;66190:8;66183:3;:15;;66175:43;;;;-1:-1:-1;;;66175:43:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;66231:17:0;;;;;;;:10;:17;;;;;;;;:26;;;;;;;;;;;;;;:35;;;66284:32;;;;;66260:6;;66284:32;:::i;:::-;;;;;;;;65648:676;;;;;;;;;;:::o;36622:37::-;;;;;;;;;;;;;:::o;63777:136::-;-1:-1:-1;;;;;63877:19:0;;;63853:4;63877:19;;;:10;:19;;;;;;;;:28;;;;;;;;;;;;;63777:136::o;41598:280::-;40032:10;;-1:-1:-1;;;;;40032:10:0;40018;:24;40010:33;;;;;;41678:31:::1;41688:5;41703:4;41678:9;:31::i;:::-;-1:-1:-1::0;;;;;41735:12:0;::::1;;::::0;;;:5:::1;:12;::::0;;;;;:24:::1;::::0;41752:6;41735:16:::1;:24::i;:::-;-1:-1:-1::0;;;;;41720:12:0;::::1;;::::0;;;:5:::1;:12;::::0;;;;:39;41784:11:::1;::::0;:23:::1;::::0;41800:6;41784:15:::1;:23::i;:::-;41770:11;:37:::0;-1:-1:-1;;;;;41845:16:0;;::::1;41841:1;41845:16:::0;;;:9:::1;:16;::::0;;;;;41818:52:::1;::::0;41845:16:::1;41863:6:::0;41818:14:::1;:52::i;36370:64::-:0;;;;;;;;;;;;;;;;;;;;;;;;:::o;37483:89::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36815:41::-;;;;;;;;;;;;;:::o;25293:111::-;25339:65;25293:111;:::o;39260:49::-;;;;;;;;;;;;;;;:::o;35807:33::-;35835:5;35807:33;:::o;55837:102::-;40032:10;;-1:-1:-1;;;;;40032:10:0;40018;:24;40010:33;;;;;;55911:8:::1;:20:::0;;-1:-1:-1;;;;;;55911:20:0::1;-1:-1:-1::0;;;;;55911:20:0;;;::::1;::::0;;;::::1;::::0;;55837:102::o;24647:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39051:32::-;;;-1:-1:-1;;;;;39051:32:0;;:::o;23901:28::-;;;-1:-1:-1;;;;;23901:28:0;;:::o;38383:41::-;;;;;;;;;;;;;;;:::o;64897:264::-;65019:10;64985:4;65002:28;;;:16;:28;;;;;;;;-1:-1:-1;;;;;65002:37:0;;;;;;;;;;;;:46;;;;;;;;;;;:55;;-1:-1:-1;;65002:55:0;;;;;;;65075:56;;64985:4;;65002:37;;65075:56;;;;65002:55;;65075:56;:::i;:::-;;;;;;;;-1:-1:-1;65149:4:0;64897:264;;;;;:::o;37993:88::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44509:98::-;44549:16;44585:14;44578:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44578:21:0;;;;;;;;;;;;;;;;;;;;;;44509:98;:::o;3286:148::-;3338:4;3364:5;;;3388:6;;;;3380:25;;;;-1:-1:-1;;;3380:25:0;;;;;;;:::i;4949:432::-;5001:4;5243:6;5239:47;;-1:-1:-1;5273:1:0;5266:8;;5239:47;5307:5;;;5311:1;5307;:5;:1;5331:5;;;;;:10;5323:29;;;;-1:-1:-1;;;5323:29:0;;;;;;;:::i;6556:103::-;6608:4;6632:19;6636:1;6639;6632:19;;;;;;;;;;;;;-1:-1:-1;;;6632:19:0;;;:3;:19::i;49950:293::-;-1:-1:-1;;;;;50019:17:0;;50011:49;;;;-1:-1:-1;;;50011:49:0;;;;;;;:::i;:::-;50087:51;;;;;;;;;;;-1:-1:-1;;;50087:51:0;;;;;;;;-1:-1:-1;;;;;50087:13:0;;-1:-1:-1;50087:13:0;;;:8;:13;;;;;;;;:51;;50105:6;;50087:17;:51::i;:::-;-1:-1:-1;;;;;50071:13:0;;;;;;:8;:13;;;;;:67;50163:11;;:23;;50179:6;50163:15;:23::i;:::-;50149:11;:37;50202:33;;50224:1;;-1:-1:-1;;;;;50202:33:0;;;-1:-1:-1;;;;;;;;;;;50202:33:0;;;50228:6;;50202:33;:::i;:::-;;;;;;;;49950:293;;:::o;4134:103::-;4186:4;4210:19;4214:1;4217;4210:19;;;;;;;;;;;;;-1:-1:-1;;;4210:19:0;;;:3;:19::i;59271:209::-;-1:-1:-1;;;;;59331:17:0;;;;;;:9;:17;;;;;;59327:146;;-1:-1:-1;;;;;59368:17:0;;;;;:9;:17;;;;;;;;59388:3;59368:23;;;;59404:10;:23;;;;;;;;;;;;-1:-1:-1;;;;;;59404:23:0;;;;;;;59440:7;:15;;;;;:21;59271:209::o;60133:301::-;-1:-1:-1;;;;;60205:15:0;;;;;;;:7;:15;;;;;;;:22;;-1:-1:-1;;60205:22:0;60223:4;60205:22;;;60261:12;:20;;;;;:29;;;;;;;;;;60238:53;;60244:7;;60213:6;;60238:5;:53::i;:::-;-1:-1:-1;;;;;60302:20:0;;;60334:1;60302:20;;;:12;:20;;;;;;;;:29;;;;;;;;;;;;:33;;;60403:13;;;:5;:13;;;;;:22;;;;;;;;;;60351:75;;60302:20;;60351:75;;;;60372:12;;60386:15;;60403:22;60351:75;:::i;4526:180::-;4606:4;4639:12;4631:6;;;;4623:29;;;;-1:-1:-1;;;4623:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;4672:5:0;;;4526:180::o;67911:435::-;-1:-1:-1;;;;;68003:17:0;;67995:59;;;;-1:-1:-1;;;67995:59:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;68073:17:0;;68065:59;;;;-1:-1:-1;;;68065:59:0;;;;;;;:::i;:::-;68153:61;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;68153:13:0;;-1:-1:-1;68153:13:0;;;:8;:13;;;;;;;;:61;;68171:6;;68153:17;:61::i;:::-;-1:-1:-1;;;;;68137:13:0;;;;;;;:8;:13;;;;;;;;:77;;;;68241:55;;;;;;;;;;;;;;;:13;;;;;;;;;;;:55;;68259:6;;68241:17;:55::i;:::-;-1:-1:-1;;;;;68225:13:0;;;;;;;:8;:13;;;;;;;:71;;;;68312:26;;;;;;-1:-1:-1;;;;;;;;;;;68312:26:0;;;68331:6;;68312:26;:::i;:::-;;;;;;;;67911:435;;;:::o;49504:438::-;49722:8;;-1:-1:-1;;;;;49722:8:0;49713:18;;;;:8;:18;;;;;;:30;-1:-1:-1;49713:30:0;49705:68;;;;-1:-1:-1;;;49705:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49800:13:0;;;;;;:8;:13;;;;;;:25;;49818:6;49800:17;:25::i;:::-;-1:-1:-1;;;;;49784:13:0;;;;;;;:8;:13;;;;;;:41;;;;49866:8;;;;;49857:18;;;;:30;;49880:6;49857:22;:30::i;:::-;49845:8;;;-1:-1:-1;;;;;49845:8:0;;;49836:18;;;;:8;:18;;;;;;;:51;;;;49912:8;;49903:31;;;;;;49912:8;;;;-1:-1:-1;;;;;;;;;;;49903:31:0;;;49927:6;;49903:31;:::i;52962:309::-;-1:-1:-1;;;;;53058:12:0;;;;;;:5;:12;;;;;;;;53079:4;53058:27;;;;;;;;:40;;53090:7;53058:31;:40::i;:::-;-1:-1:-1;;;;;53028:12:0;;;;;;:5;:12;;;;;;;;53049:4;53028:27;;;;;;;:70;53123:11;;:24;;53139:7;53123:15;:24::i;:::-;53109:11;:38;-1:-1:-1;;;;;53185:16:0;;;53181:1;53185:16;;;:9;:16;;;;;;53158:53;;53185:16;53203:7;53158:14;:53::i;:::-;53248:5;-1:-1:-1;;;;;53227:36:0;53236:10;-1:-1:-1;;;;;53227:36:0;-1:-1:-1;;;;;;;;;;;53255:7:0;53227:36;;;;;;:::i;17499:176::-;17582:85;17601:5;17631:23;;;17656:2;17660:5;17608:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;17608:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;17608:58:0;-1:-1:-1;;;;;;17608:58:0;;;;;;;;;;17582:18;:85::i;:::-;17499:176;;;:::o;17683:204::-;17784:95;17803:5;17833:27;;;17862:4;17868:2;17872:5;17810:68;;;;;;;;;;:::i;17784:95::-;17683:204;;;;:::o;29615:407::-;-1:-1:-1;;;;;29718:20:0;;;29692:23;29718:20;;;:9;:20;;;;;;;;;29794:5;:16;;;;;29819:4;29794:31;;;;;;;;29773:16;;;:5;:16;;;;;;29718:20;;;29692:23;;29773:53;;:16;:20;:53::i;:::-;-1:-1:-1;;;;;29837:20:0;;;;;;;:9;:20;;;;;;:32;;-1:-1:-1;;;;;;29837:32:0;;;;;;;;;;29887:54;;29749:77;;-1:-1:-1;29837:32:0;29887:54;;;;;;29837:20;29887:54;29954:60;29969:15;29986:9;29997:16;29954:14;:60::i;53607:324::-;-1:-1:-1;;;;;53714:12:0;;;;;;;:5;:12;;;;;;;;:21;;;;;;;;;;:34;;53740:7;53714:25;:34::i;:::-;-1:-1:-1;;;;;53690:12:0;;;;;;;:5;:12;;;;;;;;:21;;;;;;;;;;;;:58;;;;53782:4;53763:24;53759:163;;;53818:11;;:24;;53834:7;53818:15;:24::i;:::-;53804:11;:38;-1:-1:-1;;;;;53872:16:0;;;;;;;:9;:16;;;;;;53857:53;;53872:16;;53902:7;53857:14;:53::i;53279:320::-;-1:-1:-1;;;;;53384:12:0;;;;;;;:5;:12;;;;;;;;:21;;;;;;;;;;:34;;53410:7;53384:25;:34::i;:::-;-1:-1:-1;;;;;53360:12:0;;;;;;;:5;:12;;;;;;;;:21;;;;;;;;;;;;:58;;;;53452:4;53433:24;53429:163;;;53488:11;;:24;;53504:7;53488:15;:24::i;:::-;53474:11;:38;-1:-1:-1;;;;;53554:16:0;;;53550:1;53554:16;;;:9;:16;;;;;;53527:53;;53554:16;53572:7;30030:862;30133:6;-1:-1:-1;;;;;30123:16:0;:6;-1:-1:-1;;;;;30123:16:0;;;:30;;;;;30152:1;30143:6;:10;30123:30;30119:766;;;-1:-1:-1;;;;;30174:20:0;;;30170:357;;-1:-1:-1;;;;;30234:22:0;;30215:16;30234:22;;;:14;:22;;;;;;;;;30292:13;:60;;30351:1;30292:60;;;-1:-1:-1;;;;;30308:19:0;;;;;;:11;:19;;;;;;;;:34;-1:-1:-1;;30328:13:0;;30308:34;;;;;;;;30340:1;30308:40;;30292:60;30275:77;;30371:14;30388:47;30402:6;30388:47;;;;;;;;;;;;;-1:-1:-1;;;30388:47:0;;;:9;:13;;:47;;;;;:::i;:::-;30371:64;;30454:57;30471:6;30479:9;30490;30501;30454:16;:57::i;:::-;30170:357;;;;-1:-1:-1;;;;;30547:20:0;;;30543:331;;-1:-1:-1;;;;;30607:22:0;;30588:16;30607:22;;;:14;:22;;;;;;;;;30665:13;:60;;30724:1;30665:60;;;-1:-1:-1;;;;;30681:19:0;;;;;;:11;:19;;;;;;;;:34;-1:-1:-1;;30701:13:0;;30681:34;;;;;;;;30713:1;30681:40;;30665:60;30648:77;-1:-1:-1;30744:14:0;30761:21;30648:77;30775:6;30761:13;:21::i;:::-;30744:38;;30801:57;30818:6;30826:9;30837;30848;30801:16;:57::i;:::-;30543:331;;;30030:862;;;:::o;7147:333::-;7227:4;7326:12;7319:5;7311:28;;;;-1:-1:-1;;;7311:28:0;;;;;;;;:::i;:::-;;7350:6;7363:1;7359;:5;;;;;;;7147:333;-1:-1:-1;;;;;7147:333:0:o;3685:180::-;3765:4;3791:5;;;3823:12;3815:6;;;;3807:29;;;;-1:-1:-1;;;3807:29:0;;;;;;;;:::i;:::-;-1:-1:-1;3856:1:0;3685:180;-1:-1:-1;;;;3685:180:0:o;19511:1080::-;20115:27;20123:5;-1:-1:-1;;;;;20115:25:0;;:27::i;:::-;20107:60;;;;-1:-1:-1;;;20107:60:0;;;;;;;:::i;:::-;20241:12;20255:23;20290:5;-1:-1:-1;;;;;20282:19:0;20302:4;20282:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20240:67;;;;20326:7;20318:52;;;;-1:-1:-1;;;20318:52:0;;;;;;;:::i;:::-;20387:17;;:21;20383:201;;20529:10;20518:30;;;;;;;;;;;;:::i;:::-;20510:62;;;;-1:-1:-1;;;20510:62:0;;;;;;;:::i;30900:598::-;31014:18;31035:49;31042:12;31035:49;;;;;;;;;;;;;;;;;:6;:49::i;:::-;31014:70;;31114:1;31099:12;:16;;;:85;;;;-1:-1:-1;;;;;;31119:22:0;;;;;;:11;:22;;;;;;;;:65;-1:-1:-1;;31142:16:0;;31119:40;;;;;;;;;:50;:65;;;:50;;:65;31099:85;31095:329;;;-1:-1:-1;;;;;31199:22:0;;;;;;:11;:22;;;;;;;;:40;-1:-1:-1;;31222:16:0;;31199:40;;;;;;;;31237:1;31199:46;:57;;;31095:329;;;31324:33;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31285:22:0;;-1:-1:-1;31285:22:0;;;:11;:22;;;;;:36;;;;;;;;;;:72;;;;;;;-1:-1:-1;;31285:72:0;;;;;;;;;;;;;31370:25;;;:14;:25;;;;;;:44;;31398:16;;;31370:44;;;;;;;;;;31095:329;31460:9;-1:-1:-1;;;;;31439:51:0;;31471:8;31481;31439:51;;;;;;;:::i;:::-;;;;;;;;30900:598;;;;;:::o;14672:619::-;14732:4;15200:20;;15043:66;15240:23;;;;;;:42;;-1:-1:-1;15267:15:0;;;15240:42;15232:51;14672:619;-1:-1:-1;;;;14672:619:0:o;31506:161::-;31581:6;31619:12;31612:5;31608:9;;31600:32;;;;-1:-1:-1;;;31600:32:0;;;;;;;;:::i;:::-;-1:-1:-1;31657:1:0;;31506:161;-1:-1:-1;;31506:161:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;:::o;1141:126::-;1206:20;;48142:4;48131:16;;50152:33;;50142:2;;50199:1;;50189:12;1274:241;;1378:2;1366:9;1357:7;1353:23;1349:32;1346:2;;;-1:-1;;1384:12;1346:2;85:6;72:20;97:33;124:5;97:33;:::i;1522:366::-;;;1643:2;1631:9;1622:7;1618:23;1614:32;1611:2;;;-1:-1;;1649:12;1611:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;1701:63;-1:-1;1801:2;1840:22;;72:20;97:33;72:20;97:33;:::i;:::-;1809:63;;;;1605:283;;;;;:::o;1895:491::-;;;;2033:2;2021:9;2012:7;2008:23;2004:32;2001:2;;;-1:-1;;2039:12;2001:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;2091:63;-1:-1;2191:2;2230:22;;72:20;97:33;72:20;97:33;:::i;:::-;2199:63;-1:-1;2299:2;2338:22;;72:20;97:33;72:20;97:33;:::i;:::-;2307:63;;;;1995:391;;;;;:::o;2393:485::-;;;;2528:2;2516:9;2507:7;2503:23;2499:32;2496:2;;;-1:-1;;2534:12;2496:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;2586:63;-1:-1;2686:2;2725:22;;72:20;97:33;72:20;97:33;:::i;:::-;2694:63;-1:-1;2794:2;2830:22;;206:20;231:30;206:20;231:30;:::i;2885:491::-;;;;3023:2;3011:9;3002:7;2998:23;2994:32;2991:2;;;-1:-1;;3029:12;2991:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;3081:63;-1:-1;3181:2;3220:22;;72:20;97:33;72:20;97:33;:::i;:::-;2985:391;;3189:63;;-1:-1;;;3289:2;3328:22;;;;795:20;;2985:391::o;3383:743::-;;;;;;3555:3;3543:9;3534:7;3530:23;3526:33;3523:2;;;-1:-1;;3562:12;3523:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;3614:63;-1:-1;3714:2;3753:22;;72:20;97:33;72:20;97:33;:::i;:::-;3517:609;;3722:63;;-1:-1;;;;3822:2;3861:22;;795:20;;3930:2;3969:22;;795:20;;4038:3;4078:22;;;795:20;;-1:-1;3517:609::o;4133:991::-;;;;;;;;4337:3;4325:9;4316:7;4312:23;4308:33;4305:2;;;-1:-1;;4344:12;4305:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;4396:63;-1:-1;4496:2;4535:22;;72:20;97:33;72:20;97:33;:::i;:::-;4504:63;-1:-1;4604:2;4643:22;;795:20;;-1:-1;4712:2;4751:22;;795:20;;-1:-1;4839:51;4882:7;4820:3;4858:22;;4839:51;:::i;:::-;4829:61;;4927:3;4971:9;4967:22;475:20;4936:63;;5036:3;5080:9;5076:22;475:20;5045:63;;4299:825;;;;;;;;;;:::o;5131:366::-;;;5252:2;5240:9;5231:7;5227:23;5223:32;5220:2;;;-1:-1;;5258:12;5220:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;5310:63;5410:2;5449:22;;;;795:20;;-1:-1;;;5214:283::o;5504:617::-;;;;;5659:3;5647:9;5638:7;5634:23;5630:33;5627:2;;;-1:-1;;5666:12;5627:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;5718:63;5818:2;5857:22;;795:20;;-1:-1;5926:2;5965:22;;795:20;;6034:2;6073:22;795:20;;-1:-1;5621:500;-1:-1;;;5621:500::o;6128:865::-;;;;;;;6315:3;6303:9;6294:7;6290:23;6286:33;6283:2;;;-1:-1;;6322:12;6283:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;6374:63;-1:-1;6474:2;6513:22;;795:20;;-1:-1;6582:2;6621:22;;795:20;;-1:-1;6708:51;6751:7;6690:2;6727:22;;6708:51;:::i;:::-;6698:61;;6796:3;6840:9;6836:22;475:20;6805:63;;6905:3;6949:9;6945:22;475:20;6914:63;;6277:716;;;;;;;;:::o;7000:364::-;;;7120:2;7108:9;7099:7;7095:23;7091:32;7088:2;;;-1:-1;;7126:12;7088:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;7178:63;-1:-1;7278:2;7316:22;;1072:20;48048:10;48037:22;;50031:34;;50021:2;;-1:-1;;50069:12;7371:257;;7483:2;7471:9;7462:7;7458:23;7454:32;7451:2;;;-1:-1;;7489:12;7451:2;354:6;348:13;366:30;390:5;366:30;:::i;7929:241::-;;8033:2;8021:9;8012:7;8008:23;8004:32;8001:2;;;-1:-1;;8039:12;8001:2;-1:-1;795:20;;7995:175;-1:-1;7995:175::o;8177:263::-;;8292:2;8280:9;8271:7;8267:23;8263:32;8260:2;;;-1:-1;;8298:12;8260:2;-1:-1;943:13;;8254:186;-1:-1;8254:186::o;23428:271::-;;10415:5;46300:12;10526:52;10571:6;10566:3;10559:4;10552:5;10548:16;10526:52;:::i;:::-;10590:16;;;;;23562:137;-1:-1;;23562:137::o;23706:659::-;-1:-1;;;11758:87;;11743:1;11864:11;;10047:37;;;;24217:12;;;10047:37;24328:12;;;23951:414::o;24372:222::-;-1:-1;;;;;47831:54;;;;8839:37;;24499:2;24484:18;;24470:124::o;24601:357::-;-1:-1;;;;;47831:54;;;8839:37;;47831:54;;24944:2;24929:18;;8839:37;24764:2;24749:18;;24735:223::o;24965:444::-;-1:-1;;;;;47831:54;;;8839:37;;47831:54;;;;25312:2;25297:18;;8839:37;25395:2;25380:18;;10047:37;;;;25148:2;25133:18;;25119:290::o;25416:333::-;-1:-1;;;;;47831:54;;;;8839:37;;25735:2;25720:18;;10047:37;25571:2;25556:18;;25542:207::o;25756:370::-;25933:2;25947:47;;;46300:12;;25918:18;;;46832:19;;;25756:370;;25933:2;46154:14;;;;46872;;;;25756:370;9575:260;9600:6;9597:1;9594:13;9575:260;;;9661:13;;-1:-1;;;;;47831:54;8839:37;;46687:14;;;;8601;;;;48048:10;9615:9;9575:260;;;-1:-1;26000:116;;25904:222;-1:-1;;;;;;25904:222::o;26133:210::-;47543:13;;47536:21;9930:34;;26254:2;26239:18;;26225:118::o;26350:222::-;10047:37;;;26477:2;26462:18;;26448:124::o;26579:780::-;10047:37;;;-1:-1;;;;;47831:54;;;27011:2;26996:18;;8839:37;47831:54;;;;27094:2;27079:18;;8839:37;27177:2;27162:18;;10047:37;27260:3;27245:19;;10047:37;;;;47842:42;27329:19;;10047:37;26846:3;26831:19;;26817:542::o;27366:556::-;10047:37;;;-1:-1;;;;;47831:54;;;;27742:2;27727:18;;8839:37;27825:2;27810:18;;10047:37;27908:2;27893:18;;10047:37;27577:3;27562:19;;27548:374::o;27929:548::-;10047:37;;;48142:4;48131:16;;;;28297:2;28282:18;;23381:35;28380:2;28365:18;;10047:37;28463:2;28448:18;;10047:37;28136:3;28121:19;;28107:370::o;28759:310::-;;28906:2;28927:17;28920:47;10942:5;46300:12;46844:6;28906:2;28895:9;28891:18;46832:19;11036:52;11081:6;46872:14;28895:9;46872:14;28906:2;11062:5;11058:16;11036:52;:::i;:::-;49292:7;49276:14;-1:-1;;49272:28;11100:39;;;;46872:14;11100:39;;28877:192;-1:-1;;28877:192::o;29076:416::-;29276:2;29290:47;;;11376:2;29261:18;;;46832:19;-1:-1;;;46872:14;;;11392:45;11456:12;;;29247:245::o;29499:416::-;29699:2;29713:47;;;12114:2;29684:18;;;46832:19;12150:27;46872:14;;;12130:48;12197:12;;;29670:245::o;29922:416::-;30122:2;30136:47;;;12448:1;30107:18;;;46832:19;-1:-1;;;46872:14;;;12463:30;12512:12;;;30093:245::o;30345:416::-;30545:2;30559:47;;;30530:18;;;46832:19;12799:34;46872:14;;;12779:55;12853:12;;;30516:245::o;30768:416::-;30968:2;30982:47;;;13104:2;30953:18;;;46832:19;-1:-1;;;46872:14;;;13120:42;13181:12;;;30939:245::o;31191:416::-;31391:2;31405:47;;;13432:2;31376:18;;;46832:19;-1:-1;;;46872:14;;;13448:43;13510:12;;;31362:245::o;31614:416::-;31814:2;31828:47;;;13761:2;31799:18;;;46832:19;-1:-1;;;46872:14;;;13777:38;13834:12;;;31785:245::o;32037:416::-;32237:2;32251:47;;;14085:2;32222:18;;;46832:19;-1:-1;;;46872:14;;;14101:41;14161:12;;;32208:245::o;32460:416::-;32660:2;32674:47;;;14412:2;32645:18;;;46832:19;-1:-1;;;46872:14;;;14428:43;14490:12;;;32631:245::o;32883:416::-;33083:2;33097:47;;;14741:2;33068:18;;;46832:19;-1:-1;;;46872:14;;;14757:42;14818:12;;;33054:245::o;33306:416::-;33506:2;33520:47;;;15069:2;33491:18;;;46832:19;-1:-1;;;46872:14;;;15085:42;15146:12;;;33477:245::o;33729:416::-;33929:2;33943:47;;;15397:2;33914:18;;;46832:19;15433:25;46872:14;;;15413:46;15478:12;;;33900:245::o;34152:416::-;34352:2;34366:47;;;15729:2;34337:18;;;46832:19;15765:34;46872:14;;;15745:55;-1:-1;;;15820:12;;;15813:34;15866:12;;;34323:245::o;34575:416::-;34775:2;34789:47;;;16117:2;34760:18;;;46832:19;-1:-1;;;46872:14;;;16133:43;16195:12;;;34746:245::o;34998:416::-;35198:2;35212:47;;;16446:1;35183:18;;;46832:19;-1:-1;;;46872:14;;;16461:29;16509:12;;;35169:245::o;35421:416::-;35621:2;35635:47;;;16760:2;35606:18;;;46832:19;-1:-1;;;46872:14;;;16776:42;16837:12;;;35592:245::o;35844:416::-;36044:2;36058:47;;;17088:1;36029:18;;;46832:19;-1:-1;;;46872:14;;;17103:31;17153:12;;;36015:245::o;36267:416::-;36467:2;36481:47;;;17404:2;36452:18;;;46832:19;-1:-1;;;46872:14;;;17420:43;17482:12;;;36438:245::o;36690:416::-;36890:2;36904:47;;;17733:1;36875:18;;;46832:19;-1:-1;;;46872:14;;;17748:29;17796:12;;;36861:245::o;37113:416::-;37313:2;37327:47;;;18047:2;37298:18;;;46832:19;-1:-1;;;46872:14;;;18063:45;18127:12;;;37284:245::o;37536:416::-;37736:2;37750:47;;;18378:2;37721:18;;;46832:19;18414:31;46872:14;;;18394:52;18465:12;;;37707:245::o;37959:416::-;38159:2;38173:47;;;18716:2;38144:18;;;46832:19;-1:-1;;;46872:14;;;18732:40;18791:12;;;38130:245::o;38382:416::-;38582:2;38596:47;;;19042:2;38567:18;;;46832:19;-1:-1;;;46872:14;;;19058:40;19117:12;;;38553:245::o;38805:416::-;39005:2;39019:47;;;19368:2;38990:18;;;46832:19;-1:-1;;;46872:14;;;19384:45;19448:12;;;38976:245::o;39228:416::-;39428:2;39442:47;;;19699:2;39413:18;;;46832:19;-1:-1;;;46872:14;;;19715:41;19775:12;;;39399:245::o;39651:416::-;39851:2;39865:47;;;20026:2;39836:18;;;46832:19;-1:-1;;;46872:14;;;20042:40;20101:12;;;39822:245::o;40074:416::-;40274:2;40288:47;;;20352:2;40259:18;;;46832:19;-1:-1;;;46872:14;;;20368:34;20421:12;;;40245:245::o;40497:416::-;40697:2;40711:47;;;20672:2;40682:18;;;46832:19;-1:-1;;;46872:14;;;20688:38;20745:12;;;40668:245::o;40920:416::-;41120:2;41134:47;;;20996:2;41105:18;;;46832:19;21032:26;46872:14;;;21012:47;21078:12;;;41091:245::o;41343:416::-;41543:2;41557:47;;;21329:2;41528:18;;;46832:19;-1:-1;;;46872:14;;;21345:36;21400:12;;;41514:245::o;41766:416::-;41966:2;41980:47;;;21651:2;41951:18;;;46832:19;21687:33;46872:14;;;21667:54;21740:12;;;41937:245::o;42189:416::-;42389:2;42403:47;;;21991:2;42374:18;;;46832:19;-1:-1;;;46872:14;;;22007:37;22063:12;;;42360:245::o;42612:416::-;42812:2;42826:47;;;22314:2;42797:18;;;46832:19;22350:31;46872:14;;;22330:52;22401:12;;;42783:245::o;43035:416::-;43235:2;43249:47;;;22652:2;43220:18;;;46832:19;-1:-1;;;46872:14;;;22668:40;22727:12;;;43206:245::o;43458:416::-;43658:2;43672:47;;;22978:2;43643:18;;;46832:19;-1:-1;;;46872:14;;;22994:38;23051:12;;;43629:245::o;44110:349::-;10047:37;;;-1:-1;;;;;47831:54;44445:2;44430:18;;8708:58;44273:2;44258:18;;44244:215::o;44466:333::-;10047:37;;;44785:2;44770:18;;10047:37;44621:2;44606:18;;44592:207::o;44806:444::-;10047:37;;;45153:2;45138:18;;10047:37;;;;45236:2;45221:18;;10047:37;44989:2;44974:18;;44960:290::o;45257:218::-;48048:10;48037:22;;;;23266:36;;45382:2;45367:18;;45353:122::o;45482:329::-;48048:10;48037:22;;;;23266:36;;45797:2;45782:18;;10047:37;45635:2;45620:18;;45606:205::o;45818:214::-;48142:4;48131:16;;;;23381:35;;45941:2;45926:18;;45912:120::o;48851:268::-;48916:1;48923:101;48937:6;48934:1;48931:13;48923:101;;;49004:11;;;48998:18;48985:11;;;48978:39;48959:2;48952:10;48923:101;;;49039:6;49036:1;49033:13;49030:2;;;-1:-1;;48916:1;49086:16;;49079:27;48900:219::o;49313:117::-;-1:-1;;;;;47831:54;;49372:35;;49362:2;;49421:1;;49411:12;49437:111;49518:5;47543:13;47536:21;49496:5;49493:32;49483:2;;49539:1;;49529:12

Swarm Source

ipfs://7f0a09b5db53377fc3d552fce89dd72d48c63a7bbdbec497aa284add82991891

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

OVERVIEW

Lock3r Network is a decentralized keeper network for projects that need external devops and for external teams to find locker jobs - a fundamental example of a MaaS (Maintenance as a Service) protocol.

Validator Index Block Amount
View All Withdrawals

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

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