ETH Price: $3,112.75 (+1.45%)
Gas: 7 Gwei

Token

toadtown (TOAD)
 

Overview

Max Total Supply

1,721 TOAD

Holders

355

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
6 TOAD
0xdd432f8e76561361f3330d10a4f6a3aceafa75bf
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:
toadtownNFT

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@         @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@   @@@@@              .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@          @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  @@@@@ /@@@    @@@@@@@            @@   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@   @@@@@@@@@@@@@@@      @@@@@@@@@@@         @@@@@@        #@@@  @@@@@@@@      @@@@@   @@@@@@@@  @@@@  @@@@@@@@@    @@@@@@@  @@     @@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@  @@@@@@@@@@@@@    @@@    @@@@@@@@  @@@(@@   @@@@   @@@@@@   @   @@@@@@    @@@@@@@@   @@@@@@@@@   @@@   @@@@@@  @  @@@@@@   @@  @@    @@@@@@@@@@@@@@
//@@@@@@@@@@@@  @@@@@@@@@@      @@@@@@@@   @@@@   @@@@@@@@   @@/   @@@@@@@@  @  @@@@@@   .@@@@@@@@@  @@@@@@@@@  @@@@@  @@@@@@  @@  @@@@@ @@@@  @@@@@   @@@@@@@@@@@
//@@@@@@@@@@@  @@@@@@@@@@   @@@@@@@@@@@@   @@@@  @@@@@@@@@@  @@@    @@@@@@@@@  @@@@@@   @@@@@@@@@@@@  @@@@@@@   @@@@@@   @@@   @@@  @@@  @@@  @@@@@@@@  @@@@@@@@@
//@@@@@@@@@@@  @@@@@@@@@@@  @@@@@@@@@@@@  % @@@@   @@@@@@@@  @@@@@  @@@@@@    @@@@@@@@   @@@@@@@@@@@   @@@@@@  @@@@@@@@@@     @@@@@   @  @@@  @@@@@@@@@  @@@@@@@@
//@@@@@@@@@@@  @@@@@@@@@@@  @@@@@@@@@@@    @@@@@@@     @@  @   @@@    @@@    @@@@@@@@   @@@@@@@@@@@@@@       @@@@@@@@@@@@@@@  @@@@@@@   @@@@@  @@@@@@@@@   @@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@    @@@@@@@  &@@( @@@@@@@@      @@@  @@@@@      @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@           @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

// SPDX-License-Identifier: MIT

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: ECDSA.sol


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;


/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}
// File: 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: 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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
// File: Address.sol



pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private 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: Payment.sol


// OpenZeppelin Contracts v4.4.1 (finance/PaymentSplitter.sol)

pragma solidity ^0.8.0;



/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 *
 * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and
 * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you
 * to run tests before sending real value to this contract.
 */
contract Payment is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    constructor(address[] memory payees, uint256[] memory shares_) payable {
        require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch");
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint256 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }


    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }


    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function release(address payable account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = address(this).balance + totalReleased();
        uint256 payment = _pendingPayment(account, totalReceived, released(account));

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _released[account] += payment;
        _totalReleased += payment;

        Address.sendValue(account, payment);
        emit PaymentReleased(account, payment);
    }


    /**
     * @dev internal logic for computing the pending payment of an `account` given the token historical balances and
     * already released amounts.
     */
    function _pendingPayment(
        address account,
        uint256 totalReceived,
        uint256 alreadyReleased
    ) private view returns (uint256) {
        return (totalReceived * _shares[account]) / _totalShares - alreadyReleased;
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint256 shares_) private {
        require(account != address(0), "PaymentSplitter: account is the zero address");
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        require(_shares[account] == 0, "PaymentSplitter: account already has shares");

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }
}
// File: 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: 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: 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: 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: IERC721Enumerable.sol



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}
// File: 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: ERC721A.sol


pragma solidity ^0.8.0;









contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal currentIndex;

    // 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_;
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        require(index < totalSupply(), 'ERC721A: global index out of bounds');
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        require(index < balanceOf(owner), 'ERC721A: owner index out of bounds');
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        revert('ERC721A: unable to get token of owner by index');
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        require(owner != address(0), 'ERC721A: balance query for the zero address');
        return uint256(_addressData[owner].balance);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        require(owner != address(0), 'ERC721A: number minted query for the zero address');
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * 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) {
        require(_exists(tokenId), 'ERC721A: owner query for nonexistent token');

        unchecked {
            for (uint256 curr = tokenId; curr >= 0; curr--) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (ownership.addr != address(0)) {
                    return ownership;
                }
            }
        }

        revert('ERC721A: unable to determine the owner of token');
    }

    /**
     * @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) {
        require(_exists(tokenId), 'ERC721Metadata: URI query for nonexistent token');

        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);
        require(to != owner, 'ERC721A: approval to current owner');

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            'ERC721A: approve caller is not owner nor approved for all'
        );

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        require(_exists(tokenId), 'ERC721A: approved query for nonexistent token');

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        require(operator != _msgSender(), 'ERC721A: approve to caller');

        _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 override {
        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            'ERC721A: transfer to non ERC721Receiver implementer'
        );
    }

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

    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 {
        _mint(to, quantity, _data, true);
    }

    /**
     * @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,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), 'ERC721A: mint to the zero address');
        require(quantity != 0, 'ERC721A: quantity must be greater than 0');

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint128(quantity);
            _addressData[to].numberMinted += uint128(quantity);

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

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe) {
                    require(
                        _checkOnERC721Received(address(0), to, updatedIndex, _data),
                        'ERC721A: transfer to non ERC721Receiver implementer'
                    );
                }

                updatedIndex++;
            }

            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);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(isApprovedOrOwner, 'ERC721A: transfer caller is not owner nor approved');

        require(prevOwnership.addr == from, 'ERC721A: transfer from incorrect owner');
        require(to != address(0), 'ERC721A: transfer to the zero address');

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // 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;

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].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;
            if (_ownerships[nextTokenId].addr == address(0)) {
                if (_exists(nextTokenId)) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

    /**
     * @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 address.
     * The call is not executed if the target address is not a 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 _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            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('ERC721A: transfer to non ERC721Receiver implementer');
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * 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`.
     */
    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.
     *
     * 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` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

// 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;
    }
}


pragma solidity ^0.8.2;

contract toadtownNFT is ERC721A, Ownable, ReentrancyGuard {  
    using Strings for uint256;
    string public _partslink;
    string public baseExtension = ".json";
    bool public byebye = false;
    uint256 public cost = 0.005 ether;
    uint256 public toads = 5555;
    uint256 public toadbyebye = 1; 
    uint256 public toadMaxBuyPerTrip = 10;
    uint256 public toadMaxOwn = 20;

    mapping(address => uint256) public howmanytoaads;
    mapping(address => uint256) public howmanytoaadsbought;
   
	constructor() ERC721A("toadtown", "TOAD") {}

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

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        string memory currentBaseURI = _baseURI();
        return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension)) : "";
    }

 	function makintoaad() external nonReentrant {
  	    uint256 totaltoaads = totalSupply();
        require(byebye);
        require(totaltoaads + toadbyebye <= toads);
        require(msg.sender == tx.origin);
    	require(howmanytoaads[msg.sender] < toadbyebye);
        _safeMint(msg.sender, toadbyebye);
        howmanytoaads[msg.sender] += toadbyebye;
    }

    function buyintoaad(uint256 _mintAmount) public payable nonReentrant {
        uint256 totaltoaads = totalSupply();
        require(byebye);
        require(totaltoaads + _mintAmount <= toads);
        require(_mintAmount <= toadMaxBuyPerTrip);
        require(msg.sender == tx.origin);
        require(howmanytoaads[msg.sender] <= toadMaxOwn);
        require(msg.value >= cost * _mintAmount);
        _safeMint(msg.sender, _mintAmount);
        howmanytoaadsbought[msg.sender] += _mintAmount;
    }

    function setCost(uint256 _newCost) public onlyOwner {
        cost = _newCost;
    }

 	function maketoaadfly(address lords, uint256 _toads) public onlyOwner {
  	    uint256 totaltoaads = totalSupply();
	    require(totaltoaads + _toads <= toads);
        _safeMint(lords, _toads);
    }

    function maketoadgobyebye(bool _bye) external onlyOwner {
        byebye = _bye;
    }

    function spredtoaads(uint256 _byebye) external onlyOwner {
        toadbyebye = _byebye;
    }

    function maketoadhaveparts(string memory parts) external onlyOwner {
        _partslink = parts;
    }

    function sumthinboutfunds() public payable onlyOwner {
	(bool success, ) = payable(msg.sender).call{value: address(this).balance}("");
		require(success);
	}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"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":"_partslink","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"buyintoaad","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"byebye","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","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":"","type":"address"}],"name":"howmanytoaads","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"howmanytoaadsbought","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"address","name":"lords","type":"address"},{"internalType":"uint256","name":"_toads","type":"uint256"}],"name":"maketoaadfly","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_bye","type":"bool"}],"name":"maketoadgobyebye","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"parts","type":"string"}],"name":"maketoadhaveparts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"makintoaad","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_byebye","type":"uint256"}],"name":"spredtoaads","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sumthinboutfunds","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toadMaxBuyPerTrip","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toadMaxOwn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toadbyebye","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toads","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600a90805190602001906200005192919062000237565b506000600b60006101000a81548160ff0219169083151502179055506611c37937e08000600c556115b3600d556001600e55600a600f5560146010553480156200009a57600080fd5b506040518060400160405280600881526020017f746f6164746f776e0000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f544f41440000000000000000000000000000000000000000000000000000000081525081600190805190602001906200011f92919062000237565b5080600290805190602001906200013892919062000237565b5050506200015b6200014f6200016960201b60201c565b6200017160201b60201c565b60016008819055506200034c565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200024590620002e7565b90600052602060002090601f016020900481019282620002695760008555620002b5565b82601f106200028457805160ff1916838001178555620002b5565b82800160010185558215620002b5579182015b82811115620002b457825182559160200191906001019062000297565b5b509050620002c49190620002c8565b5090565b5b80821115620002e3576000816000905550600101620002c9565b5090565b600060028204905060018216806200030057607f821691505b602082108114156200031757620003166200031d565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614410806200035c6000396000f3fe60806040526004361061021a5760003560e01c80636352211e11610123578063a01ffdff116100ab578063c66828621161006f578063c6682862146107a5578063c87b56dd146107d0578063e985e9c51461080d578063f2fde38b1461084a578063f7304d2f146108735761021a565b8063a01ffdff146106d6578063a22cb46514610701578063accddc601461072a578063b4d932cb14610753578063b88d4fde1461077c5761021a565b80638da5cb5b116100f25780638da5cb5b146105ef57806395d89b411461061a5780639872a122146106455780639d4b50c4146106825780639dacbcbb146106ad5761021a565b80636352211e14610533578063636372f21461057057806370a082311461059b578063715018a6146105d85761021a565b80632f745c59116101a657806342842e0e1161017557806342842e0e1461045d578063439f4ecc1461048657806344a0d68a146104b15780634f6ccce7146104da578063571c2581146105175761021a565b80632f745c59146103c057806330ab1ff9146103fd5780633232deeb1461042857806333958a18146104535761021a565b806313faede6116101ed57806313faede6146102ed57806318160ddd1461031857806320ebe5921461034357806323b872dd1461035a5780632d00e33c146103835761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190613185565b61089c565b60405161025391906136f9565b60405180910390f35b34801561026857600080fd5b506102716109e6565b60405161027e9190613714565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a99190613218565b610a78565b6040516102bb9190613692565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e69190613120565b610afd565b005b3480156102f957600080fd5b50610302610c16565b60405161030f9190613996565b60405180910390f35b34801561032457600080fd5b5061032d610c1c565b60405161033a9190613996565b60405180910390f35b34801561034f57600080fd5b50610358610c25565b005b34801561036657600080fd5b50610381600480360381019061037c919061301a565b610da8565b005b34801561038f57600080fd5b506103aa60048036038101906103a59190612fb5565b610db8565b6040516103b79190613996565b60405180910390f35b3480156103cc57600080fd5b506103e760048036038101906103e29190613120565b610dd0565b6040516103f49190613996565b60405180910390f35b34801561040957600080fd5b50610412610fc2565b60405161041f9190613996565b60405180910390f35b34801561043457600080fd5b5061043d610fc8565b60405161044a9190613714565b60405180910390f35b61045b611056565b005b34801561046957600080fd5b50610484600480360381019061047f919061301a565b61114b565b005b34801561049257600080fd5b5061049b61116b565b6040516104a89190613996565b60405180910390f35b3480156104bd57600080fd5b506104d860048036038101906104d39190613218565b611171565b005b3480156104e657600080fd5b5061050160048036038101906104fc9190613218565b6111f7565b60405161050e9190613996565b60405180910390f35b610531600480360381019061052c9190613218565b61124a565b005b34801561053f57600080fd5b5061055a60048036038101906105559190613218565b6113f2565b6040516105679190613692565b60405180910390f35b34801561057c57600080fd5b50610585611408565b6040516105929190613996565b60405180910390f35b3480156105a757600080fd5b506105c260048036038101906105bd9190612fb5565b61140e565b6040516105cf9190613996565b60405180910390f35b3480156105e457600080fd5b506105ed6114f7565b005b3480156105fb57600080fd5b5061060461157f565b6040516106119190613692565b60405180910390f35b34801561062657600080fd5b5061062f6115a9565b60405161063c9190613714565b60405180910390f35b34801561065157600080fd5b5061066c60048036038101906106679190612fb5565b61163b565b6040516106799190613996565b60405180910390f35b34801561068e57600080fd5b50610697611653565b6040516106a49190613996565b60405180910390f35b3480156106b957600080fd5b506106d460048036038101906106cf9190613120565b611659565b005b3480156106e257600080fd5b506106eb61170a565b6040516106f891906136f9565b60405180910390f35b34801561070d57600080fd5b50610728600480360381019061072391906130e4565b61171d565b005b34801561073657600080fd5b50610751600480360381019061074c9190613218565b61189e565b005b34801561075f57600080fd5b5061077a6004803603810190610775919061315c565b611924565b005b34801561078857600080fd5b506107a3600480360381019061079e9190613069565b6119bd565b005b3480156107b157600080fd5b506107ba611a19565b6040516107c79190613714565b60405180910390f35b3480156107dc57600080fd5b506107f760048036038101906107f29190613218565b611aa7565b6040516108049190613714565b60405180910390f35b34801561081957600080fd5b50610834600480360381019061082f9190612fde565b611b09565b60405161084191906136f9565b60405180910390f35b34801561085657600080fd5b50610871600480360381019061086c9190612fb5565b611b9d565b005b34801561087f57600080fd5b5061089a600480360381019061089591906131d7565b611c95565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061096757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109cf57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109df57506109de82611d2b565b5b9050919050565b6060600180546109f590613c66565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2190613c66565b8015610a6e5780601f10610a4357610100808354040283529160200191610a6e565b820191906000526020600020905b815481529060010190602001808311610a5157829003601f168201915b5050505050905090565b6000610a8382611d95565b610ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab990613976565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b08826113f2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7090613896565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b98611da2565b73ffffffffffffffffffffffffffffffffffffffff161480610bc75750610bc681610bc1611da2565b611b09565b5b610c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfd906137d6565b60405180910390fd5b610c11838383611daa565b505050565b600c5481565b60008054905090565b60026008541415610c6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6290613936565b60405180910390fd5b60026008819055506000610c7d610c1c565b9050600b60009054906101000a900460ff16610c9857600080fd5b600d54600e5482610ca99190613a9b565b1115610cb457600080fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610cec57600080fd5b600e54601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410610d3957600080fd5b610d4533600e54611e5c565b600e54601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610d969190613a9b565b92505081905550506001600881905550565b610db3838383611e7a565b505050565b60116020528060005260406000206000915090505481565b6000610ddb8361140e565b8210610e1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1390613736565b60405180910390fd5b6000610e26610c1c565b905060008060005b83811015610f80576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610f2057806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f725786841415610f69578195505050505050610fbc565b83806001019450505b508080600101915050610e2e565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb390613916565b60405180910390fd5b92915050565b600f5481565b60098054610fd590613c66565b80601f016020809104026020016040519081016040528092919081815260200182805461100190613c66565b801561104e5780601f106110235761010080835404028352916020019161104e565b820191906000526020600020905b81548152906001019060200180831161103157829003601f168201915b505050505081565b61105e611da2565b73ffffffffffffffffffffffffffffffffffffffff1661107c61157f565b73ffffffffffffffffffffffffffffffffffffffff16146110d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c990613836565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16476040516110f89061367d565b60006040518083038185875af1925050503d8060008114611135576040519150601f19603f3d011682016040523d82523d6000602084013e61113a565b606091505b505090508061114857600080fd5b50565b611166838383604051806020016040528060008152506119bd565b505050565b600d5481565b611179611da2565b73ffffffffffffffffffffffffffffffffffffffff1661119761157f565b73ffffffffffffffffffffffffffffffffffffffff16146111ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e490613836565b60405180910390fd5b80600c8190555050565b6000611201610c1c565b8210611242576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123990613796565b60405180910390fd5b819050919050565b60026008541415611290576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128790613936565b60405180910390fd5b600260088190555060006112a2610c1c565b9050600b60009054906101000a900460ff166112bd57600080fd5b600d5482826112cc9190613a9b565b11156112d757600080fd5b600f548211156112e657600080fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461131e57600080fd5b601054601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561136c57600080fd5b81600c5461137a9190613b22565b34101561138657600080fd5b6113903383611e5c565b81601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113df9190613a9b565b9250508190555050600160088190555050565b60006113fd826123ba565b600001519050919050565b600e5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561147f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611476906137f6565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6114ff611da2565b73ffffffffffffffffffffffffffffffffffffffff1661151d61157f565b73ffffffffffffffffffffffffffffffffffffffff1614611573576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156a90613836565b60405180910390fd5b61157d6000612554565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546115b890613c66565b80601f01602080910402602001604051908101604052809291908181526020018280546115e490613c66565b80156116315780601f1061160657610100808354040283529160200191611631565b820191906000526020600020905b81548152906001019060200180831161161457829003601f168201915b5050505050905090565b60126020528060005260406000206000915090505481565b60105481565b611661611da2565b73ffffffffffffffffffffffffffffffffffffffff1661167f61157f565b73ffffffffffffffffffffffffffffffffffffffff16146116d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cc90613836565b60405180910390fd5b60006116df610c1c565b9050600d5482826116f09190613a9b565b11156116fb57600080fd5b6117058383611e5c565b505050565b600b60009054906101000a900460ff1681565b611725611da2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611793576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178a90613856565b60405180910390fd5b80600660006117a0611da2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661184d611da2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161189291906136f9565b60405180910390a35050565b6118a6611da2565b73ffffffffffffffffffffffffffffffffffffffff166118c461157f565b73ffffffffffffffffffffffffffffffffffffffff161461191a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191190613836565b60405180910390fd5b80600e8190555050565b61192c611da2565b73ffffffffffffffffffffffffffffffffffffffff1661194a61157f565b73ffffffffffffffffffffffffffffffffffffffff16146119a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199790613836565b60405180910390fd5b80600b60006101000a81548160ff02191690831515021790555050565b6119c8848484611e7a565b6119d48484848461261a565b611a13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0a906138b6565b60405180910390fd5b50505050565b600a8054611a2690613c66565b80601f0160208091040260200160405190810160405280929190818152602001828054611a5290613c66565b8015611a9f5780601f10611a7457610100808354040283529160200191611a9f565b820191906000526020600020905b815481529060010190602001808311611a8257829003601f168201915b505050505081565b60606000611ab36127b1565b90506000815111611ad35760405180602001604052806000815250611b01565b80611add84612843565b600a604051602001611af19392919061364c565b6040516020818303038152906040525b915050919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ba5611da2565b73ffffffffffffffffffffffffffffffffffffffff16611bc361157f565b73ffffffffffffffffffffffffffffffffffffffff1614611c19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1090613836565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8090613756565b60405180910390fd5b611c9281612554565b50565b611c9d611da2565b73ffffffffffffffffffffffffffffffffffffffff16611cbb61157f565b73ffffffffffffffffffffffffffffffffffffffff1614611d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0890613836565b60405180910390fd5b8060099080519060200190611d27929190612d9f565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b611e768282604051806020016040528060008152506129f0565b5050565b6000611e85826123ba565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611eac611da2565b73ffffffffffffffffffffffffffffffffffffffff161480611f085750611ed1611da2565b73ffffffffffffffffffffffffffffffffffffffff16611ef084610a78565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f245750611f238260000151611f1e611da2565b611b09565b5b905080611f66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5d90613876565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611fd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fcf90613816565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612048576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203f906137b6565b60405180910390fd5b6120558585856001612a02565b6120656000848460000151611daa565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561234a576122a981611d95565b156123495782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123b38585856001612a08565b5050505050565b6123c2612e25565b6123cb82611d95565b61240a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240190613776565b60405180910390fd5b60008290505b60008110612513576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461250457809250505061254f565b50808060019003915050612410565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254690613956565b60405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061263b8473ffffffffffffffffffffffffffffffffffffffff16612a0e565b156127a4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612664611da2565b8786866040518563ffffffff1660e01b815260040161268694939291906136ad565b602060405180830381600087803b1580156126a057600080fd5b505af19250505080156126d157506040513d601f19601f820116820180604052508101906126ce91906131ae565b60015b612754573d8060008114612701576040519150601f19603f3d011682016040523d82523d6000602084013e612706565b606091505b5060008151141561274c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612743906138b6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127a9565b600190505b949350505050565b6060600980546127c090613c66565b80601f01602080910402602001604051908101604052809291908181526020018280546127ec90613c66565b80156128395780601f1061280e57610100808354040283529160200191612839565b820191906000526020600020905b81548152906001019060200180831161281c57829003601f168201915b5050505050905090565b6060600082141561288b576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506129eb565b600082905060005b600082146128bd5780806128a690613cc9565b915050600a826128b69190613af1565b9150612893565b60008167ffffffffffffffff8111156128ff577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156129315781602001600182028036833780820191505090505b5090505b600085146129e45760018261294a9190613b7c565b9150600a856129599190613d12565b60306129659190613a9b565b60f81b8183815181106129a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129dd9190613af1565b9450612935565b8093505050505b919050565b6129fd8383836001612a21565b505050565b50505050565b50505050565b600080823b905060008111915050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612a97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8e906138d6565b60405180910390fd5b6000841415612adb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad2906138f6565b60405180910390fd5b612ae86000868387612a02565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015612d8257818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48315612d6d57612d2d600088848861261a565b612d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d63906138b6565b60405180910390fd5b5b81806001019250508080600101915050612cb6565b508060008190555050612d986000868387612a08565b5050505050565b828054612dab90613c66565b90600052602060002090601f016020900481019282612dcd5760008555612e14565b82601f10612de657805160ff1916838001178555612e14565b82800160010185558215612e14579182015b82811115612e13578251825591602001919060010190612df8565b5b509050612e219190612e5f565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115612e78576000816000905550600101612e60565b5090565b6000612e8f612e8a846139d6565b6139b1565b905082815260208101848484011115612ea757600080fd5b612eb2848285613c24565b509392505050565b6000612ecd612ec884613a07565b6139b1565b905082815260208101848484011115612ee557600080fd5b612ef0848285613c24565b509392505050565b600081359050612f078161437e565b92915050565b600081359050612f1c81614395565b92915050565b600081359050612f31816143ac565b92915050565b600081519050612f46816143ac565b92915050565b600082601f830112612f5d57600080fd5b8135612f6d848260208601612e7c565b91505092915050565b600082601f830112612f8757600080fd5b8135612f97848260208601612eba565b91505092915050565b600081359050612faf816143c3565b92915050565b600060208284031215612fc757600080fd5b6000612fd584828501612ef8565b91505092915050565b60008060408385031215612ff157600080fd5b6000612fff85828601612ef8565b925050602061301085828601612ef8565b9150509250929050565b60008060006060848603121561302f57600080fd5b600061303d86828701612ef8565b935050602061304e86828701612ef8565b925050604061305f86828701612fa0565b9150509250925092565b6000806000806080858703121561307f57600080fd5b600061308d87828801612ef8565b945050602061309e87828801612ef8565b93505060406130af87828801612fa0565b925050606085013567ffffffffffffffff8111156130cc57600080fd5b6130d887828801612f4c565b91505092959194509250565b600080604083850312156130f757600080fd5b600061310585828601612ef8565b925050602061311685828601612f0d565b9150509250929050565b6000806040838503121561313357600080fd5b600061314185828601612ef8565b925050602061315285828601612fa0565b9150509250929050565b60006020828403121561316e57600080fd5b600061317c84828501612f0d565b91505092915050565b60006020828403121561319757600080fd5b60006131a584828501612f22565b91505092915050565b6000602082840312156131c057600080fd5b60006131ce84828501612f37565b91505092915050565b6000602082840312156131e957600080fd5b600082013567ffffffffffffffff81111561320357600080fd5b61320f84828501612f76565b91505092915050565b60006020828403121561322a57600080fd5b600061323884828501612fa0565b91505092915050565b61324a81613bb0565b82525050565b61325981613bc2565b82525050565b600061326a82613a4d565b6132748185613a63565b9350613284818560208601613c33565b61328d81613dff565b840191505092915050565b60006132a382613a58565b6132ad8185613a7f565b93506132bd818560208601613c33565b6132c681613dff565b840191505092915050565b60006132dc82613a58565b6132e68185613a90565b93506132f6818560208601613c33565b80840191505092915050565b6000815461330f81613c66565b6133198186613a90565b94506001821660008114613334576001811461334557613378565b60ff19831686528186019350613378565b61334e85613a38565b60005b8381101561337057815481890152600182019150602081019050613351565b838801955050505b50505092915050565b600061338e602283613a7f565b915061339982613e10565b604082019050919050565b60006133b1602683613a7f565b91506133bc82613e5f565b604082019050919050565b60006133d4602a83613a7f565b91506133df82613eae565b604082019050919050565b60006133f7602383613a7f565b915061340282613efd565b604082019050919050565b600061341a602583613a7f565b915061342582613f4c565b604082019050919050565b600061343d603983613a7f565b915061344882613f9b565b604082019050919050565b6000613460602b83613a7f565b915061346b82613fea565b604082019050919050565b6000613483602683613a7f565b915061348e82614039565b604082019050919050565b60006134a6602083613a7f565b91506134b182614088565b602082019050919050565b60006134c9601a83613a7f565b91506134d4826140b1565b602082019050919050565b60006134ec603283613a7f565b91506134f7826140da565b604082019050919050565b600061350f602283613a7f565b915061351a82614129565b604082019050919050565b6000613532600083613a74565b915061353d82614178565b600082019050919050565b6000613555603383613a7f565b91506135608261417b565b604082019050919050565b6000613578602183613a7f565b9150613583826141ca565b604082019050919050565b600061359b602883613a7f565b91506135a682614219565b604082019050919050565b60006135be602e83613a7f565b91506135c982614268565b604082019050919050565b60006135e1601f83613a7f565b91506135ec826142b7565b602082019050919050565b6000613604602f83613a7f565b915061360f826142e0565b604082019050919050565b6000613627602d83613a7f565b91506136328261432f565b604082019050919050565b61364681613c1a565b82525050565b600061365882866132d1565b915061366482856132d1565b91506136708284613302565b9150819050949350505050565b600061368882613525565b9150819050919050565b60006020820190506136a76000830184613241565b92915050565b60006080820190506136c26000830187613241565b6136cf6020830186613241565b6136dc604083018561363d565b81810360608301526136ee818461325f565b905095945050505050565b600060208201905061370e6000830184613250565b92915050565b6000602082019050818103600083015261372e8184613298565b905092915050565b6000602082019050818103600083015261374f81613381565b9050919050565b6000602082019050818103600083015261376f816133a4565b9050919050565b6000602082019050818103600083015261378f816133c7565b9050919050565b600060208201905081810360008301526137af816133ea565b9050919050565b600060208201905081810360008301526137cf8161340d565b9050919050565b600060208201905081810360008301526137ef81613430565b9050919050565b6000602082019050818103600083015261380f81613453565b9050919050565b6000602082019050818103600083015261382f81613476565b9050919050565b6000602082019050818103600083015261384f81613499565b9050919050565b6000602082019050818103600083015261386f816134bc565b9050919050565b6000602082019050818103600083015261388f816134df565b9050919050565b600060208201905081810360008301526138af81613502565b9050919050565b600060208201905081810360008301526138cf81613548565b9050919050565b600060208201905081810360008301526138ef8161356b565b9050919050565b6000602082019050818103600083015261390f8161358e565b9050919050565b6000602082019050818103600083015261392f816135b1565b9050919050565b6000602082019050818103600083015261394f816135d4565b9050919050565b6000602082019050818103600083015261396f816135f7565b9050919050565b6000602082019050818103600083015261398f8161361a565b9050919050565b60006020820190506139ab600083018461363d565b92915050565b60006139bb6139cc565b90506139c78282613c98565b919050565b6000604051905090565b600067ffffffffffffffff8211156139f1576139f0613dd0565b5b6139fa82613dff565b9050602081019050919050565b600067ffffffffffffffff821115613a2257613a21613dd0565b5b613a2b82613dff565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613aa682613c1a565b9150613ab183613c1a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ae657613ae5613d43565b5b828201905092915050565b6000613afc82613c1a565b9150613b0783613c1a565b925082613b1757613b16613d72565b5b828204905092915050565b6000613b2d82613c1a565b9150613b3883613c1a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b7157613b70613d43565b5b828202905092915050565b6000613b8782613c1a565b9150613b9283613c1a565b925082821015613ba557613ba4613d43565b5b828203905092915050565b6000613bbb82613bfa565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613c51578082015181840152602081019050613c36565b83811115613c60576000848401525b50505050565b60006002820490506001821680613c7e57607f821691505b60208210811415613c9257613c91613da1565b5b50919050565b613ca182613dff565b810181811067ffffffffffffffff82111715613cc057613cbf613dd0565b5b80604052505050565b6000613cd482613c1a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d0757613d06613d43565b5b600182019050919050565b6000613d1d82613c1a565b9150613d2883613c1a565b925082613d3857613d37613d72565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b61438781613bb0565b811461439257600080fd5b50565b61439e81613bc2565b81146143a957600080fd5b50565b6143b581613bce565b81146143c057600080fd5b50565b6143cc81613c1a565b81146143d757600080fd5b5056fea2646970667358221220ca59cad0e7022e617218f7d35b5257be82128e3e0da9e5305ddcf3bc6955e02164736f6c63430008040033

Deployed Bytecode

0x60806040526004361061021a5760003560e01c80636352211e11610123578063a01ffdff116100ab578063c66828621161006f578063c6682862146107a5578063c87b56dd146107d0578063e985e9c51461080d578063f2fde38b1461084a578063f7304d2f146108735761021a565b8063a01ffdff146106d6578063a22cb46514610701578063accddc601461072a578063b4d932cb14610753578063b88d4fde1461077c5761021a565b80638da5cb5b116100f25780638da5cb5b146105ef57806395d89b411461061a5780639872a122146106455780639d4b50c4146106825780639dacbcbb146106ad5761021a565b80636352211e14610533578063636372f21461057057806370a082311461059b578063715018a6146105d85761021a565b80632f745c59116101a657806342842e0e1161017557806342842e0e1461045d578063439f4ecc1461048657806344a0d68a146104b15780634f6ccce7146104da578063571c2581146105175761021a565b80632f745c59146103c057806330ab1ff9146103fd5780633232deeb1461042857806333958a18146104535761021a565b806313faede6116101ed57806313faede6146102ed57806318160ddd1461031857806320ebe5921461034357806323b872dd1461035a5780632d00e33c146103835761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190613185565b61089c565b60405161025391906136f9565b60405180910390f35b34801561026857600080fd5b506102716109e6565b60405161027e9190613714565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a99190613218565b610a78565b6040516102bb9190613692565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e69190613120565b610afd565b005b3480156102f957600080fd5b50610302610c16565b60405161030f9190613996565b60405180910390f35b34801561032457600080fd5b5061032d610c1c565b60405161033a9190613996565b60405180910390f35b34801561034f57600080fd5b50610358610c25565b005b34801561036657600080fd5b50610381600480360381019061037c919061301a565b610da8565b005b34801561038f57600080fd5b506103aa60048036038101906103a59190612fb5565b610db8565b6040516103b79190613996565b60405180910390f35b3480156103cc57600080fd5b506103e760048036038101906103e29190613120565b610dd0565b6040516103f49190613996565b60405180910390f35b34801561040957600080fd5b50610412610fc2565b60405161041f9190613996565b60405180910390f35b34801561043457600080fd5b5061043d610fc8565b60405161044a9190613714565b60405180910390f35b61045b611056565b005b34801561046957600080fd5b50610484600480360381019061047f919061301a565b61114b565b005b34801561049257600080fd5b5061049b61116b565b6040516104a89190613996565b60405180910390f35b3480156104bd57600080fd5b506104d860048036038101906104d39190613218565b611171565b005b3480156104e657600080fd5b5061050160048036038101906104fc9190613218565b6111f7565b60405161050e9190613996565b60405180910390f35b610531600480360381019061052c9190613218565b61124a565b005b34801561053f57600080fd5b5061055a60048036038101906105559190613218565b6113f2565b6040516105679190613692565b60405180910390f35b34801561057c57600080fd5b50610585611408565b6040516105929190613996565b60405180910390f35b3480156105a757600080fd5b506105c260048036038101906105bd9190612fb5565b61140e565b6040516105cf9190613996565b60405180910390f35b3480156105e457600080fd5b506105ed6114f7565b005b3480156105fb57600080fd5b5061060461157f565b6040516106119190613692565b60405180910390f35b34801561062657600080fd5b5061062f6115a9565b60405161063c9190613714565b60405180910390f35b34801561065157600080fd5b5061066c60048036038101906106679190612fb5565b61163b565b6040516106799190613996565b60405180910390f35b34801561068e57600080fd5b50610697611653565b6040516106a49190613996565b60405180910390f35b3480156106b957600080fd5b506106d460048036038101906106cf9190613120565b611659565b005b3480156106e257600080fd5b506106eb61170a565b6040516106f891906136f9565b60405180910390f35b34801561070d57600080fd5b50610728600480360381019061072391906130e4565b61171d565b005b34801561073657600080fd5b50610751600480360381019061074c9190613218565b61189e565b005b34801561075f57600080fd5b5061077a6004803603810190610775919061315c565b611924565b005b34801561078857600080fd5b506107a3600480360381019061079e9190613069565b6119bd565b005b3480156107b157600080fd5b506107ba611a19565b6040516107c79190613714565b60405180910390f35b3480156107dc57600080fd5b506107f760048036038101906107f29190613218565b611aa7565b6040516108049190613714565b60405180910390f35b34801561081957600080fd5b50610834600480360381019061082f9190612fde565b611b09565b60405161084191906136f9565b60405180910390f35b34801561085657600080fd5b50610871600480360381019061086c9190612fb5565b611b9d565b005b34801561087f57600080fd5b5061089a600480360381019061089591906131d7565b611c95565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061096757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109cf57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109df57506109de82611d2b565b5b9050919050565b6060600180546109f590613c66565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2190613c66565b8015610a6e5780601f10610a4357610100808354040283529160200191610a6e565b820191906000526020600020905b815481529060010190602001808311610a5157829003601f168201915b5050505050905090565b6000610a8382611d95565b610ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab990613976565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b08826113f2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7090613896565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b98611da2565b73ffffffffffffffffffffffffffffffffffffffff161480610bc75750610bc681610bc1611da2565b611b09565b5b610c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfd906137d6565b60405180910390fd5b610c11838383611daa565b505050565b600c5481565b60008054905090565b60026008541415610c6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6290613936565b60405180910390fd5b60026008819055506000610c7d610c1c565b9050600b60009054906101000a900460ff16610c9857600080fd5b600d54600e5482610ca99190613a9b565b1115610cb457600080fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610cec57600080fd5b600e54601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410610d3957600080fd5b610d4533600e54611e5c565b600e54601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610d969190613a9b565b92505081905550506001600881905550565b610db3838383611e7a565b505050565b60116020528060005260406000206000915090505481565b6000610ddb8361140e565b8210610e1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1390613736565b60405180910390fd5b6000610e26610c1c565b905060008060005b83811015610f80576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610f2057806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f725786841415610f69578195505050505050610fbc565b83806001019450505b508080600101915050610e2e565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb390613916565b60405180910390fd5b92915050565b600f5481565b60098054610fd590613c66565b80601f016020809104026020016040519081016040528092919081815260200182805461100190613c66565b801561104e5780601f106110235761010080835404028352916020019161104e565b820191906000526020600020905b81548152906001019060200180831161103157829003601f168201915b505050505081565b61105e611da2565b73ffffffffffffffffffffffffffffffffffffffff1661107c61157f565b73ffffffffffffffffffffffffffffffffffffffff16146110d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c990613836565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16476040516110f89061367d565b60006040518083038185875af1925050503d8060008114611135576040519150601f19603f3d011682016040523d82523d6000602084013e61113a565b606091505b505090508061114857600080fd5b50565b611166838383604051806020016040528060008152506119bd565b505050565b600d5481565b611179611da2565b73ffffffffffffffffffffffffffffffffffffffff1661119761157f565b73ffffffffffffffffffffffffffffffffffffffff16146111ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e490613836565b60405180910390fd5b80600c8190555050565b6000611201610c1c565b8210611242576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123990613796565b60405180910390fd5b819050919050565b60026008541415611290576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128790613936565b60405180910390fd5b600260088190555060006112a2610c1c565b9050600b60009054906101000a900460ff166112bd57600080fd5b600d5482826112cc9190613a9b565b11156112d757600080fd5b600f548211156112e657600080fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461131e57600080fd5b601054601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561136c57600080fd5b81600c5461137a9190613b22565b34101561138657600080fd5b6113903383611e5c565b81601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113df9190613a9b565b9250508190555050600160088190555050565b60006113fd826123ba565b600001519050919050565b600e5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561147f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611476906137f6565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6114ff611da2565b73ffffffffffffffffffffffffffffffffffffffff1661151d61157f565b73ffffffffffffffffffffffffffffffffffffffff1614611573576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156a90613836565b60405180910390fd5b61157d6000612554565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546115b890613c66565b80601f01602080910402602001604051908101604052809291908181526020018280546115e490613c66565b80156116315780601f1061160657610100808354040283529160200191611631565b820191906000526020600020905b81548152906001019060200180831161161457829003601f168201915b5050505050905090565b60126020528060005260406000206000915090505481565b60105481565b611661611da2565b73ffffffffffffffffffffffffffffffffffffffff1661167f61157f565b73ffffffffffffffffffffffffffffffffffffffff16146116d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cc90613836565b60405180910390fd5b60006116df610c1c565b9050600d5482826116f09190613a9b565b11156116fb57600080fd5b6117058383611e5c565b505050565b600b60009054906101000a900460ff1681565b611725611da2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611793576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178a90613856565b60405180910390fd5b80600660006117a0611da2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661184d611da2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161189291906136f9565b60405180910390a35050565b6118a6611da2565b73ffffffffffffffffffffffffffffffffffffffff166118c461157f565b73ffffffffffffffffffffffffffffffffffffffff161461191a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191190613836565b60405180910390fd5b80600e8190555050565b61192c611da2565b73ffffffffffffffffffffffffffffffffffffffff1661194a61157f565b73ffffffffffffffffffffffffffffffffffffffff16146119a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199790613836565b60405180910390fd5b80600b60006101000a81548160ff02191690831515021790555050565b6119c8848484611e7a565b6119d48484848461261a565b611a13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0a906138b6565b60405180910390fd5b50505050565b600a8054611a2690613c66565b80601f0160208091040260200160405190810160405280929190818152602001828054611a5290613c66565b8015611a9f5780601f10611a7457610100808354040283529160200191611a9f565b820191906000526020600020905b815481529060010190602001808311611a8257829003601f168201915b505050505081565b60606000611ab36127b1565b90506000815111611ad35760405180602001604052806000815250611b01565b80611add84612843565b600a604051602001611af19392919061364c565b6040516020818303038152906040525b915050919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ba5611da2565b73ffffffffffffffffffffffffffffffffffffffff16611bc361157f565b73ffffffffffffffffffffffffffffffffffffffff1614611c19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1090613836565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8090613756565b60405180910390fd5b611c9281612554565b50565b611c9d611da2565b73ffffffffffffffffffffffffffffffffffffffff16611cbb61157f565b73ffffffffffffffffffffffffffffffffffffffff1614611d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0890613836565b60405180910390fd5b8060099080519060200190611d27929190612d9f565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b611e768282604051806020016040528060008152506129f0565b5050565b6000611e85826123ba565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611eac611da2565b73ffffffffffffffffffffffffffffffffffffffff161480611f085750611ed1611da2565b73ffffffffffffffffffffffffffffffffffffffff16611ef084610a78565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f245750611f238260000151611f1e611da2565b611b09565b5b905080611f66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5d90613876565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611fd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fcf90613816565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612048576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203f906137b6565b60405180910390fd5b6120558585856001612a02565b6120656000848460000151611daa565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561234a576122a981611d95565b156123495782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123b38585856001612a08565b5050505050565b6123c2612e25565b6123cb82611d95565b61240a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240190613776565b60405180910390fd5b60008290505b60008110612513576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461250457809250505061254f565b50808060019003915050612410565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254690613956565b60405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061263b8473ffffffffffffffffffffffffffffffffffffffff16612a0e565b156127a4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612664611da2565b8786866040518563ffffffff1660e01b815260040161268694939291906136ad565b602060405180830381600087803b1580156126a057600080fd5b505af19250505080156126d157506040513d601f19601f820116820180604052508101906126ce91906131ae565b60015b612754573d8060008114612701576040519150601f19603f3d011682016040523d82523d6000602084013e612706565b606091505b5060008151141561274c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612743906138b6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127a9565b600190505b949350505050565b6060600980546127c090613c66565b80601f01602080910402602001604051908101604052809291908181526020018280546127ec90613c66565b80156128395780601f1061280e57610100808354040283529160200191612839565b820191906000526020600020905b81548152906001019060200180831161281c57829003601f168201915b5050505050905090565b6060600082141561288b576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506129eb565b600082905060005b600082146128bd5780806128a690613cc9565b915050600a826128b69190613af1565b9150612893565b60008167ffffffffffffffff8111156128ff577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156129315781602001600182028036833780820191505090505b5090505b600085146129e45760018261294a9190613b7c565b9150600a856129599190613d12565b60306129659190613a9b565b60f81b8183815181106129a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129dd9190613af1565b9450612935565b8093505050505b919050565b6129fd8383836001612a21565b505050565b50505050565b50505050565b600080823b905060008111915050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612a97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8e906138d6565b60405180910390fd5b6000841415612adb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad2906138f6565b60405180910390fd5b612ae86000868387612a02565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015612d8257818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48315612d6d57612d2d600088848861261a565b612d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d63906138b6565b60405180910390fd5b5b81806001019250508080600101915050612cb6565b508060008190555050612d986000868387612a08565b5050505050565b828054612dab90613c66565b90600052602060002090601f016020900481019282612dcd5760008555612e14565b82601f10612de657805160ff1916838001178555612e14565b82800160010185558215612e14579182015b82811115612e13578251825591602001919060010190612df8565b5b509050612e219190612e5f565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115612e78576000816000905550600101612e60565b5090565b6000612e8f612e8a846139d6565b6139b1565b905082815260208101848484011115612ea757600080fd5b612eb2848285613c24565b509392505050565b6000612ecd612ec884613a07565b6139b1565b905082815260208101848484011115612ee557600080fd5b612ef0848285613c24565b509392505050565b600081359050612f078161437e565b92915050565b600081359050612f1c81614395565b92915050565b600081359050612f31816143ac565b92915050565b600081519050612f46816143ac565b92915050565b600082601f830112612f5d57600080fd5b8135612f6d848260208601612e7c565b91505092915050565b600082601f830112612f8757600080fd5b8135612f97848260208601612eba565b91505092915050565b600081359050612faf816143c3565b92915050565b600060208284031215612fc757600080fd5b6000612fd584828501612ef8565b91505092915050565b60008060408385031215612ff157600080fd5b6000612fff85828601612ef8565b925050602061301085828601612ef8565b9150509250929050565b60008060006060848603121561302f57600080fd5b600061303d86828701612ef8565b935050602061304e86828701612ef8565b925050604061305f86828701612fa0565b9150509250925092565b6000806000806080858703121561307f57600080fd5b600061308d87828801612ef8565b945050602061309e87828801612ef8565b93505060406130af87828801612fa0565b925050606085013567ffffffffffffffff8111156130cc57600080fd5b6130d887828801612f4c565b91505092959194509250565b600080604083850312156130f757600080fd5b600061310585828601612ef8565b925050602061311685828601612f0d565b9150509250929050565b6000806040838503121561313357600080fd5b600061314185828601612ef8565b925050602061315285828601612fa0565b9150509250929050565b60006020828403121561316e57600080fd5b600061317c84828501612f0d565b91505092915050565b60006020828403121561319757600080fd5b60006131a584828501612f22565b91505092915050565b6000602082840312156131c057600080fd5b60006131ce84828501612f37565b91505092915050565b6000602082840312156131e957600080fd5b600082013567ffffffffffffffff81111561320357600080fd5b61320f84828501612f76565b91505092915050565b60006020828403121561322a57600080fd5b600061323884828501612fa0565b91505092915050565b61324a81613bb0565b82525050565b61325981613bc2565b82525050565b600061326a82613a4d565b6132748185613a63565b9350613284818560208601613c33565b61328d81613dff565b840191505092915050565b60006132a382613a58565b6132ad8185613a7f565b93506132bd818560208601613c33565b6132c681613dff565b840191505092915050565b60006132dc82613a58565b6132e68185613a90565b93506132f6818560208601613c33565b80840191505092915050565b6000815461330f81613c66565b6133198186613a90565b94506001821660008114613334576001811461334557613378565b60ff19831686528186019350613378565b61334e85613a38565b60005b8381101561337057815481890152600182019150602081019050613351565b838801955050505b50505092915050565b600061338e602283613a7f565b915061339982613e10565b604082019050919050565b60006133b1602683613a7f565b91506133bc82613e5f565b604082019050919050565b60006133d4602a83613a7f565b91506133df82613eae565b604082019050919050565b60006133f7602383613a7f565b915061340282613efd565b604082019050919050565b600061341a602583613a7f565b915061342582613f4c565b604082019050919050565b600061343d603983613a7f565b915061344882613f9b565b604082019050919050565b6000613460602b83613a7f565b915061346b82613fea565b604082019050919050565b6000613483602683613a7f565b915061348e82614039565b604082019050919050565b60006134a6602083613a7f565b91506134b182614088565b602082019050919050565b60006134c9601a83613a7f565b91506134d4826140b1565b602082019050919050565b60006134ec603283613a7f565b91506134f7826140da565b604082019050919050565b600061350f602283613a7f565b915061351a82614129565b604082019050919050565b6000613532600083613a74565b915061353d82614178565b600082019050919050565b6000613555603383613a7f565b91506135608261417b565b604082019050919050565b6000613578602183613a7f565b9150613583826141ca565b604082019050919050565b600061359b602883613a7f565b91506135a682614219565b604082019050919050565b60006135be602e83613a7f565b91506135c982614268565b604082019050919050565b60006135e1601f83613a7f565b91506135ec826142b7565b602082019050919050565b6000613604602f83613a7f565b915061360f826142e0565b604082019050919050565b6000613627602d83613a7f565b91506136328261432f565b604082019050919050565b61364681613c1a565b82525050565b600061365882866132d1565b915061366482856132d1565b91506136708284613302565b9150819050949350505050565b600061368882613525565b9150819050919050565b60006020820190506136a76000830184613241565b92915050565b60006080820190506136c26000830187613241565b6136cf6020830186613241565b6136dc604083018561363d565b81810360608301526136ee818461325f565b905095945050505050565b600060208201905061370e6000830184613250565b92915050565b6000602082019050818103600083015261372e8184613298565b905092915050565b6000602082019050818103600083015261374f81613381565b9050919050565b6000602082019050818103600083015261376f816133a4565b9050919050565b6000602082019050818103600083015261378f816133c7565b9050919050565b600060208201905081810360008301526137af816133ea565b9050919050565b600060208201905081810360008301526137cf8161340d565b9050919050565b600060208201905081810360008301526137ef81613430565b9050919050565b6000602082019050818103600083015261380f81613453565b9050919050565b6000602082019050818103600083015261382f81613476565b9050919050565b6000602082019050818103600083015261384f81613499565b9050919050565b6000602082019050818103600083015261386f816134bc565b9050919050565b6000602082019050818103600083015261388f816134df565b9050919050565b600060208201905081810360008301526138af81613502565b9050919050565b600060208201905081810360008301526138cf81613548565b9050919050565b600060208201905081810360008301526138ef8161356b565b9050919050565b6000602082019050818103600083015261390f8161358e565b9050919050565b6000602082019050818103600083015261392f816135b1565b9050919050565b6000602082019050818103600083015261394f816135d4565b9050919050565b6000602082019050818103600083015261396f816135f7565b9050919050565b6000602082019050818103600083015261398f8161361a565b9050919050565b60006020820190506139ab600083018461363d565b92915050565b60006139bb6139cc565b90506139c78282613c98565b919050565b6000604051905090565b600067ffffffffffffffff8211156139f1576139f0613dd0565b5b6139fa82613dff565b9050602081019050919050565b600067ffffffffffffffff821115613a2257613a21613dd0565b5b613a2b82613dff565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613aa682613c1a565b9150613ab183613c1a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ae657613ae5613d43565b5b828201905092915050565b6000613afc82613c1a565b9150613b0783613c1a565b925082613b1757613b16613d72565b5b828204905092915050565b6000613b2d82613c1a565b9150613b3883613c1a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b7157613b70613d43565b5b828202905092915050565b6000613b8782613c1a565b9150613b9283613c1a565b925082821015613ba557613ba4613d43565b5b828203905092915050565b6000613bbb82613bfa565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613c51578082015181840152602081019050613c36565b83811115613c60576000848401525b50505050565b60006002820490506001821680613c7e57607f821691505b60208210811415613c9257613c91613da1565b5b50919050565b613ca182613dff565b810181811067ffffffffffffffff82111715613cc057613cbf613dd0565b5b80604052505050565b6000613cd482613c1a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d0757613d06613d43565b5b600182019050919050565b6000613d1d82613c1a565b9150613d2883613c1a565b925082613d3857613d37613d72565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b61438781613bb0565b811461439257600080fd5b50565b61439e81613bc2565b81146143a957600080fd5b50565b6143b581613bce565b81146143c057600080fd5b50565b6143cc81613c1a565b81146143d757600080fd5b5056fea2646970667358221220ca59cad0e7022e617218f7d35b5257be82128e3e0da9e5305ddcf3bc6955e02164736f6c63430008040033

Deployed Bytecode Sourcemap

58636:2650:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42791:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44677:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46239:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45760:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58843:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41048:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59613:368;;;;;;;;;;;;;:::i;:::-;;47115:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59037:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41712:1007;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58954:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58735:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61123:160;;;:::i;:::-;;47348:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58883:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60507:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41225:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59989:510;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44486:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58917:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43227:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16378:94;;;;;;;;;;;;;:::i;:::-;;15727:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44846:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59092:54;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58998:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60599:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58810:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46525:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60907:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60811:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47596:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58766:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59326:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46884:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16627:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61011:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42791:372;42893:4;42945:25;42930:40;;;:11;:40;;;;:105;;;;43002:33;42987:48;;;:11;:48;;;;42930:105;:172;;;;43067:35;43052:50;;;:11;:50;;;;42930:172;:225;;;;43119:36;43143:11;43119:23;:36::i;:::-;42930:225;42910:245;;42791:372;;;:::o;44677:100::-;44731:13;44764:5;44757:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44677:100;:::o;46239:214::-;46307:7;46335:16;46343:7;46335;:16::i;:::-;46327:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;46421:15;:24;46437:7;46421:24;;;;;;;;;;;;;;;;;;;;;46414:31;;46239:214;;;:::o;45760:413::-;45833:13;45849:24;45865:7;45849:15;:24::i;:::-;45833:40;;45898:5;45892:11;;:2;:11;;;;45884:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;45993:5;45977:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;46002:37;46019:5;46026:12;:10;:12::i;:::-;46002:16;:37::i;:::-;45977:62;45955:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;46137:28;46146:2;46150:7;46159:5;46137:8;:28::i;:::-;45760:413;;;:::o;58843:33::-;;;;:::o;41048:100::-;41101:7;41128:12;;41121:19;;41048:100;:::o;59613:368::-;57660:1;58258:7;;:19;;58250:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;57660:1;58391:7;:18;;;;59667:19:::1;59689:13;:11;:13::i;:::-;59667:35;;59721:6;;;;;;;;;;;59713:15;;;::::0;::::1;;59775:5;;59761:10;;59747:11;:24;;;;:::i;:::-;:33;;59739:42;;;::::0;::::1;;59814:9;59800:23;;:10;:23;;;59792:32;;;::::0;::::1;;59868:10;;59840:13;:25;59854:10;59840:25;;;;;;;;;;;;;;;;:38;59832:47;;;::::0;::::1;;59890:33;59900:10;59912;;59890:9;:33::i;:::-;59963:10;;59934:13;:25;59948:10;59934:25;;;;;;;;;;;;;;;;:39;;;;;;;:::i;:::-;;;;;;;;58422:1;57616::::0;58570:7;:22;;;;59613:368::o;47115:162::-;47241:28;47251:4;47257:2;47261:7;47241:9;:28::i;:::-;47115:162;;;:::o;59037:48::-;;;;;;;;;;;;;;;;;:::o;41712:1007::-;41801:7;41837:16;41847:5;41837:9;:16::i;:::-;41829:5;:24;41821:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;41903:22;41928:13;:11;:13::i;:::-;41903:38;;41952:19;41982:25;42171:9;42166:466;42186:14;42182:1;:18;42166:466;;;42226:31;42260:11;:14;42272:1;42260:14;;;;;;;;;;;42226:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42323:1;42297:28;;:9;:14;;;:28;;;42293:111;;42370:9;:14;;;42350:34;;42293:111;42447:5;42426:26;;:17;:26;;;42422:195;;;42496:5;42481:11;:20;42477:85;;;42537:1;42530:8;;;;;;;;;42477:85;42584:13;;;;;;;42422:195;42166:466;42202:3;;;;;;;42166:466;;;;42655:56;;;;;;;;;;:::i;:::-;;;;;;;;41712:1007;;;;;:::o;58954:37::-;;;;:::o;58735:24::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;61123:160::-;15958:12;:10;:12::i;:::-;15947:23;;:7;:5;:7::i;:::-;:23;;;15939:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61181:12:::1;61207:10;61199:24;;61231:21;61199:58;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61180:77;;;61270:7;61262:16;;;::::0;::::1;;16018:1;61123:160::o:0;47348:177::-;47478:39;47495:4;47501:2;47505:7;47478:39;;;;;;;;;;;;:16;:39::i;:::-;47348:177;;;:::o;58883:27::-;;;;:::o;60507:86::-;15958:12;:10;:12::i;:::-;15947:23;;:7;:5;:7::i;:::-;:23;;;15939:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60577:8:::1;60570:4;:15;;;;60507:86:::0;:::o;41225:187::-;41292:7;41328:13;:11;:13::i;:::-;41320:5;:21;41312:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;41399:5;41392:12;;41225:187;;;:::o;59989:510::-;57660:1;58258:7;;:19;;58250:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;57660:1;58391:7;:18;;;;60069:19:::1;60091:13;:11;:13::i;:::-;60069:35;;60123:6;;;;;;;;;;;60115:15;;;::::0;::::1;;60178:5;;60163:11;60149;:25;;;;:::i;:::-;:34;;60141:43;;;::::0;::::1;;60218:17;;60203:11;:32;;60195:41;;;::::0;::::1;;60269:9;60255:23;;:10;:23;;;60247:32;;;::::0;::::1;;60327:10;;60298:13;:25;60312:10;60298:25;;;;;;;;;;;;;;;;:39;;60290:48;;;::::0;::::1;;60377:11;60370:4;;:18;;;;:::i;:::-;60357:9;:31;;60349:40;;;::::0;::::1;;60400:34;60410:10;60422:11;60400:9;:34::i;:::-;60480:11;60445:19;:31;60465:10;60445:31;;;;;;;;;;;;;;;;:46;;;;;;;:::i;:::-;;;;;;;;58422:1;57616::::0;58570:7;:22;;;;59989:510;:::o;44486:124::-;44550:7;44577:20;44589:7;44577:11;:20::i;:::-;:25;;;44570:32;;44486:124;;;:::o;58917:29::-;;;;:::o;43227:221::-;43291:7;43336:1;43319:19;;:5;:19;;;;43311:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;43412:12;:19;43425:5;43412:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;43404:36;;43397:43;;43227:221;;;:::o;16378:94::-;15958:12;:10;:12::i;:::-;15947:23;;:7;:5;:7::i;:::-;:23;;;15939:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16443:21:::1;16461:1;16443:9;:21::i;:::-;16378:94::o:0;15727:87::-;15773:7;15800:6;;;;;;;;;;;15793:13;;15727:87;:::o;44846:104::-;44902:13;44935:7;44928:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44846:104;:::o;59092:54::-;;;;;;;;;;;;;;;;;:::o;58998:30::-;;;;:::o;60599:204::-;15958:12;:10;:12::i;:::-;15947:23;;:7;:5;:7::i;:::-;:23;;;15939:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60679:19:::1;60701:13;:11;:13::i;:::-;60679:35;;60754:5;;60744:6;60730:11;:20;;;;:::i;:::-;:29;;60722:38;;;::::0;::::1;;60771:24;60781:5;60788:6;60771:9;:24::i;:::-;16018:1;60599:204:::0;;:::o;58810:26::-;;;;;;;;;;;;;:::o;46525:288::-;46632:12;:10;:12::i;:::-;46620:24;;:8;:24;;;;46612:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;46733:8;46688:18;:32;46707:12;:10;:12::i;:::-;46688:32;;;;;;;;;;;;;;;:42;46721:8;46688:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;46786:8;46757:48;;46772:12;:10;:12::i;:::-;46757:48;;;46796:8;46757:48;;;;;;:::i;:::-;;;;;;;;46525:288;;:::o;60907:96::-;15958:12;:10;:12::i;:::-;15947:23;;:7;:5;:7::i;:::-;:23;;;15939:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60988:7:::1;60975:10;:20;;;;60907:96:::0;:::o;60811:88::-;15958:12;:10;:12::i;:::-;15947:23;;:7;:5;:7::i;:::-;:23;;;15939:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60887:4:::1;60878:6;;:13;;;;;;;;;;;;;;;;;;60811:88:::0;:::o;47596:355::-;47755:28;47765:4;47771:2;47775:7;47755:9;:28::i;:::-;47816:48;47839:4;47845:2;47849:7;47858:5;47816:22;:48::i;:::-;47794:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;47596:355;;;;:::o;58766:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;59326:281::-;59399:13;59425:28;59456:10;:8;:10::i;:::-;59425:41;;59515:1;59490:14;59484:28;:32;:115;;;;;;;;;;;;;;;;;59543:14;59559:18;:7;:16;:18::i;:::-;59579:13;59526:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59484:115;59477:122;;;59326:281;;;:::o;46884:164::-;46981:4;47005:18;:25;47024:5;47005:25;;;;;;;;;;;;;;;:35;47031:8;47005:35;;;;;;;;;;;;;;;;;;;;;;;;;46998:42;;46884:164;;;;:::o;16627:192::-;15958:12;:10;:12::i;:::-;15947:23;;:7;:5;:7::i;:::-;:23;;;15939:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16736:1:::1;16716:22;;:8;:22;;;;16708:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;16792:19;16802:8;16792:9;:19::i;:::-;16627:192:::0;:::o;61011:104::-;15958:12;:10;:12::i;:::-;15947:23;;:7;:5;:7::i;:::-;:23;;;15939:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61102:5:::1;61089:10;:18;;;;;;;;;;;;:::i;:::-;;61011:104:::0;:::o;33179:157::-;33264:4;33303:25;33288:40;;;:11;:40;;;;33281:47;;33179:157;;;:::o;48206:111::-;48263:4;48297:12;;48287:7;:22;48280:29;;48206:111;;;:::o;14548:98::-;14601:7;14628:10;14621:17;;14548:98;:::o;53126:196::-;53268:2;53241:15;:24;53257:7;53241:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;53306:7;53302:2;53286:28;;53295:5;53286:28;;;;;;;;;;;;53126:196;;;:::o;48325:104::-;48394:27;48404:2;48408:8;48394:27;;;;;;;;;;;;:9;:27::i;:::-;48325:104;;:::o;51006:2002::-;51121:35;51159:20;51171:7;51159:11;:20::i;:::-;51121:58;;51192:22;51234:13;:18;;;51218:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;51293:12;:10;:12::i;:::-;51269:36;;:20;51281:7;51269:11;:20::i;:::-;:36;;;51218:87;:154;;;;51322:50;51339:13;:18;;;51359:12;:10;:12::i;:::-;51322:16;:50::i;:::-;51218:154;51192:181;;51394:17;51386:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;51509:4;51487:26;;:13;:18;;;:26;;;51479:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;51589:1;51575:16;;:2;:16;;;;51567:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;51646:43;51668:4;51674:2;51678:7;51687:1;51646:21;:43::i;:::-;51754:49;51771:1;51775:7;51784:13;:18;;;51754:8;:49::i;:::-;52129:1;52099:12;:18;52112:4;52099:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52173:1;52145:12;:16;52158:2;52145:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52219:2;52191:11;:20;52203:7;52191:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;52281:15;52236:11;:20;52248:7;52236:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;52549:19;52581:1;52571:7;:11;52549:33;;52642:1;52601:43;;:11;:24;52613:11;52601:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;52597:295;;;52669:20;52677:11;52669:7;:20::i;:::-;52665:212;;;52746:13;:18;;;52714:11;:24;52726:11;52714:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;52829:13;:28;;;52787:11;:24;52799:11;52787:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;52665:212;52597:295;51006:2002;52939:7;52935:2;52920:27;;52929:4;52920:27;;;;;;;;;;;;52958:42;52979:4;52985:2;52989:7;52998:1;52958:20;:42::i;:::-;51006:2002;;;;;:::o;43887:537::-;43948:21;;:::i;:::-;43990:16;43998:7;43990;:16::i;:::-;43982:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;44096:12;44111:7;44096:22;;44091:245;44128:1;44120:4;:9;44091:245;;44158:31;44192:11;:17;44204:4;44192:17;;;;;;;;;;;44158:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44258:1;44232:28;;:9;:14;;;:28;;;44228:93;;44292:9;44285:16;;;;;;44228:93;44091:245;44131:6;;;;;;;;44091:245;;;;44359:57;;;;;;;;;;:::i;:::-;;;;;;;;43887:537;;;;:::o;16827:173::-;16883:16;16902:6;;;;;;;;;;;16883:25;;16928:8;16919:6;;:17;;;;;;;;;;;;;;;;;;16983:8;16952:40;;16973:8;16952:40;;;;;;;;;;;;16827:173;;:::o;53887:804::-;54042:4;54063:15;:2;:13;;;:15::i;:::-;54059:625;;;54115:2;54099:36;;;54136:12;:10;:12::i;:::-;54150:4;54156:7;54165:5;54099:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;54095:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54362:1;54345:6;:13;:18;54341:273;;;54388:61;;;;;;;;;;:::i;:::-;;;;;;;;54341:273;54564:6;54558:13;54549:6;54545:2;54541:15;54534:38;54095:534;54232:45;;;54222:55;;;:6;:55;;;;54215:62;;;;;54059:625;54668:4;54661:11;;53887:804;;;;;;;:::o;59207:111::-;59267:13;59300:10;59293:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59207:111;:::o;2722:723::-;2778:13;3008:1;2999:5;:10;2995:53;;;3026:10;;;;;;;;;;;;;;;;;;;;;2995:53;3058:12;3073:5;3058:20;;3089:14;3114:78;3129:1;3121:4;:9;3114:78;;3147:8;;;;;:::i;:::-;;;;3178:2;3170:10;;;;;:::i;:::-;;;3114:78;;;3202:19;3234:6;3224:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3202:39;;3252:154;3268:1;3259:5;:10;3252:154;;3296:1;3286:11;;;;;:::i;:::-;;;3363:2;3355:5;:10;;;;:::i;:::-;3342:2;:24;;;;:::i;:::-;3329:39;;3312:6;3319;3312:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;3392:2;3383:11;;;;;:::i;:::-;;;3252:154;;;3430:6;3416:21;;;;;2722:723;;;;:::o;48792:163::-;48915:32;48921:2;48925:8;48935:5;48942:4;48915:5;:32::i;:::-;48792:163;;;:::o;55179:159::-;;;;;:::o;55750:158::-;;;;;:::o;17741:387::-;17801:4;18009:12;18076:7;18064:20;18056:28;;18119:1;18112:4;:8;18105:15;;;17741:387;;;:::o;49214:1538::-;49353:20;49376:12;;49353:35;;49421:1;49407:16;;:2;:16;;;;49399:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;49492:1;49480:8;:13;;49472:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;49551:61;49581:1;49585:2;49589:12;49603:8;49551:21;:61::i;:::-;49926:8;49890:12;:16;49903:2;49890:16;;;;;;;;;;;;;;;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49991:8;49950:12;:16;49963:2;49950:16;;;;;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50050:2;50017:11;:25;50029:12;50017:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;50117:15;50067:11;:25;50079:12;50067:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;50150:20;50173:12;50150:35;;50207:9;50202:415;50222:8;50218:1;:12;50202:415;;;50286:12;50282:2;50261:38;;50278:1;50261:38;;;;;;;;;;;;50322:4;50318:249;;;50385:59;50416:1;50420:2;50424:12;50438:5;50385:22;:59::i;:::-;50351:196;;;;;;;;;;;;:::i;:::-;;;;;;;;;50318:249;50587:14;;;;;;;50232:3;;;;;;;50202:415;;;;50648:12;50633;:27;;;;49214:1538;50684:60;50713:1;50717:2;50721:12;50735:8;50684:20;:60::i;:::-;49214:1538;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1036:5;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;1190:5;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;1349:5;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;1641:5;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1864:139::-;1910:5;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:262::-;2068:6;2117:2;2105:9;2096:7;2092:23;2088:32;2085:2;;;2133:1;2130;2123:12;2085:2;2176:1;2201:53;2246:7;2237:6;2226:9;2222:22;2201:53;:::i;:::-;2191:63;;2147:117;2075:196;;;;:::o;2277:407::-;2345:6;2353;2402:2;2390:9;2381:7;2377:23;2373:32;2370:2;;;2418:1;2415;2408:12;2370:2;2461:1;2486:53;2531:7;2522:6;2511:9;2507:22;2486:53;:::i;:::-;2476:63;;2432:117;2588:2;2614:53;2659:7;2650:6;2639:9;2635:22;2614:53;:::i;:::-;2604:63;;2559:118;2360:324;;;;;:::o;2690:552::-;2767:6;2775;2783;2832:2;2820:9;2811:7;2807:23;2803:32;2800:2;;;2848:1;2845;2838:12;2800:2;2891:1;2916:53;2961:7;2952:6;2941:9;2937:22;2916:53;:::i;:::-;2906:63;;2862:117;3018:2;3044:53;3089:7;3080:6;3069:9;3065:22;3044:53;:::i;:::-;3034:63;;2989:118;3146:2;3172:53;3217:7;3208:6;3197:9;3193:22;3172:53;:::i;:::-;3162:63;;3117:118;2790:452;;;;;:::o;3248:809::-;3343:6;3351;3359;3367;3416:3;3404:9;3395:7;3391:23;3387:33;3384:2;;;3433:1;3430;3423:12;3384:2;3476:1;3501:53;3546:7;3537:6;3526:9;3522:22;3501:53;:::i;:::-;3491:63;;3447:117;3603:2;3629:53;3674:7;3665:6;3654:9;3650:22;3629:53;:::i;:::-;3619:63;;3574:118;3731:2;3757:53;3802:7;3793:6;3782:9;3778:22;3757:53;:::i;:::-;3747:63;;3702:118;3887:2;3876:9;3872:18;3859:32;3918:18;3910:6;3907:30;3904:2;;;3950:1;3947;3940:12;3904:2;3978:62;4032:7;4023:6;4012:9;4008:22;3978:62;:::i;:::-;3968:72;;3830:220;3374:683;;;;;;;:::o;4063:401::-;4128:6;4136;4185:2;4173:9;4164:7;4160:23;4156:32;4153:2;;;4201:1;4198;4191:12;4153:2;4244:1;4269:53;4314:7;4305:6;4294:9;4290:22;4269:53;:::i;:::-;4259:63;;4215:117;4371:2;4397:50;4439:7;4430:6;4419:9;4415:22;4397:50;:::i;:::-;4387:60;;4342:115;4143:321;;;;;:::o;4470:407::-;4538:6;4546;4595:2;4583:9;4574:7;4570:23;4566:32;4563:2;;;4611:1;4608;4601:12;4563:2;4654:1;4679:53;4724:7;4715:6;4704:9;4700:22;4679:53;:::i;:::-;4669:63;;4625:117;4781:2;4807:53;4852:7;4843:6;4832:9;4828:22;4807:53;:::i;:::-;4797:63;;4752:118;4553:324;;;;;:::o;4883:256::-;4939:6;4988:2;4976:9;4967:7;4963:23;4959:32;4956:2;;;5004:1;5001;4994:12;4956:2;5047:1;5072:50;5114:7;5105:6;5094:9;5090:22;5072:50;:::i;:::-;5062:60;;5018:114;4946:193;;;;:::o;5145:260::-;5203:6;5252:2;5240:9;5231:7;5227:23;5223:32;5220:2;;;5268:1;5265;5258:12;5220:2;5311:1;5336:52;5380:7;5371:6;5360:9;5356:22;5336:52;:::i;:::-;5326:62;;5282:116;5210:195;;;;:::o;5411:282::-;5480:6;5529:2;5517:9;5508:7;5504:23;5500:32;5497:2;;;5545:1;5542;5535:12;5497:2;5588:1;5613:63;5668:7;5659:6;5648:9;5644:22;5613:63;:::i;:::-;5603:73;;5559:127;5487:206;;;;:::o;5699:375::-;5768:6;5817:2;5805:9;5796:7;5792:23;5788:32;5785:2;;;5833:1;5830;5823:12;5785:2;5904:1;5893:9;5889:17;5876:31;5934:18;5926:6;5923:30;5920:2;;;5966:1;5963;5956:12;5920:2;5994:63;6049:7;6040:6;6029:9;6025:22;5994:63;:::i;:::-;5984:73;;5847:220;5775:299;;;;:::o;6080:262::-;6139:6;6188:2;6176:9;6167:7;6163:23;6159:32;6156:2;;;6204:1;6201;6194:12;6156:2;6247:1;6272:53;6317:7;6308:6;6297:9;6293:22;6272:53;:::i;:::-;6262:63;;6218:117;6146:196;;;;:::o;6348:118::-;6435:24;6453:5;6435:24;:::i;:::-;6430:3;6423:37;6413:53;;:::o;6472:109::-;6553:21;6568:5;6553:21;:::i;:::-;6548:3;6541:34;6531:50;;:::o;6587:360::-;6673:3;6701:38;6733:5;6701:38;:::i;:::-;6755:70;6818:6;6813:3;6755:70;:::i;:::-;6748:77;;6834:52;6879:6;6874:3;6867:4;6860:5;6856:16;6834:52;:::i;:::-;6911:29;6933:6;6911:29;:::i;:::-;6906:3;6902:39;6895:46;;6677:270;;;;;:::o;6953:364::-;7041:3;7069:39;7102:5;7069:39;:::i;:::-;7124:71;7188:6;7183:3;7124:71;:::i;:::-;7117:78;;7204:52;7249:6;7244:3;7237:4;7230:5;7226:16;7204:52;:::i;:::-;7281:29;7303:6;7281:29;:::i;:::-;7276:3;7272:39;7265:46;;7045:272;;;;;:::o;7323:377::-;7429:3;7457:39;7490:5;7457:39;:::i;:::-;7512:89;7594:6;7589:3;7512:89;:::i;:::-;7505:96;;7610:52;7655:6;7650:3;7643:4;7636:5;7632:16;7610:52;:::i;:::-;7687:6;7682:3;7678:16;7671:23;;7433:267;;;;;:::o;7730:845::-;7833:3;7870:5;7864:12;7899:36;7925:9;7899:36;:::i;:::-;7951:89;8033:6;8028:3;7951:89;:::i;:::-;7944:96;;8071:1;8060:9;8056:17;8087:1;8082:137;;;;8233:1;8228:341;;;;8049:520;;8082:137;8166:4;8162:9;8151;8147:25;8142:3;8135:38;8202:6;8197:3;8193:16;8186:23;;8082:137;;8228:341;8295:38;8327:5;8295:38;:::i;:::-;8355:1;8369:154;8383:6;8380:1;8377:13;8369:154;;;8457:7;8451:14;8447:1;8442:3;8438:11;8431:35;8507:1;8498:7;8494:15;8483:26;;8405:4;8402:1;8398:12;8393:17;;8369:154;;;8552:6;8547:3;8543:16;8536:23;;8235:334;;8049:520;;7837:738;;;;;;:::o;8581:366::-;8723:3;8744:67;8808:2;8803:3;8744:67;:::i;:::-;8737:74;;8820:93;8909:3;8820:93;:::i;:::-;8938:2;8933:3;8929:12;8922:19;;8727:220;;;:::o;8953:366::-;9095:3;9116:67;9180:2;9175:3;9116:67;:::i;:::-;9109:74;;9192:93;9281:3;9192:93;:::i;:::-;9310:2;9305:3;9301:12;9294:19;;9099:220;;;:::o;9325:366::-;9467:3;9488:67;9552:2;9547:3;9488:67;:::i;:::-;9481:74;;9564:93;9653:3;9564:93;:::i;:::-;9682:2;9677:3;9673:12;9666:19;;9471:220;;;:::o;9697:366::-;9839:3;9860:67;9924:2;9919:3;9860:67;:::i;:::-;9853:74;;9936:93;10025:3;9936:93;:::i;:::-;10054:2;10049:3;10045:12;10038:19;;9843:220;;;:::o;10069:366::-;10211:3;10232:67;10296:2;10291:3;10232:67;:::i;:::-;10225:74;;10308:93;10397:3;10308:93;:::i;:::-;10426:2;10421:3;10417:12;10410:19;;10215:220;;;:::o;10441:366::-;10583:3;10604:67;10668:2;10663:3;10604:67;:::i;:::-;10597:74;;10680:93;10769:3;10680:93;:::i;:::-;10798:2;10793:3;10789:12;10782:19;;10587:220;;;:::o;10813:366::-;10955:3;10976:67;11040:2;11035:3;10976:67;:::i;:::-;10969:74;;11052:93;11141:3;11052:93;:::i;:::-;11170:2;11165:3;11161:12;11154:19;;10959:220;;;:::o;11185:366::-;11327:3;11348:67;11412:2;11407:3;11348:67;:::i;:::-;11341:74;;11424:93;11513:3;11424:93;:::i;:::-;11542:2;11537:3;11533:12;11526:19;;11331:220;;;:::o;11557:366::-;11699:3;11720:67;11784:2;11779:3;11720:67;:::i;:::-;11713:74;;11796:93;11885:3;11796:93;:::i;:::-;11914:2;11909:3;11905:12;11898:19;;11703:220;;;:::o;11929:366::-;12071:3;12092:67;12156:2;12151:3;12092:67;:::i;:::-;12085:74;;12168:93;12257:3;12168:93;:::i;:::-;12286:2;12281:3;12277:12;12270:19;;12075:220;;;:::o;12301:366::-;12443:3;12464:67;12528:2;12523:3;12464:67;:::i;:::-;12457:74;;12540:93;12629:3;12540:93;:::i;:::-;12658:2;12653:3;12649:12;12642:19;;12447:220;;;:::o;12673:366::-;12815:3;12836:67;12900:2;12895:3;12836:67;:::i;:::-;12829:74;;12912:93;13001:3;12912:93;:::i;:::-;13030:2;13025:3;13021:12;13014:19;;12819:220;;;:::o;13045:398::-;13204:3;13225:83;13306:1;13301:3;13225:83;:::i;:::-;13218:90;;13317:93;13406:3;13317:93;:::i;:::-;13435:1;13430:3;13426:11;13419:18;;13208:235;;;:::o;13449:366::-;13591:3;13612:67;13676:2;13671:3;13612:67;:::i;:::-;13605:74;;13688:93;13777:3;13688:93;:::i;:::-;13806:2;13801:3;13797:12;13790:19;;13595:220;;;:::o;13821:366::-;13963:3;13984:67;14048:2;14043:3;13984:67;:::i;:::-;13977:74;;14060:93;14149:3;14060:93;:::i;:::-;14178:2;14173:3;14169:12;14162:19;;13967:220;;;:::o;14193:366::-;14335:3;14356:67;14420:2;14415:3;14356:67;:::i;:::-;14349:74;;14432:93;14521:3;14432:93;:::i;:::-;14550:2;14545:3;14541:12;14534:19;;14339:220;;;:::o;14565:366::-;14707:3;14728:67;14792:2;14787:3;14728:67;:::i;:::-;14721:74;;14804:93;14893:3;14804:93;:::i;:::-;14922:2;14917:3;14913:12;14906:19;;14711:220;;;:::o;14937:366::-;15079:3;15100:67;15164:2;15159:3;15100:67;:::i;:::-;15093:74;;15176:93;15265:3;15176:93;:::i;:::-;15294:2;15289:3;15285:12;15278:19;;15083:220;;;:::o;15309:366::-;15451:3;15472:67;15536:2;15531:3;15472:67;:::i;:::-;15465:74;;15548:93;15637:3;15548:93;:::i;:::-;15666:2;15661:3;15657:12;15650:19;;15455:220;;;:::o;15681:366::-;15823:3;15844:67;15908:2;15903:3;15844:67;:::i;:::-;15837:74;;15920:93;16009:3;15920:93;:::i;:::-;16038:2;16033:3;16029:12;16022:19;;15827:220;;;:::o;16053:118::-;16140:24;16158:5;16140:24;:::i;:::-;16135:3;16128:37;16118:53;;:::o;16177:589::-;16402:3;16424:95;16515:3;16506:6;16424:95;:::i;:::-;16417:102;;16536:95;16627:3;16618:6;16536:95;:::i;:::-;16529:102;;16648:92;16736:3;16727:6;16648:92;:::i;:::-;16641:99;;16757:3;16750:10;;16406:360;;;;;;:::o;16772:379::-;16956:3;16978:147;17121:3;16978:147;:::i;:::-;16971:154;;17142:3;17135:10;;16960:191;;;:::o;17157:222::-;17250:4;17288:2;17277:9;17273:18;17265:26;;17301:71;17369:1;17358:9;17354:17;17345:6;17301:71;:::i;:::-;17255:124;;;;:::o;17385:640::-;17580:4;17618:3;17607:9;17603:19;17595:27;;17632:71;17700:1;17689:9;17685:17;17676:6;17632:71;:::i;:::-;17713:72;17781:2;17770:9;17766:18;17757:6;17713:72;:::i;:::-;17795;17863:2;17852:9;17848:18;17839:6;17795:72;:::i;:::-;17914:9;17908:4;17904:20;17899:2;17888:9;17884:18;17877:48;17942:76;18013:4;18004:6;17942:76;:::i;:::-;17934:84;;17585:440;;;;;;;:::o;18031:210::-;18118:4;18156:2;18145:9;18141:18;18133:26;;18169:65;18231:1;18220:9;18216:17;18207:6;18169:65;:::i;:::-;18123:118;;;;:::o;18247:313::-;18360:4;18398:2;18387:9;18383:18;18375:26;;18447:9;18441:4;18437:20;18433:1;18422:9;18418:17;18411:47;18475:78;18548:4;18539:6;18475:78;:::i;:::-;18467:86;;18365:195;;;;:::o;18566:419::-;18732:4;18770:2;18759:9;18755:18;18747:26;;18819:9;18813:4;18809:20;18805:1;18794:9;18790:17;18783:47;18847:131;18973:4;18847:131;:::i;:::-;18839:139;;18737:248;;;:::o;18991:419::-;19157:4;19195:2;19184:9;19180:18;19172:26;;19244:9;19238:4;19234:20;19230:1;19219:9;19215:17;19208:47;19272:131;19398:4;19272:131;:::i;:::-;19264:139;;19162:248;;;:::o;19416:419::-;19582:4;19620:2;19609:9;19605:18;19597:26;;19669:9;19663:4;19659:20;19655:1;19644:9;19640:17;19633:47;19697:131;19823:4;19697:131;:::i;:::-;19689:139;;19587:248;;;:::o;19841:419::-;20007:4;20045:2;20034:9;20030:18;20022:26;;20094:9;20088:4;20084:20;20080:1;20069:9;20065:17;20058:47;20122:131;20248:4;20122:131;:::i;:::-;20114:139;;20012:248;;;:::o;20266:419::-;20432:4;20470:2;20459:9;20455:18;20447:26;;20519:9;20513:4;20509:20;20505:1;20494:9;20490:17;20483:47;20547:131;20673:4;20547:131;:::i;:::-;20539:139;;20437:248;;;:::o;20691:419::-;20857:4;20895:2;20884:9;20880:18;20872:26;;20944:9;20938:4;20934:20;20930:1;20919:9;20915:17;20908:47;20972:131;21098:4;20972:131;:::i;:::-;20964:139;;20862:248;;;:::o;21116:419::-;21282:4;21320:2;21309:9;21305:18;21297:26;;21369:9;21363:4;21359:20;21355:1;21344:9;21340:17;21333:47;21397:131;21523:4;21397:131;:::i;:::-;21389:139;;21287:248;;;:::o;21541:419::-;21707:4;21745:2;21734:9;21730:18;21722:26;;21794:9;21788:4;21784:20;21780:1;21769:9;21765:17;21758:47;21822:131;21948:4;21822:131;:::i;:::-;21814:139;;21712:248;;;:::o;21966:419::-;22132:4;22170:2;22159:9;22155:18;22147:26;;22219:9;22213:4;22209:20;22205:1;22194:9;22190:17;22183:47;22247:131;22373:4;22247:131;:::i;:::-;22239:139;;22137:248;;;:::o;22391:419::-;22557:4;22595:2;22584:9;22580:18;22572:26;;22644:9;22638:4;22634:20;22630:1;22619:9;22615:17;22608:47;22672:131;22798:4;22672:131;:::i;:::-;22664:139;;22562:248;;;:::o;22816:419::-;22982:4;23020:2;23009:9;23005:18;22997:26;;23069:9;23063:4;23059:20;23055:1;23044:9;23040:17;23033:47;23097:131;23223:4;23097:131;:::i;:::-;23089:139;;22987:248;;;:::o;23241:419::-;23407:4;23445:2;23434:9;23430:18;23422:26;;23494:9;23488:4;23484:20;23480:1;23469:9;23465:17;23458:47;23522:131;23648:4;23522:131;:::i;:::-;23514:139;;23412:248;;;:::o;23666:419::-;23832:4;23870:2;23859:9;23855:18;23847:26;;23919:9;23913:4;23909:20;23905:1;23894:9;23890:17;23883:47;23947:131;24073:4;23947:131;:::i;:::-;23939:139;;23837:248;;;:::o;24091:419::-;24257:4;24295:2;24284:9;24280:18;24272:26;;24344:9;24338:4;24334:20;24330:1;24319:9;24315:17;24308:47;24372:131;24498:4;24372:131;:::i;:::-;24364:139;;24262:248;;;:::o;24516:419::-;24682:4;24720:2;24709:9;24705:18;24697:26;;24769:9;24763:4;24759:20;24755:1;24744:9;24740:17;24733:47;24797:131;24923:4;24797:131;:::i;:::-;24789:139;;24687:248;;;:::o;24941:419::-;25107:4;25145:2;25134:9;25130:18;25122:26;;25194:9;25188:4;25184:20;25180:1;25169:9;25165:17;25158:47;25222:131;25348:4;25222:131;:::i;:::-;25214:139;;25112:248;;;:::o;25366:419::-;25532:4;25570:2;25559:9;25555:18;25547:26;;25619:9;25613:4;25609:20;25605:1;25594:9;25590:17;25583:47;25647:131;25773:4;25647:131;:::i;:::-;25639:139;;25537:248;;;:::o;25791:419::-;25957:4;25995:2;25984:9;25980:18;25972:26;;26044:9;26038:4;26034:20;26030:1;26019:9;26015:17;26008:47;26072:131;26198:4;26072:131;:::i;:::-;26064:139;;25962:248;;;:::o;26216:419::-;26382:4;26420:2;26409:9;26405:18;26397:26;;26469:9;26463:4;26459:20;26455:1;26444:9;26440:17;26433:47;26497:131;26623:4;26497:131;:::i;:::-;26489:139;;26387:248;;;:::o;26641:222::-;26734:4;26772:2;26761:9;26757:18;26749:26;;26785:71;26853:1;26842:9;26838:17;26829:6;26785:71;:::i;:::-;26739:124;;;;:::o;26869:129::-;26903:6;26930:20;;:::i;:::-;26920:30;;26959:33;26987:4;26979:6;26959:33;:::i;:::-;26910:88;;;:::o;27004:75::-;27037:6;27070:2;27064:9;27054:19;;27044:35;:::o;27085:307::-;27146:4;27236:18;27228:6;27225:30;27222:2;;;27258:18;;:::i;:::-;27222:2;27296:29;27318:6;27296:29;:::i;:::-;27288:37;;27380:4;27374;27370:15;27362:23;;27151:241;;;:::o;27398:308::-;27460:4;27550:18;27542:6;27539:30;27536:2;;;27572:18;;:::i;:::-;27536:2;27610:29;27632:6;27610:29;:::i;:::-;27602:37;;27694:4;27688;27684:15;27676:23;;27465:241;;;:::o;27712:141::-;27761:4;27784:3;27776:11;;27807:3;27804:1;27797:14;27841:4;27838:1;27828:18;27820:26;;27766:87;;;:::o;27859:98::-;27910:6;27944:5;27938:12;27928:22;;27917:40;;;:::o;27963:99::-;28015:6;28049:5;28043:12;28033:22;;28022:40;;;:::o;28068:168::-;28151:11;28185:6;28180:3;28173:19;28225:4;28220:3;28216:14;28201:29;;28163:73;;;;:::o;28242:147::-;28343:11;28380:3;28365:18;;28355:34;;;;:::o;28395:169::-;28479:11;28513:6;28508:3;28501:19;28553:4;28548:3;28544:14;28529:29;;28491:73;;;;:::o;28570:148::-;28672:11;28709:3;28694:18;;28684:34;;;;:::o;28724:305::-;28764:3;28783:20;28801:1;28783:20;:::i;:::-;28778:25;;28817:20;28835:1;28817:20;:::i;:::-;28812:25;;28971:1;28903:66;28899:74;28896:1;28893:81;28890:2;;;28977:18;;:::i;:::-;28890:2;29021:1;29018;29014:9;29007:16;;28768:261;;;;:::o;29035:185::-;29075:1;29092:20;29110:1;29092:20;:::i;:::-;29087:25;;29126:20;29144:1;29126:20;:::i;:::-;29121:25;;29165:1;29155:2;;29170:18;;:::i;:::-;29155:2;29212:1;29209;29205:9;29200:14;;29077:143;;;;:::o;29226:348::-;29266:7;29289:20;29307:1;29289:20;:::i;:::-;29284:25;;29323:20;29341:1;29323:20;:::i;:::-;29318:25;;29511:1;29443:66;29439:74;29436:1;29433:81;29428:1;29421:9;29414:17;29410:105;29407:2;;;29518:18;;:::i;:::-;29407:2;29566:1;29563;29559:9;29548:20;;29274:300;;;;:::o;29580:191::-;29620:4;29640:20;29658:1;29640:20;:::i;:::-;29635:25;;29674:20;29692:1;29674:20;:::i;:::-;29669:25;;29713:1;29710;29707:8;29704:2;;;29718:18;;:::i;:::-;29704:2;29763:1;29760;29756:9;29748:17;;29625:146;;;;:::o;29777:96::-;29814:7;29843:24;29861:5;29843:24;:::i;:::-;29832:35;;29822:51;;;:::o;29879:90::-;29913:7;29956:5;29949:13;29942:21;29931:32;;29921:48;;;:::o;29975:149::-;30011:7;30051:66;30044:5;30040:78;30029:89;;30019:105;;;:::o;30130:126::-;30167:7;30207:42;30200:5;30196:54;30185:65;;30175:81;;;:::o;30262:77::-;30299:7;30328:5;30317:16;;30307:32;;;:::o;30345:154::-;30429:6;30424:3;30419;30406:30;30491:1;30482:6;30477:3;30473:16;30466:27;30396:103;;;:::o;30505:307::-;30573:1;30583:113;30597:6;30594:1;30591:13;30583:113;;;30682:1;30677:3;30673:11;30667:18;30663:1;30658:3;30654:11;30647:39;30619:2;30616:1;30612:10;30607:15;;30583:113;;;30714:6;30711:1;30708:13;30705:2;;;30794:1;30785:6;30780:3;30776:16;30769:27;30705:2;30554:258;;;;:::o;30818:320::-;30862:6;30899:1;30893:4;30889:12;30879:22;;30946:1;30940:4;30936:12;30967:18;30957:2;;31023:4;31015:6;31011:17;31001:27;;30957:2;31085;31077:6;31074:14;31054:18;31051:38;31048:2;;;31104:18;;:::i;:::-;31048:2;30869:269;;;;:::o;31144:281::-;31227:27;31249:4;31227:27;:::i;:::-;31219:6;31215:40;31357:6;31345:10;31342:22;31321:18;31309:10;31306:34;31303:62;31300:2;;;31368:18;;:::i;:::-;31300:2;31408:10;31404:2;31397:22;31187:238;;;:::o;31431:233::-;31470:3;31493:24;31511:5;31493:24;:::i;:::-;31484:33;;31539:66;31532:5;31529:77;31526:2;;;31609:18;;:::i;:::-;31526:2;31656:1;31649:5;31645:13;31638:20;;31474:190;;;:::o;31670:176::-;31702:1;31719:20;31737:1;31719:20;:::i;:::-;31714:25;;31753:20;31771:1;31753:20;:::i;:::-;31748:25;;31792:1;31782:2;;31797:18;;:::i;:::-;31782:2;31838:1;31835;31831:9;31826:14;;31704:142;;;;:::o;31852:180::-;31900:77;31897:1;31890:88;31997:4;31994:1;31987:15;32021:4;32018:1;32011:15;32038:180;32086:77;32083:1;32076:88;32183:4;32180:1;32173:15;32207:4;32204:1;32197:15;32224:180;32272:77;32269:1;32262:88;32369:4;32366:1;32359:15;32393:4;32390:1;32383:15;32410:180;32458:77;32455:1;32448:88;32555:4;32552:1;32545:15;32579:4;32576:1;32569:15;32596:102;32637:6;32688:2;32684:7;32679:2;32672:5;32668:14;32664:28;32654:38;;32644:54;;;:::o;32704:221::-;32844:34;32840:1;32832:6;32828:14;32821:58;32913:4;32908:2;32900:6;32896:15;32889:29;32810:115;:::o;32931:225::-;33071:34;33067:1;33059:6;33055:14;33048:58;33140:8;33135:2;33127:6;33123:15;33116:33;33037:119;:::o;33162:229::-;33302:34;33298:1;33290:6;33286:14;33279:58;33371:12;33366:2;33358:6;33354:15;33347:37;33268:123;:::o;33397:222::-;33537:34;33533:1;33525:6;33521:14;33514:58;33606:5;33601:2;33593:6;33589:15;33582:30;33503:116;:::o;33625:224::-;33765:34;33761:1;33753:6;33749:14;33742:58;33834:7;33829:2;33821:6;33817:15;33810:32;33731:118;:::o;33855:244::-;33995:34;33991:1;33983:6;33979:14;33972:58;34064:27;34059:2;34051:6;34047:15;34040:52;33961:138;:::o;34105:230::-;34245:34;34241:1;34233:6;34229:14;34222:58;34314:13;34309:2;34301:6;34297:15;34290:38;34211:124;:::o;34341:225::-;34481:34;34477:1;34469:6;34465:14;34458:58;34550:8;34545:2;34537:6;34533:15;34526:33;34447:119;:::o;34572:182::-;34712:34;34708:1;34700:6;34696:14;34689:58;34678:76;:::o;34760:176::-;34900:28;34896:1;34888:6;34884:14;34877:52;34866:70;:::o;34942:237::-;35082:34;35078:1;35070:6;35066:14;35059:58;35151:20;35146:2;35138:6;35134:15;35127:45;35048:131;:::o;35185:221::-;35325:34;35321:1;35313:6;35309:14;35302:58;35394:4;35389:2;35381:6;35377:15;35370:29;35291:115;:::o;35412:114::-;35518:8;:::o;35532:238::-;35672:34;35668:1;35660:6;35656:14;35649:58;35741:21;35736:2;35728:6;35724:15;35717:46;35638:132;:::o;35776:220::-;35916:34;35912:1;35904:6;35900:14;35893:58;35985:3;35980:2;35972:6;35968:15;35961:28;35882:114;:::o;36002:227::-;36142:34;36138:1;36130:6;36126:14;36119:58;36211:10;36206:2;36198:6;36194:15;36187:35;36108:121;:::o;36235:233::-;36375:34;36371:1;36363:6;36359:14;36352:58;36444:16;36439:2;36431:6;36427:15;36420:41;36341:127;:::o;36474:181::-;36614:33;36610:1;36602:6;36598:14;36591:57;36580:75;:::o;36661:234::-;36801:34;36797:1;36789:6;36785:14;36778:58;36870:17;36865:2;36857:6;36853:15;36846:42;36767:128;:::o;36901:232::-;37041:34;37037:1;37029:6;37025:14;37018:58;37110:15;37105:2;37097:6;37093:15;37086:40;37007:126;:::o;37139:122::-;37212:24;37230:5;37212:24;:::i;:::-;37205:5;37202:35;37192:2;;37251:1;37248;37241:12;37192:2;37182:79;:::o;37267:116::-;37337:21;37352:5;37337:21;:::i;:::-;37330:5;37327:32;37317:2;;37373:1;37370;37363:12;37317:2;37307:76;:::o;37389:120::-;37461:23;37478:5;37461:23;:::i;:::-;37454:5;37451:34;37441:2;;37499:1;37496;37489:12;37441:2;37431:78;:::o;37515:122::-;37588:24;37606:5;37588:24;:::i;:::-;37581:5;37578:35;37568:2;;37627:1;37624;37617:12;37568:2;37558:79;:::o

Swarm Source

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