ETH Price: $3,341.77 (+0.07%)
 

Overview

Max Total Supply

199 DMD

Holders

41

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
horith.eth
Balance
2 DMD
0xbe4e0072267cbd32d47a028acced5ef1098ee145
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:
DMDDEFI

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-01
*/

// File: dmd.sol


/**
 *Submitted for verification at Etherscan.io on 2022-06-27
*/

// File: DEGENERATIVES.sol



/**
             ___)    (___
                      __/     __     \__
                     /     \_/  \_/     \
                    /      / \__/ \      \
                   |          /\          |
                  /       ---(  )---       \
                 |            \/            |
                 | ........................ |
                / ._________/    \_________. \
               | ./ _________    _________ \. |
               |./ //#/\###())~~(()###/\#\\ \.|
               |/ //#([])##// ~~ \\##([])#\\ \|
               | //###\/##//  ~~  \\##\/###\\ |
               | \\######//   ~~   \\######// |
                \             /\             /                  .^. .^.
                 )      __   !II!   __      (                   |~| |~|
                /' .___//    !II!    \\___. '\                  |~| |~|
               (  ' .__/     [II]     \__. '  )         __      |~| |~|
                \  '          YY          '  /          \)\_    |~| |~|
                 \  '  |   ________   |  '  /            \~~\   |~~V~~|
                  \  ' | _/'      '\_ | '  /              \~~\_ |~~|~~~\
                   \  '|/____________\|'  /                \~~~\~~~~~~~~)
                    \   V___======___V   /                  \~~~\~~~~~~/
                     \  V   \____/   V  /                    \~~~|~~~~~\
                      \ V   ~~  ~~   V /                      )~~|~~~~~~)
                       \V  ~~\~~/~~  V/                       \~~~~~~~~/
                       _V ~~~~\/~~~~ V_                        \~~~~~~|
                   ___/ V\____/\____/V \_____                   \~~~~~|
                __/ :   V    :  :    V   :  :\___                |====|
              _/' .' .' V  .' .' .'  V .' .' .' .\_              |.' .|
             /:  :  :  :  :  :  :  :  :  :  :  :  :\             |  : |
            /. `. `. `. `. `. `. `. `. `. `. `. `. `\            |`. `|
           /  :  :  :  :  :  :  :  :  :  :  :  :  :  \           |  : |
          / .' .' .' .' .' \\  '  // ' .' .' .' .' .' \          |.' .|
         / :  :  :  :  :    ))   ((   :  :  :  :  :  : \         |  : |
        |`. `. `. `. `. `. ((  .  )) . `. `. `. `. `. `.\        |`. `|
        |  :  :  :  :  :    ))   ((   :  :  :  :  :  :  :\       |  : |
       / .' .'  ' .' .' .' ((  '  )) ' .' .' .'  ' .' .' .|      /.' .|
      | :  : //  :  :  :    ))   ((   :  :  :   \\:  :  : |     |:  : |
      |. `. || `. `. `. `. ((  .  )) . `. `. `.  ||`. `. `.\    | `. `\
     /  :  :||   :  :  :    ))   ((   :  :  :  : ||  :  :  :|   |:  :  |
    | .' .' || .' .' .' .' ((  '  )) ' .' .' .'  ||.' .' .' |   | .' .'|
    |:  :  :||   :  :  :    ))   ((   :  :  :  : ||  :  :  : \  |:  :  |
   /. `. `. || `. `. `. `. ((  .  )) . `. `. `.  ||\. `. `. `.\ | `. `.|
  |  :  :  : \\  :  :  :  :  :  : _   :  :  :   //  \:  :  :  :\|:  :  |
  |.' .' .' .'\\  .' .' .' . _ ' ._\ ' .' .' . //|   \.' .' .' .| .' .'|
./:  :  :  :  :\\   :  :  : /_  :  \\ :  :   _// |    \ :  :  : |:  :  |
|. `. `. `. __ `\\_  `. `. // `. `. \\______/_/ `|     | `. `. `| `. `.|
| :/ :  :  /  |  \_\______// :  :  : \______/  : |     |:  :  : |:  :  |
.'|.' .' ./   |.' .\______/.' .' .' .' .' .' .' .|      \.' .' .' .' .'|
  |  :  :|    \  :  :  :  :  :  :  :  :  :  :  :/        \ : o   :  :  |
`/ `. `. |     |. `. `. `. `. `. `. `. `. `. `.|          | o  `. `. `.|
| :  :  /      | :  :  :  :  :  :  :  :  :  :  |          | o :  :  :  |
|' .' .|       |' .' .' .' .' .' .' .' .' .' .'|           \ o .' .' .'|
  :  : |       | :  :  :  :  :  :  :  :  :  :  :\           \ o  :  :  |
`. `. /       /`. `. `. I  `. `. `. `. ` I . `. `\           \ oo `  o.|
  :  |       /:  :  :  : I   :  :  :  :  I  :  :  \           \_ oooo  |
.' .'|      /' .' .' .'  I .' .' .' .' . I ' .' .' \            \_____/
  : /      /  :  :  :  : I   :  :  :  : I   :  :  : \
`. |      | `. `. `. `.  I `. `. `. `.  I `. `. `. `.\
  :|      |:  :  :  :  : I   :  H H   : I   :  :  :  :\
.' |     /' .' .' .' .' . I ' . H H .'  I .' .' .' .' .\
  :|    |  :  :  :  :  :   I :  H H    I :  :  :  :  :  \
`. |    |`. `. `. `. `. `. I  ` L L `. I  `. `. `. `. `. \
  :|    |  :  :  :  :  :  : I    H H  I  :  :  :_ :  :  : \
.' |    |.' .' .' .' .' .' . I ' H H I .' .' .' .\ .' .' .'\
  :|    |  :  :___  :  :  :   I  H HI :  :  :  :  \  :  :  :\
`. |    |`. `.|   |. `. `. `.  I H H . `. ` _`. `.|\. `. `. `|
  :|    /  :  |   | :  :  :  :  IH H  :  : | _ :  | \:  :  : |
.' |   | .' .'|   |' .' _  .' .' H H ' .'  ||   .'|  \.' .' .|
  :|   |:  :  |   | :  _ |   :   H H  :   //   :  |   | :  : |
`. /   | `. `./   |. `. || `. `. H H . ` //  `. `.|   |. `. `|
  |    |:  : |    | :  : \\  :   H H  :_//  :  :  |   | :  : |
.'|    / .' .|    /' .' . \\  .' H H ' _/ .' .' .'\   |' .' .|
  |   | :  : |   |  :  :   \\    H H  :  :  :  :  :|  | :  : |
`.|   |. `. `|   |`. `. `.  \\_. H H . `. `. `. `. |  |. `. `|
  |   | :  :/   |:  :  :  :  \_  H H  :  :  :  :  :|  | :  : |
.'|   |' .' |  |' .' .' .' .' .' H H ' .' .' .' .' |  |' .' .|
  |   | :  :|  | :  :  :  :  :   H H  :  :  :  :  :|  | :  : |
`.|  /`. `. |  |. `. `. `. `. `. `. `. `. `. `. `. |   \ `. `|
  / |:  :  :/  / :  : __  :  :  :  :  :  :  :__   :\    |  :  \
.|  | .' .'|  |.' .' |XX\' .' .' .' .' .' .'/XX|.' .\   |.' .'|
.|  /:  :  |  |  :  :  \X\:  :  :  :  :  : /X/ :  :  |  |  :  |
`| |. `. `.|  |`. `. `. \X\_. `. `. `. `._/X/`. `. `.|  |`. `.|
.| | :  :  |  |  :  :  : \XX\_  :  :  :_/XX/:  :  :  |  |  :  |
.| |' .' ./   /.' .' .' .' \XX\' .' .'/XX/.' .' .' .'|  |.' .'|
.| | :  :|   |:  :  :  :  :  \X\_____/X/ :  :  :  :  |  |  :  |
`| |. `. |   | `. `. `. `. `. |XXXXXXX|`. `. `. `. `.|  \`. `.|
.| | :  :|   |:  :  :  :  :  :|XX| |XX|  :  :  :  :  |   | :  |
.| |' .' |   | .' .' .' .' .'  \ |V| / .' .' .' .' .'|   |' .'|
.| / :  :|   |:  :  :  :  :  : /\/ \/\:  :  :  :  :  |   | :  |
=||`. `./    | `. `. `. `. `. |       |`. `. `. `. `.|   |. `.|
~\|  : |     |:  :  :  :  :  :|       |  :  :  :  :  |   | :  |
~~|.' .|      \.' .' .' .' .' |       |.' .' .' .' .'|    \ .' \
~~|  : |       | :  :  :  :  :|       |  :  :  :  :  |     \  : \
~~|`. `|       |. `. `. `. `. |       |`. `. `. `. `.|      \. `.|
_~|  : |        \:  :  :  :  :|       |  :  :  :  : /        |:  |
.||.' .|         |.' .' .' .' |       |.' .' .' .' |         |===|
.||  : \         |  :  :  :  :|       |  :  :  :  :|         /~~~\
  V\. `.|        |`. `. `. `. |       |`. `. `. `. |        |~~~~~\
    |===|        |  :  :  :  :|       |  :  :  :  :|        \~~~~~~)
    /~~~\        |.' .' .' .' |       |.' .' .' .' |         )~~~~/
   /~~~~~|        \ :  :  :  :|       |  :  :  :  /         /~_~~~\
  (~~~~~~/         | `. `. `. |       |`. `. `. `|         |~| |~~~)
   \~~~~(          |:  :  :  :|       |  :  :  : |         |~| |~~/
   /~~~_~\         | .' .' .' |       |.' .' .' .|          V  |~|
  (~~~| |~|        |:  :  :  :|       |  :  :  : |             |~|
   \~~| |~|        | #. `. `. `\     / `. `. `.#`|             |~|
    |~|  V        / : #:  : #:  )   ( : #:  : #:  \            |~|
    |~|           )' .# .' #' .(     ) .'#.' .# .'(             V
    |~|           \ : ###### :  )   ( :  ######:  /
    |~|           /. `# `. #. `(     ) `.#`. `# `.\
     V            ) : #:  :# :  )   ( :  #  : #:  (
                  \' .# .' .# ./     \ .# .' .# .'/
                   |:# :  :  :|       |  :  :  # |
                   | `. `. `. |       |`. `. `. `|
                   |:  :  :  :|       |  :  :  : |
                   | .' .' .' \       /.' .' .' .|
                   |:  :  :  : |     |:  :  :  : |
                  /. `/   |`. `|     | `. |   \ `.\
                 |  :/     \ : |     |:  /     \  :|
                 |.'[  ( )  ] .|     | .[  ( )  ]' |
                 |  [       ]: |     |: [       ] :|
                 |`. \     /. `|     | `.\     /`. |
                  \ : \   |  : |     |:  :|   /:  /
                   \ .' .' .' /       \.' .' .' ./
                    |  :  :  |         | :  :  :|
                    |`. `. `.|         |. `. `. |
                    |  :  :  |         | :  :  :|
                     \' .' .'|         |' .' .'/
                      \:  :  |         | :  : /
                       |`. `.|         |. `. |
                       |  :  |         | :  :|
                       |.' .'|         |' .' |
                       |  :  |         | :  :|
                       |`. `.|         |. `. |
                      /:  :  |         | :  : \
                     |' .' .'|         |' .' .'|
                     | :  :  |         | :  :  |
                     |. `. `.|         |. `. `.|
                     | :  :  |         | :  :  |
                     |' .' .'|         |' .' .'|
                    /  :  :  |         | :  :  :\
                   / `. `. `./         \. `. `. `\
                  / :  :  : |           |:  :  :  \
                 /.' .' _/ .|           | .\_.' .' \D
                /:  : _/  :/             \  :\_:  : \M
               /. `._/ |`./               \. | \_. `.\D
              /  :_/  /: /                 \: \  \_  :\
             / ._/   /' /                   \ '\   \_ .\
            /__/    |  /                     \  |    \__\

*/




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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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


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

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// 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/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        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/utils/Address.sol


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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        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/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;








error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 1;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _ownershipOf(tokenId).addr;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : '';
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSender()) revert ApproveToCaller();

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement 
     *   {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex != end);

            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, from);

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, from);

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}
// File: contracts/GossamerGods.sol



pragma solidity ^0.8.0;





