ETH Price: $3,563.40 (-0.10%)
 

Overview

Max Total Supply

174,732.472459492789637604 pSCALE

Holders

85

Market

Price

$0.00 @ 0.000000 ETH

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.198827474452836148 pSCALE

Value
$0.00
0x0e9b063789909565ceda1fba162474405a151e66
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
pSCALE

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at basescan.org on 2024-01-05
*/

// File: @openzeppelin/[email protected]/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     *
     * Furthermore, `isContract` will also return true if the target contract within
     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
     * which only has an effect at the end of a transaction.
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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://consensys.net/diligence/blog/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.8.0/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 functionCallWithValue(target, data, 0, "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");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or 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 {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // 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
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

// File: @openzeppelin/[email protected]/token/ERC20/extensions/IERC20Permit.sol


// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

// File: @openzeppelin/[email protected]/security/ReentrancyGuard.sol


// OpenZeppelin Contracts (last updated v4.9.0) (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() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

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

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == _ENTERED;
    }
}

// File: @openzeppelin/[email protected]/utils/Context.sol


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

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/[email protected]/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

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

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/[email protected]/access/Ownable2Step.sol


// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership} and {acceptOwnership}.
 *
 * This module is used through inheritance. It will make available all functions
 * from parent (Ownable).
 */
abstract contract Ownable2Step is Ownable {
    address private _pendingOwner;

    event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Returns the address of the pending owner.
     */
    function pendingOwner() public view virtual returns (address) {
        return _pendingOwner;
    }

    /**
     * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual override onlyOwner {
        _pendingOwner = newOwner;
        emit OwnershipTransferStarted(owner(), newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual override {
        delete _pendingOwner;
        super._transferOwnership(newOwner);
    }

    /**
     * @dev The new owner accepts the ownership transfer.
     */
    function acceptOwnership() public virtual {
        address sender = _msgSender();
        require(pendingOwner() == sender, "Ownable2Step: caller is not the new owner");
        _transferOwnership(sender);
    }
}

// File: @openzeppelin/[email protected]/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

    /**
     * @dev 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 `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount) external returns (bool);
}

// File: @openzeppelin/[email protected]/token/ERC20/utils/SafeERC20.sol


// OpenZeppelin Contracts (last updated v4.9.3) (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;

    /**
     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     */
    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    /**
     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the
     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.
     */
    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));
    }

    /**
     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     */
    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 oldAllowance = token.allowance(address(this), spender);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));
    }

    /**
     * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     */
    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");
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));
        }
    }

    /**
     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval
     * to be set to zero before setting it to a non-zero value, such as USDT.
     */
    function forceApprove(IERC20 token, address spender, uint256 value) internal {
        bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);

        if (!_callOptionalReturnBool(token, approvalCall)) {
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));
            _callOptionalReturn(token, approvalCall);
        }
    }

    /**
     * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`.
     * Revert on invalid signature.
     */
    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
    }

    /**
     * @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");
        require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
    }

    /**
     * @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).
     *
     * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.
     */
    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
        // 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 cannot use {Address-functionCall} here since this should return false
        // and not revert is the subcall reverts.

        (bool success, bytes memory returndata) = address(token).call(data);
        return
            success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));
    }
}

// File: @openzeppelin/[email protected]/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// File: @openzeppelin/[email protected]/token/ERC20/ERC20.sol


// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the default value returned by this function, unless
     * it's overridden.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(address from, address to, uint256 amount) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}
}

// File: @openzeppelin/[email protected]/token/ERC20/extensions/ERC20Burnable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol)

pragma solidity ^0.8.0;



/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        _spendAllowance(account, _msgSender(), amount);
        _burn(account, amount);
    }
}

// File: pTOKEN.sol

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;





/**
 * @title pTOKEN, Yield bearing token backed by ERC20
 *
 * @notice The backing / pTOKEN ratio is designed to appreciate for every mints and redeems that occur.
 * @custom:purpose The main purpose of pTOKENs is to generate revenue and contribute to bribing economy of ve(3;3) Dexes while being backed
 *
 * @author Michael Damiani
 */
