ETH Price: $3,882.93 (+5.96%)

Token

Yellow Giant Society (YGS)
 

Overview

Max Total Supply

150 YGS

Holders

69

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 YGS
0x0cb7a06ec845edca1af6db6b6538c4ca0942019a
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

A women-led NFT collection of 10,000 Giraffes curated from over 140 hand-drawn traits.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
YellowGiantSociety

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-14
*/

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/Context.sol



pragma solidity ^0.8.0;

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

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



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



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: @openzeppelin/contracts/utils/math/SafeMath.sol



pragma solidity ^0.8.0;

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

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

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

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

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

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

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

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

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

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

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

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

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

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



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



pragma solidity ^0.8.0;

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



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



pragma solidity ^0.8.0;


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



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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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



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



pragma solidity ^0.8.0;


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

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

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



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



pragma solidity ^0.8.0;

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @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 virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: 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 virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @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.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: 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`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * 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
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), 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.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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



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



pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}



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



pragma solidity ^0.8.0;

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

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

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

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

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



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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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



pragma solidity ^0.8.0;

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


pragma solidity ^0.8.2;

contract YellowGiantSociety is ERC721, ERC721Enumerable, Ownable {
    using SafeMath for uint256;

    uint256 public maxYellowGiantSupply = 10000;
    uint256 public maxYellowGiantReserve = 100;
    uint256 public maxYellowGiantTeamReserve = 30;
    uint256 public maxYellowGiantsPerTx = 10;

    uint256 public yellowGiantPrice = 50000000000000000; //0.05 ETH
    bool public saleActive = false;
    bool public reserveActive = false;

    string private _setBaseURI;

    constructor() ERC721("Yellow Giant Society", "YGS") {}

    // RETRIEVE BASEURI

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

    // SET BASEURI

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

    // MINT YELLOW GIANTS FOR PUBLIC

    function mintYellowGiant(uint amount) external payable {
        require(saleActive, "The rescue hasn't started yet. Hold your hooves...");
        require(amount > 0, "Amount must be greater than 0.");
        require(amount <= maxYellowGiantsPerTx, "Only 10 Yellow Giants can be rescued at a time.");
        require(totalSupply().add(amount) <= maxYellowGiantSupply.sub(maxYellowGiantReserve), "There are no more Yellow Giants left to be rescued.");
        require(msg.value >= yellowGiantPrice.mul(amount), "The amount of ether sent was incorrect.");

        for (uint i = 0; i < amount; i++) {
            uint256 tokenId = totalSupply();
            if (tokenId < maxYellowGiantSupply) {
                _safeMint(msg.sender, tokenId);
            }
        }
    }

    // MINT YELLOW GIANTS FOR TEAM

    function mintTeamYellowGiants(uint amount, address to) public onlyOwner {
        require(reserveActive, "Reserve state is not active.");
        require(amount > 0, "Amount must be greater than 0.");
        require(amount <= maxYellowGiantTeamReserve, "Minted all of the Yellow Giants set for the team.");
        require(amount <= maxYellowGiantReserve, "Minted all of the Yellow Giants set for reserves.");

        for (uint i = 0; i < amount; i++) {
            uint256 tokenId = totalSupply();
            if (tokenId < maxYellowGiantSupply) {
                _safeMint(to, tokenId);
            }
        }

        maxYellowGiantReserve = maxYellowGiantReserve.sub(amount);
        maxYellowGiantTeamReserve = maxYellowGiantTeamReserve.sub(amount);
    }

    // MINT YELLOW GIANTS FOR PRE-LAUNCH GIVEAWAYS

    function mintPreLaunchGiveaways(uint amount, address to) public onlyOwner {
        require(reserveActive, "Reserve state is not active.");
        require(amount > 0, "Amount must be greater than 0.");
        require(amount <= maxYellowGiantReserve, "Minted all of the Yellow Giants set for pre-launch giveaways.");

        for (uint i = 0; i < amount; i++) {
            uint256 tokenId = totalSupply();
            if (tokenId < maxYellowGiantSupply) {
                _safeMint(to, tokenId);
            }
        }

        maxYellowGiantReserve = maxYellowGiantReserve.sub(amount);
    }

    // MINT YELLOW GIANTS FOR REMAINING GIVEAWAYS

    function mintPostLaunchGiveaways(uint amount, address to) public onlyOwner {
        require(reserveActive, "Reserve state is not active.");
        require(amount > 0, "Amount must be greater than 0.");
        require(amount <= maxYellowGiantReserve, "Minted all of the Yellow Giants set for giveaways and scavenger hunts.");

        for (uint i = 0; i < amount; i++) {
            uint256 tokenId = totalSupply();
            if (tokenId < maxYellowGiantSupply) {
                _safeMint(to, tokenId);
            }
        }

        maxYellowGiantReserve = maxYellowGiantReserve.sub(amount);
    }

    // SET YELLOW GIANT MINT PRICE

    function setYellowGiantPrice(uint256 price) public onlyOwner {
        yellowGiantPrice = price;
    }

    // TOGGLE SALE STATE ON/OFF

    function toggleSale() public onlyOwner {
        saleActive = !saleActive;
    }

    // TOGGLE RESERVE STATE ON/OFF

    function toggleReserve() public onlyOwner {
        reserveActive = !reserveActive;
    }

    // WITHDRAW FUNDS FROM SMART CONTRACT

    function withdraw() public payable onlyOwner {
        uint balance = address(this).balance;
        payable(owner()).transfer(balance);
    }

    // The following functions are overrides required by Solidity.

    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

}

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":[{"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxYellowGiantReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxYellowGiantSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxYellowGiantTeamReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxYellowGiantsPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"mintPostLaunchGiveaways","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"mintPreLaunchGiveaways","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"mintTeamYellowGiants","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintYellowGiant","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[],"name":"saleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setYellowGiantPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleSale","outputs":[],"stateMutability":"nonpayable","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"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"yellowGiantPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

6080604052612710600b556064600c55601e600d55600a600e5566b1a2bc2ec50000600f556000601060006101000a81548160ff0219169083151502179055506000601060016101000a81548160ff0219169083151502179055503480156200006757600080fd5b506040518060400160405280601481526020017f59656c6c6f77204769616e7420536f63696574790000000000000000000000008152506040518060400160405280600381526020017f59475300000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000ec929190620001fc565b50806001908051906020019062000105929190620001fc565b505050620001286200011c6200012e60201b60201c565b6200013660201b60201c565b62000311565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200020a90620002ac565b90600052602060002090601f0160209004810192826200022e57600085556200027a565b82601f106200024957805160ff19168380011785556200027a565b828001600101855582156200027a579182015b82811115620002795782518255916020019190600101906200025c565b5b5090506200028991906200028d565b5090565b5b80821115620002a85760008160009055506001016200028e565b5090565b60006002820490506001821680620002c557607f821691505b60208210811415620002dc57620002db620002e2565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614a1280620003216000396000f3fe6080604052600436106102045760003560e01c80636352211e11610118578063b4faf701116100a0578063c87b56dd1161006f578063c87b56dd146106ff578063dd9927b71461073c578063e96825bb14610767578063e985e9c514610792578063f2fde38b146107cf57610204565b8063b4faf70114610657578063b88d4fde14610682578063bbd71739146106ab578063c524115b146106d657610204565b80637d8966e4116100e75780637d8966e4146105965780638be83a0e146105ad5780638da5cb5b146105d857806395d89b4114610603578063a22cb4651461062e57610204565b80636352211e146104da57806368428a1b1461051757806370a0823114610542578063715018a61461057f57610204565b80632b9f292b1161019b57806342842e0e1161016a57806342842e0e1461040957806343cb83a6146104325780634f6ccce71461044957806355f804b3146104865780635af336ae146104af57610204565b80632b9f292b1461037d5780632f745c59146103995780633942487c146103d65780633ccfd60b146103ff57610204565b80630fdf4cf0116101d75780630fdf4cf0146102d757806318160ddd1461030057806323b872dd1461032b57806324a56e031461035457610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b91906132d2565b6107f8565b60405161023d9190613911565b60405180910390f35b34801561025257600080fd5b5061025b61080a565b604051610268919061392c565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190613375565b61089c565b6040516102a591906138aa565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d09190613292565b610921565b005b3480156102e357600080fd5b506102fe60048036038101906102f991906133a2565b610a39565b005b34801561030c57600080fd5b50610315610bec565b6040516103229190613cce565b60405180910390f35b34801561033757600080fd5b50610352600480360381019061034d919061317c565b610bf9565b005b34801561036057600080fd5b5061037b600480360381019061037691906133a2565b610c59565b005b61039760048036038101906103929190613375565b610e6c565b005b3480156103a557600080fd5b506103c060048036038101906103bb9190613292565b611050565b6040516103cd9190613cce565b60405180910390f35b3480156103e257600080fd5b506103fd60048036038101906103f89190613375565b6110f5565b005b61040761117b565b005b34801561041557600080fd5b50610430600480360381019061042b919061317c565b61124d565b005b34801561043e57600080fd5b5061044761126d565b005b34801561045557600080fd5b50610470600480360381019061046b9190613375565b611315565b60405161047d9190613cce565b60405180910390f35b34801561049257600080fd5b506104ad60048036038101906104a8919061332c565b611386565b005b3480156104bb57600080fd5b506104c461141c565b6040516104d19190613cce565b60405180910390f35b3480156104e657600080fd5b5061050160048036038101906104fc9190613375565b611422565b60405161050e91906138aa565b60405180910390f35b34801561052357600080fd5b5061052c6114d4565b6040516105399190613911565b60405180910390f35b34801561054e57600080fd5b506105696004803603810190610564919061310f565b6114e7565b6040516105769190613cce565b60405180910390f35b34801561058b57600080fd5b5061059461159f565b005b3480156105a257600080fd5b506105ab611627565b005b3480156105b957600080fd5b506105c26116cf565b6040516105cf9190613cce565b60405180910390f35b3480156105e457600080fd5b506105ed6116d5565b6040516105fa91906138aa565b60405180910390f35b34801561060f57600080fd5b506106186116ff565b604051610625919061392c565b60405180910390f35b34801561063a57600080fd5b5061065560048036038101906106509190613252565b611791565b005b34801561066357600080fd5b5061066c611912565b6040516106799190613cce565b60405180910390f35b34801561068e57600080fd5b506106a960048036038101906106a491906131cf565b611918565b005b3480156106b757600080fd5b506106c061197a565b6040516106cd9190613911565b60405180910390f35b3480156106e257600080fd5b506106fd60048036038101906106f891906133a2565b61198d565b005b34801561070b57600080fd5b5061072660048036038101906107219190613375565b611b40565b604051610733919061392c565b60405180910390f35b34801561074857600080fd5b50610751611be7565b60405161075e9190613cce565b60405180910390f35b34801561077357600080fd5b5061077c611bed565b6040516107899190613cce565b60405180910390f35b34801561079e57600080fd5b506107b960048036038101906107b4919061313c565b611bf3565b6040516107c69190613911565b60405180910390f35b3480156107db57600080fd5b506107f660048036038101906107f1919061310f565b611c87565b005b600061080382611d7f565b9050919050565b60606000805461081990613f7e565b80601f016020809104026020016040519081016040528092919081815260200182805461084590613f7e565b80156108925780601f1061086757610100808354040283529160200191610892565b820191906000526020600020905b81548152906001019060200180831161087557829003601f168201915b5050505050905090565b60006108a782611df9565b6108e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108dd90613b0e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061092c82611422565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561099d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099490613bee565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109bc611e65565b73ffffffffffffffffffffffffffffffffffffffff1614806109eb57506109ea816109e5611e65565b611bf3565b5b610a2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2190613a6e565b60405180910390fd5b610a348383611e6d565b505050565b610a41611e65565b73ffffffffffffffffffffffffffffffffffffffff16610a5f6116d5565b73ffffffffffffffffffffffffffffffffffffffff1614610ab5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aac90613b4e565b60405180910390fd5b601060019054906101000a900460ff16610b04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610afb90613b2e565b60405180910390fd5b60008211610b47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3e9061394e565b60405180910390fd5b600c54821115610b8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8390613b6e565b60405180910390fd5b60005b82811015610bcc576000610ba1610bec565b9050600b54811015610bb857610bb78382611f26565b5b508080610bc490613fe1565b915050610b8f565b50610be282600c54611f4490919063ffffffff16565b600c819055505050565b6000600880549050905090565b610c0a610c04611e65565b82611f5a565b610c49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4090613c4e565b60405180910390fd5b610c54838383612038565b505050565b610c61611e65565b73ffffffffffffffffffffffffffffffffffffffff16610c7f6116d5565b73ffffffffffffffffffffffffffffffffffffffff1614610cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccc90613b4e565b60405180910390fd5b601060019054906101000a900460ff16610d24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1b90613b2e565b60405180910390fd5b60008211610d67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5e9061394e565b60405180910390fd5b600d54821115610dac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da390613ace565b60405180910390fd5b600c54821115610df1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de890613c0e565b60405180910390fd5b60005b82811015610e31576000610e06610bec565b9050600b54811015610e1d57610e1c8382611f26565b5b508080610e2990613fe1565b915050610df4565b50610e4782600c54611f4490919063ffffffff16565b600c81905550610e6282600d54611f4490919063ffffffff16565b600d819055505050565b601060009054906101000a900460ff16610ebb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb290613c2e565b60405180910390fd5b60008111610efe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef59061394e565b60405180910390fd5b600e54811115610f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3a90613a4e565b60405180910390fd5b610f5a600c54600b54611f4490919063ffffffff16565b610f7482610f66610bec565b61229490919063ffffffff16565b1115610fb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fac90613c6e565b60405180910390fd5b610fca81600f546122aa90919063ffffffff16565b34101561100c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100390613bce565b60405180910390fd5b60005b8181101561104c576000611021610bec565b9050600b54811015611038576110373382611f26565b5b50808061104490613fe1565b91505061100f565b5050565b600061105b836114e7565b821061109c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110939061396e565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6110fd611e65565b73ffffffffffffffffffffffffffffffffffffffff1661111b6116d5565b73ffffffffffffffffffffffffffffffffffffffff1614611171576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116890613b4e565b60405180910390fd5b80600f8190555050565b611183611e65565b73ffffffffffffffffffffffffffffffffffffffff166111a16116d5565b73ffffffffffffffffffffffffffffffffffffffff16146111f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ee90613b4e565b60405180910390fd5b60004790506112046116d5565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611249573d6000803e3d6000fd5b5050565b61126883838360405180602001604052806000815250611918565b505050565b611275611e65565b73ffffffffffffffffffffffffffffffffffffffff166112936116d5565b73ffffffffffffffffffffffffffffffffffffffff16146112e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e090613b4e565b60405180910390fd5b601060019054906101000a900460ff1615601060016101000a81548160ff021916908315150217905550565b600061131f610bec565b8210611360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135790613c8e565b60405180910390fd5b6008828154811061137457611373614117565b5b90600052602060002001549050919050565b61138e611e65565b73ffffffffffffffffffffffffffffffffffffffff166113ac6116d5565b73ffffffffffffffffffffffffffffffffffffffff1614611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f990613b4e565b60405180910390fd5b8060119080519060200190611418929190612f23565b5050565b600d5481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c290613aae565b60405180910390fd5b80915050919050565b601060009054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154f90613a8e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6115a7611e65565b73ffffffffffffffffffffffffffffffffffffffff166115c56116d5565b73ffffffffffffffffffffffffffffffffffffffff161461161b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161290613b4e565b60405180910390fd5b61162560006122c0565b565b61162f611e65565b73ffffffffffffffffffffffffffffffffffffffff1661164d6116d5565b73ffffffffffffffffffffffffffffffffffffffff16146116a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169a90613b4e565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b600e5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461170e90613f7e565b80601f016020809104026020016040519081016040528092919081815260200182805461173a90613f7e565b80156117875780601f1061175c57610100808354040283529160200191611787565b820191906000526020600020905b81548152906001019060200180831161176a57829003601f168201915b5050505050905090565b611799611e65565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611807576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fe90613a0e565b60405180910390fd5b8060056000611814611e65565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118c1611e65565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119069190613911565b60405180910390a35050565b600c5481565b611929611923611e65565b83611f5a565b611968576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195f90613c4e565b60405180910390fd5b61197484848484612386565b50505050565b601060019054906101000a900460ff1681565b611995611e65565b73ffffffffffffffffffffffffffffffffffffffff166119b36116d5565b73ffffffffffffffffffffffffffffffffffffffff1614611a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0090613b4e565b60405180910390fd5b601060019054906101000a900460ff16611a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4f90613b2e565b60405180910390fd5b60008211611a9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a929061394e565b60405180910390fd5b600c54821115611ae0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad790613cae565b60405180910390fd5b60005b82811015611b20576000611af5610bec565b9050600b54811015611b0c57611b0b8382611f26565b5b508080611b1890613fe1565b915050611ae3565b50611b3682600c54611f4490919063ffffffff16565b600c819055505050565b6060611b4b82611df9565b611b8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8190613bae565b60405180910390fd5b6000611b946123e2565b90506000815111611bb45760405180602001604052806000815250611bdf565b80611bbe84612474565b604051602001611bcf929190613886565b6040516020818303038152906040525b915050919050565b600b5481565b600f5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c8f611e65565b73ffffffffffffffffffffffffffffffffffffffff16611cad6116d5565b73ffffffffffffffffffffffffffffffffffffffff1614611d03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfa90613b4e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6a906139ae565b60405180910390fd5b611d7c816122c0565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611df25750611df1826125d5565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ee083611422565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611f408282604051806020016040528060008152506126b7565b5050565b60008183611f529190613e94565b905092915050565b6000611f6582611df9565b611fa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9b90613a2e565b60405180910390fd5b6000611faf83611422565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061201e57508373ffffffffffffffffffffffffffffffffffffffff166120068461089c565b73ffffffffffffffffffffffffffffffffffffffff16145b8061202f575061202e8185611bf3565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661205882611422565b73ffffffffffffffffffffffffffffffffffffffff16146120ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a590613b8e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561211e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612115906139ee565b60405180910390fd5b612129838383612712565b612134600082611e6d565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121849190613e94565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121db9190613db3565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600081836122a29190613db3565b905092915050565b600081836122b89190613e3a565b905092915050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612391848484612038565b61239d84848484612722565b6123dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d39061398e565b60405180910390fd5b50505050565b6060601180546123f190613f7e565b80601f016020809104026020016040519081016040528092919081815260200182805461241d90613f7e565b801561246a5780601f1061243f5761010080835404028352916020019161246a565b820191906000526020600020905b81548152906001019060200180831161244d57829003601f168201915b5050505050905090565b606060008214156124bc576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125d0565b600082905060005b600082146124ee5780806124d790613fe1565b915050600a826124e79190613e09565b91506124c4565b60008167ffffffffffffffff81111561250a57612509614146565b5b6040519080825280601f01601f19166020018201604052801561253c5781602001600182028036833780820191505090505b5090505b600085146125c9576001826125559190613e94565b9150600a85612564919061402a565b60306125709190613db3565b60f81b81838151811061258657612585614117565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125c29190613e09565b9450612540565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806126a057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806126b057506126af826128b9565b5b9050919050565b6126c18383612923565b6126ce6000848484612722565b61270d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127049061398e565b60405180910390fd5b505050565b61271d838383612af1565b505050565b60006127438473ffffffffffffffffffffffffffffffffffffffff16612c05565b156128ac578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261276c611e65565b8786866040518563ffffffff1660e01b815260040161278e94939291906138c5565b602060405180830381600087803b1580156127a857600080fd5b505af19250505080156127d957506040513d601f19601f820116820180604052508101906127d691906132ff565b60015b61285c573d8060008114612809576040519150601f19603f3d011682016040523d82523d6000602084013e61280e565b606091505b50600081511415612854576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284b9061398e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506128b1565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298a90613aee565b60405180910390fd5b61299c81611df9565b156129dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d3906139ce565b60405180910390fd5b6129e860008383612712565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a389190613db3565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612afc838383612c18565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b3f57612b3a81612c1d565b612b7e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612b7d57612b7c8382612c66565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bc157612bbc81612dd3565b612c00565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612bff57612bfe8282612ea4565b5b5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612c73846114e7565b612c7d9190613e94565b9050600060076000848152602001908152602001600020549050818114612d62576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612de79190613e94565b9050600060096000848152602001908152602001600020549050600060088381548110612e1757612e16614117565b5b906000526020600020015490508060088381548110612e3957612e38614117565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612e8857612e876140e8565b5b6001900381819060005260206000200160009055905550505050565b6000612eaf836114e7565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612f2f90613f7e565b90600052602060002090601f016020900481019282612f515760008555612f98565b82601f10612f6a57805160ff1916838001178555612f98565b82800160010185558215612f98579182015b82811115612f97578251825591602001919060010190612f7c565b5b509050612fa59190612fa9565b5090565b5b80821115612fc2576000816000905550600101612faa565b5090565b6000612fd9612fd484613d0e565b613ce9565b905082815260208101848484011115612ff557612ff461417a565b5b613000848285613f3c565b509392505050565b600061301b61301684613d3f565b613ce9565b9050828152602081018484840111156130375761303661417a565b5b613042848285613f3c565b509392505050565b60008135905061305981614980565b92915050565b60008135905061306e81614997565b92915050565b600081359050613083816149ae565b92915050565b600081519050613098816149ae565b92915050565b600082601f8301126130b3576130b2614175565b5b81356130c3848260208601612fc6565b91505092915050565b600082601f8301126130e1576130e0614175565b5b81356130f1848260208601613008565b91505092915050565b600081359050613109816149c5565b92915050565b60006020828403121561312557613124614184565b5b60006131338482850161304a565b91505092915050565b6000806040838503121561315357613152614184565b5b60006131618582860161304a565b92505060206131728582860161304a565b9150509250929050565b60008060006060848603121561319557613194614184565b5b60006131a38682870161304a565b93505060206131b48682870161304a565b92505060406131c5868287016130fa565b9150509250925092565b600080600080608085870312156131e9576131e8614184565b5b60006131f78782880161304a565b94505060206132088782880161304a565b9350506040613219878288016130fa565b925050606085013567ffffffffffffffff81111561323a5761323961417f565b5b6132468782880161309e565b91505092959194509250565b6000806040838503121561326957613268614184565b5b60006132778582860161304a565b92505060206132888582860161305f565b9150509250929050565b600080604083850312156132a9576132a8614184565b5b60006132b78582860161304a565b92505060206132c8858286016130fa565b9150509250929050565b6000602082840312156132e8576132e7614184565b5b60006132f684828501613074565b91505092915050565b60006020828403121561331557613314614184565b5b600061332384828501613089565b91505092915050565b60006020828403121561334257613341614184565b5b600082013567ffffffffffffffff8111156133605761335f61417f565b5b61336c848285016130cc565b91505092915050565b60006020828403121561338b5761338a614184565b5b6000613399848285016130fa565b91505092915050565b600080604083850312156133b9576133b8614184565b5b60006133c7858286016130fa565b92505060206133d88582860161304a565b9150509250929050565b6133eb81613ec8565b82525050565b6133fa81613eda565b82525050565b600061340b82613d70565b6134158185613d86565b9350613425818560208601613f4b565b61342e81614189565b840191505092915050565b600061344482613d7b565b61344e8185613d97565b935061345e818560208601613f4b565b61346781614189565b840191505092915050565b600061347d82613d7b565b6134878185613da8565b9350613497818560208601613f4b565b80840191505092915050565b60006134b0601e83613d97565b91506134bb8261419a565b602082019050919050565b60006134d3602b83613d97565b91506134de826141c3565b604082019050919050565b60006134f6603283613d97565b915061350182614212565b604082019050919050565b6000613519602683613d97565b915061352482614261565b604082019050919050565b600061353c601c83613d97565b9150613547826142b0565b602082019050919050565b600061355f602483613d97565b915061356a826142d9565b604082019050919050565b6000613582601983613d97565b915061358d82614328565b602082019050919050565b60006135a5602c83613d97565b91506135b082614351565b604082019050919050565b60006135c8602f83613d97565b91506135d3826143a0565b604082019050919050565b60006135eb603883613d97565b91506135f6826143ef565b604082019050919050565b600061360e602a83613d97565b91506136198261443e565b604082019050919050565b6000613631602983613d97565b915061363c8261448d565b604082019050919050565b6000613654603183613d97565b915061365f826144dc565b604082019050919050565b6000613677602083613d97565b91506136828261452b565b602082019050919050565b600061369a602c83613d97565b91506136a582614554565b604082019050919050565b60006136bd601c83613d97565b91506136c8826145a3565b602082019050919050565b60006136e0602083613d97565b91506136eb826145cc565b602082019050919050565b6000613703603d83613d97565b915061370e826145f5565b604082019050919050565b6000613726602983613d97565b915061373182614644565b604082019050919050565b6000613749602f83613d97565b915061375482614693565b604082019050919050565b600061376c602783613d97565b9150613777826146e2565b604082019050919050565b600061378f602183613d97565b915061379a82614731565b604082019050919050565b60006137b2603183613d97565b91506137bd82614780565b604082019050919050565b60006137d5603283613d97565b91506137e0826147cf565b604082019050919050565b60006137f8603183613d97565b91506138038261481e565b604082019050919050565b600061381b603383613d97565b91506138268261486d565b604082019050919050565b600061383e602c83613d97565b9150613849826148bc565b604082019050919050565b6000613861604683613d97565b915061386c8261490b565b606082019050919050565b61388081613f32565b82525050565b60006138928285613472565b915061389e8284613472565b91508190509392505050565b60006020820190506138bf60008301846133e2565b92915050565b60006080820190506138da60008301876133e2565b6138e760208301866133e2565b6138f46040830185613877565b81810360608301526139068184613400565b905095945050505050565b600060208201905061392660008301846133f1565b92915050565b600060208201905081810360008301526139468184613439565b905092915050565b60006020820190508181036000830152613967816134a3565b9050919050565b60006020820190508181036000830152613987816134c6565b9050919050565b600060208201905081810360008301526139a7816134e9565b9050919050565b600060208201905081810360008301526139c78161350c565b9050919050565b600060208201905081810360008301526139e78161352f565b9050919050565b60006020820190508181036000830152613a0781613552565b9050919050565b60006020820190508181036000830152613a2781613575565b9050919050565b60006020820190508181036000830152613a4781613598565b9050919050565b60006020820190508181036000830152613a67816135bb565b9050919050565b60006020820190508181036000830152613a87816135de565b9050919050565b60006020820190508181036000830152613aa781613601565b9050919050565b60006020820190508181036000830152613ac781613624565b9050919050565b60006020820190508181036000830152613ae781613647565b9050919050565b60006020820190508181036000830152613b078161366a565b9050919050565b60006020820190508181036000830152613b278161368d565b9050919050565b60006020820190508181036000830152613b47816136b0565b9050919050565b60006020820190508181036000830152613b67816136d3565b9050919050565b60006020820190508181036000830152613b87816136f6565b9050919050565b60006020820190508181036000830152613ba781613719565b9050919050565b60006020820190508181036000830152613bc78161373c565b9050919050565b60006020820190508181036000830152613be78161375f565b9050919050565b60006020820190508181036000830152613c0781613782565b9050919050565b60006020820190508181036000830152613c27816137a5565b9050919050565b60006020820190508181036000830152613c47816137c8565b9050919050565b60006020820190508181036000830152613c67816137eb565b9050919050565b60006020820190508181036000830152613c878161380e565b9050919050565b60006020820190508181036000830152613ca781613831565b9050919050565b60006020820190508181036000830152613cc781613854565b9050919050565b6000602082019050613ce36000830184613877565b92915050565b6000613cf3613d04565b9050613cff8282613fb0565b919050565b6000604051905090565b600067ffffffffffffffff821115613d2957613d28614146565b5b613d3282614189565b9050602081019050919050565b600067ffffffffffffffff821115613d5a57613d59614146565b5b613d6382614189565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613dbe82613f32565b9150613dc983613f32565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613dfe57613dfd61405b565b5b828201905092915050565b6000613e1482613f32565b9150613e1f83613f32565b925082613e2f57613e2e61408a565b5b828204905092915050565b6000613e4582613f32565b9150613e5083613f32565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e8957613e8861405b565b5b828202905092915050565b6000613e9f82613f32565b9150613eaa83613f32565b925082821015613ebd57613ebc61405b565b5b828203905092915050565b6000613ed382613f12565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613f69578082015181840152602081019050613f4e565b83811115613f78576000848401525b50505050565b60006002820490506001821680613f9657607f821691505b60208210811415613faa57613fa96140b9565b5b50919050565b613fb982614189565b810181811067ffffffffffffffff82111715613fd857613fd7614146565b5b80604052505050565b6000613fec82613f32565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561401f5761401e61405b565b5b600182019050919050565b600061403582613f32565b915061404083613f32565b9250826140505761404f61408a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f416d6f756e74206d7573742062652067726561746572207468616e20302e0000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f6e6c792031302059656c6c6f77204769616e74732063616e2062652072657360008201527f6375656420617420612074696d652e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4d696e74656420616c6c206f66207468652059656c6c6f77204769616e74732060008201527f73657420666f7220746865207465616d2e000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f52657365727665207374617465206973206e6f74206163746976652e00000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4d696e74656420616c6c206f66207468652059656c6c6f77204769616e74732060008201527f73657420666f72207072652d6c61756e6368206769766561776179732e000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f54686520616d6f756e74206f662065746865722073656e742077617320696e6360008201527f6f72726563742e00000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e74656420616c6c206f66207468652059656c6c6f77204769616e74732060008201527f73657420666f722072657365727665732e000000000000000000000000000000602082015250565b7f54686520726573637565206861736e27742073746172746564207965742e204860008201527f6f6c6420796f757220686f6f7665732e2e2e0000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f546865726520617265206e6f206d6f72652059656c6c6f77204769616e74732060008201527f6c65667420746f20626520726573637565642e00000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4d696e74656420616c6c206f66207468652059656c6c6f77204769616e74732060008201527f73657420666f722067697665617761797320616e642073636176656e6765722060208201527f68756e74732e0000000000000000000000000000000000000000000000000000604082015250565b61498981613ec8565b811461499457600080fd5b50565b6149a081613eda565b81146149ab57600080fd5b50565b6149b781613ee6565b81146149c257600080fd5b50565b6149ce81613f32565b81146149d957600080fd5b5056fea26469706673582212201e0289ff136ffe4686b950195f72007faef7b06b581774009c3dab6c1e80111464736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102045760003560e01c80636352211e11610118578063b4faf701116100a0578063c87b56dd1161006f578063c87b56dd146106ff578063dd9927b71461073c578063e96825bb14610767578063e985e9c514610792578063f2fde38b146107cf57610204565b8063b4faf70114610657578063b88d4fde14610682578063bbd71739146106ab578063c524115b146106d657610204565b80637d8966e4116100e75780637d8966e4146105965780638be83a0e146105ad5780638da5cb5b146105d857806395d89b4114610603578063a22cb4651461062e57610204565b80636352211e146104da57806368428a1b1461051757806370a0823114610542578063715018a61461057f57610204565b80632b9f292b1161019b57806342842e0e1161016a57806342842e0e1461040957806343cb83a6146104325780634f6ccce71461044957806355f804b3146104865780635af336ae146104af57610204565b80632b9f292b1461037d5780632f745c59146103995780633942487c146103d65780633ccfd60b146103ff57610204565b80630fdf4cf0116101d75780630fdf4cf0146102d757806318160ddd1461030057806323b872dd1461032b57806324a56e031461035457610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b91906132d2565b6107f8565b60405161023d9190613911565b60405180910390f35b34801561025257600080fd5b5061025b61080a565b604051610268919061392c565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190613375565b61089c565b6040516102a591906138aa565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d09190613292565b610921565b005b3480156102e357600080fd5b506102fe60048036038101906102f991906133a2565b610a39565b005b34801561030c57600080fd5b50610315610bec565b6040516103229190613cce565b60405180910390f35b34801561033757600080fd5b50610352600480360381019061034d919061317c565b610bf9565b005b34801561036057600080fd5b5061037b600480360381019061037691906133a2565b610c59565b005b61039760048036038101906103929190613375565b610e6c565b005b3480156103a557600080fd5b506103c060048036038101906103bb9190613292565b611050565b6040516103cd9190613cce565b60405180910390f35b3480156103e257600080fd5b506103fd60048036038101906103f89190613375565b6110f5565b005b61040761117b565b005b34801561041557600080fd5b50610430600480360381019061042b919061317c565b61124d565b005b34801561043e57600080fd5b5061044761126d565b005b34801561045557600080fd5b50610470600480360381019061046b9190613375565b611315565b60405161047d9190613cce565b60405180910390f35b34801561049257600080fd5b506104ad60048036038101906104a8919061332c565b611386565b005b3480156104bb57600080fd5b506104c461141c565b6040516104d19190613cce565b60405180910390f35b3480156104e657600080fd5b5061050160048036038101906104fc9190613375565b611422565b60405161050e91906138aa565b60405180910390f35b34801561052357600080fd5b5061052c6114d4565b6040516105399190613911565b60405180910390f35b34801561054e57600080fd5b506105696004803603810190610564919061310f565b6114e7565b6040516105769190613cce565b60405180910390f35b34801561058b57600080fd5b5061059461159f565b005b3480156105a257600080fd5b506105ab611627565b005b3480156105b957600080fd5b506105c26116cf565b6040516105cf9190613cce565b60405180910390f35b3480156105e457600080fd5b506105ed6116d5565b6040516105fa91906138aa565b60405180910390f35b34801561060f57600080fd5b506106186116ff565b604051610625919061392c565b60405180910390f35b34801561063a57600080fd5b5061065560048036038101906106509190613252565b611791565b005b34801561066357600080fd5b5061066c611912565b6040516106799190613cce565b60405180910390f35b34801561068e57600080fd5b506106a960048036038101906106a491906131cf565b611918565b005b3480156106b757600080fd5b506106c061197a565b6040516106cd9190613911565b60405180910390f35b3480156106e257600080fd5b506106fd60048036038101906106f891906133a2565b61198d565b005b34801561070b57600080fd5b5061072660048036038101906107219190613375565b611b40565b604051610733919061392c565b60405180910390f35b34801561074857600080fd5b50610751611be7565b60405161075e9190613cce565b60405180910390f35b34801561077357600080fd5b5061077c611bed565b6040516107899190613cce565b60405180910390f35b34801561079e57600080fd5b506107b960048036038101906107b4919061313c565b611bf3565b6040516107c69190613911565b60405180910390f35b3480156107db57600080fd5b506107f660048036038101906107f1919061310f565b611c87565b005b600061080382611d7f565b9050919050565b60606000805461081990613f7e565b80601f016020809104026020016040519081016040528092919081815260200182805461084590613f7e565b80156108925780601f1061086757610100808354040283529160200191610892565b820191906000526020600020905b81548152906001019060200180831161087557829003601f168201915b5050505050905090565b60006108a782611df9565b6108e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108dd90613b0e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061092c82611422565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561099d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099490613bee565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109bc611e65565b73ffffffffffffffffffffffffffffffffffffffff1614806109eb57506109ea816109e5611e65565b611bf3565b5b610a2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2190613a6e565b60405180910390fd5b610a348383611e6d565b505050565b610a41611e65565b73ffffffffffffffffffffffffffffffffffffffff16610a5f6116d5565b73ffffffffffffffffffffffffffffffffffffffff1614610ab5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aac90613b4e565b60405180910390fd5b601060019054906101000a900460ff16610b04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610afb90613b2e565b60405180910390fd5b60008211610b47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3e9061394e565b60405180910390fd5b600c54821115610b8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8390613b6e565b60405180910390fd5b60005b82811015610bcc576000610ba1610bec565b9050600b54811015610bb857610bb78382611f26565b5b508080610bc490613fe1565b915050610b8f565b50610be282600c54611f4490919063ffffffff16565b600c819055505050565b6000600880549050905090565b610c0a610c04611e65565b82611f5a565b610c49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4090613c4e565b60405180910390fd5b610c54838383612038565b505050565b610c61611e65565b73ffffffffffffffffffffffffffffffffffffffff16610c7f6116d5565b73ffffffffffffffffffffffffffffffffffffffff1614610cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccc90613b4e565b60405180910390fd5b601060019054906101000a900460ff16610d24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1b90613b2e565b60405180910390fd5b60008211610d67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5e9061394e565b60405180910390fd5b600d54821115610dac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da390613ace565b60405180910390fd5b600c54821115610df1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de890613c0e565b60405180910390fd5b60005b82811015610e31576000610e06610bec565b9050600b54811015610e1d57610e1c8382611f26565b5b508080610e2990613fe1565b915050610df4565b50610e4782600c54611f4490919063ffffffff16565b600c81905550610e6282600d54611f4490919063ffffffff16565b600d819055505050565b601060009054906101000a900460ff16610ebb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb290613c2e565b60405180910390fd5b60008111610efe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef59061394e565b60405180910390fd5b600e54811115610f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3a90613a4e565b60405180910390fd5b610f5a600c54600b54611f4490919063ffffffff16565b610f7482610f66610bec565b61229490919063ffffffff16565b1115610fb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fac90613c6e565b60405180910390fd5b610fca81600f546122aa90919063ffffffff16565b34101561100c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100390613bce565b60405180910390fd5b60005b8181101561104c576000611021610bec565b9050600b54811015611038576110373382611f26565b5b50808061104490613fe1565b91505061100f565b5050565b600061105b836114e7565b821061109c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110939061396e565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6110fd611e65565b73ffffffffffffffffffffffffffffffffffffffff1661111b6116d5565b73ffffffffffffffffffffffffffffffffffffffff1614611171576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116890613b4e565b60405180910390fd5b80600f8190555050565b611183611e65565b73ffffffffffffffffffffffffffffffffffffffff166111a16116d5565b73ffffffffffffffffffffffffffffffffffffffff16146111f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ee90613b4e565b60405180910390fd5b60004790506112046116d5565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611249573d6000803e3d6000fd5b5050565b61126883838360405180602001604052806000815250611918565b505050565b611275611e65565b73ffffffffffffffffffffffffffffffffffffffff166112936116d5565b73ffffffffffffffffffffffffffffffffffffffff16146112e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e090613b4e565b60405180910390fd5b601060019054906101000a900460ff1615601060016101000a81548160ff021916908315150217905550565b600061131f610bec565b8210611360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135790613c8e565b60405180910390fd5b6008828154811061137457611373614117565b5b90600052602060002001549050919050565b61138e611e65565b73ffffffffffffffffffffffffffffffffffffffff166113ac6116d5565b73ffffffffffffffffffffffffffffffffffffffff1614611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f990613b4e565b60405180910390fd5b8060119080519060200190611418929190612f23565b5050565b600d5481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c290613aae565b60405180910390fd5b80915050919050565b601060009054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154f90613a8e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6115a7611e65565b73ffffffffffffffffffffffffffffffffffffffff166115c56116d5565b73ffffffffffffffffffffffffffffffffffffffff161461161b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161290613b4e565b60405180910390fd5b61162560006122c0565b565b61162f611e65565b73ffffffffffffffffffffffffffffffffffffffff1661164d6116d5565b73ffffffffffffffffffffffffffffffffffffffff16146116a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169a90613b4e565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b600e5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461170e90613f7e565b80601f016020809104026020016040519081016040528092919081815260200182805461173a90613f7e565b80156117875780601f1061175c57610100808354040283529160200191611787565b820191906000526020600020905b81548152906001019060200180831161176a57829003601f168201915b5050505050905090565b611799611e65565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611807576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fe90613a0e565b60405180910390fd5b8060056000611814611e65565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118c1611e65565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119069190613911565b60405180910390a35050565b600c5481565b611929611923611e65565b83611f5a565b611968576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195f90613c4e565b60405180910390fd5b61197484848484612386565b50505050565b601060019054906101000a900460ff1681565b611995611e65565b73ffffffffffffffffffffffffffffffffffffffff166119b36116d5565b73ffffffffffffffffffffffffffffffffffffffff1614611a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0090613b4e565b60405180910390fd5b601060019054906101000a900460ff16611a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4f90613b2e565b60405180910390fd5b60008211611a9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a929061394e565b60405180910390fd5b600c54821115611ae0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad790613cae565b60405180910390fd5b60005b82811015611b20576000611af5610bec565b9050600b54811015611b0c57611b0b8382611f26565b5b508080611b1890613fe1565b915050611ae3565b50611b3682600c54611f4490919063ffffffff16565b600c819055505050565b6060611b4b82611df9565b611b8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8190613bae565b60405180910390fd5b6000611b946123e2565b90506000815111611bb45760405180602001604052806000815250611bdf565b80611bbe84612474565b604051602001611bcf929190613886565b6040516020818303038152906040525b915050919050565b600b5481565b600f5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c8f611e65565b73ffffffffffffffffffffffffffffffffffffffff16611cad6116d5565b73ffffffffffffffffffffffffffffffffffffffff1614611d03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfa90613b4e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6a906139ae565b60405180910390fd5b611d7c816122c0565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611df25750611df1826125d5565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ee083611422565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611f408282604051806020016040528060008152506126b7565b5050565b60008183611f529190613e94565b905092915050565b6000611f6582611df9565b611fa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9b90613a2e565b60405180910390fd5b6000611faf83611422565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061201e57508373ffffffffffffffffffffffffffffffffffffffff166120068461089c565b73ffffffffffffffffffffffffffffffffffffffff16145b8061202f575061202e8185611bf3565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661205882611422565b73ffffffffffffffffffffffffffffffffffffffff16146120ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a590613b8e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561211e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612115906139ee565b60405180910390fd5b612129838383612712565b612134600082611e6d565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121849190613e94565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121db9190613db3565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600081836122a29190613db3565b905092915050565b600081836122b89190613e3a565b905092915050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612391848484612038565b61239d84848484612722565b6123dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d39061398e565b60405180910390fd5b50505050565b6060601180546123f190613f7e565b80601f016020809104026020016040519081016040528092919081815260200182805461241d90613f7e565b801561246a5780601f1061243f5761010080835404028352916020019161246a565b820191906000526020600020905b81548152906001019060200180831161244d57829003601f168201915b5050505050905090565b606060008214156124bc576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125d0565b600082905060005b600082146124ee5780806124d790613fe1565b915050600a826124e79190613e09565b91506124c4565b60008167ffffffffffffffff81111561250a57612509614146565b5b6040519080825280601f01601f19166020018201604052801561253c5781602001600182028036833780820191505090505b5090505b600085146125c9576001826125559190613e94565b9150600a85612564919061402a565b60306125709190613db3565b60f81b81838151811061258657612585614117565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125c29190613e09565b9450612540565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806126a057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806126b057506126af826128b9565b5b9050919050565b6126c18383612923565b6126ce6000848484612722565b61270d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127049061398e565b60405180910390fd5b505050565b61271d838383612af1565b505050565b60006127438473ffffffffffffffffffffffffffffffffffffffff16612c05565b156128ac578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261276c611e65565b8786866040518563ffffffff1660e01b815260040161278e94939291906138c5565b602060405180830381600087803b1580156127a857600080fd5b505af19250505080156127d957506040513d601f19601f820116820180604052508101906127d691906132ff565b60015b61285c573d8060008114612809576040519150601f19603f3d011682016040523d82523d6000602084013e61280e565b606091505b50600081511415612854576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284b9061398e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506128b1565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298a90613aee565b60405180910390fd5b61299c81611df9565b156129dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d3906139ce565b60405180910390fd5b6129e860008383612712565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a389190613db3565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612afc838383612c18565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b3f57612b3a81612c1d565b612b7e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612b7d57612b7c8382612c66565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bc157612bbc81612dd3565b612c00565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612bff57612bfe8282612ea4565b5b5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612c73846114e7565b612c7d9190613e94565b9050600060076000848152602001908152602001600020549050818114612d62576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612de79190613e94565b9050600060096000848152602001908152602001600020549050600060088381548110612e1757612e16614117565b5b906000526020600020015490508060088381548110612e3957612e38614117565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612e8857612e876140e8565b5b6001900381819060005260206000200160009055905550505050565b6000612eaf836114e7565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612f2f90613f7e565b90600052602060002090601f016020900481019282612f515760008555612f98565b82601f10612f6a57805160ff1916838001178555612f98565b82800160010185558215612f98579182015b82811115612f97578251825591602001919060010190612f7c565b5b509050612fa59190612fa9565b5090565b5b80821115612fc2576000816000905550600101612faa565b5090565b6000612fd9612fd484613d0e565b613ce9565b905082815260208101848484011115612ff557612ff461417a565b5b613000848285613f3c565b509392505050565b600061301b61301684613d3f565b613ce9565b9050828152602081018484840111156130375761303661417a565b5b613042848285613f3c565b509392505050565b60008135905061305981614980565b92915050565b60008135905061306e81614997565b92915050565b600081359050613083816149ae565b92915050565b600081519050613098816149ae565b92915050565b600082601f8301126130b3576130b2614175565b5b81356130c3848260208601612fc6565b91505092915050565b600082601f8301126130e1576130e0614175565b5b81356130f1848260208601613008565b91505092915050565b600081359050613109816149c5565b92915050565b60006020828403121561312557613124614184565b5b60006131338482850161304a565b91505092915050565b6000806040838503121561315357613152614184565b5b60006131618582860161304a565b92505060206131728582860161304a565b9150509250929050565b60008060006060848603121561319557613194614184565b5b60006131a38682870161304a565b93505060206131b48682870161304a565b92505060406131c5868287016130fa565b9150509250925092565b600080600080608085870312156131e9576131e8614184565b5b60006131f78782880161304a565b94505060206132088782880161304a565b9350506040613219878288016130fa565b925050606085013567ffffffffffffffff81111561323a5761323961417f565b5b6132468782880161309e565b91505092959194509250565b6000806040838503121561326957613268614184565b5b60006132778582860161304a565b92505060206132888582860161305f565b9150509250929050565b600080604083850312156132a9576132a8614184565b5b60006132b78582860161304a565b92505060206132c8858286016130fa565b9150509250929050565b6000602082840312156132e8576132e7614184565b5b60006132f684828501613074565b91505092915050565b60006020828403121561331557613314614184565b5b600061332384828501613089565b91505092915050565b60006020828403121561334257613341614184565b5b600082013567ffffffffffffffff8111156133605761335f61417f565b5b61336c848285016130cc565b91505092915050565b60006020828403121561338b5761338a614184565b5b6000613399848285016130fa565b91505092915050565b600080604083850312156133b9576133b8614184565b5b60006133c7858286016130fa565b92505060206133d88582860161304a565b9150509250929050565b6133eb81613ec8565b82525050565b6133fa81613eda565b82525050565b600061340b82613d70565b6134158185613d86565b9350613425818560208601613f4b565b61342e81614189565b840191505092915050565b600061344482613d7b565b61344e8185613d97565b935061345e818560208601613f4b565b61346781614189565b840191505092915050565b600061347d82613d7b565b6134878185613da8565b9350613497818560208601613f4b565b80840191505092915050565b60006134b0601e83613d97565b91506134bb8261419a565b602082019050919050565b60006134d3602b83613d97565b91506134de826141c3565b604082019050919050565b60006134f6603283613d97565b915061350182614212565b604082019050919050565b6000613519602683613d97565b915061352482614261565b604082019050919050565b600061353c601c83613d97565b9150613547826142b0565b602082019050919050565b600061355f602483613d97565b915061356a826142d9565b604082019050919050565b6000613582601983613d97565b915061358d82614328565b602082019050919050565b60006135a5602c83613d97565b91506135b082614351565b604082019050919050565b60006135c8602f83613d97565b91506135d3826143a0565b604082019050919050565b60006135eb603883613d97565b91506135f6826143ef565b604082019050919050565b600061360e602a83613d97565b91506136198261443e565b604082019050919050565b6000613631602983613d97565b915061363c8261448d565b604082019050919050565b6000613654603183613d97565b915061365f826144dc565b604082019050919050565b6000613677602083613d97565b91506136828261452b565b602082019050919050565b600061369a602c83613d97565b91506136a582614554565b604082019050919050565b60006136bd601c83613d97565b91506136c8826145a3565b602082019050919050565b60006136e0602083613d97565b91506136eb826145cc565b602082019050919050565b6000613703603d83613d97565b915061370e826145f5565b604082019050919050565b6000613726602983613d97565b915061373182614644565b604082019050919050565b6000613749602f83613d97565b915061375482614693565b604082019050919050565b600061376c602783613d97565b9150613777826146e2565b604082019050919050565b600061378f602183613d97565b915061379a82614731565b604082019050919050565b60006137b2603183613d97565b91506137bd82614780565b604082019050919050565b60006137d5603283613d97565b91506137e0826147cf565b604082019050919050565b60006137f8603183613d97565b91506138038261481e565b604082019050919050565b600061381b603383613d97565b91506138268261486d565b604082019050919050565b600061383e602c83613d97565b9150613849826148bc565b604082019050919050565b6000613861604683613d97565b915061386c8261490b565b606082019050919050565b61388081613f32565b82525050565b60006138928285613472565b915061389e8284613472565b91508190509392505050565b60006020820190506138bf60008301846133e2565b92915050565b60006080820190506138da60008301876133e2565b6138e760208301866133e2565b6138f46040830185613877565b81810360608301526139068184613400565b905095945050505050565b600060208201905061392660008301846133f1565b92915050565b600060208201905081810360008301526139468184613439565b905092915050565b60006020820190508181036000830152613967816134a3565b9050919050565b60006020820190508181036000830152613987816134c6565b9050919050565b600060208201905081810360008301526139a7816134e9565b9050919050565b600060208201905081810360008301526139c78161350c565b9050919050565b600060208201905081810360008301526139e78161352f565b9050919050565b60006020820190508181036000830152613a0781613552565b9050919050565b60006020820190508181036000830152613a2781613575565b9050919050565b60006020820190508181036000830152613a4781613598565b9050919050565b60006020820190508181036000830152613a67816135bb565b9050919050565b60006020820190508181036000830152613a87816135de565b9050919050565b60006020820190508181036000830152613aa781613601565b9050919050565b60006020820190508181036000830152613ac781613624565b9050919050565b60006020820190508181036000830152613ae781613647565b9050919050565b60006020820190508181036000830152613b078161366a565b9050919050565b60006020820190508181036000830152613b278161368d565b9050919050565b60006020820190508181036000830152613b47816136b0565b9050919050565b60006020820190508181036000830152613b67816136d3565b9050919050565b60006020820190508181036000830152613b87816136f6565b9050919050565b60006020820190508181036000830152613ba781613719565b9050919050565b60006020820190508181036000830152613bc78161373c565b9050919050565b60006020820190508181036000830152613be78161375f565b9050919050565b60006020820190508181036000830152613c0781613782565b9050919050565b60006020820190508181036000830152613c27816137a5565b9050919050565b60006020820190508181036000830152613c47816137c8565b9050919050565b60006020820190508181036000830152613c67816137eb565b9050919050565b60006020820190508181036000830152613c878161380e565b9050919050565b60006020820190508181036000830152613ca781613831565b9050919050565b60006020820190508181036000830152613cc781613854565b9050919050565b6000602082019050613ce36000830184613877565b92915050565b6000613cf3613d04565b9050613cff8282613fb0565b919050565b6000604051905090565b600067ffffffffffffffff821115613d2957613d28614146565b5b613d3282614189565b9050602081019050919050565b600067ffffffffffffffff821115613d5a57613d59614146565b5b613d6382614189565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613dbe82613f32565b9150613dc983613f32565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613dfe57613dfd61405b565b5b828201905092915050565b6000613e1482613f32565b9150613e1f83613f32565b925082613e2f57613e2e61408a565b5b828204905092915050565b6000613e4582613f32565b9150613e5083613f32565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e8957613e8861405b565b5b828202905092915050565b6000613e9f82613f32565b9150613eaa83613f32565b925082821015613ebd57613ebc61405b565b5b828203905092915050565b6000613ed382613f12565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613f69578082015181840152602081019050613f4e565b83811115613f78576000848401525b50505050565b60006002820490506001821680613f9657607f821691505b60208210811415613faa57613fa96140b9565b5b50919050565b613fb982614189565b810181811067ffffffffffffffff82111715613fd857613fd7614146565b5b80604052505050565b6000613fec82613f32565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561401f5761401e61405b565b5b600182019050919050565b600061403582613f32565b915061404083613f32565b9250826140505761404f61408a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f416d6f756e74206d7573742062652067726561746572207468616e20302e0000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f6e6c792031302059656c6c6f77204769616e74732063616e2062652072657360008201527f6375656420617420612074696d652e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4d696e74656420616c6c206f66207468652059656c6c6f77204769616e74732060008201527f73657420666f7220746865207465616d2e000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f52657365727665207374617465206973206e6f74206163746976652e00000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4d696e74656420616c6c206f66207468652059656c6c6f77204769616e74732060008201527f73657420666f72207072652d6c61756e6368206769766561776179732e000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f54686520616d6f756e74206f662065746865722073656e742077617320696e6360008201527f6f72726563742e00000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e74656420616c6c206f66207468652059656c6c6f77204769616e74732060008201527f73657420666f722072657365727665732e000000000000000000000000000000602082015250565b7f54686520726573637565206861736e27742073746172746564207965742e204860008201527f6f6c6420796f757220686f6f7665732e2e2e0000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f546865726520617265206e6f206d6f72652059656c6c6f77204769616e74732060008201527f6c65667420746f20626520726573637565642e00000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4d696e74656420616c6c206f66207468652059656c6c6f77204769616e74732060008201527f73657420666f722067697665617761797320616e642073636176656e6765722060208201527f68756e74732e0000000000000000000000000000000000000000000000000000604082015250565b61498981613ec8565b811461499457600080fd5b50565b6149a081613eda565b81146149ab57600080fd5b50565b6149b781613ee6565b81146149c257600080fd5b50565b6149ce81613f32565b81146149d957600080fd5b5056fea26469706673582212201e0289ff136ffe4686b950195f72007faef7b06b581774009c3dab6c1e80111464736f6c63430008070033

Deployed Bytecode Sourcemap

50168:4881:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54873:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20738:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22297:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21820:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52709:608;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33490:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23187:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51869:778;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51037:786;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33158:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54042:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54461:145;;;:::i;:::-;;23597:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54317:91;;;;;;;;;;;;;:::i;:::-;;33680:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50889:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50374:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20432:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50544:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20162:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2525:94;;;;;;;;;;;;;:::i;:::-;;54189:82;;;;;;;;;;;;;:::i;:::-;;50426:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1874:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20907:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22590:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50325:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23853:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50581:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53378:618;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21082:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50275:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50475:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22956:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2774:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54873:171;54976:4;55000:36;55024:11;55000:23;:36::i;:::-;54993:43;;54873:171;;;:::o;20738:100::-;20792:13;20825:5;20818:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20738:100;:::o;22297:221::-;22373:7;22401:16;22409:7;22401;:16::i;:::-;22393:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22486:15;:24;22502:7;22486:24;;;;;;;;;;;;;;;;;;;;;22479:31;;22297:221;;;:::o;21820:411::-;21901:13;21917:23;21932:7;21917:14;:23::i;:::-;21901:39;;21965:5;21959:11;;:2;:11;;;;21951:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22059:5;22043:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22068:37;22085:5;22092:12;:10;:12::i;:::-;22068:16;:37::i;:::-;22043:62;22021:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;22202:21;22211:2;22215:7;22202:8;:21::i;:::-;21890:341;21820:411;;:::o;52709:608::-;2105:12;:10;:12::i;:::-;2094:23;;:7;:5;:7::i;:::-;:23;;;2086:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52802:13:::1;;;;;;;;;;;52794:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;52876:1;52867:6;:10;52859:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;52941:21;;52931:6;:31;;52923:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;53046:6;53041:199;53062:6;53058:1;:10;53041:199;;;53090:15;53108:13;:11;:13::i;:::-;53090:31;;53150:20;;53140:7;:30;53136:93;;;53191:22;53201:2;53205:7;53191:9;:22::i;:::-;53136:93;53075:165;53070:3;;;;;:::i;:::-;;;;53041:199;;;;53276:33;53302:6;53276:21;;:25;;:33;;;;:::i;:::-;53252:21;:57;;;;52709:608:::0;;:::o;33490:113::-;33551:7;33578:10;:17;;;;33571:24;;33490:113;:::o;23187:339::-;23382:41;23401:12;:10;:12::i;:::-;23415:7;23382:18;:41::i;:::-;23374:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23490:28;23500:4;23506:2;23510:7;23490:9;:28::i;:::-;23187:339;;;:::o;51869:778::-;2105:12;:10;:12::i;:::-;2094:23;;:7;:5;:7::i;:::-;:23;;;2086:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51960:13:::1;;;;;;;;;;;51952:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;52034:1;52025:6;:10;52017:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;52099:25;;52089:6;:35;;52081:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;52207:21;;52197:6;:31;;52189:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;52300:6;52295:199;52316:6;52312:1;:10;52295:199;;;52344:15;52362:13;:11;:13::i;:::-;52344:31;;52404:20;;52394:7;:30;52390:93;;;52445:22;52455:2;52459:7;52445:9;:22::i;:::-;52390:93;52329:165;52324:3;;;;;:::i;:::-;;;;52295:199;;;;52530:33;52556:6;52530:21;;:25;;:33;;;;:::i;:::-;52506:21;:57;;;;52602:37;52632:6;52602:25;;:29;;:37;;;;:::i;:::-;52574:25;:65;;;;51869:778:::0;;:::o;51037:786::-;51111:10;;;;;;;;;;;51103:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;51204:1;51195:6;:10;51187:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;51269:20;;51259:6;:30;;51251:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;51389:47;51414:21;;51389:20;;:24;;:47;;;;:::i;:::-;51360:25;51378:6;51360:13;:11;:13::i;:::-;:17;;:25;;;;:::i;:::-;:76;;51352:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;51524:28;51545:6;51524:16;;:20;;:28;;;;:::i;:::-;51511:9;:41;;51503:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;51614:6;51609:207;51630:6;51626:1;:10;51609:207;;;51658:15;51676:13;:11;:13::i;:::-;51658:31;;51718:20;;51708:7;:30;51704:101;;;51759:30;51769:10;51781:7;51759:9;:30::i;:::-;51704:101;51643:173;51638:3;;;;;:::i;:::-;;;;51609:207;;;;51037:786;:::o;33158:256::-;33255:7;33291:23;33308:5;33291:16;:23::i;:::-;33283:5;:31;33275:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;33380:12;:19;33393:5;33380:19;;;;;;;;;;;;;;;:26;33400:5;33380:26;;;;;;;;;;;;33373:33;;33158:256;;;;:::o;54042:104::-;2105:12;:10;:12::i;:::-;2094:23;;:7;:5;:7::i;:::-;:23;;;2086:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54133:5:::1;54114:16;:24;;;;54042:104:::0;:::o;54461:145::-;2105:12;:10;:12::i;:::-;2094:23;;:7;:5;:7::i;:::-;:23;;;2086:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54517:12:::1;54532:21;54517:36;;54572:7;:5;:7::i;:::-;54564:25;;:34;54590:7;54564:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;54506:100;54461:145::o:0;23597:185::-;23735:39;23752:4;23758:2;23762:7;23735:39;;;;;;;;;;;;:16;:39::i;:::-;23597:185;;;:::o;54317:91::-;2105:12;:10;:12::i;:::-;2094:23;;:7;:5;:7::i;:::-;:23;;;2086:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54387:13:::1;;;;;;;;;;;54386:14;54370:13;;:30;;;;;;;;;;;;;;;;;;54317:91::o:0;33680:233::-;33755:7;33791:30;:28;:30::i;:::-;33783:5;:38;33775:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;33888:10;33899:5;33888:17;;;;;;;;:::i;:::-;;;;;;;;;;33881:24;;33680:233;;;:::o;50889:100::-;2105:12;:10;:12::i;:::-;2094:23;;:7;:5;:7::i;:::-;:23;;;2086:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50974:7:::1;50960:11;:21;;;;;;;;;;;;:::i;:::-;;50889:100:::0;:::o;50374:45::-;;;;:::o;20432:239::-;20504:7;20524:13;20540:7;:16;20548:7;20540:16;;;;;;;;;;;;;;;;;;;;;20524:32;;20592:1;20575:19;;:5;:19;;;;20567:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20658:5;20651:12;;;20432:239;;;:::o;50544:30::-;;;;;;;;;;;;;:::o;20162:208::-;20234:7;20279:1;20262:19;;:5;:19;;;;20254:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20346:9;:16;20356:5;20346:16;;;;;;;;;;;;;;;;20339:23;;20162:208;;;:::o;2525:94::-;2105:12;:10;:12::i;:::-;2094:23;;:7;:5;:7::i;:::-;:23;;;2086:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2590:21:::1;2608:1;2590:9;:21::i;:::-;2525:94::o:0;54189:82::-;2105:12;:10;:12::i;:::-;2094:23;;:7;:5;:7::i;:::-;:23;;;2086:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54253:10:::1;;;;;;;;;;;54252:11;54239:10;;:24;;;;;;;;;;;;;;;;;;54189:82::o:0;50426:40::-;;;;:::o;1874:87::-;1920:7;1947:6;;;;;;;;;;;1940:13;;1874:87;:::o;20907:104::-;20963:13;20996:7;20989:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20907:104;:::o;22590:295::-;22705:12;:10;:12::i;:::-;22693:24;;:8;:24;;;;22685:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;22805:8;22760:18;:32;22779:12;:10;:12::i;:::-;22760:32;;;;;;;;;;;;;;;:42;22793:8;22760:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;22858:8;22829:48;;22844:12;:10;:12::i;:::-;22829:48;;;22868:8;22829:48;;;;;;:::i;:::-;;;;;;;;22590:295;;:::o;50325:42::-;;;;:::o;23853:328::-;24028:41;24047:12;:10;:12::i;:::-;24061:7;24028:18;:41::i;:::-;24020:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24134:39;24148:4;24154:2;24158:7;24167:5;24134:13;:39::i;:::-;23853:328;;;;:::o;50581:33::-;;;;;;;;;;;;;:::o;53378:618::-;2105:12;:10;:12::i;:::-;2094:23;;:7;:5;:7::i;:::-;:23;;;2086:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53472:13:::1;;;;;;;;;;;53464:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;53546:1;53537:6;:10;53529:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;53611:21;;53601:6;:31;;53593:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;53725:6;53720:199;53741:6;53737:1;:10;53720:199;;;53769:15;53787:13;:11;:13::i;:::-;53769:31;;53829:20;;53819:7;:30;53815:93;;;53870:22;53880:2;53884:7;53870:9;:22::i;:::-;53815:93;53754:165;53749:3;;;;;:::i;:::-;;;;53720:199;;;;53955:33;53981:6;53955:21;;:25;;:33;;;;:::i;:::-;53931:21;:57;;;;53378:618:::0;;:::o;21082:334::-;21155:13;21189:16;21197:7;21189;:16::i;:::-;21181:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;21270:21;21294:10;:8;:10::i;:::-;21270:34;;21346:1;21328:7;21322:21;:25;:86;;;;;;;;;;;;;;;;;21374:7;21383:18;:7;:16;:18::i;:::-;21357:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21322:86;21315:93;;;21082:334;;;:::o;50275:43::-;;;;:::o;50475:51::-;;;;:::o;22956:164::-;23053:4;23077:18;:25;23096:5;23077:25;;;;;;;;;;;;;;;:35;23103:8;23077:35;;;;;;;;;;;;;;;;;;;;;;;;;23070:42;;22956:164;;;;:::o;2774:192::-;2105:12;:10;:12::i;:::-;2094:23;;:7;:5;:7::i;:::-;:23;;;2086:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2883:1:::1;2863:22;;:8;:22;;;;2855:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2939:19;2949:8;2939:9;:19::i;:::-;2774:192:::0;:::o;32850:224::-;32952:4;32991:35;32976:50;;;:11;:50;;;;:90;;;;33030:36;33054:11;33030:23;:36::i;:::-;32976:90;32969:97;;32850:224;;;:::o;25691:127::-;25756:4;25808:1;25780:30;;:7;:16;25788:7;25780:16;;;;;;;;;;;;;;;;;;;;;:30;;;;25773:37;;25691:127;;;:::o;658:98::-;711:7;738:10;731:17;;658:98;:::o;29673:174::-;29775:2;29748:15;:24;29764:7;29748:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;29831:7;29827:2;29793:46;;29802:23;29817:7;29802:14;:23::i;:::-;29793:46;;;;;;;;;;;;29673:174;;:::o;26675:110::-;26751:26;26761:2;26765:7;26751:26;;;;;;;;;;;;:9;:26::i;:::-;26675:110;;:::o;6331:98::-;6389:7;6420:1;6416;:5;;;;:::i;:::-;6409:12;;6331:98;;;;:::o;25985:348::-;26078:4;26103:16;26111:7;26103;:16::i;:::-;26095:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26179:13;26195:23;26210:7;26195:14;:23::i;:::-;26179:39;;26248:5;26237:16;;:7;:16;;;:51;;;;26281:7;26257:31;;:20;26269:7;26257:11;:20::i;:::-;:31;;;26237:51;:87;;;;26292:32;26309:5;26316:7;26292:16;:32::i;:::-;26237:87;26229:96;;;25985:348;;;;:::o;28977:578::-;29136:4;29109:31;;:23;29124:7;29109:14;:23::i;:::-;:31;;;29101:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29219:1;29205:16;;:2;:16;;;;29197:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29275:39;29296:4;29302:2;29306:7;29275:20;:39::i;:::-;29379:29;29396:1;29400:7;29379:8;:29::i;:::-;29440:1;29421:9;:15;29431:4;29421:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29469:1;29452:9;:13;29462:2;29452:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29500:2;29481:7;:16;29489:7;29481:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29539:7;29535:2;29520:27;;29529:4;29520:27;;;;;;;;;;;;28977:578;;;:::o;5950:98::-;6008:7;6039:1;6035;:5;;;;:::i;:::-;6028:12;;5950:98;;;;:::o;6688:::-;6746:7;6777:1;6773;:5;;;;:::i;:::-;6766:12;;6688:98;;;;:::o;2974:173::-;3030:16;3049:6;;;;;;;;;;;3030:25;;3075:8;3066:6;;:17;;;;;;;;;;;;;;;;;;3130:8;3099:40;;3120:8;3099:40;;;;;;;;;;;;3019:128;2974:173;:::o;25063:315::-;25220:28;25230:4;25236:2;25240:7;25220:9;:28::i;:::-;25267:48;25290:4;25296:2;25300:7;25309:5;25267:22;:48::i;:::-;25259:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25063:315;;;;:::o;50747:112::-;50807:13;50840:11;50833:18;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50747:112;:::o;39313:723::-;39369:13;39599:1;39590:5;:10;39586:53;;;39617:10;;;;;;;;;;;;;;;;;;;;;39586:53;39649:12;39664:5;39649:20;;39680:14;39705:78;39720:1;39712:4;:9;39705:78;;39738:8;;;;;:::i;:::-;;;;39769:2;39761:10;;;;;:::i;:::-;;;39705:78;;;39793:19;39825:6;39815:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39793:39;;39843:154;39859:1;39850:5;:10;39843:154;;39887:1;39877:11;;;;;:::i;:::-;;;39954:2;39946:5;:10;;;;:::i;:::-;39933:2;:24;;;;:::i;:::-;39920:39;;39903:6;39910;39903:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;39983:2;39974:11;;;;;:::i;:::-;;;39843:154;;;40021:6;40007:21;;;;;39313:723;;;;:::o;19793:305::-;19895:4;19947:25;19932:40;;;:11;:40;;;;:105;;;;20004:33;19989:48;;;:11;:48;;;;19932:105;:158;;;;20054:36;20078:11;20054:23;:36::i;:::-;19932:158;19912:178;;19793:305;;;:::o;27012:321::-;27142:18;27148:2;27152:7;27142:5;:18::i;:::-;27193:54;27224:1;27228:2;27232:7;27241:5;27193:22;:54::i;:::-;27171:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27012:321;;;:::o;54684:181::-;54812:45;54839:4;54845:2;54849:7;54812:26;:45::i;:::-;54684:181;;;:::o;30412:799::-;30567:4;30588:15;:2;:13;;;:15::i;:::-;30584:620;;;30640:2;30624:36;;;30661:12;:10;:12::i;:::-;30675:4;30681:7;30690:5;30624:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30620:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30883:1;30866:6;:13;:18;30862:272;;;30909:60;;;;;;;;;;:::i;:::-;;;;;;;;30862:272;31084:6;31078:13;31069:6;31065:2;31061:15;31054:38;30620:529;30757:41;;;30747:51;;;:6;:51;;;;30740:58;;;;;30584:620;31188:4;31181:11;;30412:799;;;;;;;:::o;11770:157::-;11855:4;11894:25;11879:40;;;:11;:40;;;;11872:47;;11770:157;;;:::o;27669:382::-;27763:1;27749:16;;:2;:16;;;;27741:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;27822:16;27830:7;27822;:16::i;:::-;27821:17;27813:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;27884:45;27913:1;27917:2;27921:7;27884:20;:45::i;:::-;27959:1;27942:9;:13;27952:2;27942:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;27990:2;27971:7;:16;27979:7;27971:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28035:7;28031:2;28010:33;;28027:1;28010:33;;;;;;;;;;;;27669:382;;:::o;34526:589::-;34670:45;34697:4;34703:2;34707:7;34670:26;:45::i;:::-;34748:1;34732:18;;:4;:18;;;34728:187;;;34767:40;34799:7;34767:31;:40::i;:::-;34728:187;;;34837:2;34829:10;;:4;:10;;;34825:90;;34856:47;34889:4;34895:7;34856:32;:47::i;:::-;34825:90;34728:187;34943:1;34929:16;;:2;:16;;;34925:183;;;34962:45;34999:7;34962:36;:45::i;:::-;34925:183;;;35035:4;35029:10;;:2;:10;;;35025:83;;35056:40;35084:2;35088:7;35056:27;:40::i;:::-;35025:83;34925:183;34526:589;;;:::o;41842:387::-;41902:4;42110:12;42177:7;42165:20;42157:28;;42220:1;42213:4;:8;42206:15;;;41842:387;;;:::o;31783:126::-;;;;:::o;35838:164::-;35942:10;:17;;;;35915:15;:24;35931:7;35915:24;;;;;;;;;;;:44;;;;35970:10;35986:7;35970:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35838:164;:::o;36629:988::-;36895:22;36945:1;36920:22;36937:4;36920:16;:22::i;:::-;:26;;;;:::i;:::-;36895:51;;36957:18;36978:17;:26;36996:7;36978:26;;;;;;;;;;;;36957:47;;37125:14;37111:10;:28;37107:328;;37156:19;37178:12;:18;37191:4;37178:18;;;;;;;;;;;;;;;:34;37197:14;37178:34;;;;;;;;;;;;37156:56;;37262:11;37229:12;:18;37242:4;37229:18;;;;;;;;;;;;;;;:30;37248:10;37229:30;;;;;;;;;;;:44;;;;37379:10;37346:17;:30;37364:11;37346:30;;;;;;;;;;;:43;;;;37141:294;37107:328;37531:17;:26;37549:7;37531:26;;;;;;;;;;;37524:33;;;37575:12;:18;37588:4;37575:18;;;;;;;;;;;;;;;:34;37594:14;37575:34;;;;;;;;;;;37568:41;;;36710:907;;36629:988;;:::o;37912:1079::-;38165:22;38210:1;38190:10;:17;;;;:21;;;;:::i;:::-;38165:46;;38222:18;38243:15;:24;38259:7;38243:24;;;;;;;;;;;;38222:45;;38594:19;38616:10;38627:14;38616:26;;;;;;;;:::i;:::-;;;;;;;;;;38594:48;;38680:11;38655:10;38666;38655:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;38791:10;38760:15;:28;38776:11;38760:28;;;;;;;;;;;:41;;;;38932:15;:24;38948:7;38932:24;;;;;;;;;;;38925:31;;;38967:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;37983:1008;;;37912:1079;:::o;35416:221::-;35501:14;35518:20;35535:2;35518:16;:20::i;:::-;35501:37;;35576:7;35549:12;:16;35562:2;35549:16;;;;;;;;;;;;;;;:24;35566:6;35549:24;;;;;;;;;;;:34;;;;35623:6;35594:17;:26;35612:7;35594:26;;;;;;;;;;;:35;;;;35490:147;35416:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410: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:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:474::-;7226:6;7234;7283:2;7271:9;7262:7;7258:23;7254:32;7251:119;;;7289:79;;:::i;:::-;7251:119;7409:1;7434:53;7479:7;7470:6;7459:9;7455:22;7434:53;:::i;:::-;7424:63;;7380:117;7536:2;7562:53;7607:7;7598:6;7587:9;7583:22;7562:53;:::i;:::-;7552:63;;7507:118;7158:474;;;;;:::o;7638:118::-;7725:24;7743:5;7725:24;:::i;:::-;7720:3;7713:37;7638:118;;:::o;7762:109::-;7843:21;7858:5;7843:21;:::i;:::-;7838:3;7831:34;7762:109;;:::o;7877:360::-;7963:3;7991:38;8023:5;7991:38;:::i;:::-;8045:70;8108:6;8103:3;8045:70;:::i;:::-;8038:77;;8124:52;8169:6;8164:3;8157:4;8150:5;8146:16;8124:52;:::i;:::-;8201:29;8223:6;8201:29;:::i;:::-;8196:3;8192:39;8185:46;;7967:270;7877:360;;;;:::o;8243:364::-;8331:3;8359:39;8392:5;8359:39;:::i;:::-;8414:71;8478:6;8473:3;8414:71;:::i;:::-;8407:78;;8494:52;8539:6;8534:3;8527:4;8520:5;8516:16;8494:52;:::i;:::-;8571:29;8593:6;8571:29;:::i;:::-;8566:3;8562:39;8555:46;;8335:272;8243:364;;;;:::o;8613:377::-;8719:3;8747:39;8780:5;8747:39;:::i;:::-;8802:89;8884:6;8879:3;8802:89;:::i;:::-;8795:96;;8900:52;8945:6;8940:3;8933:4;8926:5;8922:16;8900:52;:::i;:::-;8977:6;8972:3;8968:16;8961:23;;8723:267;8613:377;;;;:::o;8996:366::-;9138:3;9159:67;9223:2;9218:3;9159:67;:::i;:::-;9152:74;;9235:93;9324:3;9235:93;:::i;:::-;9353:2;9348:3;9344:12;9337:19;;8996:366;;;:::o;9368:::-;9510:3;9531:67;9595:2;9590:3;9531:67;:::i;:::-;9524:74;;9607:93;9696:3;9607:93;:::i;:::-;9725:2;9720:3;9716:12;9709:19;;9368:366;;;:::o;9740:::-;9882:3;9903:67;9967:2;9962:3;9903:67;:::i;:::-;9896:74;;9979:93;10068:3;9979:93;:::i;:::-;10097:2;10092:3;10088:12;10081:19;;9740:366;;;:::o;10112:::-;10254:3;10275:67;10339:2;10334:3;10275:67;:::i;:::-;10268:74;;10351:93;10440:3;10351:93;:::i;:::-;10469:2;10464:3;10460:12;10453:19;;10112:366;;;:::o;10484:::-;10626:3;10647:67;10711:2;10706:3;10647:67;:::i;:::-;10640:74;;10723:93;10812:3;10723:93;:::i;:::-;10841:2;10836:3;10832:12;10825:19;;10484:366;;;:::o;10856:::-;10998:3;11019:67;11083:2;11078:3;11019:67;:::i;:::-;11012:74;;11095:93;11184:3;11095:93;:::i;:::-;11213:2;11208:3;11204:12;11197:19;;10856:366;;;:::o;11228:::-;11370:3;11391:67;11455:2;11450:3;11391:67;:::i;:::-;11384:74;;11467:93;11556:3;11467:93;:::i;:::-;11585:2;11580:3;11576:12;11569:19;;11228:366;;;:::o;11600:::-;11742:3;11763:67;11827:2;11822:3;11763:67;:::i;:::-;11756:74;;11839:93;11928:3;11839:93;:::i;:::-;11957:2;11952:3;11948:12;11941:19;;11600:366;;;:::o;11972:::-;12114:3;12135:67;12199:2;12194:3;12135:67;:::i;:::-;12128:74;;12211:93;12300:3;12211:93;:::i;:::-;12329:2;12324:3;12320:12;12313:19;;11972:366;;;:::o;12344:::-;12486:3;12507:67;12571:2;12566:3;12507:67;:::i;:::-;12500:74;;12583:93;12672:3;12583:93;:::i;:::-;12701:2;12696:3;12692:12;12685:19;;12344:366;;;:::o;12716:::-;12858:3;12879:67;12943:2;12938:3;12879:67;:::i;:::-;12872:74;;12955:93;13044:3;12955:93;:::i;:::-;13073:2;13068:3;13064:12;13057:19;;12716:366;;;:::o;13088:::-;13230:3;13251:67;13315:2;13310:3;13251:67;:::i;:::-;13244:74;;13327:93;13416:3;13327:93;:::i;:::-;13445:2;13440:3;13436:12;13429:19;;13088:366;;;:::o;13460:::-;13602:3;13623:67;13687:2;13682:3;13623:67;:::i;:::-;13616:74;;13699:93;13788:3;13699:93;:::i;:::-;13817:2;13812:3;13808:12;13801:19;;13460:366;;;:::o;13832:::-;13974:3;13995:67;14059:2;14054:3;13995:67;:::i;:::-;13988:74;;14071:93;14160:3;14071:93;:::i;:::-;14189:2;14184:3;14180:12;14173:19;;13832:366;;;:::o;14204:::-;14346:3;14367:67;14431:2;14426:3;14367:67;:::i;:::-;14360:74;;14443:93;14532:3;14443:93;:::i;:::-;14561:2;14556:3;14552:12;14545:19;;14204:366;;;:::o;14576:::-;14718:3;14739:67;14803:2;14798:3;14739:67;:::i;:::-;14732:74;;14815:93;14904:3;14815:93;:::i;:::-;14933:2;14928:3;14924:12;14917:19;;14576:366;;;:::o;14948:::-;15090:3;15111:67;15175:2;15170:3;15111:67;:::i;:::-;15104:74;;15187:93;15276:3;15187:93;:::i;:::-;15305:2;15300:3;15296:12;15289:19;;14948:366;;;:::o;15320:::-;15462:3;15483:67;15547:2;15542:3;15483:67;:::i;:::-;15476:74;;15559:93;15648:3;15559:93;:::i;:::-;15677:2;15672:3;15668:12;15661:19;;15320:366;;;:::o;15692:::-;15834:3;15855:67;15919:2;15914:3;15855:67;:::i;:::-;15848:74;;15931:93;16020:3;15931:93;:::i;:::-;16049:2;16044:3;16040:12;16033:19;;15692:366;;;:::o;16064:::-;16206:3;16227:67;16291:2;16286:3;16227:67;:::i;:::-;16220:74;;16303:93;16392:3;16303:93;:::i;:::-;16421:2;16416:3;16412:12;16405:19;;16064:366;;;:::o;16436:::-;16578:3;16599:67;16663:2;16658:3;16599:67;:::i;:::-;16592:74;;16675:93;16764:3;16675:93;:::i;:::-;16793:2;16788:3;16784:12;16777:19;;16436:366;;;:::o;16808:::-;16950:3;16971:67;17035:2;17030:3;16971:67;:::i;:::-;16964:74;;17047:93;17136:3;17047:93;:::i;:::-;17165:2;17160:3;17156:12;17149:19;;16808:366;;;:::o;17180:::-;17322:3;17343:67;17407:2;17402:3;17343:67;:::i;:::-;17336:74;;17419:93;17508:3;17419:93;:::i;:::-;17537:2;17532:3;17528:12;17521:19;;17180:366;;;:::o;17552:::-;17694:3;17715:67;17779:2;17774:3;17715:67;:::i;:::-;17708:74;;17791:93;17880:3;17791:93;:::i;:::-;17909:2;17904:3;17900:12;17893:19;;17552:366;;;:::o;17924:::-;18066:3;18087:67;18151:2;18146:3;18087:67;:::i;:::-;18080:74;;18163:93;18252:3;18163:93;:::i;:::-;18281:2;18276:3;18272:12;18265:19;;17924:366;;;:::o;18296:::-;18438:3;18459:67;18523:2;18518:3;18459:67;:::i;:::-;18452:74;;18535:93;18624:3;18535:93;:::i;:::-;18653:2;18648:3;18644:12;18637:19;;18296:366;;;:::o;18668:::-;18810:3;18831:67;18895:2;18890:3;18831:67;:::i;:::-;18824:74;;18907:93;18996:3;18907:93;:::i;:::-;19025:2;19020:3;19016:12;19009:19;;18668:366;;;:::o;19040:::-;19182:3;19203:67;19267:2;19262:3;19203:67;:::i;:::-;19196:74;;19279:93;19368:3;19279:93;:::i;:::-;19397:2;19392:3;19388:12;19381:19;;19040:366;;;:::o;19412:118::-;19499:24;19517:5;19499:24;:::i;:::-;19494:3;19487:37;19412:118;;:::o;19536:435::-;19716:3;19738:95;19829:3;19820:6;19738:95;:::i;:::-;19731:102;;19850:95;19941:3;19932:6;19850:95;:::i;:::-;19843:102;;19962:3;19955:10;;19536:435;;;;;:::o;19977:222::-;20070:4;20108:2;20097:9;20093:18;20085:26;;20121:71;20189:1;20178:9;20174:17;20165:6;20121:71;:::i;:::-;19977:222;;;;:::o;20205:640::-;20400:4;20438:3;20427:9;20423:19;20415:27;;20452:71;20520:1;20509:9;20505:17;20496:6;20452:71;:::i;:::-;20533:72;20601:2;20590:9;20586:18;20577:6;20533:72;:::i;:::-;20615;20683:2;20672:9;20668:18;20659:6;20615:72;:::i;:::-;20734:9;20728:4;20724:20;20719:2;20708:9;20704:18;20697:48;20762:76;20833:4;20824:6;20762:76;:::i;:::-;20754:84;;20205:640;;;;;;;:::o;20851:210::-;20938:4;20976:2;20965:9;20961:18;20953:26;;20989:65;21051:1;21040:9;21036:17;21027:6;20989:65;:::i;:::-;20851:210;;;;:::o;21067:313::-;21180:4;21218:2;21207:9;21203:18;21195:26;;21267:9;21261:4;21257:20;21253:1;21242:9;21238:17;21231:47;21295:78;21368:4;21359:6;21295:78;:::i;:::-;21287:86;;21067:313;;;;:::o;21386:419::-;21552:4;21590:2;21579:9;21575:18;21567:26;;21639:9;21633:4;21629:20;21625:1;21614:9;21610:17;21603:47;21667:131;21793:4;21667:131;:::i;:::-;21659:139;;21386:419;;;:::o;21811:::-;21977:4;22015:2;22004:9;22000:18;21992:26;;22064:9;22058:4;22054:20;22050:1;22039:9;22035:17;22028:47;22092:131;22218:4;22092:131;:::i;:::-;22084:139;;21811:419;;;:::o;22236:::-;22402:4;22440:2;22429:9;22425:18;22417:26;;22489:9;22483:4;22479:20;22475:1;22464:9;22460:17;22453:47;22517:131;22643:4;22517:131;:::i;:::-;22509:139;;22236:419;;;:::o;22661:::-;22827:4;22865:2;22854:9;22850:18;22842:26;;22914:9;22908:4;22904:20;22900:1;22889:9;22885:17;22878:47;22942:131;23068:4;22942:131;:::i;:::-;22934:139;;22661:419;;;:::o;23086:::-;23252:4;23290:2;23279:9;23275:18;23267:26;;23339:9;23333:4;23329:20;23325:1;23314:9;23310:17;23303:47;23367:131;23493:4;23367:131;:::i;:::-;23359:139;;23086:419;;;:::o;23511:::-;23677:4;23715:2;23704:9;23700:18;23692:26;;23764:9;23758:4;23754:20;23750:1;23739:9;23735:17;23728:47;23792:131;23918:4;23792:131;:::i;:::-;23784:139;;23511:419;;;:::o;23936:::-;24102:4;24140:2;24129:9;24125:18;24117:26;;24189:9;24183:4;24179:20;24175:1;24164:9;24160:17;24153:47;24217:131;24343:4;24217:131;:::i;:::-;24209:139;;23936:419;;;:::o;24361:::-;24527:4;24565:2;24554:9;24550:18;24542:26;;24614:9;24608:4;24604:20;24600:1;24589:9;24585:17;24578:47;24642:131;24768:4;24642:131;:::i;:::-;24634:139;;24361:419;;;:::o;24786:::-;24952:4;24990:2;24979:9;24975:18;24967:26;;25039:9;25033:4;25029:20;25025:1;25014:9;25010:17;25003:47;25067:131;25193:4;25067:131;:::i;:::-;25059:139;;24786:419;;;:::o;25211:::-;25377:4;25415:2;25404:9;25400:18;25392:26;;25464:9;25458:4;25454:20;25450:1;25439:9;25435:17;25428:47;25492:131;25618:4;25492:131;:::i;:::-;25484:139;;25211:419;;;:::o;25636:::-;25802:4;25840:2;25829:9;25825:18;25817:26;;25889:9;25883:4;25879:20;25875:1;25864:9;25860:17;25853:47;25917:131;26043:4;25917:131;:::i;:::-;25909:139;;25636:419;;;:::o;26061:::-;26227:4;26265:2;26254:9;26250:18;26242:26;;26314:9;26308:4;26304:20;26300:1;26289:9;26285:17;26278:47;26342:131;26468:4;26342:131;:::i;:::-;26334:139;;26061:419;;;:::o;26486:::-;26652:4;26690:2;26679:9;26675:18;26667:26;;26739:9;26733:4;26729:20;26725:1;26714:9;26710:17;26703:47;26767:131;26893:4;26767:131;:::i;:::-;26759:139;;26486:419;;;:::o;26911:::-;27077:4;27115:2;27104:9;27100:18;27092:26;;27164:9;27158:4;27154:20;27150:1;27139:9;27135:17;27128:47;27192:131;27318:4;27192:131;:::i;:::-;27184:139;;26911:419;;;:::o;27336:::-;27502:4;27540:2;27529:9;27525:18;27517:26;;27589:9;27583:4;27579:20;27575:1;27564:9;27560:17;27553:47;27617:131;27743:4;27617:131;:::i;:::-;27609:139;;27336:419;;;:::o;27761:::-;27927:4;27965:2;27954:9;27950:18;27942:26;;28014:9;28008:4;28004:20;28000:1;27989:9;27985:17;27978:47;28042:131;28168:4;28042:131;:::i;:::-;28034:139;;27761:419;;;:::o;28186:::-;28352:4;28390:2;28379:9;28375:18;28367:26;;28439:9;28433:4;28429:20;28425:1;28414:9;28410:17;28403:47;28467:131;28593:4;28467:131;:::i;:::-;28459:139;;28186:419;;;:::o;28611:::-;28777:4;28815:2;28804:9;28800:18;28792:26;;28864:9;28858:4;28854:20;28850:1;28839:9;28835:17;28828:47;28892:131;29018:4;28892:131;:::i;:::-;28884:139;;28611:419;;;:::o;29036:::-;29202:4;29240:2;29229:9;29225:18;29217:26;;29289:9;29283:4;29279:20;29275:1;29264:9;29260:17;29253:47;29317:131;29443:4;29317:131;:::i;:::-;29309:139;;29036:419;;;:::o;29461:::-;29627:4;29665:2;29654:9;29650:18;29642:26;;29714:9;29708:4;29704:20;29700:1;29689:9;29685:17;29678:47;29742:131;29868:4;29742:131;:::i;:::-;29734:139;;29461:419;;;:::o;29886:::-;30052:4;30090:2;30079:9;30075:18;30067:26;;30139:9;30133:4;30129:20;30125:1;30114:9;30110:17;30103:47;30167:131;30293:4;30167:131;:::i;:::-;30159:139;;29886:419;;;:::o;30311:::-;30477:4;30515:2;30504:9;30500:18;30492:26;;30564:9;30558:4;30554:20;30550:1;30539:9;30535:17;30528:47;30592:131;30718:4;30592:131;:::i;:::-;30584:139;;30311:419;;;:::o;30736:::-;30902:4;30940:2;30929:9;30925:18;30917:26;;30989:9;30983:4;30979:20;30975:1;30964:9;30960:17;30953:47;31017:131;31143:4;31017:131;:::i;:::-;31009:139;;30736:419;;;:::o;31161:::-;31327:4;31365:2;31354:9;31350:18;31342:26;;31414:9;31408:4;31404:20;31400:1;31389:9;31385:17;31378:47;31442:131;31568:4;31442:131;:::i;:::-;31434:139;;31161:419;;;:::o;31586:::-;31752:4;31790:2;31779:9;31775:18;31767:26;;31839:9;31833:4;31829:20;31825:1;31814:9;31810:17;31803:47;31867:131;31993:4;31867:131;:::i;:::-;31859:139;;31586:419;;;:::o;32011:::-;32177:4;32215:2;32204:9;32200:18;32192:26;;32264:9;32258:4;32254:20;32250:1;32239:9;32235:17;32228:47;32292:131;32418:4;32292:131;:::i;:::-;32284:139;;32011:419;;;:::o;32436:::-;32602:4;32640:2;32629:9;32625:18;32617:26;;32689:9;32683:4;32679:20;32675:1;32664:9;32660:17;32653:47;32717:131;32843:4;32717:131;:::i;:::-;32709:139;;32436:419;;;:::o;32861:::-;33027:4;33065:2;33054:9;33050:18;33042:26;;33114:9;33108:4;33104:20;33100:1;33089:9;33085:17;33078:47;33142:131;33268:4;33142:131;:::i;:::-;33134:139;;32861:419;;;:::o;33286:222::-;33379:4;33417:2;33406:9;33402:18;33394:26;;33430:71;33498:1;33487:9;33483:17;33474:6;33430:71;:::i;:::-;33286:222;;;;:::o;33514:129::-;33548:6;33575:20;;:::i;:::-;33565:30;;33604:33;33632:4;33624:6;33604:33;:::i;:::-;33514:129;;;:::o;33649:75::-;33682:6;33715:2;33709:9;33699:19;;33649:75;:::o;33730:307::-;33791:4;33881:18;33873:6;33870:30;33867:56;;;33903:18;;:::i;:::-;33867:56;33941:29;33963:6;33941:29;:::i;:::-;33933:37;;34025:4;34019;34015:15;34007:23;;33730:307;;;:::o;34043:308::-;34105:4;34195:18;34187:6;34184:30;34181:56;;;34217:18;;:::i;:::-;34181:56;34255:29;34277:6;34255:29;:::i;:::-;34247:37;;34339:4;34333;34329:15;34321:23;;34043:308;;;:::o;34357:98::-;34408:6;34442:5;34436:12;34426:22;;34357:98;;;:::o;34461:99::-;34513:6;34547:5;34541:12;34531:22;;34461:99;;;:::o;34566:168::-;34649:11;34683:6;34678:3;34671:19;34723:4;34718:3;34714:14;34699:29;;34566:168;;;;:::o;34740:169::-;34824:11;34858:6;34853:3;34846:19;34898:4;34893:3;34889:14;34874:29;;34740:169;;;;:::o;34915:148::-;35017:11;35054:3;35039:18;;34915:148;;;;:::o;35069:305::-;35109:3;35128:20;35146:1;35128:20;:::i;:::-;35123:25;;35162:20;35180:1;35162:20;:::i;:::-;35157:25;;35316:1;35248:66;35244:74;35241:1;35238:81;35235:107;;;35322:18;;:::i;:::-;35235:107;35366:1;35363;35359:9;35352:16;;35069:305;;;;:::o;35380:185::-;35420:1;35437:20;35455:1;35437:20;:::i;:::-;35432:25;;35471:20;35489:1;35471:20;:::i;:::-;35466:25;;35510:1;35500:35;;35515:18;;:::i;:::-;35500:35;35557:1;35554;35550:9;35545:14;;35380:185;;;;:::o;35571:348::-;35611:7;35634:20;35652:1;35634:20;:::i;:::-;35629:25;;35668:20;35686:1;35668:20;:::i;:::-;35663:25;;35856:1;35788:66;35784:74;35781:1;35778:81;35773:1;35766:9;35759:17;35755:105;35752:131;;;35863:18;;:::i;:::-;35752:131;35911:1;35908;35904:9;35893:20;;35571:348;;;;:::o;35925:191::-;35965:4;35985:20;36003:1;35985:20;:::i;:::-;35980:25;;36019:20;36037:1;36019:20;:::i;:::-;36014:25;;36058:1;36055;36052:8;36049:34;;;36063:18;;:::i;:::-;36049:34;36108:1;36105;36101:9;36093:17;;35925:191;;;;:::o;36122:96::-;36159:7;36188:24;36206:5;36188:24;:::i;:::-;36177:35;;36122:96;;;:::o;36224:90::-;36258:7;36301:5;36294:13;36287:21;36276:32;;36224:90;;;:::o;36320:149::-;36356:7;36396:66;36389:5;36385:78;36374:89;;36320:149;;;:::o;36475:126::-;36512:7;36552:42;36545:5;36541:54;36530:65;;36475:126;;;:::o;36607:77::-;36644:7;36673:5;36662:16;;36607:77;;;:::o;36690:154::-;36774:6;36769:3;36764;36751:30;36836:1;36827:6;36822:3;36818:16;36811:27;36690:154;;;:::o;36850:307::-;36918:1;36928:113;36942:6;36939:1;36936:13;36928:113;;;37027:1;37022:3;37018:11;37012:18;37008:1;37003:3;36999:11;36992:39;36964:2;36961:1;36957:10;36952:15;;36928:113;;;37059:6;37056:1;37053:13;37050:101;;;37139:1;37130:6;37125:3;37121:16;37114:27;37050:101;36899:258;36850:307;;;:::o;37163:320::-;37207:6;37244:1;37238:4;37234:12;37224:22;;37291:1;37285:4;37281:12;37312:18;37302:81;;37368:4;37360:6;37356:17;37346:27;;37302:81;37430:2;37422:6;37419:14;37399:18;37396:38;37393:84;;;37449:18;;:::i;:::-;37393:84;37214:269;37163:320;;;:::o;37489:281::-;37572:27;37594:4;37572:27;:::i;:::-;37564:6;37560:40;37702:6;37690:10;37687:22;37666:18;37654:10;37651:34;37648:62;37645:88;;;37713:18;;:::i;:::-;37645:88;37753:10;37749:2;37742:22;37532:238;37489:281;;:::o;37776:233::-;37815:3;37838:24;37856:5;37838:24;:::i;:::-;37829:33;;37884:66;37877:5;37874:77;37871:103;;;37954:18;;:::i;:::-;37871:103;38001:1;37994:5;37990:13;37983:20;;37776:233;;;:::o;38015:176::-;38047:1;38064:20;38082:1;38064:20;:::i;:::-;38059:25;;38098:20;38116:1;38098:20;:::i;:::-;38093:25;;38137:1;38127:35;;38142:18;;:::i;:::-;38127:35;38183:1;38180;38176:9;38171:14;;38015:176;;;;:::o;38197:180::-;38245:77;38242:1;38235:88;38342:4;38339:1;38332:15;38366:4;38363:1;38356:15;38383:180;38431:77;38428:1;38421:88;38528:4;38525:1;38518:15;38552:4;38549:1;38542:15;38569:180;38617:77;38614:1;38607:88;38714:4;38711:1;38704:15;38738:4;38735:1;38728:15;38755:180;38803:77;38800:1;38793:88;38900:4;38897:1;38890:15;38924:4;38921:1;38914:15;38941:180;38989:77;38986:1;38979:88;39086:4;39083:1;39076:15;39110:4;39107:1;39100:15;39127:180;39175:77;39172:1;39165:88;39272:4;39269:1;39262:15;39296:4;39293:1;39286:15;39313:117;39422:1;39419;39412:12;39436:117;39545:1;39542;39535:12;39559:117;39668:1;39665;39658:12;39682:117;39791:1;39788;39781:12;39805:102;39846:6;39897:2;39893:7;39888:2;39881:5;39877:14;39873:28;39863:38;;39805:102;;;:::o;39913:180::-;40053:32;40049:1;40041:6;40037:14;40030:56;39913:180;:::o;40099:230::-;40239:34;40235:1;40227:6;40223:14;40216:58;40308:13;40303:2;40295:6;40291:15;40284:38;40099:230;:::o;40335:237::-;40475:34;40471:1;40463:6;40459:14;40452:58;40544:20;40539:2;40531:6;40527:15;40520:45;40335:237;:::o;40578:225::-;40718:34;40714:1;40706:6;40702:14;40695:58;40787:8;40782:2;40774:6;40770:15;40763:33;40578:225;:::o;40809:178::-;40949:30;40945:1;40937:6;40933:14;40926:54;40809:178;:::o;40993:223::-;41133:34;41129:1;41121:6;41117:14;41110:58;41202:6;41197:2;41189:6;41185:15;41178:31;40993:223;:::o;41222:175::-;41362:27;41358:1;41350:6;41346:14;41339:51;41222:175;:::o;41403:231::-;41543:34;41539:1;41531:6;41527:14;41520:58;41612:14;41607:2;41599:6;41595:15;41588:39;41403:231;:::o;41640:234::-;41780:34;41776:1;41768:6;41764:14;41757:58;41849:17;41844:2;41836:6;41832:15;41825:42;41640:234;:::o;41880:243::-;42020:34;42016:1;42008:6;42004:14;41997:58;42089:26;42084:2;42076:6;42072:15;42065:51;41880:243;:::o;42129:229::-;42269:34;42265:1;42257:6;42253:14;42246:58;42338:12;42333:2;42325:6;42321:15;42314:37;42129:229;:::o;42364:228::-;42504:34;42500:1;42492:6;42488:14;42481:58;42573:11;42568:2;42560:6;42556:15;42549:36;42364:228;:::o;42598:236::-;42738:34;42734:1;42726:6;42722:14;42715:58;42807:19;42802:2;42794:6;42790:15;42783:44;42598:236;:::o;42840:182::-;42980:34;42976:1;42968:6;42964:14;42957:58;42840:182;:::o;43028:231::-;43168:34;43164:1;43156:6;43152:14;43145:58;43237:14;43232:2;43224:6;43220:15;43213:39;43028:231;:::o;43265:178::-;43405:30;43401:1;43393:6;43389:14;43382:54;43265:178;:::o;43449:182::-;43589:34;43585:1;43577:6;43573:14;43566:58;43449:182;:::o;43637:248::-;43777:34;43773:1;43765:6;43761:14;43754:58;43846:31;43841:2;43833:6;43829:15;43822:56;43637:248;:::o;43891:228::-;44031:34;44027:1;44019:6;44015:14;44008:58;44100:11;44095:2;44087:6;44083:15;44076:36;43891:228;:::o;44125:234::-;44265:34;44261:1;44253:6;44249:14;44242:58;44334:17;44329:2;44321:6;44317:15;44310:42;44125:234;:::o;44365:226::-;44505:34;44501:1;44493:6;44489:14;44482:58;44574:9;44569:2;44561:6;44557:15;44550:34;44365:226;:::o;44597:220::-;44737:34;44733:1;44725:6;44721:14;44714:58;44806:3;44801:2;44793:6;44789:15;44782:28;44597:220;:::o;44823:236::-;44963:34;44959:1;44951:6;44947:14;44940:58;45032:19;45027:2;45019:6;45015:15;45008:44;44823:236;:::o;45065:237::-;45205:34;45201:1;45193:6;45189:14;45182:58;45274:20;45269:2;45261:6;45257:15;45250:45;45065:237;:::o;45308:236::-;45448:34;45444:1;45436:6;45432:14;45425:58;45517:19;45512:2;45504:6;45500:15;45493:44;45308:236;:::o;45550:238::-;45690:34;45686:1;45678:6;45674:14;45667:58;45759:21;45754:2;45746:6;45742:15;45735:46;45550:238;:::o;45794:231::-;45934:34;45930:1;45922:6;45918:14;45911:58;46003:14;45998:2;45990:6;45986:15;45979:39;45794:231;:::o;46031:294::-;46171:34;46167:1;46159:6;46155:14;46148:58;46240:34;46235:2;46227:6;46223:15;46216:59;46309:8;46304:2;46296:6;46292:15;46285:33;46031:294;:::o;46331:122::-;46404:24;46422:5;46404:24;:::i;:::-;46397:5;46394:35;46384:63;;46443:1;46440;46433:12;46384:63;46331:122;:::o;46459:116::-;46529:21;46544:5;46529:21;:::i;:::-;46522:5;46519:32;46509:60;;46565:1;46562;46555:12;46509:60;46459:116;:::o;46581:120::-;46653:23;46670:5;46653:23;:::i;:::-;46646:5;46643:34;46633:62;;46691:1;46688;46681:12;46633:62;46581:120;:::o;46707:122::-;46780:24;46798:5;46780:24;:::i;:::-;46773:5;46770:35;46760:63;;46819:1;46816;46809:12;46760:63;46707:122;:::o

Swarm Source

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