ETH Price: $3,311.14 (-2.93%)
Gas: 14 Gwei

Token

dopes (DOPES)
 

Overview

Max Total Supply

5,000,000,000 DOPES

Holders

343

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
1,000 DOPES

Value
$0.00
0xc6cb8abf00fb33308645c64a151ec8e7c696c359
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Dopes

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-08-22
*/

//SPDX-License-Identifier: MIT

// File: erc-payable-token/contracts/token/ERC1363/IERC1363Spender.sol



pragma solidity ^0.8.0;

/**
 * @title IERC1363Spender Interface
 * @author Vittorio Minacori (https://github.com/vittominacori)
 * @dev Interface for any contract that wants to support approveAndCall
 *  from ERC1363 token contracts as defined in
 *  https://eips.ethereum.org/EIPS/eip-1363
 */
interface IERC1363Spender {
    /**
     * @notice Handle the approval of ERC1363 tokens
     * @dev Any ERC1363 smart contract calls this function on the recipient
     * after an `approve`. This function MAY throw to revert and reject the
     * approval. Return of other than the magic value MUST result in the
     * transaction being reverted.
     * Note: the token contract address is always the message sender.
     * @param sender address The address which called `approveAndCall` function
     * @param amount uint256 The amount of tokens to be spent
     * @param data bytes Additional data with no specified format
     * @return `bytes4(keccak256("onApprovalReceived(address,uint256,bytes)"))` unless throwing
     */
    function onApprovalReceived(
        address sender,
        uint256 amount,
        bytes calldata data
    ) external returns (bytes4);
}

// File: erc-payable-token/contracts/token/ERC1363/IERC1363Receiver.sol



pragma solidity ^0.8.0;

/**
 * @title IERC1363Receiver Interface
 * @author Vittorio Minacori (https://github.com/vittominacori)
 * @dev Interface for any contract that wants to support transferAndCall or transferFromAndCall
 *  from ERC1363 token contracts as defined in
 *  https://eips.ethereum.org/EIPS/eip-1363
 */