contract pSCALE is ERC20Burnable, Ownable2Step, ReentrancyGuard {

    using SafeERC20 for IERC20;

    /**
     * @custom:section                           ** ERRORS **
     */
    error ZeroAddressNotAllowed();
    error MustTradeOverMin();
    error MintAndRedeemFeeNotInRange();
    error TeamFeeNotInRange();
    error NotStartedYet();
    error ContractAlreadyFilled();

    /**
     * @custom:section                           ** IMMUTABLES **
     */
    IERC20 public immutable _BACKING;

    /**
     * @custom:section                           ** CONSTANTS **
     */
    uint256 private constant _MIN = 1000;
    uint256 private constant _FEE_BASE_1000 = 1000;

    /**
     * @custom:section                           **  STATE VARIABLES **
     */
    uint256 public MINT_AND_REDEEM_FEE = 967; // MINT_AND_REDEEM_FEE is the total amount of Fees, Fees are calculated by taking _FEE_BASE_1000 dividing MINT_AND_REDEEM_FEE and dividing by 100 to get the percentage.
    uint256 public FEES = 35; //FEES include both team profit and liquidity incentives, FEES amount is sent to feeAddress that is a FeeSplitter contract which is going to split the FEES between team wallet/ treasury multisig and Liquidity incentives wallet/ multisig

    uint256 public totalBacking;
    address payable public feeAddress;

    bool public start;

    /**
     * @custom:section                           ** EVENTS **
     */
    event PriceAfterMint(
        uint256 indexed time,
        uint256 indexed recieved,
        uint256 indexed sent
    );
    event PriceAfterRedeem(
        uint256 indexed time,
        uint256 indexed recieved,
        uint256 indexed sent
    );
    event FeeAddressUpdated(address indexed newFeeAddress);
    event TotalBackingFixed(uint256 indexed totalBackingEmergencyFixed);
    event MintAndRedeemFeeUpdated(uint256 indexed MINT_AND_REDEEM_FEE);
    event TeamFeeUpdated(uint256 indexed FEES);

    /**
     * @custom:section                           ** CONSTRUCTOR **
     */
    constructor(address _feeAddress, address _backing) ERC20("pSCALE", "pSCALE") Ownable2Step() {
        if (_feeAddress == address(0)) revert ZeroAddressNotAllowed();
        if (_backing == address(0)) revert ZeroAddressNotAllowed();

        feeAddress = payable(_feeAddress);
        _BACKING = IERC20(_backing);
    }

    /**
     * @custom:section                           ** EXTERNAL FUNCTIONS **
     */

    /**
     * @param _value: Fill the contract with the first amount of _BACKING
     * @notice need start = false
     * @notice  this function doesn't have fees, it will mint pTOKEN in a 1:1 ratio with _value
     */
    function fillContract(uint256 _value) external onlyOwner {
        if (start == true) revert ContractAlreadyFilled();

        SafeERC20.safeTransferFrom(_BACKING, msg.sender, address(this), _value);
        _mint(msg.sender, _value);
        transfer(0x000000000000000000000000000000000000dEaD, 1000);

        totalBacking = _BACKING.balanceOf(address(this));
    }

    function setStart() external onlyOwner {    
        start = true;
    }

    /**
     * @param receiver: is the address that will receive the pTOKEN minted
     * @notice This function is used by users that want to mint pTOKEN by depositing the corrisponding amount of Backing + a dynamic fee
     * @notice The Backing / pTOKEN ratio will increase after every mint
     */
    function mint(address receiver, uint256 _amount) external nonReentrant {
        if (_amount < _MIN) revert MustTradeOverMin();
        if (!start) revert NotStartedYet();

        uint256 pToken = _BACKINGtoPTOKEN(_amount);

        uint256 backingToFeeAddress = _amount / FEES;
        totalBacking += (_amount - backingToFeeAddress);
        
        _BACKING.safeTransferFrom(msg.sender, address(this), _amount);
        _BACKING.safeTransfer(feeAddress, backingToFeeAddress);

        _mint(receiver, (pToken * MINT_AND_REDEEM_FEE) / _FEE_BASE_1000);

        emit PriceAfterMint(block.timestamp, pToken, _amount);
    }

    /**
     * @param _amount: is the amount of pTOKEN that the user want to burn in order to redeem the corrisponding amount of Backing
     * @notice This function is used by users that want to burn their balance of pTOKEN and redeem the corrisponding amount of Backing - dynamic fees from 2% up to 5%
     * @notice The Backing / pTOKEN ratio will increase after every redeem
     */
    function redeem(uint256 _amount) external nonReentrant {
        if (_amount < _MIN) revert MustTradeOverMin();

        uint256 backing = _PTOKENtoBACKING(_amount);

        uint256 backingToFeeAddress = backing / FEES;
        uint256 backingToSender = (backing * MINT_AND_REDEEM_FEE) / _FEE_BASE_1000;
        totalBacking -= (backingToSender + backingToFeeAddress);

        _burn(msg.sender, _amount);

        SafeERC20.safeTransfer(_BACKING, feeAddress, backingToFeeAddress);

        SafeERC20.safeTransfer(_BACKING, msg.sender, backingToSender);

        emit PriceAfterRedeem(block.timestamp, _amount, backing);
    }

    /**
     * @param _address: The Address that will receive the Liquidty Incentives and Team Fee
     * @notice This function will be used to update the feeAddress
     */
    function setFeeAddress(address _address) external onlyOwner {
        _assemblyOwnerNotZero(_address);
        feeAddress = payable(_address);

        emit FeeAddressUpdated(_address);
    }

    /**
     * @param _amount: total fee amount, 1000 / _amount / 100 = total fee percentage
     * @notice this function is used by Owner to modify the total FEE %
     */
    function setMintAndRedeemFee(uint16 _amount) external onlyOwner {
        if(_amount > 990 || _amount < 960) revert MintAndRedeemFeeNotInRange();
        MINT_AND_REDEEM_FEE = _amount;
        emit MintAndRedeemFeeUpdated(_amount);
    }

    /**
     * @param _amount: 
     * @notice Team fee can't be more than 3.33% and less than 1% 
     * @notice Incentives for liquidity providers are included in the Team fee (FEES)
     */
    function setTeamFee(uint16 _amount) external onlyOwner {
        if(_amount > 100 || _amount < 30) revert TeamFeeNotInRange(); 
        FEES = _amount;
        emit TeamFeeUpdated(_amount);
    }

    /**
     * @notice This function is used to reflect the correct amount of totalBacking in case some unexpected bug occur
     */
    function emergencyFixTotalBacking() external onlyOwner {
        totalBacking = _BACKING.balanceOf(address(this));

        emit TotalBackingFixed(address(this).balance);
    }

    /**
     * @custom:section                           ** INTERNAL FUNCTIONS **
     */

    /**
     * @custom:section                           ** PRIVATE FUNCTIONS **
     */

    /**
     * @param _value: is the amount of backing
     * @notice This function is used inside other function to get the current backing / pTOKEN ratio
     */
    function _PTOKENtoBACKING(uint256 _value) private view returns (uint256) {
        return (_value * totalBacking) / totalSupply();
    }

    /**
     * @param _value: is the amount of pTOKENs
     * @notice This function is used inside other function to get the current pTOKEN / Backing ratio
     */
    function _BACKINGtoPTOKEN(uint256 _value) private view returns (uint256) {
        return (_value * totalSupply()) / (totalBacking);
    }

    /**
     * @param _addr: Is the address used in the functions that call the _assemblyOwnerNotZero function
     * @notice This function is used inside other function to check that the address put as parameter is different from the zero address. It saves gas compared to a if statement + a revert with a custom error
     */
    function _assemblyOwnerNotZero(address _addr) private pure {
        assembly {
            if iszero(_addr) {
                mstore(0x00, "Zero address")
                revert(0x00, 0x20)
            }
        }
    }

    /**
     * @custom:section                           **  EXTERNAL VIEW / PURE FUNCTIONS **
     */

    /**
     * @param _amount: is the amount of backing
     * @notice This function is used inside other function to get the current Redeem price of pTOKEN in Backing
     */
    function getRedeemPrice(uint256 _amount) external view returns (uint256) {
        uint256 ratio = _PTOKENtoBACKING(_amount);
        uint256 redeemPrice = (ratio * MINT_AND_REDEEM_FEE) / _FEE_BASE_1000;
        return redeemPrice;
    }

    /**
     * @param _amount: is the amount of backing
     * @notice This function is used inside other function to get the current Mint price of pTOKEN in Backing
     */
    function getMintPrice(uint256 _amount) external view returns (uint256) {
        uint256 ratio = _PTOKENtoBACKING(_amount);
        uint256 mintPrice = (ratio * _FEE_BASE_1000) / MINT_AND_REDEEM_FEE;
        return mintPrice;
    }

    /**
     * @notice This function is used inside other function to get the total amount of Backing in the contract
     */
    function getTotalBacking() external view returns (uint256) {
        return totalBacking;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_feeAddress","type":"address"},{"internalType":"address","name":"_backing","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ContractAlreadyFilled","type":"error"},{"inputs":[],"name":"MintAndRedeemFeeNotInRange","type":"error"},{"inputs":[],"name":"MustTradeOverMin","type":"error"},{"inputs":[],"name":"NotStartedYet","type":"error"},{"inputs":[],"name":"TeamFeeNotInRange","type":"error"},{"inputs":[],"name":"ZeroAddressNotAllowed","type":"error"},{"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":"newFeeAddress","type":"address"}],"name":"FeeAddressUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"MINT_AND_REDEEM_FEE","type":"uint256"}],"name":"MintAndRedeemFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","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":[{"indexed":true,"internalType":"uint256","name":"time","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"recieved","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"sent","type":"uint256"}],"name":"PriceAfterMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"time","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"recieved","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"sent","type":"uint256"}],"name":"PriceAfterRedeem","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"FEES","type":"uint256"}],"name":"TeamFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"totalBackingEmergencyFixed","type":"uint256"}],"name":"TotalBackingFixed","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"},{"inputs":[],"name":"FEES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_AND_REDEEM_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_BACKING","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","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":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyFixTotalBacking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"fillContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"getMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"getRedeemPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalBacking","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"redeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_amount","type":"uint16"}],"name":"setMintAndRedeemFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_amount","type":"uint16"}],"name":"setTeamFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"start","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBacking","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040526103c760085560236009553480156200001c57600080fd5b5060405162003928380380620039288339818101604052810190620000429190620003bd565b6040518060400160405280600681526020017f705343414c4500000000000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f705343414c4500000000000000000000000000000000000000000000000000008152508160039081620000bf91906200067e565b508060049081620000d191906200067e565b505050620000f4620000e86200024760201b60201c565b6200024f60201b60201c565b6001600781905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000163576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620001ca576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050505062000765565b600033905090565b600660006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556200028a816200028d60201b620013a01760201c565b50565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620003858262000358565b9050919050565b620003978162000378565b8114620003a357600080fd5b50565b600081519050620003b7816200038c565b92915050565b60008060408385031215620003d757620003d662000353565b5b6000620003e785828601620003a6565b9250506020620003fa85828601620003a6565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200048657607f821691505b6020821081036200049c576200049b6200043e565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005067fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620004c7565b620005128683620004c7565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200055f6200055962000553846200052a565b62000534565b6200052a565b9050919050565b6000819050919050565b6200057b836200053e565b620005936200058a8262000566565b848454620004d4565b825550505050565b600090565b620005aa6200059b565b620005b781848462000570565b505050565b5b81811015620005df57620005d3600082620005a0565b600181019050620005bd565b5050565b601f8211156200062e57620005f881620004a2565b6200060384620004b7565b8101602085101562000613578190505b6200062b6200062285620004b7565b830182620005bc565b50505b505050565b600082821c905092915050565b6000620006536000198460080262000633565b1980831691505092915050565b60006200066e838362000640565b9150826002028217905092915050565b620006898262000404565b67ffffffffffffffff811115620006a557620006a46200040f565b5b620006b182546200046d565b620006be828285620005e3565b600060209050601f831160018114620006f65760008415620006e1578287015190505b620006ed858262000660565b8655506200075d565b601f1984166200070686620004a2565b60005b82811015620007305784890151825560018201915060208501945060208101905062000709565b868310156200075057848901516200074c601f89168262000640565b8355505b6001600288020188555050505b505050505050565b608051613176620007b260003960008181610672015281816107530152818161099d01528181610a0b01528181610e9201528181610ed4015281816110f5015261114201526131766000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c806379cc679011610125578063a9059cbb116100ad578063dd62ed3e1161007c578063dd62ed3e146105cc578063e30c3978146105fc578063eb2cd2581461061a578063f2fde38b14610638578063f40fa4bc1461065457610211565b8063a9059cbb14610546578063be9a655514610576578063c38f2bfe14610594578063db006a75146105b057610211565b806392054fe7116100f457806392054fe71461048e57806395d89b41146104ac578063a457c2d7146104ca578063a492fbc6146104fa578063a88df21a1461052a57610211565b806379cc67901461041a5780638705fcd4146104365780638b7b23ee146104525780638da5cb5b1461047057610211565b806335975a37116101a857806342966c681161017757806342966c681461038a578063559e775b146103a657806370a08231146103d6578063715018a61461040657806379ba50971461041057610211565b806335975a3714610316578063395093511461032057806340c10f1914610350578063412753581461036c57610211565b806318160ddd116101e457806318160ddd1461028c57806319f04174146102aa57806323b872dd146102c8578063313ce567146102f857610211565b8063029cd2421461021657806306fdde0314610234578063095ea7b31461025257806316f9b46714610282575b600080fd5b61021e610670565b60405161022b9190612215565b60405180910390f35b61023c610694565b60405161024991906122c0565b60405180910390f35b61026c6004803603810190610267919061235b565b610726565b60405161027991906123b6565b60405180910390f35b61028a610749565b005b610294610820565b6040516102a191906123e0565b60405180910390f35b6102b261082a565b6040516102bf91906123e0565b60405180910390f35b6102e260048036038101906102dd91906123fb565b610834565b6040516102ef91906123b6565b60405180910390f35b610300610863565b60405161030d919061246a565b60405180910390f35b61031e61086c565b005b61033a6004803603810190610335919061235b565b610891565b60405161034791906123b6565b60405180910390f35b61036a6004803603810190610365919061235b565b6108c8565b005b610374610ab0565b60405161038191906124a6565b60405180910390f35b6103a4600480360381019061039f91906124c1565b610ad6565b005b6103c060048036038101906103bb91906124c1565b610aea565b6040516103cd91906123e0565b60405180910390f35b6103f060048036038101906103eb91906124ee565b610b21565b6040516103fd91906123e0565b60405180910390f35b61040e610b69565b005b610418610b7d565b005b610434600480360381019061042f919061235b565b610c0a565b005b610450600480360381019061044b91906124ee565b610c2a565b005b61045a610cc2565b60405161046791906123e0565b60405180910390f35b610478610cc8565b604051610485919061252a565b60405180910390f35b610496610cf2565b6040516104a391906123e0565b60405180910390f35b6104b4610cf8565b6040516104c191906122c0565b60405180910390f35b6104e460048036038101906104df919061235b565b610d8a565b6040516104f191906123b6565b60405180910390f35b610514600480360381019061050f91906124c1565b610e01565b60405161052191906123e0565b60405180910390f35b610544600480360381019061053f91906124c1565b610e38565b005b610560600480360381019061055b919061235b565b610f75565b60405161056d91906123b6565b60405180910390f35b61057e610f98565b60405161058b91906123b6565b60405180910390f35b6105ae60048036038101906105a9919061257f565b610fab565b005b6105ca60048036038101906105c591906124c1565b611040565b005b6105e660048036038101906105e191906125ac565b6111a5565b6040516105f391906123e0565b60405180910390f35b61060461122c565b604051610611919061252a565b60405180910390f35b610622611256565b60405161062f91906123e0565b60405180910390f35b610652600480360381019061064d91906124ee565b61125c565b005b61066e6004803603810190610669919061257f565b611309565b005b7f000000000000000000000000000000000000000000000000000000000000000081565b6060600380546106a39061261b565b80601f01602080910402602001604051908101604052809291908181526020018280546106cf9061261b565b801561071c5780601f106106f15761010080835404028352916020019161071c565b820191906000526020600020905b8154815290600101906020018083116106ff57829003601f168201915b5050505050905090565b600080610731611466565b905061073e81858561146e565b600191505092915050565b610751611637565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016107aa919061252a565b602060405180830381865afa1580156107c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107eb9190612661565b600a81905550477fa3faf2f1eb729d9e646e40f512a8458c02057ee480d3b576a37e8a8ab30f055560405160405180910390a2565b6000600254905090565b6000600a54905090565b60008061083f611466565b905061084c8582856116b5565b610857858585611741565b60019150509392505050565b60006012905090565b610874611637565b6001600b60146101000a81548160ff021916908315150217905550565b60008061089c611466565b90506108bd8185856108ae85896111a5565b6108b891906126bd565b61146e565b600191505092915050565b6108d06119b7565b6103e881101561090c576040517f2b4db67a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b60149054906101000a900460ff16610952576040517f61935eac00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061095d82611a06565b905060006009548361096f9190612720565b9050808361097d9190612751565b600a600082825461098e91906126bd565b925050819055506109e23330857f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611a2f909392919063ffffffff16565b610a4f600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611ab89092919063ffffffff16565b610a73846103e860085485610a649190612785565b610a6e9190612720565b611b3e565b8282427f079d4fba3fc168dbd2a0c2a5235112b3442d90a21282f7b69506d05a46fdbbb760405160405180910390a45050610aac611c94565b5050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610ae7610ae1611466565b82611c9e565b50565b600080610af683611e6b565b905060006008546103e883610b0b9190612785565b610b159190612720565b90508092505050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610b71611637565b610b7b6000611e94565b565b6000610b87611466565b90508073ffffffffffffffffffffffffffffffffffffffff16610ba861122c565b73ffffffffffffffffffffffffffffffffffffffff1614610bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf590612839565b60405180910390fd5b610c0781611e94565b50565b610c1c82610c16611466565b836116b5565b610c268282611c9e565b5050565b610c32611637565b610c3b81611ec5565b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f446e39bcf1b47cfadfaa23442cb4b34682cfe6bd9220da084894e3b1f834e4f360405160405180910390a250565b60095481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60085481565b606060048054610d079061261b565b80601f0160208091040260200160405190810160405280929190818152602001828054610d339061261b565b8015610d805780601f10610d5557610100808354040283529160200191610d80565b820191906000526020600020905b815481529060010190602001808311610d6357829003601f168201915b5050505050905090565b600080610d95611466565b90506000610da382866111a5565b905083811015610de8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddf906128cb565b60405180910390fd5b610df5828686840361146e565b60019250505092915050565b600080610e0d83611e6b565b905060006103e860085483610e229190612785565b610e2c9190612720565b90508092505050919050565b610e40611637565b60011515600b60149054906101000a900460ff16151503610e8d576040517fde55c76500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610eb97f0000000000000000000000000000000000000000000000000000000000000000333084611a2f565b610ec33382611b3e565b610ed161dead6103e8610f75565b507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610f2b919061252a565b602060405180830381865afa158015610f48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6c9190612661565b600a8190555050565b600080610f80611466565b9050610f8d818585611741565b600191505092915050565b600b60149054906101000a900460ff1681565b610fb3611637565b60648161ffff161180610fca5750601e8161ffff16105b15611001576040517f7f176cee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8061ffff166009819055508061ffff167f9de4e85041d310d87df38a671e7ecf270c37d73ea017960b904af7051205962160405160405180910390a250565b6110486119b7565b6103e8811015611084576040517f2b4db67a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061108f82611e6b565b90506000600954826110a19190612720565b905060006103e8600854846110b69190612785565b6110c09190612720565b905081816110ce91906126bd565b600a60008282546110df9190612751565b925050819055506110f03385611c9e565b61113d7f0000000000000000000000000000000000000000000000000000000000000000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611ab8565b6111687f00000000000000000000000000000000000000000000000000000000000000003383611ab8565b8284427f1be07ad598d802b0a04e208e5f3dfe7eaf27339c0f0e4a75ddba517bbe5c8f3660405160405180910390a45050506111a2611c94565b50565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600a5481565b611264611637565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff166112c4610cc8565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b611311611637565b6103de8161ffff16118061132a57506103c08161ffff16105b15611361576040517f48565ad500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8061ffff166008819055508061ffff167fa7aaf5668e7d5e60bfa38b5d07a3178204a2d8cb16f5a03678c20f42c795429560405160405180910390a250565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036114dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d49061295d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361154c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611543906129ef565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161162a91906123e0565b60405180910390a3505050565b61163f611466565b73ffffffffffffffffffffffffffffffffffffffff1661165d610cc8565b73ffffffffffffffffffffffffffffffffffffffff16146116b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116aa90612a5b565b60405180910390fd5b565b60006116c184846111a5565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461173b578181101561172d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172490612ac7565b60405180910390fd5b61173a848484840361146e565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036117b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a790612b59565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361181f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181690612beb565b60405180910390fd5b61182a838383611ef7565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156118b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a790612c7d565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161199e91906123e0565b60405180910390a36119b1848484611efc565b50505050565b6002600754036119fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f390612ce9565b60405180910390fd5b6002600781905550565b6000600a54611a13610820565b83611a1e9190612785565b611a289190612720565b9050919050565b611ab2846323b872dd60e01b858585604051602401611a5093929190612d09565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611f01565b50505050565b611b398363a9059cbb60e01b8484604051602401611ad7929190612d40565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611f01565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba490612db5565b60405180910390fd5b611bb960008383611ef7565b8060026000828254611bcb91906126bd565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611c7c91906123e0565b60405180910390a3611c9060008383611efc565b5050565b6001600781905550565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0490612e47565b60405180910390fd5b611d1982600083611ef7565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611d9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9690612ed9565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611e5291906123e0565b60405180910390a3611e6683600084611efc565b505050565b6000611e75610820565b600a5483611e839190612785565b611e8d9190612720565b9050919050565b600660006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055611ec2816113a0565b50565b80611ef4577f5a65726f2061646472657373000000000000000000000000000000000000000060005260206000fd5b50565b505050565b505050565b6000611f63826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611fc99092919063ffffffff16565b9050600081511480611f85575080806020019051810190611f849190612f25565b5b611fc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fbb90612fc4565b60405180910390fd5b505050565b6060611fd88484600085611fe1565b90509392505050565b606082471015612026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201d90613056565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161204f91906130bd565b60006040518083038185875af1925050503d806000811461208c576040519150601f19603f3d011682016040523d82523d6000602084013e612091565b606091505b50915091506120a2878383876120ae565b92505050949350505050565b60608315612110576000835103612108576120c885612123565b612107576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fe90613120565b60405180910390fd5b5b82905061211b565b61211a8383612146565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000825111156121595781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218d91906122c0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006121db6121d66121d184612196565b6121b6565b612196565b9050919050565b60006121ed826121c0565b9050919050565b60006121ff826121e2565b9050919050565b61220f816121f4565b82525050565b600060208201905061222a6000830184612206565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561226a57808201518184015260208101905061224f565b60008484015250505050565b6000601f19601f8301169050919050565b600061229282612230565b61229c818561223b565b93506122ac81856020860161224c565b6122b581612276565b840191505092915050565b600060208201905081810360008301526122da8184612287565b905092915050565b600080fd5b60006122f282612196565b9050919050565b612302816122e7565b811461230d57600080fd5b50565b60008135905061231f816122f9565b92915050565b6000819050919050565b61233881612325565b811461234357600080fd5b50565b6000813590506123558161232f565b92915050565b60008060408385031215612372576123716122e2565b5b600061238085828601612310565b925050602061239185828601612346565b9150509250929050565b60008115159050919050565b6123b08161239b565b82525050565b60006020820190506123cb60008301846123a7565b92915050565b6123da81612325565b82525050565b60006020820190506123f560008301846123d1565b92915050565b600080600060608486031215612414576124136122e2565b5b600061242286828701612310565b935050602061243386828701612310565b925050604061244486828701612346565b9150509250925092565b600060ff82169050919050565b6124648161244e565b82525050565b600060208201905061247f600083018461245b565b92915050565b600061249082612196565b9050919050565b6124a081612485565b82525050565b60006020820190506124bb6000830184612497565b92915050565b6000602082840312156124d7576124d66122e2565b5b60006124e584828501612346565b91505092915050565b600060208284031215612504576125036122e2565b5b600061251284828501612310565b91505092915050565b612524816122e7565b82525050565b600060208201905061253f600083018461251b565b92915050565b600061ffff82169050919050565b61255c81612545565b811461256757600080fd5b50565b60008135905061257981612553565b92915050565b600060208284031215612595576125946122e2565b5b60006125a38482850161256a565b91505092915050565b600080604083850312156125c3576125c26122e2565b5b60006125d185828601612310565b92505060206125e285828601612310565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061263357607f821691505b602082108103612646576126456125ec565b5b50919050565b60008151905061265b8161232f565b92915050565b600060208284031215612677576126766122e2565b5b60006126858482850161264c565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006126c882612325565b91506126d383612325565b92508282019050808211156126eb576126ea61268e565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061272b82612325565b915061273683612325565b925082612746576127456126f1565b5b828204905092915050565b600061275c82612325565b915061276783612325565b925082820390508181111561277f5761277e61268e565b5b92915050565b600061279082612325565b915061279b83612325565b92508282026127a981612325565b915082820484148315176127c0576127bf61268e565b5b5092915050565b7f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060008201527f6e6577206f776e65720000000000000000000000000000000000000000000000602082015250565b600061282360298361223b565b915061282e826127c7565b604082019050919050565b6000602082019050818103600083015261285281612816565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006128b560258361223b565b91506128c082612859565b604082019050919050565b600060208201905081810360008301526128e4816128a8565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061294760248361223b565b9150612952826128eb565b604082019050919050565b600060208201905081810360008301526129768161293a565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006129d960228361223b565b91506129e48261297d565b604082019050919050565b60006020820190508181036000830152612a08816129cc565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612a4560208361223b565b9150612a5082612a0f565b602082019050919050565b60006020820190508181036000830152612a7481612a38565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612ab1601d8361223b565b9150612abc82612a7b565b602082019050919050565b60006020820190508181036000830152612ae081612aa4565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612b4360258361223b565b9150612b4e82612ae7565b604082019050919050565b60006020820190508181036000830152612b7281612b36565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612bd560238361223b565b9150612be082612b79565b604082019050919050565b60006020820190508181036000830152612c0481612bc8565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000612c6760268361223b565b9150612c7282612c0b565b604082019050919050565b60006020820190508181036000830152612c9681612c5a565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000612cd3601f8361223b565b9150612cde82612c9d565b602082019050919050565b60006020820190508181036000830152612d0281612cc6565b9050919050565b6000606082019050612d1e600083018661251b565b612d2b602083018561251b565b612d3860408301846123d1565b949350505050565b6000604082019050612d55600083018561251b565b612d6260208301846123d1565b9392505050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000612d9f601f8361223b565b9150612daa82612d69565b602082019050919050565b60006020820190508181036000830152612dce81612d92565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000612e3160218361223b565b9150612e3c82612dd5565b604082019050919050565b60006020820190508181036000830152612e6081612e24565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000612ec360228361223b565b9150612ece82612e67565b604082019050919050565b60006020820190508181036000830152612ef281612eb6565b9050919050565b612f028161239b565b8114612f0d57600080fd5b50565b600081519050612f1f81612ef9565b92915050565b600060208284031215612f3b57612f3a6122e2565b5b6000612f4984828501612f10565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000612fae602a8361223b565b9150612fb982612f52565b604082019050919050565b60006020820190508181036000830152612fdd81612fa1565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b600061304060268361223b565b915061304b82612fe4565b604082019050919050565b6000602082019050818103600083015261306f81613033565b9050919050565b600081519050919050565b600081905092915050565b600061309782613076565b6130a18185613081565b93506130b181856020860161224c565b80840191505092915050565b60006130c9828461308c565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b600061310a601d8361223b565b9150613115826130d4565b602082019050919050565b60006020820190508181036000830152613139816130fd565b905091905056fea26469706673582212209d55f4342064aeb3a7ff48244d8996d8026ad094d8d0502087c404daa98b0ec864736f6c634300081200330000000000000000000000006725783e92ed2312531cd875c829022cef8b2ad600000000000000000000000054016a4848a38f257b6e96331f7404073fd9c32c

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102115760003560e01c806379cc679011610125578063a9059cbb116100ad578063dd62ed3e1161007c578063dd62ed3e146105cc578063e30c3978146105fc578063eb2cd2581461061a578063f2fde38b14610638578063f40fa4bc1461065457610211565b8063a9059cbb14610546578063be9a655514610576578063c38f2bfe14610594578063db006a75146105b057610211565b806392054fe7116100f457806392054fe71461048e57806395d89b41146104ac578063a457c2d7146104ca578063a492fbc6146104fa578063a88df21a1461052a57610211565b806379cc67901461041a5780638705fcd4146104365780638b7b23ee146104525780638da5cb5b1461047057610211565b806335975a37116101a857806342966c681161017757806342966c681461038a578063559e775b146103a657806370a08231146103d6578063715018a61461040657806379ba50971461041057610211565b806335975a3714610316578063395093511461032057806340c10f1914610350578063412753581461036c57610211565b806318160ddd116101e457806318160ddd1461028c57806319f04174146102aa57806323b872dd146102c8578063313ce567146102f857610211565b8063029cd2421461021657806306fdde0314610234578063095ea7b31461025257806316f9b46714610282575b600080fd5b61021e610670565b60405161022b9190612215565b60405180910390f35b61023c610694565b60405161024991906122c0565b60405180910390f35b61026c6004803603810190610267919061235b565b610726565b60405161027991906123b6565b60405180910390f35b61028a610749565b005b610294610820565b6040516102a191906123e0565b60405180910390f35b6102b261082a565b6040516102bf91906123e0565b60405180910390f35b6102e260048036038101906102dd91906123fb565b610834565b6040516102ef91906123b6565b60405180910390f35b610300610863565b60405161030d919061246a565b60405180910390f35b61031e61086c565b005b61033a6004803603810190610335919061235b565b610891565b60405161034791906123b6565b60405180910390f35b61036a6004803603810190610365919061235b565b6108c8565b005b610374610ab0565b60405161038191906124a6565b60405180910390f35b6103a4600480360381019061039f91906124c1565b610ad6565b005b6103c060048036038101906103bb91906124c1565b610aea565b6040516103cd91906123e0565b60405180910390f35b6103f060048036038101906103eb91906124ee565b610b21565b6040516103fd91906123e0565b60405180910390f35b61040e610b69565b005b610418610b7d565b005b610434600480360381019061042f919061235b565b610c0a565b005b610450600480360381019061044b91906124ee565b610c2a565b005b61045a610cc2565b60405161046791906123e0565b60405180910390f35b610478610cc8565b604051610485919061252a565b60405180910390f35b610496610cf2565b6040516104a391906123e0565b60405180910390f35b6104b4610cf8565b6040516104c191906122c0565b60405180910390f35b6104e460048036038101906104df919061235b565b610d8a565b6040516104f191906123b6565b60405180910390f35b610514600480360381019061050f91906124c1565b610e01565b60405161052191906123e0565b60405180910390f35b610544600480360381019061053f91906124c1565b610e38565b005b610560600480360381019061055b919061235b565b610f75565b60405161056d91906123b6565b60405180910390f35b61057e610f98565b60405161058b91906123b6565b60405180910390f35b6105ae60048036038101906105a9919061257f565b610fab565b005b6105ca60048036038101906105c591906124c1565b611040565b005b6105e660048036038101906105e191906125ac565b6111a5565b6040516105f391906123e0565b60405180910390f35b61060461122c565b604051610611919061252a565b60405180910390f35b610622611256565b60405161062f91906123e0565b60405180910390f35b610652600480360381019061064d91906124ee565b61125c565b005b61066e6004803603810190610669919061257f565b611309565b005b7f00000000000000000000000054016a4848a38f257b6e96331f7404073fd9c32c81565b6060600380546106a39061261b565b80601f01602080910402602001604051908101604052809291908181526020018280546106cf9061261b565b801561071c5780601f106106f15761010080835404028352916020019161071c565b820191906000526020600020905b8154815290600101906020018083116106ff57829003601f168201915b5050505050905090565b600080610731611466565b905061073e81858561146e565b600191505092915050565b610751611637565b7f00000000000000000000000054016a4848a38f257b6e96331f7404073fd9c32c73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016107aa919061252a565b602060405180830381865afa1580156107c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107eb9190612661565b600a81905550477fa3faf2f1eb729d9e646e40f512a8458c02057ee480d3b576a37e8a8ab30f055560405160405180910390a2565b6000600254905090565b6000600a54905090565b60008061083f611466565b905061084c8582856116b5565b610857858585611741565b60019150509392505050565b60006012905090565b610874611637565b6001600b60146101000a81548160ff021916908315150217905550565b60008061089c611466565b90506108bd8185856108ae85896111a5565b6108b891906126bd565b61146e565b600191505092915050565b6108d06119b7565b6103e881101561090c576040517f2b4db67a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b60149054906101000a900460ff16610952576040517f61935eac00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061095d82611a06565b905060006009548361096f9190612720565b9050808361097d9190612751565b600a600082825461098e91906126bd565b925050819055506109e23330857f00000000000000000000000054016a4848a38f257b6e96331f7404073fd9c32c73ffffffffffffffffffffffffffffffffffffffff16611a2f909392919063ffffffff16565b610a4f600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16827f00000000000000000000000054016a4848a38f257b6e96331f7404073fd9c32c73ffffffffffffffffffffffffffffffffffffffff16611ab89092919063ffffffff16565b610a73846103e860085485610a649190612785565b610a6e9190612720565b611b3e565b8282427f079d4fba3fc168dbd2a0c2a5235112b3442d90a21282f7b69506d05a46fdbbb760405160405180910390a45050610aac611c94565b5050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610ae7610ae1611466565b82611c9e565b50565b600080610af683611e6b565b905060006008546103e883610b0b9190612785565b610b159190612720565b90508092505050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610b71611637565b610b7b6000611e94565b565b6000610b87611466565b90508073ffffffffffffffffffffffffffffffffffffffff16610ba861122c565b73ffffffffffffffffffffffffffffffffffffffff1614610bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf590612839565b60405180910390fd5b610c0781611e94565b50565b610c1c82610c16611466565b836116b5565b610c268282611c9e565b5050565b610c32611637565b610c3b81611ec5565b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f446e39bcf1b47cfadfaa23442cb4b34682cfe6bd9220da084894e3b1f834e4f360405160405180910390a250565b60095481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60085481565b606060048054610d079061261b565b80601f0160208091040260200160405190810160405280929190818152602001828054610d339061261b565b8015610d805780601f10610d5557610100808354040283529160200191610d80565b820191906000526020600020905b815481529060010190602001808311610d6357829003601f168201915b5050505050905090565b600080610d95611466565b90506000610da382866111a5565b905083811015610de8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddf906128cb565b60405180910390fd5b610df5828686840361146e565b60019250505092915050565b600080610e0d83611e6b565b905060006103e860085483610e229190612785565b610e2c9190612720565b90508092505050919050565b610e40611637565b60011515600b60149054906101000a900460ff16151503610e8d576040517fde55c76500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610eb97f00000000000000000000000054016a4848a38f257b6e96331f7404073fd9c32c333084611a2f565b610ec33382611b3e565b610ed161dead6103e8610f75565b507f00000000000000000000000054016a4848a38f257b6e96331f7404073fd9c32c73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610f2b919061252a565b602060405180830381865afa158015610f48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6c9190612661565b600a8190555050565b600080610f80611466565b9050610f8d818585611741565b600191505092915050565b600b60149054906101000a900460ff1681565b610fb3611637565b60648161ffff161180610fca5750601e8161ffff16105b15611001576040517f7f176cee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8061ffff166009819055508061ffff167f9de4e85041d310d87df38a671e7ecf270c37d73ea017960b904af7051205962160405160405180910390a250565b6110486119b7565b6103e8811015611084576040517f2b4db67a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061108f82611e6b565b90506000600954826110a19190612720565b905060006103e8600854846110b69190612785565b6110c09190612720565b905081816110ce91906126bd565b600a60008282546110df9190612751565b925050819055506110f03385611c9e565b61113d7f00000000000000000000000054016a4848a38f257b6e96331f7404073fd9c32c600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611ab8565b6111687f00000000000000000000000054016a4848a38f257b6e96331f7404073fd9c32c3383611ab8565b8284427f1be07ad598d802b0a04e208e5f3dfe7eaf27339c0f0e4a75ddba517bbe5c8f3660405160405180910390a45050506111a2611c94565b50565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600a5481565b611264611637565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff166112c4610cc8565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b611311611637565b6103de8161ffff16118061132a57506103c08161ffff16105b15611361576040517f48565ad500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8061ffff166008819055508061ffff167fa7aaf5668e7d5e60bfa38b5d07a3178204a2d8cb16f5a03678c20f42c795429560405160405180910390a250565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036114dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d49061295d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361154c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611543906129ef565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161162a91906123e0565b60405180910390a3505050565b61163f611466565b73ffffffffffffffffffffffffffffffffffffffff1661165d610cc8565b73ffffffffffffffffffffffffffffffffffffffff16146116b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116aa90612a5b565b60405180910390fd5b565b60006116c184846111a5565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461173b578181101561172d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172490612ac7565b60405180910390fd5b61173a848484840361146e565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036117b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a790612b59565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361181f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181690612beb565b60405180910390fd5b61182a838383611ef7565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156118b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a790612c7d565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161199e91906123e0565b60405180910390a36119b1848484611efc565b50505050565b6002600754036119fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f390612ce9565b60405180910390fd5b6002600781905550565b6000600a54611a13610820565b83611a1e9190612785565b611a289190612720565b9050919050565b611ab2846323b872dd60e01b858585604051602401611a5093929190612d09565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611f01565b50505050565b611b398363a9059cbb60e01b8484604051602401611ad7929190612d40565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611f01565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba490612db5565b60405180910390fd5b611bb960008383611ef7565b8060026000828254611bcb91906126bd565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611c7c91906123e0565b60405180910390a3611c9060008383611efc565b5050565b6001600781905550565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0490612e47565b60405180910390fd5b611d1982600083611ef7565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611d9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9690612ed9565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611e5291906123e0565b60405180910390a3611e6683600084611efc565b505050565b6000611e75610820565b600a5483611e839190612785565b611e8d9190612720565b9050919050565b600660006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055611ec2816113a0565b50565b80611ef4577f5a65726f2061646472657373000000000000000000000000000000000000000060005260206000fd5b50565b505050565b505050565b6000611f63826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611fc99092919063ffffffff16565b9050600081511480611f85575080806020019051810190611f849190612f25565b5b611fc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fbb90612fc4565b60405180910390fd5b505050565b6060611fd88484600085611fe1565b90509392505050565b606082471015612026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201d90613056565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161204f91906130bd565b60006040518083038185875af1925050503d806000811461208c576040519150601f19603f3d011682016040523d82523d6000602084013e612091565b606091505b50915091506120a2878383876120ae565b92505050949350505050565b60608315612110576000835103612108576120c885612123565b612107576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fe90613120565b60405180910390fd5b5b82905061211b565b61211a8383612146565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000825111156121595781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218d91906122c0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006121db6121d66121d184612196565b6121b6565b612196565b9050919050565b60006121ed826121c0565b9050919050565b60006121ff826121e2565b9050919050565b61220f816121f4565b82525050565b600060208201905061222a6000830184612206565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561226a57808201518184015260208101905061224f565b60008484015250505050565b6000601f19601f8301169050919050565b600061229282612230565b61229c818561223b565b93506122ac81856020860161224c565b6122b581612276565b840191505092915050565b600060208201905081810360008301526122da8184612287565b905092915050565b600080fd5b60006122f282612196565b9050919050565b612302816122e7565b811461230d57600080fd5b50565b60008135905061231f816122f9565b92915050565b6000819050919050565b61233881612325565b811461234357600080fd5b50565b6000813590506123558161232f565b92915050565b60008060408385031215612372576123716122e2565b5b600061238085828601612310565b925050602061239185828601612346565b9150509250929050565b60008115159050919050565b6123b08161239b565b82525050565b60006020820190506123cb60008301846123a7565b92915050565b6123da81612325565b82525050565b60006020820190506123f560008301846123d1565b92915050565b600080600060608486031215612414576124136122e2565b5b600061242286828701612310565b935050602061243386828701612310565b925050604061244486828701612346565b9150509250925092565b600060ff82169050919050565b6124648161244e565b82525050565b600060208201905061247f600083018461245b565b92915050565b600061249082612196565b9050919050565b6124a081612485565b82525050565b60006020820190506124bb6000830184612497565b92915050565b6000602082840312156124d7576124d66122e2565b5b60006124e584828501612346565b91505092915050565b600060208284031215612504576125036122e2565b5b600061251284828501612310565b91505092915050565b612524816122e7565b82525050565b600060208201905061253f600083018461251b565b92915050565b600061ffff82169050919050565b61255c81612545565b811461256757600080fd5b50565b60008135905061257981612553565b92915050565b600060208284031215612595576125946122e2565b5b60006125a38482850161256a565b91505092915050565b600080604083850312156125c3576125c26122e2565b5b60006125d185828601612310565b92505060206125e285828601612310565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061263357607f821691505b602082108103612646576126456125ec565b5b50919050565b60008151905061265b8161232f565b92915050565b600060208284031215612677576126766122e2565b5b60006126858482850161264c565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006126c882612325565b91506126d383612325565b92508282019050808211156126eb576126ea61268e565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061272b82612325565b915061273683612325565b925082612746576127456126f1565b5b828204905092915050565b600061275c82612325565b915061276783612325565b925082820390508181111561277f5761277e61268e565b5b92915050565b600061279082612325565b915061279b83612325565b92508282026127a981612325565b915082820484148315176127c0576127bf61268e565b5b5092915050565b7f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060008201527f6e6577206f776e65720000000000000000000000000000000000000000000000602082015250565b600061282360298361223b565b915061282e826127c7565b604082019050919050565b6000602082019050818103600083015261285281612816565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006128b560258361223b565b91506128c082612859565b604082019050919050565b600060208201905081810360008301526128e4816128a8565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061294760248361223b565b9150612952826128eb565b604082019050919050565b600060208201905081810360008301526129768161293a565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006129d960228361223b565b91506129e48261297d565b604082019050919050565b60006020820190508181036000830152612a08816129cc565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612a4560208361223b565b9150612a5082612a0f565b602082019050919050565b60006020820190508181036000830152612a7481612a38565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612ab1601d8361223b565b9150612abc82612a7b565b602082019050919050565b60006020820190508181036000830152612ae081612aa4565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612b4360258361223b565b9150612b4e82612ae7565b604082019050919050565b60006020820190508181036000830152612b7281612b36565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612bd560238361223b565b9150612be082612b79565b604082019050919050565b60006020820190508181036000830152612c0481612bc8565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000612c6760268361223b565b9150612c7282612c0b565b604082019050919050565b60006020820190508181036000830152612c9681612c5a565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000612cd3601f8361223b565b9150612cde82612c9d565b602082019050919050565b60006020820190508181036000830152612d0281612cc6565b9050919050565b6000606082019050612d1e600083018661251b565b612d2b602083018561251b565b612d3860408301846123d1565b949350505050565b6000604082019050612d55600083018561251b565b612d6260208301846123d1565b9392505050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000612d9f601f8361223b565b9150612daa82612d69565b602082019050919050565b60006020820190508181036000830152612dce81612d92565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000612e3160218361223b565b9150612e3c82612dd5565b604082019050919050565b60006020820190508181036000830152612e6081612e24565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000612ec360228361223b565b9150612ece82612e67565b604082019050919050565b60006020820190508181036000830152612ef281612eb6565b9050919050565b612f028161239b565b8114612f0d57600080fd5b50565b600081519050612f1f81612ef9565b92915050565b600060208284031215612f3b57612f3a6122e2565b5b6000612f4984828501612f10565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000612fae602a8361223b565b9150612fb982612f52565b604082019050919050565b60006020820190508181036000830152612fdd81612fa1565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b600061304060268361223b565b915061304b82612fe4565b604082019050919050565b6000602082019050818103600083015261306f81613033565b9050919050565b600081519050919050565b600081905092915050565b600061309782613076565b6130a18185613081565b93506130b181856020860161224c565b80840191505092915050565b60006130c9828461308c565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b600061310a601d8361223b565b9150613115826130d4565b602082019050919050565b60006020820190508181036000830152613139816130fd565b905091905056fea26469706673582212209d55f4342064aeb3a7ff48244d8996d8026ad094d8d0502087c404daa98b0ec864736f6c63430008120033

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