contract DMDDEFI is ERC721A, Ownable, ReentrancyGuard {
  using Address for address;
  using Strings for uint;


  string  public  baseTokenURI = "ipfs://QmVUWNzeWUdCWVLZRL98TBjmcKXngej628HAti42xt3cdM//";
  uint256  public  maxSupply = 1000;
  uint256 public  MAX_MINTS_PER_TX = 5;
  uint256 public  PUBLIC_SALE_PRICE = 0.004 ether;
  uint256 public  NUM_FREE_MINTS = 600;
  uint256 public  MAX_FREE_PER_WALLET = 2;
  uint256 public freeNFTAlreadyMinted = 0;
  bool public isPublicSaleActive = true;

  constructor() ERC721A("Dark Matter DeFi Boxed Generals", "DMD") {
  }


  function mint(uint256 numberOfTokens)
      external
      payable
  {
    require(isPublicSaleActive, "Sale is not open");
    require(totalSupply() + numberOfTokens < maxSupply + 1, "No more left");

    if(freeNFTAlreadyMinted + numberOfTokens > NUM_FREE_MINTS){
        require(
            (PUBLIC_SALE_PRICE * numberOfTokens) <= msg.value,
            "Incorrect ETH value sent"
        );
    } else {
        if (balanceOf(msg.sender) + numberOfTokens > MAX_FREE_PER_WALLET) {
        require(
            (PUBLIC_SALE_PRICE * numberOfTokens) <= msg.value,
            "Incorrect ETH value sent"
        );
        require(
            numberOfTokens <= MAX_MINTS_PER_TX,
            "Max mints per transaction exceeded"
        );
        } else {
            require(
                numberOfTokens <= MAX_FREE_PER_WALLET,
                "Max mints per transaction exceeded"
            );
            freeNFTAlreadyMinted += numberOfTokens;
        }
    }
    _safeMint(msg.sender, numberOfTokens);
  }

  function setBaseURI(string memory baseURI)
    public
    onlyOwner
  {
    baseTokenURI = baseURI;
  }

  function treasuryMint(uint quantity)
    public
    onlyOwner
  {
    require(
      quantity > 0,
      "Invalid mint amount"
    );
    require(
      totalSupply() + quantity <= maxSupply,
      "Maximum supply exceeded"
    );
    _safeMint(msg.sender, quantity);
  }

  function withdraw()
    public
    onlyOwner
    nonReentrant
  {
    Address.sendValue(payable(msg.sender), address(this).balance);
  }

  function tokenURI(uint _tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(_tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );
    return string(abi.encodePacked(baseTokenURI, "/", _tokenId.toString(), ".json"));
  }

  function _baseURI()
    internal
    view
    virtual
    override
    returns (string memory)
  {
    return baseTokenURI;
  }

  function setIsPublicSaleActive(bool _isPublicSaleActive)
      external
      onlyOwner
  {
      isPublicSaleActive = _isPublicSaleActive;
  }

  function setNumFreeMints(uint256 _numfreemints)
      external
      onlyOwner
  {
      NUM_FREE_MINTS = _numfreemints;
  }

  function setSalePrice(uint256 _price)
      external
      onlyOwner
  {
      PUBLIC_SALE_PRICE = _price;
  }

  function setMaxLimitPerTransaction(uint256 _limit)
      external
      onlyOwner
  {
      MAX_MINTS_PER_TX = _limit;
  }

  function setFreeLimitPerWallet(uint256 _limit)
      external
      onlyOwner
  {
      MAX_FREE_PER_WALLET = _limit;
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_FREE_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINTS_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NUM_FREE_MINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_SALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeNFTAlreadyMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setFreeLimitPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isPublicSaleActive","type":"bool"}],"name":"setIsPublicSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setMaxLimitPerTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numfreemints","type":"uint256"}],"name":"setNumFreeMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setSalePrice","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":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","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":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"treasuryMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052604051806060016040528060378152602001620044f860379139600a90816200002e9190620004a5565b506103e8600b556005600c55660e35fa931a0000600d55610258600e556002600f5560006010556001601160006101000a81548160ff0219169083151502179055503480156200007d57600080fd5b506040518060400160405280601f81526020017f4461726b204d6174746572204465466920426f7865642047656e6572616c73008152506040518060400160405280600381526020017f444d4400000000000000000000000000000000000000000000000000000000008152508160029081620000fb9190620004a5565b5080600390816200010d9190620004a5565b506200011e6200015460201b60201c565b6000819055505050620001466200013a6200015d60201b60201c565b6200016560201b60201c565b60016009819055506200058c565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002ad57607f821691505b602082108103620002c357620002c262000265565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200032d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002ee565b620003398683620002ee565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000386620003806200037a8462000351565b6200035b565b62000351565b9050919050565b6000819050919050565b620003a28362000365565b620003ba620003b1826200038d565b848454620002fb565b825550505050565b600090565b620003d1620003c2565b620003de81848462000397565b505050565b5b818110156200040657620003fa600082620003c7565b600181019050620003e4565b5050565b601f82111562000455576200041f81620002c9565b6200042a84620002de565b810160208510156200043a578190505b620004526200044985620002de565b830182620003e3565b50505b505050565b600082821c905092915050565b60006200047a600019846008026200045a565b1980831691505092915050565b600062000495838362000467565b9150826002028217905092915050565b620004b0826200022b565b67ffffffffffffffff811115620004cc57620004cb62000236565b5b620004d8825462000294565b620004e58282856200040a565b600060209050601f8311600181146200051d576000841562000508578287015190505b62000514858262000487565b86555062000584565b601f1984166200052d86620002c9565b60005b82811015620005575784890151825560018201915060208501945060208101905062000530565b8683101562000577578489015162000573601f89168262000467565b8355505b6001600288020188555050505b505050505050565b613f5c806200059c6000396000f3fe6080604052600436106101f95760003560e01c806370a082311161010d578063a22cb465116100a0578063d547cfb71161006f578063d547cfb7146106ea578063d5abeb0114610715578063e985e9c514610740578063efdc77881461077d578063f2fde38b146107a6576101f9565b8063a22cb46514610630578063b88d4fde14610659578063c6a91b4214610682578063c87b56dd146106ad576101f9565b8063982d669e116100dc578063982d669e1461059557806398710d1e146105c05780639e9fcffc146105eb578063a0712d6814610614576101f9565b806370a08231146104eb578063715018a6146105285780638da5cb5b1461053f57806395d89b411461056a576101f9565b8063193ad7b41161019057806328cad13d1161015f57806328cad13d1461041c5780633ccfd60b1461044557806342842e0e1461045c57806355f804b3146104855780636352211e146104ae576101f9565b8063193ad7b4146103745780631e84c4131461039f578063202f298a146103ca57806323b872dd146103f3576101f9565b8063095ea7b3116101cc578063095ea7b3146102ce5780630a00ae83146102f757806318160ddd146103205780631919fed71461034b576101f9565b806301ffc9a7146101fe57806306fdde031461023b57806307e89ec014610266578063081812fc14610291575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190612b5d565b6107cf565b6040516102329190612ba5565b60405180910390f35b34801561024757600080fd5b506102506108b1565b60405161025d9190612c59565b60405180910390f35b34801561027257600080fd5b5061027b610943565b6040516102889190612c94565b60405180910390f35b34801561029d57600080fd5b506102b860048036038101906102b39190612cdb565b610949565b6040516102c59190612d49565b60405180910390f35b3480156102da57600080fd5b506102f560048036038101906102f09190612d90565b6109c5565b005b34801561030357600080fd5b5061031e60048036038101906103199190612cdb565b610acf565b005b34801561032c57600080fd5b50610335610b55565b6040516103429190612c94565b60405180910390f35b34801561035757600080fd5b50610372600480360381019061036d9190612cdb565b610b6c565b005b34801561038057600080fd5b50610389610bf2565b6040516103969190612c94565b60405180910390f35b3480156103ab57600080fd5b506103b4610bf8565b6040516103c19190612ba5565b60405180910390f35b3480156103d657600080fd5b506103f160048036038101906103ec9190612cdb565b610c0b565b005b3480156103ff57600080fd5b5061041a60048036038101906104159190612dd0565b610c91565b005b34801561042857600080fd5b50610443600480360381019061043e9190612e4f565b610ca1565b005b34801561045157600080fd5b5061045a610d3a565b005b34801561046857600080fd5b50610483600480360381019061047e9190612dd0565b610e17565b005b34801561049157600080fd5b506104ac60048036038101906104a79190612fb1565b610e37565b005b3480156104ba57600080fd5b506104d560048036038101906104d09190612cdb565b610ec6565b6040516104e29190612d49565b60405180910390f35b3480156104f757600080fd5b50610512600480360381019061050d9190612ffa565b610edc565b60405161051f9190612c94565b60405180910390f35b34801561053457600080fd5b5061053d610fab565b005b34801561054b57600080fd5b50610554611033565b6040516105619190612d49565b60405180910390f35b34801561057657600080fd5b5061057f61105d565b60405161058c9190612c59565b60405180910390f35b3480156105a157600080fd5b506105aa6110ef565b6040516105b79190612c94565b60405180910390f35b3480156105cc57600080fd5b506105d56110f5565b6040516105e29190612c94565b60405180910390f35b3480156105f757600080fd5b50610612600480360381019061060d9190612cdb565b6110fb565b005b61062e60048036038101906106299190612cdb565b611181565b005b34801561063c57600080fd5b5061065760048036038101906106529190613027565b6113c2565b005b34801561066557600080fd5b50610680600480360381019061067b9190613108565b611539565b005b34801561068e57600080fd5b506106976115b5565b6040516106a49190612c94565b60405180910390f35b3480156106b957600080fd5b506106d460048036038101906106cf9190612cdb565b6115bb565b6040516106e19190612c59565b60405180910390f35b3480156106f657600080fd5b506106ff611637565b60405161070c9190612c59565b60405180910390f35b34801561072157600080fd5b5061072a6116c5565b6040516107379190612c94565b60405180910390f35b34801561074c57600080fd5b506107676004803603810190610762919061318b565b6116cb565b6040516107749190612ba5565b60405180910390f35b34801561078957600080fd5b506107a4600480360381019061079f9190612cdb565b61175f565b005b3480156107b257600080fd5b506107cd60048036038101906107c89190612ffa565b611882565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061089a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108aa57506108a982611979565b5b9050919050565b6060600280546108c0906131fa565b80601f01602080910402602001604051908101604052809291908181526020018280546108ec906131fa565b80156109395780601f1061090e57610100808354040283529160200191610939565b820191906000526020600020905b81548152906001019060200180831161091c57829003601f168201915b5050505050905090565b600d5481565b6000610954826119e3565b61098a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109d082610ec6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a37576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a56611a31565b73ffffffffffffffffffffffffffffffffffffffff1614158015610a885750610a8681610a81611a31565b6116cb565b155b15610abf576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610aca838383611a39565b505050565b610ad7611a31565b73ffffffffffffffffffffffffffffffffffffffff16610af5611033565b73ffffffffffffffffffffffffffffffffffffffff1614610b4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4290613277565b60405180910390fd5b80600e8190555050565b6000610b5f611aeb565b6001546000540303905090565b610b74611a31565b73ffffffffffffffffffffffffffffffffffffffff16610b92611033565b73ffffffffffffffffffffffffffffffffffffffff1614610be8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdf90613277565b60405180910390fd5b80600d8190555050565b60105481565b601160009054906101000a900460ff1681565b610c13611a31565b73ffffffffffffffffffffffffffffffffffffffff16610c31611033565b73ffffffffffffffffffffffffffffffffffffffff1614610c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7e90613277565b60405180910390fd5b80600f8190555050565b610c9c838383611af4565b505050565b610ca9611a31565b73ffffffffffffffffffffffffffffffffffffffff16610cc7611033565b73ffffffffffffffffffffffffffffffffffffffff1614610d1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1490613277565b60405180910390fd5b80601160006101000a81548160ff02191690831515021790555050565b610d42611a31565b73ffffffffffffffffffffffffffffffffffffffff16610d60611033565b73ffffffffffffffffffffffffffffffffffffffff1614610db6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dad90613277565b60405180910390fd5b600260095403610dfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df2906132e3565b60405180910390fd5b6002600981905550610e0d3347611fa8565b6001600981905550565b610e3283838360405180602001604052806000815250611539565b505050565b610e3f611a31565b73ffffffffffffffffffffffffffffffffffffffff16610e5d611033565b73ffffffffffffffffffffffffffffffffffffffff1614610eb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eaa90613277565b60405180910390fd5b80600a9081610ec291906134af565b5050565b6000610ed18261209c565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f43576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610fb3611a31565b73ffffffffffffffffffffffffffffffffffffffff16610fd1611033565b73ffffffffffffffffffffffffffffffffffffffff1614611027576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101e90613277565b60405180910390fd5b611031600061232b565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461106c906131fa565b80601f0160208091040260200160405190810160405280929190818152602001828054611098906131fa565b80156110e55780601f106110ba576101008083540402835291602001916110e5565b820191906000526020600020905b8154815290600101906020018083116110c857829003601f168201915b5050505050905090565b600e5481565b600f5481565b611103611a31565b73ffffffffffffffffffffffffffffffffffffffff16611121611033565b73ffffffffffffffffffffffffffffffffffffffff1614611177576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116e90613277565b60405180910390fd5b80600c8190555050565b601160009054906101000a900460ff166111d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c7906135cd565b60405180910390fd5b6001600b546111df919061361c565b816111e8610b55565b6111f2919061361c565b10611232576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611229906136be565b60405180910390fd5b600e5481601054611243919061361c565b111561129e573481600d5461125891906136de565b1115611299576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129090613784565b60405180910390fd5b6113b5565b600f54816112ab33610edc565b6112b5919061361c565b1115611355573481600d546112ca91906136de565b111561130b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130290613784565b60405180910390fd5b600c54811115611350576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134790613816565b60405180910390fd5b6113b4565b600f5481111561139a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139190613816565b60405180910390fd5b80601060008282546113ac919061361c565b925050819055505b5b6113bf33826123f1565b50565b6113ca611a31565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361142e576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061143b611a31565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114e8611a31565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161152d9190612ba5565b60405180910390a35050565b611544848484611af4565b6115638373ffffffffffffffffffffffffffffffffffffffff1661240f565b8015611578575061157684848484612432565b155b156115af576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600c5481565b60606115c6826119e3565b611605576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fc906138a8565b60405180910390fd5b600a61161083612582565b604051602001611621929190613a1f565b6040516020818303038152906040529050919050565b600a8054611644906131fa565b80601f0160208091040260200160405190810160405280929190818152602001828054611670906131fa565b80156116bd5780601f10611692576101008083540402835291602001916116bd565b820191906000526020600020905b8154815290600101906020018083116116a057829003601f168201915b505050505081565b600b5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611767611a31565b73ffffffffffffffffffffffffffffffffffffffff16611785611033565b73ffffffffffffffffffffffffffffffffffffffff16146117db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d290613277565b60405180910390fd5b6000811161181e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181590613aa5565b60405180910390fd5b600b548161182a610b55565b611834919061361c565b1115611875576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186c90613b11565b60405180910390fd5b61187f33826123f1565b50565b61188a611a31565b73ffffffffffffffffffffffffffffffffffffffff166118a8611033565b73ffffffffffffffffffffffffffffffffffffffff16146118fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f590613277565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361196d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196490613ba3565b60405180910390fd5b6119768161232b565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816119ee611aeb565b111580156119fd575060005482105b8015611a2a575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000611aff8261209c565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611b6a576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611b8b611a31565b73ffffffffffffffffffffffffffffffffffffffff161480611bba5750611bb985611bb4611a31565b6116cb565b5b80611bff5750611bc8611a31565b73ffffffffffffffffffffffffffffffffffffffff16611be784610949565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611c38576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611c9e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cab85858560016126e2565b611cb760008487611a39565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611f36576000548214611f3557878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611fa185858560016126e8565b5050505050565b80471015611feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe290613c0f565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161201190613c60565b60006040518083038185875af1925050503d806000811461204e576040519150601f19603f3d011682016040523d82523d6000602084013e612053565b606091505b5050905080612097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208e90613ce7565b60405180910390fd5b505050565b6120a4612aae565b6000829050806120b2611aeb565b111580156120c1575060005481105b156122f4576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516122f257600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146121d6578092505050612326565b5b6001156122f157818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146122ec578092505050612326565b6121d7565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61240b8282604051806020016040528060008152506126ee565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612458611a31565b8786866040518563ffffffff1660e01b815260040161247a9493929190613d5c565b6020604051808303816000875af19250505080156124b657506040513d601f19601f820116820180604052508101906124b39190613dbd565b60015b61252f573d80600081146124e6576040519150601f19603f3d011682016040523d82523d6000602084013e6124eb565b606091505b506000815103612527576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600082036125c9576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506126dd565b600082905060005b600082146125fb5780806125e490613dea565b915050600a826125f49190613e61565b91506125d1565b60008167ffffffffffffffff81111561261757612616612e86565b5b6040519080825280601f01601f1916602001820160405280156126495781602001600182028036833780820191505090505b5090505b600085146126d6576001826126629190613e92565b9150600a856126719190613ec6565b603061267d919061361c565b60f81b81838151811061269357612692613ef7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126cf9190613e61565b945061264d565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361275a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008303612794576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127a160008583866126e2565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600084820190506129628673ffffffffffffffffffffffffffffffffffffffff1661240f565b15612a27575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129d76000878480600101955087612432565b612a0d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808203612968578260005414612a2257600080fd5b612a92565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203612a28575b816000819055505050612aa860008583866126e8565b50505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612b3a81612b05565b8114612b4557600080fd5b50565b600081359050612b5781612b31565b92915050565b600060208284031215612b7357612b72612afb565b5b6000612b8184828501612b48565b91505092915050565b60008115159050919050565b612b9f81612b8a565b82525050565b6000602082019050612bba6000830184612b96565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612bfa578082015181840152602081019050612bdf565b83811115612c09576000848401525b50505050565b6000601f19601f8301169050919050565b6000612c2b82612bc0565b612c358185612bcb565b9350612c45818560208601612bdc565b612c4e81612c0f565b840191505092915050565b60006020820190508181036000830152612c738184612c20565b905092915050565b6000819050919050565b612c8e81612c7b565b82525050565b6000602082019050612ca96000830184612c85565b92915050565b612cb881612c7b565b8114612cc357600080fd5b50565b600081359050612cd581612caf565b92915050565b600060208284031215612cf157612cf0612afb565b5b6000612cff84828501612cc6565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612d3382612d08565b9050919050565b612d4381612d28565b82525050565b6000602082019050612d5e6000830184612d3a565b92915050565b612d6d81612d28565b8114612d7857600080fd5b50565b600081359050612d8a81612d64565b92915050565b60008060408385031215612da757612da6612afb565b5b6000612db585828601612d7b565b9250506020612dc685828601612cc6565b9150509250929050565b600080600060608486031215612de957612de8612afb565b5b6000612df786828701612d7b565b9350506020612e0886828701612d7b565b9250506040612e1986828701612cc6565b9150509250925092565b612e2c81612b8a565b8114612e3757600080fd5b50565b600081359050612e4981612e23565b92915050565b600060208284031215612e6557612e64612afb565b5b6000612e7384828501612e3a565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612ebe82612c0f565b810181811067ffffffffffffffff82111715612edd57612edc612e86565b5b80604052505050565b6000612ef0612af1565b9050612efc8282612eb5565b919050565b600067ffffffffffffffff821115612f1c57612f1b612e86565b5b612f2582612c0f565b9050602081019050919050565b82818337600083830152505050565b6000612f54612f4f84612f01565b612ee6565b905082815260208101848484011115612f7057612f6f612e81565b5b612f7b848285612f32565b509392505050565b600082601f830112612f9857612f97612e7c565b5b8135612fa8848260208601612f41565b91505092915050565b600060208284031215612fc757612fc6612afb565b5b600082013567ffffffffffffffff811115612fe557612fe4612b00565b5b612ff184828501612f83565b91505092915050565b6000602082840312156130105761300f612afb565b5b600061301e84828501612d7b565b91505092915050565b6000806040838503121561303e5761303d612afb565b5b600061304c85828601612d7b565b925050602061305d85828601612e3a565b9150509250929050565b600067ffffffffffffffff82111561308257613081612e86565b5b61308b82612c0f565b9050602081019050919050565b60006130ab6130a684613067565b612ee6565b9050828152602081018484840111156130c7576130c6612e81565b5b6130d2848285612f32565b509392505050565b600082601f8301126130ef576130ee612e7c565b5b81356130ff848260208601613098565b91505092915050565b6000806000806080858703121561312257613121612afb565b5b600061313087828801612d7b565b945050602061314187828801612d7b565b935050604061315287828801612cc6565b925050606085013567ffffffffffffffff81111561317357613172612b00565b5b61317f878288016130da565b91505092959194509250565b600080604083850312156131a2576131a1612afb565b5b60006131b085828601612d7b565b92505060206131c185828601612d7b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061321257607f821691505b602082108103613225576132246131cb565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613261602083612bcb565b915061326c8261322b565b602082019050919050565b6000602082019050818103600083015261329081613254565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006132cd601f83612bcb565b91506132d882613297565b602082019050919050565b600060208201905081810360008301526132fc816132c0565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026133657fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613328565b61336f8683613328565b95508019841693508086168417925050509392505050565b6000819050919050565b60006133ac6133a76133a284612c7b565b613387565b612c7b565b9050919050565b6000819050919050565b6133c683613391565b6133da6133d2826133b3565b848454613335565b825550505050565b600090565b6133ef6133e2565b6133fa8184846133bd565b505050565b5b8181101561341e576134136000826133e7565b600181019050613400565b5050565b601f8211156134635761343481613303565b61343d84613318565b8101602085101561344c578190505b61346061345885613318565b8301826133ff565b50505b505050565b600082821c905092915050565b600061348660001984600802613468565b1980831691505092915050565b600061349f8383613475565b9150826002028217905092915050565b6134b882612bc0565b67ffffffffffffffff8111156134d1576134d0612e86565b5b6134db82546131fa565b6134e6828285613422565b600060209050601f8311600181146135195760008415613507578287015190505b6135118582613493565b865550613579565b601f19841661352786613303565b60005b8281101561354f5784890151825560018201915060208501945060208101905061352a565b8683101561356c5784890151613568601f891682613475565b8355505b6001600288020188555050505b505050505050565b7f53616c65206973206e6f74206f70656e00000000000000000000000000000000600082015250565b60006135b7601083612bcb565b91506135c282613581565b602082019050919050565b600060208201905081810360008301526135e6816135aa565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061362782612c7b565b915061363283612c7b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613667576136666135ed565b5b828201905092915050565b7f4e6f206d6f7265206c6566740000000000000000000000000000000000000000600082015250565b60006136a8600c83612bcb565b91506136b382613672565b602082019050919050565b600060208201905081810360008301526136d78161369b565b9050919050565b60006136e982612c7b565b91506136f483612c7b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561372d5761372c6135ed565b5b828202905092915050565b7f496e636f7272656374204554482076616c75652073656e740000000000000000600082015250565b600061376e601883612bcb565b915061377982613738565b602082019050919050565b6000602082019050818103600083015261379d81613761565b9050919050565b7f4d6178206d696e747320706572207472616e73616374696f6e2065786365656460008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b6000613800602283612bcb565b915061380b826137a4565b604082019050919050565b6000602082019050818103600083015261382f816137f3565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613892602f83612bcb565b915061389d82613836565b604082019050919050565b600060208201905081810360008301526138c181613885565b9050919050565b600081905092915050565b600081546138e0816131fa565b6138ea81866138c8565b94506001821660008114613905576001811461391a5761394d565b60ff198316865281151582028601935061394d565b61392385613303565b60005b8381101561394557815481890152600182019150602081019050613926565b838801955050505b50505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b600061398c6001836138c8565b915061399782613956565b600182019050919050565b60006139ad82612bc0565b6139b781856138c8565b93506139c7818560208601612bdc565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613a096005836138c8565b9150613a14826139d3565b600582019050919050565b6000613a2b82856138d3565b9150613a368261397f565b9150613a4282846139a2565b9150613a4d826139fc565b91508190509392505050565b7f496e76616c6964206d696e7420616d6f756e7400000000000000000000000000600082015250565b6000613a8f601383612bcb565b9150613a9a82613a59565b602082019050919050565b60006020820190508181036000830152613abe81613a82565b9050919050565b7f4d6178696d756d20737570706c79206578636565646564000000000000000000600082015250565b6000613afb601783612bcb565b9150613b0682613ac5565b602082019050919050565b60006020820190508181036000830152613b2a81613aee565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613b8d602683612bcb565b9150613b9882613b31565b604082019050919050565b60006020820190508181036000830152613bbc81613b80565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b6000613bf9601d83612bcb565b9150613c0482613bc3565b602082019050919050565b60006020820190508181036000830152613c2881613bec565b9050919050565b600081905092915050565b50565b6000613c4a600083613c2f565b9150613c5582613c3a565b600082019050919050565b6000613c6b82613c3d565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000613cd1603a83612bcb565b9150613cdc82613c75565b604082019050919050565b60006020820190508181036000830152613d0081613cc4565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613d2e82613d07565b613d388185613d12565b9350613d48818560208601612bdc565b613d5181612c0f565b840191505092915050565b6000608082019050613d716000830187612d3a565b613d7e6020830186612d3a565b613d8b6040830185612c85565b8181036060830152613d9d8184613d23565b905095945050505050565b600081519050613db781612b31565b92915050565b600060208284031215613dd357613dd2612afb565b5b6000613de184828501613da8565b91505092915050565b6000613df582612c7b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613e2757613e266135ed565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613e6c82612c7b565b9150613e7783612c7b565b925082613e8757613e86613e32565b5b828204905092915050565b6000613e9d82612c7b565b9150613ea883612c7b565b925082821015613ebb57613eba6135ed565b5b828203905092915050565b6000613ed182612c7b565b9150613edc83612c7b565b925082613eec57613eeb613e32565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea26469706673582212205c2ab2015d18661f1062ef4f6ddd396813be15795008c7316d4de18a99595fed64736f6c634300080f0033697066733a2f2f516d5655574e7a655755644357564c5a524c393854426a6d634b586e67656a36323848417469343278743363644d2f2f

Deployed Bytecode

0x6080604052600436106101f95760003560e01c806370a082311161010d578063a22cb465116100a0578063d547cfb71161006f578063d547cfb7146106ea578063d5abeb0114610715578063e985e9c514610740578063efdc77881461077d578063f2fde38b146107a6576101f9565b8063a22cb46514610630578063b88d4fde14610659578063c6a91b4214610682578063c87b56dd146106ad576101f9565b8063982d669e116100dc578063982d669e1461059557806398710d1e146105c05780639e9fcffc146105eb578063a0712d6814610614576101f9565b806370a08231146104eb578063715018a6146105285780638da5cb5b1461053f57806395d89b411461056a576101f9565b8063193ad7b41161019057806328cad13d1161015f57806328cad13d1461041c5780633ccfd60b1461044557806342842e0e1461045c57806355f804b3146104855780636352211e146104ae576101f9565b8063193ad7b4146103745780631e84c4131461039f578063202f298a146103ca57806323b872dd146103f3576101f9565b8063095ea7b3116101cc578063095ea7b3146102ce5780630a00ae83146102f757806318160ddd146103205780631919fed71461034b576101f9565b806301ffc9a7146101fe57806306fdde031461023b57806307e89ec014610266578063081812fc14610291575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190612b5d565b6107cf565b6040516102329190612ba5565b60405180910390f35b34801561024757600080fd5b506102506108b1565b60405161025d9190612c59565b60405180910390f35b34801561027257600080fd5b5061027b610943565b6040516102889190612c94565b60405180910390f35b34801561029d57600080fd5b506102b860048036038101906102b39190612cdb565b610949565b6040516102c59190612d49565b60405180910390f35b3480156102da57600080fd5b506102f560048036038101906102f09190612d90565b6109c5565b005b34801561030357600080fd5b5061031e60048036038101906103199190612cdb565b610acf565b005b34801561032c57600080fd5b50610335610b55565b6040516103429190612c94565b60405180910390f35b34801561035757600080fd5b50610372600480360381019061036d9190612cdb565b610b6c565b005b34801561038057600080fd5b50610389610bf2565b6040516103969190612c94565b60405180910390f35b3480156103ab57600080fd5b506103b4610bf8565b6040516103c19190612ba5565b60405180910390f35b3480156103d657600080fd5b506103f160048036038101906103ec9190612cdb565b610c0b565b005b3480156103ff57600080fd5b5061041a60048036038101906104159190612dd0565b610c91565b005b34801561042857600080fd5b50610443600480360381019061043e9190612e4f565b610ca1565b005b34801561045157600080fd5b5061045a610d3a565b005b34801561046857600080fd5b50610483600480360381019061047e9190612dd0565b610e17565b005b34801561049157600080fd5b506104ac60048036038101906104a79190612fb1565b610e37565b005b3480156104ba57600080fd5b506104d560048036038101906104d09190612cdb565b610ec6565b6040516104e29190612d49565b60405180910390f35b3480156104f757600080fd5b50610512600480360381019061050d9190612ffa565b610edc565b60405161051f9190612c94565b60405180910390f35b34801561053457600080fd5b5061053d610fab565b005b34801561054b57600080fd5b50610554611033565b6040516105619190612d49565b60405180910390f35b34801561057657600080fd5b5061057f61105d565b60405161058c9190612c59565b60405180910390f35b3480156105a157600080fd5b506105aa6110ef565b6040516105b79190612c94565b60405180910390f35b3480156105cc57600080fd5b506105d56110f5565b6040516105e29190612c94565b60405180910390f35b3480156105f757600080fd5b50610612600480360381019061060d9190612cdb565b6110fb565b005b61062e60048036038101906106299190612cdb565b611181565b005b34801561063c57600080fd5b5061065760048036038101906106529190613027565b6113c2565b005b34801561066557600080fd5b50610680600480360381019061067b9190613108565b611539565b005b34801561068e57600080fd5b506106976115b5565b6040516106a49190612c94565b60405180910390f35b3480156106b957600080fd5b506106d460048036038101906106cf9190612cdb565b6115bb565b6040516106e19190612c59565b60405180910390f35b3480156106f657600080fd5b506106ff611637565b60405161070c9190612c59565b60405180910390f35b34801561072157600080fd5b5061072a6116c5565b6040516107379190612c94565b60405180910390f35b34801561074c57600080fd5b506107676004803603810190610762919061318b565b6116cb565b6040516107749190612ba5565b60405180910390f35b34801561078957600080fd5b506107a4600480360381019061079f9190612cdb565b61175f565b005b3480156107b257600080fd5b506107cd60048036038101906107c89190612ffa565b611882565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061089a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108aa57506108a982611979565b5b9050919050565b6060600280546108c0906131fa565b80601f01602080910402602001604051908101604052809291908181526020018280546108ec906131fa565b80156109395780601f1061090e57610100808354040283529160200191610939565b820191906000526020600020905b81548152906001019060200180831161091c57829003601f168201915b5050505050905090565b600d5481565b6000610954826119e3565b61098a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109d082610ec6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a37576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a56611a31565b73ffffffffffffffffffffffffffffffffffffffff1614158015610a885750610a8681610a81611a31565b6116cb565b155b15610abf576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610aca838383611a39565b505050565b610ad7611a31565b73ffffffffffffffffffffffffffffffffffffffff16610af5611033565b73ffffffffffffffffffffffffffffffffffffffff1614610b4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4290613277565b60405180910390fd5b80600e8190555050565b6000610b5f611aeb565b6001546000540303905090565b610b74611a31565b73ffffffffffffffffffffffffffffffffffffffff16610b92611033565b73ffffffffffffffffffffffffffffffffffffffff1614610be8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdf90613277565b60405180910390fd5b80600d8190555050565b60105481565b601160009054906101000a900460ff1681565b610c13611a31565b73ffffffffffffffffffffffffffffffffffffffff16610c31611033565b73ffffffffffffffffffffffffffffffffffffffff1614610c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7e90613277565b60405180910390fd5b80600f8190555050565b610c9c838383611af4565b505050565b610ca9611a31565b73ffffffffffffffffffffffffffffffffffffffff16610cc7611033565b73ffffffffffffffffffffffffffffffffffffffff1614610d1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1490613277565b60405180910390fd5b80601160006101000a81548160ff02191690831515021790555050565b610d42611a31565b73ffffffffffffffffffffffffffffffffffffffff16610d60611033565b73ffffffffffffffffffffffffffffffffffffffff1614610db6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dad90613277565b60405180910390fd5b600260095403610dfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df2906132e3565b60405180910390fd5b6002600981905550610e0d3347611fa8565b6001600981905550565b610e3283838360405180602001604052806000815250611539565b505050565b610e3f611a31565b73ffffffffffffffffffffffffffffffffffffffff16610e5d611033565b73ffffffffffffffffffffffffffffffffffffffff1614610eb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eaa90613277565b60405180910390fd5b80600a9081610ec291906134af565b5050565b6000610ed18261209c565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f43576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610fb3611a31565b73ffffffffffffffffffffffffffffffffffffffff16610fd1611033565b73ffffffffffffffffffffffffffffffffffffffff1614611027576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101e90613277565b60405180910390fd5b611031600061232b565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461106c906131fa565b80601f0160208091040260200160405190810160405280929190818152602001828054611098906131fa565b80156110e55780601f106110ba576101008083540402835291602001916110e5565b820191906000526020600020905b8154815290600101906020018083116110c857829003601f168201915b5050505050905090565b600e5481565b600f5481565b611103611a31565b73ffffffffffffffffffffffffffffffffffffffff16611121611033565b73ffffffffffffffffffffffffffffffffffffffff1614611177576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116e90613277565b60405180910390fd5b80600c8190555050565b601160009054906101000a900460ff166111d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c7906135cd565b60405180910390fd5b6001600b546111df919061361c565b816111e8610b55565b6111f2919061361c565b10611232576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611229906136be565b60405180910390fd5b600e5481601054611243919061361c565b111561129e573481600d5461125891906136de565b1115611299576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129090613784565b60405180910390fd5b6113b5565b600f54816112ab33610edc565b6112b5919061361c565b1115611355573481600d546112ca91906136de565b111561130b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130290613784565b60405180910390fd5b600c54811115611350576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134790613816565b60405180910390fd5b6113b4565b600f5481111561139a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139190613816565b60405180910390fd5b80601060008282546113ac919061361c565b925050819055505b5b6113bf33826123f1565b50565b6113ca611a31565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361142e576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061143b611a31565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114e8611a31565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161152d9190612ba5565b60405180910390a35050565b611544848484611af4565b6115638373ffffffffffffffffffffffffffffffffffffffff1661240f565b8015611578575061157684848484612432565b155b156115af576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600c5481565b60606115c6826119e3565b611605576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fc906138a8565b60405180910390fd5b600a61161083612582565b604051602001611621929190613a1f565b6040516020818303038152906040529050919050565b600a8054611644906131fa565b80601f0160208091040260200160405190810160405280929190818152602001828054611670906131fa565b80156116bd5780601f10611692576101008083540402835291602001916116bd565b820191906000526020600020905b8154815290600101906020018083116116a057829003601f168201915b505050505081565b600b5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611767611a31565b73ffffffffffffffffffffffffffffffffffffffff16611785611033565b73ffffffffffffffffffffffffffffffffffffffff16146117db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d290613277565b60405180910390fd5b6000811161181e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181590613aa5565b60405180910390fd5b600b548161182a610b55565b611834919061361c565b1115611875576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186c90613b11565b60405180910390fd5b61187f33826123f1565b50565b61188a611a31565b73ffffffffffffffffffffffffffffffffffffffff166118a8611033565b73ffffffffffffffffffffffffffffffffffffffff16146118fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f590613277565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361196d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196490613ba3565b60405180910390fd5b6119768161232b565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816119ee611aeb565b111580156119fd575060005482105b8015611a2a575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000611aff8261209c565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611b6a576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611b8b611a31565b73ffffffffffffffffffffffffffffffffffffffff161480611bba5750611bb985611bb4611a31565b6116cb565b5b80611bff5750611bc8611a31565b73ffffffffffffffffffffffffffffffffffffffff16611be784610949565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611c38576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611c9e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cab85858560016126e2565b611cb760008487611a39565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611f36576000548214611f3557878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611fa185858560016126e8565b5050505050565b80471015611feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe290613c0f565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161201190613c60565b60006040518083038185875af1925050503d806000811461204e576040519150601f19603f3d011682016040523d82523d6000602084013e612053565b606091505b5050905080612097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208e90613ce7565b60405180910390fd5b505050565b6120a4612aae565b6000829050806120b2611aeb565b111580156120c1575060005481105b156122f4576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516122f257600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146121d6578092505050612326565b5b6001156122f157818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146122ec578092505050612326565b6121d7565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61240b8282604051806020016040528060008152506126ee565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612458611a31565b8786866040518563ffffffff1660e01b815260040161247a9493929190613d5c565b6020604051808303816000875af19250505080156124b657506040513d601f19601f820116820180604052508101906124b39190613dbd565b60015b61252f573d80600081146124e6576040519150601f19603f3d011682016040523d82523d6000602084013e6124eb565b606091505b506000815103612527576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600082036125c9576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506126dd565b600082905060005b600082146125fb5780806125e490613dea565b915050600a826125f49190613e61565b91506125d1565b60008167ffffffffffffffff81111561261757612616612e86565b5b6040519080825280601f01601f1916602001820160405280156126495781602001600182028036833780820191505090505b5090505b600085146126d6576001826126629190613e92565b9150600a856126719190613ec6565b603061267d919061361c565b60f81b81838151811061269357612692613ef7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126cf9190613e61565b945061264d565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361275a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008303612794576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127a160008583866126e2565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600084820190506129628673ffffffffffffffffffffffffffffffffffffffff1661240f565b15612a27575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129d76000878480600101955087612432565b612a0d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808203612968578260005414612a2257600080fd5b612a92565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203612a28575b816000819055505050612aa860008583866126e8565b50505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612b3a81612b05565b8114612b4557600080fd5b50565b600081359050612b5781612b31565b92915050565b600060208284031215612b7357612b72612afb565b5b6000612b8184828501612b48565b91505092915050565b60008115159050919050565b612b9f81612b8a565b82525050565b6000602082019050612bba6000830184612b96565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612bfa578082015181840152602081019050612bdf565b83811115612c09576000848401525b50505050565b6000601f19601f8301169050919050565b6000612c2b82612bc0565b612c358185612bcb565b9350612c45818560208601612bdc565b612c4e81612c0f565b840191505092915050565b60006020820190508181036000830152612c738184612c20565b905092915050565b6000819050919050565b612c8e81612c7b565b82525050565b6000602082019050612ca96000830184612c85565b92915050565b612cb881612c7b565b8114612cc357600080fd5b50565b600081359050612cd581612caf565b92915050565b600060208284031215612cf157612cf0612afb565b5b6000612cff84828501612cc6565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612d3382612d08565b9050919050565b612d4381612d28565b82525050565b6000602082019050612d5e6000830184612d3a565b92915050565b612d6d81612d28565b8114612d7857600080fd5b50565b600081359050612d8a81612d64565b92915050565b60008060408385031215612da757612da6612afb565b5b6000612db585828601612d7b565b9250506020612dc685828601612cc6565b9150509250929050565b600080600060608486031215612de957612de8612afb565b5b6000612df786828701612d7b565b9350506020612e0886828701612d7b565b9250506040612e1986828701612cc6565b9150509250925092565b612e2c81612b8a565b8114612e3757600080fd5b50565b600081359050612e4981612e23565b92915050565b600060208284031215612e6557612e64612afb565b5b6000612e7384828501612e3a565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612ebe82612c0f565b810181811067ffffffffffffffff82111715612edd57612edc612e86565b5b80604052505050565b6000612ef0612af1565b9050612efc8282612eb5565b919050565b600067ffffffffffffffff821115612f1c57612f1b612e86565b5b612f2582612c0f565b9050602081019050919050565b82818337600083830152505050565b6000612f54612f4f84612f01565b612ee6565b905082815260208101848484011115612f7057612f6f612e81565b5b612f7b848285612f32565b509392505050565b600082601f830112612f9857612f97612e7c565b5b8135612fa8848260208601612f41565b91505092915050565b600060208284031215612fc757612fc6612afb565b5b600082013567ffffffffffffffff811115612fe557612fe4612b00565b5b612ff184828501612f83565b91505092915050565b6000602082840312156130105761300f612afb565b5b600061301e84828501612d7b565b91505092915050565b6000806040838503121561303e5761303d612afb565b5b600061304c85828601612d7b565b925050602061305d85828601612e3a565b9150509250929050565b600067ffffffffffffffff82111561308257613081612e86565b5b61308b82612c0f565b9050602081019050919050565b60006130ab6130a684613067565b612ee6565b9050828152602081018484840111156130c7576130c6612e81565b5b6130d2848285612f32565b509392505050565b600082601f8301126130ef576130ee612e7c565b5b81356130ff848260208601613098565b91505092915050565b6000806000806080858703121561312257613121612afb565b5b600061313087828801612d7b565b945050602061314187828801612d7b565b935050604061315287828801612cc6565b925050606085013567ffffffffffffffff81111561317357613172612b00565b5b61317f878288016130da565b91505092959194509250565b600080604083850312156131a2576131a1612afb565b5b60006131b085828601612d7b565b92505060206131c185828601612d7b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061321257607f821691505b602082108103613225576132246131cb565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613261602083612bcb565b915061326c8261322b565b602082019050919050565b6000602082019050818103600083015261329081613254565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006132cd601f83612bcb565b91506132d882613297565b602082019050919050565b600060208201905081810360008301526132fc816132c0565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026133657fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613328565b61336f8683613328565b95508019841693508086168417925050509392505050565b6000819050919050565b60006133ac6133a76133a284612c7b565b613387565b612c7b565b9050919050565b6000819050919050565b6133c683613391565b6133da6133d2826133b3565b848454613335565b825550505050565b600090565b6133ef6133e2565b6133fa8184846133bd565b505050565b5b8181101561341e576134136000826133e7565b600181019050613400565b5050565b601f8211156134635761343481613303565b61343d84613318565b8101602085101561344c578190505b61346061345885613318565b8301826133ff565b50505b505050565b600082821c905092915050565b600061348660001984600802613468565b1980831691505092915050565b600061349f8383613475565b9150826002028217905092915050565b6134b882612bc0565b67ffffffffffffffff8111156134d1576134d0612e86565b5b6134db82546131fa565b6134e6828285613422565b600060209050601f8311600181146135195760008415613507578287015190505b6135118582613493565b865550613579565b601f19841661352786613303565b60005b8281101561354f5784890151825560018201915060208501945060208101905061352a565b8683101561356c5784890151613568601f891682613475565b8355505b6001600288020188555050505b505050505050565b7f53616c65206973206e6f74206f70656e00000000000000000000000000000000600082015250565b60006135b7601083612bcb565b91506135c282613581565b602082019050919050565b600060208201905081810360008301526135e6816135aa565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061362782612c7b565b915061363283612c7b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613667576136666135ed565b5b828201905092915050565b7f4e6f206d6f7265206c6566740000000000000000000000000000000000000000600082015250565b60006136a8600c83612bcb565b91506136b382613672565b602082019050919050565b600060208201905081810360008301526136d78161369b565b9050919050565b60006136e982612c7b565b91506136f483612c7b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561372d5761372c6135ed565b5b828202905092915050565b7f496e636f7272656374204554482076616c75652073656e740000000000000000600082015250565b600061376e601883612bcb565b915061377982613738565b602082019050919050565b6000602082019050818103600083015261379d81613761565b9050919050565b7f4d6178206d696e747320706572207472616e73616374696f6e2065786365656460008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b6000613800602283612bcb565b915061380b826137a4565b604082019050919050565b6000602082019050818103600083015261382f816137f3565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613892602f83612bcb565b915061389d82613836565b604082019050919050565b600060208201905081810360008301526138c181613885565b9050919050565b600081905092915050565b600081546138e0816131fa565b6138ea81866138c8565b94506001821660008114613905576001811461391a5761394d565b60ff198316865281151582028601935061394d565b61392385613303565b60005b8381101561394557815481890152600182019150602081019050613926565b838801955050505b50505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b600061398c6001836138c8565b915061399782613956565b600182019050919050565b60006139ad82612bc0565b6139b781856138c8565b93506139c7818560208601612bdc565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613a096005836138c8565b9150613a14826139d3565b600582019050919050565b6000613a2b82856138d3565b9150613a368261397f565b9150613a4282846139a2565b9150613a4d826139fc565b91508190509392505050565b7f496e76616c6964206d696e7420616d6f756e7400000000000000000000000000600082015250565b6000613a8f601383612bcb565b9150613a9a82613a59565b602082019050919050565b60006020820190508181036000830152613abe81613a82565b9050919050565b7f4d6178696d756d20737570706c79206578636565646564000000000000000000600082015250565b6000613afb601783612bcb565b9150613b0682613ac5565b602082019050919050565b60006020820190508181036000830152613b2a81613aee565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613b8d602683612bcb565b9150613b9882613b31565b604082019050919050565b60006020820190508181036000830152613bbc81613b80565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b6000613bf9601d83612bcb565b9150613c0482613bc3565b602082019050919050565b60006020820190508181036000830152613c2881613bec565b9050919050565b600081905092915050565b50565b6000613c4a600083613c2f565b9150613c5582613c3a565b600082019050919050565b6000613c6b82613c3d565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000613cd1603a83612bcb565b9150613cdc82613c75565b604082019050919050565b60006020820190508181036000830152613d0081613cc4565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613d2e82613d07565b613d388185613d12565b9350613d48818560208601612bdc565b613d5181612c0f565b840191505092915050565b6000608082019050613d716000830187612d3a565b613d7e6020830186612d3a565b613d8b6040830185612c85565b8181036060830152613d9d8184613d23565b905095945050505050565b600081519050613db781612b31565b92915050565b600060208284031215613dd357613dd2612afb565b5b6000613de184828501613da8565b91505092915050565b6000613df582612c7b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613e2757613e266135ed565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613e6c82612c7b565b9150613e7783612c7b565b925082613e8757613e86613e32565b5b828204905092915050565b6000613e9d82612c7b565b9150613ea883612c7b565b925082821015613ebb57613eba6135ed565b5b828203905092915050565b6000613ed182612c7b565b9150613edc83612c7b565b925082613eec57613eeb613e32565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea26469706673582212205c2ab2015d18661f1062ef4f6ddd396813be15795008c7316d4de18a99595fed64736f6c634300080f0033

Deployed Bytecode Sourcemap

58066:3330:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39176:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42289:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58358:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43792:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43355:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60878:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38425:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61013:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58495:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58539:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61267:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44657:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60724:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60117:142;;;;;;;;;;;;;:::i;:::-;;44898:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59713:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42097:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39545:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16942:103;;;;;;;;;;;;;:::i;:::-;;16291:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42458:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58410:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58451:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61134:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58661:1046;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44068:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45154:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58317:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60265:312;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58186:88;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58279:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44426:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59827:284;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17200:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39176:305;39278:4;39330:25;39315:40;;;:11;:40;;;;:105;;;;39387:33;39372:48;;;:11;:48;;;;39315:105;:158;;;;39437:36;39461:11;39437:23;:36::i;:::-;39315:158;39295:178;;39176:305;;;:::o;42289:100::-;42343:13;42376:5;42369:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42289:100;:::o;58358:47::-;;;;:::o;43792:204::-;43860:7;43885:16;43893:7;43885;:16::i;:::-;43880:64;;43910:34;;;;;;;;;;;;;;43880:64;43964:15;:24;43980:7;43964:24;;;;;;;;;;;;;;;;;;;;;43957:31;;43792:204;;;:::o;43355:371::-;43428:13;43444:24;43460:7;43444:15;:24::i;:::-;43428:40;;43489:5;43483:11;;:2;:11;;;43479:48;;43503:24;;;;;;;;;;;;;;43479:48;43560:5;43544:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;43570:37;43587:5;43594:12;:10;:12::i;:::-;43570:16;:37::i;:::-;43569:38;43544:63;43540:138;;;43631:35;;;;;;;;;;;;;;43540:138;43690:28;43699:2;43703:7;43712:5;43690:8;:28::i;:::-;43417:309;43355:371;;:::o;60878:129::-;16522:12;:10;:12::i;:::-;16511:23;;:7;:5;:7::i;:::-;:23;;;16503:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60988:13:::1;60971:14;:30;;;;60878:129:::0;:::o;38425:303::-;38469:7;38694:15;:13;:15::i;:::-;38679:12;;38663:13;;:28;:46;38656:53;;38425:303;:::o;61013:115::-;16522:12;:10;:12::i;:::-;16511:23;;:7;:5;:7::i;:::-;:23;;;16503:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61116:6:::1;61096:17;:26;;;;61013:115:::0;:::o;58495:39::-;;;;:::o;58539:37::-;;;;;;;;;;;;;:::o;61267:126::-;16522:12;:10;:12::i;:::-;16511:23;;:7;:5;:7::i;:::-;:23;;;16503:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61381:6:::1;61359:19;:28;;;;61267:126:::0;:::o;44657:170::-;44791:28;44801:4;44807:2;44811:7;44791:9;:28::i;:::-;44657:170;;;:::o;60724:148::-;16522:12;:10;:12::i;:::-;16511:23;;:7;:5;:7::i;:::-;:23;;;16503:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60847:19:::1;60826:18;;:40;;;;;;;;;;;;;;;;;;60724:148:::0;:::o;60117:142::-;16522:12;:10;:12::i;:::-;16511:23;;:7;:5;:7::i;:::-;:23;;;16503:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11265:1:::1;11863:7;;:19:::0;11855:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;11265:1;11996:7;:18;;;;60192:61:::2;60218:10;60231:21;60192:17;:61::i;:::-;11221:1:::1;12175:7;:22;;;;60117:142::o:0;44898:185::-;45036:39;45053:4;45059:2;45063:7;45036:39;;;;;;;;;;;;:16;:39::i;:::-;44898:185;;;:::o;59713:108::-;16522:12;:10;:12::i;:::-;16511:23;;:7;:5;:7::i;:::-;:23;;;16503:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59808:7:::1;59793:12;:22;;;;;;:::i;:::-;;59713:108:::0;:::o;42097:125::-;42161:7;42188:21;42201:7;42188:12;:21::i;:::-;:26;;;42181:33;;42097:125;;;:::o;39545:206::-;39609:7;39650:1;39633:19;;:5;:19;;;39629:60;;39661:28;;;;;;;;;;;;;;39629:60;39715:12;:19;39728:5;39715:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;39707:36;;39700:43;;39545:206;;;:::o;16942:103::-;16522:12;:10;:12::i;:::-;16511:23;;:7;:5;:7::i;:::-;:23;;;16503:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17007:30:::1;17034:1;17007:18;:30::i;:::-;16942:103::o:0;16291:87::-;16337:7;16364:6;;;;;;;;;;;16357:13;;16291:87;:::o;42458:104::-;42514:13;42547:7;42540:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42458:104;:::o;58410:36::-;;;;:::o;58451:39::-;;;;:::o;61134:127::-;16522:12;:10;:12::i;:::-;16511:23;;:7;:5;:7::i;:::-;:23;;;16503:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61249:6:::1;61230:16;:25;;;;61134:127:::0;:::o;58661:1046::-;58748:18;;;;;;;;;;;58740:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;58847:1;58835:9;;:13;;;;:::i;:::-;58818:14;58802:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:46;58794:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;58917:14;;58900;58877:20;;:37;;;;:::i;:::-;:54;58874:784;;;59005:9;58986:14;58966:17;;:34;;;;:::i;:::-;58965:49;;58943:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;58874:784;;;59136:19;;59119:14;59095:21;59105:10;59095:9;:21::i;:::-;:38;;;;:::i;:::-;:60;59091:560;;;59230:9;59211:14;59191:17;;:34;;;;:::i;:::-;59190:49;;59168:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;59342:16;;59324:14;:34;;59302:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;59091:560;;;59497:19;;59479:14;:37;;59453:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;59625:14;59601:20;;:38;;;;;;;:::i;:::-;;;;;;;;59091:560;58874:784;59664:37;59674:10;59686:14;59664:9;:37::i;:::-;58661:1046;:::o;44068:287::-;44179:12;:10;:12::i;:::-;44167:24;;:8;:24;;;44163:54;;44200:17;;;;;;;;;;;;;;44163:54;44275:8;44230:18;:32;44249:12;:10;:12::i;:::-;44230:32;;;;;;;;;;;;;;;:42;44263:8;44230:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;44328:8;44299:48;;44314:12;:10;:12::i;:::-;44299:48;;;44338:8;44299:48;;;;;;:::i;:::-;;;;;;;;44068:287;;:::o;45154:369::-;45321:28;45331:4;45337:2;45341:7;45321:9;:28::i;:::-;45364:15;:2;:13;;;:15::i;:::-;:76;;;;;45384:56;45415:4;45421:2;45425:7;45434:5;45384:30;:56::i;:::-;45383:57;45364:76;45360:156;;;45464:40;;;;;;;;;;;;;;45360:156;45154:369;;;;:::o;58317:36::-;;;;:::o;60265:312::-;60361:13;60402:17;60410:8;60402:7;:17::i;:::-;60386:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;60522:12;60541:19;:8;:17;:19::i;:::-;60505:65;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60491:80;;60265:312;;;:::o;58186:88::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58279:33::-;;;;:::o;44426:164::-;44523:4;44547:18;:25;44566:5;44547:25;;;;;;;;;;;;;;;:35;44573:8;44547:35;;;;;;;;;;;;;;;;;;;;;;;;;44540:42;;44426:164;;;;:::o;59827:284::-;16522:12;:10;:12::i;:::-;16511:23;;:7;:5;:7::i;:::-;:23;;;16503:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59928:1:::1;59917:8;:12;59901:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;60017:9;;60005:8;59989:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:37;;59973:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;60074:31;60084:10;60096:8;60074:9;:31::i;:::-;59827:284:::0;:::o;17200:201::-;16522:12;:10;:12::i;:::-;16511:23;;:7;:5;:7::i;:::-;:23;;;16503:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17309:1:::1;17289:22;;:8;:22;;::::0;17281:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;17365:28;17384:8;17365:18;:28::i;:::-;17200:201:::0;:::o;29075:157::-;29160:4;29199:25;29184:40;;;:11;:40;;;;29177:47;;29075:157;;;:::o;45778:174::-;45835:4;45878:7;45859:15;:13;:15::i;:::-;:26;;:53;;;;;45899:13;;45889:7;:23;45859:53;:85;;;;;45917:11;:20;45929:7;45917:20;;;;;;;;;;;:27;;;;;;;;;;;;45916:28;45859:85;45852:92;;45778:174;;;:::o;15015:98::-;15068:7;15095:10;15088:17;;15015:98;:::o;55004:196::-;55146:2;55119:15;:24;55135:7;55119:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;55184:7;55180:2;55164:28;;55173:5;55164:28;;;;;;;;;;;;55004:196;;;:::o;38199:92::-;38255:7;38282:1;38275:8;;38199:92;:::o;49952:2130::-;50067:35;50105:21;50118:7;50105:12;:21::i;:::-;50067:59;;50165:4;50143:26;;:13;:18;;;:26;;;50139:67;;50178:28;;;;;;;;;;;;;;50139:67;50219:22;50261:4;50245:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;50282:36;50299:4;50305:12;:10;:12::i;:::-;50282:16;:36::i;:::-;50245:73;:126;;;;50359:12;:10;:12::i;:::-;50335:36;;:20;50347:7;50335:11;:20::i;:::-;:36;;;50245:126;50219:153;;50390:17;50385:66;;50416:35;;;;;;;;;;;;;;50385:66;50480:1;50466:16;;:2;:16;;;50462:52;;50491:23;;;;;;;;;;;;;;50462:52;50527:43;50549:4;50555:2;50559:7;50568:1;50527:21;:43::i;:::-;50635:35;50652:1;50656:7;50665:4;50635:8;:35::i;:::-;50996:1;50966:12;:18;50979:4;50966:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51040:1;51012:12;:16;51025:2;51012:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51058:31;51092:11;:20;51104:7;51092:20;;;;;;;;;;;51058:54;;51143:2;51127:8;:13;;;:18;;;;;;;;;;;;;;;;;;51193:15;51160:8;:23;;;:49;;;;;;;;;;;;;;;;;;51461:19;51493:1;51483:7;:11;51461:33;;51509:31;51543:11;:24;51555:11;51543:24;;;;;;;;;;;51509:58;;51611:1;51586:27;;:8;:13;;;;;;;;;;;;:27;;;51582:384;;51796:13;;51781:11;:28;51777:174;;51850:4;51834:8;:13;;;:20;;;;;;;;;;;;;;;;;;51903:13;:28;;;51877:8;:23;;;:54;;;;;;;;;;;;;;;;;;51777:174;51582:384;50941:1036;;;52013:7;52009:2;51994:27;;52003:4;51994:27;;;;;;;;;;;;52032:42;52053:4;52059:2;52063:7;52072:1;52032:20;:42::i;:::-;50056:2026;;49952:2130;;;:::o;20253:317::-;20368:6;20343:21;:31;;20335:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20422:12;20440:9;:14;;20462:6;20440:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20421:52;;;20492:7;20484:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;20324:246;20253:317;;:::o;40926:1109::-;40988:21;;:::i;:::-;41022:12;41037:7;41022:22;;41105:4;41086:15;:13;:15::i;:::-;:23;;:47;;;;;41120:13;;41113:4;:20;41086:47;41082:886;;;41154:31;41188:11;:17;41200:4;41188:17;;;;;;;;;;;41154:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41229:9;:16;;;41224:729;;41300:1;41274:28;;:9;:14;;;:28;;;41270:101;;41338:9;41331:16;;;;;;41270:101;41673:261;41680:4;41673:261;;;41713:6;;;;;;;;41758:11;:17;41770:4;41758:17;;;;;;;;;;;41746:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41832:1;41806:28;;:9;:14;;;:28;;;41802:109;;41874:9;41867:16;;;;;;41802:109;41673:261;;;41224:729;41135:833;41082:886;41996:31;;;;;;;;;;;;;;40926:1109;;;;:::o;17561:191::-;17635:16;17654:6;;;;;;;;;;;17635:25;;17680:8;17671:6;;:17;;;;;;;;;;;;;;;;;;17735:8;17704:40;;17725:8;17704:40;;;;;;;;;;;;17624:128;17561:191;:::o;46036:104::-;46105:27;46115:2;46119:8;46105:27;;;;;;;;;;;;:9;:27::i;:::-;46036:104;;:::o;18992:326::-;19052:4;19309:1;19287:7;:19;;;:23;19280:30;;18992:326;;;:::o;55692:667::-;55855:4;55892:2;55876:36;;;55913:12;:10;:12::i;:::-;55927:4;55933:7;55942:5;55876:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;55872:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56127:1;56110:6;:13;:18;56106:235;;56156:40;;;;;;;;;;;;;;56106:235;56299:6;56293:13;56284:6;56280:2;56276:15;56269:38;55872:480;56005:45;;;55995:55;;;:6;:55;;;;55988:62;;;55692:667;;;;;;:::o;12577:723::-;12633:13;12863:1;12854:5;:10;12850:53;;12881:10;;;;;;;;;;;;;;;;;;;;;12850:53;12913:12;12928:5;12913:20;;12944:14;12969:78;12984:1;12976:4;:9;12969:78;;13002:8;;;;;:::i;:::-;;;;13033:2;13025:10;;;;;:::i;:::-;;;12969:78;;;13057:19;13089:6;13079:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13057:39;;13107:154;13123:1;13114:5;:10;13107:154;;13151:1;13141:11;;;;;:::i;:::-;;;13218:2;13210:5;:10;;;;:::i;:::-;13197:2;:24;;;;:::i;:::-;13184:39;;13167:6;13174;13167:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;13247:2;13238:11;;;;;:::i;:::-;;;13107:154;;;13285:6;13271:21;;;;;12577:723;;;;:::o;57007:159::-;;;;;:::o;57825:158::-;;;;;:::o;46514:1751::-;46637:20;46660:13;;46637:36;;46702:1;46688:16;;:2;:16;;;46684:48;;46713:19;;;;;;;;;;;;;;46684:48;46759:1;46747:8;:13;46743:44;;46769:18;;;;;;;;;;;;;;46743:44;46800:61;46830:1;46834:2;46838:12;46852:8;46800:21;:61::i;:::-;47173:8;47138:12;:16;47151:2;47138:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47237:8;47197:12;:16;47210:2;47197:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47296:2;47263:11;:25;47275:12;47263:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;47363:15;47313:11;:25;47325:12;47313:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;47396:20;47419:12;47396:35;;47446:11;47475:8;47460:12;:23;47446:37;;47504:15;:2;:13;;;:15::i;:::-;47500:633;;;47540:314;47596:12;47592:2;47571:38;;47588:1;47571:38;;;;;;;;;;;;47637:69;47676:1;47680:2;47684:14;;;;;;47700:5;47637:30;:69::i;:::-;47632:174;;47742:40;;;;;;;;;;;;;;47632:174;47849:3;47833:12;:19;47540:314;;47935:12;47918:13;;:29;47914:43;;47949:8;;;47914:43;47500:633;;;47998:120;48054:14;;;;;;48050:2;48029:40;;48046:1;48029:40;;;;;;;;;;;;48113:3;48097:12;:19;47998:120;;47500:633;48163:12;48147:13;:28;;;;47113:1074;;48197:60;48226:1;48230:2;48234:12;48248:8;48197:20;:60::i;:::-;46626:1639;46514:1751;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:118::-;3078:24;3096:5;3078:24;:::i;:::-;3073:3;3066:37;2991:118;;:::o;3115:222::-;3208:4;3246:2;3235:9;3231:18;3223:26;;3259:71;3327:1;3316:9;3312:17;3303:6;3259:71;:::i;:::-;3115:222;;;;:::o;3343:122::-;3416:24;3434:5;3416:24;:::i;:::-;3409:5;3406:35;3396:63;;3455:1;3452;3445:12;3396:63;3343:122;:::o;3471:139::-;3517:5;3555:6;3542:20;3533:29;;3571:33;3598:5;3571:33;:::i;:::-;3471:139;;;;:::o;3616:329::-;3675:6;3724:2;3712:9;3703:7;3699:23;3695:32;3692:119;;;3730:79;;:::i;:::-;3692:119;3850:1;3875:53;3920:7;3911:6;3900:9;3896:22;3875:53;:::i;:::-;3865:63;;3821:117;3616:329;;;;:::o;3951:126::-;3988:7;4028:42;4021:5;4017:54;4006:65;;3951:126;;;:::o;4083:96::-;4120:7;4149:24;4167:5;4149:24;:::i;:::-;4138:35;;4083:96;;;:::o;4185:118::-;4272:24;4290:5;4272:24;:::i;:::-;4267:3;4260:37;4185:118;;:::o;4309:222::-;4402:4;4440:2;4429:9;4425:18;4417:26;;4453:71;4521:1;4510:9;4506:17;4497:6;4453:71;:::i;:::-;4309:222;;;;:::o;4537:122::-;4610:24;4628:5;4610:24;:::i;:::-;4603:5;4600:35;4590:63;;4649:1;4646;4639:12;4590:63;4537:122;:::o;4665:139::-;4711:5;4749:6;4736:20;4727:29;;4765:33;4792:5;4765:33;:::i;:::-;4665:139;;;;:::o;4810:474::-;4878:6;4886;4935:2;4923:9;4914:7;4910:23;4906:32;4903:119;;;4941:79;;:::i;:::-;4903:119;5061:1;5086:53;5131:7;5122:6;5111:9;5107:22;5086:53;:::i;:::-;5076:63;;5032:117;5188:2;5214:53;5259:7;5250:6;5239:9;5235:22;5214:53;:::i;:::-;5204:63;;5159:118;4810:474;;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:116::-;5985:21;6000:5;5985:21;:::i;:::-;5978:5;5975:32;5965:60;;6021:1;6018;6011:12;5965:60;5915:116;:::o;6037:133::-;6080:5;6118:6;6105:20;6096:29;;6134:30;6158:5;6134:30;:::i;:::-;6037:133;;;;:::o;6176:323::-;6232:6;6281:2;6269:9;6260:7;6256:23;6252:32;6249:119;;;6287:79;;:::i;:::-;6249:119;6407:1;6432:50;6474:7;6465:6;6454:9;6450:22;6432:50;:::i;:::-;6422:60;;6378:114;6176:323;;;;:::o;6505:117::-;6614:1;6611;6604:12;6628:117;6737:1;6734;6727:12;6751:180;6799:77;6796:1;6789:88;6896:4;6893:1;6886:15;6920:4;6917:1;6910:15;6937:281;7020:27;7042:4;7020:27;:::i;:::-;7012:6;7008:40;7150:6;7138:10;7135:22;7114:18;7102:10;7099:34;7096:62;7093:88;;;7161:18;;:::i;:::-;7093:88;7201:10;7197:2;7190:22;6980:238;6937:281;;:::o;7224:129::-;7258:6;7285:20;;:::i;:::-;7275:30;;7314:33;7342:4;7334:6;7314:33;:::i;:::-;7224:129;;;:::o;7359:308::-;7421:4;7511:18;7503:6;7500:30;7497:56;;;7533:18;;:::i;:::-;7497:56;7571:29;7593:6;7571:29;:::i;:::-;7563:37;;7655:4;7649;7645:15;7637:23;;7359:308;;;:::o;7673:154::-;7757:6;7752:3;7747;7734:30;7819:1;7810:6;7805:3;7801:16;7794:27;7673:154;;;:::o;7833:412::-;7911:5;7936:66;7952:49;7994:6;7952:49;:::i;:::-;7936:66;:::i;:::-;7927:75;;8025:6;8018:5;8011:21;8063:4;8056:5;8052:16;8101:3;8092:6;8087:3;8083:16;8080:25;8077:112;;;8108:79;;:::i;:::-;8077:112;8198:41;8232:6;8227:3;8222;8198:41;:::i;:::-;7917:328;7833:412;;;;;:::o;8265:340::-;8321:5;8370:3;8363:4;8355:6;8351:17;8347:27;8337:122;;8378:79;;:::i;:::-;8337:122;8495:6;8482:20;8520:79;8595:3;8587:6;8580:4;8572:6;8568:17;8520:79;:::i;:::-;8511:88;;8327:278;8265:340;;;;:::o;8611:509::-;8680:6;8729:2;8717:9;8708:7;8704:23;8700:32;8697:119;;;8735:79;;:::i;:::-;8697:119;8883:1;8872:9;8868:17;8855:31;8913:18;8905:6;8902:30;8899:117;;;8935:79;;:::i;:::-;8899:117;9040:63;9095:7;9086:6;9075:9;9071:22;9040:63;:::i;:::-;9030:73;;8826:287;8611:509;;;;:::o;9126:329::-;9185:6;9234:2;9222:9;9213:7;9209:23;9205:32;9202:119;;;9240:79;;:::i;:::-;9202:119;9360:1;9385:53;9430:7;9421:6;9410:9;9406:22;9385:53;:::i;:::-;9375:63;;9331:117;9126:329;;;;:::o;9461:468::-;9526:6;9534;9583:2;9571:9;9562:7;9558:23;9554:32;9551:119;;;9589:79;;:::i;:::-;9551:119;9709:1;9734:53;9779:7;9770:6;9759:9;9755:22;9734:53;:::i;:::-;9724:63;;9680:117;9836:2;9862:50;9904:7;9895:6;9884:9;9880:22;9862:50;:::i;:::-;9852:60;;9807:115;9461:468;;;;;:::o;9935:307::-;9996:4;10086:18;10078:6;10075:30;10072:56;;;10108:18;;:::i;:::-;10072:56;10146:29;10168:6;10146:29;:::i;:::-;10138:37;;10230:4;10224;10220:15;10212:23;;9935:307;;;:::o;10248:410::-;10325:5;10350:65;10366:48;10407:6;10366:48;:::i;:::-;10350:65;:::i;:::-;10341:74;;10438:6;10431:5;10424:21;10476:4;10469:5;10465:16;10514:3;10505:6;10500:3;10496:16;10493:25;10490:112;;;10521:79;;:::i;:::-;10490:112;10611:41;10645:6;10640:3;10635;10611:41;:::i;:::-;10331:327;10248:410;;;;;:::o;10677:338::-;10732:5;10781:3;10774:4;10766:6;10762:17;10758:27;10748:122;;10789:79;;:::i;:::-;10748:122;10906:6;10893:20;10931:78;11005:3;10997:6;10990:4;10982:6;10978:17;10931:78;:::i;:::-;10922:87;;10738:277;10677:338;;;;:::o;11021:943::-;11116:6;11124;11132;11140;11189:3;11177:9;11168:7;11164:23;11160:33;11157:120;;;11196:79;;:::i;:::-;11157:120;11316:1;11341:53;11386:7;11377:6;11366:9;11362:22;11341:53;:::i;:::-;11331:63;;11287:117;11443:2;11469:53;11514:7;11505:6;11494:9;11490:22;11469:53;:::i;:::-;11459:63;;11414:118;11571:2;11597:53;11642:7;11633:6;11622:9;11618:22;11597:53;:::i;:::-;11587:63;;11542:118;11727:2;11716:9;11712:18;11699:32;11758:18;11750:6;11747:30;11744:117;;;11780:79;;:::i;:::-;11744:117;11885:62;11939:7;11930:6;11919:9;11915:22;11885:62;:::i;:::-;11875:72;;11670:287;11021:943;;;;;;;:::o;11970:474::-;12038:6;12046;12095:2;12083:9;12074:7;12070:23;12066:32;12063:119;;;12101:79;;:::i;:::-;12063:119;12221:1;12246:53;12291:7;12282:6;12271:9;12267:22;12246:53;:::i;:::-;12236:63;;12192:117;12348:2;12374:53;12419:7;12410:6;12399:9;12395:22;12374:53;:::i;:::-;12364:63;;12319:118;11970:474;;;;;:::o;12450:180::-;12498:77;12495:1;12488:88;12595:4;12592:1;12585:15;12619:4;12616:1;12609:15;12636:320;12680:6;12717:1;12711:4;12707:12;12697:22;;12764:1;12758:4;12754:12;12785:18;12775:81;;12841:4;12833:6;12829:17;12819:27;;12775:81;12903:2;12895:6;12892:14;12872:18;12869:38;12866:84;;12922:18;;:::i;:::-;12866:84;12687:269;12636:320;;;:::o;12962:182::-;13102:34;13098:1;13090:6;13086:14;13079:58;12962:182;:::o;13150:366::-;13292:3;13313:67;13377:2;13372:3;13313:67;:::i;:::-;13306:74;;13389:93;13478:3;13389:93;:::i;:::-;13507:2;13502:3;13498:12;13491:19;;13150:366;;;:::o;13522:419::-;13688:4;13726:2;13715:9;13711:18;13703:26;;13775:9;13769:4;13765:20;13761:1;13750:9;13746:17;13739:47;13803:131;13929:4;13803:131;:::i;:::-;13795:139;;13522:419;;;:::o;13947:181::-;14087:33;14083:1;14075:6;14071:14;14064:57;13947:181;:::o;14134:366::-;14276:3;14297:67;14361:2;14356:3;14297:67;:::i;:::-;14290:74;;14373:93;14462:3;14373:93;:::i;:::-;14491:2;14486:3;14482:12;14475:19;;14134:366;;;:::o;14506:419::-;14672:4;14710:2;14699:9;14695:18;14687:26;;14759:9;14753:4;14749:20;14745:1;14734:9;14730:17;14723:47;14787:131;14913:4;14787:131;:::i;:::-;14779:139;;14506:419;;;:::o;14931:141::-;14980:4;15003:3;14995:11;;15026:3;15023:1;15016:14;15060:4;15057:1;15047:18;15039:26;;14931:141;;;:::o;15078:93::-;15115:6;15162:2;15157;15150:5;15146:14;15142:23;15132:33;;15078:93;;;:::o;15177:107::-;15221:8;15271:5;15265:4;15261:16;15240:37;;15177:107;;;;:::o;15290:393::-;15359:6;15409:1;15397:10;15393:18;15432:97;15462:66;15451:9;15432:97;:::i;:::-;15550:39;15580:8;15569:9;15550:39;:::i;:::-;15538:51;;15622:4;15618:9;15611:5;15607:21;15598:30;;15671:4;15661:8;15657:19;15650:5;15647:30;15637:40;;15366:317;;15290:393;;;;;:::o;15689:60::-;15717:3;15738:5;15731:12;;15689:60;;;:::o;15755:142::-;15805:9;15838:53;15856:34;15865:24;15883:5;15865:24;:::i;:::-;15856:34;:::i;:::-;15838:53;:::i;:::-;15825:66;;15755:142;;;:::o;15903:75::-;15946:3;15967:5;15960:12;;15903:75;;;:::o;15984:269::-;16094:39;16125:7;16094:39;:::i;:::-;16155:91;16204:41;16228:16;16204:41;:::i;:::-;16196:6;16189:4;16183:11;16155:91;:::i;:::-;16149:4;16142:105;16060:193;15984:269;;;:::o;16259:73::-;16304:3;16259:73;:::o;16338:189::-;16415:32;;:::i;:::-;16456:65;16514:6;16506;16500:4;16456:65;:::i;:::-;16391:136;16338:189;;:::o;16533:186::-;16593:120;16610:3;16603:5;16600:14;16593:120;;;16664:39;16701:1;16694:5;16664:39;:::i;:::-;16637:1;16630:5;16626:13;16617:22;;16593:120;;;16533:186;;:::o;16725:543::-;16826:2;16821:3;16818:11;16815:446;;;16860:38;16892:5;16860:38;:::i;:::-;16944:29;16962:10;16944:29;:::i;:::-;16934:8;16930:44;17127:2;17115:10;17112:18;17109:49;;;17148:8;17133:23;;17109:49;17171:80;17227:22;17245:3;17227:22;:::i;:::-;17217:8;17213:37;17200:11;17171:80;:::i;:::-;16830:431;;16815:446;16725:543;;;:::o;17274:117::-;17328:8;17378:5;17372:4;17368:16;17347:37;;17274:117;;;;:::o;17397:169::-;17441:6;17474:51;17522:1;17518:6;17510:5;17507:1;17503:13;17474:51;:::i;:::-;17470:56;17555:4;17549;17545:15;17535:25;;17448:118;17397:169;;;;:::o;17571:295::-;17647:4;17793:29;17818:3;17812:4;17793:29;:::i;:::-;17785:37;;17855:3;17852:1;17848:11;17842:4;17839:21;17831:29;;17571:295;;;;:::o;17871:1395::-;17988:37;18021:3;17988:37;:::i;:::-;18090:18;18082:6;18079:30;18076:56;;;18112:18;;:::i;:::-;18076:56;18156:38;18188:4;18182:11;18156:38;:::i;:::-;18241:67;18301:6;18293;18287:4;18241:67;:::i;:::-;18335:1;18359:4;18346:17;;18391:2;18383:6;18380:14;18408:1;18403:618;;;;19065:1;19082:6;19079:77;;;19131:9;19126:3;19122:19;19116:26;19107:35;;19079:77;19182:67;19242:6;19235:5;19182:67;:::i;:::-;19176:4;19169:81;19038:222;18373:887;;18403:618;18455:4;18451:9;18443:6;18439:22;18489:37;18521:4;18489:37;:::i;:::-;18548:1;18562:208;18576:7;18573:1;18570:14;18562:208;;;18655:9;18650:3;18646:19;18640:26;18632:6;18625:42;18706:1;18698:6;18694:14;18684:24;;18753:2;18742:9;18738:18;18725:31;;18599:4;18596:1;18592:12;18587:17;;18562:208;;;18798:6;18789:7;18786:19;18783:179;;;18856:9;18851:3;18847:19;18841:26;18899:48;18941:4;18933:6;18929:17;18918:9;18899:48;:::i;:::-;18891:6;18884:64;18806:156;18783:179;19008:1;19004;18996:6;18992:14;18988:22;18982:4;18975:36;18410:611;;;18373:887;;17963:1303;;;17871:1395;;:::o;19272:166::-;19412:18;19408:1;19400:6;19396:14;19389:42;19272:166;:::o;19444:366::-;19586:3;19607:67;19671:2;19666:3;19607:67;:::i;:::-;19600:74;;19683:93;19772:3;19683:93;:::i;:::-;19801:2;19796:3;19792:12;19785:19;;19444:366;;;:::o;19816:419::-;19982:4;20020:2;20009:9;20005:18;19997:26;;20069:9;20063:4;20059:20;20055:1;20044:9;20040:17;20033:47;20097:131;20223:4;20097:131;:::i;:::-;20089:139;;19816:419;;;:::o;20241:180::-;20289:77;20286:1;20279:88;20386:4;20383:1;20376:15;20410:4;20407:1;20400:15;20427:305;20467:3;20486:20;20504:1;20486:20;:::i;:::-;20481:25;;20520:20;20538:1;20520:20;:::i;:::-;20515:25;;20674:1;20606:66;20602:74;20599:1;20596:81;20593:107;;;20680:18;;:::i;:::-;20593:107;20724:1;20721;20717:9;20710:16;;20427:305;;;;:::o;20738:162::-;20878:14;20874:1;20866:6;20862:14;20855:38;20738:162;:::o;20906:366::-;21048:3;21069:67;21133:2;21128:3;21069:67;:::i;:::-;21062:74;;21145:93;21234:3;21145:93;:::i;:::-;21263:2;21258:3;21254:12;21247:19;;20906:366;;;:::o;21278:419::-;21444:4;21482:2;21471:9;21467:18;21459:26;;21531:9;21525:4;21521:20;21517:1;21506:9;21502:17;21495:47;21559:131;21685:4;21559:131;:::i;:::-;21551:139;;21278:419;;;:::o;21703:348::-;21743:7;21766:20;21784:1;21766:20;:::i;:::-;21761:25;;21800:20;21818:1;21800:20;:::i;:::-;21795:25;;21988:1;21920:66;21916:74;21913:1;21910:81;21905:1;21898:9;21891:17;21887:105;21884:131;;;21995:18;;:::i;:::-;21884:131;22043:1;22040;22036:9;22025:20;;21703:348;;;;:::o;22057:174::-;22197:26;22193:1;22185:6;22181:14;22174:50;22057:174;:::o;22237:366::-;22379:3;22400:67;22464:2;22459:3;22400:67;:::i;:::-;22393:74;;22476:93;22565:3;22476:93;:::i;:::-;22594:2;22589:3;22585:12;22578:19;;22237:366;;;:::o;22609:419::-;22775:4;22813:2;22802:9;22798:18;22790:26;;22862:9;22856:4;22852:20;22848:1;22837:9;22833:17;22826:47;22890:131;23016:4;22890:131;:::i;:::-;22882:139;;22609:419;;;:::o;23034:221::-;23174:34;23170:1;23162:6;23158:14;23151:58;23243:4;23238:2;23230:6;23226:15;23219:29;23034:221;:::o;23261:366::-;23403:3;23424:67;23488:2;23483:3;23424:67;:::i;:::-;23417:74;;23500:93;23589:3;23500:93;:::i;:::-;23618:2;23613:3;23609:12;23602:19;;23261:366;;;:::o;23633:419::-;23799:4;23837:2;23826:9;23822:18;23814:26;;23886:9;23880:4;23876:20;23872:1;23861:9;23857:17;23850:47;23914:131;24040:4;23914:131;:::i;:::-;23906:139;;23633:419;;;:::o;24058:234::-;24198:34;24194:1;24186:6;24182:14;24175:58;24267:17;24262:2;24254:6;24250:15;24243:42;24058:234;:::o;24298:366::-;24440:3;24461:67;24525:2;24520:3;24461:67;:::i;:::-;24454:74;;24537:93;24626:3;24537:93;:::i;:::-;24655:2;24650:3;24646:12;24639:19;;24298:366;;;:::o;24670:419::-;24836:4;24874:2;24863:9;24859:18;24851:26;;24923:9;24917:4;24913:20;24909:1;24898:9;24894:17;24887:47;24951:131;25077:4;24951:131;:::i;:::-;24943:139;;24670:419;;;:::o;25095:148::-;25197:11;25234:3;25219:18;;25095:148;;;;:::o;25273:874::-;25376:3;25413:5;25407:12;25442:36;25468:9;25442:36;:::i;:::-;25494:89;25576:6;25571:3;25494:89;:::i;:::-;25487:96;;25614:1;25603:9;25599:17;25630:1;25625:166;;;;25805:1;25800:341;;;;25592:549;;25625:166;25709:4;25705:9;25694;25690:25;25685:3;25678:38;25771:6;25764:14;25757:22;25749:6;25745:35;25740:3;25736:45;25729:52;;25625:166;;25800:341;25867:38;25899:5;25867:38;:::i;:::-;25927:1;25941:154;25955:6;25952:1;25949:13;25941:154;;;26029:7;26023:14;26019:1;26014:3;26010:11;26003:35;26079:1;26070:7;26066:15;26055:26;;25977:4;25974:1;25970:12;25965:17;;25941:154;;;26124:6;26119:3;26115:16;26108:23;;25807:334;;25592:549;;25380:767;;25273:874;;;;:::o;26153:151::-;26293:3;26289:1;26281:6;26277:14;26270:27;26153:151;:::o;26310:400::-;26470:3;26491:84;26573:1;26568:3;26491:84;:::i;:::-;26484:91;;26584:93;26673:3;26584:93;:::i;:::-;26702:1;26697:3;26693:11;26686:18;;26310:400;;;:::o;26716:377::-;26822:3;26850:39;26883:5;26850:39;:::i;:::-;26905:89;26987:6;26982:3;26905:89;:::i;:::-;26898:96;;27003:52;27048:6;27043:3;27036:4;27029:5;27025:16;27003:52;:::i;:::-;27080:6;27075:3;27071:16;27064:23;;26826:267;26716:377;;;;:::o;27099:155::-;27239:7;27235:1;27227:6;27223:14;27216:31;27099:155;:::o;27260:400::-;27420:3;27441:84;27523:1;27518:3;27441:84;:::i;:::-;27434:91;;27534:93;27623:3;27534:93;:::i;:::-;27652:1;27647:3;27643:11;27636:18;;27260:400;;;:::o;27666:961::-;28045:3;28067:92;28155:3;28146:6;28067:92;:::i;:::-;28060:99;;28176:148;28320:3;28176:148;:::i;:::-;28169:155;;28341:95;28432:3;28423:6;28341:95;:::i;:::-;28334:102;;28453:148;28597:3;28453:148;:::i;:::-;28446:155;;28618:3;28611:10;;27666:961;;;;;:::o;28633:169::-;28773:21;28769:1;28761:6;28757:14;28750:45;28633:169;:::o;28808:366::-;28950:3;28971:67;29035:2;29030:3;28971:67;:::i;:::-;28964:74;;29047:93;29136:3;29047:93;:::i;:::-;29165:2;29160:3;29156:12;29149:19;;28808:366;;;:::o;29180:419::-;29346:4;29384:2;29373:9;29369:18;29361:26;;29433:9;29427:4;29423:20;29419:1;29408:9;29404:17;29397:47;29461:131;29587:4;29461:131;:::i;:::-;29453:139;;29180:419;;;:::o;29605:173::-;29745:25;29741:1;29733:6;29729:14;29722:49;29605:173;:::o;29784:366::-;29926:3;29947:67;30011:2;30006:3;29947:67;:::i;:::-;29940:74;;30023:93;30112:3;30023:93;:::i;:::-;30141:2;30136:3;30132:12;30125:19;;29784:366;;;:::o;30156:419::-;30322:4;30360:2;30349:9;30345:18;30337:26;;30409:9;30403:4;30399:20;30395:1;30384:9;30380:17;30373:47;30437:131;30563:4;30437:131;:::i;:::-;30429:139;;30156:419;;;:::o;30581:225::-;30721:34;30717:1;30709:6;30705:14;30698:58;30790:8;30785:2;30777:6;30773:15;30766:33;30581:225;:::o;30812:366::-;30954:3;30975:67;31039:2;31034:3;30975:67;:::i;:::-;30968:74;;31051:93;31140:3;31051:93;:::i;:::-;31169:2;31164:3;31160:12;31153:19;;30812:366;;;:::o;31184:419::-;31350:4;31388:2;31377:9;31373:18;31365:26;;31437:9;31431:4;31427:20;31423:1;31412:9;31408:17;31401:47;31465:131;31591:4;31465:131;:::i;:::-;31457:139;;31184:419;;;:::o;31609:179::-;31749:31;31745:1;31737:6;31733:14;31726:55;31609:179;:::o;31794:366::-;31936:3;31957:67;32021:2;32016:3;31957:67;:::i;:::-;31950:74;;32033:93;32122:3;32033:93;:::i;:::-;32151:2;32146:3;32142:12;32135:19;;31794:366;;;:::o;32166:419::-;32332:4;32370:2;32359:9;32355:18;32347:26;;32419:9;32413:4;32409:20;32405:1;32394:9;32390:17;32383:47;32447:131;32573:4;32447:131;:::i;:::-;32439:139;;32166:419;;;:::o;32591:147::-;32692:11;32729:3;32714:18;;32591:147;;;;:::o;32744:114::-;;:::o;32864:398::-;33023:3;33044:83;33125:1;33120:3;33044:83;:::i;:::-;33037:90;;33136:93;33225:3;33136:93;:::i;:::-;33254:1;33249:3;33245:11;33238:18;;32864:398;;;:::o;33268:379::-;33452:3;33474:147;33617:3;33474:147;:::i;:::-;33467:154;;33638:3;33631:10;;33268:379;;;:::o;33653:245::-;33793:34;33789:1;33781:6;33777:14;33770:58;33862:28;33857:2;33849:6;33845:15;33838:53;33653:245;:::o;33904:366::-;34046:3;34067:67;34131:2;34126:3;34067:67;:::i;:::-;34060:74;;34143:93;34232:3;34143:93;:::i;:::-;34261:2;34256:3;34252:12;34245:19;;33904:366;;;:::o;34276:419::-;34442:4;34480:2;34469:9;34465:18;34457:26;;34529:9;34523:4;34519:20;34515:1;34504:9;34500:17;34493:47;34557:131;34683:4;34557:131;:::i;:::-;34549:139;;34276:419;;;:::o;34701:98::-;34752:6;34786:5;34780:12;34770:22;;34701:98;;;:::o;34805:168::-;34888:11;34922:6;34917:3;34910:19;34962:4;34957:3;34953:14;34938:29;;34805:168;;;;:::o;34979:360::-;35065:3;35093:38;35125:5;35093:38;:::i;:::-;35147:70;35210:6;35205:3;35147:70;:::i;:::-;35140:77;;35226:52;35271:6;35266:3;35259:4;35252:5;35248:16;35226:52;:::i;:::-;35303:29;35325:6;35303:29;:::i;:::-;35298:3;35294:39;35287:46;;35069:270;34979:360;;;;:::o;35345:640::-;35540:4;35578:3;35567:9;35563:19;35555:27;;35592:71;35660:1;35649:9;35645:17;35636:6;35592:71;:::i;:::-;35673:72;35741:2;35730:9;35726:18;35717:6;35673:72;:::i;:::-;35755;35823:2;35812:9;35808:18;35799:6;35755:72;:::i;:::-;35874:9;35868:4;35864:20;35859:2;35848:9;35844:18;35837:48;35902:76;35973:4;35964:6;35902:76;:::i;:::-;35894:84;;35345:640;;;;;;;:::o;35991:141::-;36047:5;36078:6;36072:13;36063:22;;36094:32;36120:5;36094:32;:::i;:::-;35991:141;;;;:::o;36138:349::-;36207:6;36256:2;36244:9;36235:7;36231:23;36227:32;36224:119;;;36262:79;;:::i;:::-;36224:119;36382:1;36407:63;36462:7;36453:6;36442:9;36438:22;36407:63;:::i;:::-;36397:73;;36353:127;36138:349;;;;:::o;36493:233::-;36532:3;36555:24;36573:5;36555:24;:::i;:::-;36546:33;;36601:66;36594:5;36591:77;36588:103;;36671:18;;:::i;:::-;36588:103;36718:1;36711:5;36707:13;36700:20;;36493:233;;;:::o;36732:180::-;36780:77;36777:1;36770:88;36877:4;36874:1;36867:15;36901:4;36898:1;36891:15;36918:185;36958:1;36975:20;36993:1;36975:20;:::i;:::-;36970:25;;37009:20;37027:1;37009:20;:::i;:::-;37004:25;;37048:1;37038:35;;37053:18;;:::i;:::-;37038:35;37095:1;37092;37088:9;37083:14;;36918:185;;;;:::o;37109:191::-;37149:4;37169:20;37187:1;37169:20;:::i;:::-;37164:25;;37203:20;37221:1;37203:20;:::i;:::-;37198:25;;37242:1;37239;37236:8;37233:34;;;37247:18;;:::i;:::-;37233:34;37292:1;37289;37285:9;37277:17;;37109:191;;;;:::o;37306:176::-;37338:1;37355:20;37373:1;37355:20;:::i;:::-;37350:25;;37389:20;37407:1;37389:20;:::i;:::-;37384:25;;37428:1;37418:35;;37433:18;;:::i;:::-;37418:35;37474:1;37471;37467:9;37462:14;;37306:176;;;;:::o;37488:180::-;37536:77;37533:1;37526:88;37633:4;37630:1;37623:15;37657:4;37654:1;37647:15

Swarm Source

ipfs://5c2ab2015d18661f1062ef4f6ddd396813be15795008c7316d4de18a99595fed
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.