interface IERC1363Receiver {
    /**
     * @notice Handle the receipt of ERC1363 tokens
     * @dev Any ERC1363 smart contract calls this function on the recipient
     * after a `transfer` or a `transferFrom`. This function MAY throw to revert and reject the
     * transfer. Return of other than the magic value MUST result in the
     * transaction being reverted.
     * Note: the token contract address is always the message sender.
     * @param spender address The address which called `transferAndCall` or `transferFromAndCall` function
     * @param sender address The address which are token transferred from
     * @param amount uint256 The amount of tokens transferred
     * @param data bytes Additional data with no specified format
     * @return `bytes4(keccak256("onTransferReceived(address,address,uint256,bytes)"))` unless throwing
     */
    function onTransferReceived(
        address spender,
        address sender,
        uint256 amount,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

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


// OpenZeppelin Contracts (last updated v4.7.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
     * ====
     *
     * [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://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/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/contracts/security/Pausable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.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 anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing 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/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.6.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: erc-payable-token/contracts/token/ERC1363/IERC1363.sol



pragma solidity ^0.8.0;



/**
 * @title IERC1363 Interface
 * @author Vittorio Minacori (https://github.com/vittominacori)
 * @dev Interface for a Payable Token contract as defined in
 *  https://eips.ethereum.org/EIPS/eip-1363
 */
interface IERC1363 is IERC20, IERC165 {
    /**
     * @notice Transfer tokens from `msg.sender` to another address and then call `onTransferReceived` on receiver
     * @param to address The address which you want to transfer to
     * @param amount uint256 The amount of tokens to be transferred
     * @return true unless throwing
     */
    function transferAndCall(address to, uint256 amount) external returns (bool);

    /**
     * @notice Transfer tokens from `msg.sender` to another address and then call `onTransferReceived` on receiver
     * @param to address The address which you want to transfer to
     * @param amount uint256 The amount of tokens to be transferred
     * @param data bytes Additional data with no specified format, sent in call to `to`
     * @return true unless throwing
     */
    function transferAndCall(
        address to,
        uint256 amount,
        bytes calldata data
    ) external returns (bool);

    /**
     * @notice Transfer tokens from one address to another and then call `onTransferReceived` on receiver
     * @param from address The address which you want to send tokens from
     * @param to address The address which you want to transfer to
     * @param amount uint256 The amount of tokens to be transferred
     * @return true unless throwing
     */
    function transferFromAndCall(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);

    /**
     * @notice Transfer tokens from one address to another and then call `onTransferReceived` on receiver
     * @param from address The address which you want to send tokens from
     * @param to address The address which you want to transfer to
     * @param amount uint256 The amount of tokens to be transferred
     * @param data bytes Additional data with no specified format, sent in call to `to`
     * @return true unless throwing
     */
    function transferFromAndCall(
        address from,
        address to,
        uint256 amount,
        bytes calldata data
    ) external returns (bool);

    /**
     * @notice Approve the passed address to spend the specified amount of tokens on behalf of msg.sender
     * and then call `onApprovalReceived` on spender.
     * Beware that changing an allowance with this method brings the risk that someone may use both the old
     * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
     * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     * @param spender address The address which will spend the funds
     * @param amount uint256 The amount of tokens to be spent
     */
    function approveAndCall(address spender, uint256 amount) external returns (bool);

    /**
     * @notice Approve the passed address to spend the specified amount of tokens on behalf of msg.sender
     * and then call `onApprovalReceived` on spender.
     * Beware that changing an allowance with this method brings the risk that someone may use both the old
     * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
     * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     * @param spender address The address which will spend the funds
     * @param amount uint256 The amount of tokens to be spent
     * @param data bytes Additional data with no specified format, sent in call to `spender`
     */
    function approveAndCall(
        address spender,
        uint256 amount,
        bytes calldata data
    ) external returns (bool);
}

// File: @openzeppelin/contracts/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/contracts/token/ERC20/ERC20.sol


// OpenZeppelin Contracts (last updated v4.7.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.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * 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}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * 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 value {ERC20} uses, unless this function is
     * 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;
        }
        _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;
        _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;
        }
        _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: erc-payable-token/contracts/token/ERC1363/ERC1363.sol



pragma solidity ^0.8.0;







/**
 * @title ERC1363
 * @author Vittorio Minacori (https://github.com/vittominacori)
 * @dev Implementation of an ERC1363 interface
 */
abstract contract ERC1363 is ERC20, IERC1363, ERC165 {
    using Address for address;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return interfaceId == type(IERC1363).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev Transfer tokens to a specified address and then execute a callback on `to`.
     * @param to The address to transfer to.
     * @param amount The amount to be transferred.
     * @return A boolean that indicates if the operation was successful.
     */
    function transferAndCall(address to, uint256 amount) public virtual override returns (bool) {
        return transferAndCall(to, amount, "");
    }

    /**
     * @dev Transfer tokens to a specified address and then execute a callback on `to`.
     * @param to The address to transfer to
     * @param amount The amount to be transferred
     * @param data Additional data with no specified format
     * @return A boolean that indicates if the operation was successful.
     */
    function transferAndCall(
        address to,
        uint256 amount,
        bytes memory data
    ) public virtual override returns (bool) {
        transfer(to, amount);
        require(_checkOnTransferReceived(_msgSender(), to, amount, data), "ERC1363: receiver returned wrong data");
        return true;
    }

    /**
     * @dev Transfer tokens from one address to another and then execute a callback on `to`.
     * @param from The address which you want to send tokens from
     * @param to The address which you want to transfer to
     * @param amount The amount of tokens to be transferred
     * @return A boolean that indicates if the operation was successful.
     */
    function transferFromAndCall(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        return transferFromAndCall(from, to, amount, "");
    }

    /**
     * @dev Transfer tokens from one address to another and then execute a callback on `to`.
     * @param from The address which you want to send tokens from
     * @param to The address which you want to transfer to
     * @param amount The amount of tokens to be transferred
     * @param data Additional data with no specified format
     * @return A boolean that indicates if the operation was successful.
     */
    function transferFromAndCall(
        address from,
        address to,
        uint256 amount,
        bytes memory data
    ) public virtual override returns (bool) {
        transferFrom(from, to, amount);
        require(_checkOnTransferReceived(from, to, amount, data), "ERC1363: receiver returned wrong data");
        return true;
    }

    /**
     * @dev Approve spender to transfer tokens and then execute a callback on `spender`.
     * @param spender The address allowed to transfer to
     * @param amount The amount allowed to be transferred
     * @return A boolean that indicates if the operation was successful.
     */
    function approveAndCall(address spender, uint256 amount) public virtual override returns (bool) {
        return approveAndCall(spender, amount, "");
    }

    /**
     * @dev Approve spender to transfer tokens and then execute a callback on `spender`.
     * @param spender The address allowed to transfer to.
     * @param amount The amount allowed to be transferred.
     * @param data Additional data with no specified format.
     * @return A boolean that indicates if the operation was successful.
     */
    function approveAndCall(
        address spender,
        uint256 amount,
        bytes memory data
    ) public virtual override returns (bool) {
        approve(spender, amount);
        require(_checkOnApprovalReceived(spender, amount, data), "ERC1363: spender returned wrong data");
        return true;
    }

    /**
     * @dev Internal function to invoke {IERC1363Receiver-onTransferReceived} on a target address
     *  The call is not executed if the target address is not a contract
     * @param sender address Representing the previous owner of the given token amount
     * @param recipient address Target address that will receive the tokens
     * @param amount uint256 The amount mount of tokens to be transferred
     * @param data bytes Optional data to send along with the call
     * @return whether the call correctly returned the expected magic value
     */
    function _checkOnTransferReceived(
        address sender,
        address recipient,
        uint256 amount,
        bytes memory data
    ) internal virtual returns (bool) {
        if (!recipient.isContract()) {
            revert("ERC1363: transfer to non contract address");
        }

        try IERC1363Receiver(recipient).onTransferReceived(_msgSender(), sender, amount, data) returns (bytes4 retval) {
            return retval == IERC1363Receiver.onTransferReceived.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert("ERC1363: transfer to non ERC1363Receiver implementer");
            } else {
                /// @solidity memory-safe-assembly
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Internal function to invoke {IERC1363Receiver-onApprovalReceived} on a target address
     *  The call is not executed if the target address is not a contract
     * @param spender address The address which will spend the funds
     * @param amount uint256 The amount of tokens to be spent
     * @param data bytes Optional data to send along with the call
     * @return whether the call correctly returned the expected magic value
     */
    function _checkOnApprovalReceived(
        address spender,
        uint256 amount,
        bytes memory data
    ) internal virtual returns (bool) {
        if (!spender.isContract()) {
            revert("ERC1363: approve a non contract address");
        }

        try IERC1363Spender(spender).onApprovalReceived(_msgSender(), amount, data) returns (bytes4 retval) {
            return retval == IERC1363Spender.onApprovalReceived.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert("ERC1363: approve a non ERC1363Spender implementer");
            } else {
                /// @solidity memory-safe-assembly
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }
}

// File: contracts/dopes.sol



pragma solidity ^0.8.9;




contract Dopes is ERC1363, Ownable, Pausable {
  uint private totalDopeSupply = 5000000000 * 10**18; // 5 thousand million Dopes

  // a mapping from an address to whether or not it can mint / burn
  mapping(address => bool) public controllers;

  constructor() ERC20("dopes", "DOPES") {
      _mint(owner(), totalDopeSupply);  // whole balance is held by the manager
  }

  /**
   * burns $DOPES from a holder
   * @param from the holder of the $DOPES
   * @param amount the amount of $DOPES to burn
   */
  function burn(address from, uint256 amount) external {
    require(controllers[_msgSender()], "Only controllers can burn");
    _burn(from, amount);
  }

  /**
   * enables an address to mint / burn
   * @param controller the address to enable
   */
  function addController(address controller) external onlyOwner {
    controllers[controller] = true;
  }

  /**
   * disables an address from minting / burning
   * @param controller the address to disbale
   */
  function removeController(address controller) external onlyOwner  {
    controllers[controller] = false;
  }

  function transfer(address _to, uint _value) public override whenNotPaused returns (bool) {
    return super.transfer(_to, _value);
  }

  function transferFrom(address _from, address _to, uint _value) public override whenNotPaused returns (bool) {
    return super.transferFrom(_from, _to, _value);
  }
  
  function pause() external onlyOwner {
      _pause();
  }

    function unpause() external onlyOwner {
      _unpause();
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"controller","type":"address"}],"name":"addController","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":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approveAndCall","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"approveAndCall","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":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"controllers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[{"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":[],"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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"controller","type":"address"}],"name":"removeController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","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":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferAndCall","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"transferAndCall","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":"_value","type":"uint256"}],"name":"transferFrom","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"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"transferFromAndCall","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":"transferFromAndCall","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526b1027e72f1f128130880000006006553480156200002157600080fd5b506040518060400160405280600581526020017f646f7065730000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f444f5045530000000000000000000000000000000000000000000000000000008152508160039080519060200190620000a6929190620003a1565b508060049080519060200190620000bf929190620003a1565b505050620000e2620000d66200012660201b60201c565b6200012e60201b60201c565b6000600560146101000a81548160ff0219169083151502179055506200012062000111620001f460201b60201c565b6006546200021e60201b60201c565b620005fd565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000291576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200028890620004b2565b60405180910390fd5b620002a5600083836200039760201b60201c565b8060026000828254620002b991906200050d565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200031091906200050d565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200037791906200057b565b60405180910390a362000393600083836200039c60201b60201c565b5050565b505050565b505050565b828054620003af90620005c7565b90600052602060002090601f016020900481019282620003d357600085556200041f565b82601f10620003ee57805160ff19168380011785556200041f565b828001600101855582156200041f579182015b828111156200041e57825182559160200191906001019062000401565b5b5090506200042e919062000432565b5090565b5b808211156200044d57600081600090555060010162000433565b5090565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006200049a601f8362000451565b9150620004a78262000462565b602082019050919050565b60006020820190508181036000830152620004cd816200048b565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200051a82620004d4565b91506200052783620004d4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156200055f576200055e620004de565b5b828201905092915050565b6200057581620004d4565b82525050565b60006020820190506200059260008301846200056a565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620005e057607f821691505b60208210811415620005f757620005f662000598565b5b50919050565b612e3c806200060d6000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80638456cb59116100f9578063c1d34b8911610097578063da8c229e11610071578063da8c229e14610543578063dd62ed3e14610573578063f2fde38b146105a3578063f6a74ed7146105bf576101c4565b8063c1d34b89146104b3578063cae9ca51146104e3578063d8fbe99414610513576101c4565b80639dc29fac116100d35780639dc29fac1461041b578063a457c2d714610437578063a7fc7a0714610467578063a9059cbb14610483576101c4565b80638456cb59146103d55780638da5cb5b146103df57806395d89b41146103fd576101c4565b80633177029f116101665780634000aea0116101405780634000aea01461034d5780635c975abb1461037d57806370a082311461039b578063715018a6146103cb576101c4565b80633177029f146102e357806339509351146103135780633f4ba83a14610343576101c4565b80631296ee62116101a25780631296ee621461024757806318160ddd1461027757806323b872dd14610295578063313ce567146102c5576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063095ea7b314610217575b600080fd5b6101e360048036038101906101de9190611bbd565b6105db565b6040516101f09190611c05565b60405180910390f35b610201610655565b60405161020e9190611cb9565b60405180910390f35b610231600480360381019061022c9190611d6f565b6106e7565b60405161023e9190611c05565b60405180910390f35b610261600480360381019061025c9190611d6f565b61070a565b60405161026e9190611c05565b60405180910390f35b61027f61072e565b60405161028c9190611dbe565b60405180910390f35b6102af60048036038101906102aa9190611dd9565b610738565b6040516102bc9190611c05565b60405180910390f35b6102cd610756565b6040516102da9190611e48565b60405180910390f35b6102fd60048036038101906102f89190611d6f565b61075f565b60405161030a9190611c05565b60405180910390f35b61032d60048036038101906103289190611d6f565b610783565b60405161033a9190611c05565b60405180910390f35b61034b6107ba565b005b61036760048036038101906103629190611f98565b6107cc565b6040516103749190611c05565b60405180910390f35b610385610836565b6040516103929190611c05565b60405180910390f35b6103b560048036038101906103b09190612007565b61084d565b6040516103c29190611dbe565b60405180910390f35b6103d3610895565b005b6103dd6108a9565b005b6103e76108bb565b6040516103f49190612043565b60405180910390f35b6104056108e5565b6040516104129190611cb9565b60405180910390f35b61043560048036038101906104309190611d6f565b610977565b005b610451600480360381019061044c9190611d6f565b610a18565b60405161045e9190611c05565b60405180910390f35b610481600480360381019061047c9190612007565b610a8f565b005b61049d60048036038101906104989190611d6f565b610af2565b6040516104aa9190611c05565b60405180910390f35b6104cd60048036038101906104c8919061205e565b610b0e565b6040516104da9190611c05565b60405180910390f35b6104fd60048036038101906104f89190611f98565b610b73565b60405161050a9190611c05565b60405180910390f35b61052d60048036038101906105289190611dd9565b610bd5565b60405161053a9190611c05565b60405180910390f35b61055d60048036038101906105589190612007565b610bfb565b60405161056a9190611c05565b60405180910390f35b61058d600480360381019061058891906120e1565b610c1b565b60405161059a9190611dbe565b60405180910390f35b6105bd60048036038101906105b89190612007565b610ca2565b005b6105d960048036038101906105d49190612007565b610d26565b005b60007fb0202a11000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061064e575061064d82610d89565b5b9050919050565b60606003805461066490612150565b80601f016020809104026020016040519081016040528092919081815260200182805461069090612150565b80156106dd5780601f106106b2576101008083540402835291602001916106dd565b820191906000526020600020905b8154815290600101906020018083116106c057829003601f168201915b5050505050905090565b6000806106f2610df3565b90506106ff818585610dfb565b600191505092915050565b60006107268383604051806020016040528060008152506107cc565b905092915050565b6000600254905090565b6000610742610fc6565b61074d848484611010565b90509392505050565b60006012905090565b600061077b838360405180602001604052806000815250610b73565b905092915050565b60008061078e610df3565b90506107af8185856107a08589610c1b565b6107aa91906121b1565b610dfb565b600191505092915050565b6107c261103f565b6107ca6110bd565b565b60006107d88484610af2565b506107ec6107e4610df3565b858585611120565b61082b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082290612279565b60405180910390fd5b600190509392505050565b6000600560149054906101000a900460ff16905090565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61089d61103f565b6108a760006112e7565b565b6108b161103f565b6108b96113ad565b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546108f490612150565b80601f016020809104026020016040519081016040528092919081815260200182805461092090612150565b801561096d5780601f106109425761010080835404028352916020019161096d565b820191906000526020600020905b81548152906001019060200180831161095057829003601f168201915b5050505050905090565b60076000610983610df3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610a0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a01906122e5565b60405180910390fd5b610a148282611410565b5050565b600080610a23610df3565b90506000610a318286610c1b565b905083811015610a76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6d90612377565b60405180910390fd5b610a838286868403610dfb565b60019250505092915050565b610a9761103f565b6001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000610afc610fc6565b610b0683836115e7565b905092915050565b6000610b1b858585610738565b50610b2885858585611120565b610b67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5e90612279565b60405180910390fd5b60019050949350505050565b6000610b7f84846106e7565b50610b8b84848461160a565b610bca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc190612409565b60405180910390fd5b600190509392505050565b6000610bf284848460405180602001604052806000815250610b0e565b90509392505050565b60076020528060005260406000206000915054906101000a900460ff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610caa61103f565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d119061249b565b60405180910390fd5b610d23816112e7565b50565b610d2e61103f565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e629061252d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610edb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed2906125bf565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610fb99190611dbe565b60405180910390a3505050565b610fce610836565b1561100e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110059061262b565b60405180910390fd5b565b60008061101b610df3565b90506110288582856117ce565b61103385858561185a565b60019150509392505050565b611047610df3565b73ffffffffffffffffffffffffffffffffffffffff166110656108bb565b73ffffffffffffffffffffffffffffffffffffffff16146110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b290612697565b60405180910390fd5b565b6110c5611adb565b6000600560146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611109610df3565b6040516111169190612043565b60405180910390a1565b60006111418473ffffffffffffffffffffffffffffffffffffffff16611b24565b611180576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117790612729565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff166388a7ca5c6111a4610df3565b8786866040518563ffffffff1660e01b81526004016111c6949392919061279e565b602060405180830381600087803b1580156111e057600080fd5b505af192505050801561121157506040513d601f19601f8201168201806040525081019061120e91906127ff565b60015b611294573d8060008114611241576040519150601f19603f3d011682016040523d82523d6000602084013e611246565b606091505b5060008151141561128c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112839061289e565b60405180910390fd5b805181602001fd5b6388a7ca5c60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6113b5610fc6565b6001600560146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586113f9610df3565b6040516114069190612043565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611480576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147790612930565b60405180910390fd5b61148c82600083611b47565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611512576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611509906129c2565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816002600082825461156991906129e2565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516115ce9190611dbe565b60405180910390a36115e283600084611b4c565b505050565b6000806115f2610df3565b90506115ff81858561185a565b600191505092915050565b600061162b8473ffffffffffffffffffffffffffffffffffffffff16611b24565b61166a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166190612a88565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff16637b04a2d061168e610df3565b85856040518463ffffffff1660e01b81526004016116ae93929190612aa8565b602060405180830381600087803b1580156116c857600080fd5b505af19250505080156116f957506040513d601f19601f820116820180604052508101906116f691906127ff565b60015b61177c573d8060008114611729576040519150601f19603f3d011682016040523d82523d6000602084013e61172e565b606091505b50600081511415611774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176b90612b58565b60405180910390fd5b805181602001fd5b637b04a2d060e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150509392505050565b60006117da8484610c1b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146118545781811015611846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183d90612bc4565b60405180910390fd5b6118538484848403610dfb565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156118ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c190612c56565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561193a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193190612ce8565b60405180910390fd5b611945838383611b47565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156119cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c290612d7a565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a5e91906121b1565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611ac29190611dbe565b60405180910390a3611ad5848484611b4c565b50505050565b611ae3610836565b611b22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1990612de6565b60405180910390fd5b565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611b9a81611b65565b8114611ba557600080fd5b50565b600081359050611bb781611b91565b92915050565b600060208284031215611bd357611bd2611b5b565b5b6000611be184828501611ba8565b91505092915050565b60008115159050919050565b611bff81611bea565b82525050565b6000602082019050611c1a6000830184611bf6565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611c5a578082015181840152602081019050611c3f565b83811115611c69576000848401525b50505050565b6000601f19601f8301169050919050565b6000611c8b82611c20565b611c958185611c2b565b9350611ca5818560208601611c3c565b611cae81611c6f565b840191505092915050565b60006020820190508181036000830152611cd38184611c80565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611d0682611cdb565b9050919050565b611d1681611cfb565b8114611d2157600080fd5b50565b600081359050611d3381611d0d565b92915050565b6000819050919050565b611d4c81611d39565b8114611d5757600080fd5b50565b600081359050611d6981611d43565b92915050565b60008060408385031215611d8657611d85611b5b565b5b6000611d9485828601611d24565b9250506020611da585828601611d5a565b9150509250929050565b611db881611d39565b82525050565b6000602082019050611dd36000830184611daf565b92915050565b600080600060608486031215611df257611df1611b5b565b5b6000611e0086828701611d24565b9350506020611e1186828701611d24565b9250506040611e2286828701611d5a565b9150509250925092565b600060ff82169050919050565b611e4281611e2c565b82525050565b6000602082019050611e5d6000830184611e39565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611ea582611c6f565b810181811067ffffffffffffffff82111715611ec457611ec3611e6d565b5b80604052505050565b6000611ed7611b51565b9050611ee38282611e9c565b919050565b600067ffffffffffffffff821115611f0357611f02611e6d565b5b611f0c82611c6f565b9050602081019050919050565b82818337600083830152505050565b6000611f3b611f3684611ee8565b611ecd565b905082815260208101848484011115611f5757611f56611e68565b5b611f62848285611f19565b509392505050565b600082601f830112611f7f57611f7e611e63565b5b8135611f8f848260208601611f28565b91505092915050565b600080600060608486031215611fb157611fb0611b5b565b5b6000611fbf86828701611d24565b9350506020611fd086828701611d5a565b925050604084013567ffffffffffffffff811115611ff157611ff0611b60565b5b611ffd86828701611f6a565b9150509250925092565b60006020828403121561201d5761201c611b5b565b5b600061202b84828501611d24565b91505092915050565b61203d81611cfb565b82525050565b60006020820190506120586000830184612034565b92915050565b6000806000806080858703121561207857612077611b5b565b5b600061208687828801611d24565b945050602061209787828801611d24565b93505060406120a887828801611d5a565b925050606085013567ffffffffffffffff8111156120c9576120c8611b60565b5b6120d587828801611f6a565b91505092959194509250565b600080604083850312156120f8576120f7611b5b565b5b600061210685828601611d24565b925050602061211785828601611d24565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061216857607f821691505b6020821081141561217c5761217b612121565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006121bc82611d39565b91506121c783611d39565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156121fc576121fb612182565b5b828201905092915050565b7f455243313336333a2072656365697665722072657475726e65642077726f6e6760008201527f2064617461000000000000000000000000000000000000000000000000000000602082015250565b6000612263602583611c2b565b915061226e82612207565b604082019050919050565b6000602082019050818103600083015261229281612256565b9050919050565b7f4f6e6c7920636f6e74726f6c6c6572732063616e206275726e00000000000000600082015250565b60006122cf601983611c2b565b91506122da82612299565b602082019050919050565b600060208201905081810360008301526122fe816122c2565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612361602583611c2b565b915061236c82612305565b604082019050919050565b6000602082019050818103600083015261239081612354565b9050919050565b7f455243313336333a207370656e6465722072657475726e65642077726f6e672060008201527f6461746100000000000000000000000000000000000000000000000000000000602082015250565b60006123f3602483611c2b565b91506123fe82612397565b604082019050919050565b60006020820190508181036000830152612422816123e6565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612485602683611c2b565b915061249082612429565b604082019050919050565b600060208201905081810360008301526124b481612478565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612517602483611c2b565b9150612522826124bb565b604082019050919050565b600060208201905081810360008301526125468161250a565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006125a9602283611c2b565b91506125b48261254d565b604082019050919050565b600060208201905081810360008301526125d88161259c565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000612615601083611c2b565b9150612620826125df565b602082019050919050565b6000602082019050818103600083015261264481612608565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612681602083611c2b565b915061268c8261264b565b602082019050919050565b600060208201905081810360008301526126b081612674565b9050919050565b7f455243313336333a207472616e7366657220746f206e6f6e20636f6e7472616360008201527f7420616464726573730000000000000000000000000000000000000000000000602082015250565b6000612713602983611c2b565b915061271e826126b7565b604082019050919050565b6000602082019050818103600083015261274281612706565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061277082612749565b61277a8185612754565b935061278a818560208601611c3c565b61279381611c6f565b840191505092915050565b60006080820190506127b36000830187612034565b6127c06020830186612034565b6127cd6040830185611daf565b81810360608301526127df8184612765565b905095945050505050565b6000815190506127f981611b91565b92915050565b60006020828403121561281557612814611b5b565b5b6000612823848285016127ea565b91505092915050565b7f455243313336333a207472616e7366657220746f206e6f6e204552433133363360008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000612888603483611c2b565b91506128938261282c565b604082019050919050565b600060208201905081810360008301526128b78161287b565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061291a602183611c2b565b9150612925826128be565b604082019050919050565b600060208201905081810360008301526129498161290d565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b60006129ac602283611c2b565b91506129b782612950565b604082019050919050565b600060208201905081810360008301526129db8161299f565b9050919050565b60006129ed82611d39565b91506129f883611d39565b925082821015612a0b57612a0a612182565b5b828203905092915050565b7f455243313336333a20617070726f76652061206e6f6e20636f6e74726163742060008201527f6164647265737300000000000000000000000000000000000000000000000000602082015250565b6000612a72602783611c2b565b9150612a7d82612a16565b604082019050919050565b60006020820190508181036000830152612aa181612a65565b9050919050565b6000606082019050612abd6000830186612034565b612aca6020830185611daf565b8181036040830152612adc8184612765565b9050949350505050565b7f455243313336333a20617070726f76652061206e6f6e2045524331333633537060008201527f656e64657220696d706c656d656e746572000000000000000000000000000000602082015250565b6000612b42603183611c2b565b9150612b4d82612ae6565b604082019050919050565b60006020820190508181036000830152612b7181612b35565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612bae601d83611c2b565b9150612bb982612b78565b602082019050919050565b60006020820190508181036000830152612bdd81612ba1565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612c40602583611c2b565b9150612c4b82612be4565b604082019050919050565b60006020820190508181036000830152612c6f81612c33565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612cd2602383611c2b565b9150612cdd82612c76565b604082019050919050565b60006020820190508181036000830152612d0181612cc5565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000612d64602683611c2b565b9150612d6f82612d08565b604082019050919050565b60006020820190508181036000830152612d9381612d57565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000612dd0601483611c2b565b9150612ddb82612d9a565b602082019050919050565b60006020820190508181036000830152612dff81612dc3565b905091905056fea26469706673582212205a8b8b5626f11fdb307c34ed9dae6df639f0bf57438a4a932fba4efd91b8635364736f6c63430008090033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101c45760003560e01c80638456cb59116100f9578063c1d34b8911610097578063da8c229e11610071578063da8c229e14610543578063dd62ed3e14610573578063f2fde38b146105a3578063f6a74ed7146105bf576101c4565b8063c1d34b89146104b3578063cae9ca51146104e3578063d8fbe99414610513576101c4565b80639dc29fac116100d35780639dc29fac1461041b578063a457c2d714610437578063a7fc7a0714610467578063a9059cbb14610483576101c4565b80638456cb59146103d55780638da5cb5b146103df57806395d89b41146103fd576101c4565b80633177029f116101665780634000aea0116101405780634000aea01461034d5780635c975abb1461037d57806370a082311461039b578063715018a6146103cb576101c4565b80633177029f146102e357806339509351146103135780633f4ba83a14610343576101c4565b80631296ee62116101a25780631296ee621461024757806318160ddd1461027757806323b872dd14610295578063313ce567146102c5576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063095ea7b314610217575b600080fd5b6101e360048036038101906101de9190611bbd565b6105db565b6040516101f09190611c05565b60405180910390f35b610201610655565b60405161020e9190611cb9565b60405180910390f35b610231600480360381019061022c9190611d6f565b6106e7565b60405161023e9190611c05565b60405180910390f35b610261600480360381019061025c9190611d6f565b61070a565b60405161026e9190611c05565b60405180910390f35b61027f61072e565b60405161028c9190611dbe565b60405180910390f35b6102af60048036038101906102aa9190611dd9565b610738565b6040516102bc9190611c05565b60405180910390f35b6102cd610756565b6040516102da9190611e48565b60405180910390f35b6102fd60048036038101906102f89190611d6f565b61075f565b60405161030a9190611c05565b60405180910390f35b61032d60048036038101906103289190611d6f565b610783565b60405161033a9190611c05565b60405180910390f35b61034b6107ba565b005b61036760048036038101906103629190611f98565b6107cc565b6040516103749190611c05565b60405180910390f35b610385610836565b6040516103929190611c05565b60405180910390f35b6103b560048036038101906103b09190612007565b61084d565b6040516103c29190611dbe565b60405180910390f35b6103d3610895565b005b6103dd6108a9565b005b6103e76108bb565b6040516103f49190612043565b60405180910390f35b6104056108e5565b6040516104129190611cb9565b60405180910390f35b61043560048036038101906104309190611d6f565b610977565b005b610451600480360381019061044c9190611d6f565b610a18565b60405161045e9190611c05565b60405180910390f35b610481600480360381019061047c9190612007565b610a8f565b005b61049d60048036038101906104989190611d6f565b610af2565b6040516104aa9190611c05565b60405180910390f35b6104cd60048036038101906104c8919061205e565b610b0e565b6040516104da9190611c05565b60405180910390f35b6104fd60048036038101906104f89190611f98565b610b73565b60405161050a9190611c05565b60405180910390f35b61052d60048036038101906105289190611dd9565b610bd5565b60405161053a9190611c05565b60405180910390f35b61055d60048036038101906105589190612007565b610bfb565b60405161056a9190611c05565b60405180910390f35b61058d600480360381019061058891906120e1565b610c1b565b60405161059a9190611dbe565b60405180910390f35b6105bd60048036038101906105b89190612007565b610ca2565b005b6105d960048036038101906105d49190612007565b610d26565b005b60007fb0202a11000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061064e575061064d82610d89565b5b9050919050565b60606003805461066490612150565b80601f016020809104026020016040519081016040528092919081815260200182805461069090612150565b80156106dd5780601f106106b2576101008083540402835291602001916106dd565b820191906000526020600020905b8154815290600101906020018083116106c057829003601f168201915b5050505050905090565b6000806106f2610df3565b90506106ff818585610dfb565b600191505092915050565b60006107268383604051806020016040528060008152506107cc565b905092915050565b6000600254905090565b6000610742610fc6565b61074d848484611010565b90509392505050565b60006012905090565b600061077b838360405180602001604052806000815250610b73565b905092915050565b60008061078e610df3565b90506107af8185856107a08589610c1b565b6107aa91906121b1565b610dfb565b600191505092915050565b6107c261103f565b6107ca6110bd565b565b60006107d88484610af2565b506107ec6107e4610df3565b858585611120565b61082b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082290612279565b60405180910390fd5b600190509392505050565b6000600560149054906101000a900460ff16905090565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61089d61103f565b6108a760006112e7565b565b6108b161103f565b6108b96113ad565b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546108f490612150565b80601f016020809104026020016040519081016040528092919081815260200182805461092090612150565b801561096d5780601f106109425761010080835404028352916020019161096d565b820191906000526020600020905b81548152906001019060200180831161095057829003601f168201915b5050505050905090565b60076000610983610df3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610a0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a01906122e5565b60405180910390fd5b610a148282611410565b5050565b600080610a23610df3565b90506000610a318286610c1b565b905083811015610a76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6d90612377565b60405180910390fd5b610a838286868403610dfb565b60019250505092915050565b610a9761103f565b6001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000610afc610fc6565b610b0683836115e7565b905092915050565b6000610b1b858585610738565b50610b2885858585611120565b610b67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5e90612279565b60405180910390fd5b60019050949350505050565b6000610b7f84846106e7565b50610b8b84848461160a565b610bca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc190612409565b60405180910390fd5b600190509392505050565b6000610bf284848460405180602001604052806000815250610b0e565b90509392505050565b60076020528060005260406000206000915054906101000a900460ff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610caa61103f565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d119061249b565b60405180910390fd5b610d23816112e7565b50565b610d2e61103f565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e629061252d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610edb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed2906125bf565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610fb99190611dbe565b60405180910390a3505050565b610fce610836565b1561100e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110059061262b565b60405180910390fd5b565b60008061101b610df3565b90506110288582856117ce565b61103385858561185a565b60019150509392505050565b611047610df3565b73ffffffffffffffffffffffffffffffffffffffff166110656108bb565b73ffffffffffffffffffffffffffffffffffffffff16146110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b290612697565b60405180910390fd5b565b6110c5611adb565b6000600560146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611109610df3565b6040516111169190612043565b60405180910390a1565b60006111418473ffffffffffffffffffffffffffffffffffffffff16611b24565b611180576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117790612729565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff166388a7ca5c6111a4610df3565b8786866040518563ffffffff1660e01b81526004016111c6949392919061279e565b602060405180830381600087803b1580156111e057600080fd5b505af192505050801561121157506040513d601f19601f8201168201806040525081019061120e91906127ff565b60015b611294573d8060008114611241576040519150601f19603f3d011682016040523d82523d6000602084013e611246565b606091505b5060008151141561128c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112839061289e565b60405180910390fd5b805181602001fd5b6388a7ca5c60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6113b5610fc6565b6001600560146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586113f9610df3565b6040516114069190612043565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611480576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147790612930565b60405180910390fd5b61148c82600083611b47565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611512576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611509906129c2565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816002600082825461156991906129e2565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516115ce9190611dbe565b60405180910390a36115e283600084611b4c565b505050565b6000806115f2610df3565b90506115ff81858561185a565b600191505092915050565b600061162b8473ffffffffffffffffffffffffffffffffffffffff16611b24565b61166a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166190612a88565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff16637b04a2d061168e610df3565b85856040518463ffffffff1660e01b81526004016116ae93929190612aa8565b602060405180830381600087803b1580156116c857600080fd5b505af19250505080156116f957506040513d601f19601f820116820180604052508101906116f691906127ff565b60015b61177c573d8060008114611729576040519150601f19603f3d011682016040523d82523d6000602084013e61172e565b606091505b50600081511415611774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176b90612b58565b60405180910390fd5b805181602001fd5b637b04a2d060e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150509392505050565b60006117da8484610c1b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146118545781811015611846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183d90612bc4565b60405180910390fd5b6118538484848403610dfb565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156118ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c190612c56565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561193a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193190612ce8565b60405180910390fd5b611945838383611b47565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156119cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c290612d7a565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a5e91906121b1565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611ac29190611dbe565b60405180910390a3611ad5848484611b4c565b50505050565b611ae3610836565b611b22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1990612de6565b60405180910390fd5b565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611b9a81611b65565b8114611ba557600080fd5b50565b600081359050611bb781611b91565b92915050565b600060208284031215611bd357611bd2611b5b565b5b6000611be184828501611ba8565b91505092915050565b60008115159050919050565b611bff81611bea565b82525050565b6000602082019050611c1a6000830184611bf6565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611c5a578082015181840152602081019050611c3f565b83811115611c69576000848401525b50505050565b6000601f19601f8301169050919050565b6000611c8b82611c20565b611c958185611c2b565b9350611ca5818560208601611c3c565b611cae81611c6f565b840191505092915050565b60006020820190508181036000830152611cd38184611c80565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611d0682611cdb565b9050919050565b611d1681611cfb565b8114611d2157600080fd5b50565b600081359050611d3381611d0d565b92915050565b6000819050919050565b611d4c81611d39565b8114611d5757600080fd5b50565b600081359050611d6981611d43565b92915050565b60008060408385031215611d8657611d85611b5b565b5b6000611d9485828601611d24565b9250506020611da585828601611d5a565b9150509250929050565b611db881611d39565b82525050565b6000602082019050611dd36000830184611daf565b92915050565b600080600060608486031215611df257611df1611b5b565b5b6000611e0086828701611d24565b9350506020611e1186828701611d24565b9250506040611e2286828701611d5a565b9150509250925092565b600060ff82169050919050565b611e4281611e2c565b82525050565b6000602082019050611e5d6000830184611e39565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611ea582611c6f565b810181811067ffffffffffffffff82111715611ec457611ec3611e6d565b5b80604052505050565b6000611ed7611b51565b9050611ee38282611e9c565b919050565b600067ffffffffffffffff821115611f0357611f02611e6d565b5b611f0c82611c6f565b9050602081019050919050565b82818337600083830152505050565b6000611f3b611f3684611ee8565b611ecd565b905082815260208101848484011115611f5757611f56611e68565b5b611f62848285611f19565b509392505050565b600082601f830112611f7f57611f7e611e63565b5b8135611f8f848260208601611f28565b91505092915050565b600080600060608486031215611fb157611fb0611b5b565b5b6000611fbf86828701611d24565b9350506020611fd086828701611d5a565b925050604084013567ffffffffffffffff811115611ff157611ff0611b60565b5b611ffd86828701611f6a565b9150509250925092565b60006020828403121561201d5761201c611b5b565b5b600061202b84828501611d24565b91505092915050565b61203d81611cfb565b82525050565b60006020820190506120586000830184612034565b92915050565b6000806000806080858703121561207857612077611b5b565b5b600061208687828801611d24565b945050602061209787828801611d24565b93505060406120a887828801611d5a565b925050606085013567ffffffffffffffff8111156120c9576120c8611b60565b5b6120d587828801611f6a565b91505092959194509250565b600080604083850312156120f8576120f7611b5b565b5b600061210685828601611d24565b925050602061211785828601611d24565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061216857607f821691505b6020821081141561217c5761217b612121565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006121bc82611d39565b91506121c783611d39565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156121fc576121fb612182565b5b828201905092915050565b7f455243313336333a2072656365697665722072657475726e65642077726f6e6760008201527f2064617461000000000000000000000000000000000000000000000000000000602082015250565b6000612263602583611c2b565b915061226e82612207565b604082019050919050565b6000602082019050818103600083015261229281612256565b9050919050565b7f4f6e6c7920636f6e74726f6c6c6572732063616e206275726e00000000000000600082015250565b60006122cf601983611c2b565b91506122da82612299565b602082019050919050565b600060208201905081810360008301526122fe816122c2565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612361602583611c2b565b915061236c82612305565b604082019050919050565b6000602082019050818103600083015261239081612354565b9050919050565b7f455243313336333a207370656e6465722072657475726e65642077726f6e672060008201527f6461746100000000000000000000000000000000000000000000000000000000602082015250565b60006123f3602483611c2b565b91506123fe82612397565b604082019050919050565b60006020820190508181036000830152612422816123e6565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612485602683611c2b565b915061249082612429565b604082019050919050565b600060208201905081810360008301526124b481612478565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612517602483611c2b565b9150612522826124bb565b604082019050919050565b600060208201905081810360008301526125468161250a565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006125a9602283611c2b565b91506125b48261254d565b604082019050919050565b600060208201905081810360008301526125d88161259c565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000612615601083611c2b565b9150612620826125df565b602082019050919050565b6000602082019050818103600083015261264481612608565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612681602083611c2b565b915061268c8261264b565b602082019050919050565b600060208201905081810360008301526126b081612674565b9050919050565b7f455243313336333a207472616e7366657220746f206e6f6e20636f6e7472616360008201527f7420616464726573730000000000000000000000000000000000000000000000602082015250565b6000612713602983611c2b565b915061271e826126b7565b604082019050919050565b6000602082019050818103600083015261274281612706565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061277082612749565b61277a8185612754565b935061278a818560208601611c3c565b61279381611c6f565b840191505092915050565b60006080820190506127b36000830187612034565b6127c06020830186612034565b6127cd6040830185611daf565b81810360608301526127df8184612765565b905095945050505050565b6000815190506127f981611b91565b92915050565b60006020828403121561281557612814611b5b565b5b6000612823848285016127ea565b91505092915050565b7f455243313336333a207472616e7366657220746f206e6f6e204552433133363360008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000612888603483611c2b565b91506128938261282c565b604082019050919050565b600060208201905081810360008301526128b78161287b565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061291a602183611c2b565b9150612925826128be565b604082019050919050565b600060208201905081810360008301526129498161290d565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b60006129ac602283611c2b565b91506129b782612950565b604082019050919050565b600060208201905081810360008301526129db8161299f565b9050919050565b60006129ed82611d39565b91506129f883611d39565b925082821015612a0b57612a0a612182565b5b828203905092915050565b7f455243313336333a20617070726f76652061206e6f6e20636f6e74726163742060008201527f6164647265737300000000000000000000000000000000000000000000000000602082015250565b6000612a72602783611c2b565b9150612a7d82612a16565b604082019050919050565b60006020820190508181036000830152612aa181612a65565b9050919050565b6000606082019050612abd6000830186612034565b612aca6020830185611daf565b8181036040830152612adc8184612765565b9050949350505050565b7f455243313336333a20617070726f76652061206e6f6e2045524331333633537060008201527f656e64657220696d706c656d656e746572000000000000000000000000000000602082015250565b6000612b42603183611c2b565b9150612b4d82612ae6565b604082019050919050565b60006020820190508181036000830152612b7181612b35565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612bae601d83611c2b565b9150612bb982612b78565b602082019050919050565b60006020820190508181036000830152612bdd81612ba1565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612c40602583611c2b565b9150612c4b82612be4565b604082019050919050565b60006020820190508181036000830152612c6f81612c33565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612cd2602383611c2b565b9150612cdd82612c76565b604082019050919050565b60006020820190508181036000830152612d0181612cc5565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000612d64602683611c2b565b9150612d6f82612d08565b604082019050919050565b60006020820190508181036000830152612d9381612d57565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000612dd0601483611c2b565b9150612ddb82612d9a565b602082019050919050565b60006020820190508181036000830152612dff81612dc3565b905091905056fea26469706673582212205a8b8b5626f11fdb307c34ed9dae6df639f0bf57438a4a932fba4efd91b8635364736f6c63430008090033