0000000000000000000000006725783e92ed2312531cd875c829022cef8b2ad600000000000000000000000054016a4848a38f257b6e96331f7404073fd9c32c

-----Decoded View---------------
Arg [0] : _feeAddress (address): 0x6725783E92ED2312531Cd875c829022cEF8B2Ad6
Arg [1] : _backing (address): 0x54016a4848a38f257B6E96331F7404073Fd9c32C

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000006725783e92ed2312531cd875c829022cef8b2ad6
Arg [1] : 00000000000000000000000054016a4848a38f257b6e96331f7404073fd9c32c


Deployed Bytecode Sourcemap

46256:9297:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46736:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33654:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36014:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52792:180;;;:::i;:::-;;34783:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55453:97;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36795:261;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34625:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49364:74;;;:::i;:::-;;37465:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49752:640;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47570:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45237:91;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55081:235;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34954:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18045:103;;;:::i;:::-;;20658:216;;;:::i;:::-;;45647:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51621:196;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47266:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17404:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47050:40;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33873:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38206:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54654:241;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48981:375;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35287:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47612:17;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52449:199;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50792:643;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35543:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19746:101;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47536:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20046:181;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52002:241;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46736:32;;;:::o;33654:100::-;33708:13;33741:5;33734:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33654:100;:::o;36014:201::-;36097:4;36114:13;36130:12;:10;:12::i;:::-;36114:28;;36153:32;36162:5;36169:7;36178:6;36153:8;:32::i;:::-;36203:4;36196:11;;;36014:201;;;;:::o;52792:180::-;17290:13;:11;:13::i;:::-;52873:8:::1;:18;;;52900:4;52873:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52858:12;:48;;;;52942:21;52924:40;;;;;;;;;;52792:180::o:0;34783:108::-;34844:7;34871:12;;34864:19;;34783:108;:::o;55453:97::-;55503:7;55530:12;;55523:19;;55453:97;:::o;36795:261::-;36892:4;36909:15;36927:12;:10;:12::i;:::-;36909:30;;36950:38;36966:4;36972:7;36981:6;36950:15;:38::i;:::-;36999:27;37009:4;37015:2;37019:6;36999:9;:27::i;:::-;37044:4;37037:11;;;36795:261;;;;;:::o;34625:93::-;34683:5;34708:2;34701:9;;34625:93;:::o;49364:74::-;17290:13;:11;:13::i;:::-;49426:4:::1;49418:5;;:12;;;;;;;;;;;;;;;;;;49364:74::o:0;37465:238::-;37553:4;37570:13;37586:12;:10;:12::i;:::-;37570:28;;37609:64;37618:5;37625:7;37662:10;37634:25;37644:5;37651:7;37634:9;:25::i;:::-;:38;;;;:::i;:::-;37609:8;:64::i;:::-;37691:4;37684:11;;;37465:238;;;;:::o;49752:640::-;14367:21;:19;:21::i;:::-;46893:4:::1;49838:7;:14;49834:45;;;49861:18;;;;;;;;;;;;;;49834:45;49895:5;;;;;;;;;;;49890:34;;49909:15;;;;;;;;;;;;;;49890:34;49937:14;49954:25;49971:7;49954:16;:25::i;:::-;49937:42;;49992:27;50032:4;;50022:7;:14;;;;:::i;:::-;49992:44;;50074:19;50064:7;:29;;;;:::i;:::-;50047:12;;:47;;;;;;;:::i;:::-;;;;;;;;50115:61;50141:10;50161:4;50168:7;50115:8;:25;;;;:61;;;;;;:::i;:::-;50187:54;50209:10;;;;;;;;;;;50221:19;50187:8;:21;;;;:54;;;;;:::i;:::-;50254:64;50260:8;46946:4;50280:19;;50271:6;:28;;;;:::i;:::-;50270:47;;;;:::i;:::-;50254:5;:64::i;:::-;50376:7;50368:6;50351:15;50336:48;;;;;;;;;;49823:569;;14411:20:::0;:18;:20::i;:::-;49752:640;;:::o;47570:33::-;;;;;;;;;;;;;:::o;45237:91::-;45293:27;45299:12;:10;:12::i;:::-;45313:6;45293:5;:27::i;:::-;45237:91;:::o;55081:235::-;55143:7;55163:13;55179:25;55196:7;55179:16;:25::i;:::-;55163:41;;55215:17;55262:19;;46946:4;55236:5;:22;;;;:::i;:::-;55235:46;;;;:::i;:::-;55215:66;;55299:9;55292:16;;;;55081:235;;;:::o;34954:127::-;35028:7;35055:9;:18;35065:7;35055:18;;;;;;;;;;;;;;;;35048:25;;34954:127;;;:::o;18045:103::-;17290:13;:11;:13::i;:::-;18110:30:::1;18137:1;18110:18;:30::i;:::-;18045:103::o:0;20658:216::-;20711:14;20728:12;:10;:12::i;:::-;20711:29;;20777:6;20759:24;;:14;:12;:14::i;:::-;:24;;;20751:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;20840:26;20859:6;20840:18;:26::i;:::-;20700:174;20658:216::o;45647:164::-;45724:46;45740:7;45749:12;:10;:12::i;:::-;45763:6;45724:15;:46::i;:::-;45781:22;45787:7;45796:6;45781:5;:22::i;:::-;45647:164;;:::o;51621:196::-;17290:13;:11;:13::i;:::-;51692:31:::1;51714:8;51692:21;:31::i;:::-;51755:8;51734:10;;:30;;;;;;;;;;;;;;;;;;51800:8;51782:27;;;;;;;;;;;;51621:196:::0;:::o;47266:24::-;;;;:::o;17404:87::-;17450:7;17477:6;;;;;;;;;;;17470:13;;17404:87;:::o;47050:40::-;;;;:::o;33873:104::-;33929:13;33962:7;33955:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33873:104;:::o;38206:436::-;38299:4;38316:13;38332:12;:10;:12::i;:::-;38316:28;;38355:24;38382:25;38392:5;38399:7;38382:9;:25::i;:::-;38355:52;;38446:15;38426:16;:35;;38418:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;38539:60;38548:5;38555:7;38583:15;38564:16;:34;38539:8;:60::i;:::-;38630:4;38623:11;;;;38206:436;;;;:::o;54654:241::-;54718:7;54738:13;54754:25;54771:7;54754:16;:25::i;:::-;54738:41;;54790:19;46946:4;54821:19;;54813:5;:27;;;;:::i;:::-;54812:46;;;;:::i;:::-;54790:68;;54876:11;54869:18;;;;54654:241;;;:::o;48981:375::-;17290:13;:11;:13::i;:::-;49062:4:::1;49053:13;;:5;;;;;;;;;;;:13;;::::0;49049:49:::1;;49075:23;;;;;;;;;;;;;;49049:49;49111:71;49138:8;49148:10;49168:4;49175:6;49111:26;:71::i;:::-;49193:25;49199:10;49211:6;49193:5;:25::i;:::-;49229:58;49238:42;49282:4;49229:8;:58::i;:::-;;49315:8;:18;;;49342:4;49315:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49300:12;:48;;;;48981:375:::0;:::o;35287:193::-;35366:4;35383:13;35399:12;:10;:12::i;:::-;35383:28;;35422;35432:5;35439:2;35443:6;35422:9;:28::i;:::-;35468:4;35461:11;;;35287:193;;;;:::o;47612:17::-;;;;;;;;;;;;;:::o;52449:199::-;17290:13;:11;:13::i;:::-;52528:3:::1;52518:7;:13;;;:29;;;;52545:2;52535:7;:12;;;52518:29;52515:60;;;52556:19;;;;;;;;;;;;;;52515:60;52594:7;52587:14;;:4;:14;;;;52632:7;52617:23;;;;;;;;;;;;52449:199:::0;:::o;50792:643::-;14367:21;:19;:21::i;:::-;46893:4:::1;50862:7;:14;50858:45;;;50885:18;;;;;;;;;;;;;;50858:45;50916:15;50934:25;50951:7;50934:16;:25::i;:::-;50916:43;;50972:27;51012:4;;51002:7;:14;;;;:::i;:::-;50972:44;;51027:23;46946:4;51064:19;;51054:7;:29;;;;:::i;:::-;51053:48;;;;:::i;:::-;51027:74;;51147:19;51129:15;:37;;;;:::i;:::-;51112:12;;:55;;;;;;;:::i;:::-;;;;;;;;51180:26;51186:10;51198:7;51180:5;:26::i;:::-;51219:65;51242:8;51252:10;;;;;;;;;;;51264:19;51219:22;:65::i;:::-;51297:61;51320:8;51330:10;51342:15;51297:22;:61::i;:::-;51419:7;51410;51393:15;51376:51;;;;;;;;;;50847:588;;;14411:20:::0;:18;:20::i;:::-;50792:643;:::o;35543:151::-;35632:7;35659:11;:18;35671:5;35659:18;;;;;;;;;;;;;;;:27;35678:7;35659:27;;;;;;;;;;;;;;;;35652:34;;35543:151;;;;:::o;19746:101::-;19799:7;19826:13;;;;;;;;;;;19819:20;;19746:101;:::o;47536:27::-;;;;:::o;20046:181::-;17290:13;:11;:13::i;:::-;20152:8:::1;20136:13;;:24;;;;;;;;;;;;;;;;;;20210:8;20176:43;;20201:7;:5;:7::i;:::-;20176:43;;;;;;;;;;;;20046:181:::0;:::o;52002:241::-;17290:13;:11;:13::i;:::-;52090:3:::1;52080:7;:13;;;:30;;;;52107:3;52097:7;:13;;;52080:30;52077:70;;;52119:28;;;;;;;;;;;;;;52077:70;52180:7;52158:29;;:19;:29;;;;52227:7;52203:32;;;;;;;;;;;;52002:241:::0;:::o;18664:191::-;18738:16;18757:6;;;;;;;;;;;18738:25;;18783:8;18774:6;;:17;;;;;;;;;;;;;;;;;;18838:8;18807:40;;18828:8;18807:40;;;;;;;;;;;;18727:128;18664:191;:::o;15948:98::-;16001:7;16028:10;16021:17;;15948:98;:::o;42199:346::-;42318:1;42301:19;;:5;:19;;;42293:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42399:1;42380:21;;:7;:21;;;42372:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42483:6;42453:11;:18;42465:5;42453:18;;;;;;;;;;;;;;;:27;42472:7;42453:27;;;;;;;;;;;;;;;:36;;;;42521:7;42505:32;;42514:5;42505:32;;;42530:6;42505:32;;;;;;:::i;:::-;;;;;;;;42199:346;;;:::o;17569:132::-;17644:12;:10;:12::i;:::-;17633:23;;:7;:5;:7::i;:::-;:23;;;17625:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17569:132::o;42836:419::-;42937:24;42964:25;42974:5;42981:7;42964:9;:25::i;:::-;42937:52;;43024:17;43004:16;:37;43000:248;;43086:6;43066:16;:26;;43058:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43170:51;43179:5;43186:7;43214:6;43195:16;:25;43170:8;:51::i;:::-;43000:248;42926:329;42836:419;;;:::o;39112:806::-;39225:1;39209:18;;:4;:18;;;39201:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39302:1;39288:16;;:2;:16;;;39280:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;39357:38;39378:4;39384:2;39388:6;39357:20;:38::i;:::-;39408:19;39430:9;:15;39440:4;39430:15;;;;;;;;;;;;;;;;39408:37;;39479:6;39464:11;:21;;39456:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;39596:6;39582:11;:20;39564:9;:15;39574:4;39564:15;;;;;;;;;;;;;;;:38;;;;39799:6;39782:9;:13;39792:2;39782:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;39849:2;39834:26;;39843:4;39834:26;;;39853:6;39834:26;;;;;;:::i;:::-;;;;;;;;39873:37;39893:4;39899:2;39903:6;39873:19;:37::i;:::-;39190:728;39112:806;;;:::o;14447:293::-;13849:1;14581:7;;:19;14573:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;13849:1;14714:7;:18;;;;14447:293::o;53651:140::-;53715:7;53770:12;;53752:13;:11;:13::i;:::-;53743:6;:22;;;;:::i;:::-;53742:41;;;;:::i;:::-;53735:48;;53651:140;;;:::o;25064:205::-;25165:96;25185:5;25215:27;;;25244:4;25250:2;25254:5;25192:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25165:19;:96::i;:::-;25064:205;;;;:::o;24642:177::-;24725:86;24745:5;24775:23;;;24800:2;24804:5;24752:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24725:19;:86::i;:::-;24642:177;;;:::o;40205:548::-;40308:1;40289:21;;:7;:21;;;40281:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;40359:49;40388:1;40392:7;40401:6;40359:20;:49::i;:::-;40437:6;40421:12;;:22;;;;;;;:::i;:::-;;;;;;;;40614:6;40592:9;:18;40602:7;40592:18;;;;;;;;;;;;;;;;:28;;;;;;;;;;;40668:7;40647:37;;40664:1;40647:37;;;40677:6;40647:37;;;;;;:::i;:::-;;;;;;;;40697:48;40725:1;40729:7;40738:6;40697:19;:48::i;:::-;40205:548;;:::o;14748:213::-;13805:1;14931:7;:22;;;;14748:213::o;41086:675::-;41189:1;41170:21;;:7;:21;;;41162:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;41242:49;41263:7;41280:1;41284:6;41242:20;:49::i;:::-;41304:22;41329:9;:18;41339:7;41329:18;;;;;;;;;;;;;;;;41304:43;;41384:6;41366:14;:24;;41358:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;41503:6;41486:14;:23;41465:9;:18;41475:7;41465:18;;;;;;;;;;;;;;;:44;;;;41620:6;41604:12;;:22;;;;;;;;;;;41681:1;41655:37;;41664:7;41655:37;;;41685:6;41655:37;;;;;;:::i;:::-;;;;;;;;41705:48;41725:7;41742:1;41746:6;41705:19;:48::i;:::-;41151:610;41086:675;;:::o;53337:138::-;53401:7;53454:13;:11;:13::i;:::-;53438:12;;53429:6;:21;;;;:::i;:::-;53428:39;;;;:::i;:::-;53421:46;;53337:138;;;:::o;20417:156::-;20507:13;;20500:20;;;;;;;;;;;20531:34;20556:8;20531:24;:34::i;:::-;20417:156;:::o;54131:227::-;54235:5;54225:115;;54274:14;54268:4;54261:28;54320:4;54314;54307:18;54225:115;54131:227;:::o;43855:91::-;;;;:::o;44550:90::-;;;;:::o;28988:649::-;29412:23;29438:69;29466:4;29438:69;;;;;;;;;;;;;;;;;29446:5;29438:27;;;;:69;;;;;:::i;:::-;29412:95;;29547:1;29526:10;:17;:22;:56;;;;29563:10;29552:30;;;;;;;;;;;;:::i;:::-;29526:56;29518:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29058:579;28988:649;;:::o;4236:229::-;4373:12;4405:52;4427:6;4435:4;4441:1;4444:12;4405:21;:52::i;:::-;4398:59;;4236:229;;;;;:::o;5322:455::-;5492:12;5550:5;5525:21;:30;;5517:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;5610:12;5624:23;5651:6;:11;;5670:5;5677:4;5651:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5609:73;;;;5700:69;5727:6;5735:7;5744:10;5756:12;5700:26;:69::i;:::-;5693:76;;;;5322:455;;;;;;:::o;7895:644::-;8080:12;8109:7;8105:427;;;8158:1;8137:10;:17;:22;8133:290;;8355:18;8366:6;8355:10;:18::i;:::-;8347:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;8133:290;8444:10;8437:17;;;;8105:427;8487:33;8495:10;8507:12;8487:7;:33::i;:::-;7895:644;;;;;;;:::o;1481:326::-;1541:4;1798:1;1776:7;:19;;;:23;1769:30;;1481:326;;;:::o;9081:552::-;9262:1;9242:10;:17;:21;9238:388;;;9474:10;9468:17;9531:15;9518:10;9514:2;9510:19;9503:44;9238:388;9601:12;9594:20;;;;;;;;;;;:::i;:::-;;;;;;;;7:126:1;44:7;84:42;77:5;73:54;62:65;;7:126;;;:::o;139:60::-;167:3;188:5;181:12;;139:60;;;:::o;205:142::-;255:9;288:53;306:34;315:24;333:5;315:24;:::i;:::-;306:34;:::i;:::-;288:53;:::i;:::-;275:66;;205:142;;;:::o;353:126::-;403:9;436:37;467:5;436:37;:::i;:::-;423:50;;353:126;;;:::o;485:140::-;549:9;582:37;613:5;582:37;:::i;:::-;569:50;;485:140;;;:::o;631:159::-;732:51;777:5;732:51;:::i;:::-;727:3;720:64;631:159;;:::o;796:250::-;903:4;941:2;930:9;926:18;918:26;;954:85;1036:1;1025:9;1021:17;1012:6;954:85;:::i;:::-;796:250;;;;:::o;1052:99::-;1104:6;1138:5;1132:12;1122:22;;1052:99;;;:::o;1157:169::-;1241:11;1275:6;1270:3;1263:19;1315:4;1310:3;1306:14;1291:29;;1157:169;;;;:::o;1332:246::-;1413:1;1423:113;1437:6;1434:1;1431:13;1423:113;;;1522:1;1517:3;1513:11;1507:18;1503:1;1498:3;1494:11;1487:39;1459:2;1456:1;1452:10;1447:15;;1423:113;;;1570:1;1561:6;1556:3;1552:16;1545:27;1394:184;1332:246;;;:::o;1584:102::-;1625:6;1676:2;1672:7;1667:2;1660:5;1656:14;1652:28;1642:38;;1584:102;;;:::o;1692:377::-;1780:3;1808:39;1841:5;1808:39;:::i;:::-;1863:71;1927:6;1922:3;1863:71;:::i;:::-;1856:78;;1943:65;2001:6;1996:3;1989:4;1982:5;1978:16;1943:65;:::i;:::-;2033:29;2055:6;2033:29;:::i;:::-;2028:3;2024:39;2017:46;;1784:285;1692:377;;;;:::o;2075:313::-;2188:4;2226:2;2215:9;2211:18;2203:26;;2275:9;2269:4;2265:20;2261:1;2250:9;2246:17;2239:47;2303:78;2376:4;2367:6;2303:78;:::i;:::-;2295:86;;2075:313;;;;:::o;2475:117::-;2584:1;2581;2574:12;2721:96;2758:7;2787:24;2805:5;2787:24;:::i;:::-;2776:35;;2721:96;;;:::o;2823:122::-;2896:24;2914:5;2896:24;:::i;:::-;2889:5;2886:35;2876:63;;2935:1;2932;2925:12;2876:63;2823:122;:::o;2951:139::-;2997:5;3035:6;3022:20;3013:29;;3051:33;3078:5;3051:33;:::i;:::-;2951:139;;;;:::o;3096:77::-;3133:7;3162:5;3151:16;;3096:77;;;:::o;3179:122::-;3252:24;3270:5;3252:24;:::i;:::-;3245:5;3242:35;3232:63;;3291:1;3288;3281:12;3232:63;3179:122;:::o;3307:139::-;3353:5;3391:6;3378:20;3369:29;;3407:33;3434:5;3407:33;:::i;:::-;3307:139;;;;:::o;3452:474::-;3520:6;3528;3577:2;3565:9;3556:7;3552:23;3548:32;3545:119;;;3583:79;;:::i;:::-;3545:119;3703:1;3728:53;3773:7;3764:6;3753:9;3749:22;3728:53;:::i;:::-;3718:63;;3674:117;3830:2;3856:53;3901:7;3892:6;3881:9;3877:22;3856:53;:::i;:::-;3846:63;;3801:118;3452:474;;;;;:::o;3932:90::-;3966:7;4009:5;4002:13;3995:21;3984:32;;3932:90;;;:::o;4028:109::-;4109:21;4124:5;4109:21;:::i;:::-;4104:3;4097:34;4028:109;;:::o;4143:210::-;4230:4;4268:2;4257:9;4253:18;4245:26;;4281:65;4343:1;4332:9;4328:17;4319:6;4281:65;:::i;:::-;4143:210;;;;:::o;4359:118::-;4446:24;4464:5;4446:24;:::i;:::-;4441:3;4434:37;4359:118;;:::o;4483:222::-;4576:4;4614:2;4603:9;4599:18;4591:26;;4627:71;4695:1;4684:9;4680:17;4671:6;4627:71;:::i;:::-;4483:222;;;;:::o;4711:619::-;4788:6;4796;4804;4853:2;4841:9;4832:7;4828:23;4824:32;4821:119;;;4859:79;;:::i;:::-;4821:119;4979:1;5004:53;5049:7;5040:6;5029:9;5025:22;5004:53;:::i;:::-;4994:63;;4950:117;5106:2;5132:53;5177:7;5168:6;5157:9;5153:22;5132:53;:::i;:::-;5122:63;;5077:118;5234:2;5260:53;5305:7;5296:6;5285:9;5281:22;5260:53;:::i;:::-;5250:63;;5205:118;4711:619;;;;;:::o;5336:86::-;5371:7;5411:4;5404:5;5400:16;5389:27;;5336:86;;;:::o;5428:112::-;5511:22;5527:5;5511:22;:::i;:::-;5506:3;5499:35;5428:112;;:::o;5546:214::-;5635:4;5673:2;5662:9;5658:18;5650:26;;5686:67;5750:1;5739:9;5735:17;5726:6;5686:67;:::i;:::-;5546:214;;;;:::o;5766:104::-;5811:7;5840:24;5858:5;5840:24;:::i;:::-;5829:35;;5766:104;;;:::o;5876:142::-;5979:32;6005:5;5979:32;:::i;:::-;5974:3;5967:45;5876:142;;:::o;6024:254::-;6133:4;6171:2;6160:9;6156:18;6148:26;;6184:87;6268:1;6257:9;6253:17;6244:6;6184:87;:::i;:::-;6024:254;;;;:::o;6284:329::-;6343:6;6392:2;6380:9;6371:7;6367:23;6363:32;6360:119;;;6398:79;;:::i;:::-;6360:119;6518:1;6543:53;6588:7;6579:6;6568:9;6564:22;6543:53;:::i;:::-;6533:63;;6489:117;6284:329;;;;:::o;6619:::-;6678:6;6727:2;6715:9;6706:7;6702:23;6698:32;6695:119;;;6733:79;;:::i;:::-;6695:119;6853:1;6878:53;6923:7;6914:6;6903:9;6899:22;6878:53;:::i;:::-;6868:63;;6824:117;6619:329;;;;:::o;6954:118::-;7041:24;7059:5;7041:24;:::i;:::-;7036:3;7029:37;6954:118;;:::o;7078:222::-;7171:4;7209:2;7198:9;7194:18;7186:26;;7222:71;7290:1;7279:9;7275:17;7266:6;7222:71;:::i;:::-;7078:222;;;;:::o;7306:89::-;7342:7;7382:6;7375:5;7371:18;7360:29;;7306:89;;;:::o;7401:120::-;7473:23;7490:5;7473:23;:::i;:::-;7466:5;7463:34;7453:62;;7511:1;7508;7501:12;7453:62;7401:120;:::o;7527:137::-;7572:5;7610:6;7597:20;7588:29;;7626:32;7652:5;7626:32;:::i;:::-;7527:137;;;;:::o;7670:327::-;7728:6;7777:2;7765:9;7756:7;7752:23;7748:32;7745:119;;;7783:79;;:::i;:::-;7745:119;7903:1;7928:52;7972:7;7963:6;7952:9;7948:22;7928:52;:::i;:::-;7918:62;;7874:116;7670:327;;;;:::o;8003:474::-;8071:6;8079;8128:2;8116:9;8107:7;8103:23;8099:32;8096:119;;;8134:79;;:::i;:::-;8096:119;8254:1;8279:53;8324:7;8315:6;8304:9;8300:22;8279:53;:::i;:::-;8269:63;;8225:117;8381:2;8407:53;8452:7;8443:6;8432:9;8428:22;8407:53;:::i;:::-;8397:63;;8352:118;8003:474;;;;;:::o;8483:180::-;8531:77;8528:1;8521:88;8628:4;8625:1;8618:15;8652:4;8649:1;8642:15;8669:320;8713:6;8750:1;8744:4;8740:12;8730:22;;8797:1;8791:4;8787:12;8818:18;8808:81;;8874:4;8866:6;8862:17;8852:27;;8808:81;8936:2;8928:6;8925:14;8905:18;8902:38;8899:84;;8955:18;;:::i;:::-;8899:84;8720:269;8669:320;;;:::o;8995:143::-;9052:5;9083:6;9077:13;9068:22;;9099:33;9126:5;9099:33;:::i;:::-;8995:143;;;;:::o;9144:351::-;9214:6;9263:2;9251:9;9242:7;9238:23;9234:32;9231:119;;;9269:79;;:::i;:::-;9231:119;9389:1;9414:64;9470:7;9461:6;9450:9;9446:22;9414:64;:::i;:::-;9404:74;;9360:128;9144:351;;;;:::o;9501:180::-;9549:77;9546:1;9539:88;9646:4;9643:1;9636:15;9670:4;9667:1;9660:15;9687:191;9727:3;9746:20;9764:1;9746:20;:::i;:::-;9741:25;;9780:20;9798:1;9780:20;:::i;:::-;9775:25;;9823:1;9820;9816:9;9809:16;;9844:3;9841:1;9838:10;9835:36;;;9851:18;;:::i;:::-;9835:36;9687:191;;;;:::o;9884:180::-;9932:77;9929:1;9922:88;10029:4;10026:1;10019:15;10053:4;10050:1;10043:15;10070:185;10110:1;10127:20;10145:1;10127:20;:::i;:::-;10122:25;;10161:20;10179:1;10161:20;:::i;:::-;10156:25;;10200:1;10190:35;;10205:18;;:::i;:::-;10190:35;10247:1;10244;10240:9;10235:14;;10070:185;;;;:::o;10261:194::-;10301:4;10321:20;10339:1;10321:20;:::i;:::-;10316:25;;10355:20;10373:1;10355:20;:::i;:::-;10350:25;;10399:1;10396;10392:9;10384:17;;10423:1;10417:4;10414:11;10411:37;;;10428:18;;:::i;:::-;10411:37;10261:194;;;;:::o;10461:410::-;10501:7;10524:20;10542:1;10524:20;:::i;:::-;10519:25;;10558:20;10576:1;10558:20;:::i;:::-;10553:25;;10613:1;10610;10606:9;10635:30;10653:11;10635:30;:::i;:::-;10624:41;;10814:1;10805:7;10801:15;10798:1;10795:22;10775:1;10768:9;10748:83;10725:139;;10844:18;;:::i;:::-;10725:139;10509:362;10461:410;;;;:::o;10877:228::-;11017:34;11013:1;11005:6;11001:14;10994:58;11086:11;11081:2;11073:6;11069:15;11062:36;10877:228;:::o;11111:366::-;11253:3;11274:67;11338:2;11333:3;11274:67;:::i;:::-;11267:74;;11350:93;11439:3;11350:93;:::i;:::-;11468:2;11463:3;11459:12;11452:19;;11111:366;;;:::o;11483:419::-;11649:4;11687:2;11676:9;11672:18;11664:26;;11736:9;11730:4;11726:20;11722:1;11711:9;11707:17;11700:47;11764:131;11890:4;11764:131;:::i;:::-;11756:139;;11483:419;;;:::o;11908:224::-;12048:34;12044:1;12036:6;12032:14;12025:58;12117:7;12112:2;12104:6;12100:15;12093:32;11908:224;:::o;12138:366::-;12280:3;12301:67;12365:2;12360:3;12301:67;:::i;:::-;12294:74;;12377:93;12466:3;12377:93;:::i;:::-;12495:2;12490:3;12486:12;12479:19;;12138:366;;;:::o;12510:419::-;12676:4;12714:2;12703:9;12699:18;12691:26;;12763:9;12757:4;12753:20;12749:1;12738:9;12734:17;12727:47;12791:131;12917:4;12791:131;:::i;:::-;12783:139;;12510:419;;;:::o;12935:223::-;13075:34;13071:1;13063:6;13059:14;13052:58;13144:6;13139:2;13131:6;13127:15;13120:31;12935:223;:::o;13164:366::-;13306:3;13327:67;13391:2;13386:3;13327:67;:::i;:::-;13320:74;;13403:93;13492:3;13403:93;:::i;:::-;13521:2;13516:3;13512:12;13505:19;;13164:366;;;:::o;13536:419::-;13702:4;13740:2;13729:9;13725:18;13717:26;;13789:9;13783:4;13779:20;13775:1;13764:9;13760:17;13753:47;13817:131;13943:4;13817:131;:::i;:::-;13809:139;;13536:419;;;:::o;13961:221::-;14101:34;14097:1;14089:6;14085:14;14078:58;14170:4;14165:2;14157:6;14153:15;14146:29;13961:221;:::o;14188:366::-;14330:3;14351:67;14415:2;14410:3;14351:67;:::i;:::-;14344:74;;14427:93;14516:3;14427:93;:::i;:::-;14545:2;14540:3;14536:12;14529:19;;14188:366;;;:::o;14560:419::-;14726:4;14764:2;14753:9;14749:18;14741:26;;14813:9;14807:4;14803:20;14799:1;14788:9;14784:17;14777:47;14841:131;14967:4;14841:131;:::i;:::-;14833:139;;14560:419;;;:::o;14985:182::-;15125:34;15121:1;15113:6;15109:14;15102:58;14985:182;:::o;15173:366::-;15315:3;15336:67;15400:2;15395:3;15336:67;:::i;:::-;15329:74;;15412:93;15501:3;15412:93;:::i;:::-;15530:2;15525:3;15521:12;15514:19;;15173:366;;;:::o;15545:419::-;15711:4;15749:2;15738:9;15734:18;15726:26;;15798:9;15792:4;15788:20;15784:1;15773:9;15769:17;15762:47;15826:131;15952:4;15826:131;:::i;:::-;15818:139;;15545:419;;;:::o;15970:179::-;16110:31;16106:1;16098:6;16094:14;16087:55;15970:179;:::o;16155:366::-;16297:3;16318:67;16382:2;16377:3;16318:67;:::i;:::-;16311:74;;16394:93;16483:3;16394:93;:::i;:::-;16512:2;16507:3;16503:12;16496:19;;16155:366;;;:::o;16527:419::-;16693:4;16731:2;16720:9;16716:18;16708:26;;16780:9;16774:4;16770:20;16766:1;16755:9;16751:17;16744:47;16808:131;16934:4;16808:131;:::i;:::-;16800:139;;16527:419;;;:::o;16952:224::-;17092:34;17088:1;17080:6;17076:14;17069:58;17161:7;17156:2;17148:6;17144:15;17137:32;16952:224;:::o;17182:366::-;17324:3;17345:67;17409:2;17404:3;17345:67;:::i;:::-;17338:74;;17421:93;17510:3;17421:93;:::i;:::-;17539:2;17534:3;17530:12;17523:19;;17182:366;;;:::o;17554:419::-;17720:4;17758:2;17747:9;17743:18;17735:26;;17807:9;17801:4;17797:20;17793:1;17782:9;17778:17;17771:47;17835:131;17961:4;17835:131;:::i;:::-;17827:139;;17554:419;;;:::o;17979:222::-;18119:34;18115:1;18107:6;18103:14;18096:58;18188:5;18183:2;18175:6;18171:15;18164:30;17979:222;:::o;18207:366::-;18349:3;18370:67;18434:2;18429:3;18370:67;:::i;:::-;18363:74;;18446:93;18535:3;18446:93;:::i;:::-;18564:2;18559:3;18555:12;18548:19;;18207:366;;;:::o;18579:419::-;18745:4;18783:2;18772:9;18768:18;18760:26;;18832:9;18826:4;18822:20;18818:1;18807:9;18803:17;18796:47;18860:131;18986:4;18860:131;:::i;:::-;18852:139;;18579:419;;;:::o;19004:225::-;19144:34;19140:1;19132:6;19128:14;19121:58;19213:8;19208:2;19200:6;19196:15;19189:33;19004:225;:::o;19235:366::-;19377:3;19398:67;19462:2;19457:3;19398:67;:::i;:::-;19391:74;;19474:93;19563:3;19474:93;:::i;:::-;19592:2;19587:3;19583:12;19576:19;;19235:366;;;:::o;19607:419::-;19773:4;19811:2;19800:9;19796:18;19788:26;;19860:9;19854:4;19850:20;19846:1;19835:9;19831:17;19824:47;19888:131;20014:4;19888:131;:::i;:::-;19880:139;;19607:419;;;:::o;20032:181::-;20172:33;20168:1;20160:6;20156:14;20149:57;20032:181;:::o;20219:366::-;20361:3;20382:67;20446:2;20441:3;20382:67;:::i;:::-;20375:74;;20458:93;20547:3;20458:93;:::i;:::-;20576:2;20571:3;20567:12;20560:19;;20219:366;;;:::o;20591:419::-;20757:4;20795:2;20784:9;20780:18;20772:26;;20844:9;20838:4;20834:20;20830:1;20819:9;20815:17;20808:47;20872:131;20998:4;20872:131;:::i;:::-;20864:139;;20591:419;;;:::o;21016:442::-;21165:4;21203:2;21192:9;21188:18;21180:26;;21216:71;21284:1;21273:9;21269:17;21260:6;21216:71;:::i;:::-;21297:72;21365:2;21354:9;21350:18;21341:6;21297:72;:::i;:::-;21379;21447:2;21436:9;21432:18;21423:6;21379:72;:::i;:::-;21016:442;;;;;;:::o;21464:332::-;21585:4;21623:2;21612:9;21608:18;21600:26;;21636:71;21704:1;21693:9;21689:17;21680:6;21636:71;:::i;:::-;21717:72;21785:2;21774:9;21770:18;21761:6;21717:72;:::i;:::-;21464:332;;;;;:::o;21802:181::-;21942:33;21938:1;21930:6;21926:14;21919:57;21802:181;:::o;21989:366::-;22131:3;22152:67;22216:2;22211:3;22152:67;:::i;:::-;22145:74;;22228:93;22317:3;22228:93;:::i;:::-;22346:2;22341:3;22337:12;22330:19;;21989:366;;;:::o;22361:419::-;22527:4;22565:2;22554:9;22550:18;22542:26;;22614:9;22608:4;22604:20;22600:1;22589:9;22585:17;22578:47;22642:131;22768:4;22642:131;:::i;:::-;22634:139;;22361:419;;;:::o;22786:220::-;22926:34;22922:1;22914:6;22910:14;22903:58;22995:3;22990:2;22982:6;22978:15;22971:28;22786:220;:::o;23012:366::-;23154:3;23175:67;23239:2;23234:3;23175:67;:::i;:::-;23168:74;;23251:93;23340:3;23251:93;:::i;:::-;23369:2;23364:3;23360:12;23353:19;;23012:366;;;:::o;23384:419::-;23550:4;23588:2;23577:9;23573:18;23565:26;;23637:9;23631:4;23627:20;23623:1;23612:9;23608:17;23601:47;23665:131;23791:4;23665:131;:::i;:::-;23657:139;;23384:419;;;:::o;23809:221::-;23949:34;23945:1;23937:6;23933:14;23926:58;24018:4;24013:2;24005:6;24001:15;23994:29;23809:221;:::o;24036:366::-;24178:3;24199:67;24263:2;24258:3;24199:67;:::i;:::-;24192:74;;24275:93;24364:3;24275:93;:::i;:::-;24393:2;24388:3;24384:12;24377:19;;24036:366;;;:::o;24408:419::-;24574:4;24612:2;24601:9;24597:18;24589:26;;24661:9;24655:4;24651:20;24647:1;24636:9;24632:17;24625:47;24689:131;24815:4;24689:131;:::i;:::-;24681:139;;24408:419;;;:::o;24833:116::-;24903:21;24918:5;24903:21;:::i;:::-;24896:5;24893:32;24883:60;;24939:1;24936;24929:12;24883:60;24833:116;:::o;24955:137::-;25009:5;25040:6;25034:13;25025:22;;25056:30;25080:5;25056:30;:::i;:::-;24955:137;;;;:::o;25098:345::-;25165:6;25214:2;25202:9;25193:7;25189:23;25185:32;25182:119;;;25220:79;;:::i;:::-;25182:119;25340:1;25365:61;25418:7;25409:6;25398:9;25394:22;25365:61;:::i;:::-;25355:71;;25311:125;25098:345;;;;:::o;25449:229::-;25589:34;25585:1;25577:6;25573:14;25566:58;25658:12;25653:2;25645:6;25641:15;25634:37;25449:229;:::o;25684:366::-;25826:3;25847:67;25911:2;25906:3;25847:67;:::i;:::-;25840:74;;25923:93;26012:3;25923:93;:::i;:::-;26041:2;26036:3;26032:12;26025:19;;25684:366;;;:::o;26056:419::-;26222:4;26260:2;26249:9;26245:18;26237:26;;26309:9;26303:4;26299:20;26295:1;26284:9;26280:17;26273:47;26337:131;26463:4;26337:131;:::i;:::-;26329:139;;26056:419;;;:::o;26481:225::-;26621:34;26617:1;26609:6;26605:14;26598:58;26690:8;26685:2;26677:6;26673:15;26666:33;26481:225;:::o;26712:366::-;26854:3;26875:67;26939:2;26934:3;26875:67;:::i;:::-;26868:74;;26951:93;27040:3;26951:93;:::i;:::-;27069:2;27064:3;27060:12;27053:19;;26712:366;;;:::o;27084:419::-;27250:4;27288:2;27277:9;27273:18;27265:26;;27337:9;27331:4;27327:20;27323:1;27312:9;27308:17;27301:47;27365:131;27491:4;27365:131;:::i;:::-;27357:139;;27084:419;;;:::o;27509:98::-;27560:6;27594:5;27588:12;27578:22;;27509:98;;;:::o;27613:147::-;27714:11;27751:3;27736:18;;27613:147;;;;:::o;27766:386::-;27870:3;27898:38;27930:5;27898:38;:::i;:::-;27952:88;28033:6;28028:3;27952:88;:::i;:::-;27945:95;;28049:65;28107:6;28102:3;28095:4;28088:5;28084:16;28049:65;:::i;:::-;28139:6;28134:3;28130:16;28123:23;;27874:278;27766:386;;;;:::o;28158:271::-;28288:3;28310:93;28399:3;28390:6;28310:93;:::i;:::-;28303:100;;28420:3;28413:10;;28158:271;;;;:::o;28435:179::-;28575:31;28571:1;28563:6;28559:14;28552:55;28435:179;:::o;28620:366::-;28762:3;28783:67;28847:2;28842:3;28783:67;:::i;:::-;28776:74;;28859:93;28948:3;28859:93;:::i;:::-;28977:2;28972:3;28968:12;28961:19;;28620:366;;;:::o;28992:419::-;29158:4;29196:2;29185:9;29181:18;29173:26;;29245:9;29239:4;29235:20;29231:1;29220:9;29216:17;29209:47;29273:131;29399:4;29273:131;:::i;:::-;29265:139;;28992:419;;;:::o

Swarm Source

ipfs://9d55f4342064aeb3a7ff48244d8996d8026ad094d8d0502087c404daa98b0ec8
[ 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.