POL Price: $0.612563 (+4.12%)
 

Overview

Max Total Supply

1,750,000,000 CARR

Holders

1,387

Total Transfers

-

Market

Price

$0.00 @ 0.000000 POL

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Where crypto meets the road. Practical blockchain solutions for buying, selling, and owning a car. Where crypto meets the road.

Contract Source Code Verified (Exact Match)

Contract Name:
CARR

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2022-07-01
*/

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // 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 (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @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) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @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].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @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);
}

// File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;



/**
 * @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 IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    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));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    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'
        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) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _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. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @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].
 */
abstract 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() {
        _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 making 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;
    }
}

// File: contracts/CARR.sol


// Carnomaly
pragma solidity >=0.8.9;




/**
 * @title ERC20Basic
 * @dev Simpler version of ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/179
 */
abstract contract ERC20Basic {
  function totalSupply() public virtual returns (uint256);
  function balanceOf(address who) public virtual returns (uint256);
  function transfer(address to, uint256 value) public virtual returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
}

/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
abstract contract ERC20 is ERC20Basic {
  function allowance(address owner, address spender) public virtual returns (uint256);
  function approve(address spender, uint256 value) public virtual returns (bool);
  event Approval(address indexed owner, address indexed spender, uint256 value);
}

/**
 * @title Utility
 * @dev Utility functions for Staking functionality
 */