Deployed Bytecode Sourcemap

47353:1571:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40654:215;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29459:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31810:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41156:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30579:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48617:166;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30421:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43669:157;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33295:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48858:63;;;:::i;:::-;;41651:323;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15839:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30750:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18704:103;;;:::i;:::-;;48791:59;;;:::i;:::-;;18056:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29678:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47877:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34036:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48138:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48475:136;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43010:352;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44197:321;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42356:211;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47557:43;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31339:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18962:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48359:110;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40654:215;40756:4;40795:26;40780:41;;;:11;:41;;;;:81;;;;40825:36;40849:11;40825:23;:36::i;:::-;40780:81;40773:88;;40654:215;;;:::o;29459:100::-;29513:13;29546:5;29539:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29459:100;:::o;31810:201::-;31893:4;31910:13;31926:12;:10;:12::i;:::-;31910:28;;31949:32;31958:5;31965:7;31974:6;31949:8;:32::i;:::-;31999:4;31992:11;;;31810:201;;;;:::o;41156:149::-;41242:4;41266:31;41282:2;41286:6;41266:31;;;;;;;;;;;;:15;:31::i;:::-;41259:38;;41156:149;;;;:::o;30579:108::-;30640:7;30667:12;;30660:19;;30579:108;:::o;48617:166::-;48719:4;15444:19;:17;:19::i;:::-;48739:38:::1;48758:5;48765:3;48770:6;48739:18;:38::i;:::-;48732:45;;48617:166:::0;;;;;:::o;30421:93::-;30479:5;30504:2;30497:9;;30421:93;:::o;43669:157::-;43759:4;43783:35;43798:7;43807:6;43783:35;;;;;;;;;;;;:14;:35::i;:::-;43776:42;;43669:157;;;;:::o;33295:238::-;33383:4;33400:13;33416:12;:10;:12::i;:::-;33400:28;;33439:64;33448:5;33455:7;33492:10;33464:25;33474:5;33481:7;33464:9;:25::i;:::-;:38;;;;:::i;:::-;33439:8;:64::i;:::-;33521:4;33514:11;;;33295:238;;;;:::o;48858:63::-;17942:13;:11;:13::i;:::-;48905:10:::1;:8;:10::i;:::-;48858:63::o:0;41651:323::-;41790:4;41807:20;41816:2;41820:6;41807:8;:20::i;:::-;;41846:56;41871:12;:10;:12::i;:::-;41885:2;41889:6;41897:4;41846:24;:56::i;:::-;41838:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;41962:4;41955:11;;41651:323;;;;;:::o;15839:86::-;15886:4;15910:7;;;;;;;;;;;15903:14;;15839:86;:::o;30750:127::-;30824:7;30851:9;:18;30861:7;30851:18;;;;;;;;;;;;;;;;30844:25;;30750:127;;;:::o;18704:103::-;17942:13;:11;:13::i;:::-;18769:30:::1;18796:1;18769:18;:30::i;:::-;18704:103::o:0;48791:59::-;17942:13;:11;:13::i;:::-;48836:8:::1;:6;:8::i;:::-;48791:59::o:0;18056:87::-;18102:7;18129:6;;;;;;;;;;;18122:13;;18056:87;:::o;29678:104::-;29734:13;29767:7;29760:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29678:104;:::o;47877:155::-;47945:11;:25;47957:12;:10;:12::i;:::-;47945:25;;;;;;;;;;;;;;;;;;;;;;;;;47937:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;48007:19;48013:4;48019:6;48007:5;:19::i;:::-;47877:155;;:::o;34036:436::-;34129:4;34146:13;34162:12;:10;:12::i;:::-;34146:28;;34185:24;34212:25;34222:5;34229:7;34212:9;:25::i;:::-;34185:52;;34276:15;34256:16;:35;;34248:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;34369:60;34378:5;34385:7;34413:15;34394:16;:34;34369:8;:60::i;:::-;34460:4;34453:11;;;;34036:436;;;;:::o;48138:105::-;17942:13;:11;:13::i;:::-;48233:4:::1;48207:11;:23;48219:10;48207:23;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;48138:105:::0;:::o;48475:136::-;48558:4;15444:19;:17;:19::i;:::-;48578:27:::1;48593:3;48598:6;48578:14;:27::i;:::-;48571:34;;48475:136:::0;;;;:::o;43010:352::-;43176:4;43193:30;43206:4;43212:2;43216:6;43193:12;:30::i;:::-;;43242:48;43267:4;43273:2;43277:6;43285:4;43242:24;:48::i;:::-;43234:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;43350:4;43343:11;;43010:352;;;;;;:::o;44197:321::-;44340:4;44357:24;44365:7;44374:6;44357:7;:24::i;:::-;;44400:47;44425:7;44434:6;44442:4;44400:24;:47::i;:::-;44392:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;44506:4;44499:11;;44197:321;;;;;:::o;42356:211::-;42494:4;42518:41;42538:4;42544:2;42548:6;42518:41;;;;;;;;;;;;:19;:41::i;:::-;42511:48;;42356:211;;;;;:::o;47557:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;31339:151::-;31428:7;31455:11;:18;31467:5;31455:18;;;;;;;;;;;;;;;:27;31474:7;31455:27;;;;;;;;;;;;;;;;31448:34;;31339:151;;;;:::o;18962:201::-;17942:13;:11;:13::i;:::-;19071:1:::1;19051:22;;:8;:22;;;;19043:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;19127:28;19146:8;19127:18;:28::i;:::-;18962:201:::0;:::o;48359:110::-;17942:13;:11;:13::i;:::-;48458:5:::1;48432:11;:23;48444:10;48432:23;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;48359:110:::0;:::o;4556:157::-;4641:4;4680:25;4665:40;;;:11;:40;;;;4658:47;;4556:157;;;:::o;13952:98::-;14005:7;14032:10;14025:17;;13952:98;:::o;37661:380::-;37814:1;37797:19;;:5;:19;;;;37789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37895:1;37876:21;;:7;:21;;;;37868:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37979:6;37949:11;:18;37961:5;37949:18;;;;;;;;;;;;;;;:27;37968:7;37949:27;;;;;;;;;;;;;;;:36;;;;38017:7;38001:32;;38010:5;38001:32;;;38026:6;38001:32;;;;;;:::i;:::-;;;;;;;;37661:380;;;:::o;15998:108::-;16069:8;:6;:8::i;:::-;16068:9;16060:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;15998:108::o;32591:295::-;32722:4;32739:15;32757:12;:10;:12::i;:::-;32739:30;;32780:38;32796:4;32802:7;32811:6;32780:15;:38::i;:::-;32829:27;32839:4;32845:2;32849:6;32829:9;:27::i;:::-;32874:4;32867:11;;;32591:295;;;;;:::o;18221:132::-;18296:12;:10;:12::i;:::-;18285:23;;:7;:5;:7::i;:::-;:23;;;18277:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18221:132::o;16694:120::-;15703:16;:14;:16::i;:::-;16763:5:::1;16753:7;;:15;;;;;;;;;;;;;;;;;;16784:22;16793:12;:10;:12::i;:::-;16784:22;;;;;;:::i;:::-;;;;;;;;16694:120::o:0;45102:872::-;45275:4;45297:22;:9;:20;;;:22::i;:::-;45292:107;;45336:51;;;;;;;;;;:::i;:::-;;;;;;;;45292:107;45432:9;45415:46;;;45462:12;:10;:12::i;:::-;45476:6;45484;45492:4;45415:82;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;45411:556;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45675:1;45658:6;:13;:18;45654:302;;;45697:62;;;;;;;;;;:::i;:::-;;;;;;;;45654:302;45914:6;45908:13;45899:6;45895:2;45891:15;45884:38;45411:556;45554:44;;;45544:54;;;:6;:54;;;;45537:61;;;45102:872;;;;;;:::o;19323:191::-;19397:16;19416:6;;;;;;;;;;;19397:25;;19442:8;19433:6;;:17;;;;;;;;;;;;;;;;;;19497:8;19466:40;;19487:8;19466:40;;;;;;;;;;;;19386:128;19323:191;:::o;16435:118::-;15444:19;:17;:19::i;:::-;16505:4:::1;16495:7;;:14;;;;;;;;;;;;;;;;;;16525:20;16532:12;:10;:12::i;:::-;16525:20;;;;;;:::i;:::-;;;;;;;;16435:118::o:0;36632:591::-;36735:1;36716:21;;:7;:21;;;;36708:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;36788:49;36809:7;36826:1;36830:6;36788:20;:49::i;:::-;36850:22;36875:9;:18;36885:7;36875:18;;;;;;;;;;;;;;;;36850:43;;36930:6;36912:14;:24;;36904:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;37049:6;37032:14;:23;37011:9;:18;37021:7;37011:18;;;;;;;;;;;;;;;:44;;;;37093:6;37077:12;;:22;;;;;;;:::i;:::-;;;;;;;;37143:1;37117:37;;37126:7;37117:37;;;37147:6;37117:37;;;;;;:::i;:::-;;;;;;;;37167:48;37187:7;37204:1;37208:6;37167:19;:48::i;:::-;36697:526;36632:591;;:::o;31083:193::-;31162:4;31179:13;31195:12;:10;:12::i;:::-;31179:28;;31218;31228:5;31235:2;31239:6;31218:9;:28::i;:::-;31264:4;31257:11;;;31083:193;;;;:::o;46451:826::-;46597:4;46619:20;:7;:18;;;:20::i;:::-;46614:103;;46656:49;;;;;;;;;;:::i;:::-;;;;;;;;46614:103;46749:7;46733:43;;;46777:12;:10;:12::i;:::-;46791:6;46799:4;46733:71;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;46729:541;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46981:1;46964:6;:13;:18;46960:299;;;47003:59;;;;;;;;;;:::i;:::-;;;;;;;;46960:299;47217:6;47211:13;47202:6;47198:2;47194:15;47187:38;46729:541;46861:43;;;46851:53;;;:6;:53;;;;46844:60;;;46451:826;;;;;:::o;38332:453::-;38467:24;38494:25;38504:5;38511:7;38494:9;:25::i;:::-;38467:52;;38554:17;38534:16;:37;38530:248;;38616:6;38596:16;:26;;38588:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38700:51;38709:5;38716:7;38744:6;38725:16;:25;38700:8;:51::i;:::-;38530:248;38456:329;38332:453;;;:::o;34942:671::-;35089:1;35073:18;;:4;:18;;;;35065:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35166:1;35152:16;;:2;:16;;;;35144:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;35221:38;35242:4;35248:2;35252:6;35221:20;:38::i;:::-;35272:19;35294:9;:15;35304:4;35294:15;;;;;;;;;;;;;;;;35272:37;;35343:6;35328:11;:21;;35320:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;35460:6;35446:11;:20;35428:9;:15;35438:4;35428:15;;;;;;;;;;;;;;;:38;;;;35505:6;35488:9;:13;35498:2;35488:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;35544:2;35529:26;;35538:4;35529:26;;;35548:6;35529:26;;;;;;:::i;:::-;;;;;;;;35568:37;35588:4;35594:2;35598:6;35568:19;:37::i;:::-;35054:559;34942:671;;;:::o;16183:108::-;16250:8;:6;:8::i;:::-;16242:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;16183:108::o;5953:326::-;6013:4;6270:1;6248:7;:19;;;:23;6241:30;;5953:326;;;:::o;39385:125::-;;;;:::o;40114:124::-;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:126::-;2945:7;2985:42;2978:5;2974:54;2963:65;;2908:126;;;:::o;3040:96::-;3077:7;3106:24;3124:5;3106:24;:::i;:::-;3095:35;;3040:96;;;:::o;3142:122::-;3215:24;3233:5;3215:24;:::i;:::-;3208:5;3205:35;3195:63;;3254:1;3251;3244:12;3195:63;3142:122;:::o;3270:139::-;3316:5;3354:6;3341:20;3332:29;;3370:33;3397:5;3370:33;:::i;:::-;3270:139;;;;:::o;3415:77::-;3452:7;3481:5;3470:16;;3415:77;;;:::o;3498:122::-;3571:24;3589:5;3571:24;:::i;:::-;3564:5;3561:35;3551:63;;3610:1;3607;3600:12;3551:63;3498:122;:::o;3626:139::-;3672:5;3710:6;3697:20;3688:29;;3726:33;3753:5;3726:33;:::i;:::-;3626:139;;;;:::o;3771:474::-;3839:6;3847;3896:2;3884:9;3875:7;3871:23;3867:32;3864:119;;;3902:79;;:::i;:::-;3864:119;4022:1;4047:53;4092:7;4083:6;4072:9;4068:22;4047:53;:::i;:::-;4037:63;;3993:117;4149:2;4175:53;4220:7;4211:6;4200:9;4196:22;4175:53;:::i;:::-;4165:63;;4120:118;3771:474;;;;;:::o;4251:118::-;4338:24;4356:5;4338:24;:::i;:::-;4333:3;4326:37;4251:118;;:::o;4375:222::-;4468:4;4506:2;4495:9;4491:18;4483:26;;4519:71;4587:1;4576:9;4572:17;4563:6;4519:71;:::i;:::-;4375:222;;;;:::o;4603:619::-;4680:6;4688;4696;4745:2;4733:9;4724:7;4720:23;4716:32;4713:119;;;4751:79;;:::i;:::-;4713:119;4871:1;4896:53;4941:7;4932:6;4921:9;4917:22;4896:53;:::i;:::-;4886:63;;4842:117;4998:2;5024:53;5069:7;5060:6;5049:9;5045:22;5024:53;:::i;:::-;5014:63;;4969:118;5126:2;5152:53;5197:7;5188:6;5177:9;5173:22;5152:53;:::i;:::-;5142:63;;5097:118;4603:619;;;;;:::o;5228:86::-;5263:7;5303:4;5296:5;5292:16;5281:27;;5228:86;;;:::o;5320:112::-;5403:22;5419:5;5403:22;:::i;:::-;5398:3;5391:35;5320:112;;:::o;5438:214::-;5527:4;5565:2;5554:9;5550:18;5542:26;;5578:67;5642:1;5631:9;5627:17;5618:6;5578:67;:::i;:::-;5438:214;;;;:::o;5658:117::-;5767:1;5764;5757:12;5781:117;5890:1;5887;5880:12;5904:180;5952:77;5949:1;5942:88;6049:4;6046:1;6039:15;6073:4;6070:1;6063:15;6090:281;6173:27;6195:4;6173:27;:::i;:::-;6165:6;6161:40;6303:6;6291:10;6288:22;6267:18;6255:10;6252:34;6249:62;6246:88;;;6314:18;;:::i;:::-;6246:88;6354:10;6350:2;6343:22;6133:238;6090:281;;:::o;6377:129::-;6411:6;6438:20;;:::i;:::-;6428:30;;6467:33;6495:4;6487:6;6467:33;:::i;:::-;6377:129;;;:::o;6512:307::-;6573:4;6663:18;6655:6;6652:30;6649:56;;;6685:18;;:::i;:::-;6649:56;6723:29;6745:6;6723:29;:::i;:::-;6715:37;;6807:4;6801;6797:15;6789:23;;6512:307;;;:::o;6825:154::-;6909:6;6904:3;6899;6886:30;6971:1;6962:6;6957:3;6953:16;6946:27;6825:154;;;:::o;6985:410::-;7062:5;7087:65;7103:48;7144:6;7103:48;:::i;:::-;7087:65;:::i;:::-;7078:74;;7175:6;7168:5;7161:21;7213:4;7206:5;7202:16;7251:3;7242:6;7237:3;7233:16;7230:25;7227:112;;;7258:79;;:::i;:::-;7227:112;7348:41;7382:6;7377:3;7372;7348:41;:::i;:::-;7068:327;6985:410;;;;;:::o;7414:338::-;7469:5;7518:3;7511:4;7503:6;7499:17;7495:27;7485:122;;7526:79;;:::i;:::-;7485:122;7643:6;7630:20;7668:78;7742:3;7734:6;7727:4;7719:6;7715:17;7668:78;:::i;:::-;7659:87;;7475:277;7414:338;;;;:::o;7758:797::-;7844:6;7852;7860;7909:2;7897:9;7888:7;7884:23;7880:32;7877:119;;;7915:79;;:::i;:::-;7877:119;8035:1;8060:53;8105:7;8096:6;8085:9;8081:22;8060:53;:::i;:::-;8050:63;;8006:117;8162:2;8188:53;8233:7;8224:6;8213:9;8209:22;8188:53;:::i;:::-;8178:63;;8133:118;8318:2;8307:9;8303:18;8290:32;8349:18;8341:6;8338:30;8335:117;;;8371:79;;:::i;:::-;8335:117;8476:62;8530:7;8521:6;8510:9;8506:22;8476:62;:::i;:::-;8466:72;;8261:287;7758:797;;;;;:::o;8561:329::-;8620:6;8669:2;8657:9;8648:7;8644:23;8640:32;8637:119;;;8675:79;;:::i;:::-;8637:119;8795:1;8820:53;8865:7;8856:6;8845:9;8841:22;8820:53;:::i;:::-;8810:63;;8766:117;8561:329;;;;:::o;8896:118::-;8983:24;9001:5;8983:24;:::i;:::-;8978:3;8971:37;8896:118;;:::o;9020:222::-;9113:4;9151:2;9140:9;9136:18;9128:26;;9164:71;9232:1;9221:9;9217:17;9208:6;9164:71;:::i;:::-;9020:222;;;;:::o;9248:943::-;9343:6;9351;9359;9367;9416:3;9404:9;9395:7;9391:23;9387:33;9384:120;;;9423:79;;:::i;:::-;9384:120;9543:1;9568:53;9613:7;9604:6;9593:9;9589:22;9568:53;:::i;:::-;9558:63;;9514:117;9670:2;9696:53;9741:7;9732:6;9721:9;9717:22;9696:53;:::i;:::-;9686:63;;9641:118;9798:2;9824:53;9869:7;9860:6;9849:9;9845:22;9824:53;:::i;:::-;9814:63;;9769:118;9954:2;9943:9;9939:18;9926:32;9985:18;9977:6;9974:30;9971:117;;;10007:79;;:::i;:::-;9971:117;10112:62;10166:7;10157:6;10146:9;10142:22;10112:62;:::i;:::-;10102:72;;9897:287;9248:943;;;;;;;:::o;10197:474::-;10265:6;10273;10322:2;10310:9;10301:7;10297:23;10293:32;10290:119;;;10328:79;;:::i;:::-;10290:119;10448:1;10473:53;10518:7;10509:6;10498:9;10494:22;10473:53;:::i;:::-;10463:63;;10419:117;10575:2;10601:53;10646:7;10637:6;10626:9;10622:22;10601:53;:::i;:::-;10591:63;;10546:118;10197:474;;;;;:::o;10677:180::-;10725:77;10722:1;10715:88;10822:4;10819:1;10812:15;10846:4;10843:1;10836:15;10863:320;10907:6;10944:1;10938:4;10934:12;10924:22;;10991:1;10985:4;10981:12;11012:18;11002:81;;11068:4;11060:6;11056:17;11046:27;;11002:81;11130:2;11122:6;11119:14;11099:18;11096:38;11093:84;;;11149:18;;:::i;:::-;11093:84;10914:269;10863:320;;;:::o;11189:180::-;11237:77;11234:1;11227:88;11334:4;11331:1;11324:15;11358:4;11355:1;11348:15;11375:305;11415:3;11434:20;11452:1;11434:20;:::i;:::-;11429:25;;11468:20;11486:1;11468:20;:::i;:::-;11463:25;;11622:1;11554:66;11550:74;11547:1;11544:81;11541:107;;;11628:18;;:::i;:::-;11541:107;11672:1;11669;11665:9;11658:16;;11375:305;;;;:::o;11686:224::-;11826:34;11822:1;11814:6;11810:14;11803:58;11895:7;11890:2;11882:6;11878:15;11871:32;11686:224;:::o;11916:366::-;12058:3;12079:67;12143:2;12138:3;12079:67;:::i;:::-;12072:74;;12155:93;12244:3;12155:93;:::i;:::-;12273:2;12268:3;12264:12;12257:19;;11916:366;;;:::o;12288:419::-;12454:4;12492:2;12481:9;12477:18;12469:26;;12541:9;12535:4;12531:20;12527:1;12516:9;12512:17;12505:47;12569:131;12695:4;12569:131;:::i;:::-;12561:139;;12288:419;;;:::o;12713:175::-;12853:27;12849:1;12841:6;12837:14;12830:51;12713:175;:::o;12894:366::-;13036:3;13057:67;13121:2;13116:3;13057:67;:::i;:::-;13050:74;;13133:93;13222:3;13133:93;:::i;:::-;13251:2;13246:3;13242:12;13235:19;;12894:366;;;:::o;13266:419::-;13432:4;13470:2;13459:9;13455:18;13447:26;;13519:9;13513:4;13509:20;13505:1;13494:9;13490:17;13483:47;13547:131;13673:4;13547:131;:::i;:::-;13539:139;;13266:419;;;:::o;13691:224::-;13831:34;13827:1;13819:6;13815:14;13808:58;13900:7;13895:2;13887:6;13883:15;13876:32;13691:224;:::o;13921:366::-;14063:3;14084:67;14148:2;14143:3;14084:67;:::i;:::-;14077:74;;14160:93;14249:3;14160:93;:::i;:::-;14278:2;14273:3;14269:12;14262:19;;13921:366;;;:::o;14293:419::-;14459:4;14497:2;14486:9;14482:18;14474:26;;14546:9;14540:4;14536:20;14532:1;14521:9;14517:17;14510:47;14574:131;14700:4;14574:131;:::i;:::-;14566:139;;14293:419;;;:::o;14718:223::-;14858:34;14854:1;14846:6;14842:14;14835:58;14927:6;14922:2;14914:6;14910:15;14903:31;14718:223;:::o;14947:366::-;15089:3;15110:67;15174:2;15169:3;15110:67;:::i;:::-;15103:74;;15186:93;15275:3;15186:93;:::i;:::-;15304:2;15299:3;15295:12;15288:19;;14947:366;;;:::o;15319:419::-;15485:4;15523:2;15512:9;15508:18;15500:26;;15572:9;15566:4;15562:20;15558:1;15547:9;15543:17;15536:47;15600:131;15726:4;15600:131;:::i;:::-;15592:139;;15319:419;;;:::o;15744:225::-;15884:34;15880:1;15872:6;15868:14;15861:58;15953:8;15948:2;15940:6;15936:15;15929:33;15744:225;:::o;15975:366::-;16117:3;16138:67;16202:2;16197:3;16138:67;:::i;:::-;16131:74;;16214:93;16303:3;16214:93;:::i;:::-;16332:2;16327:3;16323:12;16316:19;;15975:366;;;:::o;16347:419::-;16513:4;16551:2;16540:9;16536:18;16528:26;;16600:9;16594:4;16590:20;16586:1;16575:9;16571:17;16564:47;16628:131;16754:4;16628:131;:::i;:::-;16620:139;;16347:419;;;:::o;16772:223::-;16912:34;16908:1;16900:6;16896:14;16889:58;16981:6;16976:2;16968:6;16964:15;16957:31;16772:223;:::o;17001:366::-;17143:3;17164:67;17228:2;17223:3;17164:67;:::i;:::-;17157:74;;17240:93;17329:3;17240:93;:::i;:::-;17358:2;17353:3;17349:12;17342:19;;17001:366;;;:::o;17373:419::-;17539:4;17577:2;17566:9;17562:18;17554:26;;17626:9;17620:4;17616:20;17612:1;17601:9;17597:17;17590:47;17654:131;17780:4;17654:131;:::i;:::-;17646:139;;17373:419;;;:::o;17798:221::-;17938:34;17934:1;17926:6;17922:14;17915:58;18007:4;18002:2;17994:6;17990:15;17983:29;17798:221;:::o;18025:366::-;18167:3;18188:67;18252:2;18247:3;18188:67;:::i;:::-;18181:74;;18264:93;18353:3;18264:93;:::i;:::-;18382:2;18377:3;18373:12;18366:19;;18025:366;;;:::o;18397:419::-;18563:4;18601:2;18590:9;18586:18;18578:26;;18650:9;18644:4;18640:20;18636:1;18625:9;18621:17;18614:47;18678:131;18804:4;18678:131;:::i;:::-;18670:139;;18397:419;;;:::o;18822:166::-;18962:18;18958:1;18950:6;18946:14;18939:42;18822:166;:::o;18994:366::-;19136:3;19157:67;19221:2;19216:3;19157:67;:::i;:::-;19150:74;;19233:93;19322:3;19233:93;:::i;:::-;19351:2;19346:3;19342:12;19335:19;;18994:366;;;:::o;19366:419::-;19532:4;19570:2;19559:9;19555:18;19547:26;;19619:9;19613:4;19609:20;19605:1;19594:9;19590:17;19583:47;19647:131;19773:4;19647:131;:::i;:::-;19639:139;;19366:419;;;:::o;19791:182::-;19931:34;19927:1;19919:6;19915:14;19908:58;19791:182;:::o;19979:366::-;20121:3;20142:67;20206:2;20201:3;20142:67;:::i;:::-;20135:74;;20218:93;20307:3;20218:93;:::i;:::-;20336:2;20331:3;20327:12;20320:19;;19979:366;;;:::o;20351:419::-;20517:4;20555:2;20544:9;20540:18;20532:26;;20604:9;20598:4;20594:20;20590:1;20579:9;20575:17;20568:47;20632:131;20758:4;20632:131;:::i;:::-;20624:139;;20351:419;;;:::o;20776:228::-;20916:34;20912:1;20904:6;20900:14;20893:58;20985:11;20980:2;20972:6;20968:15;20961:36;20776:228;:::o;21010:366::-;21152:3;21173:67;21237:2;21232:3;21173:67;:::i;:::-;21166:74;;21249:93;21338:3;21249:93;:::i;:::-;21367:2;21362:3;21358:12;21351:19;;21010:366;;;:::o;21382:419::-;21548:4;21586:2;21575:9;21571:18;21563:26;;21635:9;21629:4;21625:20;21621:1;21610:9;21606:17;21599:47;21663:131;21789:4;21663:131;:::i;:::-;21655:139;;21382:419;;;:::o;21807:98::-;21858:6;21892:5;21886:12;21876:22;;21807:98;;;:::o;21911:168::-;21994:11;22028:6;22023:3;22016:19;22068:4;22063:3;22059:14;22044:29;;21911:168;;;;:::o;22085:360::-;22171:3;22199:38;22231:5;22199:38;:::i;:::-;22253:70;22316:6;22311:3;22253:70;:::i;:::-;22246:77;;22332:52;22377:6;22372:3;22365:4;22358:5;22354:16;22332:52;:::i;:::-;22409:29;22431:6;22409:29;:::i;:::-;22404:3;22400:39;22393:46;;22175:270;22085:360;;;;:::o;22451:640::-;22646:4;22684:3;22673:9;22669:19;22661:27;;22698:71;22766:1;22755:9;22751:17;22742:6;22698:71;:::i;:::-;22779:72;22847:2;22836:9;22832:18;22823:6;22779:72;:::i;:::-;22861;22929:2;22918:9;22914:18;22905:6;22861:72;:::i;:::-;22980:9;22974:4;22970:20;22965:2;22954:9;22950:18;22943:48;23008:76;23079:4;23070:6;23008:76;:::i;:::-;23000:84;;22451:640;;;;;;;:::o;23097:141::-;23153:5;23184:6;23178:13;23169:22;;23200:32;23226:5;23200:32;:::i;:::-;23097:141;;;;:::o;23244:349::-;23313:6;23362:2;23350:9;23341:7;23337:23;23333:32;23330:119;;;23368:79;;:::i;:::-;23330:119;23488:1;23513:63;23568:7;23559:6;23548:9;23544:22;23513:63;:::i;:::-;23503:73;;23459:127;23244:349;;;;:::o;23599:239::-;23739:34;23735:1;23727:6;23723:14;23716:58;23808:22;23803:2;23795:6;23791:15;23784:47;23599:239;:::o;23844:366::-;23986:3;24007:67;24071:2;24066:3;24007:67;:::i;:::-;24000:74;;24083:93;24172:3;24083:93;:::i;:::-;24201:2;24196:3;24192:12;24185:19;;23844:366;;;:::o;24216:419::-;24382:4;24420:2;24409:9;24405:18;24397:26;;24469:9;24463:4;24459:20;24455:1;24444:9;24440:17;24433:47;24497:131;24623:4;24497:131;:::i;:::-;24489:139;;24216:419;;;:::o;24641:220::-;24781:34;24777:1;24769:6;24765:14;24758:58;24850:3;24845:2;24837:6;24833:15;24826:28;24641:220;:::o;24867:366::-;25009:3;25030:67;25094:2;25089:3;25030:67;:::i;:::-;25023:74;;25106:93;25195:3;25106:93;:::i;:::-;25224:2;25219:3;25215:12;25208:19;;24867:366;;;:::o;25239:419::-;25405:4;25443:2;25432:9;25428:18;25420:26;;25492:9;25486:4;25482:20;25478:1;25467:9;25463:17;25456:47;25520:131;25646:4;25520:131;:::i;:::-;25512:139;;25239:419;;;:::o;25664:221::-;25804:34;25800:1;25792:6;25788:14;25781:58;25873:4;25868:2;25860:6;25856:15;25849:29;25664:221;:::o;25891:366::-;26033:3;26054:67;26118:2;26113:3;26054:67;:::i;:::-;26047:74;;26130:93;26219:3;26130:93;:::i;:::-;26248:2;26243:3;26239:12;26232:19;;25891:366;;;:::o;26263:419::-;26429:4;26467:2;26456:9;26452:18;26444:26;;26516:9;26510:4;26506:20;26502:1;26491:9;26487:17;26480:47;26544:131;26670:4;26544:131;:::i;:::-;26536:139;;26263:419;;;:::o;26688:191::-;26728:4;26748:20;26766:1;26748:20;:::i;:::-;26743:25;;26782:20;26800:1;26782:20;:::i;:::-;26777:25;;26821:1;26818;26815:8;26812:34;;;26826:18;;:::i;:::-;26812:34;26871:1;26868;26864:9;26856:17;;26688:191;;;;:::o;26885:226::-;27025:34;27021:1;27013:6;27009:14;27002:58;27094:9;27089:2;27081:6;27077:15;27070:34;26885:226;:::o;27117:366::-;27259:3;27280:67;27344:2;27339:3;27280:67;:::i;:::-;27273:74;;27356:93;27445:3;27356:93;:::i;:::-;27474:2;27469:3;27465:12;27458:19;;27117:366;;;:::o;27489:419::-;27655:4;27693:2;27682:9;27678:18;27670:26;;27742:9;27736:4;27732:20;27728:1;27717:9;27713:17;27706:47;27770:131;27896:4;27770:131;:::i;:::-;27762:139;;27489:419;;;:::o;27914:529::-;28081:4;28119:2;28108:9;28104:18;28096:26;;28132:71;28200:1;28189:9;28185:17;28176:6;28132:71;:::i;:::-;28213:72;28281:2;28270:9;28266:18;28257:6;28213:72;:::i;:::-;28332:9;28326:4;28322:20;28317:2;28306:9;28302:18;28295:48;28360:76;28431:4;28422:6;28360:76;:::i;:::-;28352:84;;27914:529;;;;;;:::o;28449:236::-;28589:34;28585:1;28577:6;28573:14;28566:58;28658:19;28653:2;28645:6;28641:15;28634:44;28449:236;:::o;28691:366::-;28833:3;28854:67;28918:2;28913:3;28854:67;:::i;:::-;28847:74;;28930:93;29019:3;28930:93;:::i;:::-;29048:2;29043:3;29039:12;29032:19;;28691:366;;;:::o;29063:419::-;29229:4;29267:2;29256:9;29252:18;29244:26;;29316:9;29310:4;29306:20;29302:1;29291:9;29287:17;29280:47;29344:131;29470:4;29344:131;:::i;:::-;29336:139;;29063:419;;;:::o;29488:179::-;29628:31;29624:1;29616:6;29612:14;29605:55;29488:179;:::o;29673:366::-;29815:3;29836:67;29900:2;29895:3;29836:67;:::i;:::-;29829:74;;29912:93;30001:3;29912:93;:::i;:::-;30030:2;30025:3;30021:12;30014:19;;29673:366;;;:::o;30045:419::-;30211:4;30249:2;30238:9;30234:18;30226:26;;30298:9;30292:4;30288:20;30284:1;30273:9;30269:17;30262:47;30326:131;30452:4;30326:131;:::i;:::-;30318:139;;30045:419;;;:::o;30470:224::-;30610:34;30606:1;30598:6;30594:14;30587:58;30679:7;30674:2;30666:6;30662:15;30655:32;30470:224;:::o;30700:366::-;30842:3;30863:67;30927:2;30922:3;30863:67;:::i;:::-;30856:74;;30939:93;31028:3;30939:93;:::i;:::-;31057:2;31052:3;31048:12;31041:19;;30700:366;;;:::o;31072:419::-;31238:4;31276:2;31265:9;31261:18;31253:26;;31325:9;31319:4;31315:20;31311:1;31300:9;31296:17;31289:47;31353:131;31479:4;31353:131;:::i;:::-;31345:139;;31072:419;;;:::o;31497:222::-;31637:34;31633:1;31625:6;31621:14;31614:58;31706:5;31701:2;31693:6;31689:15;31682:30;31497:222;:::o;31725:366::-;31867:3;31888:67;31952:2;31947:3;31888:67;:::i;:::-;31881:74;;31964:93;32053:3;31964:93;:::i;:::-;32082:2;32077:3;32073:12;32066:19;;31725:366;;;:::o;32097:419::-;32263:4;32301:2;32290:9;32286:18;32278:26;;32350:9;32344:4;32340:20;32336:1;32325:9;32321:17;32314:47;32378:131;32504:4;32378:131;:::i;:::-;32370:139;;32097:419;;;:::o;32522:225::-;32662:34;32658:1;32650:6;32646:14;32639:58;32731:8;32726:2;32718:6;32714:15;32707:33;32522:225;:::o;32753:366::-;32895:3;32916:67;32980:2;32975:3;32916:67;:::i;:::-;32909:74;;32992:93;33081:3;32992:93;:::i;:::-;33110:2;33105:3;33101:12;33094:19;;32753:366;;;:::o;33125:419::-;33291:4;33329:2;33318:9;33314:18;33306:26;;33378:9;33372:4;33368:20;33364:1;33353:9;33349:17;33342:47;33406:131;33532:4;33406:131;:::i;:::-;33398:139;;33125:419;;;:::o;33550:170::-;33690:22;33686:1;33678:6;33674:14;33667:46;33550:170;:::o;33726:366::-;33868:3;33889:67;33953:2;33948:3;33889:67;:::i;:::-;33882:74;;33965:93;34054:3;33965:93;:::i;:::-;34083:2;34078:3;34074:12;34067:19;;33726:366;;;:::o;34098:419::-;34264:4;34302:2;34291:9;34287:18;34279:26;;34351:9;34345:4;34341:20;34337:1;34326:9;34322:17;34315:47;34379:131;34505:4;34379:131;:::i;:::-;34371:139;;34098:419;;;:::o

Swarm Source

ipfs://5a8b8b5626f11fdb307c34ed9dae6df639f0bf57438a4a932fba4efd91b86353
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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