ETH Price: $2,638.20 (+0.86%)

Token

Cool Eggs (from LootArt) (EGGS)
 

Overview

Max Total Supply

11 EGGS

Holders

4

Total Transfers

-

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
AbstractLootArt

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-03
*/

// SPDX-License-Identifier: MIT

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

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

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

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

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

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

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

/**
 * @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(to).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 {}
}

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

/**
 * @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();
    }
}

contract AbstractLootArt is ERC721Enumerable, ReentrancyGuard, Ownable {
    
    uint256 public partPrice = 10000000000000000; // initial part price: 0.01 ETH
    uint256 public canvasPrice = 25000000000000000; // initial egg price: 0.05 ETH

    uint16 public nameCount;

    struct Canvas {
        
        uint16 eggColor;
        uint16 eyeLeft;
        uint16 eyeRight;
        uint16 mouth;
        string name;
    }
    
    mapping(uint16 => Canvas) public canvas;

    string[] private eyesLeft = [
        'width="40" height="15" x="45%" y="47%" fill="black"',
        'width="40" height="40" x="45%" y="43%" fill="black"',
        'width="10" height="50" x="49%" y="41%" fill="black"',
        'width="100" height="10" x="44%" y="48%" fill="black"',
        'width="30" height="30" x="53%" y="47%" fill="black"',
        ''
    ];
    
    string[] private eyesRight = [
        'width="30" height="40" x="55%" y="43%" fill="black"',
        'width="30" height="15" x="55%" y="47%" fill="black"',
        'width="10" height="50" x="55%" y="41%" fill="black"',
        ''
    ];
    
    string[] private mouths = [
        'width="30" height="10" x="47%" y="57%" fill="black"',
        'width="60" height="10" x="47%" y="57%" fill="black"',
        'width="70" height="10" x="57%" y="57%" fill="black" /><rect width="10" height="10" x="68%" y="57%" fill="red"',
        'width="70" height="10" x="80%" y="45" transform="translate(30, 10) rotate(44)" fill="black"/><rect width="10" height="10" x="90%" y="45" transform="translate(30, 10) rotate(44)" fill="red"',
        'width="60" height="10" x="66%" y="45" transform="translate(30, 10) rotate(44)" fill="black"',
        'width="10" height="10" x="57%" y="57%" fill="black"',
        'width="10" height="10" x="47%" y="57%" fill="black"',
        'width="70" height="10" x="40%" y="55%" fill="black"',
        'width="10" height="30" x="52%" y="58%" fill="red" /><rect width="10" height="25" x="55%" y="58%" fill="red"',
        ''
    ];

    string[] private colors = [
        "#ffffff",
        "#0074D9",
        "#7FDBFF",
        "#39CCCC",
        "#B10DC9",
        "#F012BE",
        "#85144b",
        "#FF4136",
        "#FF851B",
        "#FFDC00",
        "#3D9970",
        "#2ECC40",
        "#01FF70",
        "#AAAAAA",
        "#FAFAFA",
        "#DDDDDD"
    ];

    function random(string memory input) internal pure returns (uint256) {
        return uint256(keccak256(abi.encodePacked(input)));
    }
    
    function getColor(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "THESEARESOMESERIOUSCOLORS", colors);
    }
    
    function getEyeLeft(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "THEEYEISLEFT", eyesLeft);
    }
    
    function getEyeRight(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "THEEYEISRIGHT", eyesRight);
    }
    
    function getMouth(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "TOTALLYMOUTHED", mouths);
    }

    function pluck(
        uint256 tokenId,
        string memory keyPrefix,
        string[] memory sourceArray
    ) internal pure returns (string memory) {
        uint256 rand = random(string(abi.encodePacked(keyPrefix, toString(tokenId))));
        string memory output = sourceArray[rand % sourceArray.length];
        return output;
    }
    
    function getPart(uint256 tokenId) public pure returns(string memory){
        
        if(tokenId >= 2500 && tokenId < 5000){
            
            return "Egg Color";
        }
        else
        if(tokenId >= 5000 && tokenId < 7500){
            
            return "Eye Left";
        }
        else
        if(tokenId >= 7500 && tokenId < 10000){
            
            return "Eye Right";
        }
        else
        if(tokenId >= 10000 && tokenId < 12500){
            
            return "Mouth";
        }
        
        return "";
    }
    
    function strCmp(string memory a, string memory b) internal pure returns(bool){
        
        if(keccak256(abi.encodePacked(a)) == keccak256(abi.encodePacked(b))){
            
            return true;
        }
        
        return false;
    }
    
    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        
        uint256 bgTokenId = 0;
        string memory part = getPart(tokenId);
        string[8] memory parts;
        string[5] memory opacity;
        
        if(!strCmp(part, "")){
            
            bgTokenId = 1000003;
            parts[2] = getColor(strCmp(getPart(tokenId), "Egg Color") ? tokenId : 1000002);
            parts[3] = getEyeLeft(strCmp(getPart(tokenId), "Eye Left") ? tokenId : 1000002);
            parts[4] = getEyeRight(strCmp(getPart(tokenId), "Eye Right") ? tokenId : 1000002);
            parts[5] = getMouth(strCmp(getPart(tokenId), "Mouth") ? tokenId : 1000002);
            
            opacity[0] = 'opacity="0.3"';
            opacity[1] = strCmp(getPart(tokenId), "Egg Color") ? 'opacity="1.0"' : 'opacity="0.3"';
            opacity[2] = strCmp(getPart(tokenId), "Eye Left") ? 'opacity="1.0"' : 'opacity="0.3"';
            opacity[3] = strCmp(getPart(tokenId), "Eye Right") ? 'opacity="1.0"' : 'opacity="0.3"';
            opacity[4] = strCmp(getPart(tokenId), "Mouth") ? 'opacity="1.0"' : 'opacity="0.3"';
        }
        else
        {
            bgTokenId = tokenId;
            parts[2] = getColor(canvas[uint16(bgTokenId)].eggColor != 0 ? canvas[uint16(bgTokenId)].eggColor : 1000002);
            parts[3] = getEyeLeft(canvas[uint16(bgTokenId)].eyeLeft != 0 ? canvas[uint16(bgTokenId)].eyeLeft : 1000002);
            parts[4] = getEyeRight(canvas[uint16(bgTokenId)].eyeRight != 0 ? canvas[uint16(bgTokenId)].eyeRight: 1000002);
            parts[5] = getMouth(canvas[uint16(bgTokenId)].mouth != 0 ? canvas[uint16(bgTokenId)].mouth : 1000002);
        }
        
        parts[0] = string(abi.encodePacked('<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 600 600"><style>.heavy { font: bold 60px sans-serif;paint-order: stroke; stroke: black; stroke-width: 5px; fill: ',parts[2],'}</style>'));

        if(strCmp(getColor(bgTokenId), "#FAFAFA")){
            
            parts[1] = "<svg xmlns='http://www.w3.org/2000/svg' width='100%' height='100%' viewBox='0 0 800 800'><rect fill='#ffffff' width='800' height='800'/><defs><radialGradient id='a' cx='400' cy='400' r='50%' gradientUnits='userSpaceOnUse'><stop  offset='0' stop-color='#ffffff'/><stop  offset='1' stop-color='#0EF'/></radialGradient><radialGradient id='b' cx='400' cy='400' r='70%' gradientUnits='userSpaceOnUse'><stop  offset='0' stop-color='#ffffff'/><stop  offset='1' stop-color='#0FF'/></radialGradient></defs><rect fill='url(#a)' width='800' height='800'/><g fill-opacity='.8'><path fill='url(#b)' d='M998.7 439.2c1.7-26.5 1.7-52.7 0.1-78.5L401 399.9c0 0 0-0.1 0-0.1l587.6-116.9c-5.1-25.9-11.9-51.2-20.3-75.8L400.9 399.7c0 0 0-0.1 0-0.1l537.3-265c-11.6-23.5-24.8-46.2-39.3-67.9L400.8 399.5c0 0 0-0.1-0.1-0.1l450.4-395c-17.3-19.7-35.8-38.2-55.5-55.5l-395 450.4c0 0-0.1 0-0.1-0.1L733.4-99c-21.7-14.5-44.4-27.6-68-39.3l-265 537.4c0 0-0.1 0-0.1 0l192.6-567.4c-24.6-8.3-49.9-15.1-75.8-20.2L400.2 399c0 0-0.1 0-0.1 0l39.2-597.7c-26.5-1.7-52.7-1.7-78.5-0.1L399.9 399c0 0-0.1 0-0.1 0L282.9-188.6c-25.9 5.1-51.2 11.9-75.8 20.3l192.6 567.4c0 0-0.1 0-0.1 0l-265-537.3c-23.5 11.6-46.2 24.8-67.9 39.3l332.8 498.1c0 0-0.1 0-0.1 0.1L4.4-51.1C-15.3-33.9-33.8-15.3-51.1 4.4l450.4 395c0 0 0 0.1-0.1 0.1L-99 66.6c-14.5 21.7-27.6 44.4-39.3 68l537.4 265c0 0 0 0.1 0 0.1l-567.4-192.6c-8.3 24.6-15.1 49.9-20.2 75.8L399 399.8c0 0 0 0.1 0 0.1l-597.7-39.2c-1.7 26.5-1.7 52.7-0.1 78.5L399 400.1c0 0 0 0.1 0 0.1l-587.6 116.9c5.1 25.9 11.9 51.2 20.3 75.8l567.4-192.6c0 0 0 0.1 0 0.1l-537.3 265c11.6 23.5 24.8 46.2 39.3 67.9l498.1-332.8c0 0 0 0.1 0.1 0.1l-450.4 395c17.3 19.7 35.8 38.2 55.5 55.5l395-450.4c0 0 0.1 0 0.1 0.1L66.6 899c21.7 14.5 44.4 27.6 68 39.3l265-537.4c0 0 0.1 0 0.1 0L207.1 968.3c24.6 8.3 49.9 15.1 75.8 20.2L399.8 401c0 0 0.1 0 0.1 0l-39.2 597.7c26.5 1.7 52.7 1.7 78.5 0.1L400.1 401c0 0 0.1 0 0.1 0l116.9 587.6c25.9-5.1 51.2-11.9 75.8-20.3L400.3 400.9c0 0 0.1 0 0.1 0l265 537.3c23.5-11.6 46.2-24.8 67.9-39.3L400.5 400.8c0 0 0.1 0 0.1-0.1l395 450.4c19.7-17.3 38.2-35.8 55.5-55.5l-450.4-395c0 0 0-0.1 0.1-0.1L899 733.4c14.5-21.7 27.6-44.4 39.3-68l-537.4-265c0 0 0-0.1 0-0.1l567.4 192.6c8.3-24.6 15.1-49.9 20.2-75.8L401 400.2c0 0 0-0.1 0-0.1L998.7 439.2z'/></g></svg>";
            
        }else{
         
            parts[1] = string(abi.encodePacked('<rect ',opacity[0],' width="100%" height="100%" fill="',getColor(bgTokenId),'" />'));   
        }
        
        parts[2] = string(abi.encodePacked('<circle ',opacity[1],' transform="scale(0.6 1.0)" r="150" cx="80%" cy="50%" stroke="black" stroke-width="10" fill="',parts[2],'" />'));
        
        parts[3] = string(abi.encodePacked('<rect ',opacity[2],' ',parts[3],' />'));
        
        parts[4] = string(abi.encodePacked('<rect ',opacity[3],' ',parts[4],' />'));
        
        parts[5] = string(abi.encodePacked('<rect ',opacity[4],' ',parts[5],' />'));
        
        if(!strCmp(canvas[uint16(bgTokenId)].name, "")){
            
            parts[6] = string(abi.encodePacked('<text x="50%" y="90%" dominant-baseline="middle" text-anchor="middle" class="heavy">',canvas[uint16(bgTokenId)].name,'</text>'));
        }
        
        parts[7] = "</svg>";

        string memory output = string(
            abi.encodePacked(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6], parts[7])
        );
        
        string memory json = Base64.encode(
            bytes(
                string(
                    abi.encodePacked(
                        '{"name": "',strCmp(part, "") ? "Egg" : string(abi.encodePacked(part," Part")),' #', toString(tokenId),
                        '", "description": "Cool Eggs is lootable art that sits truly and fully on-chain. Create the coolest eggs and define their rarities by looting for parts! Rarity is defined by the Rarity Signature to spot duplicates. Only 25 painted eggs can get a name (updatable by owners)! Mint map for Etherscan: eggs from 0 - 2499 (use those as canvas to paint), egg colors from 2500 - 4999, left eyes from 5000 - 7499, right eyes from 7500 - 9999, mouths from 10000 - 12499.", "image": "data:image/svg+xml;base64,',
                        Base64.encode(bytes(output)),
                        '","attributes":[{"trait_type":"Rarity Signature", "value":"',toString(uint256(keccak256(abi.encodePacked(parts[1],parts[2],parts[3],parts[4],parts[5],parts[6])))),'"}]}'
                    )
                )
            )
        );
        
        output = string(abi.encodePacked("data:application/json;base64,", json));

        return output;
    }
    
    function paint(
        uint16 eggTokenId, 
        uint16 eggColorTokenId, 
        uint16 eyeLeftTokenId, 
        uint16 eyeRightTokenId, 
        uint16 mouthTokenId
    ) external nonReentrant{
        
        require(
            ownerOf(uint256(eggTokenId)) == msg.sender && 
            ownerOf(uint256(eggColorTokenId)) == msg.sender && 
            ownerOf(uint256(eyeLeftTokenId)) == msg.sender &&
            ownerOf(uint256(eyeRightTokenId)) == msg.sender &&
            ownerOf(uint256(mouthTokenId)) == msg.sender, 
            "You don't own at least one of the provided tokens."
        );
        
        require(strCmp(getPart(eggTokenId), ""), "Not an egg.");
        require(strCmp(getPart(eggColorTokenId), "Egg Color"), "Not an egg color.");
        require(strCmp(getPart(eyeLeftTokenId), "Eye Left"), "Not a left eye.");
        require(strCmp(getPart(eyeRightTokenId), "Eye Right"), "Not a right eye.");
        require(strCmp(getPart(mouthTokenId), "Mouth"), "Not a mouth.");
        
        canvas[eggTokenId].eggColor = eggColorTokenId;
        canvas[eggTokenId].eyeLeft = eyeLeftTokenId;
        canvas[eggTokenId].eyeRight = eyeRightTokenId;
        canvas[eggTokenId].mouth = mouthTokenId;
        
    }
    
    function updateEggName(
        uint16 eggTokenId, string memory name
    ) external nonReentrant{
        
        require(
            ownerOf(uint256(eggTokenId)) == msg.sender,
            "Not your egg."
        );
        require(strCmp(getPart(eggTokenId), ""), "Not an egg.");
        require(!strCmp(name, ""), "Empty name.");
        require(nameCount < 25 || (nameCount >= 25 && !strCmp(canvas[eggTokenId].name, "")), "All egs have been named already");
        
        if(strCmp(canvas[eggTokenId].name, "")){
            
            nameCount += 1;
        }
        
        canvas[eggTokenId].name = name;
        
    }

    function mint(uint256 tokenId) public payable nonReentrant {
        
        require(tokenId >= 0 && tokenId < 12500, "Token ID invalid.");
        
        if(tokenId >= 0 && tokenId < 2500){
        
            require(canvasPrice <= msg.value, "Ether value sent is not correct");
            
        } else if(tokenId >= 2500 && tokenId < 12500) {
            
            require(partPrice <= msg.value, "Ether value sent is not correct");
        }
        else{
                
            revert();
        }
        
        _safeMint(_msgSender(), tokenId);
    }

    function multiMint(uint256[] memory tokenIds) public payable nonReentrant {
        
        uint256 sum = 0;
        
        for (uint256 i = 0; i < tokenIds.length; i++) {
            
            require(tokenIds[i] >= 0 && tokenIds[i] < 12500, "Token ID invalid.");
            
            if(tokenIds[i] >= 0 && tokenIds[i] < 2500){
                
                sum += canvasPrice;
            }
            else if(tokenIds[i] >= 2500 && tokenIds[i] < 12500){
                
                sum += partPrice;
            }
            else{
                
                revert();
            }
            
            _safeMint(msg.sender, tokenIds[i]);
        }
        
        require(sum != 0 && sum <= msg.value, "Ether value sent is not correct");
    }

    function withdraw() public onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }
    
    function setPrice(uint256 _partPrice, uint256 _canvasPrice) public onlyOwner {
        partPrice = _partPrice;
        canvasPrice = _canvasPrice;
    }

    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT license
        // 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);
    }

    constructor() ERC721("Cool Eggs (from LootArt)", "EGGS") Ownable() {}
}

/// [MIT License]
/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>
library Base64 {
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((len + 2) / 3);

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
        }

        return string(result);
    }
}

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":"uint16","name":"","type":"uint16"}],"name":"canvas","outputs":[{"internalType":"uint16","name":"eggColor","type":"uint16"},{"internalType":"uint16","name":"eyeLeft","type":"uint16"},{"internalType":"uint16","name":"eyeRight","type":"uint16"},{"internalType":"uint16","name":"mouth","type":"uint16"},{"internalType":"string","name":"name","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canvasPrice","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":"uint256","name":"tokenId","type":"uint256"}],"name":"getColor","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getEyeLeft","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getEyeRight","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getMouth","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getPart","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"multiMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nameCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"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":[{"internalType":"uint16","name":"eggTokenId","type":"uint16"},{"internalType":"uint16","name":"eggColorTokenId","type":"uint16"},{"internalType":"uint16","name":"eyeLeftTokenId","type":"uint16"},{"internalType":"uint16","name":"eyeRightTokenId","type":"uint16"},{"internalType":"uint16","name":"mouthTokenId","type":"uint16"}],"name":"paint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"partPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_partPrice","type":"uint256"},{"internalType":"uint256","name":"_canvasPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":[{"internalType":"uint16","name":"eggTokenId","type":"uint16"},{"internalType":"string","name":"name","type":"string"}],"name":"updateEggName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

662386f26fc10000600c556658d15e17628000600d556101a0604052603361014081815260809182919062005706610160398152602001604051806060016040528060338152602001620055a16033913981526020016040518060600160405280603381526020016200566d603391398152602001604051806060016040528060348152602001620058286034913981526020016040518060600160405280603381526020016200563a60339139815260408051602081810190925260008152910152620000d290601090600662000593565b506040805160e081019091526033608082018181528291620056d360a08401398152602001604051806060016040528060338152602001620056a0603391398152602001604051806060016040528060338152602001620056076033913981526040805160208181019092526000815291015262000155906011906004620005f7565b50604080516101a08101909152603361014082018181528291620053d56101608401398152602001604051806060016040528060338152602001620054a86033913981526020016040518060a00160405280606d815260200162005408606d913981526020016040518060e0016040528060bc81526020016200573960bc913981526020016040518060800160405280605b8152602001620054db605b91398152602001604051806060016040528060338152602001620055d4603391398152602001604051806060016040528060338152602001620057f5603391398152602001604051806060016040528060338152602001620054756033913981526020016040518060a00160405280606b815260200162005536606b91398152604080516020818101909252600081529101526200029590601290600a62000649565b506040805161024081018252600761020082018181526611b3333333333360c91b610220840152825282518084018452818152662330303734443960c81b602082810191909152808401919091528351808501855282815266119ba32221232360c91b818301528385015283518085018552828152662333394343434360c81b81830152606084015283518085018552828152662342313044433960c81b81830152608084015283518085018552828152662346303132424560c81b8183015260a08401528351808501855282815266119c1a989a1a3160c91b8183015260c0840152835180850185528281526611a3231a18999b60c91b8183015260e0840152835180850185528281526611a3231c1a98a160c91b8183015261010084015283518085018552828152660234646444330360cc1b8183015261012084015283518085018552828152660233344393937360cc1b8183015261014084015283518085018552828152660233245434334360cc1b8183015261016084015283518085018552828152660233031464637360cc1b8183015261018084015283518085018552828152662341414141414160c81b818301526101a084015283518085018552828152662346414641464160c81b818301526101c084015283518085019094529083526608d1111111111160ca1b908301526101e0810191909152620004a29060139060106200069b565b50348015620004b057600080fd5b50604080518082018252601881527f436f6f6c2045676773202866726f6d204c6f6f744172742900000000000000006020808301918252835180850190945260048452634547475360e01b9084015281519192916200051291600091620006ed565b50805162000528906001906020840190620006ed565b50506001600a55506200053b3362000541565b6200082f565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054828255906000526020600020908101928215620005e5579160200282015b82811115620005e55782518051620005d4918491602090910190620006ed565b5091602001919060010190620005b4565b50620005f392915062000778565b5090565b828054828255906000526020600020908101928215620005e5579160200282015b82811115620005e5578251805162000638918491602090910190620006ed565b509160200191906001019062000618565b828054828255906000526020600020908101928215620005e5579160200282015b82811115620005e557825180516200068a918491602090910190620006ed565b50916020019190600101906200066a565b828054828255906000526020600020908101928215620005e5579160200282015b82811115620005e55782518051620006dc918491602090910190620006ed565b5091602001919060010190620006bc565b828054620006fb90620007f2565b90600052602060002090601f0160209004810192826200071f57600085556200076a565b82601f106200073a57805160ff19168380011785556200076a565b828001600101855582156200076a579182015b828111156200076a5782518255916020019190600101906200074d565b50620005f392915062000799565b80821115620005f35760006200078f8282620007b0565b5060010162000778565b5b80821115620005f357600081556001016200079a565b508054620007be90620007f2565b6000825580601f10620007cf575050565b601f016020900490600052602060002090810190620007ef919062000799565b50565b600181811c908216806200080757607f821691505b602082108114156200082957634e487b7160e01b600052602260045260246000fd5b50919050565b614b96806200083f6000396000f3fe6080604052600436106101f95760003560e01c806380057b9a1161010d578063b88d4fde116100a0578063e985e9c51161006f578063e985e9c51461059c578063ebea57c8146105e5578063f2fde38b14610605578063f7d9757714610625578063feb6b3d11461064557600080fd5b8063b88d4fde1461050b578063be0458f51461052b578063c87b56dd1461054b578063e3e848e11461056b57600080fd5b80639a0e4ebb116100dc5780639a0e4ebb146104af578063a0712d68146104c2578063a22cb465146104d5578063b3265178146104f557600080fd5b806380057b9a1461043c57806388f1b6e41461045c5780638da5cb5b1461047c57806395d89b411461049a57600080fd5b80632f745c59116101905780634f6ccce71161015f5780634f6ccce7146103995780636352211e146103b957806370a08231146103d9578063715018a6146103f957806373ff93a21461040e57600080fd5b80632f745c5914610324578063304fe350146103445780633ccfd60b1461036457806342842e0e1461037957600080fd5b806318160ddd116101cc57806318160ddd146102af57806323b872dd146102ce5780632e3ca039146102ee5780632e7ab1a21461030457600080fd5b806301ffc9a7146101fe57806306fdde0314610233578063081812fc14610255578063095ea7b31461028d575b600080fd5b34801561020a57600080fd5b5061021e610219366004613428565b610665565b60405190151581526020015b60405180910390f35b34801561023f57600080fd5b50610248610690565b60405161022a9190613f04565b34801561026157600080fd5b50610275610270366004613544565b610722565b6040516001600160a01b03909116815260200161022a565b34801561029957600080fd5b506102ad6102a8366004613351565b6107bc565b005b3480156102bb57600080fd5b506008545b60405190815260200161022a565b3480156102da57600080fd5b506102ad6102e936600461325d565b6108d2565b3480156102fa57600080fd5b506102c0600c5481565b34801561031057600080fd5b506102ad61031f36600461347d565b610903565b34801561033057600080fd5b506102c061033f366004613351565b610bf3565b34801561035057600080fd5b5061024861035f366004613544565b610c89565b34801561037057600080fd5b506102ad610d8e565b34801561038557600080fd5b506102ad61039436600461325d565b610df4565b3480156103a557600080fd5b506102c06103b4366004613544565b610e0f565b3480156103c557600080fd5b506102756103d4366004613544565b610ea2565b3480156103e557600080fd5b506102c06103f4366004613208565b610f19565b34801561040557600080fd5b506102ad610fa0565b34801561041a57600080fd5b50600e546104299061ffff1681565b60405161ffff909116815260200161022a565b34801561044857600080fd5b50610248610457366004613544565b610fd6565b34801561046857600080fd5b506102ad6104773660046134df565b6110e9565b34801561048857600080fd5b50600b546001600160a01b0316610275565b3480156104a657600080fd5b50610248611496565b6102ad6104bd36600461337b565b6114a5565b6102ad6104d0366004613544565b61167c565b3480156104e157600080fd5b506102ad6104f0366004613315565b611766565b34801561050157600080fd5b506102c0600d5481565b34801561051757600080fd5b506102ad610526366004613299565b61182b565b34801561053757600080fd5b50610248610546366004613544565b611863565b34801561055757600080fd5b50610248610566366004613544565b61195c565b34801561057757600080fd5b5061058b610586366004613462565b6120d6565b60405161022a95949392919061405d565b3480156105a857600080fd5b5061021e6105b736600461322a565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156105f157600080fd5b50610248610600366004613544565b6121a2565b34801561061157600080fd5b506102ad610620366004613208565b61229c565b34801561063157600080fd5b506102ad61064036600461355d565b612334565b34801561065157600080fd5b50610248610660366004613544565b612369565b60006001600160e01b0319821663780e9d6360e01b148061068a575061068a82612464565b92915050565b60606000805461069f90614170565b80601f01602080910402602001604051908101604052809291908181526020018280546106cb90614170565b80156107185780601f106106ed57610100808354040283529160200191610718565b820191906000526020600020905b8154815290600101906020018083116106fb57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166107a05760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006107c782610ea2565b9050806001600160a01b0316836001600160a01b031614156108355760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610797565b336001600160a01b0382161480610851575061085181336105b7565b6108c35760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610797565b6108cd83836124b4565b505050565b6108dc3382612522565b6108f85760405162461bcd60e51b815260040161079790613fd5565b6108cd838383612619565b6002600a5414156109265760405162461bcd60e51b815260040161079790614026565b6002600a553361093961ffff8416610ea2565b6001600160a01b03161461097f5760405162461bcd60e51b815260206004820152600d60248201526c2737ba103cb7bab91032b3b39760991b6044820152606401610797565b6109a461098f8361ffff16610c89565b604051806020016040528060008152506127c4565b6109de5760405162461bcd60e51b815260206004820152600b60248201526a2737ba1030b71032b3b39760a91b6044820152606401610797565b6109f781604051806020016040528060008152506127c4565b15610a325760405162461bcd60e51b815260206004820152600b60248201526a22b6b83a3c903730b6b29760a91b6044820152606401610797565b600e54601961ffff9091161080610b135750600e54601961ffff90911610801590610b13575061ffff82166000908152600f602052604090206001018054610b119190610a7e90614170565b80601f0160208091040260200160405190810160405280929190818152602001828054610aaa90614170565b8015610af75780601f10610acc57610100808354040283529160200191610af7565b820191906000526020600020905b815481529060010190602001808311610ada57829003601f168201915b5050505050604051806020016040528060008152506127c4565b155b610b5f5760405162461bcd60e51b815260206004820152601f60248201527f416c6c206567732068617665206265656e206e616d656420616c7265616479006044820152606401610797565b61ffff82166000908152600f602052604090206001018054610b859190610a7e90614170565b15610bbf57600e805460019190600090610ba490849061ffff166140c5565b92506101000a81548161ffff021916908361ffff1602179055505b61ffff82166000908152600f602090815260409091208251610be9926001909201918401906130a7565b50506001600a5550565b6000610bfe83610f19565b8210610c605760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610797565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b60606109c48210158015610c9e575061138882105b15610cc857505060408051808201909152600981526822b3b39021b7b637b960b91b602082015290565b6113888210158015610cdb5750611d4c82105b15610d04575050604080518082019091526008815267115e59481319599d60c21b602082015290565b611d4c8210158015610d17575061271082105b15610d41575050604080518082019091526009815268115e5948149a59da1d60ba1b602082015290565b6127108210158015610d5457506130d482105b15610d7a57505060408051808201909152600581526409adeeae8d60db1b602082015290565b505060408051602081019091526000815290565b600b546001600160a01b03163314610db85760405162461bcd60e51b815260040161079790613fa0565b600b546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610df1573d6000803e3d6000fd5b50565b6108cd8383836040518060200160405280600081525061182b565b6000610e1a60085490565b8210610e7d5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610797565b60088281548110610e9057610e9061421c565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b03168061068a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610797565b60006001600160a01b038216610f845760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610797565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b03163314610fca5760405162461bcd60e51b815260040161079790613fa0565b610fd4600061282b565b565b606061068a826040518060400160405280601981526020017f5448455345415245534f4d45534552494f5553434f4c4f5253000000000000008152506013805480602002602001604051908101604052809291908181526020016000905b828210156110e057838290600052602060002001805461105390614170565b80601f016020809104026020016040519081016040528092919081815260200182805461107f90614170565b80156110cc5780601f106110a1576101008083540402835291602001916110cc565b820191906000526020600020905b8154815290600101906020018083116110af57829003601f168201915b505050505081526020019060010190611034565b5050505061287d565b6002600a54141561110c5760405162461bcd60e51b815260040161079790614026565b6002600a553361111f61ffff8716610ea2565b6001600160a01b031614801561114957503361113e61ffff8616610ea2565b6001600160a01b0316145b801561116957503361115e61ffff8516610ea2565b6001600160a01b0316145b801561118957503361117e61ffff8416610ea2565b6001600160a01b0316145b80156111a957503361119e61ffff8316610ea2565b6001600160a01b0316145b6112105760405162461bcd60e51b815260206004820152603260248201527f596f7520646f6e2774206f776e206174206c65617374206f6e65206f662074686044820152713290383937bb34b232b2103a37b5b2b7399760711b6064820152608401610797565b61122061098f8661ffff16610c89565b61125a5760405162461bcd60e51b815260206004820152600b60248201526a2737ba1030b71032b3b39760a91b6044820152606401610797565b61129161126a8561ffff16610c89565b6040518060400160405280600981526020016822b3b39021b7b637b960b91b8152506127c4565b6112d15760405162461bcd60e51b81526020600482015260116024820152702737ba1030b71032b3b39031b7b637b91760791b6044820152606401610797565b6113076112e18461ffff16610c89565b60405180604001604052806008815260200167115e59481319599d60c21b8152506127c4565b6113455760405162461bcd60e51b815260206004820152600f60248201526e2737ba1030903632b33a1032bcb29760891b6044820152606401610797565b61137c6113558361ffff16610c89565b60405180604001604052806009815260200168115e5948149a59da1d60ba1b8152506127c4565b6113bb5760405162461bcd60e51b815260206004820152601060248201526f2737ba1030903934b3b43a1032bcb29760811b6044820152606401610797565b6113ee6113cb8261ffff16610c89565b6040518060400160405280600581526020016409adeeae8d60db1b8152506127c4565b6114295760405162461bcd60e51b815260206004820152600c60248201526b2737ba10309036b7baba341760a11b6044820152606401610797565b61ffff9485166000908152600f602052604090208054918616600160301b0267ffff00000000000019938716640100000000029390931667ffffffff0000000019948716620100000263ffffffff1990931696909516959095171791909116919091171790556001600a55565b60606001805461069f90614170565b6002600a5414156114c85760405162461bcd60e51b815260040161079790614026565b6002600a556000805b82518110156116475760008382815181106114ee576114ee61421c565b60200260200101511015801561151e57506130d48382815181106115145761151461421c565b6020026020010151105b61155e5760405162461bcd60e51b81526020600482015260116024820152702a37b5b2b71024a21034b73b30b634b21760791b6044820152606401610797565b60008382815181106115725761157261421c565b6020026020010151101580156115a257506109c48382815181106115985761159861421c565b6020026020010151105b156115bb57600d546115b490836140e2565b9150611612565b6109c48382815181106115d0576115d061421c565b60200260200101511015801561160057506130d48382815181106115f6576115f661421c565b6020026020010151105b156101f957600c546115b490836140e2565b611635338483815181106116285761162861421c565b60200260200101516128eb565b8061163f816141ab565b9150506114d1565b5080158015906116575750348111155b6116735760405162461bcd60e51b815260040161079790613f69565b50506001600a55565b6002600a54141561169f5760405162461bcd60e51b815260040161079790614026565b6002600a556130d481106116e95760405162461bcd60e51b81526020600482015260116024820152702a37b5b2b71024a21034b73b30b634b21760791b6044820152606401610797565b6109c481101561171a5734600d5411156117155760405162461bcd60e51b815260040161079790613f69565b611754565b6109c4811015801561172d57506130d481105b156101f95734600c5411156117155760405162461bcd60e51b815260040161079790613f69565b61175e33826128eb565b506001600a55565b6001600160a01b0382163314156117bf5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610797565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6118353383612522565b6118515760405162461bcd60e51b815260040161079790613fd5565b61185d84848484612909565b50505050565b606061068a826040518060400160405280600c81526020016b1512115156515254d311519560a21b8152506010805480602002602001604051908101604052809291908181526020016000905b828210156110e05783829060005260206000200180546118cf90614170565b80601f01602080910402602001604051908101604052809291908181526020018280546118fb90614170565b80156119485780601f1061191d57610100808354040283529160200191611948565b820191906000526020600020905b81548152906001019060200180831161192b57829003601f168201915b5050505050815260200190600101906118b0565b606060008061196a84610c89565b905061197461312b565b61197c613153565b61199583604051806020016040528060008152506127c4565b611c0257620f424393506119c16119ae61126a88610c89565b6119bb57620f4242610fd6565b86610fd6565b60408301526119e86119d56112e188610c89565b6119e257620f4242611863565b86611863565b6060830152611a0f6119fc61135588610c89565b611a0957620f42426121a2565b866121a2565b6080830152611a36611a236113cb88610c89565b611a3057620f4242612369565b86612369565b60a083015260408051808201909152600d81526c37b830b1b4ba3c9e911817199160991b60208201528152611a6d61126a87610c89565b611a9c576040518060400160405280600d81526020016c37b830b1b4ba3c9e911817199160991b815250611ac3565b6040518060400160405280600d81526020016c37b830b1b4ba3c9e911897181160991b8152505b6020820152611ad46112e187610c89565b611b03576040518060400160405280600d81526020016c37b830b1b4ba3c9e911817199160991b815250611b2a565b6040518060400160405280600d81526020016c37b830b1b4ba3c9e911897181160991b8152505b6040820152611b3b61135587610c89565b611b6a576040518060400160405280600d81526020016c37b830b1b4ba3c9e911817199160991b815250611b91565b6040518060400160405280600d81526020016c37b830b1b4ba3c9e911897181160991b8152505b6060820152611ba26113cb87610c89565b611bd1576040518060400160405280600d81526020016c37b830b1b4ba3c9e911817199160991b815250611bf8565b6040518060400160405280600d81526020016c37b830b1b4ba3c9e911897181160991b8152505b6080820152611d6b565b61ffff8087166000908152600f6020526040902054879550611c4d9116611c2c57620f4242611c43565b61ffff8086166000908152600f6020526040902054165b62ffffff16610fd6565b60408084019190915261ffff8581166000908152600f6020529190912054611cab916201000090910416611c8457620f4242611ca1565b61ffff8086166000908152600f6020526040902054620100009004165b62ffffff16611863565b606083015261ffff8481166000908152600f6020526040902054611d099164010000000090910416611ce057620f4242611cff565b61ffff8086166000908152600f60205260409020546401000000009004165b62ffffff166121a2565b608083015261ffff8481166000908152600f6020526040902054611d6591600160301b90910416611d3d57620f4242611d5b565b61ffff8086166000908152600f6020526040902054600160301b9004165b62ffffff16612369565b60a08301525b6040808301519051611d80919060200161375f565b60408051808303601f190181529190528252611dc3611d9e85610fd6565b604051806040016040528060078152602001662346414641464160c81b8152506127c4565b15611dee576040518061090001604052806108c2815260200161429f6108c291396020830152611e20565b8051611df985610fd6565b604051602001611e0a9291906139af565b60408051808303601f1901815291905260208301525b6020808201516040808501519051611e389301613888565b60408051808303601f19018152918152838101919091528181015160608401519151611e679290602001613951565b60408051808303601f190181529181526060808501929092529082015160808401519151611e989290602001613951565b60408051808303601f190181529181526080808501929092529082015160a08401519151611ec99290602001613951565b60408051808303601f1901815291815260a084019190915261ffff85166000908152600f602052206001018054611f049190610a7e90614170565b611f455761ffff84166000908152600f60209081526040918290209151611f2f926001019101613d68565b60408051808303601f1901815291905260c08301525b60408051808201825260068152651e17b9bb339f60d11b60208083019190915260e08501829052845185820151868501516060880151608089015160a08a015160c08b01519851600099611fa9999798969795969495939492939092909101613691565b604051602081830303815290604052905060006120a7611fd886604051806020016040528060008152506127c4565b6120015785604051602001611fed9190613736565b60405160208183030381529060405261201e565b6040518060400160405280600381526020016245676760e81b8152505b6120278a61293c565b61203085612a3a565b6020808901516040808b015160608c015160808d015160a08e015160c08f015194516120809761206297969101613612565b6040516020818303038152906040528051906020012060001c61293c565b6040516020016120939493929190613a35565b604051602081830303815290604052612a3a565b9050806040516020016120ba9190613e8c565b60408051601f1981840301815291905298975050505050505050565b600f602052600090815260409020805460018201805461ffff808416946201000085048216946401000000008104831694600160301b9091049092169290919061211f90614170565b80601f016020809104026020016040519081016040528092919081815260200182805461214b90614170565b80156121985780601f1061216d57610100808354040283529160200191612198565b820191906000526020600020905b81548152906001019060200180831161217b57829003601f168201915b5050505050905085565b606061068a826040518060400160405280600d81526020016c1512115156515254d49251d215609a1b8152506011805480602002602001604051908101604052809291908181526020016000905b828210156110e057838290600052602060002001805461220f90614170565b80601f016020809104026020016040519081016040528092919081815260200182805461223b90614170565b80156122885780601f1061225d57610100808354040283529160200191612288565b820191906000526020600020905b81548152906001019060200180831161226b57829003601f168201915b5050505050815260200190600101906121f0565b600b546001600160a01b031633146122c65760405162461bcd60e51b815260040161079790613fa0565b6001600160a01b03811661232b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610797565b610df18161282b565b600b546001600160a01b0316331461235e5760405162461bcd60e51b815260040161079790613fa0565b600c91909155600d55565b606061068a826040518060400160405280600e81526020016d1513d5105313165353d55512115160921b8152506012805480602002602001604051908101604052809291908181526020016000905b828210156110e05783829060005260206000200180546123d790614170565b80601f016020809104026020016040519081016040528092919081815260200182805461240390614170565b80156124505780601f1061242557610100808354040283529160200191612450565b820191906000526020600020905b81548152906001019060200180831161243357829003601f168201915b5050505050815260200190600101906123b8565b60006001600160e01b031982166380ac58cd60e01b148061249557506001600160e01b03198216635b5e139f60e01b145b8061068a57506301ffc9a760e01b6001600160e01b031983161461068a565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906124e982610ea2565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b031661259b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610797565b60006125a683610ea2565b9050806001600160a01b0316846001600160a01b031614806125e15750836001600160a01b03166125d684610722565b6001600160a01b0316145b8061261157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661262c82610ea2565b6001600160a01b0316146126945760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610797565b6001600160a01b0382166126f65760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610797565b612701838383612ba0565b61270c6000826124b4565b6001600160a01b038316600090815260036020526040812080546001929061273590849061412d565b90915550506001600160a01b03821660009081526003602052604081208054600192906127639084906140e2565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000816040516020016127d791906135c7565b60405160208183030381529060405280519060200120836040516020016127fe91906135c7565b6040516020818303038152906040528051906020012014156128225750600161068a565b50600092915050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b606060006128b38461288e8761293c565b60405160200161289f9291906135e3565b604051602081830303815290604052612c58565b90506000838451836128c591906141c6565b815181106128d5576128d561421c565b6020026020010151905080925050509392505050565b612905828260405180602001604052806000815250612c89565b5050565b612914848484612619565b61292084848484612cbc565b61185d5760405162461bcd60e51b815260040161079790613f17565b6060816129605750506040805180820190915260018152600360fc1b602082015290565b8160005b811561298a5780612974816141ab565b91506129839050600a836140fa565b9150612964565b60008167ffffffffffffffff8111156129a5576129a5614232565b6040519080825280601f01601f1916602001820160405280156129cf576020820181803683370190505b5090505b8415612611576129e460018361412d565b91506129f1600a866141c6565b6129fc9060306140e2565b60f81b818381518110612a1157612a1161421c565b60200101906001600160f81b031916908160001a905350612a33600a866140fa565b94506129d3565b805160609080612a5a575050604080516020810190915260008152919050565b60006003612a698360026140e2565b612a7391906140fa565b612a7e90600461410e565b90506000612a8d8260206140e2565b67ffffffffffffffff811115612aa557612aa5614232565b6040519080825280601f01601f191660200182016040528015612acf576020820181803683370190505b509050600060405180606001604052806040815260200161425f604091399050600181016020830160005b86811015612b5b576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101612afa565b506003860660018114612b755760028114612b8657612b92565b613d3d60f01b600119830152612b92565b603d60f81b6000198301525b505050918152949350505050565b6001600160a01b038316612bfb57612bf681600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612c1e565b816001600160a01b0316836001600160a01b031614612c1e57612c1e8382612dc9565b6001600160a01b038216612c35576108cd81612e66565b826001600160a01b0316826001600160a01b0316146108cd576108cd8282612f15565b600081604051602001612c6b91906135c7565b60408051601f19818403018152919052805160209091012092915050565b612c938383612f59565b612ca06000848484612cbc565b6108cd5760405162461bcd60e51b815260040161079790613f17565b60006001600160a01b0384163b15612dbe57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612d00903390899088908890600401613ed1565b602060405180830381600087803b158015612d1a57600080fd5b505af1925050508015612d4a575060408051601f3d908101601f19168201909252612d4791810190613445565b60015b612da4573d808015612d78576040519150601f19603f3d011682016040523d82523d6000602084013e612d7d565b606091505b508051612d9c5760405162461bcd60e51b815260040161079790613f17565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612611565b506001949350505050565b60006001612dd684610f19565b612de0919061412d565b600083815260076020526040902054909150808214612e33576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612e789060019061412d565b60008381526009602052604081205460088054939450909284908110612ea057612ea061421c565b906000526020600020015490508060088381548110612ec157612ec161421c565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612ef957612ef9614206565b6001900381819060005260206000200160009055905550505050565b6000612f2083610f19565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216612faf5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610797565b6000818152600260205260409020546001600160a01b0316156130145760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610797565b61302060008383612ba0565b6001600160a01b03821660009081526003602052604081208054600192906130499084906140e2565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546130b390614170565b90600052602060002090601f0160209004810192826130d5576000855561311b565b82601f106130ee57805160ff191683800117855561311b565b8280016001018555821561311b579182015b8281111561311b578251825591602001919060010190613100565b5061312792915061316d565b5090565b6040518061010001604052806008905b606081526020019060019003908161313b5790505090565b6040805160a081019091526060815260046020820161313b565b5b80821115613127576000815560010161316e565b600067ffffffffffffffff83111561319c5761319c614232565b6131af601f8401601f1916602001614094565b90508281528383830111156131c357600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146131f157600080fd5b919050565b803561ffff811681146131f157600080fd5b60006020828403121561321a57600080fd5b613223826131da565b9392505050565b6000806040838503121561323d57600080fd5b613246836131da565b9150613254602084016131da565b90509250929050565b60008060006060848603121561327257600080fd5b61327b846131da565b9250613289602085016131da565b9150604084013590509250925092565b600080600080608085870312156132af57600080fd5b6132b8856131da565b93506132c6602086016131da565b925060408501359150606085013567ffffffffffffffff8111156132e957600080fd5b8501601f810187136132fa57600080fd5b61330987823560208401613182565b91505092959194509250565b6000806040838503121561332857600080fd5b613331836131da565b91506020830135801515811461334657600080fd5b809150509250929050565b6000806040838503121561336457600080fd5b61336d836131da565b946020939093013593505050565b6000602080838503121561338e57600080fd5b823567ffffffffffffffff808211156133a657600080fd5b818501915085601f8301126133ba57600080fd5b8135818111156133cc576133cc614232565b8060051b91506133dd848301614094565b8181528481019084860184860187018a10156133f857600080fd5b600095505b8386101561341b5780358352600195909501949186019186016133fd565b5098975050505050505050565b60006020828403121561343a57600080fd5b813561322381614248565b60006020828403121561345757600080fd5b815161322381614248565b60006020828403121561347457600080fd5b613223826131f6565b6000806040838503121561349057600080fd5b613499836131f6565b9150602083013567ffffffffffffffff8111156134b557600080fd5b8301601f810185136134c657600080fd5b6134d585823560208401613182565b9150509250929050565b600080600080600060a086880312156134f757600080fd5b613500866131f6565b945061350e602087016131f6565b935061351c604087016131f6565b925061352a606087016131f6565b9150613538608087016131f6565b90509295509295909350565b60006020828403121561355657600080fd5b5035919050565b6000806040838503121561357057600080fd5b50508035926020909101359150565b60008151808452613597816020860160208601614144565b601f01601f19169290920160200192915050565b600081516135bd818560208601614144565b9290920192915050565b600082516135d9818460208701614144565b9190910192915050565b600083516135f5818460208801614144565b835190830190613609818360208801614144565b01949350505050565b6000875160206136258285838d01614144565b8851918401916136388184848d01614144565b885192019161364a8184848c01614144565b875192019161365c8184848b01614144565b865192019161366e8184848a01614144565b85519201916136808184848901614144565b919091019998505050505050505050565b6000895160206136a48285838f01614144565b8a51918401916136b78184848f01614144565b8a519201916136c98184848e01614144565b89519201916136db8184848d01614144565b88519201916136ed8184848c01614144565b87519201916136ff8184848b01614144565b86519201916137118184848a01614144565b85519201916137238184848901614144565b919091019b9a5050505050505050505050565b60008251613748818460208701614144565b640814185c9d60da1b920191825250600501919050565b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323081527f30302f73766722207072657365727665417370656374526174696f3d22784d6960208201527f6e594d696e206d656574222076696577426f783d22302030203630302036303060408201527f223e3c7374796c653e2e6865617679207b20666f6e743a20626f6c642036307060608201527f782073616e732d73657269663b7061696e742d6f726465723a207374726f6b6560808201527f3b207374726f6b653a20626c61636b3b207374726f6b652d77696474683a203560a0820152690383c1d903334b6361d160b51b60c0820152600082516138688160ca850160208701614144565b683e9e17b9ba3cb6329f60b91b60ca93909101928301525060d301919050565b6701e31b4b931b632960c51b8152600083516138ab816008850160208801614144565b7f207472616e73666f726d3d227363616c6528302e3620312e30292220723d22316008918401918201527f3530222063783d22383025222063793d2235302522207374726f6b653d22626c60288201527f61636b22207374726f6b652d77696474683d223130222066696c6c3d2200000060488201528351613934816065840160208801614144565b631110179f60e11b60659290910191820152606901949350505050565b6501e3932b1ba160d51b815260008351613972816006850160208801614144565b600160fd1b6006918401918201528351613993816007840160208801614144565b6210179f60e91b60079290910191820152600a01949350505050565b6501e3932b1ba160d51b8152600083516139d0816006850160208801614144565b7f2077696474683d223130302522206865696768743d2231303025222066696c6c600691840191820152611e9160f11b60268201528351613a18816028840160208801614144565b631110179f60e11b60289290910191820152602c01949350505050565b693d913730b6b2911d101160b11b81528451600090613a5b81600a850160208a01614144565b61202360f01b600a918401918201528551613a7d81600c840160208a01614144565b7f222c20226465736372697074696f6e223a2022436f6f6c204567677320697320600c92909101918201527f6c6f6f7461626c652061727420746861742073697473207472756c7920616e64602c8201527f2066756c6c79206f6e2d636861696e2e204372656174652074686520636f6f6c604c8201527f657374206567677320616e6420646566696e6520746865697220726172697469606c8201527f6573206279206c6f6f74696e6720666f72207061727473212052617269747920608c8201527f697320646566696e65642062792074686520526172697479205369676e61747560ac8201527f726520746f2073706f74206475706c6963617465732e204f6e6c79203235207060cc8201527f61696e74656420656767732063616e206765742061206e616d6520287570646160ec8201527f7461626c65206279206f776e6572732921204d696e74206d617020666f72204561010c8201527f746865727363616e3a20656767732066726f6d2030202d20323439392028757361012c8201527f652074686f73652061732063616e76617320746f207061696e74292c2065676761014c8201527f20636f6c6f72732066726f6d2032353030202d20343939392c206c656674206561016c8201527f7965732066726f6d2035303030202d20373439392c207269676874206579657361018c8201527f2066726f6d2037353030202d20393939392c206d6f757468732066726f6d20316101ac8201527f30303030202d2031323439392e222c2022696d616765223a2022646174613a696101cc820152731b5859d94bdcdd99cade1b5b0ed8985cd94d8d0b60621b6101ec820152613d5d613d4d613d47613cf86102008501896135ab565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a225281527f6172697479205369676e6174757265222c202276616c7565223a2200000000006020820152603b0190565b866135ab565b63227d5d7d60e01b815260040190565b979650505050505050565b7f3c7465787420783d223530252220793d223930252220646f6d696e616e742d628152600060207f6173656c696e653d226d6964646c652220746578742d616e63686f723d226d69818401527332323632911031b630b9b99e913432b0bb3c911f60611b604084015260546000855481600182811c915080831680613dee57607f831692505b868310811415613e0c57634e487b7160e01b85526022600452602485fd5b808015613e205760018114613e3557613e66565b60ff1985168a880152838a0187019550613e66565b60008b81526020902060005b85811015613e5c5781548c82018a0152908401908901613e41565b505086848b010195505b5050505050613e8281661e17ba32bc3a1f60c91b815260070190565b9695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251613ec481601d850160208701614144565b91909101601d0192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613e829083018461357f565b602081526000613223602083018461357f565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252601f908201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600061ffff80881683528087166020840152808616604084015280851660608401525060a06080830152613d5d60a083018461357f565b604051601f8201601f1916810167ffffffffffffffff811182821017156140bd576140bd614232565b604052919050565b600061ffff808316818516808303821115613609576136096141da565b600082198211156140f5576140f56141da565b500190565b600082614109576141096141f0565b500490565b6000816000190483118215151615614128576141286141da565b500290565b60008282101561413f5761413f6141da565b500390565b60005b8381101561415f578181015183820152602001614147565b8381111561185d5750506000910152565b600181811c9082168061418457607f821691505b602082108114156141a557634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156141bf576141bf6141da565b5060010190565b6000826141d5576141d56141f0565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610df157600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c73766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f737667272077696474683d273130302527206865696768743d2731303025272076696577426f783d273020302038303020383030273e3c726563742066696c6c3d2723666666666666272077696474683d2738303027206865696768743d27383030272f3e3c646566733e3c72616469616c4772616469656e742069643d2761272063783d27343030272063793d273430302720723d2735302527206772616469656e74556e6974733d277573657253706163654f6e557365273e3c73746f7020206f66667365743d2730272073746f702d636f6c6f723d2723666666666666272f3e3c73746f7020206f66667365743d2731272073746f702d636f6c6f723d2723304546272f3e3c2f72616469616c4772616469656e743e3c72616469616c4772616469656e742069643d2762272063783d27343030272063793d273430302720723d2737302527206772616469656e74556e6974733d277573657253706163654f6e557365273e3c73746f7020206f66667365743d2730272073746f702d636f6c6f723d2723666666666666272f3e3c73746f7020206f66667365743d2731272073746f702d636f6c6f723d2723304646272f3e3c2f72616469616c4772616469656e743e3c2f646566733e3c726563742066696c6c3d2775726c28236129272077696474683d2738303027206865696768743d27383030272f3e3c672066696c6c2d6f7061636974793d272e38273e3c706174682066696c6c3d2775726c282362292720643d274d3939382e37203433392e3263312e372d32362e3520312e372d35322e3720302e312d37382e354c343031203339392e396330203020302d302e3120302d302e316c3538372e362d3131362e39632d352e312d32352e392d31312e392d35312e322d32302e332d37352e384c3430302e39203339392e376330203020302d302e3120302d302e316c3533372e332d323635632d31312e362d32332e352d32342e382d34362e322d33392e332d36372e394c3430302e38203339392e356330203020302d302e312d302e312d302e316c3435302e342d333935632d31372e332d31392e372d33352e382d33382e322d35352e352d35352e356c2d333935203435302e34633020302d302e3120302d302e312d302e314c3733332e342d3939632d32312e372d31342e352d34342e342d32372e362d36382d33392e336c2d323635203533372e34633020302d302e3120302d302e3120306c3139322e362d3536372e34632d32342e362d382e332d34392e392d31352e312d37352e382d32302e324c3430302e3220333939633020302d302e3120302d302e3120306c33392e322d3539372e37632d32362e352d312e372d35322e372d312e372d37382e352d302e314c3339392e3920333939633020302d302e3120302d302e3120304c3238322e392d3138382e36632d32352e3920352e312d35312e322031312e392d37352e382032302e336c3139322e36203536372e34633020302d302e3120302d302e3120306c2d3236352d3533372e33632d32332e352031312e362d34362e322032342e382d36372e392033392e336c3333322e38203439382e31633020302d302e3120302d302e3120302e314c342e342d35312e31432d31352e332d33332e392d33332e382d31352e332d35312e3120342e346c3435302e342033393563302030203020302e312d302e3120302e314c2d39392036362e36632d31342e352032312e372d32372e362034342e342d33392e332036386c3533372e342032363563302030203020302e31203020302e316c2d3536372e342d3139322e36632d382e332032342e362d31352e312034392e392d32302e322037352e384c333939203339392e3863302030203020302e31203020302e316c2d3539372e372d33392e32632d312e372032362e352d312e372035322e372d302e312037382e354c333939203430302e3163302030203020302e31203020302e316c2d3538372e36203131362e3963352e312032352e392031312e392035312e322032302e332037352e386c3536372e342d3139322e3663302030203020302e31203020302e316c2d3533372e33203236356331312e362032332e352032342e382034362e322033392e332036372e396c3439382e312d3333322e3863302030203020302e3120302e3120302e316c2d3435302e34203339356331372e332031392e372033352e382033382e322035352e352035352e356c3339352d3435302e346330203020302e31203020302e3120302e314c36362e36203839396332312e372031342e352034342e342032372e362036382033392e336c3236352d3533372e346330203020302e31203020302e3120304c3230372e31203936382e336332342e3620382e332034392e392031352e312037352e382032302e324c3339392e38203430316330203020302e31203020302e3120306c2d33392e32203539372e376332362e3520312e372035322e3720312e372037382e3520302e314c3430302e31203430316330203020302e31203020302e3120306c3131362e39203538372e366332352e392d352e312035312e322d31312e392037352e382d32302e334c3430302e33203430302e396330203020302e31203020302e3120306c323635203533372e336332332e352d31312e362034362e322d32342e382036372e392d33392e334c3430302e35203430302e386330203020302e31203020302e312d302e316c333935203435302e346331392e372d31372e332033382e322d33352e382035352e352d35352e356c2d3435302e342d3339356330203020302d302e3120302e312d302e314c383939203733332e346331342e352d32312e372032372e362d34342e342033392e332d36386c2d3533372e342d3236356330203020302d302e3120302d302e316c3536372e34203139322e3663382e332d32342e362031352e312d34392e392032302e322d37352e384c343031203430302e326330203020302d302e3120302d302e314c3939382e37203433392e327a272f3e3c2f673e3c2f7376673ea2646970667358221220511af5f00d8c0645702748fbdfdfdc4776cbece72e60068777b391fc24926c6364736f6c6343000807003377696474683d22333022206865696768743d2231302220783d223437252220793d22353725222066696c6c3d22626c61636b2277696474683d22373022206865696768743d2231302220783d223537252220793d22353725222066696c6c3d22626c61636b22202f3e3c726563742077696474683d22313022206865696768743d2231302220783d223638252220793d22353725222066696c6c3d227265642277696474683d22373022206865696768743d2231302220783d223430252220793d22353525222066696c6c3d22626c61636b2277696474683d22363022206865696768743d2231302220783d223437252220793d22353725222066696c6c3d22626c61636b2277696474683d22363022206865696768743d2231302220783d223636252220793d22343522207472616e73666f726d3d227472616e736c6174652833302c2031302920726f7461746528343429222066696c6c3d22626c61636b2277696474683d22313022206865696768743d2233302220783d223532252220793d22353825222066696c6c3d2272656422202f3e3c726563742077696474683d22313022206865696768743d2232352220783d223535252220793d22353825222066696c6c3d227265642277696474683d22343022206865696768743d2234302220783d223435252220793d22343325222066696c6c3d22626c61636b2277696474683d22313022206865696768743d2231302220783d223537252220793d22353725222066696c6c3d22626c61636b2277696474683d22313022206865696768743d2235302220783d223535252220793d22343125222066696c6c3d22626c61636b2277696474683d22333022206865696768743d2233302220783d223533252220793d22343725222066696c6c3d22626c61636b2277696474683d22313022206865696768743d2235302220783d223439252220793d22343125222066696c6c3d22626c61636b2277696474683d22333022206865696768743d2231352220783d223535252220793d22343725222066696c6c3d22626c61636b2277696474683d22333022206865696768743d2234302220783d223535252220793d22343325222066696c6c3d22626c61636b2277696474683d22343022206865696768743d2231352220783d223435252220793d22343725222066696c6c3d22626c61636b2277696474683d22373022206865696768743d2231302220783d223830252220793d22343522207472616e73666f726d3d227472616e736c6174652833302c2031302920726f7461746528343429222066696c6c3d22626c61636b222f3e3c726563742077696474683d22313022206865696768743d2231302220783d223930252220793d22343522207472616e73666f726d3d227472616e736c6174652833302c2031302920726f7461746528343429222066696c6c3d227265642277696474683d22313022206865696768743d2231302220783d223437252220793d22353725222066696c6c3d22626c61636b2277696474683d2231303022206865696768743d2231302220783d223434252220793d22343825222066696c6c3d22626c61636b22

Deployed Bytecode

0x6080604052600436106101f95760003560e01c806380057b9a1161010d578063b88d4fde116100a0578063e985e9c51161006f578063e985e9c51461059c578063ebea57c8146105e5578063f2fde38b14610605578063f7d9757714610625578063feb6b3d11461064557600080fd5b8063b88d4fde1461050b578063be0458f51461052b578063c87b56dd1461054b578063e3e848e11461056b57600080fd5b80639a0e4ebb116100dc5780639a0e4ebb146104af578063a0712d68146104c2578063a22cb465146104d5578063b3265178146104f557600080fd5b806380057b9a1461043c57806388f1b6e41461045c5780638da5cb5b1461047c57806395d89b411461049a57600080fd5b80632f745c59116101905780634f6ccce71161015f5780634f6ccce7146103995780636352211e146103b957806370a08231146103d9578063715018a6146103f957806373ff93a21461040e57600080fd5b80632f745c5914610324578063304fe350146103445780633ccfd60b1461036457806342842e0e1461037957600080fd5b806318160ddd116101cc57806318160ddd146102af57806323b872dd146102ce5780632e3ca039146102ee5780632e7ab1a21461030457600080fd5b806301ffc9a7146101fe57806306fdde0314610233578063081812fc14610255578063095ea7b31461028d575b600080fd5b34801561020a57600080fd5b5061021e610219366004613428565b610665565b60405190151581526020015b60405180910390f35b34801561023f57600080fd5b50610248610690565b60405161022a9190613f04565b34801561026157600080fd5b50610275610270366004613544565b610722565b6040516001600160a01b03909116815260200161022a565b34801561029957600080fd5b506102ad6102a8366004613351565b6107bc565b005b3480156102bb57600080fd5b506008545b60405190815260200161022a565b3480156102da57600080fd5b506102ad6102e936600461325d565b6108d2565b3480156102fa57600080fd5b506102c0600c5481565b34801561031057600080fd5b506102ad61031f36600461347d565b610903565b34801561033057600080fd5b506102c061033f366004613351565b610bf3565b34801561035057600080fd5b5061024861035f366004613544565b610c89565b34801561037057600080fd5b506102ad610d8e565b34801561038557600080fd5b506102ad61039436600461325d565b610df4565b3480156103a557600080fd5b506102c06103b4366004613544565b610e0f565b3480156103c557600080fd5b506102756103d4366004613544565b610ea2565b3480156103e557600080fd5b506102c06103f4366004613208565b610f19565b34801561040557600080fd5b506102ad610fa0565b34801561041a57600080fd5b50600e546104299061ffff1681565b60405161ffff909116815260200161022a565b34801561044857600080fd5b50610248610457366004613544565b610fd6565b34801561046857600080fd5b506102ad6104773660046134df565b6110e9565b34801561048857600080fd5b50600b546001600160a01b0316610275565b3480156104a657600080fd5b50610248611496565b6102ad6104bd36600461337b565b6114a5565b6102ad6104d0366004613544565b61167c565b3480156104e157600080fd5b506102ad6104f0366004613315565b611766565b34801561050157600080fd5b506102c0600d5481565b34801561051757600080fd5b506102ad610526366004613299565b61182b565b34801561053757600080fd5b50610248610546366004613544565b611863565b34801561055757600080fd5b50610248610566366004613544565b61195c565b34801561057757600080fd5b5061058b610586366004613462565b6120d6565b60405161022a95949392919061405d565b3480156105a857600080fd5b5061021e6105b736600461322a565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156105f157600080fd5b50610248610600366004613544565b6121a2565b34801561061157600080fd5b506102ad610620366004613208565b61229c565b34801561063157600080fd5b506102ad61064036600461355d565b612334565b34801561065157600080fd5b50610248610660366004613544565b612369565b60006001600160e01b0319821663780e9d6360e01b148061068a575061068a82612464565b92915050565b60606000805461069f90614170565b80601f01602080910402602001604051908101604052809291908181526020018280546106cb90614170565b80156107185780601f106106ed57610100808354040283529160200191610718565b820191906000526020600020905b8154815290600101906020018083116106fb57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166107a05760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006107c782610ea2565b9050806001600160a01b0316836001600160a01b031614156108355760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610797565b336001600160a01b0382161480610851575061085181336105b7565b6108c35760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610797565b6108cd83836124b4565b505050565b6108dc3382612522565b6108f85760405162461bcd60e51b815260040161079790613fd5565b6108cd838383612619565b6002600a5414156109265760405162461bcd60e51b815260040161079790614026565b6002600a553361093961ffff8416610ea2565b6001600160a01b03161461097f5760405162461bcd60e51b815260206004820152600d60248201526c2737ba103cb7bab91032b3b39760991b6044820152606401610797565b6109a461098f8361ffff16610c89565b604051806020016040528060008152506127c4565b6109de5760405162461bcd60e51b815260206004820152600b60248201526a2737ba1030b71032b3b39760a91b6044820152606401610797565b6109f781604051806020016040528060008152506127c4565b15610a325760405162461bcd60e51b815260206004820152600b60248201526a22b6b83a3c903730b6b29760a91b6044820152606401610797565b600e54601961ffff9091161080610b135750600e54601961ffff90911610801590610b13575061ffff82166000908152600f602052604090206001018054610b119190610a7e90614170565b80601f0160208091040260200160405190810160405280929190818152602001828054610aaa90614170565b8015610af75780601f10610acc57610100808354040283529160200191610af7565b820191906000526020600020905b815481529060010190602001808311610ada57829003601f168201915b5050505050604051806020016040528060008152506127c4565b155b610b5f5760405162461bcd60e51b815260206004820152601f60248201527f416c6c206567732068617665206265656e206e616d656420616c7265616479006044820152606401610797565b61ffff82166000908152600f602052604090206001018054610b859190610a7e90614170565b15610bbf57600e805460019190600090610ba490849061ffff166140c5565b92506101000a81548161ffff021916908361ffff1602179055505b61ffff82166000908152600f602090815260409091208251610be9926001909201918401906130a7565b50506001600a5550565b6000610bfe83610f19565b8210610c605760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610797565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b60606109c48210158015610c9e575061138882105b15610cc857505060408051808201909152600981526822b3b39021b7b637b960b91b602082015290565b6113888210158015610cdb5750611d4c82105b15610d04575050604080518082019091526008815267115e59481319599d60c21b602082015290565b611d4c8210158015610d17575061271082105b15610d41575050604080518082019091526009815268115e5948149a59da1d60ba1b602082015290565b6127108210158015610d5457506130d482105b15610d7a57505060408051808201909152600581526409adeeae8d60db1b602082015290565b505060408051602081019091526000815290565b600b546001600160a01b03163314610db85760405162461bcd60e51b815260040161079790613fa0565b600b546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610df1573d6000803e3d6000fd5b50565b6108cd8383836040518060200160405280600081525061182b565b6000610e1a60085490565b8210610e7d5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610797565b60088281548110610e9057610e9061421c565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b03168061068a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610797565b60006001600160a01b038216610f845760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610797565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b03163314610fca5760405162461bcd60e51b815260040161079790613fa0565b610fd4600061282b565b565b606061068a826040518060400160405280601981526020017f5448455345415245534f4d45534552494f5553434f4c4f5253000000000000008152506013805480602002602001604051908101604052809291908181526020016000905b828210156110e057838290600052602060002001805461105390614170565b80601f016020809104026020016040519081016040528092919081815260200182805461107f90614170565b80156110cc5780601f106110a1576101008083540402835291602001916110cc565b820191906000526020600020905b8154815290600101906020018083116110af57829003601f168201915b505050505081526020019060010190611034565b5050505061287d565b6002600a54141561110c5760405162461bcd60e51b815260040161079790614026565b6002600a553361111f61ffff8716610ea2565b6001600160a01b031614801561114957503361113e61ffff8616610ea2565b6001600160a01b0316145b801561116957503361115e61ffff8516610ea2565b6001600160a01b0316145b801561118957503361117e61ffff8416610ea2565b6001600160a01b0316145b80156111a957503361119e61ffff8316610ea2565b6001600160a01b0316145b6112105760405162461bcd60e51b815260206004820152603260248201527f596f7520646f6e2774206f776e206174206c65617374206f6e65206f662074686044820152713290383937bb34b232b2103a37b5b2b7399760711b6064820152608401610797565b61122061098f8661ffff16610c89565b61125a5760405162461bcd60e51b815260206004820152600b60248201526a2737ba1030b71032b3b39760a91b6044820152606401610797565b61129161126a8561ffff16610c89565b6040518060400160405280600981526020016822b3b39021b7b637b960b91b8152506127c4565b6112d15760405162461bcd60e51b81526020600482015260116024820152702737ba1030b71032b3b39031b7b637b91760791b6044820152606401610797565b6113076112e18461ffff16610c89565b60405180604001604052806008815260200167115e59481319599d60c21b8152506127c4565b6113455760405162461bcd60e51b815260206004820152600f60248201526e2737ba1030903632b33a1032bcb29760891b6044820152606401610797565b61137c6113558361ffff16610c89565b60405180604001604052806009815260200168115e5948149a59da1d60ba1b8152506127c4565b6113bb5760405162461bcd60e51b815260206004820152601060248201526f2737ba1030903934b3b43a1032bcb29760811b6044820152606401610797565b6113ee6113cb8261ffff16610c89565b6040518060400160405280600581526020016409adeeae8d60db1b8152506127c4565b6114295760405162461bcd60e51b815260206004820152600c60248201526b2737ba10309036b7baba341760a11b6044820152606401610797565b61ffff9485166000908152600f602052604090208054918616600160301b0267ffff00000000000019938716640100000000029390931667ffffffff0000000019948716620100000263ffffffff1990931696909516959095171791909116919091171790556001600a55565b60606001805461069f90614170565b6002600a5414156114c85760405162461bcd60e51b815260040161079790614026565b6002600a556000805b82518110156116475760008382815181106114ee576114ee61421c565b60200260200101511015801561151e57506130d48382815181106115145761151461421c565b6020026020010151105b61155e5760405162461bcd60e51b81526020600482015260116024820152702a37b5b2b71024a21034b73b30b634b21760791b6044820152606401610797565b60008382815181106115725761157261421c565b6020026020010151101580156115a257506109c48382815181106115985761159861421c565b6020026020010151105b156115bb57600d546115b490836140e2565b9150611612565b6109c48382815181106115d0576115d061421c565b60200260200101511015801561160057506130d48382815181106115f6576115f661421c565b6020026020010151105b156101f957600c546115b490836140e2565b611635338483815181106116285761162861421c565b60200260200101516128eb565b8061163f816141ab565b9150506114d1565b5080158015906116575750348111155b6116735760405162461bcd60e51b815260040161079790613f69565b50506001600a55565b6002600a54141561169f5760405162461bcd60e51b815260040161079790614026565b6002600a556130d481106116e95760405162461bcd60e51b81526020600482015260116024820152702a37b5b2b71024a21034b73b30b634b21760791b6044820152606401610797565b6109c481101561171a5734600d5411156117155760405162461bcd60e51b815260040161079790613f69565b611754565b6109c4811015801561172d57506130d481105b156101f95734600c5411156117155760405162461bcd60e51b815260040161079790613f69565b61175e33826128eb565b506001600a55565b6001600160a01b0382163314156117bf5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610797565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6118353383612522565b6118515760405162461bcd60e51b815260040161079790613fd5565b61185d84848484612909565b50505050565b606061068a826040518060400160405280600c81526020016b1512115156515254d311519560a21b8152506010805480602002602001604051908101604052809291908181526020016000905b828210156110e05783829060005260206000200180546118cf90614170565b80601f01602080910402602001604051908101604052809291908181526020018280546118fb90614170565b80156119485780601f1061191d57610100808354040283529160200191611948565b820191906000526020600020905b81548152906001019060200180831161192b57829003601f168201915b5050505050815260200190600101906118b0565b606060008061196a84610c89565b905061197461312b565b61197c613153565b61199583604051806020016040528060008152506127c4565b611c0257620f424393506119c16119ae61126a88610c89565b6119bb57620f4242610fd6565b86610fd6565b60408301526119e86119d56112e188610c89565b6119e257620f4242611863565b86611863565b6060830152611a0f6119fc61135588610c89565b611a0957620f42426121a2565b866121a2565b6080830152611a36611a236113cb88610c89565b611a3057620f4242612369565b86612369565b60a083015260408051808201909152600d81526c37b830b1b4ba3c9e911817199160991b60208201528152611a6d61126a87610c89565b611a9c576040518060400160405280600d81526020016c37b830b1b4ba3c9e911817199160991b815250611ac3565b6040518060400160405280600d81526020016c37b830b1b4ba3c9e911897181160991b8152505b6020820152611ad46112e187610c89565b611b03576040518060400160405280600d81526020016c37b830b1b4ba3c9e911817199160991b815250611b2a565b6040518060400160405280600d81526020016c37b830b1b4ba3c9e911897181160991b8152505b6040820152611b3b61135587610c89565b611b6a576040518060400160405280600d81526020016c37b830b1b4ba3c9e911817199160991b815250611b91565b6040518060400160405280600d81526020016c37b830b1b4ba3c9e911897181160991b8152505b6060820152611ba26113cb87610c89565b611bd1576040518060400160405280600d81526020016c37b830b1b4ba3c9e911817199160991b815250611bf8565b6040518060400160405280600d81526020016c37b830b1b4ba3c9e911897181160991b8152505b6080820152611d6b565b61ffff8087166000908152600f6020526040902054879550611c4d9116611c2c57620f4242611c43565b61ffff8086166000908152600f6020526040902054165b62ffffff16610fd6565b60408084019190915261ffff8581166000908152600f6020529190912054611cab916201000090910416611c8457620f4242611ca1565b61ffff8086166000908152600f6020526040902054620100009004165b62ffffff16611863565b606083015261ffff8481166000908152600f6020526040902054611d099164010000000090910416611ce057620f4242611cff565b61ffff8086166000908152600f60205260409020546401000000009004165b62ffffff166121a2565b608083015261ffff8481166000908152600f6020526040902054611d6591600160301b90910416611d3d57620f4242611d5b565b61ffff8086166000908152600f6020526040902054600160301b9004165b62ffffff16612369565b60a08301525b6040808301519051611d80919060200161375f565b60408051808303601f190181529190528252611dc3611d9e85610fd6565b604051806040016040528060078152602001662346414641464160c81b8152506127c4565b15611dee576040518061090001604052806108c2815260200161429f6108c291396020830152611e20565b8051611df985610fd6565b604051602001611e0a9291906139af565b60408051808303601f1901815291905260208301525b6020808201516040808501519051611e389301613888565b60408051808303601f19018152918152838101919091528181015160608401519151611e679290602001613951565b60408051808303601f190181529181526060808501929092529082015160808401519151611e989290602001613951565b60408051808303601f190181529181526080808501929092529082015160a08401519151611ec99290602001613951565b60408051808303601f1901815291815260a084019190915261ffff85166000908152600f602052206001018054611f049190610a7e90614170565b611f455761ffff84166000908152600f60209081526040918290209151611f2f926001019101613d68565b60408051808303601f1901815291905260c08301525b60408051808201825260068152651e17b9bb339f60d11b60208083019190915260e08501829052845185820151868501516060880151608089015160a08a015160c08b01519851600099611fa9999798969795969495939492939092909101613691565b604051602081830303815290604052905060006120a7611fd886604051806020016040528060008152506127c4565b6120015785604051602001611fed9190613736565b60405160208183030381529060405261201e565b6040518060400160405280600381526020016245676760e81b8152505b6120278a61293c565b61203085612a3a565b6020808901516040808b015160608c015160808d015160a08e015160c08f015194516120809761206297969101613612565b6040516020818303038152906040528051906020012060001c61293c565b6040516020016120939493929190613a35565b604051602081830303815290604052612a3a565b9050806040516020016120ba9190613e8c565b60408051601f1981840301815291905298975050505050505050565b600f602052600090815260409020805460018201805461ffff808416946201000085048216946401000000008104831694600160301b9091049092169290919061211f90614170565b80601f016020809104026020016040519081016040528092919081815260200182805461214b90614170565b80156121985780601f1061216d57610100808354040283529160200191612198565b820191906000526020600020905b81548152906001019060200180831161217b57829003601f168201915b5050505050905085565b606061068a826040518060400160405280600d81526020016c1512115156515254d49251d215609a1b8152506011805480602002602001604051908101604052809291908181526020016000905b828210156110e057838290600052602060002001805461220f90614170565b80601f016020809104026020016040519081016040528092919081815260200182805461223b90614170565b80156122885780601f1061225d57610100808354040283529160200191612288565b820191906000526020600020905b81548152906001019060200180831161226b57829003601f168201915b5050505050815260200190600101906121f0565b600b546001600160a01b031633146122c65760405162461bcd60e51b815260040161079790613fa0565b6001600160a01b03811661232b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610797565b610df18161282b565b600b546001600160a01b0316331461235e5760405162461bcd60e51b815260040161079790613fa0565b600c91909155600d55565b606061068a826040518060400160405280600e81526020016d1513d5105313165353d55512115160921b8152506012805480602002602001604051908101604052809291908181526020016000905b828210156110e05783829060005260206000200180546123d790614170565b80601f016020809104026020016040519081016040528092919081815260200182805461240390614170565b80156124505780601f1061242557610100808354040283529160200191612450565b820191906000526020600020905b81548152906001019060200180831161243357829003601f168201915b5050505050815260200190600101906123b8565b60006001600160e01b031982166380ac58cd60e01b148061249557506001600160e01b03198216635b5e139f60e01b145b8061068a57506301ffc9a760e01b6001600160e01b031983161461068a565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906124e982610ea2565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b031661259b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610797565b60006125a683610ea2565b9050806001600160a01b0316846001600160a01b031614806125e15750836001600160a01b03166125d684610722565b6001600160a01b0316145b8061261157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661262c82610ea2565b6001600160a01b0316146126945760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610797565b6001600160a01b0382166126f65760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610797565b612701838383612ba0565b61270c6000826124b4565b6001600160a01b038316600090815260036020526040812080546001929061273590849061412d565b90915550506001600160a01b03821660009081526003602052604081208054600192906127639084906140e2565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000816040516020016127d791906135c7565b60405160208183030381529060405280519060200120836040516020016127fe91906135c7565b6040516020818303038152906040528051906020012014156128225750600161068a565b50600092915050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b606060006128b38461288e8761293c565b60405160200161289f9291906135e3565b604051602081830303815290604052612c58565b90506000838451836128c591906141c6565b815181106128d5576128d561421c565b6020026020010151905080925050509392505050565b612905828260405180602001604052806000815250612c89565b5050565b612914848484612619565b61292084848484612cbc565b61185d5760405162461bcd60e51b815260040161079790613f17565b6060816129605750506040805180820190915260018152600360fc1b602082015290565b8160005b811561298a5780612974816141ab565b91506129839050600a836140fa565b9150612964565b60008167ffffffffffffffff8111156129a5576129a5614232565b6040519080825280601f01601f1916602001820160405280156129cf576020820181803683370190505b5090505b8415612611576129e460018361412d565b91506129f1600a866141c6565b6129fc9060306140e2565b60f81b818381518110612a1157612a1161421c565b60200101906001600160f81b031916908160001a905350612a33600a866140fa565b94506129d3565b805160609080612a5a575050604080516020810190915260008152919050565b60006003612a698360026140e2565b612a7391906140fa565b612a7e90600461410e565b90506000612a8d8260206140e2565b67ffffffffffffffff811115612aa557612aa5614232565b6040519080825280601f01601f191660200182016040528015612acf576020820181803683370190505b509050600060405180606001604052806040815260200161425f604091399050600181016020830160005b86811015612b5b576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101612afa565b506003860660018114612b755760028114612b8657612b92565b613d3d60f01b600119830152612b92565b603d60f81b6000198301525b505050918152949350505050565b6001600160a01b038316612bfb57612bf681600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612c1e565b816001600160a01b0316836001600160a01b031614612c1e57612c1e8382612dc9565b6001600160a01b038216612c35576108cd81612e66565b826001600160a01b0316826001600160a01b0316146108cd576108cd8282612f15565b600081604051602001612c6b91906135c7565b60408051601f19818403018152919052805160209091012092915050565b612c938383612f59565b612ca06000848484612cbc565b6108cd5760405162461bcd60e51b815260040161079790613f17565b60006001600160a01b0384163b15612dbe57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612d00903390899088908890600401613ed1565b602060405180830381600087803b158015612d1a57600080fd5b505af1925050508015612d4a575060408051601f3d908101601f19168201909252612d4791810190613445565b60015b612da4573d808015612d78576040519150601f19603f3d011682016040523d82523d6000602084013e612d7d565b606091505b508051612d9c5760405162461bcd60e51b815260040161079790613f17565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612611565b506001949350505050565b60006001612dd684610f19565b612de0919061412d565b600083815260076020526040902054909150808214612e33576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612e789060019061412d565b60008381526009602052604081205460088054939450909284908110612ea057612ea061421c565b906000526020600020015490508060088381548110612ec157612ec161421c565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612ef957612ef9614206565b6001900381819060005260206000200160009055905550505050565b6000612f2083610f19565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216612faf5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610797565b6000818152600260205260409020546001600160a01b0316156130145760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610797565b61302060008383612ba0565b6001600160a01b03821660009081526003602052604081208054600192906130499084906140e2565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546130b390614170565b90600052602060002090601f0160209004810192826130d5576000855561311b565b82601f106130ee57805160ff191683800117855561311b565b8280016001018555821561311b579182015b8281111561311b578251825591602001919060010190613100565b5061312792915061316d565b5090565b6040518061010001604052806008905b606081526020019060019003908161313b5790505090565b6040805160a081019091526060815260046020820161313b565b5b80821115613127576000815560010161316e565b600067ffffffffffffffff83111561319c5761319c614232565b6131af601f8401601f1916602001614094565b90508281528383830111156131c357600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146131f157600080fd5b919050565b803561ffff811681146131f157600080fd5b60006020828403121561321a57600080fd5b613223826131da565b9392505050565b6000806040838503121561323d57600080fd5b613246836131da565b9150613254602084016131da565b90509250929050565b60008060006060848603121561327257600080fd5b61327b846131da565b9250613289602085016131da565b9150604084013590509250925092565b600080600080608085870312156132af57600080fd5b6132b8856131da565b93506132c6602086016131da565b925060408501359150606085013567ffffffffffffffff8111156132e957600080fd5b8501601f810187136132fa57600080fd5b61330987823560208401613182565b91505092959194509250565b6000806040838503121561332857600080fd5b613331836131da565b91506020830135801515811461334657600080fd5b809150509250929050565b6000806040838503121561336457600080fd5b61336d836131da565b946020939093013593505050565b6000602080838503121561338e57600080fd5b823567ffffffffffffffff808211156133a657600080fd5b818501915085601f8301126133ba57600080fd5b8135818111156133cc576133cc614232565b8060051b91506133dd848301614094565b8181528481019084860184860187018a10156133f857600080fd5b600095505b8386101561341b5780358352600195909501949186019186016133fd565b5098975050505050505050565b60006020828403121561343a57600080fd5b813561322381614248565b60006020828403121561345757600080fd5b815161322381614248565b60006020828403121561347457600080fd5b613223826131f6565b6000806040838503121561349057600080fd5b613499836131f6565b9150602083013567ffffffffffffffff8111156134b557600080fd5b8301601f810185136134c657600080fd5b6134d585823560208401613182565b9150509250929050565b600080600080600060a086880312156134f757600080fd5b613500866131f6565b945061350e602087016131f6565b935061351c604087016131f6565b925061352a606087016131f6565b9150613538608087016131f6565b90509295509295909350565b60006020828403121561355657600080fd5b5035919050565b6000806040838503121561357057600080fd5b50508035926020909101359150565b60008151808452613597816020860160208601614144565b601f01601f19169290920160200192915050565b600081516135bd818560208601614144565b9290920192915050565b600082516135d9818460208701614144565b9190910192915050565b600083516135f5818460208801614144565b835190830190613609818360208801614144565b01949350505050565b6000875160206136258285838d01614144565b8851918401916136388184848d01614144565b885192019161364a8184848c01614144565b875192019161365c8184848b01614144565b865192019161366e8184848a01614144565b85519201916136808184848901614144565b919091019998505050505050505050565b6000895160206136a48285838f01614144565b8a51918401916136b78184848f01614144565b8a519201916136c98184848e01614144565b89519201916136db8184848d01614144565b88519201916136ed8184848c01614144565b87519201916136ff8184848b01614144565b86519201916137118184848a01614144565b85519201916137238184848901614144565b919091019b9a5050505050505050505050565b60008251613748818460208701614144565b640814185c9d60da1b920191825250600501919050565b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323081527f30302f73766722207072657365727665417370656374526174696f3d22784d6960208201527f6e594d696e206d656574222076696577426f783d22302030203630302036303060408201527f223e3c7374796c653e2e6865617679207b20666f6e743a20626f6c642036307060608201527f782073616e732d73657269663b7061696e742d6f726465723a207374726f6b6560808201527f3b207374726f6b653a20626c61636b3b207374726f6b652d77696474683a203560a0820152690383c1d903334b6361d160b51b60c0820152600082516138688160ca850160208701614144565b683e9e17b9ba3cb6329f60b91b60ca93909101928301525060d301919050565b6701e31b4b931b632960c51b8152600083516138ab816008850160208801614144565b7f207472616e73666f726d3d227363616c6528302e3620312e30292220723d22316008918401918201527f3530222063783d22383025222063793d2235302522207374726f6b653d22626c60288201527f61636b22207374726f6b652d77696474683d223130222066696c6c3d2200000060488201528351613934816065840160208801614144565b631110179f60e11b60659290910191820152606901949350505050565b6501e3932b1ba160d51b815260008351613972816006850160208801614144565b600160fd1b6006918401918201528351613993816007840160208801614144565b6210179f60e91b60079290910191820152600a01949350505050565b6501e3932b1ba160d51b8152600083516139d0816006850160208801614144565b7f2077696474683d223130302522206865696768743d2231303025222066696c6c600691840191820152611e9160f11b60268201528351613a18816028840160208801614144565b631110179f60e11b60289290910191820152602c01949350505050565b693d913730b6b2911d101160b11b81528451600090613a5b81600a850160208a01614144565b61202360f01b600a918401918201528551613a7d81600c840160208a01614144565b7f222c20226465736372697074696f6e223a2022436f6f6c204567677320697320600c92909101918201527f6c6f6f7461626c652061727420746861742073697473207472756c7920616e64602c8201527f2066756c6c79206f6e2d636861696e2e204372656174652074686520636f6f6c604c8201527f657374206567677320616e6420646566696e6520746865697220726172697469606c8201527f6573206279206c6f6f74696e6720666f72207061727473212052617269747920608c8201527f697320646566696e65642062792074686520526172697479205369676e61747560ac8201527f726520746f2073706f74206475706c6963617465732e204f6e6c79203235207060cc8201527f61696e74656420656767732063616e206765742061206e616d6520287570646160ec8201527f7461626c65206279206f776e6572732921204d696e74206d617020666f72204561010c8201527f746865727363616e3a20656767732066726f6d2030202d20323439392028757361012c8201527f652074686f73652061732063616e76617320746f207061696e74292c2065676761014c8201527f20636f6c6f72732066726f6d2032353030202d20343939392c206c656674206561016c8201527f7965732066726f6d2035303030202d20373439392c207269676874206579657361018c8201527f2066726f6d2037353030202d20393939392c206d6f757468732066726f6d20316101ac8201527f30303030202d2031323439392e222c2022696d616765223a2022646174613a696101cc820152731b5859d94bdcdd99cade1b5b0ed8985cd94d8d0b60621b6101ec820152613d5d613d4d613d47613cf86102008501896135ab565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a225281527f6172697479205369676e6174757265222c202276616c7565223a2200000000006020820152603b0190565b866135ab565b63227d5d7d60e01b815260040190565b979650505050505050565b7f3c7465787420783d223530252220793d223930252220646f6d696e616e742d628152600060207f6173656c696e653d226d6964646c652220746578742d616e63686f723d226d69818401527332323632911031b630b9b99e913432b0bb3c911f60611b604084015260546000855481600182811c915080831680613dee57607f831692505b868310811415613e0c57634e487b7160e01b85526022600452602485fd5b808015613e205760018114613e3557613e66565b60ff1985168a880152838a0187019550613e66565b60008b81526020902060005b85811015613e5c5781548c82018a0152908401908901613e41565b505086848b010195505b5050505050613e8281661e17ba32bc3a1f60c91b815260070190565b9695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251613ec481601d850160208701614144565b91909101601d0192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613e829083018461357f565b602081526000613223602083018461357f565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252601f908201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600061ffff80881683528087166020840152808616604084015280851660608401525060a06080830152613d5d60a083018461357f565b604051601f8201601f1916810167ffffffffffffffff811182821017156140bd576140bd614232565b604052919050565b600061ffff808316818516808303821115613609576136096141da565b600082198211156140f5576140f56141da565b500190565b600082614109576141096141f0565b500490565b6000816000190483118215151615614128576141286141da565b500290565b60008282101561413f5761413f6141da565b500390565b60005b8381101561415f578181015183820152602001614147565b8381111561185d5750506000910152565b600181811c9082168061418457607f821691505b602082108114156141a557634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156141bf576141bf6141da565b5060010190565b6000826141d5576141d56141f0565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610df157600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c73766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f737667272077696474683d273130302527206865696768743d2731303025272076696577426f783d273020302038303020383030273e3c726563742066696c6c3d2723666666666666272077696474683d2738303027206865696768743d27383030272f3e3c646566733e3c72616469616c4772616469656e742069643d2761272063783d27343030272063793d273430302720723d2735302527206772616469656e74556e6974733d277573657253706163654f6e557365273e3c73746f7020206f66667365743d2730272073746f702d636f6c6f723d2723666666666666272f3e3c73746f7020206f66667365743d2731272073746f702d636f6c6f723d2723304546272f3e3c2f72616469616c4772616469656e743e3c72616469616c4772616469656e742069643d2762272063783d27343030272063793d273430302720723d2737302527206772616469656e74556e6974733d277573657253706163654f6e557365273e3c73746f7020206f66667365743d2730272073746f702d636f6c6f723d2723666666666666272f3e3c73746f7020206f66667365743d2731272073746f702d636f6c6f723d2723304646272f3e3c2f72616469616c4772616469656e743e3c2f646566733e3c726563742066696c6c3d2775726c28236129272077696474683d2738303027206865696768743d27383030272f3e3c672066696c6c2d6f7061636974793d272e38273e3c706174682066696c6c3d2775726c282362292720643d274d3939382e37203433392e3263312e372d32362e3520312e372d35322e3720302e312d37382e354c343031203339392e396330203020302d302e3120302d302e316c3538372e362d3131362e39632d352e312d32352e392d31312e392d35312e322d32302e332d37352e384c3430302e39203339392e376330203020302d302e3120302d302e316c3533372e332d323635632d31312e362d32332e352d32342e382d34362e322d33392e332d36372e394c3430302e38203339392e356330203020302d302e312d302e312d302e316c3435302e342d333935632d31372e332d31392e372d33352e382d33382e322d35352e352d35352e356c2d333935203435302e34633020302d302e3120302d302e312d302e314c3733332e342d3939632d32312e372d31342e352d34342e342d32372e362d36382d33392e336c2d323635203533372e34633020302d302e3120302d302e3120306c3139322e362d3536372e34632d32342e362d382e332d34392e392d31352e312d37352e382d32302e324c3430302e3220333939633020302d302e3120302d302e3120306c33392e322d3539372e37632d32362e352d312e372d35322e372d312e372d37382e352d302e314c3339392e3920333939633020302d302e3120302d302e3120304c3238322e392d3138382e36632d32352e3920352e312d35312e322031312e392d37352e382032302e336c3139322e36203536372e34633020302d302e3120302d302e3120306c2d3236352d3533372e33632d32332e352031312e362d34362e322032342e382d36372e392033392e336c3333322e38203439382e31633020302d302e3120302d302e3120302e314c342e342d35312e31432d31352e332d33332e392d33332e382d31352e332d35312e3120342e346c3435302e342033393563302030203020302e312d302e3120302e314c2d39392036362e36632d31342e352032312e372d32372e362034342e342d33392e332036386c3533372e342032363563302030203020302e31203020302e316c2d3536372e342d3139322e36632d382e332032342e362d31352e312034392e392d32302e322037352e384c333939203339392e3863302030203020302e31203020302e316c2d3539372e372d33392e32632d312e372032362e352d312e372035322e372d302e312037382e354c333939203430302e3163302030203020302e31203020302e316c2d3538372e36203131362e3963352e312032352e392031312e392035312e322032302e332037352e386c3536372e342d3139322e3663302030203020302e31203020302e316c2d3533372e33203236356331312e362032332e352032342e382034362e322033392e332036372e396c3439382e312d3333322e3863302030203020302e3120302e3120302e316c2d3435302e34203339356331372e332031392e372033352e382033382e322035352e352035352e356c3339352d3435302e346330203020302e31203020302e3120302e314c36362e36203839396332312e372031342e352034342e342032372e362036382033392e336c3236352d3533372e346330203020302e31203020302e3120304c3230372e31203936382e336332342e3620382e332034392e392031352e312037352e382032302e324c3339392e38203430316330203020302e31203020302e3120306c2d33392e32203539372e376332362e3520312e372035322e3720312e372037382e3520302e314c3430302e31203430316330203020302e31203020302e3120306c3131362e39203538372e366332352e392d352e312035312e322d31312e392037352e382d32302e334c3430302e33203430302e396330203020302e31203020302e3120306c323635203533372e336332332e352d31312e362034362e322d32342e382036372e392d33392e334c3430302e35203430302e386330203020302e31203020302e312d302e316c333935203435302e346331392e372d31372e332033382e322d33352e382035352e352d35352e356c2d3435302e342d3339356330203020302d302e3120302e312d302e314c383939203733332e346331342e352d32312e372032372e362d34342e342033392e332d36386c2d3533372e342d3236356330203020302d302e3120302d302e316c3536372e34203139322e3663382e332d32342e362031352e312d34392e392032302e322d37352e384c343031203430302e326330203020302d302e3120302d302e314c3939382e37203433392e327a272f3e3c2f673e3c2f7376673ea2646970667358221220511af5f00d8c0645702748fbdfdfdc4776cbece72e60068777b391fc24926c6364736f6c63430008070033

Deployed Bytecode Sourcemap

44378:15587:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38230:224;;;;;;;;;;-1:-1:-1;38230:224:0;;;;;:::i;:::-;;:::i;:::-;;;20684:14:1;;20677:22;20659:41;;20647:2;20632:18;38230:224:0;;;;;;;;25358:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;26917:221::-;;;;;;;;;;-1:-1:-1;26917:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;19982:32:1;;;19964:51;;19952:2;19937:18;26917:221:0;19818:203:1;26440:411:0;;;;;;;;;;-1:-1:-1;26440:411:0;;;;;:::i;:::-;;:::i;:::-;;38870:113;;;;;;;;;;-1:-1:-1;38958:10:0;:17;38870:113;;;32872:25:1;;;32860:2;32845:18;38870:113:0;32726:177:1;27807:339:0;;;;;;;;;;-1:-1:-1;27807:339:0;;;;;:::i;:::-;;:::i;44462:44::-;;;;;;;;;;;;;;;;56805:656;;;;;;;;;;-1:-1:-1;56805:656:0;;;;;:::i;:::-;;:::i;38538:256::-;;;;;;;;;;-1:-1:-1;38538:256:0;;;;;:::i;:::-;;:::i;47919:580::-;;;;;;;;;;-1:-1:-1;47919:580:0;;;;;:::i;:::-;;:::i;58883:104::-;;;;;;;;;;;;;:::i;28217:185::-;;;;;;;;;;-1:-1:-1;28217:185:0;;;;;:::i;:::-;;:::i;39060:233::-;;;;;;;;;;-1:-1:-1;39060:233:0;;;;;:::i;:::-;;:::i;25052:239::-;;;;;;;;;;-1:-1:-1;25052:239:0;;;;;:::i;:::-;;:::i;24782:208::-;;;;;;;;;;-1:-1:-1;24782:208:0;;;;;:::i;:::-;;:::i;9818:94::-;;;;;;;;;;;;;:::i;44631:23::-;;;;;;;;;;-1:-1:-1;44631:23:0;;;;;;;;;;;32143:6:1;32131:19;;;32113:38;;32101:2;32086:18;44631:23:0;31969:188:1;46947:148:0;;;;;;;;;;-1:-1:-1;46947:148:0;;;;;:::i;:::-;;:::i;55525:1268::-;;;;;;;;;;-1:-1:-1;55525:1268:0;;;;;:::i;:::-;;:::i;9167:87::-;;;;;;;;;;-1:-1:-1;9240:6:0;;-1:-1:-1;;;;;9240:6:0;9167:87;;25527:104;;;;;;;;;;;;;:::i;58071:804::-;;;;;;:::i;:::-;;:::i;57469:594::-;;;;;;:::i;:::-;;:::i;27210:295::-;;;;;;;;;;-1:-1:-1;27210:295:0;;;;;:::i;:::-;;:::i;44545:46::-;;;;;;;;;;;;;;;;28473:328;;;;;;;;;;-1:-1:-1;28473:328:0;;;;;:::i;:::-;;:::i;47107:139::-;;;;;;;;;;-1:-1:-1;47107:139:0;;;;;:::i;:::-;;:::i;48781:6732::-;;;;;;;;;;-1:-1:-1;48781:6732:0;;;;;:::i;:::-;;:::i;44829:39::-;;;;;;;;;;-1:-1:-1;44829:39:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;27576:164::-;;;;;;;;;;-1:-1:-1;27576:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;27697:25:0;;;27673:4;27697:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;27576:164;47258:142;;;;;;;;;;-1:-1:-1;47258:142:0;;;;;:::i;:::-;;:::i;10067:192::-;;;;;;;;;;-1:-1:-1;10067:192:0;;;;;:::i;:::-;;:::i;58999:155::-;;;;;;;;;;-1:-1:-1;58999:155:0;;;;;:::i;:::-;;:::i;47412:137::-;;;;;;;;;;-1:-1:-1;47412:137:0;;;;;:::i;:::-;;:::i;38230:224::-;38332:4;-1:-1:-1;;;;;;38356:50:0;;-1:-1:-1;;;38356:50:0;;:90;;;38410:36;38434:11;38410:23;:36::i;:::-;38349:97;38230:224;-1:-1:-1;;38230:224:0:o;25358:100::-;25412:13;25445:5;25438:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25358:100;:::o;26917:221::-;26993:7;30400:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30400:16:0;27013:73;;;;-1:-1:-1;;;27013:73:0;;27940:2:1;27013:73:0;;;27922:21:1;27979:2;27959:18;;;27952:30;28018:34;27998:18;;;27991:62;-1:-1:-1;;;28069:18:1;;;28062:42;28121:19;;27013:73:0;;;;;;;;;-1:-1:-1;27106:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;27106:24:0;;26917:221::o;26440:411::-;26521:13;26537:23;26552:7;26537:14;:23::i;:::-;26521:39;;26585:5;-1:-1:-1;;;;;26579:11:0;:2;-1:-1:-1;;;;;26579:11:0;;;26571:57;;;;-1:-1:-1;;;26571:57:0;;29469:2:1;26571:57:0;;;29451:21:1;29508:2;29488:18;;;29481:30;29547:34;29527:18;;;29520:62;-1:-1:-1;;;29598:18:1;;;29591:31;29639:19;;26571:57:0;29267:397:1;26571:57:0;8123:10;-1:-1:-1;;;;;26663:21:0;;;;:62;;-1:-1:-1;26688:37:0;26705:5;8123:10;27576:164;:::i;26688:37::-;26641:168;;;;-1:-1:-1;;;26641:168:0;;25651:2:1;26641:168:0;;;25633:21:1;25690:2;25670:18;;;25663:30;25729:34;25709:18;;;25702:62;25800:26;25780:18;;;25773:54;25844:19;;26641:168:0;25449:420:1;26641:168:0;26822:21;26831:2;26835:7;26822:8;:21::i;:::-;26510:341;26440:411;;:::o;27807:339::-;28002:41;8123:10;28035:7;28002:18;:41::i;:::-;27994:103;;;;-1:-1:-1;;;27994:103:0;;;;;;;:::i;:::-;28110:28;28120:4;28126:2;28130:7;28110:9;:28::i;56805:656::-;12098:1;12694:7;;:19;;12686:63;;;;-1:-1:-1;;;12686:63:0;;;;;;;:::i;:::-;12098:1;12827:7;:18;56979:10:::1;56947:28;56955:19;::::0;::::1;56947:7;:28::i;:::-;-1:-1:-1::0;;;;;56947:42:0::1;;56925:105;;;::::0;-1:-1:-1;;;56925:105:0;;26897:2:1;56925:105:0::1;::::0;::::1;26879:21:1::0;26936:2;26916:18;;;26909:30;-1:-1:-1;;;26955:18:1;;;26948:43;27008:18;;56925:105:0::1;26695:337:1::0;56925:105:0::1;57049:31;57056:19;57064:10;57056:19;;:7;:19::i;:::-;57049:31;;;;;;;;;;;::::0;:6:::1;:31::i;:::-;57041:55;;;::::0;-1:-1:-1;;;57041:55:0;;24538:2:1;57041:55:0::1;::::0;::::1;24520:21:1::0;24577:2;24557:18;;;24550:30;-1:-1:-1;;;24596:18:1;;;24589:41;24647:18;;57041:55:0::1;24336:335:1::0;57041:55:0::1;57116:16;57123:4;57116:16;;;;;;;;;;;::::0;:6:::1;:16::i;:::-;57115:17;57107:41;;;::::0;-1:-1:-1;;;57107:41:0;;27600:2:1;57107:41:0::1;::::0;::::1;27582:21:1::0;27639:2;27619:18;;;27612:30;-1:-1:-1;;;27658:18:1;;;27651:41;27709:18;;57107:41:0::1;27398:335:1::0;57107:41:0::1;57167:9;::::0;57179:2:::1;57167:9;::::0;;::::1;:14;::::0;:75:::1;;-1:-1:-1::0;57186:9:0::1;::::0;57199:2:::1;57186:9;::::0;;::::1;:15;::::0;::::1;::::0;:55:::1;;-1:-1:-1::0;57213:18:0::1;::::0;::::1;;::::0;;;:6:::1;:18;::::0;;;;:23:::1;;57206:35:::0;;::::1;::::0;57213:23;57206:35:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;:6:::1;:35::i;:::-;57205:36;57186:55;57159:119;;;::::0;-1:-1:-1;;;57159:119:0;;21483:2:1;57159:119:0::1;::::0;::::1;21465:21:1::0;21522:2;21502:18;;;21495:30;21561:33;21541:18;;;21534:61;21612:18;;57159:119:0::1;21281:355:1::0;57159:119:0::1;57309:18;::::0;::::1;;::::0;;;:6:::1;:18;::::0;;;;:23:::1;;57302:35:::0;;::::1;::::0;57309:23;57302:35:::1;::::0;::::1;:::i;:::-;57299:94;;;57367:9;:14:::0;;57380:1:::1;::::0;57367:9;::::1;::::0;:14:::1;::::0;57380:1;;57367:14:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;57299:94;57413:18;::::0;::::1;;::::0;;;:6:::1;:18;::::0;;;;;;;:30;;::::1;::::0;:23:::1;::::0;;::::1;::::0;:30;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;12054:1:0;13006:7;:22;-1:-1:-1;56805:656:0:o;38538:256::-;38635:7;38671:23;38688:5;38671:16;:23::i;:::-;38663:5;:31;38655:87;;;;-1:-1:-1;;;38655:87:0;;21843:2:1;38655:87:0;;;21825:21:1;21882:2;21862:18;;;21855:30;21921:34;21901:18;;;21894:62;-1:-1:-1;;;21972:18:1;;;21965:41;22023:19;;38655:87:0;21641:407:1;38655:87:0;-1:-1:-1;;;;;;38760:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;38538:256::o;47919:580::-;47973:13;48022:4;48011:7;:15;;:33;;;;;48040:4;48030:7;:14;48011:33;48008:454;;;-1:-1:-1;;48074:18:0;;;;;;;;;;;;-1:-1:-1;;;48074:18:0;;;;;47919:580::o;48008:454::-;48142:4;48131:7;:15;;:33;;;;;48160:4;48150:7;:14;48131:33;48128:334;;;-1:-1:-1;;48194:17:0;;;;;;;;;;;;-1:-1:-1;;;48194:17:0;;;;;47919:580::o;48128:334::-;48261:4;48250:7;:15;;:34;;;;;48279:5;48269:7;:15;48250:34;48247:215;;;-1:-1:-1;;48314:18:0;;;;;;;;;;;;-1:-1:-1;;;48314:18:0;;;;;47919:580::o;48247:215::-;48382:5;48371:7;:16;;:35;;;;;48401:5;48391:7;:15;48371:35;48368:94;;;-1:-1:-1;;48436:14:0;;;;;;;;;;;;-1:-1:-1;;;48436:14:0;;;;;47919:580::o;48368:94::-;-1:-1:-1;;48482:9:0;;;;;;;;;-1:-1:-1;48482:9:0;;;47919:580::o;58883:104::-;9240:6;;-1:-1:-1;;;;;9240:6:0;8123:10;9387:23;9379:68;;;;-1:-1:-1;;;9379:68:0;;;;;;;:::i;:::-;9240:6;;58931:48:::1;::::0;-1:-1:-1;;;;;9240:6:0;;;;58957:21:::1;58931:48:::0;::::1;;;::::0;::::1;::::0;;;58957:21;9240:6;58931:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;58883:104::o:0;28217:185::-;28355:39;28372:4;28378:2;28382:7;28355:39;;;;;;;;;;;;:16;:39::i;39060:233::-;39135:7;39171:30;38958:10;:17;;38870:113;39171:30;39163:5;:38;39155:95;;;;-1:-1:-1;;;39155:95:0;;30635:2:1;39155:95:0;;;30617:21:1;30674:2;30654:18;;;30647:30;30713:34;30693:18;;;30686:62;-1:-1:-1;;;30764:18:1;;;30757:42;30816:19;;39155:95:0;30433:408:1;39155:95:0;39268:10;39279:5;39268:17;;;;;;;;:::i;:::-;;;;;;;;;39261:24;;39060:233;;;:::o;25052:239::-;25124:7;25160:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25160:16:0;25195:19;25187:73;;;;-1:-1:-1;;;25187:73:0;;26487:2:1;25187:73:0;;;26469:21:1;26526:2;26506:18;;;26499:30;26565:34;26545:18;;;26538:62;-1:-1:-1;;;26616:18:1;;;26609:39;26665:19;;25187:73:0;26285:405:1;24782:208:0;24854:7;-1:-1:-1;;;;;24882:19:0;;24874:74;;;;-1:-1:-1;;;24874:74:0;;26076:2:1;24874:74:0;;;26058:21:1;26115:2;26095:18;;;26088:30;26154:34;26134:18;;;26127:62;-1:-1:-1;;;26205:18:1;;;26198:40;26255:19;;24874:74:0;25874:406:1;24874:74:0;-1:-1:-1;;;;;;24966:16:0;;;;;:9;:16;;;;;;;24782:208::o;9818:94::-;9240:6;;-1:-1:-1;;;;;9240:6:0;8123:10;9387:23;9379:68;;;;-1:-1:-1;;;9379:68:0;;;;;;;:::i;:::-;9883:21:::1;9901:1;9883:9;:21::i;:::-;9818:94::o:0;46947:148::-;47003:13;47036:51;47042:7;47036:51;;;;;;;;;;;;;;;;;47080:6;47036:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:51::i;55525:1268::-;12098:1;12694:7;;:19;;12686:63;;;;-1:-1:-1;;;12686:63:0;;;;;;;:::i;:::-;12098:1;12827:7;:18;55803:10:::1;55771:28;55779:19;::::0;::::1;55771:7;:28::i;:::-;-1:-1:-1::0;;;;;55771:42:0::1;;:107;;;;-1:-1:-1::0;55868:10:0::1;55831:33;55839:24;::::0;::::1;55831:7;:33::i;:::-;-1:-1:-1::0;;;;;55831:47:0::1;;55771:107;:171;;;;-1:-1:-1::0;55932:10:0::1;55896:32;55904:23;::::0;::::1;55896:7;:32::i;:::-;-1:-1:-1::0;;;;;55896:46:0::1;;55771:171;:235;;;;-1:-1:-1::0;55996:10:0::1;55959:33;55967:24;::::0;::::1;55959:7;:33::i;:::-;-1:-1:-1::0;;;;;55959:47:0::1;;55771:235;:296;;;;-1:-1:-1::0;56057:10:0::1;56023:30;56031:21;::::0;::::1;56023:7;:30::i;:::-;-1:-1:-1::0;;;;;56023:44:0::1;;55771:296;55749:397;;;::::0;-1:-1:-1;;;55749:397:0;;31048:2:1;55749:397:0::1;::::0;::::1;31030:21:1::0;31087:2;31067:18;;;31060:30;31126:34;31106:18;;;31099:62;-1:-1:-1;;;31177:18:1;;;31170:48;31235:19;;55749:397:0::1;30846:414:1::0;55749:397:0::1;56175:31;56182:19;56190:10;56182:19;;:7;:19::i;56175:31::-;56167:55;;;::::0;-1:-1:-1;;;56167:55:0;;24538:2:1;56167:55:0::1;::::0;::::1;24520:21:1::0;24577:2;24557:18;;;24550:30;-1:-1:-1;;;24596:18:1;;;24589:41;24647:18;;56167:55:0::1;24336:335:1::0;56167:55:0::1;56241:45;56248:24;56256:15;56248:24;;:7;:24::i;:::-;56241:45;;;;;;;;;;;;;-1:-1:-1::0;;;56241:45:0::1;;::::0;:6:::1;:45::i;:::-;56233:75;;;::::0;-1:-1:-1;;;56233:75:0;;30289:2:1;56233:75:0::1;::::0;::::1;30271:21:1::0;30328:2;30308:18;;;30301:30;-1:-1:-1;;;30347:18:1;;;30340:47;30404:18;;56233:75:0::1;30087:341:1::0;56233:75:0::1;56327:43;56334:23;56342:14;56334:23;;:7;:23::i;:::-;56327:43;;;;;;;;;;;;;-1:-1:-1::0;;;56327:43:0::1;;::::0;:6:::1;:43::i;:::-;56319:71;;;::::0;-1:-1:-1;;;56319:71:0;;31467:2:1;56319:71:0::1;::::0;::::1;31449:21:1::0;31506:2;31486:18;;;31479:30;-1:-1:-1;;;31525:18:1;;;31518:45;31580:18;;56319:71:0::1;31265:339:1::0;56319:71:0::1;56409:45;56416:24;56424:15;56416:24;;:7;:24::i;:::-;56409:45;;;;;;;;;;;;;-1:-1:-1::0;;;56409:45:0::1;;::::0;:6:::1;:45::i;:::-;56401:74;;;::::0;-1:-1:-1;;;56401:74:0;;28353:2:1;56401:74:0::1;::::0;::::1;28335:21:1::0;28392:2;28372:18;;;28365:30;-1:-1:-1;;;28411:18:1;;;28404:46;28467:18;;56401:74:0::1;28151:340:1::0;56401:74:0::1;56494:38;56501:21;56509:12;56501:21;;:7;:21::i;:::-;56494:38;;;;;;;;;;;;;-1:-1:-1::0;;;56494:38:0::1;;::::0;:6:::1;:38::i;:::-;56486:63;;;::::0;-1:-1:-1;;;56486:63:0;;23438:2:1;56486:63:0::1;::::0;::::1;23420:21:1::0;23477:2;23457:18;;;23450:30;-1:-1:-1;;;23496:18:1;;;23489:42;23548:18;;56486:63:0::1;23236:336:1::0;56486:63:0::1;56570:18;::::0;;::::1;;::::0;;;:6:::1;:18;::::0;;;;:45;;56736:39;;::::1;-1:-1:-1::0;;;56736:39:0::1;-1:-1:-1::0;;56680:45:0;;::::1;::::0;::::1;56736:39:::0;;;;-1:-1:-1;;56626:43:0;;::::1;::::0;::::1;-1:-1:-1::0;;56626:43:0;;;56570:45;;;::::1;56626:43:::0;;;;::::1;56736:39:::0;;;;;;;;::::1;::::0;;56570:45;13006:7;:22;55525:1268::o;25527:104::-;25583:13;25616:7;25609:14;;;;;:::i;58071:804::-;12098:1;12694:7;;:19;;12686:63;;;;-1:-1:-1;;;12686:63:0;;;;;;;:::i;:::-;12098:1;12827:7;:18;58166:11:::1;::::0;58202:573:::1;58226:8;:15;58222:1;:19;58202:573;;;58300:1;58285:8;58294:1;58285:11;;;;;;;;:::i;:::-;;;;;;;:16;;:39;;;;;58319:5;58305:8;58314:1;58305:11;;;;;;;;:::i;:::-;;;;;;;:19;58285:39;58277:69;;;::::0;-1:-1:-1;;;58277:69:0;;21137:2:1;58277:69:0::1;::::0;::::1;21119:21:1::0;21176:2;21156:18;;;21149:30;-1:-1:-1;;;21195:18:1;;;21188:47;21252:18;;58277:69:0::1;20935:341:1::0;58277:69:0::1;58393:1;58378:8;58387:1;58378:11;;;;;;;;:::i;:::-;;;;;;;:16;;:38;;;;;58412:4;58398:8;58407:1;58398:11;;;;;;;;:::i;:::-;;;;;;;:18;58378:38;58375:326;;;58461:11;::::0;58454:18:::1;::::0;;::::1;:::i;:::-;;;58375:326;;;58525:4;58510:8;58519:1;58510:11;;;;;;;;:::i;:::-;;;;;;;:19;;:42;;;;;58547:5;58533:8;58542:1;58533:11;;;;;;;;:::i;:::-;;;;;;;:19;58510:42;58507:194;;;58597:9;::::0;58590:16:::1;::::0;;::::1;:::i;58507:194::-;58729:34;58739:10;58751:8;58760:1;58751:11;;;;;;;;:::i;:::-;;;;;;;58729:9;:34::i;:::-;58243:3:::0;::::1;::::0;::::1;:::i;:::-;;;;58202:573;;;-1:-1:-1::0;58803:8:0;;;::::1;::::0;:28:::1;;;58822:9;58815:3;:16;;58803:28;58795:72;;;;-1:-1:-1::0;;;58795:72:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;12054:1:0;13006:7;:22;58071:804::o;57469:594::-;12098:1;12694:7;;:19;;12686:63;;;;-1:-1:-1;;;12686:63:0;;;;;;;:::i;:::-;12098:1;12827:7;:18;57583:5:::1;57573:7;:15;57549:61;;;::::0;-1:-1:-1;;;57549:61:0;;21137:2:1;57549:61:0::1;::::0;::::1;21119:21:1::0;21176:2;21156:18;;;21149:30;-1:-1:-1;;;21195:18:1;;;21188:47;21252:18;;57549:61:0::1;20935:341:1::0;57549:61:0::1;57660:4;57650:7;:14;57631:372;;;57713:9;57698:11;;:24;;57690:68;;;;-1:-1:-1::0;;;57690:68:0::1;;;;;;;:::i;:::-;57631:372;;;57804:4;57793:7;:15;;:34;;;;;57822:5;57812:7;:15;57793:34;57790:213;;;57879:9;57866;;:22;;57858:66;;;;-1:-1:-1::0;;;57858:66:0::1;;;;;;;:::i;57790:213::-;58023:32;8123:10:::0;58047:7:::1;58023:9;:32::i;:::-;-1:-1:-1::0;12054:1:0;13006:7;:22;57469:594::o;27210:295::-;-1:-1:-1;;;;;27313:24:0;;8123:10;27313:24;;27305:62;;;;-1:-1:-1;;;27305:62:0;;24184:2:1;27305:62:0;;;24166:21:1;24223:2;24203:18;;;24196:30;24262:27;24242:18;;;24235:55;24307:18;;27305:62:0;23982:349:1;27305:62:0;8123:10;27380:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;27380:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;27380:53:0;;;;;;;;;;27449:48;;20659:41:1;;;27380:42:0;;8123:10;27449:48;;20632:18:1;27449:48:0;;;;;;;27210:295;;:::o;28473:328::-;28648:41;8123:10;28681:7;28648:18;:41::i;:::-;28640:103;;;;-1:-1:-1;;;28640:103:0;;;;;;;:::i;:::-;28754:39;28768:4;28774:2;28778:7;28787:5;28754:13;:39::i;:::-;28473:328;;;;:::o;47107:139::-;47165:13;47198:40;47204:7;47198:40;;;;;;;;;;;;;-1:-1:-1;;;47198:40:0;;;47229:8;47198:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48781:6732;48846:13;48882:17;48914:18;48935:16;48943:7;48935;:16::i;:::-;48914:37;;48962:22;;:::i;:::-;48995:24;;:::i;:::-;49044:16;49051:4;49044:16;;;;;;;;;;;;:6;:16::i;:::-;49040:1463;;49102:7;49090:19;;49135:67;49144:37;49151:16;49159:7;49151;:16::i;49144:37::-;:57;;49194:7;46947:148;:::i;49144:57::-;49184:7;49135:8;:67::i;:::-;49124:8;;;:78;49228:68;49239:36;49246:16;49254:7;49246;:16::i;49239:36::-;:56;;49288:7;47107:139;:::i;49239:56::-;49278:7;49228:10;:68::i;:::-;49217:8;;;:79;49322:70;49334:37;49341:16;49349:7;49341;:16::i;49334:37::-;:57;;49384:7;47258:142;:::i;49334:57::-;49374:7;49322:11;:70::i;:::-;49311:8;;;:81;49418:63;49427:33;49434:16;49442:7;49434;:16::i;49427:33::-;:53;;49473:7;47412:137;:::i;49427:53::-;49463:7;49418:8;:63::i;:::-;49407:8;;;:74;49510:28;;;;;;;;;;;;-1:-1:-1;;;49407:8:0;49510:28;;;;;49566:37;49573:16;49581:7;49573;:16::i;49566:37::-;:73;;;;;;;;;;;;;;;-1:-1:-1;;;49566:73:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;49566:73:0;;;;49553:10;;;:86;49667:36;49674:16;49682:7;49674;:16::i;49667:36::-;:72;;;;;;;;;;;;;;;-1:-1:-1;;;49667:72:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;49667:72:0;;;;49654:10;;;:85;49767:37;49774:16;49782:7;49774;:16::i;49767:37::-;:73;;;;;;;;;;;;;;;-1:-1:-1;;;49767:73:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;49767:73:0;;;;49754:10;;;:86;49868:33;49875:16;49883:7;49875;:16::i;49868:33::-;:69;;;;;;;;;;;;;;;-1:-1:-1;;;49868:69:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;49868:69:0;;;;49855:10;;;:82;49040:1463;;;50042:25;;;;;;;;:6;:25;;;;;:34;50000:7;;-1:-1:-1;50033:96:0;;50042:34;:86;;50121:7;50042:86;;;50084:25;;;;;;;;:6;:25;;;;;:34;;50042:86;50033:96;;:8;:96::i;:::-;50022:8;;;;:107;;;;50166:25;;;;;;;;:6;50022:8;50166:25;;;;;:33;50155:96;;50166:33;;;;;:84;;50243:7;50166:84;;;50207:25;;;;;;;;:6;:25;;;;;:33;;;;;50166:84;50155:96;;:10;:96::i;:::-;50144:8;;;:107;50289:25;;;;;;;;:6;50144:8;50289:25;;;;:34;50277:98;;50289:34;;;;;:85;;50367:7;50289:85;;;50331:25;;;;;;;;:6;:25;;;;;:34;;;;;50289:85;50277:98;;:11;:98::i;:::-;50266:8;;;:109;50410:25;;;;;;;;:6;50266:8;50410:25;;;;:31;50401:90;;-1:-1:-1;;;50410:31:0;;;;:80;;50483:7;50410:80;;;50449:25;;;;;;;;:6;:25;;;;;:31;-1:-1:-1;;;50449:31:0;;;50410:80;50401:90;;:8;:90::i;:::-;50390:8;;;:101;49040:1463;50763:8;;;;;50541:243;;;;50763:8;;50541:243;;:::i;:::-;;;;;;;-1:-1:-1;;50541:243:0;;;;;;50523:262;;50801:38;50808:19;50817:9;50808:8;:19::i;:::-;50801:38;;;;;;;;;;;;;-1:-1:-1;;;50801:38:0;;;:6;:38::i;:::-;50798:2517;;;50869:2255;;;;;;;;;;;;;;;;;:8;;;:2255;50798:2517;;;53224:10;;53272:19;53281:9;53272:8;:19::i;:::-;53198:101;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;53198:101:0;;;;;;53180:8;;;:120;50798:2517;53381:10;;;;;53488:8;;;;;53353:151;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;53353:151:0;;;;;;53335:8;;;:170;;;;53570:10;;;;53585:8;;;;53544:56;;;;53585:8;53335;53544:56;;:::i;:::-;;;;;;;-1:-1:-1;;53544:56:0;;;;;;53526:8;;;;:75;;;;53666:10;;;;53681:8;;;;53640:56;;;;53681:8;53526;53640:56;;:::i;:::-;;;;;;;-1:-1:-1;;53640:56:0;;;;;;53622:8;;;;:75;;;;53762:10;;;;53777:8;;;;53736:56;;;;53777:8;53622;53736:56;;:::i;:::-;;;;;;;-1:-1:-1;;53736:56:0;;;;;;53718:8;;;:75;;;;53825:25;;;;;;;:6;53718:8;53825:25;;:30;;53818:42;;;;53825:30;53818:42;;;:::i;:::-;53814:252;;54012:25;;;;;;;:6;:25;;;;;;;;;53908:145;;;;54012:30;;;53908:145;;:::i;:::-;;;;;;;-1:-1:-1;;53908:145:0;;;;;;53890:8;;;:164;53814:252;54086:19;;;;;;;;;;;-1:-1:-1;;;54086:19:0;;;;;;;;:8;;;:19;;;54179:8;;54189;;;;54199;;;;54209;;;;54219;;;;54229;;;;54239;;;;54162:96;;-1:-1:-1;;54162:96:0;;54179:8;;54189;;54199;;54209;;54219;;54229;;54239;;54086:19;;54162:96;;:::i;:::-;;;;;;;;;;;;;54118:151;;54290:18;54311:1075;54448:16;54455:4;54448:16;;;;;;;;;;;;:6;:16::i;:::-;:65;;54499:4;54482:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;54448:65;;;;;;;;;;;;;;;;-1:-1:-1;;;54448:65:0;;;;54520:17;54529:7;54520:8;:17::i;:::-;55093:28;55113:6;55093:13;:28::i;:::-;55254:8;;;;;55263;;;;;55272;;;;55281;;;;55290;;;;55299;;;;55237:71;;55210:101;;55237:71;;55254:8;55299;55237:71;;:::i;:::-;;;;;;;;;;;;;55227:82;;;;;;55219:91;;55210:8;:101::i;:::-;54392:949;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54311:13;:1075::i;:::-;54290:1096;;55473:4;55423:55;;;;;;;;:::i;:::-;;;;-1:-1:-1;;55423:55:0;;;;;;;;;;48781:6732;-1:-1:-1;;;;;;;;48781:6732:0:o;44829:39::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;44829:39:0;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47258:142::-;47317:13;47350:42;47356:7;47350:42;;;;;;;;;;;;;-1:-1:-1;;;47350:42:0;;;47382:9;47350:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10067:192;9240:6;;-1:-1:-1;;;;;9240:6:0;8123:10;9387:23;9379:68;;;;-1:-1:-1;;;9379:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10156:22:0;::::1;10148:73;;;::::0;-1:-1:-1;;;10148:73:0;;22674:2:1;10148:73:0::1;::::0;::::1;22656:21:1::0;22713:2;22693:18;;;22686:30;22752:34;22732:18;;;22725:62;-1:-1:-1;;;22803:18:1;;;22796:36;22849:19;;10148:73:0::1;22472:402:1::0;10148:73:0::1;10232:19;10242:8;10232:9;:19::i;58999:155::-:0;9240:6;;-1:-1:-1;;;;;9240:6:0;8123:10;9387:23;9379:68;;;;-1:-1:-1;;;9379:68:0;;;;;;;:::i;:::-;59087:9:::1;:22:::0;;;;59120:11:::1;:26:::0;58999:155::o;47412:137::-;47468:13;47501:40;47507:7;47501:40;;;;;;;;;;;;;-1:-1:-1;;;47501:40:0;;;47534:6;47501:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24413:305;24515:4;-1:-1:-1;;;;;;24552:40:0;;-1:-1:-1;;;24552:40:0;;:105;;-1:-1:-1;;;;;;;24609:48:0;;-1:-1:-1;;;24609:48:0;24552:105;:158;;;-1:-1:-1;;;;;;;;;;23131:40:0;;;24674:36;23022:157;34293:174;34368:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;34368:29:0;-1:-1:-1;;;;;34368:29:0;;;;;;;;:24;;34422:23;34368:24;34422:14;:23::i;:::-;-1:-1:-1;;;;;34413:46:0;;;;;;;;;;;34293:174;;:::o;30605:348::-;30698:4;30400:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30400:16:0;30715:73;;;;-1:-1:-1;;;30715:73:0;;25238:2:1;30715:73:0;;;25220:21:1;25277:2;25257:18;;;25250:30;25316:34;25296:18;;;25289:62;-1:-1:-1;;;25367:18:1;;;25360:42;25419:19;;30715:73:0;25036:408:1;30715:73:0;30799:13;30815:23;30830:7;30815:14;:23::i;:::-;30799:39;;30868:5;-1:-1:-1;;;;;30857:16:0;:7;-1:-1:-1;;;;;30857:16:0;;:51;;;;30901:7;-1:-1:-1;;;;;30877:31:0;:20;30889:7;30877:11;:20::i;:::-;-1:-1:-1;;;;;30877:31:0;;30857:51;:87;;;-1:-1:-1;;;;;;27697:25:0;;;27673:4;27697:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;30912:32;30849:96;30605:348;-1:-1:-1;;;;30605:348:0:o;33597:578::-;33756:4;-1:-1:-1;;;;;33729:31:0;:23;33744:7;33729:14;:23::i;:::-;-1:-1:-1;;;;;33729:31:0;;33721:85;;;;-1:-1:-1;;;33721:85:0;;29059:2:1;33721:85:0;;;29041:21:1;29098:2;29078:18;;;29071:30;29137:34;29117:18;;;29110:62;-1:-1:-1;;;29188:18:1;;;29181:39;29237:19;;33721:85:0;28857:405:1;33721:85:0;-1:-1:-1;;;;;33825:16:0;;33817:65;;;;-1:-1:-1;;;33817:65:0;;23779:2:1;33817:65:0;;;23761:21:1;23818:2;23798:18;;;23791:30;23857:34;23837:18;;;23830:62;-1:-1:-1;;;23908:18:1;;;23901:34;23952:19;;33817:65:0;23577:400:1;33817:65:0;33895:39;33916:4;33922:2;33926:7;33895:20;:39::i;:::-;33999:29;34016:1;34020:7;33999:8;:29::i;:::-;-1:-1:-1;;;;;34041:15:0;;;;;;:9;:15;;;;;:20;;34060:1;;34041:15;:20;;34060:1;;34041:20;:::i;:::-;;;;-1:-1:-1;;;;;;;34072:13:0;;;;;;:9;:13;;;;;:18;;34089:1;;34072:13;:18;;34089:1;;34072:18;:::i;:::-;;;;-1:-1:-1;;34101:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34101:21:0;-1:-1:-1;;;;;34101:21:0;;;;;;;;;34140:27;;34101:16;;34140:27;;;;;;;33597:578;;;:::o;48511:258::-;48583:4;48673:1;48656:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;48646:30;;;;;;48639:1;48622:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;48612:30;;;;;;:64;48609:120;;;-1:-1:-1;48713:4:0;48706:11;;48609:120;-1:-1:-1;48756:5:0;48511:258;;;;:::o;10267:173::-;10342:6;;;-1:-1:-1;;;;;10359:17:0;;;-1:-1:-1;;;;;;10359:17:0;;;;;;;10392:40;;10342:6;;;10359:17;10342:6;;10392:40;;10323:16;;10392:40;10312:128;10267:173;:::o;47557:350::-;47700:13;47726:12;47741:62;47772:9;47783:17;47792:7;47783:8;:17::i;:::-;47755:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47741:6;:62::i;:::-;47726:77;;47814:20;47837:11;47856;:18;47849:4;:25;;;;:::i;:::-;47837:38;;;;;;;;:::i;:::-;;;;;;;47814:61;;47893:6;47886:13;;;;47557:350;;;;;:::o;31295:110::-;31371:26;31381:2;31385:7;31371:26;;;;;;;;;;;;:9;:26::i;:::-;31295:110;;:::o;29683:315::-;29840:28;29850:4;29856:2;29860:7;29840:9;:28::i;:::-;29887:48;29910:4;29916:2;29920:7;29929:5;29887:22;:48::i;:::-;29879:111;;;;-1:-1:-1;;;29879:111:0;;;;;;;:::i;59162:723::-;59218:13;59439:10;59435:53;;-1:-1:-1;;59466:10:0;;;;;;;;;;;;-1:-1:-1;;;59466:10:0;;;;;59162:723::o;59435:53::-;59513:5;59498:12;59554:78;59561:9;;59554:78;;59587:8;;;;:::i;:::-;;-1:-1:-1;59610:10:0;;-1:-1:-1;59618:2:0;59610:10;;:::i;:::-;;;59554:78;;;59642:19;59674:6;59664:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59664:17:0;;59642:39;;59692:154;59699:10;;59692:154;;59726:11;59736:1;59726:11;;:::i;:::-;;-1:-1:-1;59795:10:0;59803:2;59795:5;:10;:::i;:::-;59782:24;;:2;:24;:::i;:::-;59769:39;;59752:6;59759;59752:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;59752:56:0;;;;;;;;-1:-1:-1;59823:11:0;59832:2;59823:11;;:::i;:::-;;;59692:154;;60316:1607;60414:11;;60374:13;;60440:8;60436:23;;-1:-1:-1;;60450:9:0;;;;;;;;;-1:-1:-1;60450:9:0;;;60316:1607;-1:-1:-1;60316:1607:0:o;60436:23::-;60511:18;60549:1;60538:7;:3;60544:1;60538:7;:::i;:::-;60537:13;;;;:::i;:::-;60532:19;;:1;:19;:::i;:::-;60511:40;-1:-1:-1;60609:19:0;60641:15;60511:40;60654:2;60641:15;:::i;:::-;60631:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60631:26:0;;60609:48;;60670:18;60691:5;;;;;;;;;;;;;;;;;60670:26;;60760:1;60753:5;60749:13;60805:2;60797:6;60793:15;60856:1;60824:777;60879:3;60876:1;60873:10;60824:777;;;60934:1;60977:12;;;;;60971:19;61072:4;61060:2;61056:14;;;;;61038:40;;61032:47;61181:2;61177:14;;;61173:25;;61159:40;;61153:47;61310:1;61306:13;;;61302:24;;61288:39;;61282:46;61430:16;;;;61416:31;;61410:38;61108:1;61104:11;;;61202:4;61149:58;;;61140:68;61233:11;;61278:57;;;61269:67;;;;61361:11;;61406:49;;61397:59;61485:3;61481:13;61514:22;;61584:1;61569:17;;;;60927:9;60824:777;;;60828:44;61633:1;61628:3;61624:11;61654:1;61649:84;;;;61752:1;61747:82;;;;61617:212;;61649:84;-1:-1:-1;;;;;61682:17:0;;61675:43;61649:84;;61747:82;-1:-1:-1;;;;;61780:17:0;;61773:41;61617:212;-1:-1:-1;;;61845:26:0;;;61852:6;60316:1607;-1:-1:-1;;;;60316:1607:0:o;39906:589::-;-1:-1:-1;;;;;40112:18:0;;40108:187;;40147:40;40179:7;41322:10;:17;;41295:24;;;;:15;:24;;;;;:44;;;41350:24;;;;;;;;;;;;41218:164;40147:40;40108:187;;;40217:2;-1:-1:-1;;;;;40209:10:0;:4;-1:-1:-1;;;;;40209:10:0;;40205:90;;40236:47;40269:4;40275:7;40236:32;:47::i;:::-;-1:-1:-1;;;;;40309:16:0;;40305:183;;40342:45;40379:7;40342:36;:45::i;40305:183::-;40415:4;-1:-1:-1;;;;;40409:10:0;:2;-1:-1:-1;;;;;40409:10:0;;40405:83;;40436:40;40464:2;40468:7;40436:27;:40::i;46797:138::-;46857:7;46919:5;46902:23;;;;;;;;:::i;:::-;;;;-1:-1:-1;;46902:23:0;;;;;;;;;46892:34;;46902:23;46892:34;;;;;46797:138;-1:-1:-1;;46797:138:0:o;31632:321::-;31762:18;31768:2;31772:7;31762:5;:18::i;:::-;31813:54;31844:1;31848:2;31852:7;31861:5;31813:22;:54::i;:::-;31791:154;;;;-1:-1:-1;;;31791:154:0;;;;;;;:::i;35032:803::-;35187:4;-1:-1:-1;;;;;35208:13:0;;15529:20;15577:8;35204:624;;35244:72;;-1:-1:-1;;;35244:72:0;;-1:-1:-1;;;;;35244:36:0;;;;;:72;;8123:10;;35295:4;;35301:7;;35310:5;;35244:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35244:72:0;;;;;;;;-1:-1:-1;;35244:72:0;;;;;;;;;;;;:::i;:::-;;;35240:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35490:13:0;;35486:272;;35533:60;;-1:-1:-1;;;35533:60:0;;;;;;;:::i;35486:272::-;35708:6;35702:13;35693:6;35689:2;35685:15;35678:38;35240:533;-1:-1:-1;;;;;;35367:55:0;-1:-1:-1;;;35367:55:0;;-1:-1:-1;35360:62:0;;35204:624;-1:-1:-1;35812:4:0;35032:803;;;;;;:::o;42009:988::-;42275:22;42325:1;42300:22;42317:4;42300:16;:22::i;:::-;:26;;;;:::i;:::-;42337:18;42358:26;;;:17;:26;;;;;;42275:51;;-1:-1:-1;42491:28:0;;;42487:328;;-1:-1:-1;;;;;42558:18:0;;42536:19;42558:18;;;:12;:18;;;;;;;;:34;;;;;;;;;42609:30;;;;;;:44;;;42726:30;;:17;:30;;;;;:43;;;42487:328;-1:-1:-1;42911:26:0;;;;:17;:26;;;;;;;;42904:33;;;-1:-1:-1;;;;;42955:18:0;;;;;:12;:18;;;;;:34;;;;;;;42948:41;42009:988::o;43292:1079::-;43570:10;:17;43545:22;;43570:21;;43590:1;;43570:21;:::i;:::-;43602:18;43623:24;;;:15;:24;;;;;;43996:10;:26;;43545:46;;-1:-1:-1;43623:24:0;;43545:46;;43996:26;;;;;;:::i;:::-;;;;;;;;;43974:48;;44060:11;44035:10;44046;44035:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;44140:28;;;:15;:28;;;;;;;:41;;;44312:24;;;;;44305:31;44347:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;43363:1008;;;43292:1079;:::o;40796:221::-;40881:14;40898:20;40915:2;40898:16;:20::i;:::-;-1:-1:-1;;;;;40929:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;40974:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;40796:221:0:o;32289:382::-;-1:-1:-1;;;;;32369:16:0;;32361:61;;;;-1:-1:-1;;;32361:61:0;;27239:2:1;32361:61:0;;;27221:21:1;;;27258:18;;;27251:30;27317:34;27297:18;;;27290:62;27369:18;;32361:61:0;27037:356:1;32361:61:0;30376:4;30400:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30400:16:0;:30;32433:58;;;;-1:-1:-1;;;32433:58:0;;23081:2:1;32433:58:0;;;23063:21:1;23120:2;23100:18;;;23093:30;23159;23139:18;;;23132:58;23207:18;;32433:58:0;22879:352:1;32433:58:0;32504:45;32533:1;32537:2;32541:7;32504:20;:45::i;:::-;-1:-1:-1;;;;;32562:13:0;;;;;;:9;:13;;;;;:18;;32579:1;;32562:13;:18;;32579:1;;32562:18;:::i;:::-;;;;-1:-1:-1;;32591:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32591:21:0;-1:-1:-1;;;;;32591:21:0;;;;;;;;32630:33;;32591:16;;;32630:33;;32591:16;;32630:33;32289:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:70;;588:1;585;578:12;522:70;425:173;;;:::o;603:159::-;670:20;;730:6;719:18;;709:29;;699:57;;752:1;749;742:12;767:186;826:6;879:2;867:9;858:7;854:23;850:32;847:52;;;895:1;892;885:12;847:52;918:29;937:9;918:29;:::i;:::-;908:39;767:186;-1:-1:-1;;;767:186:1:o;958:260::-;1026:6;1034;1087:2;1075:9;1066:7;1062:23;1058:32;1055:52;;;1103:1;1100;1093:12;1055:52;1126:29;1145:9;1126:29;:::i;:::-;1116:39;;1174:38;1208:2;1197:9;1193:18;1174:38;:::i;:::-;1164:48;;958:260;;;;;:::o;1223:328::-;1300:6;1308;1316;1369:2;1357:9;1348:7;1344:23;1340:32;1337:52;;;1385:1;1382;1375:12;1337:52;1408:29;1427:9;1408:29;:::i;:::-;1398:39;;1456:38;1490:2;1479:9;1475:18;1456:38;:::i;:::-;1446:48;;1541:2;1530:9;1526:18;1513:32;1503:42;;1223:328;;;;;:::o;1556:666::-;1651:6;1659;1667;1675;1728:3;1716:9;1707:7;1703:23;1699:33;1696:53;;;1745:1;1742;1735:12;1696:53;1768:29;1787:9;1768:29;:::i;:::-;1758:39;;1816:38;1850:2;1839:9;1835:18;1816:38;:::i;:::-;1806:48;;1901:2;1890:9;1886:18;1873:32;1863:42;;1956:2;1945:9;1941:18;1928:32;1983:18;1975:6;1972:30;1969:50;;;2015:1;2012;2005:12;1969:50;2038:22;;2091:4;2083:13;;2079:27;-1:-1:-1;2069:55:1;;2120:1;2117;2110:12;2069:55;2143:73;2208:7;2203:2;2190:16;2185:2;2181;2177:11;2143:73;:::i;:::-;2133:83;;;1556:666;;;;;;;:::o;2227:347::-;2292:6;2300;2353:2;2341:9;2332:7;2328:23;2324:32;2321:52;;;2369:1;2366;2359:12;2321:52;2392:29;2411:9;2392:29;:::i;:::-;2382:39;;2471:2;2460:9;2456:18;2443:32;2518:5;2511:13;2504:21;2497:5;2494:32;2484:60;;2540:1;2537;2530:12;2484:60;2563:5;2553:15;;;2227:347;;;;;:::o;2579:254::-;2647:6;2655;2708:2;2696:9;2687:7;2683:23;2679:32;2676:52;;;2724:1;2721;2714:12;2676:52;2747:29;2766:9;2747:29;:::i;:::-;2737:39;2823:2;2808:18;;;;2795:32;;-1:-1:-1;;;2579:254:1:o;2838:957::-;2922:6;2953:2;2996;2984:9;2975:7;2971:23;2967:32;2964:52;;;3012:1;3009;3002:12;2964:52;3052:9;3039:23;3081:18;3122:2;3114:6;3111:14;3108:34;;;3138:1;3135;3128:12;3108:34;3176:6;3165:9;3161:22;3151:32;;3221:7;3214:4;3210:2;3206:13;3202:27;3192:55;;3243:1;3240;3233:12;3192:55;3279:2;3266:16;3301:2;3297;3294:10;3291:36;;;3307:18;;:::i;:::-;3353:2;3350:1;3346:10;3336:20;;3376:28;3400:2;3396;3392:11;3376:28;:::i;:::-;3438:15;;;3469:12;;;;3501:11;;;3531;;;3527:20;;3524:33;-1:-1:-1;3521:53:1;;;3570:1;3567;3560:12;3521:53;3592:1;3583:10;;3602:163;3616:2;3613:1;3610:9;3602:163;;;3673:17;;3661:30;;3634:1;3627:9;;;;;3711:12;;;;3743;;3602:163;;;-1:-1:-1;3784:5:1;2838:957;-1:-1:-1;;;;;;;;2838:957:1:o;3800:245::-;3858:6;3911:2;3899:9;3890:7;3886:23;3882:32;3879:52;;;3927:1;3924;3917:12;3879:52;3966:9;3953:23;3985:30;4009:5;3985:30;:::i;4050:249::-;4119:6;4172:2;4160:9;4151:7;4147:23;4143:32;4140:52;;;4188:1;4185;4178:12;4140:52;4220:9;4214:16;4239:30;4263:5;4239:30;:::i;4304:184::-;4362:6;4415:2;4403:9;4394:7;4390:23;4386:32;4383:52;;;4431:1;4428;4421:12;4383:52;4454:28;4472:9;4454:28;:::i;4493:522::-;4570:6;4578;4631:2;4619:9;4610:7;4606:23;4602:32;4599:52;;;4647:1;4644;4637:12;4599:52;4670:28;4688:9;4670:28;:::i;:::-;4660:38;;4749:2;4738:9;4734:18;4721:32;4776:18;4768:6;4765:30;4762:50;;;4808:1;4805;4798:12;4762:50;4831:22;;4884:4;4876:13;;4872:27;-1:-1:-1;4862:55:1;;4913:1;4910;4903:12;4862:55;4936:73;5001:7;4996:2;4983:16;4978:2;4974;4970:11;4936:73;:::i;:::-;4926:83;;;4493:522;;;;;:::o;5020:474::-;5110:6;5118;5126;5134;5142;5195:3;5183:9;5174:7;5170:23;5166:33;5163:53;;;5212:1;5209;5202:12;5163:53;5235:28;5253:9;5235:28;:::i;:::-;5225:38;;5282:37;5315:2;5304:9;5300:18;5282:37;:::i;:::-;5272:47;;5338:37;5371:2;5360:9;5356:18;5338:37;:::i;:::-;5328:47;;5394:37;5427:2;5416:9;5412:18;5394:37;:::i;:::-;5384:47;;5450:38;5483:3;5472:9;5468:19;5450:38;:::i;:::-;5440:48;;5020:474;;;;;;;;:::o;5499:180::-;5558:6;5611:2;5599:9;5590:7;5586:23;5582:32;5579:52;;;5627:1;5624;5617:12;5579:52;-1:-1:-1;5650:23:1;;5499:180;-1:-1:-1;5499:180:1:o;5684:248::-;5752:6;5760;5813:2;5801:9;5792:7;5788:23;5784:32;5781:52;;;5829:1;5826;5819:12;5781:52;-1:-1:-1;;5852:23:1;;;5922:2;5907:18;;;5894:32;;-1:-1:-1;5684:248:1:o;5937:257::-;5978:3;6016:5;6010:12;6043:6;6038:3;6031:19;6059:63;6115:6;6108:4;6103:3;6099:14;6092:4;6085:5;6081:16;6059:63;:::i;:::-;6176:2;6155:15;-1:-1:-1;;6151:29:1;6142:39;;;;6183:4;6138:50;;5937:257;-1:-1:-1;;5937:257:1:o;6199:185::-;6241:3;6279:5;6273:12;6294:52;6339:6;6334:3;6327:4;6320:5;6316:16;6294:52;:::i;:::-;6362:16;;;;;6199:185;-1:-1:-1;;6199:185:1:o;6930:276::-;7061:3;7099:6;7093:13;7115:53;7161:6;7156:3;7149:4;7141:6;7137:17;7115:53;:::i;:::-;7184:16;;;;;6930:276;-1:-1:-1;;6930:276:1:o;7211:470::-;7390:3;7428:6;7422:13;7444:53;7490:6;7485:3;7478:4;7470:6;7466:17;7444:53;:::i;:::-;7560:13;;7519:16;;;;7582:57;7560:13;7519:16;7616:4;7604:17;;7582:57;:::i;:::-;7655:20;;7211:470;-1:-1:-1;;;;7211:470:1:o;7686:1257::-;8057:3;8095:6;8089:13;8121:4;8134:51;8178:6;8173:3;8168:2;8160:6;8156:15;8134:51;:::i;:::-;8248:13;;8207:16;;;;8270:55;8248:13;8207:16;8292:15;;;8270:55;:::i;:::-;8392:13;;8347:20;;;8414:55;8392:13;8347:20;8436:15;;;8414:55;:::i;:::-;8536:13;;8491:20;;;8558:55;8536:13;8491:20;8580:15;;;8558:55;:::i;:::-;8680:13;;8635:20;;;8702:55;8680:13;8635:20;8724:15;;;8702:55;:::i;:::-;8824:13;;8779:20;;;8846:55;8824:13;8779:20;8868:15;;;8846:55;:::i;:::-;8917:20;;;;;7686:1257;-1:-1:-1;;;;;;;;;7686:1257:1:o;8948:1641::-;9415:3;9453:6;9447:13;9479:4;9492:51;9536:6;9531:3;9526:2;9518:6;9514:15;9492:51;:::i;:::-;9606:13;;9565:16;;;;9628:55;9606:13;9565:16;9650:15;;;9628:55;:::i;:::-;9750:13;;9705:20;;;9772:55;9750:13;9705:20;9794:15;;;9772:55;:::i;:::-;9894:13;;9849:20;;;9916:55;9894:13;9849:20;9938:15;;;9916:55;:::i;:::-;10038:13;;9993:20;;;10060:55;10038:13;9993:20;10082:15;;;10060:55;:::i;:::-;10182:13;;10137:20;;;10204:55;10182:13;10137:20;10226:15;;;10204:55;:::i;:::-;10326:13;;10281:20;;;10348:55;10326:13;10281:20;10370:15;;;10348:55;:::i;:::-;10470:13;;10425:20;;;10492:55;10470:13;10425:20;10514:15;;;10492:55;:::i;:::-;10563:20;;;;;8948:1641;-1:-1:-1;;;;;;;;;;;8948:1641:1:o;10594:443::-;10826:3;10864:6;10858:13;10880:53;10926:6;10921:3;10914:4;10906:6;10902:17;10880:53;:::i;:::-;-1:-1:-1;;;10955:16:1;;10980:22;;;-1:-1:-1;11029:1:1;11018:13;;10594:443;-1:-1:-1;10594:443:1:o;11042:1114::-;11405:66;11400:3;11393:79;11502:66;11497:2;11492:3;11488:12;11481:88;11599:66;11594:2;11589:3;11585:12;11578:88;11696:66;11691:2;11686:3;11682:12;11675:88;11794:34;11788:3;11783;11779:13;11772:57;11860:34;11854:3;11849;11845:13;11838:57;-1:-1:-1;;;11920:3:1;11915;11911:13;11904:35;11375:3;11968:6;11962:13;11984:61;12038:6;12032:3;12027;12023:13;12018:2;12010:6;12006:15;11984:61;:::i;:::-;-1:-1:-1;;;12104:3:1;12064:16;;;;12096:12;;;12089:33;-1:-1:-1;12146:3:1;12138:12;;11042:1114;-1:-1:-1;11042:1114:1:o;12161:1183::-;-1:-1:-1;;;12668:3:1;12661:23;12643:3;12713:6;12707:13;12729:61;12783:6;12779:1;12774:3;12770:11;12763:4;12755:6;12751:17;12729:61;:::i;:::-;12853:66;12849:1;12809:16;;;12841:10;;;12834:86;12949:66;12944:2;12936:11;;12929:87;13045:66;13040:2;13032:11;;13025:87;13137:13;;13159:64;13137:13;13208:3;13200:12;;13193:4;13181:17;;13159:64;:::i;:::-;-1:-1:-1;;;13283:3:1;13242:17;;;;13275:12;;;13268:42;13334:3;13326:12;;12161:1183;-1:-1:-1;;;;12161:1183:1:o;13349:906::-;-1:-1:-1;;;13856:3:1;13849:21;13831:3;13899:6;13893:13;13915:61;13969:6;13965:1;13960:3;13956:11;13949:4;13941:6;13937:17;13915:61;:::i;:::-;-1:-1:-1;;;14035:1:1;13995:16;;;14027:10;;;14020:23;14068:13;;14090:62;14068:13;14139:1;14131:10;;14124:4;14112:17;;14090:62;:::i;:::-;-1:-1:-1;;;14212:1:1;14171:17;;;;14204:10;;;14197:25;14246:2;14238:11;;13349:906;-1:-1:-1;;;;13349:906:1:o;14260:1030::-;-1:-1:-1;;;14767:3:1;14760:21;14742:3;14810:6;14804:13;14826:61;14880:6;14876:1;14871:3;14867:11;14860:4;14852:6;14848:17;14826:61;:::i;:::-;14950:66;14946:1;14906:16;;;14938:10;;;14931:86;-1:-1:-1;;;15041:2:1;15033:11;;15026:35;15086:13;;15108:63;15086:13;15157:2;15149:11;;15142:4;15130:17;;15108:63;:::i;:::-;-1:-1:-1;;;15231:2:1;15190:17;;;;15223:11;;;15216:41;15281:2;15273:11;;14260:1030;-1:-1:-1;;;;14260:1030:1:o;15295:2404::-;-1:-1:-1;;;16093:45:1;;16161:13;;16075:3;;16183:62;16161:13;16233:2;16224:12;;16217:4;16205:17;;16183:62;:::i;:::-;-1:-1:-1;;;16304:2:1;16264:16;;;16296:11;;;16289:25;16339:13;;16361:63;16339:13;16410:2;16402:11;;16395:4;16383:17;;16361:63;:::i;:::-;16489:66;16484:2;16443:17;;;;16476:11;;;16469:87;16585:34;16580:2;16572:11;;16565:55;16649:34;16644:2;16636:11;;16629:55;16714:34;16708:3;16700:12;;16693:56;16779:34;16773:3;16765:12;;16758:56;16844:34;16838:3;16830:12;;16823:56;16909:34;16903:3;16895:12;;16888:56;16974:34;16968:3;16960:12;;16953:56;17039:34;17033:3;17025:12;;17018:56;17104:34;17098:3;17090:12;;17083:56;17169:34;17163:3;17155:12;;17148:56;17234:34;17228:3;17220:12;;17213:56;17299:34;17293:3;17285:12;;17278:56;17364:34;17358:3;17350:12;;17343:56;17429:66;17423:3;17415:12;;17408:88;-1:-1:-1;;;17520:3:1;17512:12;;17505:44;17565:128;17595:97;17621:70;17651:39;17685:3;17677:12;;17669:6;17651:39;:::i;:::-;6591:66;6579:79;;6688:66;6683:2;6674:12;;6667:88;6780:2;6771:12;;6514:275;17621:70;17613:6;17595:97;:::i;:::-;-1:-1:-1;;;6859:33:1;;6917:1;6908:11;;6794:131;17565:128;17558:135;15295:2404;-1:-1:-1;;;;;;;15295:2404:1:o;17704:1656::-;18064:66;18059:3;18052:79;18034:3;18150:2;18182:66;18177:2;18172:3;18168:12;18161:88;18287:42;18283:2;18279:51;18274:2;18269:3;18265:12;18258:73;18350:2;18372:1;18405:6;18399:13;18435:3;18457:1;18485:9;18481:2;18477:18;18467:28;;18545:2;18534:9;18530:18;18567;18557:61;;18611:4;18603:6;18599:17;18589:27;;18557:61;18664:2;18656:6;18653:14;18633:18;18630:38;18627:165;;;-1:-1:-1;;;18691:33:1;;18747:4;18744:1;18737:15;18777:4;18698:3;18765:17;18627:165;18808:18;18835:122;;;;18971:1;18966:338;;;;18801:503;;18835:122;-1:-1:-1;;18877:24:1;;18863:12;;;18856:46;18926:16;;;18922:25;;;-1:-1:-1;18835:122:1;;18966:338;33261:1;33254:14;;;33298:4;33285:18;;19061:1;19075:174;19089:6;19086:1;19083:13;19075:174;;;19176:14;;19158:11;;;19154:20;;19147:44;19219:16;;;;19104:10;;19075:174;;;19079:3;;19291:2;19282:6;19277:3;19273:16;19269:25;19262:32;;18801:503;;;;;;19320:34;19350:3;-1:-1:-1;;;6454:22:1;;6501:1;6492:11;;6389:120;19320:34;19313:41;17704:1656;-1:-1:-1;;;;;;17704:1656:1:o;19365:448::-;19627:31;19622:3;19615:44;19597:3;19688:6;19682:13;19704:62;19759:6;19754:2;19749:3;19745:12;19738:4;19730:6;19726:17;19704:62;:::i;:::-;19786:16;;;;19804:2;19782:25;;19365:448;-1:-1:-1;;19365:448:1:o;20026:488::-;-1:-1:-1;;;;;20295:15:1;;;20277:34;;20347:15;;20342:2;20327:18;;20320:43;20394:2;20379:18;;20372:34;;;20442:3;20437:2;20422:18;;20415:31;;;20220:4;;20463:45;;20488:19;;20480:6;20463:45;:::i;20711:219::-;20860:2;20849:9;20842:21;20823:4;20880:44;20920:2;20909:9;20905:18;20897:6;20880:44;:::i;22053:414::-;22255:2;22237:21;;;22294:2;22274:18;;;22267:30;22333:34;22328:2;22313:18;;22306:62;-1:-1:-1;;;22399:2:1;22384:18;;22377:48;22457:3;22442:19;;22053:414::o;24676:355::-;24878:2;24860:21;;;24917:2;24897:18;;;24890:30;24956:33;24951:2;24936:18;;24929:61;25022:2;25007:18;;24676:355::o;28496:356::-;28698:2;28680:21;;;28717:18;;;28710:30;28776:34;28771:2;28756:18;;28749:62;28843:2;28828:18;;28496:356::o;29669:413::-;29871:2;29853:21;;;29910:2;29890:18;;;29883:30;29949:34;29944:2;29929:18;;29922:62;-1:-1:-1;;;30015:2:1;30000:18;;29993:47;30072:3;30057:19;;29669:413::o;31609:355::-;31811:2;31793:21;;;31850:2;31830:18;;;31823:30;31889:33;31884:2;31869:18;;31862:61;31955:2;31940:18;;31609:355::o;32162:559::-;32378:4;32407:6;32452:2;32444:6;32440:15;32429:9;32422:34;32504:2;32496:6;32492:15;32487:2;32476:9;32472:18;32465:43;32556:2;32548:6;32544:15;32539:2;32528:9;32524:18;32517:43;32608:2;32600:6;32596:15;32591:2;32580:9;32576:18;32569:43;;32649:3;32643;32632:9;32628:19;32621:32;32670:45;32710:3;32699:9;32695:19;32687:6;32670:45;:::i;32908:275::-;32979:2;32973:9;33044:2;33025:13;;-1:-1:-1;;33021:27:1;33009:40;;33079:18;33064:34;;33100:22;;;33061:62;33058:88;;;33126:18;;:::i;:::-;33162:2;33155:22;32908:275;;-1:-1:-1;32908:275:1:o;33314:224::-;33353:3;33381:6;33414:2;33411:1;33407:10;33444:2;33441:1;33437:10;33475:3;33471:2;33467:12;33462:3;33459:21;33456:47;;;33483:18;;:::i;33543:128::-;33583:3;33614:1;33610:6;33607:1;33604:13;33601:39;;;33620:18;;:::i;:::-;-1:-1:-1;33656:9:1;;33543:128::o;33676:120::-;33716:1;33742;33732:35;;33747:18;;:::i;:::-;-1:-1:-1;33781:9:1;;33676:120::o;33801:168::-;33841:7;33907:1;33903;33899:6;33895:14;33892:1;33889:21;33884:1;33877:9;33870:17;33866:45;33863:71;;;33914:18;;:::i;:::-;-1:-1:-1;33954:9:1;;33801:168::o;33974:125::-;34014:4;34042:1;34039;34036:8;34033:34;;;34047:18;;:::i;:::-;-1:-1:-1;34084:9:1;;33974:125::o;34104:258::-;34176:1;34186:113;34200:6;34197:1;34194:13;34186:113;;;34276:11;;;34270:18;34257:11;;;34250:39;34222:2;34215:10;34186:113;;;34317:6;34314:1;34311:13;34308:48;;;-1:-1:-1;;34352:1:1;34334:16;;34327:27;34104:258::o;34367:380::-;34446:1;34442:12;;;;34489;;;34510:61;;34564:4;34556:6;34552:17;34542:27;;34510:61;34617:2;34609:6;34606:14;34586:18;34583:38;34580:161;;;34663:10;34658:3;34654:20;34651:1;34644:31;34698:4;34695:1;34688:15;34726:4;34723:1;34716:15;34580:161;;34367:380;;;:::o;34752:135::-;34791:3;-1:-1:-1;;34812:17:1;;34809:43;;;34832:18;;:::i;:::-;-1:-1:-1;34879:1:1;34868:13;;34752:135::o;34892:112::-;34924:1;34950;34940:35;;34955:18;;:::i;:::-;-1:-1:-1;34989:9:1;;34892:112::o;35009:127::-;35070:10;35065:3;35061:20;35058:1;35051:31;35101:4;35098:1;35091:15;35125:4;35122:1;35115:15;35141:127;35202:10;35197:3;35193:20;35190:1;35183:31;35233:4;35230:1;35223:15;35257:4;35254:1;35247:15;35273:127;35334:10;35329:3;35325:20;35322:1;35315:31;35365:4;35362:1;35355:15;35389:4;35386:1;35379:15;35405:127;35466:10;35461:3;35457:20;35454:1;35447:31;35497:4;35494:1;35487:15;35521:4;35518:1;35511:15;35537:127;35598:10;35593:3;35589:20;35586:1;35579:31;35629:4;35626:1;35619:15;35653:4;35650:1;35643:15;35669:131;-1:-1:-1;;;;;;35743:32:1;;35733:43;;35723:71;;35790:1;35787;35780:12

Swarm Source

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