library Utility {
    /*
     * Minimum value signed 64.64-bit fixed point number may have.
     */
    int128 private constant MIN_64x64 = -0x80000000000000000000000000000000;

    /*
     * Maximum value signed 64.64-bit fixed point number may have.
     */
    int128 private constant MAX_64x64 = 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;

    /**
     * Convert unsigned 256-bit integer number into signed 64.64-bit fixed point
     * number.  Revert on overflow.
     *
     * @param x unsigned 256-bit integer number
     * @return signed 64.64-bit fixed point number
     */
    function fromUInt(uint256 x) internal pure returns (int128) {
        unchecked {
            require(x <= 0x7FFFFFFFFFFFFFFF);
            return int128(int256(x << 64));
        }
    }

    /**
     * Custom function for calculating compound interest
     */
    function compound(uint256 principal, uint256 ratio, uint256 n) internal pure returns (uint256) {
        return mulu(pow(add(fromUInt(1), divu(ratio, 10**18)), n), principal);
    }

    /**
     * Calculate x + y.  Revert on overflow.
     *
     * @param x signed 64.64-bit fixed point number
     * @param y signed 64.64-bit fixed point number
     * @return signed 64.64-bit fixed point number
     */
    function add(int128 x, int128 y) internal pure returns (int128) {
        unchecked {
            int256 result = int256(x) + y;
            require(result >= MIN_64x64 && result <= MAX_64x64);
            return int128(result);
        }
    }

    /**
     * Calculate x * y rounding down, where x is signed 64.64 fixed point number
     * and y is unsigned 256-bit integer number.  Revert on overflow.
     *
     * @param x signed 64.64 fixed point number
     * @param y unsigned 256-bit integer number
     * @return unsigned 256-bit integer number
     */
    function mulu(int128 x, uint256 y) internal pure returns (uint256) {
        unchecked {
            if (y == 0) return 0;

            require(x >= 0);

            uint256 lo = (uint256(int256(x)) *
                (y & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)) >> 64;
            uint256 hi = uint256(int256(x)) * (y >> 128);

            require(hi <= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF);
            hi <<= 64;

            require(
                hi <=
                    0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -
                        lo
            );
            return hi + lo;
        }
    }

    /**
     * Calculate x / y rounding towards zero, where x and y are unsigned 256-bit
     * integer numbers.  Revert on overflow or when y is zero.
     *
     * @param x unsigned 256-bit integer number
     * @param y unsigned 256-bit integer number
     * @return signed 64.64-bit fixed point number
     */
    function divu(uint256 x, uint256 y) internal pure returns (int128) {
        unchecked {
            require(y != 0);
            uint128 result = divuu(x, y);
            require(result <= uint128(MAX_64x64));
            return int128(result);
        }
    }

    /**
     * Calculate x^y assuming 0^0 is 1, where x is signed 64.64 fixed point number
     * and y is unsigned 256-bit integer number.  Revert on overflow.
     *
     * @param x signed 64.64-bit fixed point number
     * @param y uint256 value
     * @return signed 64.64-bit fixed point number
     */
    function pow(int128 x, uint256 y) internal pure returns (int128) {
        unchecked {
            bool negative = x < 0 && y & 1 == 1;

            uint256 absX = uint128(x < 0 ? -x : x);
            uint256 absResult;
            absResult = 0x100000000000000000000000000000000;

            if (absX <= 0x10000000000000000) {
                absX <<= 63;
                while (y != 0) {
                    if (y & 0x1 != 0) {
                        absResult = (absResult * absX) >> 127;
                    }
                    absX = (absX * absX) >> 127;

                    if (y & 0x2 != 0) {
                        absResult = (absResult * absX) >> 127;
                    }
                    absX = (absX * absX) >> 127;

                    if (y & 0x4 != 0) {
                        absResult = (absResult * absX) >> 127;
                    }
                    absX = (absX * absX) >> 127;

                    if (y & 0x8 != 0) {
                        absResult = (absResult * absX) >> 127;
                    }
                    absX = (absX * absX) >> 127;

                    y >>= 4;
                }

                absResult >>= 64;
            } else {
                uint256 absXShift = 63;
                if (absX < 0x1000000000000000000000000) {
                    absX <<= 32;
                    absXShift -= 32;
                }
                if (absX < 0x10000000000000000000000000000) {
                    absX <<= 16;
                    absXShift -= 16;
                }
                if (absX < 0x1000000000000000000000000000000) {
                    absX <<= 8;
                    absXShift -= 8;
                }
                if (absX < 0x10000000000000000000000000000000) {
                    absX <<= 4;
                    absXShift -= 4;
                }
                if (absX < 0x40000000000000000000000000000000) {
                    absX <<= 2;
                    absXShift -= 2;
                }
                if (absX < 0x80000000000000000000000000000000) {
                    absX <<= 1;
                    absXShift -= 1;
                }

                uint256 resultShift = 0;
                while (y != 0) {
                    require(absXShift < 64);

                    if (y & 0x1 != 0) {
                        absResult = (absResult * absX) >> 127;
                        resultShift += absXShift;
                        if (absResult > 0x100000000000000000000000000000000) {
                            absResult >>= 1;
                            resultShift += 1;
                        }
                    }
                    absX = (absX * absX) >> 127;
                    absXShift <<= 1;
                    if (absX >= 0x100000000000000000000000000000000) {
                        absX >>= 1;
                        absXShift += 1;
                    }

                    y >>= 1;
                }

                require(resultShift < 64);
                absResult >>= 64 - resultShift;
            }
            int256 result = negative ? -int256(absResult) : int256(absResult);
            require(result >= MIN_64x64 && result <= MAX_64x64);
            return int128(result);
        }
    }

    /**
     * Calculate x / y rounding towards zero, where x and y are unsigned 256-bit
     * integer numbers.  Revert on overflow or when y is zero.
     *
     * @param x unsigned 256-bit integer number
     * @param y unsigned 256-bit integer number
     * @return unsigned 64.64-bit fixed point number
     */
    function divuu(uint256 x, uint256 y) private pure returns (uint128) {
        unchecked {
            require(y != 0);

            uint256 result;

            if (x <= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
                result = (x << 64) / y;
            else {
                uint256 msb = 192;
                uint256 xc = x >> 192;
                if (xc >= 0x100000000) {
                    xc >>= 32;
                    msb += 32;
                }
                if (xc >= 0x10000) {
                    xc >>= 16;
                    msb += 16;
                }
                if (xc >= 0x100) {
                    xc >>= 8;
                    msb += 8;
                }
                if (xc >= 0x10) {
                    xc >>= 4;
                    msb += 4;
                }
                if (xc >= 0x4) {
                    xc >>= 2;
                    msb += 2;
                }
                if (xc >= 0x2) msb += 1; // No need to shift xc anymore

                result = (x << (255 - msb)) / (((y - 1) >> (msb - 191)) + 1);
                require(result <= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF);

                uint256 hi = result * (y >> 128);
                uint256 lo = result * (y & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF);

                uint256 xh = x >> 192;
                uint256 xl = x << 64;

                if (xl < lo) xh -= 1;
                xl -= lo; // We rely on overflow behavior here
                lo = hi << 128;
                if (xl < lo) xh -= 1;
                xl -= lo; // We rely on overflow behavior here

                assert(xh == hi >> 128);

                result += xl / y;
            }

            require(result <= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF);
            return uint128(result);
        }
    }
}

/**
 * @title Basic token
 * @dev Basic version of StandardToken, with no allowances.
 */
abstract contract BasicToken is ERC20Basic {
  // declare SafeMath libary usage for uint256
  using SafeMath for uint256;

  mapping(address => uint256) balances;
  uint256 totalSupply_;

  /**
   * @dev total number of tokens in existence.
   */
  function totalSupply() public view override returns (uint256) {
    return totalSupply_;
  }

  /**
   * @dev transfer token for a specified address
   * @param _to The address to transfer to.
   * @param _value The amount to be transferred.
   */
  function transfer(address _to, uint256 _value) public override returns (bool) {
    require(_to != address(0));
    require(_value <= balances[msg.sender]);

    balances[msg.sender] = balances[msg.sender].sub(_value);
    balances[_to] = balances[_to].add(_value);
    emit Transfer(msg.sender, _to, _value);
    return true;
  }

  /**
   * @dev Gets the balance of the specified address.
   * @param _owner The address to query the the balance of.
   * @return An uint256 representing the amount owned by the passed address.
   */
  function balanceOf(address _owner) public view override returns (uint256) {
    return balances[_owner];
  }
}

/**
 * @title Standard ERC20 token
 *
 * @dev Implementation of the basic standard token.
 * @dev https://github.com/ethereum/EIPs/issues/20
 * @dev Based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
 */
contract StandardToken is ERC20, BasicToken {
  // declare SafeMath libary usage for uint256
  using SafeMath for uint256;
  mapping (address => mapping (address => uint256)) internal allowed;

  /**
   * @dev Transfer tokens from one address to another.
   * @param _from address The address which you want to send tokens from.
   * @param _to address The address which you want to transfer to.
   * @param _value uint256 the amount of tokens to be transferred.
   */
  function transferFrom(
    address _from,
    address _to,
    uint256 _value
  )
    public
    virtual
    returns (bool)
  {
    require(_to != address(0));
    require(_value <= balances[_from]);
    require(_value <= allowed[_from][msg.sender]);

    balances[_from] = balances[_from].sub(_value);
    balances[_to] = balances[_to].add(_value);
    allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
    emit Transfer(_from, _to, _value);
    return true;
  }

  /**
   * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
   *
   * 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
   * @param _spender The address which will spend the funds.
   * @param _value The amount of tokens to be spent.
   */
  function approve(address _spender, uint256 _value) public override returns (bool) {
    allowed[msg.sender][_spender] = _value;
    emit Approval(msg.sender, _spender, _value);
    return true;
  }

  /**
   * @dev Function to check the amount of tokens that an owner allowed to a spender.
   * @param _owner address The address which owns the funds.
   * @param _spender address The address which will spend the funds.
   * @return A uint256 specifying the amount of tokens still available for the spender.
   */
  function allowance(
    address _owner,
    address _spender
   )
    public
    view
    override
    returns (uint256)
  {
    return allowed[_owner][_spender];
  }

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

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

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

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

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

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

  /**
   * @dev Function that gets the contract owner address.
   * @return address of owner.
   */
  function isOwner() public view returns (address) {
      return owner;
  }

  /**
   * @dev Allows the current owner to relinquish control of the contract.
   */
  function renounceOwnership() public onlyOwner {
    emit OwnershipRenounced(owner);
    owner = address(0);
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function transferOwnership(address _newOwner) public onlyOwner {
    _transferOwnership(_newOwner);
  }

  /**
   * @dev Transfers control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function _transferOwnership(address _newOwner) internal {
    require(_newOwner != address(0));
    emit OwnershipTransferred(owner, _newOwner);
    owner = _newOwner;
  }
}

/**
 * @title Mintable token
 * @dev Simple ERC20 Token example, with mintable token creation
 * @dev Issue: * https://github.com/OpenZeppelin/openzeppelin-solidity/issues/120
 * Based on code by TokenMarketNet: https://github.com/TokenMarketNet/ico/blob/master/contracts/MintableToken.sol
 */
contract MintableToken is StandardToken, Ownable {
  // declare SafeMath libary usage for uint256
  using SafeMath for uint256;

  event Mint(address indexed to, uint256 amount);
  event MintFinished();

  bool public mintingFinished = false;

  /**
   * @dev Function to check if miniting is possible.
   */
  modifier canMint() {
    require(!mintingFinished);
    _;
  }

  /**
   * @dev Function used to check if sender address has permission to mint tokens.
   */
  modifier hasMintPermission() {
    require(msg.sender == owner);
    _;
  }

  /**
   * @dev Function to check if token cap has been reached.
   */
  modifier mintCap() {
    require(totalSupply_ <= 1750000000000000000000000000, "Token cap reached");
    _;
  }

  /**
   * @dev Get the amount of tokens availible until cap.
   * @return number representing remaining amount.
   */
  function tokensUntilCap() public view returns (uint256) {
      uint256 remains = 1750000000000000000000000000 - totalSupply_;
      return remains;
  }

  /**
   * @dev Function to mint tokens
   * @param _to The address that will receive the minted tokens.
   * @param _amount The amount of tokens to mint.
   * @return A boolean that indicates if the operation was successful.
   */
  function mint(
    address _to,
    uint256 _amount
  )
    hasMintPermission
    canMint
    mintCap
    public
    returns (bool)
  {
    uint256 tknCap = tokensUntilCap();
    require(_amount <= tknCap);
    totalSupply_ = totalSupply_.add(_amount);
    balances[_to] = balances[_to].add(_amount);
    emit Mint(_to, _amount);
    emit Transfer(address(0), _to, _amount);
    return true;
  }

  /**
   * @dev Function to stop minting new tokens.
   * @return True if the operation was successful.
   */
  function finishMinting() onlyOwner canMint public returns (bool) {
    mintingFinished = true;
    emit MintFinished();
    return true;
  }
}

/**
 * @title Staking
 * @dev Contract that enables staking functionality.
 */
contract Staking is ReentrancyGuard, MintableToken {
    using SafeERC20 for IERC20;

    IERC20 public stakingToken;
    uint256 private _totalStaked;
    uint256 private _periodFinish;
    uint256 private _ratio = 6341958397;
    address[] public _stakers;
    mapping(address => uint256) private _stake;
    mapping(address => uint256) private _updated;

    event Recovered(address token, uint256 amount);
    event Staked(address indexed user, uint256 amount);
    event Withdrawn(address indexed user, uint256 amount);
    event StakingEnds(uint256 newTimestamp);

    constructor() {
        stakingToken = IERC20(address(this));
        _periodFinish = block.timestamp + 31536000;
        emit StakingEnds(_periodFinish);
    }

    /**
     * @dev Function utility for timestamps and rewards calculations/tracking.
     * @param addr address of staking wallet.
     */
    modifier updateRewards(address addr) {
        uint256 newRewards = _getNewRewards(addr);
        _updated[addr] = _lastTimeRewardApplicable();
        if (newRewards > 0) {
            _stake[addr] += newRewards;
            _totalStaked += newRewards;
            emit Staked(addr, newRewards);
        }
        _;
    }

    /**
     * @dev Function used to check if activity is within the contract's staking period.
     */
    modifier inStakingPeriod() {
        require(block.timestamp <= _periodFinish, "Staking period has ended");
        _;
    }

    /**
     * @dev Function to check if an address has tokens.
     * @param addr address of staking wallet.
     */
    modifier hasBalance(address addr) {
        require(_stake[addr] > 0, "No staked balance");
        _;
    }

    /**
     * @dev Function to check current staking rate/ratio.
     * @return number representing rate/ratio.
     */
    function getRate() public view returns (uint256) {
        return _ratio;
    }

    /**
     * @dev Function to update rate of rewards.
     * @param rate number representing new rate.
     */
    function setRate(uint256 rate) external onlyOwner {
        // _ratio = 6341958397; // 20% apr : This represents === Rate / Time * 10^18 === .20 / 31536000 * 10^18
        require(rate > 0);
        _ratio = rate;
    }

    /**
     * @dev Function to get total count of staked tokens.
     * @return number for amount of total staked within contract.
     */
    function totalSupplyStaked() external view returns (uint256) {
        return _totalStaked;
    }

    /**
     * @dev Function to get balance staked of specified address.
     * @param _user The address specified.
     * @return A number for the address' staked amount.
     */
    function balanceOfStaked(address _user) external view returns (uint256) {
        return _stake[_user];
    }

    /**
     * @dev Function to get block time unless the staking period is over.
     * @return A number/epoch representing time or the _periodFinish value.
     */
    function _lastTimeRewardApplicable() internal view returns (uint256) {
        return
            block.timestamp < _periodFinish ? block.timestamp : _periodFinish;
    }

    /**
     * @dev Function to get cumulative stake amount.
     * @return A number for total stake with rewards included.
     */
    function stakedSender() external view hasBalance(msg.sender) returns (uint256) {
        return _stake[msg.sender] + _getNewRewards(msg.sender);
    }

    /**
     * @dev Function to stake desired amount of tokens.
     * @param amount number of tokens desired to stake.
     */
    function stake(uint256 amount)
        external
        nonReentrant
        inStakingPeriod
        updateRewards(msg.sender)
    {
        _totalStaked += amount;
        _stake[msg.sender] += amount;
        _stakers.push(msg.sender);
        require(transfer(address(this), amount), "Token Transfer Failed");
        emit Staked(msg.sender, amount);
    }

    /**
     * @dev Function to stake tokens on another's behalf, usable by owner.
     * @param from address from where the tokens are being staked from.
     * @param amount number of tokens to be staked.
     */
    function migrationStake(address from, uint256 amount) 
        public
        onlyOwner
        nonReentrant
        inStakingPeriod
        {
        require(amount > 0, "You must specify a positive amount of money");

        _totalStaked += amount;
        _stake[from] += amount;
        _stakers.push(from);
        _updated[from] = _lastTimeRewardApplicable();
    }

    /**
     * @dev Function to take out specifiec amount staked.
     * @param amount amount of tokens to withdraw.
     */
    function withdraw(uint256 amount)
        public
        nonReentrant
        hasBalance(msg.sender)
        updateRewards(msg.sender)
    {
        require(amount > 0, "You must specify a positive amount of money");
        require(_stake[msg.sender] >= amount, "Not enough tokens");
        _withdraw(msg.sender, amount);
    }

    /**
     * @dev Function to take out amount staked.
     */
    function withdrawAll()
        public
        nonReentrant
        hasBalance(msg.sender)
        updateRewards(msg.sender)
    {
        _withdraw(msg.sender, _stake[msg.sender]);
    }

    /**
     * @dev Function to take out specifiec amount staked.
     * @param to address the staked tokens are sent to.
     * @param amount the amount of staked tokens taken out.
     */
    function _withdraw(address to, uint256 amount)
        private
        hasBalance(to)
        updateRewards(msg.sender)
    {
        require(amount <= _totalStaked, "Not enough tokens");
        _totalStaked -= amount;
        _stake[to] -= amount;
        require(stakingToken.transfer(to, amount), "Token Transfer Failed");
        emit Withdrawn(to, amount);
    }

    /**
     * @dev Function to to check staking rewards of specified address.
     * @param addr address of specified wallet.
     * @return number representing the stake reward.
     */
    function rewardsOf(address addr) public view returns (uint256) {
        return _getNewRewards(addr);
    }

    /**
     * @dev Function to check staking rewards of specified address.
     * @param addr address of specified wallet.
     * @return number representing the stake reward.
     */
    function _getNewRewards(address addr) private view returns (uint256) {
        uint256 etime = _lastTimeRewardApplicable() - _updated[addr];
        if (etime == 0 || _stake[addr] == 0) {
            return 0;
        }
        uint256 reward = Utility.compound(_stake[addr], _ratio, etime);
        return reward - _stake[addr];
    }

    /**
     * @dev Function that distributes/calculates staking rewards based on vector inputs.
     * @param addresses array/list of addresses.
     * @param amounts array/list of corresponding staking amounts.
     * @param timeElapsed array/list of epoch timestamps use for rewards calculation.
     */
    function distributeRewards(address[] memory addresses, uint256[] memory amounts, uint256[] memory timeElapsed) public onlyOwner {
        for(uint i = 0;i < addresses.length; i++) {
            address _address = addresses[i];
            uint256 _amount = amounts[i];
            _totalStaked += _amount;
            _stake[_address] += _amount;
            _stakers.push(_address);
            _updated[_address] = timeElapsed[i];
        }
    }

    /**
     * @dev Function that sets the last day for staking.
     * @param _finish number/epoch used to set finishing time.
     */
    function setFinish(uint256 _finish) external onlyOwner {
        _periodFinish = _finish;
        emit StakingEnds(_finish);
    }

    /**
     * @dev Function to recover tokens.
     * @param amt amount to be recovered.
     */
    function recoverERC20(uint256 amt) public onlyOwner {
        IERC20 theToken = IERC20(address(this));
        require(theToken.transfer(msg.sender, amt), "Token Transfer Failed");
        emit Recovered(address(this), amt);
    }

    /**
     * @dev Function that gets the amount of tokens needed.
     * @return number representing token amount.
     */
    function tokensNeeded() public view returns(uint256) {
        address[] memory counted;
        uint256 needed = _totalStaked;
        uint stakersLen = _stakers.length;
        for(uint i=0; i < stakersLen; i++) {
            bool found = false;
            uint countedLen = counted.length;
            for(uint j=0; j < countedLen; j++) {
                if (counted[j] == _stakers[i]) {
                    found = true;
                }
            }
            if (found) continue;
            needed += _stake[_stakers[i]] + rewardsOf(_stakers[i]);
        }
        return needed;
    }
}

contract FreezableToken is StandardToken {
    // declare SafeMath libary usage for uint256
    using SafeMath for uint256;

    // freezing chains
    mapping (bytes32 => uint64) internal chains;
    // freezing amounts for each chain
    mapping (bytes32 => uint) internal freezings;
    // total freezing balance per address
    mapping (address => uint) internal freezingBalance;

    event Freezed(address indexed to, uint64 release, uint amount);
    event Released(address indexed owner, uint amount);

    /**
     * @dev Gets the balance of the specified address include freezing tokens.
     * @param _owner The address to query the the balance of.
     * @return balance uint256 - representing the amount owned by the passed address.
     */
    function balanceOf(address _owner) public view override returns (uint256 balance) {
        return super.balanceOf(_owner) + freezingBalance[_owner];
    }

    /**
     * @dev Gets the balance of the specified address without freezing tokens.
     * @param _owner The address to query the the balance of.
     * @return balance uint256 - representing the amount owned by the passed address.
     */
    function actualBalanceOf(address _owner) public view returns (uint256 balance) {
        return super.balanceOf(_owner);
    }

    function freezingBalanceOf(address _owner) public view returns (uint256 balance) {
        return freezingBalance[_owner];
    }

    /**
     * @dev gets freezing count.
     * @param _addr Address of freeze tokens owner.
     */
    function freezingCount(address _addr) public view returns (uint count) {
        uint64 release = chains[toKey(_addr, 0)];
        while (release != 0) {
            count++;
            release = chains[toKey(_addr, release)];
        }
    }

    /**
     * @dev gets freezing end date and freezing balance for the freezing portion specified by index.
     * @param _addr Address of freeze tokens owner.
     * @param _index Freezing portion index. It ordered by release date descending.
     */
    function getFreezing(address _addr, uint _index) public view returns (uint64 _release, uint _balance) {
        for (uint i = 0; i < _index + 1; i++) {
            _release = chains[toKey(_addr, _release)];
            if (_release == 0) {
                //return zero on failure
                return (0,0);
            }
        }
        _balance = freezings[toKey(_addr, _release)];
    }

    /**
     * @dev freeze your tokens to the specified address.
     *      Be careful, gas usage is not deterministic,
     *      and depends on how many freezes _to address already has.
     * @param _to Address to which token will be freeze.
     * @param _amount Amount of token to freeze.
     * @param _until Release date, must be in future.
     */
    function freezeTo(address _to, uint _amount, uint64 _until) public {
        require(_to != address(0));
        require(_amount <= balances[msg.sender]);

        balances[msg.sender] = balances[msg.sender].sub(_amount);

        bytes32 currentKey = toKey(_to, _until);
        freezings[currentKey] = freezings[currentKey].add(_amount);
        freezingBalance[_to] = freezingBalance[_to].add(_amount);

        freeze(_to, _until);
        emit Transfer(msg.sender, _to, _amount);
        emit Freezed(_to, _until, _amount);
    }

    /**
     * @dev release first available freezing tokens.
     */
    function releaseOnce() public {
        bytes32 headKey = toKey(msg.sender, 0);
        uint64 head = chains[headKey];
        require(head != 0);
        require(uint64(block.timestamp) > head);
        bytes32 currentKey = toKey(msg.sender, head);

        uint64 next = chains[currentKey];

        uint amount = freezings[currentKey];
        delete freezings[currentKey];

        balances[msg.sender] = balances[msg.sender].add(amount);
        freezingBalance[msg.sender] = freezingBalance[msg.sender].sub(amount);

        if (next == 0) {
            delete chains[headKey];
        } else {
            chains[headKey] = next;
            delete chains[currentKey];
        }
        emit Released(msg.sender, amount);
    }

    /**
     * @dev release all available for release freezing tokens. Gas usage is not deterministic!
     * @return tokens uint - how many tokens was released.
     */
    function releaseAll() public returns (uint tokens) {
        uint release;
        uint balance;
        (release, balance) = getFreezing(msg.sender, 0);
        while (release != 0 && block.timestamp > release) {
            releaseOnce();
            tokens += balance;
            (release, balance) = getFreezing(msg.sender, 0);
        }
    }

    function toKey(address _addr, uint _release) internal pure returns (bytes32 result) {
        // WISH masc to increase entropy
        result = 0x5749534800000000000000000000000000000000000000000000000000000000;
        assembly {
            result := or(result, mul(_addr, 0x10000000000000000))
            result := or(result, _release)
        }
    }

    function freeze(address _to, uint64 _until) internal {
        require(_until > block.timestamp);
        bytes32 key = toKey(_to, _until);
        bytes32 parentKey = toKey(_to, uint64(0));
        uint64 next = chains[parentKey];

        if (next == 0) {
            chains[parentKey] = _until;
            return;
        }

        bytes32 nextKey = toKey(_to, next);
        uint parent;

        while (next != 0 && _until > next) {
            parent = next;
            parentKey = nextKey;

            next = chains[nextKey];
            nextKey = toKey(_to, next);
        }

        if (_until == next) {
            return;
        }

        if (next != 0) {
            chains[key] = next;
        }

        chains[parentKey] = _until;
    }
}

/**
 * @title Burnable Token
 * @dev Token that can be irreversibly burned (destroyed).
 */
contract BurnableToken is StandardToken {
  // declare SafeMath libary usage for uint256
  using SafeMath for uint256;
  event Burn(address indexed burner, uint256 value);

  /**
   * @dev Burns a specific amount of tokens.
   * @param _value The amount of token to be burned.
   */
  function burn(uint256 _value) public {
    _burn(msg.sender, _value);
  }

  function _burn(address _who, uint256 _value) internal {
    require(_value <= balances[_who]);
    // no need to require value <= totalSupply, since that would imply the
    // sender's balance is greater than the totalSupply, which *should* be an assertion failure

    balances[_who] = balances[_who].sub(_value);
    totalSupply_ = totalSupply_.sub(_value);
    emit Burn(_who, _value);
    emit Transfer(_who, address(0), _value);
  }
}

/**
 * @title Pausable
 * @dev Base contract which allows children to implement an emergency stop mechanism.
 */
contract Pausable is Ownable {
  event Pause();
  event Unpause();

  bool public paused = false;

  /**
   * @dev Modifier to make a function callable only when the contract is not paused.
   */
  modifier whenNotPaused() {
    require(!paused);
    _;
  }

  /**
   * @dev Modifier to make a function callable only when the contract is paused.
   */
  modifier whenPaused() {
    require(paused);
    _;
  }

  /**
   * @dev called by the owner to pause, triggers stopped state.
   */
  function pause() onlyOwner whenNotPaused public {
    paused = true;
    emit Pause();
  }

  /**
   * @dev called by the owner to unpause, returns to normal state.
   */
  function unpause() onlyOwner whenPaused public {
    paused = false;
    emit Unpause();
  }
}

contract FreezableMintableToken is FreezableToken, MintableToken {
    // declare SafeMath libary usage for uint256
    using SafeMath for uint256;

    /**
     * @dev Mint the specified amount of token to the specified address and freeze it until the specified date.
     *      Be careful, gas usage is not deterministic,
     *      and depends on how many freezes _to address already has.
     * @param _to Address to which token will be freeze.
     * @param _amount Amount of token to mint and freeze.
     * @param _until Release date, must be in future.
     * @return A boolean that indicates if the operation was successful.
     */
    function mintAndFreeze(address _to, uint _amount, uint64 _until) public onlyOwner canMint returns (bool) {
        totalSupply_ = totalSupply_.add(_amount);

        bytes32 currentKey = toKey(_to, _until);
        freezings[currentKey] = freezings[currentKey].add(_amount);
        freezingBalance[_to] = freezingBalance[_to].add(_amount);

        freeze(_to, _until);
        emit Mint(_to, _amount);
        emit Freezed(_to, _until, _amount);
        emit Transfer(msg.sender, _to, _amount);
        return true;
    }
}

contract Consts {
    uint internal constant TOKEN_DECIMALS = 18;
    uint8 internal constant TOKEN_DECIMALS_UINT8 = 18;
    uint internal constant TOKEN_DECIMAL_MULTIPLIER = 10 ** TOKEN_DECIMALS;
    string internal constant TOKEN_NAME = "Carnomaly";
    string internal constant TOKEN_SYMBOL = "CARR";
    bool internal constant PAUSED = false;
    address internal constant TARGET_USER = 0x983062f86CefE41eB00ab99e3BB56283BC0DeF88;
    bool public constant CONTINUE_MINTING = true;
}

contract CARR is Consts, FreezableMintableToken, BurnableToken, Pausable, Staking { 
    event Initialized();
    bool public initialized = false;

    constructor() {
        init();
        transferOwnership(TARGET_USER);
    }

    function name() public pure returns (string memory _name) {
        return TOKEN_NAME;
    }

    function symbol() public pure returns (string memory _symbol) {
        return TOKEN_SYMBOL;
    }

    function decimals() public pure returns (uint8 _decimals) {
        return TOKEN_DECIMALS_UINT8;
    }

    function transferFrom(address _from, address _to, uint256 _value) public override returns (bool _success) {
        require(!paused);
        return super.transferFrom(_from, _to, _value);
    }

    function transfer(address _to, uint256 _value) public override returns (bool _success) {
        require(!paused);
        return super.transfer(_to, _value);
    }

    function distributeTokens(address donor, address[] memory addresses, uint256[] memory amount) public onlyOwner {
        require(donor != address(0), "Cannot send from 0x0 address");

        for(uint i = 0;i < addresses.length; i++) {
            transferFrom(donor, addresses[i], amount[i]);
        }
    }

    function init() private {
        require(!initialized);
        initialized = true;

        if (PAUSED) {
            pause();
        }  

        // Initial token mint
        mint(TARGET_USER, 750000000000000000000000000);

        if (!CONTINUE_MINTING) {
            finishMinting();
        }
        emit Initialized();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint64","name":"release","type":"uint64"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Freezed","type":"event"},{"anonymous":false,"inputs":[],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[],"name":"MintFinished","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Recovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Released","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newTimestamp","type":"uint256"}],"name":"StakingEnds","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"CONTINUE_MINTING","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_stakers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"actualBalanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"balanceOfStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"_decimals","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_subtractedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"timeElapsed","type":"uint256[]"}],"name":"distributeRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"donor","type":"address"},{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"amount","type":"uint256[]"}],"name":"distributeTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"finishMinting","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint64","name":"_until","type":"uint64"}],"name":"freezeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"freezingBalanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"freezingCount","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getFreezing","outputs":[{"internalType":"uint64","name":"_release","type":"uint64"},{"internalType":"uint256","name":"_balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"migrationStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint64","name":"_until","type":"uint64"}],"name":"mintAndFreeze","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintingFinished","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_name","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"releaseAll","outputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"releaseOnce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"rewardsOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_finish","type":"uint256"}],"name":"setFinish","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"rate","type":"uint256"}],"name":"setRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakedSender","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"tokensNeeded","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensUntilCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupplyStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"_success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"_success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600760146101000a81548160ff0219169083151502179055506000600760156101000a81548160ff02191690831515021790555064017a029afd600b556000600f60006101000a81548160ff0219169083151502179055503480156200006b57600080fd5b50600160008190555033600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555030600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506301e133804262000108919062000824565b600a819055507f1f93edc860083b630a46fd284de9fffd156de6743942780a6d5eaec8e9fd8275600a5460405162000141919062000892565b60405180910390a1620001596200018460201b60201c565b6200017e73983062f86cefe41eb00ab99e3bb56283bc0def886200024d60201b60201c565b6200096d565b600f60009054906101000a900460ff16156200019f57600080fd5b6001600f60006101000a81548160ff021916908315150217905550600015620001d357620001d2620002bc60201b60201c565b5b6200020573983062f86cefe41eb00ab99e3bb56283bc0def886b026c62ad77dc602dae0000006200037b60201b60201c565b5060016200021f576200021d620005ea60201b60201c565b505b7f5daa87a0e9463431830481fd4b6e3403442dfb9a12b9c07597e9f61d50b633c860405160405180910390a1565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614620002a857600080fd5b620002b981620006b060201b60201c565b50565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146200031757600080fd5b600760159054906101000a900460ff16156200033257600080fd5b6001600760156101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614620003d857600080fd5b600760149054906101000a900460ff1615620003f357600080fd5b6b05a790ea17ace06a96000000600254111562000447576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200043e9062000910565b60405180910390fd5b600062000459620007ab60201b60201c565b9050808311156200046957600080fd5b6200048583600254620007d360201b620035b71790919060201c565b600281905550620004e483600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054620007d360201b620035b71790919060201c565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885846040516200056f919062000892565b60405180910390a28373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051620005d7919062000892565b60405180910390a3600191505092915050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146200064757600080fd5b600760149054906101000a900460ff16156200066257600080fd5b6001600760146101000a81548160ff0219169083151502179055507fae5184fba832cb2b1f702aca6117b8d265eaf03ad33eb133f19dde0f5920fa0860405160405180910390a16001905090565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415620006eb57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806002546b05a790ea17ace06a96000000620007ca919062000932565b90508091505090565b60008183620007e3919062000824565b905092915050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200083182620007eb565b91506200083e83620007eb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620008765762000875620007f5565b5b828201905092915050565b6200088c81620007eb565b82525050565b6000602082019050620008a9600083018462000881565b92915050565b600082825260208201905092915050565b7f546f6b656e206361702072656163686564000000000000000000000000000000600082015250565b6000620008f8601183620008af565b91506200090582620008c0565b602082019050919050565b600060208201905081810360008301526200092b81620008e9565b9050919050565b60006200093f82620007eb565b91506200094c83620007eb565b925082821015620009625762000961620007f5565b5b828203905092915050565b615aa5806200097d6000396000f3fe608060405234801561001057600080fd5b50600436106102d55760003560e01c80635c975abb116101825780638da5cb5b116100e9578063a9059cbb116100a2578063d73dd6231161007c578063d73dd623146108b1578063d8aeedf5146108e1578063dd62ed3e14610911578063f2fde38b14610941576102d5565b8063a9059cbb14610835578063c533edb114610865578063ca63b5b814610881576102d5565b80638da5cb5b146107855780638f135b3a146107a35780638f32d59b146107bf57806395d89b41146107dd578063a67b4912146107fb578063a694fc3a14610819576102d5565b806370a082311161013b57806370a08231146106fb578063715018a61461072b57806372f702f3146107355780637d64bcb4146107535780638456cb5914610771578063853828b61461077b576102d5565b80635c975abb1461064957806361def69414610667578063631b8ad31461068557806366188463146106a357806366a92cda146106d3578063679aefce146106dd576102d5565b80632f558ba0116102415780633f4ba83a116101fa578063479ba7ae116101d4578063479ba7ae146105c357806348b52b27146105f357806351b6fe961461060f5780635be7fde81461062b576102d5565b80633f4ba83a1461056d57806340c10f191461057757806342966c68146105a7576102d5565b80632f558ba01461049b578063313ce567146104b75780633455f41e146104d557806334fcf437146105055780633be1e952146105215780633e5564941461053d576102d5565b8063158ef93e11610293578063158ef93e146103c557806317a950ac146103e357806318160ddd1461041357806323b872dd146104315780632764ca7c146104615780632e1a7d4d1461047f576102d5565b80623fd35a146102da57806302d6f730146102f857806305d2035b1461032957806306fdde0314610347578063095ea7b3146103655780630bb2cd6b14610395575b600080fd5b6102e261095d565b6040516102ef9190614d20565b60405180910390f35b610312600480360381019061030d9190614de3565b610962565b604051610320929190614e55565b60405180910390f35b610331610a1e565b60405161033e9190614d20565b60405180910390f35b61034f610a31565b60405161035c9190614f17565b60405180910390f35b61037f600480360381019061037a9190614de3565b610a6e565b60405161038c9190614d20565b60405180910390f35b6103af60048036038101906103aa9190614f65565b610b60565b6040516103bc9190614d20565b60405180910390f35b6103cd610df4565b6040516103da9190614d20565b60405180910390f35b6103fd60048036038101906103f89190614fb8565b610e07565b60405161040a9190614fe5565b60405180910390f35b61041b610e19565b6040516104289190614fe5565b60405180910390f35b61044b60048036038101906104469190615000565b610e23565b6040516104589190614d20565b60405180910390f35b610469610e53565b6040516104769190614fe5565b60405180910390f35b61049960048036038101906104949190615053565b610e79565b005b6104b560048036038101906104b09190615053565b611147565b005b6104bf6111e2565b6040516104cc919061509c565b60405180910390f35b6104ef60048036038101906104ea9190614fb8565b6111eb565b6040516104fc9190614fe5565b60405180910390f35b61051f600480360381019061051a9190615053565b611234565b005b61053b60048036038101906105369190614f65565b6112a5565b005b61055760048036038101906105529190615053565b61156f565b60405161056491906150c6565b60405180910390f35b6105756115ae565b005b610591600480360381019061058c9190614de3565b61166a565b60405161059e9190614d20565b60405180910390f35b6105c160048036038101906105bc9190615053565b6118b9565b005b6105dd60048036038101906105d89190614fb8565b6118c6565b6040516105ea9190614fe5565b60405180910390f35b61060d60048036038101906106089190614de3565b6118d8565b005b610629600480360381019061062491906152ec565b611b31565b005b610633611c60565b6040516106409190614fe5565b60405180910390f35b610651611cdb565b60405161065e9190614d20565b60405180910390f35b61066f611cee565b60405161067c9190614fe5565b60405180910390f35b61068d611ece565b60405161069a9190614fe5565b60405180910390f35b6106bd60048036038101906106b89190614de3565b611ed8565b6040516106ca9190614d20565b60405180910390f35b6106db612169565b005b6106e5612475565b6040516106f29190614fe5565b60405180910390f35b61071560048036038101906107109190614fb8565b61247f565b6040516107229190614fe5565b60405180910390f35b6107336124db565b005b61073d6125de565b60405161074a91906153d6565b60405180910390f35b61075b612604565b6040516107689190614d20565b60405180910390f35b6107796126c8565b005b610783612785565b005b61078d6129cc565b60405161079a91906150c6565b60405180910390f35b6107bd60048036038101906107b89190615053565b6129f2565b005b6107c7612b5a565b6040516107d491906150c6565b60405180910390f35b6107e5612b84565b6040516107f29190614f17565b60405180910390f35b610803612bc1565b6040516108109190614fe5565b60405180910390f35b610833600480360381019061082e9190615053565b612c9f565b005b61084f600480360381019061084a9190614de3565b612fc8565b60405161085c9190614d20565b60405180910390f35b61087f600480360381019061087a91906153f1565b612ff6565b005b61089b60048036038101906108969190614fb8565b6131e5565b6040516108a89190614fe5565b60405180910390f35b6108cb60048036038101906108c69190614de3565b613285565b6040516108d89190614d20565b60405180910390f35b6108fb60048036038101906108f69190614fb8565b613481565b6040516109089190614fe5565b60405180910390f35b61092b60048036038101906109269190615498565b6134ca565b6040516109389190614fe5565b60405180910390f35b61095b60048036038101906109569190614fb8565b613551565b005b600181565b60008060005b6001846109759190615507565b8110156109ec5760046000610994878667ffffffffffffffff166135cd565b815260200190815260200160002060009054906101000a900467ffffffffffffffff16925060008367ffffffffffffffff1614156109d9576000809250925050610a17565b80806109e49061555d565b915050610968565b5060056000610a05868567ffffffffffffffff166135cd565b81526020019081526020016000205490505b9250929050565b600760149054906101000a900460ff1681565b60606040518060400160405280600981526020017f4361726e6f6d616c790000000000000000000000000000000000000000000000815250905090565b600081600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610b4e9190614fe5565b60405180910390a36001905092915050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610bbc57600080fd5b600760149054906101000a900460ff1615610bd657600080fd5b610beb836002546135b790919063ffffffff16565b6002819055506000610c07858467ffffffffffffffff166135cd565b9050610c2f8460056000848152602001908152602001600020546135b790919063ffffffff16565b6005600083815260200190815260200160002081905550610c9884600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135b790919063ffffffff16565b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610ce58584613610565b8473ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688585604051610d2b9190614fe5565b60405180910390a28473ffffffffffffffffffffffffffffffffffffffff167f2ecd071e4d10ed2221b04636ed0724cce66a873aa98c1a31b4bb0e6846d3aab48486604051610d7b929190614e55565b60405180910390a28473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610de09190614fe5565b60405180910390a360019150509392505050565b600f60009054906101000a900460ff1681565b6000610e1282613832565b9050919050565b6000600254905090565b6000600760159054906101000a900460ff1615610e3f57600080fd5b610e4a84848461387b565b90509392505050565b6000806002546b05a790ea17ace06a96000000610e7091906155a6565b90508091505090565b60026000541415610ebf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb690615626565b60405180910390fd5b6002600081905550336000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610f4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4190615692565b60405180910390fd5b336000610f5682613c34565b9050610f60613d8d565b600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600081111561106a5780600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610ffb9190615507565b9250508190555080600960008282546110149190615507565b925050819055508173ffffffffffffffffffffffffffffffffffffffff167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d826040516110619190614fe5565b60405180910390a25b600084116110ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a490615724565b60405180910390fd5b83600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561112f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112690615790565b60405180910390fd5b6111393385613da7565b505050600160008190555050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111a157600080fd5b80600a819055507f1f93edc860083b630a46fd284de9fffd156de6743942780a6d5eaec8e9fd8275816040516111d79190614fe5565b60405180910390a150565b60006012905090565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461128e57600080fd5b6000811161129b57600080fd5b80600b8190555050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156112df57600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111561132b57600080fd5b61137d82600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461414190919063ffffffff16565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060006113d6848367ffffffffffffffff166135cd565b90506113fe8360056000848152602001908152602001600020546135b790919063ffffffff16565b600560008381526020019081526020016000208190555061146783600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135b790919063ffffffff16565b600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506114b48483613610565b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516115119190614fe5565b60405180910390a38373ffffffffffffffffffffffffffffffffffffffff167f2ecd071e4d10ed2221b04636ed0724cce66a873aa98c1a31b4bb0e6846d3aab48385604051611561929190614e55565b60405180910390a250505050565b600c818154811061157f57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461160857600080fd5b600760159054906101000a900460ff1661162157600080fd5b6000600760156101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116c657600080fd5b600760149054906101000a900460ff16156116e057600080fd5b6b05a790ea17ace06a960000006002541115611731576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611728906157fc565b60405180910390fd5b600061173b610e53565b90508083111561174a57600080fd5b61175f836002546135b790919063ffffffff16565b6002819055506117b783600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135b790919063ffffffff16565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885846040516118409190614fe5565b60405180910390a28373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516118a69190614fe5565b60405180910390a3600191505092915050565b6118c33382614157565b50565b60006118d182613c34565b9050919050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461193257600080fd5b60026000541415611978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196f90615626565b60405180910390fd5b6002600081905550600a544211156119c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bc90615868565b60405180910390fd5b60008111611a08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ff90615724565b60405180910390fd5b8060096000828254611a1a9190615507565b9250508190555080600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a709190615507565b92505081905550600c829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611ae2613d8d565b600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060016000819055505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b8b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf2906158d4565b60405180910390fd5b60005b8251811015611c5a57611c4684848381518110611c1e57611c1d6158f4565b5b6020026020010151848481518110611c3957611c386158f4565b5b6020026020010151610e23565b508080611c529061555d565b915050611bfe565b50505050565b6000806000611c70336000610962565b8167ffffffffffffffff16915080925081935050505b60008214158015611c9657508142115b15611cd657611ca3612169565b8083611caf9190615507565b9250611cbc336000610962565b8167ffffffffffffffff1691508092508193505050611c86565b505090565b600760159054906101000a900460ff1681565b60006060600060095490506000600c80549050905060005b81811015611ec4576000808551905060005b81811015611dc457600c8481548110611d3457611d336158f4565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16878281518110611d8857611d876158f4565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415611db157600192505b8080611dbc9061555d565b915050611d18565b508115611dd2575050611eb1565b611e19600c8481548110611de957611de86158f4565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166118c6565b600d6000600c8681548110611e3157611e306158f4565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ea19190615507565b85611eac9190615507565b945050505b8080611ebc9061555d565b915050611d06565b5081935050505090565b6000600954905090565b600080600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080831115611fe9576000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061207d565b611ffc838261414190919063ffffffff16565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516121569190614fe5565b60405180910390a3600191505092915050565b60006121763360006135cd565b905060006004600083815260200190815260200160002060009054906101000a900467ffffffffffffffff16905060008167ffffffffffffffff1614156121bc57600080fd5b8067ffffffffffffffff164267ffffffffffffffff16116121dc57600080fd5b60006121f2338367ffffffffffffffff166135cd565b905060006004600083815260200190815260200160002060009054906101000a900467ffffffffffffffff16905060006005600084815260200190815260200160002054905060056000848152602001908152602001600020600090556122a181600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135b790919063ffffffff16565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061233681600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461414190919063ffffffff16565b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060008267ffffffffffffffff1614156123bb576004600086815260200190815260200160002060006101000a81549067ffffffffffffffff0219169055612420565b816004600087815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506004600084815260200190815260200160002060006101000a81549067ffffffffffffffff02191690555b3373ffffffffffffffffffffffffffffffffffffffff167fb21fb52d5749b80f3182f8c6992236b5e5576681880914484d7f4c9b062e619e826040516124669190614fe5565b60405180910390a25050505050565b6000600b54905090565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546124ca83613832565b6124d49190615507565b9050919050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461253557600080fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a26000600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461266057600080fd5b600760149054906101000a900460ff161561267a57600080fd5b6001600760146101000a81548160ff0219169083151502179055507fae5184fba832cb2b1f702aca6117b8d265eaf03ad33eb133f19dde0f5920fa0860405160405180910390a16001905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461272257600080fd5b600760159054906101000a900460ff161561273c57600080fd5b6001600760156101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b600260005414156127cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c290615626565b60405180910390fd5b6002600081905550336000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411612856576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284d90615692565b60405180910390fd5b33600061286282613c34565b905061286c613d8d565b600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060008111156129765780600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129079190615507565b9250508190555080600960008282546129209190615507565b925050819055508173ffffffffffffffffffffffffffffffffffffffff167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d8260405161296d9190614fe5565b60405180910390a25b6129bf33600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613da7565b5050506001600081905550565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612a4c57600080fd5b60003090508073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401612a8c929190615923565b602060405180830381600087803b158015612aa657600080fd5b505af1158015612aba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ade9190615978565b612b1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b14906159f1565b60405180910390fd5b7f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa283083604051612b4e929190615923565b60405180910390a15050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606040518060400160405280600481526020017f4341525200000000000000000000000000000000000000000000000000000000815250905090565b6000336000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411612c46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3d90615692565b60405180910390fd5b612c4f33613c34565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c999190615507565b91505090565b60026000541415612ce5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cdc90615626565b60405180910390fd5b6002600081905550600a54421115612d32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2990615868565b60405180910390fd5b336000612d3e82613c34565b9050612d48613d8d565b600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000811115612e525780600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612de39190615507565b925050819055508060096000828254612dfc9190615507565b925050819055508173ffffffffffffffffffffffffffffffffffffffff167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d82604051612e499190614fe5565b60405180910390a25b8260096000828254612e649190615507565b9250508190555082600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612eba9190615507565b92505081905550600c339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612f2e308461430b565b612f6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f64906159f1565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d84604051612fb39190614fe5565b60405180910390a25050600160008190555050565b6000600760159054906101000a900460ff1615612fe457600080fd5b612fee838361430b565b905092915050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461305057600080fd5b60005b83518110156131df576000848281518110613071576130706158f4565b5b6020026020010151905060008483815181106130905761308f6158f4565b5b6020026020010151905080600960008282546130ac9190615507565b9250508190555080600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131029190615507565b92505081905550600c829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083838151811061317f5761317e6158f4565b5b6020026020010151600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505080806131d79061555d565b915050613053565b50505050565b600080600460006131f78560006135cd565b815260200190815260200160002060009054906101000a900467ffffffffffffffff1690505b60008167ffffffffffffffff161461327f57818061323a9061555d565b92505060046000613255858467ffffffffffffffff166135cd565b815260200190815260200160002060009054906101000a900467ffffffffffffffff16905061321d565b50919050565b600061331682600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135b790919063ffffffff16565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161346f9190614fe5565b60405180910390a36001905092915050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146135ab57600080fd5b6135b48161452b565b50565b600081836135c59190615507565b905092915050565b60007f574953480000000000000000000000000000000000000000000000000000000060001b905068010000000000000000830281179050818117905092915050565b428167ffffffffffffffff161161362657600080fd5b600061363c838367ffffffffffffffff166135cd565b9050600061365584600067ffffffffffffffff166135cd565b905060006004600083815260200190815260200160002060009054906101000a900467ffffffffffffffff16905060008167ffffffffffffffff1614156136d857836004600084815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050505061382e565b60006136ee868367ffffffffffffffff166135cd565b905060005b60008367ffffffffffffffff161415801561372157508267ffffffffffffffff168667ffffffffffffffff16115b1561377b578267ffffffffffffffff1690508193506004600083815260200190815260200160002060009054906101000a900467ffffffffffffffff169250613774878467ffffffffffffffff166135cd565b91506136f3565b8267ffffffffffffffff168667ffffffffffffffff1614156137a157505050505061382e565b60008367ffffffffffffffff16146137ee57826004600087815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b856004600086815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050505050505b5050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156138b657600080fd5b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111561390257600080fd5b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111561398b57600080fd5b6139dd82600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461414190919063ffffffff16565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613a7282600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135b790919063ffffffff16565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613b4482600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461414190919063ffffffff16565b600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613c219190614fe5565b60405180910390a3600190509392505050565b600080600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c7f613d8d565b613c8991906155a6565b90506000811480613cd957506000600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b15613ce8576000915050613d88565b6000613d36600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600b5484614625565b9050600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481613d8391906155a6565b925050505b919050565b6000600a544210613da057600a54613da2565b425b905090565b816000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411613e2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e2190615692565b60405180910390fd5b336000613e3682613c34565b9050613e40613d8d565b600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000811115613f4a5780600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613edb9190615507565b925050819055508060096000828254613ef49190615507565b925050819055508173ffffffffffffffffffffffffffffffffffffffff167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d82604051613f419190614fe5565b60405180910390a25b600954841115613f8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f8690615790565b60405180910390fd5b8360096000828254613fa191906155a6565b9250508190555083600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613ff791906155a6565b92505081905550600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86866040518363ffffffff1660e01b815260040161405b929190615923565b602060405180830381600087803b15801561407557600080fd5b505af1158015614089573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140ad9190615978565b6140ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140e3906159f1565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5856040516141329190614fe5565b60405180910390a25050505050565b6000818361414f91906155a6565b905092915050565b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111156141a357600080fd5b6141f581600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461414190919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061424d8160025461414190919063ffffffff16565b6002819055508173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040516142999190614fe5565b60405180910390a2600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516142ff9190614fe5565b60405180910390a35050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561434657600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111561439257600080fd5b6143e482600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461414190919063ffffffff16565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061447982600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135b790919063ffffffff16565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516145199190614fe5565b60405180910390a36001905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561456557600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061465d61465761465161463a6001614666565b61464c87670de0b6b3a7640000614689565b6146f1565b84614758565b85614a6d565b90509392505050565b6000677fffffffffffffff82111561467d57600080fd5b604082901b9050919050565b60008082141561469857600080fd5b60006146a48484614b28565b90506f7fffffffffffffffffffffffffffffff6fffffffffffffffffffffffffffffffff16816fffffffffffffffffffffffffffffffff1611156146e757600080fd5b8091505092915050565b60008082600f0b84600f0b0190507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561474557506f7fffffffffffffffffffffffffffffff600f0b8113155b61474e57600080fd5b8091505092915050565b600080600084600f0b12801561477057506001808416145b905060008085600f0b126147845784614789565b846000035b6fffffffffffffffffffffffffffffffff1690506000700100000000000000000000000000000000905068010000000000000000821161486357603f82901b91505b6000851461485757600060018616146147e857607f828202901c90505b607f828302901c91506000600286161461480657607f828202901c90505b607f828302901c91506000600486161461482457607f828202901c90505b607f828302901c91506000600886161461484257607f828202901c90505b607f828302901c9150600485901c94506147cb565b604081901c90506149fd565b6000603f90506c0100000000000000000000000083101561488c57602083901b92506020810390505b6e0100000000000000000000000000008310156148b157601083901b92506010810390505b6f010000000000000000000000000000008310156148d757600883901b92506008810390505b6f100000000000000000000000000000008310156148fd57600483901b92506004810390505b6f4000000000000000000000000000000083101561492357600283901b92506002810390505b6f8000000000000000000000000000000083101561494957600183901b92506001810390505b60005b600087146149e4576040821061496157600080fd5b600060018816146149a257607f848402901c925081810190507001000000000000000000000000000000008311156149a157600183901c92506001810190505b5b607f848502901c9350600182901b915070010000000000000000000000000000000084106149d857600184901c93506001820191505b600187901c965061494c565b604081106149f157600080fd5b8060400383901c925050505b600083614a0a5781614a0f565b816000035b90507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015614a5757506f7fffffffffffffffffffffffffffffff600f0b8113155b614a6057600080fd5b8094505050505092915050565b600080821415614a805760009050614b22565b600083600f0b1215614a9157600080fd5b600060406fffffffffffffffffffffffffffffffff841685600f0b02901c90506000608084901c85600f0b02905077ffffffffffffffffffffffffffffffffffffffffffffffff811115614ae457600080fd5b604081901b9050817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03811115614b1a57600080fd5b818101925050505b92915050565b600080821415614b3757600080fd5b600077ffffffffffffffffffffffffffffffffffffffffffffffff8411614b745782604085901b81614b6c57614b6b615a11565b5b049050614cde565b600060c09050600060c086901c90506401000000008110614b9d57602081901c90506020820191505b620100008110614bb557601081901c90506010820191505b6101008110614bcc57600881901c90506008820191505b60108110614be257600481901c90506004820191505b60048110614bf857600281901c90506002820191505b60028110614c07576001820191505b600160bf830360018703901c018260ff0387901b81614c2957614c28615a11565b5b0492506fffffffffffffffffffffffffffffffff831115614c4957600080fd5b6000608086901c8402905060006fffffffffffffffffffffffffffffffff871685029050600060c089901c9050600060408a901b905082811015614c8e576001820391505b8281039050608084901b925082811015614ca9576001820391505b8281039050608084901c8214614cc257614cc1615a40565b5b888181614cd257614cd1615a11565b5b04870196505050505050505b6fffffffffffffffffffffffffffffffff811115614cfb57600080fd5b8091505092915050565b60008115159050919050565b614d1a81614d05565b82525050565b6000602082019050614d356000830184614d11565b92915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614d7a82614d4f565b9050919050565b614d8a81614d6f565b8114614d9557600080fd5b50565b600081359050614da781614d81565b92915050565b6000819050919050565b614dc081614dad565b8114614dcb57600080fd5b50565b600081359050614ddd81614db7565b92915050565b60008060408385031215614dfa57614df9614d45565b5b6000614e0885828601614d98565b9250506020614e1985828601614dce565b9150509250929050565b600067ffffffffffffffff82169050919050565b614e4081614e23565b82525050565b614e4f81614dad565b82525050565b6000604082019050614e6a6000830185614e37565b614e776020830184614e46565b9392505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614eb8578082015181840152602081019050614e9d565b83811115614ec7576000848401525b50505050565b6000601f19601f8301169050919050565b6000614ee982614e7e565b614ef38185614e89565b9350614f03818560208601614e9a565b614f0c81614ecd565b840191505092915050565b60006020820190508181036000830152614f318184614ede565b905092915050565b614f4281614e23565b8114614f4d57600080fd5b50565b600081359050614f5f81614f39565b92915050565b600080600060608486031215614f7e57614f7d614d45565b5b6000614f8c86828701614d98565b9350506020614f9d86828701614dce565b9250506040614fae86828701614f50565b9150509250925092565b600060208284031215614fce57614fcd614d45565b5b6000614fdc84828501614d98565b91505092915050565b6000602082019050614ffa6000830184614e46565b92915050565b60008060006060848603121561501957615018614d45565b5b600061502786828701614d98565b935050602061503886828701614d98565b925050604061504986828701614dce565b9150509250925092565b60006020828403121561506957615068614d45565b5b600061507784828501614dce565b91505092915050565b600060ff82169050919050565b61509681615080565b82525050565b60006020820190506150b1600083018461508d565b92915050565b6150c081614d6f565b82525050565b60006020820190506150db60008301846150b7565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61511e82614ecd565b810181811067ffffffffffffffff8211171561513d5761513c6150e6565b5b80604052505050565b6000615150614d3b565b905061515c8282615115565b919050565b600067ffffffffffffffff82111561517c5761517b6150e6565b5b602082029050602081019050919050565b600080fd5b60006151a56151a084615161565b615146565b905080838252602082019050602084028301858111156151c8576151c761518d565b5b835b818110156151f157806151dd8882614d98565b8452602084019350506020810190506151ca565b5050509392505050565b600082601f8301126152105761520f6150e1565b5b8135615220848260208601615192565b91505092915050565b600067ffffffffffffffff821115615244576152436150e6565b5b602082029050602081019050919050565b600061526861526384615229565b615146565b9050808382526020820190506020840283018581111561528b5761528a61518d565b5b835b818110156152b457806152a08882614dce565b84526020840193505060208101905061528d565b5050509392505050565b600082601f8301126152d3576152d26150e1565b5b81356152e3848260208601615255565b91505092915050565b60008060006060848603121561530557615304614d45565b5b600061531386828701614d98565b935050602084013567ffffffffffffffff81111561533457615333614d4a565b5b615340868287016151fb565b925050604084013567ffffffffffffffff81111561536157615360614d4a565b5b61536d868287016152be565b9150509250925092565b6000819050919050565b600061539c61539761539284614d4f565b615377565b614d4f565b9050919050565b60006153ae82615381565b9050919050565b60006153c0826153a3565b9050919050565b6153d0816153b5565b82525050565b60006020820190506153eb60008301846153c7565b92915050565b60008060006060848603121561540a57615409614d45565b5b600084013567ffffffffffffffff81111561542857615427614d4a565b5b615434868287016151fb565b935050602084013567ffffffffffffffff81111561545557615454614d4a565b5b615461868287016152be565b925050604084013567ffffffffffffffff81111561548257615481614d4a565b5b61548e868287016152be565b9150509250925092565b600080604083850312156154af576154ae614d45565b5b60006154bd85828601614d98565b92505060206154ce85828601614d98565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061551282614dad565b915061551d83614dad565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615552576155516154d8565b5b828201905092915050565b600061556882614dad565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561559b5761559a6154d8565b5b600182019050919050565b60006155b182614dad565b91506155bc83614dad565b9250828210156155cf576155ce6154d8565b5b828203905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000615610601f83614e89565b915061561b826155da565b602082019050919050565b6000602082019050818103600083015261563f81615603565b9050919050565b7f4e6f207374616b65642062616c616e6365000000000000000000000000000000600082015250565b600061567c601183614e89565b915061568782615646565b602082019050919050565b600060208201905081810360008301526156ab8161566f565b9050919050565b7f596f75206d7573742073706563696679206120706f73697469766520616d6f7560008201527f6e74206f66206d6f6e6579000000000000000000000000000000000000000000602082015250565b600061570e602b83614e89565b9150615719826156b2565b604082019050919050565b6000602082019050818103600083015261573d81615701565b9050919050565b7f4e6f7420656e6f75676820746f6b656e73000000000000000000000000000000600082015250565b600061577a601183614e89565b915061578582615744565b602082019050919050565b600060208201905081810360008301526157a98161576d565b9050919050565b7f546f6b656e206361702072656163686564000000000000000000000000000000600082015250565b60006157e6601183614e89565b91506157f1826157b0565b602082019050919050565b60006020820190508181036000830152615815816157d9565b9050919050565b7f5374616b696e6720706572696f642068617320656e6465640000000000000000600082015250565b6000615852601883614e89565b915061585d8261581c565b602082019050919050565b6000602082019050818103600083015261588181615845565b9050919050565b7f43616e6e6f742073656e642066726f6d20307830206164647265737300000000600082015250565b60006158be601c83614e89565b91506158c982615888565b602082019050919050565b600060208201905081810360008301526158ed816158b1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060408201905061593860008301856150b7565b6159456020830184614e46565b9392505050565b61595581614d05565b811461596057600080fd5b50565b6000815190506159728161594c565b92915050565b60006020828403121561598e5761598d614d45565b5b600061599c84828501615963565b91505092915050565b7f546f6b656e205472616e73666572204661696c65640000000000000000000000600082015250565b60006159db601583614e89565b91506159e6826159a5565b602082019050919050565b60006020820190508181036000830152615a0a816159ce565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fdfea264697066735822122095dd2232a05e246c40ebd55592a8120f02571da96e02e80c4c9b3da1b82403fb64736f6c63430008090033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102d55760003560e01c80635c975abb116101825780638da5cb5b116100e9578063a9059cbb116100a2578063d73dd6231161007c578063d73dd623146108b1578063d8aeedf5146108e1578063dd62ed3e14610911578063f2fde38b14610941576102d5565b8063a9059cbb14610835578063c533edb114610865578063ca63b5b814610881576102d5565b80638da5cb5b146107855780638f135b3a146107a35780638f32d59b146107bf57806395d89b41146107dd578063a67b4912146107fb578063a694fc3a14610819576102d5565b806370a082311161013b57806370a08231146106fb578063715018a61461072b57806372f702f3146107355780637d64bcb4146107535780638456cb5914610771578063853828b61461077b576102d5565b80635c975abb1461064957806361def69414610667578063631b8ad31461068557806366188463146106a357806366a92cda146106d3578063679aefce146106dd576102d5565b80632f558ba0116102415780633f4ba83a116101fa578063479ba7ae116101d4578063479ba7ae146105c357806348b52b27146105f357806351b6fe961461060f5780635be7fde81461062b576102d5565b80633f4ba83a1461056d57806340c10f191461057757806342966c68146105a7576102d5565b80632f558ba01461049b578063313ce567146104b75780633455f41e146104d557806334fcf437146105055780633be1e952146105215780633e5564941461053d576102d5565b8063158ef93e11610293578063158ef93e146103c557806317a950ac146103e357806318160ddd1461041357806323b872dd146104315780632764ca7c146104615780632e1a7d4d1461047f576102d5565b80623fd35a146102da57806302d6f730146102f857806305d2035b1461032957806306fdde0314610347578063095ea7b3146103655780630bb2cd6b14610395575b600080fd5b6102e261095d565b6040516102ef9190614d20565b60405180910390f35b610312600480360381019061030d9190614de3565b610962565b604051610320929190614e55565b60405180910390f35b610331610a1e565b60405161033e9190614d20565b60405180910390f35b61034f610a31565b60405161035c9190614f17565b60405180910390f35b61037f600480360381019061037a9190614de3565b610a6e565b60405161038c9190614d20565b60405180910390f35b6103af60048036038101906103aa9190614f65565b610b60565b6040516103bc9190614d20565b60405180910390f35b6103cd610df4565b6040516103da9190614d20565b60405180910390f35b6103fd60048036038101906103f89190614fb8565b610e07565b60405161040a9190614fe5565b60405180910390f35b61041b610e19565b6040516104289190614fe5565b60405180910390f35b61044b60048036038101906104469190615000565b610e23565b6040516104589190614d20565b60405180910390f35b610469610e53565b6040516104769190614fe5565b60405180910390f35b61049960048036038101906104949190615053565b610e79565b005b6104b560048036038101906104b09190615053565b611147565b005b6104bf6111e2565b6040516104cc919061509c565b60405180910390f35b6104ef60048036038101906104ea9190614fb8565b6111eb565b6040516104fc9190614fe5565b60405180910390f35b61051f600480360381019061051a9190615053565b611234565b005b61053b60048036038101906105369190614f65565b6112a5565b005b61055760048036038101906105529190615053565b61156f565b60405161056491906150c6565b60405180910390f35b6105756115ae565b005b610591600480360381019061058c9190614de3565b61166a565b60405161059e9190614d20565b60405180910390f35b6105c160048036038101906105bc9190615053565b6118b9565b005b6105dd60048036038101906105d89190614fb8565b6118c6565b6040516105ea9190614fe5565b60405180910390f35b61060d60048036038101906106089190614de3565b6118d8565b005b610629600480360381019061062491906152ec565b611b31565b005b610633611c60565b6040516106409190614fe5565b60405180910390f35b610651611cdb565b60405161065e9190614d20565b60405180910390f35b61066f611cee565b60405161067c9190614fe5565b60405180910390f35b61068d611ece565b60405161069a9190614fe5565b60405180910390f35b6106bd60048036038101906106b89190614de3565b611ed8565b6040516106ca9190614d20565b60405180910390f35b6106db612169565b005b6106e5612475565b6040516106f29190614fe5565b60405180910390f35b61071560048036038101906107109190614fb8565b61247f565b6040516107229190614fe5565b60405180910390f35b6107336124db565b005b61073d6125de565b60405161074a91906153d6565b60405180910390f35b61075b612604565b6040516107689190614d20565b60405180910390f35b6107796126c8565b005b610783612785565b005b61078d6129cc565b60405161079a91906150c6565b60405180910390f35b6107bd60048036038101906107b89190615053565b6129f2565b005b6107c7612b5a565b6040516107d491906150c6565b60405180910390f35b6107e5612b84565b6040516107f29190614f17565b60405180910390f35b610803612bc1565b6040516108109190614fe5565b60405180910390f35b610833600480360381019061082e9190615053565b612c9f565b005b61084f600480360381019061084a9190614de3565b612fc8565b60405161085c9190614d20565b60405180910390f35b61087f600480360381019061087a91906153f1565b612ff6565b005b61089b60048036038101906108969190614fb8565b6131e5565b6040516108a89190614fe5565b60405180910390f35b6108cb60048036038101906108c69190614de3565b613285565b6040516108d89190614d20565b60405180910390f35b6108fb60048036038101906108f69190614fb8565b613481565b6040516109089190614fe5565b60405180910390f35b61092b60048036038101906109269190615498565b6134ca565b6040516109389190614fe5565b60405180910390f35b61095b60048036038101906109569190614fb8565b613551565b005b600181565b60008060005b6001846109759190615507565b8110156109ec5760046000610994878667ffffffffffffffff166135cd565b815260200190815260200160002060009054906101000a900467ffffffffffffffff16925060008367ffffffffffffffff1614156109d9576000809250925050610a17565b80806109e49061555d565b915050610968565b5060056000610a05868567ffffffffffffffff166135cd565b81526020019081526020016000205490505b9250929050565b600760149054906101000a900460ff1681565b60606040518060400160405280600981526020017f4361726e6f6d616c790000000000000000000000000000000000000000000000815250905090565b600081600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610b4e9190614fe5565b60405180910390a36001905092915050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610bbc57600080fd5b600760149054906101000a900460ff1615610bd657600080fd5b610beb836002546135b790919063ffffffff16565b6002819055506000610c07858467ffffffffffffffff166135cd565b9050610c2f8460056000848152602001908152602001600020546135b790919063ffffffff16565b6005600083815260200190815260200160002081905550610c9884600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135b790919063ffffffff16565b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610ce58584613610565b8473ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688585604051610d2b9190614fe5565b60405180910390a28473ffffffffffffffffffffffffffffffffffffffff167f2ecd071e4d10ed2221b04636ed0724cce66a873aa98c1a31b4bb0e6846d3aab48486604051610d7b929190614e55565b60405180910390a28473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610de09190614fe5565b60405180910390a360019150509392505050565b600f60009054906101000a900460ff1681565b6000610e1282613832565b9050919050565b6000600254905090565b6000600760159054906101000a900460ff1615610e3f57600080fd5b610e4a84848461387b565b90509392505050565b6000806002546b05a790ea17ace06a96000000610e7091906155a6565b90508091505090565b60026000541415610ebf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb690615626565b60405180910390fd5b6002600081905550336000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610f4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4190615692565b60405180910390fd5b336000610f5682613c34565b9050610f60613d8d565b600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600081111561106a5780600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610ffb9190615507565b9250508190555080600960008282546110149190615507565b925050819055508173ffffffffffffffffffffffffffffffffffffffff167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d826040516110619190614fe5565b60405180910390a25b600084116110ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a490615724565b60405180910390fd5b83600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561112f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112690615790565b60405180910390fd5b6111393385613da7565b505050600160008190555050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111a157600080fd5b80600a819055507f1f93edc860083b630a46fd284de9fffd156de6743942780a6d5eaec8e9fd8275816040516111d79190614fe5565b60405180910390a150565b60006012905090565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461128e57600080fd5b6000811161129b57600080fd5b80600b8190555050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156112df57600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111561132b57600080fd5b61137d82600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461414190919063ffffffff16565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060006113d6848367ffffffffffffffff166135cd565b90506113fe8360056000848152602001908152602001600020546135b790919063ffffffff16565b600560008381526020019081526020016000208190555061146783600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135b790919063ffffffff16565b600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506114b48483613610565b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516115119190614fe5565b60405180910390a38373ffffffffffffffffffffffffffffffffffffffff167f2ecd071e4d10ed2221b04636ed0724cce66a873aa98c1a31b4bb0e6846d3aab48385604051611561929190614e55565b60405180910390a250505050565b600c818154811061157f57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461160857600080fd5b600760159054906101000a900460ff1661162157600080fd5b6000600760156101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116c657600080fd5b600760149054906101000a900460ff16156116e057600080fd5b6b05a790ea17ace06a960000006002541115611731576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611728906157fc565b60405180910390fd5b600061173b610e53565b90508083111561174a57600080fd5b61175f836002546135b790919063ffffffff16565b6002819055506117b783600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135b790919063ffffffff16565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885846040516118409190614fe5565b60405180910390a28373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516118a69190614fe5565b60405180910390a3600191505092915050565b6118c33382614157565b50565b60006118d182613c34565b9050919050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461193257600080fd5b60026000541415611978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196f90615626565b60405180910390fd5b6002600081905550600a544211156119c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bc90615868565b60405180910390fd5b60008111611a08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ff90615724565b60405180910390fd5b8060096000828254611a1a9190615507565b9250508190555080600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a709190615507565b92505081905550600c829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611ae2613d8d565b600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060016000819055505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b8b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf2906158d4565b60405180910390fd5b60005b8251811015611c5a57611c4684848381518110611c1e57611c1d6158f4565b5b6020026020010151848481518110611c3957611c386158f4565b5b6020026020010151610e23565b508080611c529061555d565b915050611bfe565b50505050565b6000806000611c70336000610962565b8167ffffffffffffffff16915080925081935050505b60008214158015611c9657508142115b15611cd657611ca3612169565b8083611caf9190615507565b9250611cbc336000610962565b8167ffffffffffffffff1691508092508193505050611c86565b505090565b600760159054906101000a900460ff1681565b60006060600060095490506000600c80549050905060005b81811015611ec4576000808551905060005b81811015611dc457600c8481548110611d3457611d336158f4565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16878281518110611d8857611d876158f4565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415611db157600192505b8080611dbc9061555d565b915050611d18565b508115611dd2575050611eb1565b611e19600c8481548110611de957611de86158f4565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166118c6565b600d6000600c8681548110611e3157611e306158f4565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ea19190615507565b85611eac9190615507565b945050505b8080611ebc9061555d565b915050611d06565b5081935050505090565b6000600954905090565b600080600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080831115611fe9576000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061207d565b611ffc838261414190919063ffffffff16565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516121569190614fe5565b60405180910390a3600191505092915050565b60006121763360006135cd565b905060006004600083815260200190815260200160002060009054906101000a900467ffffffffffffffff16905060008167ffffffffffffffff1614156121bc57600080fd5b8067ffffffffffffffff164267ffffffffffffffff16116121dc57600080fd5b60006121f2338367ffffffffffffffff166135cd565b905060006004600083815260200190815260200160002060009054906101000a900467ffffffffffffffff16905060006005600084815260200190815260200160002054905060056000848152602001908152602001600020600090556122a181600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135b790919063ffffffff16565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061233681600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461414190919063ffffffff16565b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060008267ffffffffffffffff1614156123bb576004600086815260200190815260200160002060006101000a81549067ffffffffffffffff0219169055612420565b816004600087815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506004600084815260200190815260200160002060006101000a81549067ffffffffffffffff02191690555b3373ffffffffffffffffffffffffffffffffffffffff167fb21fb52d5749b80f3182f8c6992236b5e5576681880914484d7f4c9b062e619e826040516124669190614fe5565b60405180910390a25050505050565b6000600b54905090565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546124ca83613832565b6124d49190615507565b9050919050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461253557600080fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a26000600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461266057600080fd5b600760149054906101000a900460ff161561267a57600080fd5b6001600760146101000a81548160ff0219169083151502179055507fae5184fba832cb2b1f702aca6117b8d265eaf03ad33eb133f19dde0f5920fa0860405160405180910390a16001905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461272257600080fd5b600760159054906101000a900460ff161561273c57600080fd5b6001600760156101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b600260005414156127cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c290615626565b60405180910390fd5b6002600081905550336000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411612856576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284d90615692565b60405180910390fd5b33600061286282613c34565b905061286c613d8d565b600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060008111156129765780600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129079190615507565b9250508190555080600960008282546129209190615507565b925050819055508173ffffffffffffffffffffffffffffffffffffffff167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d8260405161296d9190614fe5565b60405180910390a25b6129bf33600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613da7565b5050506001600081905550565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612a4c57600080fd5b60003090508073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401612a8c929190615923565b602060405180830381600087803b158015612aa657600080fd5b505af1158015612aba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ade9190615978565b612b1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b14906159f1565b60405180910390fd5b7f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa283083604051612b4e929190615923565b60405180910390a15050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606040518060400160405280600481526020017f4341525200000000000000000000000000000000000000000000000000000000815250905090565b6000336000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411612c46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3d90615692565b60405180910390fd5b612c4f33613c34565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c999190615507565b91505090565b60026000541415612ce5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cdc90615626565b60405180910390fd5b6002600081905550600a54421115612d32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2990615868565b60405180910390fd5b336000612d3e82613c34565b9050612d48613d8d565b600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000811115612e525780600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612de39190615507565b925050819055508060096000828254612dfc9190615507565b925050819055508173ffffffffffffffffffffffffffffffffffffffff167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d82604051612e499190614fe5565b60405180910390a25b8260096000828254612e649190615507565b9250508190555082600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612eba9190615507565b92505081905550600c339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612f2e308461430b565b612f6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f64906159f1565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d84604051612fb39190614fe5565b60405180910390a25050600160008190555050565b6000600760159054906101000a900460ff1615612fe457600080fd5b612fee838361430b565b905092915050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461305057600080fd5b60005b83518110156131df576000848281518110613071576130706158f4565b5b6020026020010151905060008483815181106130905761308f6158f4565b5b6020026020010151905080600960008282546130ac9190615507565b9250508190555080600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131029190615507565b92505081905550600c829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083838151811061317f5761317e6158f4565b5b6020026020010151600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505080806131d79061555d565b915050613053565b50505050565b600080600460006131f78560006135cd565b815260200190815260200160002060009054906101000a900467ffffffffffffffff1690505b60008167ffffffffffffffff161461327f57818061323a9061555d565b92505060046000613255858467ffffffffffffffff166135cd565b815260200190815260200160002060009054906101000a900467ffffffffffffffff16905061321d565b50919050565b600061331682600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135b790919063ffffffff16565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161346f9190614fe5565b60405180910390a36001905092915050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146135ab57600080fd5b6135b48161452b565b50565b600081836135c59190615507565b905092915050565b60007f574953480000000000000000000000000000000000000000000000000000000060001b905068010000000000000000830281179050818117905092915050565b428167ffffffffffffffff161161362657600080fd5b600061363c838367ffffffffffffffff166135cd565b9050600061365584600067ffffffffffffffff166135cd565b905060006004600083815260200190815260200160002060009054906101000a900467ffffffffffffffff16905060008167ffffffffffffffff1614156136d857836004600084815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050505061382e565b60006136ee868367ffffffffffffffff166135cd565b905060005b60008367ffffffffffffffff161415801561372157508267ffffffffffffffff168667ffffffffffffffff16115b1561377b578267ffffffffffffffff1690508193506004600083815260200190815260200160002060009054906101000a900467ffffffffffffffff169250613774878467ffffffffffffffff166135cd565b91506136f3565b8267ffffffffffffffff168667ffffffffffffffff1614156137a157505050505061382e565b60008367ffffffffffffffff16146137ee57826004600087815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b856004600086815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050505050505b5050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156138b657600080fd5b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111561390257600080fd5b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111561398b57600080fd5b6139dd82600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461414190919063ffffffff16565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613a7282600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135b790919063ffffffff16565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613b4482600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461414190919063ffffffff16565b600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613c219190614fe5565b60405180910390a3600190509392505050565b600080600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c7f613d8d565b613c8991906155a6565b90506000811480613cd957506000600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b15613ce8576000915050613d88565b6000613d36600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600b5484614625565b9050600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481613d8391906155a6565b925050505b919050565b6000600a544210613da057600a54613da2565b425b905090565b816000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411613e2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e2190615692565b60405180910390fd5b336000613e3682613c34565b9050613e40613d8d565b600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000811115613f4a5780600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613edb9190615507565b925050819055508060096000828254613ef49190615507565b925050819055508173ffffffffffffffffffffffffffffffffffffffff167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d82604051613f419190614fe5565b60405180910390a25b600954841115613f8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f8690615790565b60405180910390fd5b8360096000828254613fa191906155a6565b9250508190555083600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613ff791906155a6565b92505081905550600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86866040518363ffffffff1660e01b815260040161405b929190615923565b602060405180830381600087803b15801561407557600080fd5b505af1158015614089573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140ad9190615978565b6140ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140e3906159f1565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5856040516141329190614fe5565b60405180910390a25050505050565b6000818361414f91906155a6565b905092915050565b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111156141a357600080fd5b6141f581600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461414190919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061424d8160025461414190919063ffffffff16565b6002819055508173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040516142999190614fe5565b60405180910390a2600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516142ff9190614fe5565b60405180910390a35050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561434657600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111561439257600080fd5b6143e482600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461414190919063ffffffff16565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061447982600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135b790919063ffffffff16565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516145199190614fe5565b60405180910390a36001905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561456557600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061465d61465761465161463a6001614666565b61464c87670de0b6b3a7640000614689565b6146f1565b84614758565b85614a6d565b90509392505050565b6000677fffffffffffffff82111561467d57600080fd5b604082901b9050919050565b60008082141561469857600080fd5b60006146a48484614b28565b90506f7fffffffffffffffffffffffffffffff6fffffffffffffffffffffffffffffffff16816fffffffffffffffffffffffffffffffff1611156146e757600080fd5b8091505092915050565b60008082600f0b84600f0b0190507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561474557506f7fffffffffffffffffffffffffffffff600f0b8113155b61474e57600080fd5b8091505092915050565b600080600084600f0b12801561477057506001808416145b905060008085600f0b126147845784614789565b846000035b6fffffffffffffffffffffffffffffffff1690506000700100000000000000000000000000000000905068010000000000000000821161486357603f82901b91505b6000851461485757600060018616146147e857607f828202901c90505b607f828302901c91506000600286161461480657607f828202901c90505b607f828302901c91506000600486161461482457607f828202901c90505b607f828302901c91506000600886161461484257607f828202901c90505b607f828302901c9150600485901c94506147cb565b604081901c90506149fd565b6000603f90506c0100000000000000000000000083101561488c57602083901b92506020810390505b6e0100000000000000000000000000008310156148b157601083901b92506010810390505b6f010000000000000000000000000000008310156148d757600883901b92506008810390505b6f100000000000000000000000000000008310156148fd57600483901b92506004810390505b6f4000000000000000000000000000000083101561492357600283901b92506002810390505b6f8000000000000000000000000000000083101561494957600183901b92506001810390505b60005b600087146149e4576040821061496157600080fd5b600060018816146149a257607f848402901c925081810190507001000000000000000000000000000000008311156149a157600183901c92506001810190505b5b607f848502901c9350600182901b915070010000000000000000000000000000000084106149d857600184901c93506001820191505b600187901c965061494c565b604081106149f157600080fd5b8060400383901c925050505b600083614a0a5781614a0f565b816000035b90507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015614a5757506f7fffffffffffffffffffffffffffffff600f0b8113155b614a6057600080fd5b8094505050505092915050565b600080821415614a805760009050614b22565b600083600f0b1215614a9157600080fd5b600060406fffffffffffffffffffffffffffffffff841685600f0b02901c90506000608084901c85600f0b02905077ffffffffffffffffffffffffffffffffffffffffffffffff811115614ae457600080fd5b604081901b9050817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03811115614b1a57600080fd5b818101925050505b92915050565b600080821415614b3757600080fd5b600077ffffffffffffffffffffffffffffffffffffffffffffffff8411614b745782604085901b81614b6c57614b6b615a11565b5b049050614cde565b600060c09050600060c086901c90506401000000008110614b9d57602081901c90506020820191505b620100008110614bb557601081901c90506010820191505b6101008110614bcc57600881901c90506008820191505b60108110614be257600481901c90506004820191505b60048110614bf857600281901c90506002820191505b60028110614c07576001820191505b600160bf830360018703901c018260ff0387901b81614c2957614c28615a11565b5b0492506fffffffffffffffffffffffffffffffff831115614c4957600080fd5b6000608086901c8402905060006fffffffffffffffffffffffffffffffff871685029050600060c089901c9050600060408a901b905082811015614c8e576001820391505b8281039050608084901b925082811015614ca9576001820391505b8281039050608084901c8214614cc257614cc1615a40565b5b888181614cd257614cd1615a11565b5b04870196505050505050505b6fffffffffffffffffffffffffffffffff811115614cfb57600080fd5b8091505092915050565b60008115159050919050565b614d1a81614d05565b82525050565b6000602082019050614d356000830184614d11565b92915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614d7a82614d4f565b9050919050565b614d8a81614d6f565b8114614d9557600080fd5b50565b600081359050614da781614d81565b92915050565b6000819050919050565b614dc081614dad565b8114614dcb57600080fd5b50565b600081359050614ddd81614db7565b92915050565b60008060408385031215614dfa57614df9614d45565b5b6000614e0885828601614d98565b9250506020614e1985828601614dce565b9150509250929050565b600067ffffffffffffffff82169050919050565b614e4081614e23565b82525050565b614e4f81614dad565b82525050565b6000604082019050614e6a6000830185614e37565b614e776020830184614e46565b9392505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614eb8578082015181840152602081019050614e9d565b83811115614ec7576000848401525b50505050565b6000601f19601f8301169050919050565b6000614ee982614e7e565b614ef38185614e89565b9350614f03818560208601614e9a565b614f0c81614ecd565b840191505092915050565b60006020820190508181036000830152614f318184614ede565b905092915050565b614f4281614e23565b8114614f4d57600080fd5b50565b600081359050614f5f81614f39565b92915050565b600080600060608486031215614f7e57614f7d614d45565b5b6000614f8c86828701614d98565b9350506020614f9d86828701614dce565b9250506040614fae86828701614f50565b9150509250925092565b600060208284031215614fce57614fcd614d45565b5b6000614fdc84828501614d98565b91505092915050565b6000602082019050614ffa6000830184614e46565b92915050565b60008060006060848603121561501957615018614d45565b5b600061502786828701614d98565b935050602061503886828701614d98565b925050604061504986828701614dce565b9150509250925092565b60006020828403121561506957615068614d45565b5b600061507784828501614dce565b91505092915050565b600060ff82169050919050565b61509681615080565b82525050565b60006020820190506150b1600083018461508d565b92915050565b6150c081614d6f565b82525050565b60006020820190506150db60008301846150b7565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61511e82614ecd565b810181811067ffffffffffffffff8211171561513d5761513c6150e6565b5b80604052505050565b6000615150614d3b565b905061515c8282615115565b919050565b600067ffffffffffffffff82111561517c5761517b6150e6565b5b602082029050602081019050919050565b600080fd5b60006151a56151a084615161565b615146565b905080838252602082019050602084028301858111156151c8576151c761518d565b5b835b818110156151f157806151dd8882614d98565b8452602084019350506020810190506151ca565b5050509392505050565b600082601f8301126152105761520f6150e1565b5b8135615220848260208601615192565b91505092915050565b600067ffffffffffffffff821115615244576152436150e6565b5b602082029050602081019050919050565b600061526861526384615229565b615146565b9050808382526020820190506020840283018581111561528b5761528a61518d565b5b835b818110156152b457806152a08882614dce565b84526020840193505060208101905061528d565b5050509392505050565b600082601f8301126152d3576152d26150e1565b5b81356152e3848260208601615255565b91505092915050565b60008060006060848603121561530557615304614d45565b5b600061531386828701614d98565b935050602084013567ffffffffffffffff81111561533457615333614d4a565b5b615340868287016151fb565b925050604084013567ffffffffffffffff81111561536157615360614d4a565b5b61536d868287016152be565b9150509250925092565b6000819050919050565b600061539c61539761539284614d4f565b615377565b614d4f565b9050919050565b60006153ae82615381565b9050919050565b60006153c0826153a3565b9050919050565b6153d0816153b5565b82525050565b60006020820190506153eb60008301846153c7565b92915050565b60008060006060848603121561540a57615409614d45565b5b600084013567ffffffffffffffff81111561542857615427614d4a565b5b615434868287016151fb565b935050602084013567ffffffffffffffff81111561545557615454614d4a565b5b615461868287016152be565b925050604084013567ffffffffffffffff81111561548257615481614d4a565b5b61548e868287016152be565b9150509250925092565b600080604083850312156154af576154ae614d45565b5b60006154bd85828601614d98565b92505060206154ce85828601614d98565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061551282614dad565b915061551d83614dad565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615552576155516154d8565b5b828201905092915050565b600061556882614dad565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561559b5761559a6154d8565b5b600182019050919050565b60006155b182614dad565b91506155bc83614dad565b9250828210156155cf576155ce6154d8565b5b828203905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000615610601f83614e89565b915061561b826155da565b602082019050919050565b6000602082019050818103600083015261563f81615603565b9050919050565b7f4e6f207374616b65642062616c616e6365000000000000000000000000000000600082015250565b600061567c601183614e89565b915061568782615646565b602082019050919050565b600060208201905081810360008301526156ab8161566f565b9050919050565b7f596f75206d7573742073706563696679206120706f73697469766520616d6f7560008201527f6e74206f66206d6f6e6579000000000000000000000000000000000000000000602082015250565b600061570e602b83614e89565b9150615719826156b2565b604082019050919050565b6000602082019050818103600083015261573d81615701565b9050919050565b7f4e6f7420656e6f75676820746f6b656e73000000000000000000000000000000600082015250565b600061577a601183614e89565b915061578582615744565b602082019050919050565b600060208201905081810360008301526157a98161576d565b9050919050565b7f546f6b656e206361702072656163686564000000000000000000000000000000600082015250565b60006157e6601183614e89565b91506157f1826157b0565b602082019050919050565b60006020820190508181036000830152615815816157d9565b9050919050565b7f5374616b696e6720706572696f642068617320656e6465640000000000000000600082015250565b6000615852601883614e89565b915061585d8261581c565b602082019050919050565b6000602082019050818103600083015261588181615845565b9050919050565b7f43616e6e6f742073656e642066726f6d20307830206164647265737300000000600082015250565b60006158be601c83614e89565b91506158c982615888565b602082019050919050565b600060208201905081810360008301526158ed816158b1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060408201905061593860008301856150b7565b6159456020830184614e46565b9392505050565b61595581614d05565b811461596057600080fd5b50565b6000815190506159728161594c565b92915050565b60006020828403121561598e5761598d614d45565b5b600061599c84828501615963565b91505092915050565b7f546f6b656e205472616e73666572204661696c65640000000000000000000000600082015250565b60006159db601583614e89565b91506159e6826159a5565b602082019050919050565b60006020820190508181036000830152615a0a816159ce565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fdfea264697066735822122095dd2232a05e246c40ebd55592a8120f02571da96e02e80c4c9b3da1b82403fb64736f6c63430008090033

Deployed Bytecode Sourcemap

62885:1621:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62833:44;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55471:403;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;42601:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63129:94;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37991:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61844:535;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63001:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54577:128;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35173:94;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63451:197;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43280:155;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49191:338;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52154:133;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63339:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47174:111;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46507:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56248:547;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44684:25;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61081:95;;;:::i;:::-;;43679:412;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59734:75;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50579:109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48670:384;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63831:315;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57813:357;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60460:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52768:613;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46882:99;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39942:440;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56875:756;;;:::i;:::-;;46301:81;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54164:157;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41378:114;;;:::i;:::-;;44538:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44211:144;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60900:93;;;:::i;:::-;;49604:193;;;:::i;:::-;;40606:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52397:234;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41207:76;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63231:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47780:152;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48072:370;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63656:167;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51549:457;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54956:249;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39164:304;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54713:130;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38519:176;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41660:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62833:44;62873:4;62833:44;:::o;55471:403::-;55541:15;55558:13;55589:6;55584:228;55614:1;55605:6;:10;;;;:::i;:::-;55601:1;:14;55584:228;;;55648:6;:30;55655:22;55661:5;55668:8;55655:22;;:5;:22::i;:::-;55648:30;;;;;;;;;;;;;;;;;;;;;55637:41;;55709:1;55697:8;:13;;;55693:108;;;55781:1;55783;55773:12;;;;;;;55693:108;55617:3;;;;;:::i;:::-;;;;55584:228;;;;55833:9;:33;55843:22;55849:5;55856:8;55843:22;;:5;:22::i;:::-;55833:33;;;;;;;;;;;;55822:44;;55471:403;;;;;;:::o;42601:35::-;;;;;;;;;;;;;:::o;63129:94::-;63166:19;63205:10;;;;;;;;;;;;;;;;;63198:17;;63129:94;:::o;37991:201::-;38067:4;38112:6;38080:7;:19;38088:10;38080:19;;;;;;;;;;;;;;;:29;38100:8;38080:29;;;;;;;;;;;;;;;:38;;;;38151:8;38130:38;;38139:10;38130:38;;;38161:6;38130:38;;;;;;:::i;:::-;;;;;;;;38182:4;38175:11;;37991:201;;;;:::o;61844:535::-;61943:4;41077:5;;;;;;;;;;;41063:19;;:10;:19;;;41055:28;;;;;;42746:15:::1;;;;;;;;;;;42745:16;42737:25;;;::::0;::::1;;61975::::2;61992:7;61975:12;;:16;;:25;;;;:::i;:::-;61960:12;:40;;;;62013:18;62034;62040:3;62045:6;62034:18;;:5;:18::i;:::-;62013:39;;62087:34;62113:7;62087:9;:21;62097:10;62087:21;;;;;;;;;;;;:25;;:34;;;;:::i;:::-;62063:9;:21;62073:10;62063:21;;;;;;;;;;;:58;;;;62155:33;62180:7;62155:15;:20;62171:3;62155:20;;;;;;;;;;;;;;;;:24;;:33;;;;:::i;:::-;62132:15;:20;62148:3;62132:20;;;;;;;;;;;;;;;:56;;;;62201:19;62208:3;62213:6;62201;:19::i;:::-;62241:3;62236:18;;;62246:7;62236:18;;;;;;:::i;:::-;;;;;;;;62278:3;62270:29;;;62283:6;62291:7;62270:29;;;;;;;:::i;:::-;;;;;;;;62336:3;62315:34;;62324:10;62315:34;;;62341:7;62315:34;;;;;;:::i;:::-;;;;;;;;62367:4;62360:11;;;61844:535:::0;;;;;:::o;63001:31::-;;;;;;;;;;;;;:::o;54577:128::-;54639:15;54674:23;54690:6;54674:15;:23::i;:::-;54667:30;;54577:128;;;:::o;35173:94::-;35226:7;35249:12;;35242:19;;35173:94;:::o;63451:197::-;63542:13;63577:6;;;;;;;;;;;63576:7;63568:16;;;;;;63602:38;63621:5;63628:3;63633:6;63602:18;:38::i;:::-;63595:45;;63451:197;;;;;:::o;43280:155::-;43327:7;43345:15;43394:12;;43363:28;:43;;;;:::i;:::-;43345:61;;43422:7;43415:14;;;43280:155;:::o;49191:338::-;23879:1;24477:7;;:19;;24469:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;23879:1;24610:7;:18;;;;49283:10:::1;46125:1;46110:6;:12;46117:4;46110:12;;;;;;;;;;;;;;;;:16;46102:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;49318:10:::2;45401:18;45422:20;45437:4;45422:14;:20::i;:::-;45401:41;;45470:27;:25;:27::i;:::-;45453:8;:14;45462:4;45453:14;;;;;;;;;;;;;;;:44;;;;45525:1;45512:10;:14;45508:158;;;45559:10;45543:6;:12;45550:4;45543:12;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;45600:10;45584:12;;:26;;;;;;;:::i;:::-;;;;;;;;45637:4;45630:24;;;45643:10;45630:24;;;;;;:::i;:::-;;;;;;;;45508:158;49363:1:::3;49354:6;:10;49346:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;49453:6;49431;:18;49438:10;49431:18;;;;;;;;;;;;;;;;:28;;49423:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;49492:29;49502:10;49514:6;49492:9;:29::i;:::-;45390:295:::2;46159:1;24641::::1;23835::::0;24789:7;:22;;;;49191:338;:::o;52154:133::-;41077:5;;;;;;;;;;;41063:19;;:10;:19;;;41055:28;;;;;;52236:7:::1;52220:13;:23;;;;52259:20;52271:7;52259:20;;;;;;:::i;:::-;;;;;;;;52154:133:::0;:::o;63339:104::-;63380:15;62505:2;63408:27;;63339:104;:::o;47174:111::-;47237:7;47264:6;:13;47271:5;47264:13;;;;;;;;;;;;;;;;47257:20;;47174:111;;;:::o;46507:223::-;41077:5;;;;;;;;;;;41063:19;;:10;:19;;;41055:28;;;;;;46696:1:::1;46689:4;:8;46681:17;;;::::0;::::1;;46718:4;46709:6;:13;;;;46507:223:::0;:::o;56248:547::-;56349:1;56334:17;;:3;:17;;;;56326:26;;;;;;56382:8;:20;56391:10;56382:20;;;;;;;;;;;;;;;;56371:7;:31;;56363:40;;;;;;56439:33;56464:7;56439:8;:20;56448:10;56439:20;;;;;;;;;;;;;;;;:24;;:33;;;;:::i;:::-;56416:8;:20;56425:10;56416:20;;;;;;;;;;;;;;;:56;;;;56485:18;56506;56512:3;56517:6;56506:18;;:5;:18::i;:::-;56485:39;;56559:34;56585:7;56559:9;:21;56569:10;56559:21;;;;;;;;;;;;:25;;:34;;;;:::i;:::-;56535:9;:21;56545:10;56535:21;;;;;;;;;;;:58;;;;56627:33;56652:7;56627:15;:20;56643:3;56627:20;;;;;;;;;;;;;;;;:24;;:33;;;;:::i;:::-;56604:15;:20;56620:3;56604:20;;;;;;;;;;;;;;;:56;;;;56673:19;56680:3;56685:6;56673;:19::i;:::-;56729:3;56708:34;;56717:10;56708:34;;;56734:7;56708:34;;;;;;:::i;:::-;;;;;;;;56766:3;56758:29;;;56771:6;56779:7;56758:29;;;;;;;:::i;:::-;;;;;;;;56315:480;56248:547;;;:::o;44684:25::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;61081:95::-;41077:5;;;;;;;;;;;41063:19;;:10;:19;;;41055:28;;;;;;60794:6:::1;;;;;;;;;;;60786:15;;;::::0;::::1;;61144:5:::2;61135:6;;:14;;;;;;;;;;;;;;;;;;61161:9;;;;;;;;;;61081:95::o:0;43679:412::-;43813:4;42937:5;;;;;;;;;;;42923:19;;:10;:19;;;42915:28;;;;;;42746:15:::1;;;;;;;;;;;42745:16;42737:25;;;::::0;::::1;;43087:28:::2;43071:12;;:44;;43063:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;43829:14:::3;43846:16;:14;:16::i;:::-;43829:33;;43888:6;43877:7;:17;;43869:26;;;::::0;::::3;;43917:25;43934:7;43917:12;;:16;;:25;;;;:::i;:::-;43902:12;:40;;;;43965:26;43983:7;43965:8;:13;43974:3;43965:13;;;;;;;;;;;;;;;;:17;;:26;;;;:::i;:::-;43949:8;:13;43958:3;43949:13;;;;;;;;;;;;;;;:42;;;;44008:3;44003:18;;;44013:7;44003:18;;;;;;:::i;:::-;;;;;;;;44054:3;44033:34;;44050:1;44033:34;;;44059:7;44033:34;;;;;;:::i;:::-;;;;;;;;44081:4;44074:11;;;43679:412:::0;;;;:::o;59734:75::-;59778:25;59784:10;59796:6;59778:5;:25::i;:::-;59734:75;:::o;50579:109::-;50633:7;50660:20;50675:4;50660:14;:20::i;:::-;50653:27;;50579:109;;;:::o;48670:384::-;41077:5;;;;;;;;;;;41063:19;;:10;:19;;;41055:28;;;;;;23879:1:::1;24477:7;;:19;;24469:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;23879:1;24610:7;:18;;;;45865:13:::2;;45846:15;:32;;45838:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;48844:1:::3;48835:6;:10;48827:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;48922:6;48906:12;;:22;;;;;;;:::i;:::-;;;;;;;;48955:6;48939;:12;48946:4;48939:12;;;;;;;;;;;;;;;;:22;;;;;;;:::i;:::-;;;;;;;;48972:8;48986:4;48972:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49019:27;:25;:27::i;:::-;49002:8;:14;49011:4;49002:14;;;;;;;;;;;;;;;:44;;;;23835:1:::1;24789:7;:22;;;;48670:384:::0;;:::o;63831:315::-;41077:5;;;;;;;;;;;41063:19;;:10;:19;;;41055:28;;;;;;63978:1:::1;63961:19;;:5;:19;;;;63953:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;64030:6;64026:113;64045:9;:16;64041:1;:20;64026:113;;;64083:44;64096:5;64103:9;64113:1;64103:12;;;;;;;;:::i;:::-;;;;;;;;64117:6;64124:1;64117:9;;;;;;;;:::i;:::-;;;;;;;;64083:12;:44::i;:::-;;64063:3;;;;;:::i;:::-;;;;64026:113;;;;63831:315:::0;;;:::o;57813:357::-;57851:11;57875:12;57898;57942:26;57954:10;57966:1;57942:11;:26::i;:::-;57921:47;;;;;;;;;;;;;57979:184;57997:1;57986:7;:12;;:41;;;;;58020:7;58002:15;:25;57986:41;57979:184;;;58044:13;:11;:13::i;:::-;58082:7;58072:17;;;;;:::i;:::-;;;58125:26;58137:10;58149:1;58125:11;:26::i;:::-;58104:47;;;;;;;;;;;;;57979:184;;;57864:306;;57813:357;:::o;60460:26::-;;;;;;;;;;;;;:::o;52768:613::-;52812:7;52832:24;52867:14;52884:12;;52867:29;;52907:15;52925:8;:15;;;;52907:33;;52955:6;52951:399;52969:10;52965:1;:14;52951:399;;;53001:10;53034:15;53052:7;:14;53034:32;;53085:6;53081:155;53099:10;53095:1;:14;53081:155;;;53153:8;53162:1;53153:11;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;53139:25;;:7;53147:1;53139:10;;;;;;;;:::i;:::-;;;;;;;;:25;;;53135:86;;;53197:4;53189:12;;53135:86;53111:3;;;;;:::i;:::-;;;;53081:155;;;;53254:5;53250:19;;;53261:8;;;;53250:19;53316:22;53326:8;53335:1;53326:11;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;53316:9;:22::i;:::-;53294:6;:19;53301:8;53310:1;53301:11;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;53294:19;;;;;;;;;;;;;;;;:44;;;;:::i;:::-;53284:54;;;;;:::i;:::-;;;52986:364;;52951:399;52981:3;;;;;:::i;:::-;;;;52951:399;;;;53367:6;53360:13;;;;;52768:613;:::o;46882:99::-;46934:7;46961:12;;46954:19;;46882:99;:::o;39942:440::-;40050:4;40066:13;40082:7;:19;40090:10;40082:19;;;;;;;;;;;;;;;:29;40102:8;40082:29;;;;;;;;;;;;;;;;40066:45;;40141:8;40122:16;:27;40118:168;;;40192:1;40160:7;:19;40168:10;40160:19;;;;;;;;;;;;;;;:29;40180:8;40160:29;;;;;;;;;;;;;;;:33;;;;40118:168;;;40248:30;40261:16;40248:8;:12;;:30;;;;:::i;:::-;40216:7;:19;40224:10;40216:19;;;;;;;;;;;;;;;:29;40236:8;40216:29;;;;;;;;;;;;;;;:62;;;;40118:168;40318:8;40297:61;;40306:10;40297:61;;;40328:7;:19;40336:10;40328:19;;;;;;;;;;;;;;;:29;40348:8;40328:29;;;;;;;;;;;;;;;;40297:61;;;;;;:::i;:::-;;;;;;;;40372:4;40365:11;;;39942:440;;;;:::o;56875:756::-;56916:15;56934:20;56940:10;56952:1;56934:5;:20::i;:::-;56916:38;;56965:11;56979:6;:15;56986:7;56979:15;;;;;;;;;;;;;;;;;;;;;56965:29;;57021:1;57013:4;:9;;;;57005:18;;;;;;57068:4;57042:30;;57049:15;57042:30;;;57034:39;;;;;;57084:18;57105:23;57111:10;57123:4;57105:23;;:5;:23::i;:::-;57084:44;;57141:11;57155:6;:18;57162:10;57155:18;;;;;;;;;;;;;;;;;;;;;57141:32;;57186:11;57200:9;:21;57210:10;57200:21;;;;;;;;;;;;57186:35;;57239:9;:21;57249:10;57239:21;;;;;;;;;;;57232:28;;;57296:32;57321:6;57296:8;:20;57305:10;57296:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;57273:8;:20;57282:10;57273:20;;;;;;;;;;;;;;;:55;;;;57369:39;57401:6;57369:15;:27;57385:10;57369:27;;;;;;;;;;;;;;;;:31;;:39;;;;:::i;:::-;57339:15;:27;57355:10;57339:27;;;;;;;;;;;;;;;:69;;;;57433:1;57425:4;:9;;;57421:159;;;57458:6;:15;57465:7;57458:15;;;;;;;;;;;;57451:22;;;;;;;;;;;57421:159;;;57524:4;57506:6;:15;57513:7;57506:15;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;57550:6;:18;57557:10;57550:18;;;;;;;;;;;;57543:25;;;;;;;;;;;57421:159;57604:10;57595:28;;;57616:6;57595:28;;;;;;:::i;:::-;;;;;;;;56905:726;;;;;56875:756::o;46301:81::-;46341:7;46368:6;;46361:13;;46301:81;:::o;54164:157::-;54229:15;54290;:23;54306:6;54290:23;;;;;;;;;;;;;;;;54264;54280:6;54264:15;:23::i;:::-;:49;;;;:::i;:::-;54257:56;;54164:157;;;:::o;41378:114::-;41077:5;;;;;;;;;;;41063:19;;:10;:19;;;41055:28;;;;;;41455:5:::1;;;;;;;;;;;41436:25;;;;;;;;;;;;41484:1;41468:5;;:18;;;;;;;;;;;;;;;;;;41378:114::o:0;44538:26::-;;;;;;;;;;;;;:::o;44211:144::-;44270:4;41077:5;;;;;;;;;;;41063:19;;:10;:19;;;41055:28;;;;;;42746:15:::1;;;;;;;;;;;42745:16;42737:25;;;::::0;::::1;;44301:4:::2;44283:15;;:22;;;;;;;;;;;;;;;;;;44317:14;;;;;;;;;;44345:4;44338:11;;44211:144:::0;:::o;60900:93::-;41077:5;;;;;;;;;;;41063:19;;:10;:19;;;41055:28;;;;;;60634:6:::1;;;;;;;;;;;60633:7;60625:16;;;::::0;::::1;;60964:4:::2;60955:6;;:13;;;;;;;;;;;;;;;;;;60980:7;;;;;;;;;;60900:93::o:0;49604:193::-;23879:1;24477:7;;:19;;24469:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;23879:1;24610:7;:18;;;;49685:10:::1;46125:1;46110:6;:12;46117:4;46110:12;;;;;;;;;;;;;;;;:16;46102:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;49720:10:::2;45401:18;45422:20;45437:4;45422:14;:20::i;:::-;45401:41;;45470:27;:25;:27::i;:::-;45453:8;:14;45462:4;45453:14;;;;;;;;;;;;;;;:44;;;;45525:1;45512:10;:14;45508:158;;;45559:10;45543:6;:12;45550:4;45543:12;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;45600:10;45584:12;;:26;;;;;;;:::i;:::-;;;;;;;;45637:4;45630:24;;;45643:10;45630:24;;;;;;:::i;:::-;;;;;;;;45508:158;49748:41:::3;49758:10;49770:6;:18;49777:10;49770:18;;;;;;;;;;;;;;;;49748:9;:41::i;:::-;45390:295:::2;46159:1;24641::::1;23835::::0;24789:7;:22;;;;49604:193::o;40606:20::-;;;;;;;;;;;;;:::o;52397:234::-;41077:5;;;;;;;;;;;41063:19;;:10;:19;;;41055:28;;;;;;52460:15:::1;52493:4;52460:39;;52518:8;:17;;;52536:10;52548:3;52518:34;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52510:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52594:29;52612:4;52619:3;52594:29;;;;;;;:::i;:::-;;;;;;;;52449:182;52397:234:::0;:::o;41207:76::-;41247:7;41272:5;;;;;;;;;;;41265:12;;41207:76;:::o;63231:100::-;63270:21;63311:12;;;;;;;;;;;;;;;;;63304:19;;63231:100;:::o;47780:152::-;47850:7;47829:10;46125:1;46110:6;:12;46117:4;46110:12;;;;;;;;;;;;;;;;:16;46102:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;47898:26:::1;47913:10;47898:14;:26::i;:::-;47877:6;:18;47884:10;47877:18;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;47870:54;;47780:152:::0;;:::o;48072:370::-;23879:1;24477:7;;:19;;24469:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;23879:1;24610:7;:18;;;;45865:13:::1;;45846:15;:32;;45838:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;48191:10:::2;45401:18;45422:20;45437:4;45422:14;:20::i;:::-;45401:41;;45470:27;:25;:27::i;:::-;45453:8;:14;45462:4;45453:14;;;;;;;;;;;;;;;:44;;;;45525:1;45512:10;:14;45508:158;;;45559:10;45543:6;:12;45550:4;45543:12;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;45600:10;45584:12;;:26;;;;;;;:::i;:::-;;;;;;;;45637:4;45630:24;;;45643:10;45630:24;;;;;;:::i;:::-;;;;;;;;45508:158;48235:6:::3;48219:12;;:22;;;;;;;:::i;:::-;;;;;;;;48274:6;48252;:18;48259:10;48252:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;48291:8;48305:10;48291:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48335:31;48352:4;48359:6;48335:8;:31::i;:::-;48327:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;48415:10;48408:26;;;48427:6;48408:26;;;;;;:::i;:::-;;;;;;;;45390:295:::2;45918:1;23835::::0;24789:7;:22;;;;48072:370;:::o;63656:167::-;63728:13;63763:6;;;;;;;;;;;63762:7;63754:16;;;;;;63788:27;63803:3;63808:6;63788:14;:27::i;:::-;63781:34;;63656:167;;;;:::o;51549:457::-;41077:5;;;;;;;;;;;41063:19;;:10;:19;;;41055:28;;;;;;51692:6:::1;51688:311;51707:9;:16;51703:1;:20;51688:311;;;51745:16;51764:9;51774:1;51764:12;;;;;;;;:::i;:::-;;;;;;;;51745:31;;51791:15;51809:7;51817:1;51809:10;;;;;;;;:::i;:::-;;;;;;;;51791:28;;51850:7;51834:12;;:23;;;;;;;:::i;:::-;;;;;;;;51892:7;51872:6;:16;51879:8;51872:16;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;51914:8;51928;51914:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51973:11;51985:1;51973:14;;;;;;;;:::i;:::-;;;;;;;;51952:8;:18;51961:8;51952:18;;;;;;;;;;;;;;;:35;;;;51730:269;;51725:3;;;;;:::i;:::-;;;;51688:311;;;;51549:457:::0;;;:::o;54956:249::-;55015:10;55038:14;55055:6;:23;55062:15;55068:5;55075:1;55062:5;:15::i;:::-;55055:23;;;;;;;;;;;;;;;;;;;;;55038:40;;55089:109;55107:1;55096:7;:12;;;55089:109;;55125:7;;;;;:::i;:::-;;;;55157:6;:29;55164:21;55170:5;55177:7;55164:21;;:5;:21::i;:::-;55157:29;;;;;;;;;;;;;;;;;;;;;55147:39;;55089:109;;;55027:178;54956:249;;;:::o;39164:304::-;39267:4;39324:46;39358:11;39324:7;:19;39332:10;39324:19;;;;;;;;;;;;;;;:29;39344:8;39324:29;;;;;;;;;;;;;;;;:33;;:46;;;;:::i;:::-;39283:7;:19;39291:10;39283:19;;;;;;;;;;;;;;;:29;39303:8;39283:29;;;;;;;;;;;;;;;:88;;;;39404:8;39383:61;;39392:10;39383:61;;;39414:7;:19;39422:10;39414:19;;;;;;;;;;;;;;;:29;39434:8;39414:29;;;;;;;;;;;;;;;;39383:61;;;;;;:::i;:::-;;;;;;;;39458:4;39451:11;;39164:304;;;;:::o;54713:130::-;54777:15;54812;:23;54828:6;54812:23;;;;;;;;;;;;;;;;54805:30;;54713:130;;;:::o;38519:176::-;38638:7;38664;:15;38672:6;38664:15;;;;;;;;;;;;;;;:25;38680:8;38664:25;;;;;;;;;;;;;;;;38657:32;;38519:176;;;;:::o;41660:105::-;41077:5;;;;;;;;;;;41063:19;;:10;:19;;;41055:28;;;;;;41730:29:::1;41749:9;41730:18;:29::i;:::-;41660:105:::0;:::o;2862:98::-;2920:7;2951:1;2947;:5;;;;:::i;:::-;2940:12;;2862:98;;;;:::o;58178:362::-;58246:14;58324:66;58315:75;;;;58457:19;58450:5;58446:31;58438:6;58435:43;58425:53;;58513:8;58505:6;58502:20;58492:30;;58178:362;;;;:::o;58548:789::-;58629:15;58620:6;:24;;;58612:33;;;;;;58656:11;58670:18;58676:3;58681:6;58670:18;;:5;:18::i;:::-;58656:32;;58699:17;58719:21;58725:3;58737:1;58719:21;;:5;:21::i;:::-;58699:41;;58751:11;58765:6;:17;58772:9;58765:17;;;;;;;;;;;;;;;;;;;;;58751:31;;58807:1;58799:4;:9;;;58795:89;;;58845:6;58825;:17;58832:9;58825:17;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;58866:7;;;;;58795:89;58896:15;58914:16;58920:3;58925:4;58914:16;;:5;:16::i;:::-;58896:34;;58941:11;58965:189;58980:1;58972:4;:9;;;;:26;;;;;58994:4;58985:13;;:6;:13;;;58972:26;58965:189;;;59024:4;59015:13;;;;59055:7;59043:19;;59086:6;:15;59093:7;59086:15;;;;;;;;;;;;;;;;;;;;;59079:22;;59126:16;59132:3;59137:4;59126:16;;:5;:16::i;:::-;59116:26;;58965:189;;;59180:4;59170:14;;:6;:14;;;59166:53;;;59201:7;;;;;;;59166:53;59243:1;59235:4;:9;;;59231:60;;59275:4;59261:6;:11;59268:3;59261:11;;;;;;;;;;;;:18;;;;;;;;;;;;;;;;;;59231:60;59323:6;59303;:17;59310:9;59303:17;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;58601:736;;;;;58548:789;;;:::o;35983:110::-;36048:7;36071:8;:16;36080:6;36071:16;;;;;;;;;;;;;;;;36064:23;;35983:110;;;:::o;36856:500::-;36981:4;37020:1;37005:17;;:3;:17;;;;36997:26;;;;;;37048:8;:15;37057:5;37048:15;;;;;;;;;;;;;;;;37038:6;:25;;37030:34;;;;;;37089:7;:14;37097:5;37089:14;;;;;;;;;;;;;;;:26;37104:10;37089:26;;;;;;;;;;;;;;;;37079:6;:36;;37071:45;;;;;;37143:27;37163:6;37143:8;:15;37152:5;37143:15;;;;;;;;;;;;;;;;:19;;:27;;;;:::i;:::-;37125:8;:15;37134:5;37125:15;;;;;;;;;;;;;;;:45;;;;37193:25;37211:6;37193:8;:13;37202:3;37193:13;;;;;;;;;;;;;;;;:17;;:25;;;;:::i;:::-;37177:8;:13;37186:3;37177:13;;;;;;;;;;;;;;;:41;;;;37254:38;37285:6;37254:7;:14;37262:5;37254:14;;;;;;;;;;;;;;;:26;37269:10;37254:26;;;;;;;;;;;;;;;;:30;;:38;;;;:::i;:::-;37225:7;:14;37233:5;37225:14;;;;;;;;;;;;;;;:26;37240:10;37225:26;;;;;;;;;;;;;;;:67;;;;37320:3;37304:28;;37313:5;37304:28;;;37325:6;37304:28;;;;;;:::i;:::-;;;;;;;;37346:4;37339:11;;36856:500;;;;;:::o;50886:342::-;50946:7;50966:13;51012:8;:14;51021:4;51012:14;;;;;;;;;;;;;;;;50982:27;:25;:27::i;:::-;:44;;;;:::i;:::-;50966:60;;51050:1;51041:5;:10;:31;;;;51071:1;51055:6;:12;51062:4;51055:12;;;;;;;;;;;;;;;;:17;51041:31;51037:72;;;51096:1;51089:8;;;;;51037:72;51119:14;51136:45;51153:6;:12;51160:4;51153:12;;;;;;;;;;;;;;;;51167:6;;51175:5;51136:16;:45::i;:::-;51119:62;;51208:6;:12;51215:4;51208:12;;;;;;;;;;;;;;;;51199:6;:21;;;;:::i;:::-;51192:28;;;;50886:342;;;;:::o;47463:173::-;47523:7;47581:13;;47563:15;:31;:65;;47615:13;;47563:65;;;47597:15;47563:65;47543:85;;47463:173;:::o;50000:378::-;50084:2;46125:1;46110:6;:12;46117:4;46110:12;;;;;;;;;;;;;;;;:16;46102:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;50111:10:::1;45401:18;45422:20;45437:4;45422:14;:20::i;:::-;45401:41;;45470:27;:25;:27::i;:::-;45453:8;:14;45462:4;45453:14;;;;;;;;;;;;;;;:44;;;;45525:1;45512:10;:14;45508:158;;;45559:10;45543:6;:12;45550:4;45543:12;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;45600:10;45584:12;;:26;;;;;;;:::i;:::-;;;;;;;;45637:4;45630:24;;;45643:10;45630:24;;;;;;:::i;:::-;;;;;;;;45508:158;50157:12:::2;;50147:6;:22;;50139:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;50218:6;50202:12;;:22;;;;;;;:::i;:::-;;;;;;;;50249:6;50235;:10;50242:2;50235:10;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;50274:12;;;;;;;;;;;:21;;;50296:2;50300:6;50274:33;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50266:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;50359:2;50349:21;;;50363:6;50349:21;;;;;;:::i;:::-;;;;;;;;45390:295:::1;46159:1;50000:378:::0;;;:::o;3243:98::-;3301:7;3332:1;3328;:5;;;;:::i;:::-;3321:12;;3243:98;;;;:::o;59815:447::-;59894:8;:14;59903:4;59894:14;;;;;;;;;;;;;;;;59884:6;:24;;59876:33;;;;;;60108:26;60127:6;60108:8;:14;60117:4;60108:14;;;;;;;;;;;;;;;;:18;;:26;;;;:::i;:::-;60091:8;:14;60100:4;60091:14;;;;;;;;;;;;;;;:43;;;;60156:24;60173:6;60156:12;;:16;;:24;;;;:::i;:::-;60141:12;:39;;;;60197:4;60192:18;;;60203:6;60192:18;;;;;;:::i;:::-;;;;;;;;60245:1;60222:34;;60231:4;60222:34;;;60249:6;60222:34;;;;;;:::i;:::-;;;;;;;;59815:447;;:::o;35432:338::-;35504:4;35540:1;35525:17;;:3;:17;;;;35517:26;;;;;;35568:8;:20;35577:10;35568:20;;;;;;;;;;;;;;;;35558:6;:30;;35550:39;;;;;;35621:32;35646:6;35621:8;:20;35630:10;35621:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;35598:8;:20;35607:10;35598:20;;;;;;;;;;;;;;;:55;;;;35676:25;35694:6;35676:8;:13;35685:3;35676:13;;;;;;;;;;;;;;;;:17;;:25;;;;:::i;:::-;35660:8;:13;35669:3;35660:13;;;;;;;;;;;;;;;:41;;;;35734:3;35713:33;;35722:10;35713:33;;;35739:6;35713:33;;;;;;:::i;:::-;;;;;;;;35760:4;35753:11;;35432:338;;;;:::o;41906:175::-;41998:1;41977:23;;:9;:23;;;;41969:32;;;;;;42041:9;42013:38;;42034:5;;;;;;;;;;;42013:38;;;;;;;;;;;;42066:9;42058:5;;:17;;;;;;;;;;;;;;;;;;41906:175;:::o;26709:183::-;26795:7;26822:62;26827:45;26831:37;26835:11;26844:1;26835:8;:11::i;:::-;26848:19;26853:5;26860:6;26848:4;:19::i;:::-;26831:3;:37::i;:::-;26870:1;26827:3;:45::i;:::-;26874:9;26822:4;:62::i;:::-;26815:69;;26709:183;;;;;:::o;26433:192::-;26485:6;26542:18;26537:1;:23;;26529:32;;;;;;26602:2;26597:1;:7;;26576:30;;26433:192;;;:::o;28708:268::-;28767:6;28824:1;28819;:6;;28811:15;;;;;;28841:14;28858:11;28864:1;28867;28858:5;:11::i;:::-;28841:28;;26144:34;28892:28;;:6;:28;;;;28884:37;;;;;;28950:6;28936:21;;;28708:268;;;;:::o;27130:250::-;27186:6;27230:13;27258:1;27246:13;;27253:1;27246:9;;:13;27230:29;;25979:35;27282:19;;:6;:19;;:42;;;;;26144:34;27305:19;;:6;:19;;27282:42;27274:51;;;;;;27354:6;27340:21;;;27130:250;;;;:::o;29301:3319::-;29358:6;29402:13;29422:1;29418;:5;;;:19;;;;;29436:1;29431;29427;:5;:10;29418:19;29402:35;;29454:12;29481:1;29477;:5;;;:14;;29490:1;29477:14;;;29486:1;29485:2;;29477:14;29454:38;;;;29507:17;29551:35;29539:47;;29615:19;29607:4;:27;29603:2817;;29664:2;29655:11;;;;;29685:785;29697:1;29692;:6;29685:785;;29738:1;29731:3;29727:1;:7;:12;29723:106;;29802:3;29793:4;29781:9;:16;29780:25;;29768:37;;29723:106;29875:3;29866:4;29859;:11;29858:20;;29851:27;;29918:1;29911:3;29907:1;:7;:12;29903:106;;29982:3;29973:4;29961:9;:16;29960:25;;29948:37;;29903:106;30055:3;30046:4;30039;:11;30038:20;;30031:27;;30098:1;30091:3;30087:1;:7;:12;30083:106;;30162:3;30153:4;30141:9;:16;30140:25;;30128:37;;30083:106;30235:3;30226:4;30219;:11;30218:20;;30211:27;;30278:1;30271:3;30267:1;:7;:12;30263:106;;30342:3;30333:4;30321:9;:16;30320:25;;30308:37;;30263:106;30415:3;30406:4;30399;:11;30398:20;;30391:27;;30449:1;30443:7;;;;;29685:785;;;30504:2;30490:16;;;;;29603:2817;;;30547:17;30567:2;30547:22;;30599:27;30592:4;:34;30588:132;;;30660:2;30651:11;;;;;30698:2;30685:15;;;;30588:132;30749:31;30742:4;:38;30738:136;;;30814:2;30805:11;;;;;30852:2;30839:15;;;;30738:136;30903:33;30896:4;:40;30892:136;;;30970:1;30961:10;;;;;31007:1;30994:14;;;;30892:136;31057:34;31050:4;:41;31046:137;;;31125:1;31116:10;;;;;31162:1;31149:14;;;;31046:137;31212:34;31205:4;:41;31201:137;;;31280:1;31271:10;;;;;31317:1;31304:14;;;;31201:137;31367:34;31360:4;:41;31356:137;;;31435:1;31426:10;;;;;31472:1;31459:14;;;;31356:137;31513:19;31555:755;31567:1;31562;:6;31555:755;;31613:2;31601:9;:14;31593:23;;;;;;31656:1;31649:3;31645:1;:7;:12;31641:357;;31720:3;31711:4;31699:9;:16;31698:25;;31686:37;;31765:9;31750:24;;;;31817:35;31805:9;:47;31801:174;;;31899:1;31885:15;;;;;31946:1;31931:16;;;;31801:174;31641:357;32044:3;32035:4;32028;:11;32027:20;;32020:27;;32084:1;32070:15;;;;;32120:35;32112:4;:43;32108:151;;32193:1;32184:10;;;;;32234:1;32221:14;;;;32108:151;32289:1;32283:7;;;;;31555:755;;;32352:2;32338:11;:16;32330:25;;;;;;32393:11;32388:2;:16;32374:30;;;;;30528:1892;;29603:2817;32434:13;32450:8;:49;;32489:9;32450:49;;;32469:9;32461:18;;32450:49;32434:65;;25979:35;32522:19;;:6;:19;;:42;;;;;26144:34;32545:19;;:6;:19;;32522:42;32514:51;;;;;;32594:6;32580:21;;;;;;29301:3319;;;;:::o;27713:665::-;27771:7;27825:1;27820;:6;27816:20;;;27835:1;27828:8;;;;27816:20;27866:1;27861;:6;;;;27853:15;;;;;;27885:10;27982:2;27942:34;27938:1;:38;27914:1;27907:9;;27899:78;27898:86;;27885:99;;27999:10;28039:3;28034:1;:8;;28027:1;28020:9;;28012:31;27999:44;;28074:50;28068:2;:56;;28060:65;;;;;;28147:2;28140:9;;;;;28313:2;28219:66;:96;28192:2;:123;;28166:164;;;;;;28357:2;28352;:7;28345:14;;;;27713:665;;;;;:::o;32952:1861::-;33011:7;33069:1;33064;:6;;33056:15;;;;;;33088:14;33128:50;33123:1;:55;33119:1569;;33218:1;33212:2;33207:1;:7;;33206:13;;;;;:::i;:::-;;;33197:22;;33119:1569;;;33258:11;33272:3;33258:17;;33294:10;33312:3;33307:1;:8;;33294:21;;33344:11;33338:2;:17;33334:107;;33387:2;33380:9;;;;;33419:2;33412:9;;;;33334:107;33469:7;33463:2;:13;33459:103;;33508:2;33501:9;;;;;33540:2;33533:9;;;;33459:103;33590:5;33584:2;:11;33580:99;;33627:1;33620:8;;;;;33658:1;33651:8;;;;33580:99;33707:4;33701:2;:10;33697:98;;33743:1;33736:8;;;;;33774:1;33767:8;;;;33697:98;33823:3;33817:2;:9;33813:97;;33858:1;33851:8;;;;;33889:1;33882:8;;;;33813:97;33938:3;33932:2;:9;33928:23;;33950:1;33943:8;;;;33928:23;34061:1;34053:3;34047;:9;34040:1;34036;:5;34035:22;;34034:28;34025:3;34019;:9;34013:1;:16;;34012:51;;;;;:::i;:::-;;;34003:60;;34100:34;34090:6;:44;;34082:53;;;;;;34156:10;34184:3;34179:1;:8;;34169:6;:19;34156:32;;34207:10;34234:34;34230:1;:38;34220:6;:49;34207:62;;34290:10;34308:3;34303:1;:8;;34290:21;;34330:10;34348:2;34343:1;:7;;34330:20;;34380:2;34375;:7;34371:20;;;34390:1;34384:7;;;;34371:20;34416:2;34410:8;;;;34485:3;34479:2;:9;;34474:14;;34516:2;34511;:7;34507:20;;;34526:1;34520:7;;;;34507:20;34552:2;34546:8;;;;34631:3;34625:2;:9;;34619:2;:15;34612:23;;;;:::i;:::-;;34671:1;34666:2;:6;;;;;:::i;:::-;;;34656:16;;;;33239:1449;;;;;;33119:1569;34722:34;34712:6;:44;;34704:53;;;;;;34787:6;34772:22;;;32952:1861;;;;:::o;7:90:1:-;41:7;84:5;77:13;70:21;59:32;;7:90;;;:::o;103:109::-;184:21;199:5;184:21;:::i;:::-;179:3;172:34;103:109;;:::o;218:210::-;305:4;343:2;332:9;328:18;320:26;;356:65;418:1;407:9;403:17;394:6;356:65;:::i;:::-;218:210;;;;:::o;434:75::-;467:6;500:2;494:9;484:19;;434:75;:::o;515:117::-;624:1;621;614:12;638:117;747:1;744;737:12;761:126;798:7;838:42;831:5;827:54;816:65;;761:126;;;:::o;893:96::-;930:7;959:24;977:5;959:24;:::i;:::-;948:35;;893:96;;;:::o;995:122::-;1068:24;1086:5;1068:24;:::i;:::-;1061:5;1058:35;1048:63;;1107:1;1104;1097:12;1048:63;995:122;:::o;1123:139::-;1169:5;1207:6;1194:20;1185:29;;1223:33;1250:5;1223:33;:::i;:::-;1123:139;;;;:::o;1268:77::-;1305:7;1334:5;1323:16;;1268:77;;;:::o;1351:122::-;1424:24;1442:5;1424:24;:::i;:::-;1417:5;1414:35;1404:63;;1463:1;1460;1453:12;1404:63;1351:122;:::o;1479:139::-;1525:5;1563:6;1550:20;1541:29;;1579:33;1606:5;1579:33;:::i;:::-;1479:139;;;;:::o;1624:474::-;1692:6;1700;1749:2;1737:9;1728:7;1724:23;1720:32;1717:119;;;1755:79;;:::i;:::-;1717:119;1875:1;1900:53;1945:7;1936:6;1925:9;1921:22;1900:53;:::i;:::-;1890:63;;1846:117;2002:2;2028:53;2073:7;2064:6;2053:9;2049:22;2028:53;:::i;:::-;2018:63;;1973:118;1624:474;;;;;:::o;2104:101::-;2140:7;2180:18;2173:5;2169:30;2158:41;;2104:101;;;:::o;2211:115::-;2296:23;2313:5;2296:23;:::i;:::-;2291:3;2284:36;2211:115;;:::o;2332:118::-;2419:24;2437:5;2419:24;:::i;:::-;2414:3;2407:37;2332:118;;:::o;2456:328::-;2575:4;2613:2;2602:9;2598:18;2590:26;;2626:69;2692:1;2681:9;2677:17;2668:6;2626:69;:::i;:::-;2705:72;2773:2;2762:9;2758:18;2749:6;2705:72;:::i;:::-;2456:328;;;;;:::o;2790:99::-;2842:6;2876:5;2870:12;2860:22;;2790:99;;;:::o;2895:169::-;2979:11;3013:6;3008:3;3001:19;3053:4;3048:3;3044:14;3029:29;;2895:169;;;;:::o;3070:307::-;3138:1;3148:113;3162:6;3159:1;3156:13;3148:113;;;3247:1;3242:3;3238:11;3232:18;3228:1;3223:3;3219:11;3212:39;3184:2;3181:1;3177:10;3172:15;;3148:113;;;3279:6;3276:1;3273:13;3270:101;;;3359:1;3350:6;3345:3;3341:16;3334:27;3270:101;3119:258;3070:307;;;:::o;3383:102::-;3424:6;3475:2;3471:7;3466:2;3459:5;3455:14;3451:28;3441:38;;3383:102;;;:::o;3491:364::-;3579:3;3607:39;3640:5;3607:39;:::i;:::-;3662:71;3726:6;3721:3;3662:71;:::i;:::-;3655:78;;3742:52;3787:6;3782:3;3775:4;3768:5;3764:16;3742:52;:::i;:::-;3819:29;3841:6;3819:29;:::i;:::-;3814:3;3810:39;3803:46;;3583:272;3491:364;;;;:::o;3861:313::-;3974:4;4012:2;4001:9;3997:18;3989:26;;4061:9;4055:4;4051:20;4047:1;4036:9;4032:17;4025:47;4089:78;4162:4;4153:6;4089:78;:::i;:::-;4081:86;;3861:313;;;;:::o;4180:120::-;4252:23;4269:5;4252:23;:::i;:::-;4245:5;4242:34;4232:62;;4290:1;4287;4280:12;4232:62;4180:120;:::o;4306:137::-;4351:5;4389:6;4376:20;4367:29;;4405:32;4431:5;4405:32;:::i;:::-;4306:137;;;;:::o;4449:617::-;4525:6;4533;4541;4590:2;4578:9;4569:7;4565:23;4561:32;4558:119;;;4596:79;;:::i;:::-;4558:119;4716:1;4741:53;4786:7;4777:6;4766:9;4762:22;4741:53;:::i;:::-;4731:63;;4687:117;4843:2;4869:53;4914:7;4905:6;4894:9;4890:22;4869:53;:::i;:::-;4859:63;;4814:118;4971:2;4997:52;5041:7;5032:6;5021:9;5017:22;4997:52;:::i;:::-;4987:62;;4942:117;4449:617;;;;;:::o;5072:329::-;5131:6;5180:2;5168:9;5159:7;5155:23;5151:32;5148:119;;;5186:79;;:::i;:::-;5148:119;5306:1;5331:53;5376:7;5367:6;5356:9;5352:22;5331:53;:::i;:::-;5321:63;;5277:117;5072:329;;;;:::o;5407:222::-;5500:4;5538:2;5527:9;5523:18;5515:26;;5551:71;5619:1;5608:9;5604:17;5595:6;5551:71;:::i;:::-;5407:222;;;;:::o;5635:619::-;5712:6;5720;5728;5777:2;5765:9;5756:7;5752:23;5748:32;5745:119;;;5783:79;;:::i;:::-;5745:119;5903:1;5928:53;5973:7;5964:6;5953:9;5949:22;5928:53;:::i;:::-;5918:63;;5874:117;6030:2;6056:53;6101:7;6092:6;6081:9;6077:22;6056:53;:::i;:::-;6046:63;;6001:118;6158:2;6184:53;6229:7;6220:6;6209:9;6205:22;6184:53;:::i;:::-;6174:63;;6129:118;5635:619;;;;;:::o;6260:329::-;6319:6;6368:2;6356:9;6347:7;6343:23;6339:32;6336:119;;;6374:79;;:::i;:::-;6336:119;6494:1;6519:53;6564:7;6555:6;6544:9;6540:22;6519:53;:::i;:::-;6509:63;;6465:117;6260:329;;;;:::o;6595:86::-;6630:7;6670:4;6663:5;6659:16;6648:27;;6595:86;;;:::o;6687:112::-;6770:22;6786:5;6770:22;:::i;:::-;6765:3;6758:35;6687:112;;:::o;6805:214::-;6894:4;6932:2;6921:9;6917:18;6909:26;;6945:67;7009:1;6998:9;6994:17;6985:6;6945:67;:::i;:::-;6805:214;;;;:::o;7025:118::-;7112:24;7130:5;7112:24;:::i;:::-;7107:3;7100:37;7025:118;;:::o;7149:222::-;7242:4;7280:2;7269:9;7265:18;7257:26;;7293:71;7361:1;7350:9;7346:17;7337:6;7293:71;:::i;:::-;7149:222;;;;:::o;7377:117::-;7486:1;7483;7476:12;7500:180;7548:77;7545:1;7538:88;7645:4;7642:1;7635:15;7669:4;7666:1;7659:15;7686:281;7769:27;7791:4;7769:27;:::i;:::-;7761:6;7757:40;7899:6;7887:10;7884:22;7863:18;7851:10;7848:34;7845:62;7842:88;;;7910:18;;:::i;:::-;7842:88;7950:10;7946:2;7939:22;7729:238;7686:281;;:::o;7973:129::-;8007:6;8034:20;;:::i;:::-;8024:30;;8063:33;8091:4;8083:6;8063:33;:::i;:::-;7973:129;;;:::o;8108:311::-;8185:4;8275:18;8267:6;8264:30;8261:56;;;8297:18;;:::i;:::-;8261:56;8347:4;8339:6;8335:17;8327:25;;8407:4;8401;8397:15;8389:23;;8108:311;;;:::o;8425:117::-;8534:1;8531;8524:12;8565:710;8661:5;8686:81;8702:64;8759:6;8702:64;:::i;:::-;8686:81;:::i;:::-;8677:90;;8787:5;8816:6;8809:5;8802:21;8850:4;8843:5;8839:16;8832:23;;8903:4;8895:6;8891:17;8883:6;8879:30;8932:3;8924:6;8921:15;8918:122;;;8951:79;;:::i;:::-;8918:122;9066:6;9049:220;9083:6;9078:3;9075:15;9049:220;;;9158:3;9187:37;9220:3;9208:10;9187:37;:::i;:::-;9182:3;9175:50;9254:4;9249:3;9245:14;9238:21;;9125:144;9109:4;9104:3;9100:14;9093:21;;9049:220;;;9053:21;8667:608;;8565:710;;;;;:::o;9298:370::-;9369:5;9418:3;9411:4;9403:6;9399:17;9395:27;9385:122;;9426:79;;:::i;:::-;9385:122;9543:6;9530:20;9568:94;9658:3;9650:6;9643:4;9635:6;9631:17;9568:94;:::i;:::-;9559:103;;9375:293;9298:370;;;;:::o;9674:311::-;9751:4;9841:18;9833:6;9830:30;9827:56;;;9863:18;;:::i;:::-;9827:56;9913:4;9905:6;9901:17;9893:25;;9973:4;9967;9963:15;9955:23;;9674:311;;;:::o;10008:710::-;10104:5;10129:81;10145:64;10202:6;10145:64;:::i;:::-;10129:81;:::i;:::-;10120:90;;10230:5;10259:6;10252:5;10245:21;10293:4;10286:5;10282:16;10275:23;;10346:4;10338:6;10334:17;10326:6;10322:30;10375:3;10367:6;10364:15;10361:122;;;10394:79;;:::i;:::-;10361:122;10509:6;10492:220;10526:6;10521:3;10518:15;10492:220;;;10601:3;10630:37;10663:3;10651:10;10630:37;:::i;:::-;10625:3;10618:50;10697:4;10692:3;10688:14;10681:21;;10568:144;10552:4;10547:3;10543:14;10536:21;;10492:220;;;10496:21;10110:608;;10008:710;;;;;:::o;10741:370::-;10812:5;10861:3;10854:4;10846:6;10842:17;10838:27;10828:122;;10869:79;;:::i;:::-;10828:122;10986:6;10973:20;11011:94;11101:3;11093:6;11086:4;11078:6;11074:17;11011:94;:::i;:::-;11002:103;;10818:293;10741:370;;;;:::o;11117:1039::-;11244:6;11252;11260;11309:2;11297:9;11288:7;11284:23;11280:32;11277:119;;;11315:79;;:::i;:::-;11277:119;11435:1;11460:53;11505:7;11496:6;11485:9;11481:22;11460:53;:::i;:::-;11450:63;;11406:117;11590:2;11579:9;11575:18;11562:32;11621:18;11613:6;11610:30;11607:117;;;11643:79;;:::i;:::-;11607:117;11748:78;11818:7;11809:6;11798:9;11794:22;11748:78;:::i;:::-;11738:88;;11533:303;11903:2;11892:9;11888:18;11875:32;11934:18;11926:6;11923:30;11920:117;;;11956:79;;:::i;:::-;11920:117;12061:78;12131:7;12122:6;12111:9;12107:22;12061:78;:::i;:::-;12051:88;;11846:303;11117:1039;;;;;:::o;12162:60::-;12190:3;12211:5;12204:12;;12162:60;;;:::o;12228:142::-;12278:9;12311:53;12329:34;12338:24;12356:5;12338:24;:::i;:::-;12329:34;:::i;:::-;12311:53;:::i;:::-;12298:66;;12228:142;;;:::o;12376:126::-;12426:9;12459:37;12490:5;12459:37;:::i;:::-;12446:50;;12376:126;;;:::o;12508:140::-;12572:9;12605:37;12636:5;12605:37;:::i;:::-;12592:50;;12508:140;;;:::o;12654:159::-;12755:51;12800:5;12755:51;:::i;:::-;12750:3;12743:64;12654:159;;:::o;12819:250::-;12926:4;12964:2;12953:9;12949:18;12941:26;;12977:85;13059:1;13048:9;13044:17;13035:6;12977:85;:::i;:::-;12819:250;;;;:::o;13075:1249::-;13227:6;13235;13243;13292:2;13280:9;13271:7;13267:23;13263:32;13260:119;;;13298:79;;:::i;:::-;13260:119;13446:1;13435:9;13431:17;13418:31;13476:18;13468:6;13465:30;13462:117;;;13498:79;;:::i;:::-;13462:117;13603:78;13673:7;13664:6;13653:9;13649:22;13603:78;:::i;:::-;13593:88;;13389:302;13758:2;13747:9;13743:18;13730:32;13789:18;13781:6;13778:30;13775:117;;;13811:79;;:::i;:::-;13775:117;13916:78;13986:7;13977:6;13966:9;13962:22;13916:78;:::i;:::-;13906:88;;13701:303;14071:2;14060:9;14056:18;14043:32;14102:18;14094:6;14091:30;14088:117;;;14124:79;;:::i;:::-;14088:117;14229:78;14299:7;14290:6;14279:9;14275:22;14229:78;:::i;:::-;14219:88;;14014:303;13075:1249;;;;;:::o;14330:474::-;14398:6;14406;14455:2;14443:9;14434:7;14430:23;14426:32;14423:119;;;14461:79;;:::i;:::-;14423:119;14581:1;14606:53;14651:7;14642:6;14631:9;14627:22;14606:53;:::i;:::-;14596:63;;14552:117;14708:2;14734:53;14779:7;14770:6;14759:9;14755:22;14734:53;:::i;:::-;14724:63;;14679:118;14330:474;;;;;:::o;14810:180::-;14858:77;14855:1;14848:88;14955:4;14952:1;14945:15;14979:4;14976:1;14969:15;14996:305;15036:3;15055:20;15073:1;15055:20;:::i;:::-;15050:25;;15089:20;15107:1;15089:20;:::i;:::-;15084:25;;15243:1;15175:66;15171:74;15168:1;15165:81;15162:107;;;15249:18;;:::i;:::-;15162:107;15293:1;15290;15286:9;15279:16;;14996:305;;;;:::o;15307:233::-;15346:3;15369:24;15387:5;15369:24;:::i;:::-;15360:33;;15415:66;15408:5;15405:77;15402:103;;;15485:18;;:::i;:::-;15402:103;15532:1;15525:5;15521:13;15514:20;;15307:233;;;:::o;15546:191::-;15586:4;15606:20;15624:1;15606:20;:::i;:::-;15601:25;;15640:20;15658:1;15640:20;:::i;:::-;15635:25;;15679:1;15676;15673:8;15670:34;;;15684:18;;:::i;:::-;15670:34;15729:1;15726;15722:9;15714:17;;15546:191;;;;:::o;15743:181::-;15883:33;15879:1;15871:6;15867:14;15860:57;15743:181;:::o;15930:366::-;16072:3;16093:67;16157:2;16152:3;16093:67;:::i;:::-;16086:74;;16169:93;16258:3;16169:93;:::i;:::-;16287:2;16282:3;16278:12;16271:19;;15930:366;;;:::o;16302:419::-;16468:4;16506:2;16495:9;16491:18;16483:26;;16555:9;16549:4;16545:20;16541:1;16530:9;16526:17;16519:47;16583:131;16709:4;16583:131;:::i;:::-;16575:139;;16302:419;;;:::o;16727:167::-;16867:19;16863:1;16855:6;16851:14;16844:43;16727:167;:::o;16900:366::-;17042:3;17063:67;17127:2;17122:3;17063:67;:::i;:::-;17056:74;;17139:93;17228:3;17139:93;:::i;:::-;17257:2;17252:3;17248:12;17241:19;;16900:366;;;:::o;17272:419::-;17438:4;17476:2;17465:9;17461:18;17453:26;;17525:9;17519:4;17515:20;17511:1;17500:9;17496:17;17489:47;17553:131;17679:4;17553:131;:::i;:::-;17545:139;;17272:419;;;:::o;17697:230::-;17837:34;17833:1;17825:6;17821:14;17814:58;17906:13;17901:2;17893:6;17889:15;17882:38;17697:230;:::o;17933:366::-;18075:3;18096:67;18160:2;18155:3;18096:67;:::i;:::-;18089:74;;18172:93;18261:3;18172:93;:::i;:::-;18290:2;18285:3;18281:12;18274:19;;17933:366;;;:::o;18305:419::-;18471:4;18509:2;18498:9;18494:18;18486:26;;18558:9;18552:4;18548:20;18544:1;18533:9;18529:17;18522:47;18586:131;18712:4;18586:131;:::i;:::-;18578:139;;18305:419;;;:::o;18730:167::-;18870:19;18866:1;18858:6;18854:14;18847:43;18730:167;:::o;18903:366::-;19045:3;19066:67;19130:2;19125:3;19066:67;:::i;:::-;19059:74;;19142:93;19231:3;19142:93;:::i;:::-;19260:2;19255:3;19251:12;19244:19;;18903:366;;;:::o;19275:419::-;19441:4;19479:2;19468:9;19464:18;19456:26;;19528:9;19522:4;19518:20;19514:1;19503:9;19499:17;19492:47;19556:131;19682:4;19556:131;:::i;:::-;19548:139;;19275:419;;;:::o;19700:167::-;19840:19;19836:1;19828:6;19824:14;19817:43;19700:167;:::o;19873:366::-;20015:3;20036:67;20100:2;20095:3;20036:67;:::i;:::-;20029:74;;20112:93;20201:3;20112:93;:::i;:::-;20230:2;20225:3;20221:12;20214:19;;19873:366;;;:::o;20245:419::-;20411:4;20449:2;20438:9;20434:18;20426:26;;20498:9;20492:4;20488:20;20484:1;20473:9;20469:17;20462:47;20526:131;20652:4;20526:131;:::i;:::-;20518:139;;20245:419;;;:::o;20670:174::-;20810:26;20806:1;20798:6;20794:14;20787:50;20670:174;:::o;20850:366::-;20992:3;21013:67;21077:2;21072:3;21013:67;:::i;:::-;21006:74;;21089:93;21178:3;21089:93;:::i;:::-;21207:2;21202:3;21198:12;21191:19;;20850:366;;;:::o;21222:419::-;21388:4;21426:2;21415:9;21411:18;21403:26;;21475:9;21469:4;21465:20;21461:1;21450:9;21446:17;21439:47;21503:131;21629:4;21503:131;:::i;:::-;21495:139;;21222:419;;;:::o;21647:178::-;21787:30;21783:1;21775:6;21771:14;21764:54;21647:178;:::o;21831:366::-;21973:3;21994:67;22058:2;22053:3;21994:67;:::i;:::-;21987:74;;22070:93;22159:3;22070:93;:::i;:::-;22188:2;22183:3;22179:12;22172:19;;21831:366;;;:::o;22203:419::-;22369:4;22407:2;22396:9;22392:18;22384:26;;22456:9;22450:4;22446:20;22442:1;22431:9;22427:17;22420:47;22484:131;22610:4;22484:131;:::i;:::-;22476:139;;22203:419;;;:::o;22628:180::-;22676:77;22673:1;22666:88;22773:4;22770:1;22763:15;22797:4;22794:1;22787:15;22814:332;22935:4;22973:2;22962:9;22958:18;22950:26;;22986:71;23054:1;23043:9;23039:17;23030:6;22986:71;:::i;:::-;23067:72;23135:2;23124:9;23120:18;23111:6;23067:72;:::i;:::-;22814:332;;;;;:::o;23152:116::-;23222:21;23237:5;23222:21;:::i;:::-;23215:5;23212:32;23202:60;;23258:1;23255;23248:12;23202:60;23152:116;:::o;23274:137::-;23328:5;23359:6;23353:13;23344:22;;23375:30;23399:5;23375:30;:::i;:::-;23274:137;;;;:::o;23417:345::-;23484:6;23533:2;23521:9;23512:7;23508:23;23504:32;23501:119;;;23539:79;;:::i;:::-;23501:119;23659:1;23684:61;23737:7;23728:6;23717:9;23713:22;23684:61;:::i;:::-;23674:71;;23630:125;23417:345;;;;:::o;23768:171::-;23908:23;23904:1;23896:6;23892:14;23885:47;23768:171;:::o;23945:366::-;24087:3;24108:67;24172:2;24167:3;24108:67;:::i;:::-;24101:74;;24184:93;24273:3;24184:93;:::i;:::-;24302:2;24297:3;24293:12;24286:19;;23945:366;;;:::o;24317:419::-;24483:4;24521:2;24510:9;24506:18;24498:26;;24570:9;24564:4;24560:20;24556:1;24545:9;24541:17;24534:47;24598:131;24724:4;24598:131;:::i;:::-;24590:139;;24317:419;;;:::o;24742:180::-;24790:77;24787:1;24780:88;24887:4;24884:1;24877:15;24911:4;24908:1;24901:15;24928:180;24976:77;24973:1;24966:88;25073:4;25070:1;25063:15;25097:4;25094:1;25087:15

Swarm Source

ipfs://95dd2232a05e246c40ebd55592a8120f02571da96e02e80c4c9b3da1b82403fb
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.