ETH Price: $3,342.20 (-1.12%)

Token

NFTBOY: Bored Ape Racers (BAR)
 

Overview

Max Total Supply

2,777 BAR

Holders

886

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 BAR
0x19d6629ea138bbd85a2b7f8c865f4e38b05bce75
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Hyper-realistic 3D models of classic game cartridges reimagined as NFTs. The Bored Ape Racers collection pays homage to the classic Super Mario Kart & Mario Kart Super circuit games that were released in 1992 and 2001.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
BoredApeRacer

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 2 of 19: BoredApeRacer.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./ERC721Enumerable.sol";
import "./Ownable.sol";
import "./SafeMath.sol";
import "./Strings.sol";

import "./ContentMixin.sol";
import "./NativeMetaTransaction.sol";

contract BoredApeRacer is
    ContextMixin,
    ERC721Enumerable,
    NativeMetaTransaction,
    Ownable
{
    using SafeMath for uint256;

    uint256 private _currentTokenId = 0;

    uint256 MAX_SUPPLY = 10000;
    string public baseTokenURI;
    uint256 public startTime = 1630627200;
    
    event TokenBought(uint256 tokenId);

    constructor(
        string memory _name,
        string memory _symbol,
        string memory _uri
    ) ERC721(_name, _symbol) {
        baseTokenURI = _uri;
        _initializeEIP712(_name);
    }

    function mintTo(address _to) public onlyOwner {
        uint256 newTokenId = _getNextTokenId();
        _mint(_to, newTokenId);
        _incrementTokenId();
    }

    function buy(uint256 _num) public payable {
        require(block.timestamp >= startTime, "It's not time yet");
        require(_num > 0 && _num <= 20);
        require(msg.value == _num * 4e16);
        
        for (uint256 i = 0; i < _num; i++) {
            uint256 newTokenId = _getNextTokenId();
            
            _mint(msg.sender, newTokenId);
            emit TokenBought(newTokenId);
            
            _incrementTokenId();
        }
    }

    function withdraw() external onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }

    function _getNextTokenId() private view returns (uint256) {
        return _currentTokenId.add(1);
    }

    function random() private view returns (uint256) {
        bytes32 txHash = keccak256(
            abi.encode(block.coinbase, block.timestamp, block.difficulty)
        );
        return uint256(txHash);
    }

    function _incrementTokenId() private {
        require(_currentTokenId < MAX_SUPPLY);
        _currentTokenId++;
    }

    function setBaseUri(string memory _uri) external onlyOwner {
        baseTokenURI = _uri;
    }

    function tokenURI(uint256 _tokenId)
        public
        view
        override
        returns (string memory)
    {
        return
            string(abi.encodePacked(baseTokenURI, Strings.toString(_tokenId)));
    }

    function _msgSender() internal view override returns (address sender) {
        return ContextMixin.msgSender();
    }
}

File 1 of 19: Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 3 of 19: ContentMixin.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

abstract contract ContextMixin {
    function msgSender() internal view returns (address payable sender) {
        if (msg.sender == address(this)) {
            bytes memory array = msg.data;
            uint256 index = msg.data.length;
            assembly {
                // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those.
                sender := and(
                    mload(add(array, index)),
                    0xffffffffffffffffffffffffffffffffffffffff
                )
            }
        } else {
            sender = payable(msg.sender);
        }
        return sender;
    }
}

File 4 of 19: Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

File 5 of 19: EIP712Base.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import {Initializable} from "./Initializable.sol";

contract EIP712Base is Initializable {
    struct EIP712Domain {
        string name;
        string version;
        address verifyingContract;
        bytes32 salt;
    }

    string public constant ERC712_VERSION = "1";

    bytes32 internal constant EIP712_DOMAIN_TYPEHASH =
        keccak256(
            bytes(
                "EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)"
            )
        );
    bytes32 internal domainSeperator;

    // supposed to be called once while initializing.
    // one of the contracts that inherits this contract follows proxy pattern
    // so it is not possible to do this in a constructor
    function _initializeEIP712(string memory name) internal initializer {
        _setDomainSeperator(name);
    }

    function _setDomainSeperator(string memory name) internal {
        domainSeperator = keccak256(
            abi.encode(
                EIP712_DOMAIN_TYPEHASH,
                keccak256(bytes(name)),
                keccak256(bytes(ERC712_VERSION)),
                address(this),
                bytes32(getChainId())
            )
        );
    }

    function getDomainSeperator() public view returns (bytes32) {
        return domainSeperator;
    }

    function getChainId() public view returns (uint256) {
        uint256 id;
        assembly {
            id := chainid()
        }
        return id;
    }

    /**
     * Accept message hash and returns hash message in EIP712 compatible form
     * So that it can be used to recover signer from signature signed using EIP712 formatted data
     * https://eips.ethereum.org/EIPS/eip-712
     * "\\x19" makes the encoding deterministic
     * "\\x01" is the version byte to make it compatible to EIP-191
     */
    function toTypedMessageHash(bytes32 messageHash)
        internal
        view
        returns (bytes32)
    {
        return
            keccak256(
                abi.encodePacked("\x19\x01", getDomainSeperator(), messageHash)
            );
    }
}

File 6 of 19: ERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 7 of 19: ERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721: transfer caller is not owner nor approved"
        );

        _transfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(
            ERC721.ownerOf(tokenId) == from,
            "ERC721: transfer of token that is not own"
        );
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

File 8 of 19: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./IERC721Enumerable.sol";

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 9 of 19: IERC165.sol
// 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);
}

File 10 of 19: IERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

File 11 of 19: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

File 12 of 19: IERC721Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

File 13 of 19: IERC721Receiver.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

File 14 of 19: Initializable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

contract Initializable {
    bool inited = false;

    modifier initializer() {
        require(!inited, "already inited");
        _;
        inited = true;
    }
}

File 15 of 19: Migrations.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

contract Migrations {
  address public owner;
  uint public last_completed_migration;

  constructor() {
    owner = msg.sender;
  }

  modifier restricted() {
    if (msg.sender == owner) _;
  }

  function setCompleted(uint completed) public restricted {
    last_completed_migration = completed;
  }

  function upgrade(address new_address) public restricted {
    Migrations upgraded = Migrations(new_address);
    upgraded.setCompleted(last_completed_migration);
  }
}

File 16 of 19: NativeMetaTransaction.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import {SafeMath} from "./SafeMath.sol";
import {EIP712Base} from "./EIP712Base.sol";

contract NativeMetaTransaction is EIP712Base {
    using SafeMath for uint256;
    bytes32 private constant META_TRANSACTION_TYPEHASH =
        keccak256(
            bytes(
                "MetaTransaction(uint256 nonce,address from,bytes functionSignature)"
            )
        );
    event MetaTransactionExecuted(
        address userAddress,
        address payable relayerAddress,
        bytes functionSignature
    );
    mapping(address => uint256) nonces;

    /*
     * Meta transaction structure.
     * No point of including value field here as if user is doing value transfer then he has the funds to pay for gas
     * He should call the desired function directly in that case.
     */
    struct MetaTransaction {
        uint256 nonce;
        address from;
        bytes functionSignature;
    }

    function executeMetaTransaction(
        address userAddress,
        bytes memory functionSignature,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) public payable returns (bytes memory) {
        MetaTransaction memory metaTx = MetaTransaction({
            nonce: nonces[userAddress],
            from: userAddress,
            functionSignature: functionSignature
        });

        require(
            verify(userAddress, metaTx, sigR, sigS, sigV),
            "Signer and signature do not match"
        );

        // increase nonce for user (to avoid re-use)
        nonces[userAddress] = nonces[userAddress].add(1);

        emit MetaTransactionExecuted(
            userAddress,
            payable(msg.sender),
            functionSignature
        );

        // Append userAddress and relayer address at the end to extract it from calling context
        (bool success, bytes memory returnData) = address(this).call(
            abi.encodePacked(functionSignature, userAddress)
        );
        require(success, "Function call not successful");

        return returnData;
    }

    function hashMetaTransaction(MetaTransaction memory metaTx)
        internal
        pure
        returns (bytes32)
    {
        return
            keccak256(
                abi.encode(
                    META_TRANSACTION_TYPEHASH,
                    metaTx.nonce,
                    metaTx.from,
                    keccak256(metaTx.functionSignature)
                )
            );
    }

    function getNonce(address user) public view returns (uint256 nonce) {
        nonce = nonces[user];
    }

    function verify(
        address signer,
        MetaTransaction memory metaTx,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) internal view returns (bool) {
        require(signer != address(0), "NativeMetaTransaction: INVALID_SIGNER");
        return
            signer ==
            ecrecover(
                toTypedMessageHash(hashMetaTransaction(metaTx)),
                sigV,
                sigR,
                sigS
            );
    }
}

File 17 of 19: Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 18 of 19: SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 19 of 19: Strings.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_uri","type":"string"}],"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":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address payable","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"TokenBought","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ERC712_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_num","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDomainSeperator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"mintTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600a60006101000a81548160ff0219169083151502179055506000600e55612710600f5563613165806011553480156200003f57600080fd5b5060405162004ed738038062004ed78339818101604052810190620000659190620004ef565b828281600090805190602001906200007f929190620003c1565b50806001908051906020019062000098929190620003c1565b505050620000bb620000af620000ee60201b60201c565b6200010a60201b60201c565b8060109080519060200190620000d3929190620003c1565b50620000e583620001d060201b60201c565b5050506200086c565b6000620001056200025260201b6200186d1760201c565b905090565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600a60009054906101000a900460ff161562000223576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200021a906200064e565b60405180910390fd5b62000234816200030560201b60201c565b6001600a60006101000a81548160ff02191690831515021790555050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415620002fe57600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff81830151169250505062000302565b3390505b90565b6040518060800160405280604f815260200162004e88604f91398051906020012081805190602001206040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525080519060200120306200037c620003b460201b60201c565b60001b60405160200162000395959493929190620005f1565b60405160208183030381529060405280519060200120600b8190555050565b6000804690508091505090565b828054620003cf9062000754565b90600052602060002090601f016020900481019282620003f357600085556200043f565b82601f106200040e57805160ff19168380011785556200043f565b828001600101855582156200043f579182015b828111156200043e57825182559160200191906001019062000421565b5b5090506200044e919062000452565b5090565b5b808211156200046d57600081600090555060010162000453565b5090565b600062000488620004828462000699565b62000670565b905082815260208101848484011115620004a757620004a662000823565b5b620004b48482856200071e565b509392505050565b600082601f830112620004d457620004d36200081e565b5b8151620004e684826020860162000471565b91505092915050565b6000806000606084860312156200050b576200050a6200082d565b5b600084015167ffffffffffffffff8111156200052c576200052b62000828565b5b6200053a86828701620004bc565b935050602084015167ffffffffffffffff8111156200055e576200055d62000828565b5b6200056c86828701620004bc565b925050604084015167ffffffffffffffff81111562000590576200058f62000828565b5b6200059e86828701620004bc565b9150509250925092565b620005b381620006e0565b82525050565b620005c481620006f4565b82525050565b6000620005d9600e83620006cf565b9150620005e68262000843565b602082019050919050565b600060a082019050620006086000830188620005b9565b620006176020830187620005b9565b620006266040830186620005b9565b620006356060830185620005a8565b620006446080830184620005b9565b9695505050505050565b600060208201905081810360008301526200066981620005ca565b9050919050565b60006200067c6200068f565b90506200068a82826200078a565b919050565b6000604051905090565b600067ffffffffffffffff821115620006b757620006b6620007ef565b5b620006c28262000832565b9050602081019050919050565b600082825260208201905092915050565b6000620006ed82620006fe565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b838110156200073e57808201518184015260208101905062000721565b838111156200074e576000848401525b50505050565b600060028204905060018216806200076d57607f821691505b60208210811415620007845762000783620007c0565b5b50919050565b620007958262000832565b810181811067ffffffffffffffff82111715620007b757620007b6620007ef565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f616c726561647920696e69746564000000000000000000000000000000000000600082015250565b61460c806200087c6000396000f3fe6080604052600436106101cd5760003560e01c80636352211e116100f7578063a0bcfc7f11610095578063d547cfb711610064578063d547cfb71461068f578063d96a094a146106ba578063e985e9c5146106d6578063f2fde38b14610713576101cd565b8063a0bcfc7f146105d7578063a22cb46514610600578063b88d4fde14610629578063c87b56dd14610652576101cd565b8063755edd17116100d1578063755edd171461052d57806378e97925146105565780638da5cb5b1461058157806395d89b41146105ac576101cd565b80636352211e1461049c57806370a08231146104d9578063715018a614610516576101cd565b806320379ee51161016f5780633408e4701161013e5780633408e470146103f45780633ccfd60b1461041f57806342842e0e146104365780634f6ccce71461045f576101cd565b806320379ee51461032657806323b872dd146103515780632d0335ab1461037a5780632f745c59146103b7576101cd565b8063095ea7b3116101ab578063095ea7b3146102775780630c53c51c146102a05780630f7e5970146102d057806318160ddd146102fb576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612f69565b61073c565b6040516102069190613655565b60405180910390f35b34801561021b57600080fd5b506102246107b6565b6040516102319190613737565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c919061300c565b610848565b60405161026e91906135b0565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190612f29565b6108cd565b005b6102ba60048036038101906102b59190612e92565b6109e5565b6040516102c79190613715565b60405180910390f35b3480156102dc57600080fd5b506102e5610c57565b6040516102f29190613737565b60405180910390f35b34801561030757600080fd5b50610310610c90565b60405161031d91906139f9565b60405180910390f35b34801561033257600080fd5b5061033b610c9d565b6040516103489190613670565b60405180910390f35b34801561035d57600080fd5b5061037860048036038101906103739190612d7c565b610ca7565b005b34801561038657600080fd5b506103a1600480360381019061039c9190612d0f565b610d07565b6040516103ae91906139f9565b60405180910390f35b3480156103c357600080fd5b506103de60048036038101906103d99190612f29565b610d50565b6040516103eb91906139f9565b60405180910390f35b34801561040057600080fd5b50610409610df5565b60405161041691906139f9565b60405180910390f35b34801561042b57600080fd5b50610434610e02565b005b34801561044257600080fd5b5061045d60048036038101906104589190612d7c565b610ece565b005b34801561046b57600080fd5b506104866004803603810190610481919061300c565b610eee565b60405161049391906139f9565b60405180910390f35b3480156104a857600080fd5b506104c360048036038101906104be919061300c565b610f5f565b6040516104d091906135b0565b60405180910390f35b3480156104e557600080fd5b5061050060048036038101906104fb9190612d0f565b611011565b60405161050d91906139f9565b60405180910390f35b34801561052257600080fd5b5061052b6110c9565b005b34801561053957600080fd5b50610554600480360381019061054f9190612d0f565b611151565b005b34801561056257600080fd5b5061056b6111ef565b60405161057891906139f9565b60405180910390f35b34801561058d57600080fd5b506105966111f5565b6040516105a391906135b0565b60405180910390f35b3480156105b857600080fd5b506105c161121f565b6040516105ce9190613737565b60405180910390f35b3480156105e357600080fd5b506105fe60048036038101906105f99190612fc3565b6112b1565b005b34801561060c57600080fd5b5061062760048036038101906106229190612e52565b611347565b005b34801561063557600080fd5b50610650600480360381019061064b9190612dcf565b6114c8565b005b34801561065e57600080fd5b506106796004803603810190610674919061300c565b61152a565b6040516106869190613737565b60405180910390f35b34801561069b57600080fd5b506106a461155e565b6040516106b19190613737565b60405180910390f35b6106d460048036038101906106cf919061300c565b6115ec565b005b3480156106e257600080fd5b506106fd60048036038101906106f89190612d3c565b6116e1565b60405161070a9190613655565b60405180910390f35b34801561071f57600080fd5b5061073a60048036038101906107359190612d0f565b611775565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107af57506107ae8261191e565b5b9050919050565b6060600080546107c590613cf2565b80601f01602080910402602001604051908101604052809291908181526020018280546107f190613cf2565b801561083e5780601f106108135761010080835404028352916020019161083e565b820191906000526020600020905b81548152906001019060200180831161082157829003601f168201915b5050505050905090565b600061085382611a00565b610892576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610889906138f9565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108d882610f5f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610949576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094090613979565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610968611a6c565b73ffffffffffffffffffffffffffffffffffffffff161480610997575061099681610991611a6c565b6116e1565b5b6109d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cd90613879565b60405180910390fd5b6109e08383611a7b565b505050565b606060006040518060600160405280600c60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481526020018873ffffffffffffffffffffffffffffffffffffffff168152602001878152509050610a688782878787611b34565b610aa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9e90613959565b60405180910390fd5b610afa6001600c60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c3d90919063ffffffff16565b600c60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b873388604051610b70939291906135cb565b60405180910390a16000803073ffffffffffffffffffffffffffffffffffffffff16888a604051602001610ba592919061352d565b604051602081830303815290604052604051610bc19190613516565b6000604051808303816000865af19150503d8060008114610bfe576040519150601f19603f3d011682016040523d82523d6000602084013e610c03565b606091505b509150915081610c48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3f906137b9565b60405180910390fd5b80935050505095945050505050565b6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b6000600880549050905090565b6000600b54905090565b610cb8610cb2611a6c565b82611c53565b610cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cee90613999565b60405180910390fd5b610d02838383611d31565b505050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000610d5b83611011565b8210610d9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9390613759565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000804690508091505090565b610e0a611a6c565b73ffffffffffffffffffffffffffffffffffffffff16610e286111f5565b73ffffffffffffffffffffffffffffffffffffffff1614610e7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7590613919565b60405180910390fd5b610e866111f5565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610ecb573d6000803e3d6000fd5b50565b610ee9838383604051806020016040528060008152506114c8565b505050565b6000610ef8610c90565b8210610f39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f30906139d9565b60405180910390fd5b60088281548110610f4d57610f4c613eb9565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611008576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fff906138b9565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611082576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107990613899565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110d1611a6c565b73ffffffffffffffffffffffffffffffffffffffff166110ef6111f5565b73ffffffffffffffffffffffffffffffffffffffff1614611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c90613919565b60405180910390fd5b61114f6000611f8d565b565b611159611a6c565b73ffffffffffffffffffffffffffffffffffffffff166111776111f5565b73ffffffffffffffffffffffffffffffffffffffff16146111cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c490613919565b60405180910390fd5b60006111d7612053565b90506111e38282612070565b6111eb61223e565b5050565b60115481565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461122e90613cf2565b80601f016020809104026020016040519081016040528092919081815260200182805461125a90613cf2565b80156112a75780601f1061127c576101008083540402835291602001916112a7565b820191906000526020600020905b81548152906001019060200180831161128a57829003601f168201915b5050505050905090565b6112b9611a6c565b73ffffffffffffffffffffffffffffffffffffffff166112d76111f5565b73ffffffffffffffffffffffffffffffffffffffff161461132d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132490613919565b60405180910390fd5b8060109080519060200190611343929190612af9565b5050565b61134f611a6c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b490613819565b60405180910390fd5b80600560006113ca611a6c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611477611a6c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114bc9190613655565b60405180910390a35050565b6114d96114d3611a6c565b83611c53565b611518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150f90613999565b60405180910390fd5b61152484848484612268565b50505050565b60606010611537836122c4565b604051602001611548929190613555565b6040516020818303038152906040529050919050565b6010805461156b90613cf2565b80601f016020809104026020016040519081016040528092919081815260200182805461159790613cf2565b80156115e45780601f106115b9576101008083540402835291602001916115e4565b820191906000526020600020905b8154815290600101906020018083116115c757829003601f168201915b505050505081565b601154421015611631576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611628906139b9565b60405180910390fd5b600081118015611642575060148111155b61164b57600080fd5b668e1bc9bf0400008161165e9190613b85565b341461166957600080fd5b60005b818110156116dd57600061167e612053565b905061168a3382612070565b7f5782b4799a39cbe194d6ee862b9cfe3d8e4f9e741e3f122be89e778aba8b9fff816040516116b991906139f9565b60405180910390a16116c961223e565b5080806116d590613d55565b91505061166c565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61177d611a6c565b73ffffffffffffffffffffffffffffffffffffffff1661179b6111f5565b73ffffffffffffffffffffffffffffffffffffffff16146117f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e890613919565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611861576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185890613799565b60405180910390fd5b61186a81611f8d565b50565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561191757600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff81830151169250505061191b565b3390505b90565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806119e957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806119f957506119f882612425565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6000611a7661186d565b905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611aee83610f5f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415611ba5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9c90613859565b60405180910390fd5b6001611bb8611bb38761248f565b6124f7565b83868660405160008152602001604052604051611bd894939291906136d0565b6020604051602081039080840390855afa158015611bfa573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b60008183611c4b9190613afe565b905092915050565b6000611c5e82611a00565b611c9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9490613839565b60405180910390fd5b6000611ca883610f5f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d1757508373ffffffffffffffffffffffffffffffffffffffff16611cff84610848565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d285750611d2781856116e1565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d5182610f5f565b73ffffffffffffffffffffffffffffffffffffffff1614611da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9e90613939565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0e906137f9565b60405180910390fd5b611e22838383612530565b611e2d600082611a7b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e7d9190613bdf565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ed49190613afe565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061206b6001600e54611c3d90919063ffffffff16565b905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d7906138d9565b60405180910390fd5b6120e981611a00565b15612129576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612120906137d9565b60405180910390fd5b61213560008383612530565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121859190613afe565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600f54600e541061224e57600080fd5b600e600081548092919061226190613d55565b9190505550565b612273848484611d31565b61227f84848484612644565b6122be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b590613779565b60405180910390fd5b50505050565b6060600082141561230c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612420565b600082905060005b6000821461233e57808061232790613d55565b915050600a826123379190613b54565b9150612314565b60008167ffffffffffffffff81111561235a57612359613ee8565b5b6040519080825280601f01601f19166020018201604052801561238c5781602001600182028036833780820191505090505b5090505b60008514612419576001826123a59190613bdf565b9150600a856123b49190613dcc565b60306123c09190613afe565b60f81b8183815181106123d6576123d5613eb9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124129190613b54565b9450612390565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60006040518060800160405280604381526020016145946043913980519060200120826000015183602001518460400151805190602001206040516020016124da949392919061368b565b604051602081830303815290604052805190602001209050919050565b6000612501610c9d565b82604051602001612513929190613579565b604051602081830303815290604052805190602001209050919050565b61253b8383836127db565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561257e57612579816127e0565b6125bd565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146125bc576125bb8382612829565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612600576125fb81612996565b61263f565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461263e5761263d8282612a67565b5b5b505050565b60006126658473ffffffffffffffffffffffffffffffffffffffff16612ae6565b156127ce578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261268e611a6c565b8786866040518563ffffffff1660e01b81526004016126b09493929190613609565b602060405180830381600087803b1580156126ca57600080fd5b505af19250505080156126fb57506040513d601f19601f820116820180604052508101906126f89190612f96565b60015b61277e573d806000811461272b576040519150601f19603f3d011682016040523d82523d6000602084013e612730565b606091505b50600081511415612776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276d90613779565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127d3565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161283684611011565b6128409190613bdf565b9050600060076000848152602001908152602001600020549050818114612925576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506129aa9190613bdf565b90506000600960008481526020019081526020016000205490506000600883815481106129da576129d9613eb9565b5b9060005260206000200154905080600883815481106129fc576129fb613eb9565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612a4b57612a4a613e8a565b5b6001900381819060005260206000200160009055905550505050565b6000612a7283611011565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054612b0590613cf2565b90600052602060002090601f016020900481019282612b275760008555612b6e565b82601f10612b4057805160ff1916838001178555612b6e565b82800160010185558215612b6e579182015b82811115612b6d578251825591602001919060010190612b52565b5b509050612b7b9190612b7f565b5090565b5b80821115612b98576000816000905550600101612b80565b5090565b6000612baf612baa84613a39565b613a14565b905082815260208101848484011115612bcb57612bca613f1c565b5b612bd6848285613cb0565b509392505050565b6000612bf1612bec84613a6a565b613a14565b905082815260208101848484011115612c0d57612c0c613f1c565b5b612c18848285613cb0565b509392505050565b600081359050612c2f81614509565b92915050565b600081359050612c4481614520565b92915050565b600081359050612c5981614537565b92915050565b600081359050612c6e8161454e565b92915050565b600081519050612c838161454e565b92915050565b600082601f830112612c9e57612c9d613f17565b5b8135612cae848260208601612b9c565b91505092915050565b600082601f830112612ccc57612ccb613f17565b5b8135612cdc848260208601612bde565b91505092915050565b600081359050612cf481614565565b92915050565b600081359050612d098161457c565b92915050565b600060208284031215612d2557612d24613f26565b5b6000612d3384828501612c20565b91505092915050565b60008060408385031215612d5357612d52613f26565b5b6000612d6185828601612c20565b9250506020612d7285828601612c20565b9150509250929050565b600080600060608486031215612d9557612d94613f26565b5b6000612da386828701612c20565b9350506020612db486828701612c20565b9250506040612dc586828701612ce5565b9150509250925092565b60008060008060808587031215612de957612de8613f26565b5b6000612df787828801612c20565b9450506020612e0887828801612c20565b9350506040612e1987828801612ce5565b925050606085013567ffffffffffffffff811115612e3a57612e39613f21565b5b612e4687828801612c89565b91505092959194509250565b60008060408385031215612e6957612e68613f26565b5b6000612e7785828601612c20565b9250506020612e8885828601612c35565b9150509250929050565b600080600080600060a08688031215612eae57612ead613f26565b5b6000612ebc88828901612c20565b955050602086013567ffffffffffffffff811115612edd57612edc613f21565b5b612ee988828901612c89565b9450506040612efa88828901612c4a565b9350506060612f0b88828901612c4a565b9250506080612f1c88828901612cfa565b9150509295509295909350565b60008060408385031215612f4057612f3f613f26565b5b6000612f4e85828601612c20565b9250506020612f5f85828601612ce5565b9150509250929050565b600060208284031215612f7f57612f7e613f26565b5b6000612f8d84828501612c5f565b91505092915050565b600060208284031215612fac57612fab613f26565b5b6000612fba84828501612c74565b91505092915050565b600060208284031215612fd957612fd8613f26565b5b600082013567ffffffffffffffff811115612ff757612ff6613f21565b5b61300384828501612cb7565b91505092915050565b60006020828403121561302257613021613f26565b5b600061303084828501612ce5565b91505092915050565b61304281613c25565b82525050565b61305181613c13565b82525050565b61306861306382613c13565b613d9e565b82525050565b61307781613c37565b82525050565b61308681613c43565b82525050565b61309d61309882613c43565b613db0565b82525050565b60006130ae82613ab0565b6130b88185613ac6565b93506130c8818560208601613cbf565b6130d181613f2b565b840191505092915050565b60006130e782613ab0565b6130f18185613ad7565b9350613101818560208601613cbf565b80840191505092915050565b600061311882613abb565b6131228185613ae2565b9350613132818560208601613cbf565b61313b81613f2b565b840191505092915050565b600061315182613abb565b61315b8185613af3565b935061316b818560208601613cbf565b80840191505092915050565b6000815461318481613cf2565b61318e8186613af3565b945060018216600081146131a957600181146131ba576131ed565b60ff198316865281860193506131ed565b6131c385613a9b565b60005b838110156131e5578154818901526001820191506020810190506131c6565b838801955050505b50505092915050565b6000613203602b83613ae2565b915061320e82613f49565b604082019050919050565b6000613226603283613ae2565b915061323182613f98565b604082019050919050565b6000613249602683613ae2565b915061325482613fe7565b604082019050919050565b600061326c601c83613ae2565b915061327782614036565b602082019050919050565b600061328f601c83613ae2565b915061329a8261405f565b602082019050919050565b60006132b2600283613af3565b91506132bd82614088565b600282019050919050565b60006132d5602483613ae2565b91506132e0826140b1565b604082019050919050565b60006132f8601983613ae2565b915061330382614100565b602082019050919050565b600061331b602c83613ae2565b915061332682614129565b604082019050919050565b600061333e602583613ae2565b915061334982614178565b604082019050919050565b6000613361603883613ae2565b915061336c826141c7565b604082019050919050565b6000613384602a83613ae2565b915061338f82614216565b604082019050919050565b60006133a7602983613ae2565b91506133b282614265565b604082019050919050565b60006133ca602083613ae2565b91506133d5826142b4565b602082019050919050565b60006133ed602c83613ae2565b91506133f8826142dd565b604082019050919050565b6000613410602083613ae2565b915061341b8261432c565b602082019050919050565b6000613433602983613ae2565b915061343e82614355565b604082019050919050565b6000613456602183613ae2565b9150613461826143a4565b604082019050919050565b6000613479602183613ae2565b9150613484826143f3565b604082019050919050565b600061349c603183613ae2565b91506134a782614442565b604082019050919050565b60006134bf601183613ae2565b91506134ca82614491565b602082019050919050565b60006134e2602c83613ae2565b91506134ed826144ba565b604082019050919050565b61350181613c99565b82525050565b61351081613ca3565b82525050565b600061352282846130dc565b915081905092915050565b600061353982856130dc565b91506135458284613057565b6014820191508190509392505050565b60006135618285613177565b915061356d8284613146565b91508190509392505050565b6000613584826132a5565b9150613590828561308c565b6020820191506135a0828461308c565b6020820191508190509392505050565b60006020820190506135c56000830184613048565b92915050565b60006060820190506135e06000830186613048565b6135ed6020830185613039565b81810360408301526135ff81846130a3565b9050949350505050565b600060808201905061361e6000830187613048565b61362b6020830186613048565b61363860408301856134f8565b818103606083015261364a81846130a3565b905095945050505050565b600060208201905061366a600083018461306e565b92915050565b6000602082019050613685600083018461307d565b92915050565b60006080820190506136a0600083018761307d565b6136ad60208301866134f8565b6136ba6040830185613048565b6136c7606083018461307d565b95945050505050565b60006080820190506136e5600083018761307d565b6136f26020830186613507565b6136ff604083018561307d565b61370c606083018461307d565b95945050505050565b6000602082019050818103600083015261372f81846130a3565b905092915050565b60006020820190508181036000830152613751818461310d565b905092915050565b60006020820190508181036000830152613772816131f6565b9050919050565b6000602082019050818103600083015261379281613219565b9050919050565b600060208201905081810360008301526137b28161323c565b9050919050565b600060208201905081810360008301526137d28161325f565b9050919050565b600060208201905081810360008301526137f281613282565b9050919050565b60006020820190508181036000830152613812816132c8565b9050919050565b60006020820190508181036000830152613832816132eb565b9050919050565b600060208201905081810360008301526138528161330e565b9050919050565b6000602082019050818103600083015261387281613331565b9050919050565b6000602082019050818103600083015261389281613354565b9050919050565b600060208201905081810360008301526138b281613377565b9050919050565b600060208201905081810360008301526138d28161339a565b9050919050565b600060208201905081810360008301526138f2816133bd565b9050919050565b60006020820190508181036000830152613912816133e0565b9050919050565b6000602082019050818103600083015261393281613403565b9050919050565b6000602082019050818103600083015261395281613426565b9050919050565b6000602082019050818103600083015261397281613449565b9050919050565b600060208201905081810360008301526139928161346c565b9050919050565b600060208201905081810360008301526139b28161348f565b9050919050565b600060208201905081810360008301526139d2816134b2565b9050919050565b600060208201905081810360008301526139f2816134d5565b9050919050565b6000602082019050613a0e60008301846134f8565b92915050565b6000613a1e613a2f565b9050613a2a8282613d24565b919050565b6000604051905090565b600067ffffffffffffffff821115613a5457613a53613ee8565b5b613a5d82613f2b565b9050602081019050919050565b600067ffffffffffffffff821115613a8557613a84613ee8565b5b613a8e82613f2b565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613b0982613c99565b9150613b1483613c99565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613b4957613b48613dfd565b5b828201905092915050565b6000613b5f82613c99565b9150613b6a83613c99565b925082613b7a57613b79613e2c565b5b828204905092915050565b6000613b9082613c99565b9150613b9b83613c99565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613bd457613bd3613dfd565b5b828202905092915050565b6000613bea82613c99565b9150613bf583613c99565b925082821015613c0857613c07613dfd565b5b828203905092915050565b6000613c1e82613c79565b9050919050565b6000613c3082613c79565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613cdd578082015181840152602081019050613cc2565b83811115613cec576000848401525b50505050565b60006002820490506001821680613d0a57607f821691505b60208210811415613d1e57613d1d613e5b565b5b50919050565b613d2d82613f2b565b810181811067ffffffffffffffff82111715613d4c57613d4b613ee8565b5b80604052505050565b6000613d6082613c99565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d9357613d92613dfd565b5b600182019050919050565b6000613da982613dba565b9050919050565b6000819050919050565b6000613dc582613f3c565b9050919050565b6000613dd782613c99565b9150613de283613c99565b925082613df257613df1613e2c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f46756e6374696f6e2063616c6c206e6f74207375636365737366756c00000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360008201527f49474e4552000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f5369676e657220616e64207369676e617475726520646f206e6f74206d61746360008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f49742773206e6f742074696d6520796574000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b61451281613c13565b811461451d57600080fd5b50565b61452981613c37565b811461453457600080fd5b50565b61454081613c43565b811461454b57600080fd5b50565b61455781613c4d565b811461456257600080fd5b50565b61456e81613c99565b811461457957600080fd5b50565b61458581613ca3565b811461459057600080fd5b5056fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a2646970667358221220c44a01bb0c0874215a321c5eff9f805e07b1026d32882d7044947f816461a56164736f6c63430008070033454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e74726163742c627974657333322073616c7429000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000184e4654424f593a20426f7265642041706520526163657273000000000000000000000000000000000000000000000000000000000000000000000000000000034241520000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a68747470733a2f2f6170692e706c61796e6674626f792e636f6d2f636172747269646765732f6261722f00000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101cd5760003560e01c80636352211e116100f7578063a0bcfc7f11610095578063d547cfb711610064578063d547cfb71461068f578063d96a094a146106ba578063e985e9c5146106d6578063f2fde38b14610713576101cd565b8063a0bcfc7f146105d7578063a22cb46514610600578063b88d4fde14610629578063c87b56dd14610652576101cd565b8063755edd17116100d1578063755edd171461052d57806378e97925146105565780638da5cb5b1461058157806395d89b41146105ac576101cd565b80636352211e1461049c57806370a08231146104d9578063715018a614610516576101cd565b806320379ee51161016f5780633408e4701161013e5780633408e470146103f45780633ccfd60b1461041f57806342842e0e146104365780634f6ccce71461045f576101cd565b806320379ee51461032657806323b872dd146103515780632d0335ab1461037a5780632f745c59146103b7576101cd565b8063095ea7b3116101ab578063095ea7b3146102775780630c53c51c146102a05780630f7e5970146102d057806318160ddd146102fb576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612f69565b61073c565b6040516102069190613655565b60405180910390f35b34801561021b57600080fd5b506102246107b6565b6040516102319190613737565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c919061300c565b610848565b60405161026e91906135b0565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190612f29565b6108cd565b005b6102ba60048036038101906102b59190612e92565b6109e5565b6040516102c79190613715565b60405180910390f35b3480156102dc57600080fd5b506102e5610c57565b6040516102f29190613737565b60405180910390f35b34801561030757600080fd5b50610310610c90565b60405161031d91906139f9565b60405180910390f35b34801561033257600080fd5b5061033b610c9d565b6040516103489190613670565b60405180910390f35b34801561035d57600080fd5b5061037860048036038101906103739190612d7c565b610ca7565b005b34801561038657600080fd5b506103a1600480360381019061039c9190612d0f565b610d07565b6040516103ae91906139f9565b60405180910390f35b3480156103c357600080fd5b506103de60048036038101906103d99190612f29565b610d50565b6040516103eb91906139f9565b60405180910390f35b34801561040057600080fd5b50610409610df5565b60405161041691906139f9565b60405180910390f35b34801561042b57600080fd5b50610434610e02565b005b34801561044257600080fd5b5061045d60048036038101906104589190612d7c565b610ece565b005b34801561046b57600080fd5b506104866004803603810190610481919061300c565b610eee565b60405161049391906139f9565b60405180910390f35b3480156104a857600080fd5b506104c360048036038101906104be919061300c565b610f5f565b6040516104d091906135b0565b60405180910390f35b3480156104e557600080fd5b5061050060048036038101906104fb9190612d0f565b611011565b60405161050d91906139f9565b60405180910390f35b34801561052257600080fd5b5061052b6110c9565b005b34801561053957600080fd5b50610554600480360381019061054f9190612d0f565b611151565b005b34801561056257600080fd5b5061056b6111ef565b60405161057891906139f9565b60405180910390f35b34801561058d57600080fd5b506105966111f5565b6040516105a391906135b0565b60405180910390f35b3480156105b857600080fd5b506105c161121f565b6040516105ce9190613737565b60405180910390f35b3480156105e357600080fd5b506105fe60048036038101906105f99190612fc3565b6112b1565b005b34801561060c57600080fd5b5061062760048036038101906106229190612e52565b611347565b005b34801561063557600080fd5b50610650600480360381019061064b9190612dcf565b6114c8565b005b34801561065e57600080fd5b506106796004803603810190610674919061300c565b61152a565b6040516106869190613737565b60405180910390f35b34801561069b57600080fd5b506106a461155e565b6040516106b19190613737565b60405180910390f35b6106d460048036038101906106cf919061300c565b6115ec565b005b3480156106e257600080fd5b506106fd60048036038101906106f89190612d3c565b6116e1565b60405161070a9190613655565b60405180910390f35b34801561071f57600080fd5b5061073a60048036038101906107359190612d0f565b611775565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107af57506107ae8261191e565b5b9050919050565b6060600080546107c590613cf2565b80601f01602080910402602001604051908101604052809291908181526020018280546107f190613cf2565b801561083e5780601f106108135761010080835404028352916020019161083e565b820191906000526020600020905b81548152906001019060200180831161082157829003601f168201915b5050505050905090565b600061085382611a00565b610892576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610889906138f9565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108d882610f5f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610949576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094090613979565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610968611a6c565b73ffffffffffffffffffffffffffffffffffffffff161480610997575061099681610991611a6c565b6116e1565b5b6109d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cd90613879565b60405180910390fd5b6109e08383611a7b565b505050565b606060006040518060600160405280600c60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481526020018873ffffffffffffffffffffffffffffffffffffffff168152602001878152509050610a688782878787611b34565b610aa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9e90613959565b60405180910390fd5b610afa6001600c60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c3d90919063ffffffff16565b600c60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b873388604051610b70939291906135cb565b60405180910390a16000803073ffffffffffffffffffffffffffffffffffffffff16888a604051602001610ba592919061352d565b604051602081830303815290604052604051610bc19190613516565b6000604051808303816000865af19150503d8060008114610bfe576040519150601f19603f3d011682016040523d82523d6000602084013e610c03565b606091505b509150915081610c48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3f906137b9565b60405180910390fd5b80935050505095945050505050565b6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b6000600880549050905090565b6000600b54905090565b610cb8610cb2611a6c565b82611c53565b610cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cee90613999565b60405180910390fd5b610d02838383611d31565b505050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000610d5b83611011565b8210610d9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9390613759565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000804690508091505090565b610e0a611a6c565b73ffffffffffffffffffffffffffffffffffffffff16610e286111f5565b73ffffffffffffffffffffffffffffffffffffffff1614610e7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7590613919565b60405180910390fd5b610e866111f5565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610ecb573d6000803e3d6000fd5b50565b610ee9838383604051806020016040528060008152506114c8565b505050565b6000610ef8610c90565b8210610f39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f30906139d9565b60405180910390fd5b60088281548110610f4d57610f4c613eb9565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611008576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fff906138b9565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611082576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107990613899565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110d1611a6c565b73ffffffffffffffffffffffffffffffffffffffff166110ef6111f5565b73ffffffffffffffffffffffffffffffffffffffff1614611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c90613919565b60405180910390fd5b61114f6000611f8d565b565b611159611a6c565b73ffffffffffffffffffffffffffffffffffffffff166111776111f5565b73ffffffffffffffffffffffffffffffffffffffff16146111cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c490613919565b60405180910390fd5b60006111d7612053565b90506111e38282612070565b6111eb61223e565b5050565b60115481565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461122e90613cf2565b80601f016020809104026020016040519081016040528092919081815260200182805461125a90613cf2565b80156112a75780601f1061127c576101008083540402835291602001916112a7565b820191906000526020600020905b81548152906001019060200180831161128a57829003601f168201915b5050505050905090565b6112b9611a6c565b73ffffffffffffffffffffffffffffffffffffffff166112d76111f5565b73ffffffffffffffffffffffffffffffffffffffff161461132d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132490613919565b60405180910390fd5b8060109080519060200190611343929190612af9565b5050565b61134f611a6c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b490613819565b60405180910390fd5b80600560006113ca611a6c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611477611a6c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114bc9190613655565b60405180910390a35050565b6114d96114d3611a6c565b83611c53565b611518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150f90613999565b60405180910390fd5b61152484848484612268565b50505050565b60606010611537836122c4565b604051602001611548929190613555565b6040516020818303038152906040529050919050565b6010805461156b90613cf2565b80601f016020809104026020016040519081016040528092919081815260200182805461159790613cf2565b80156115e45780601f106115b9576101008083540402835291602001916115e4565b820191906000526020600020905b8154815290600101906020018083116115c757829003601f168201915b505050505081565b601154421015611631576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611628906139b9565b60405180910390fd5b600081118015611642575060148111155b61164b57600080fd5b668e1bc9bf0400008161165e9190613b85565b341461166957600080fd5b60005b818110156116dd57600061167e612053565b905061168a3382612070565b7f5782b4799a39cbe194d6ee862b9cfe3d8e4f9e741e3f122be89e778aba8b9fff816040516116b991906139f9565b60405180910390a16116c961223e565b5080806116d590613d55565b91505061166c565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61177d611a6c565b73ffffffffffffffffffffffffffffffffffffffff1661179b6111f5565b73ffffffffffffffffffffffffffffffffffffffff16146117f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e890613919565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611861576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185890613799565b60405180910390fd5b61186a81611f8d565b50565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561191757600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff81830151169250505061191b565b3390505b90565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806119e957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806119f957506119f882612425565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6000611a7661186d565b905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611aee83610f5f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415611ba5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9c90613859565b60405180910390fd5b6001611bb8611bb38761248f565b6124f7565b83868660405160008152602001604052604051611bd894939291906136d0565b6020604051602081039080840390855afa158015611bfa573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b60008183611c4b9190613afe565b905092915050565b6000611c5e82611a00565b611c9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9490613839565b60405180910390fd5b6000611ca883610f5f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d1757508373ffffffffffffffffffffffffffffffffffffffff16611cff84610848565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d285750611d2781856116e1565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d5182610f5f565b73ffffffffffffffffffffffffffffffffffffffff1614611da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9e90613939565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0e906137f9565b60405180910390fd5b611e22838383612530565b611e2d600082611a7b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e7d9190613bdf565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ed49190613afe565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061206b6001600e54611c3d90919063ffffffff16565b905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d7906138d9565b60405180910390fd5b6120e981611a00565b15612129576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612120906137d9565b60405180910390fd5b61213560008383612530565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121859190613afe565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600f54600e541061224e57600080fd5b600e600081548092919061226190613d55565b9190505550565b612273848484611d31565b61227f84848484612644565b6122be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b590613779565b60405180910390fd5b50505050565b6060600082141561230c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612420565b600082905060005b6000821461233e57808061232790613d55565b915050600a826123379190613b54565b9150612314565b60008167ffffffffffffffff81111561235a57612359613ee8565b5b6040519080825280601f01601f19166020018201604052801561238c5781602001600182028036833780820191505090505b5090505b60008514612419576001826123a59190613bdf565b9150600a856123b49190613dcc565b60306123c09190613afe565b60f81b8183815181106123d6576123d5613eb9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124129190613b54565b9450612390565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60006040518060800160405280604381526020016145946043913980519060200120826000015183602001518460400151805190602001206040516020016124da949392919061368b565b604051602081830303815290604052805190602001209050919050565b6000612501610c9d565b82604051602001612513929190613579565b604051602081830303815290604052805190602001209050919050565b61253b8383836127db565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561257e57612579816127e0565b6125bd565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146125bc576125bb8382612829565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612600576125fb81612996565b61263f565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461263e5761263d8282612a67565b5b5b505050565b60006126658473ffffffffffffffffffffffffffffffffffffffff16612ae6565b156127ce578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261268e611a6c565b8786866040518563ffffffff1660e01b81526004016126b09493929190613609565b602060405180830381600087803b1580156126ca57600080fd5b505af19250505080156126fb57506040513d601f19601f820116820180604052508101906126f89190612f96565b60015b61277e573d806000811461272b576040519150601f19603f3d011682016040523d82523d6000602084013e612730565b606091505b50600081511415612776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276d90613779565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127d3565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161283684611011565b6128409190613bdf565b9050600060076000848152602001908152602001600020549050818114612925576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506129aa9190613bdf565b90506000600960008481526020019081526020016000205490506000600883815481106129da576129d9613eb9565b5b9060005260206000200154905080600883815481106129fc576129fb613eb9565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612a4b57612a4a613e8a565b5b6001900381819060005260206000200160009055905550505050565b6000612a7283611011565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054612b0590613cf2565b90600052602060002090601f016020900481019282612b275760008555612b6e565b82601f10612b4057805160ff1916838001178555612b6e565b82800160010185558215612b6e579182015b82811115612b6d578251825591602001919060010190612b52565b5b509050612b7b9190612b7f565b5090565b5b80821115612b98576000816000905550600101612b80565b5090565b6000612baf612baa84613a39565b613a14565b905082815260208101848484011115612bcb57612bca613f1c565b5b612bd6848285613cb0565b509392505050565b6000612bf1612bec84613a6a565b613a14565b905082815260208101848484011115612c0d57612c0c613f1c565b5b612c18848285613cb0565b509392505050565b600081359050612c2f81614509565b92915050565b600081359050612c4481614520565b92915050565b600081359050612c5981614537565b92915050565b600081359050612c6e8161454e565b92915050565b600081519050612c838161454e565b92915050565b600082601f830112612c9e57612c9d613f17565b5b8135612cae848260208601612b9c565b91505092915050565b600082601f830112612ccc57612ccb613f17565b5b8135612cdc848260208601612bde565b91505092915050565b600081359050612cf481614565565b92915050565b600081359050612d098161457c565b92915050565b600060208284031215612d2557612d24613f26565b5b6000612d3384828501612c20565b91505092915050565b60008060408385031215612d5357612d52613f26565b5b6000612d6185828601612c20565b9250506020612d7285828601612c20565b9150509250929050565b600080600060608486031215612d9557612d94613f26565b5b6000612da386828701612c20565b9350506020612db486828701612c20565b9250506040612dc586828701612ce5565b9150509250925092565b60008060008060808587031215612de957612de8613f26565b5b6000612df787828801612c20565b9450506020612e0887828801612c20565b9350506040612e1987828801612ce5565b925050606085013567ffffffffffffffff811115612e3a57612e39613f21565b5b612e4687828801612c89565b91505092959194509250565b60008060408385031215612e6957612e68613f26565b5b6000612e7785828601612c20565b9250506020612e8885828601612c35565b9150509250929050565b600080600080600060a08688031215612eae57612ead613f26565b5b6000612ebc88828901612c20565b955050602086013567ffffffffffffffff811115612edd57612edc613f21565b5b612ee988828901612c89565b9450506040612efa88828901612c4a565b9350506060612f0b88828901612c4a565b9250506080612f1c88828901612cfa565b9150509295509295909350565b60008060408385031215612f4057612f3f613f26565b5b6000612f4e85828601612c20565b9250506020612f5f85828601612ce5565b9150509250929050565b600060208284031215612f7f57612f7e613f26565b5b6000612f8d84828501612c5f565b91505092915050565b600060208284031215612fac57612fab613f26565b5b6000612fba84828501612c74565b91505092915050565b600060208284031215612fd957612fd8613f26565b5b600082013567ffffffffffffffff811115612ff757612ff6613f21565b5b61300384828501612cb7565b91505092915050565b60006020828403121561302257613021613f26565b5b600061303084828501612ce5565b91505092915050565b61304281613c25565b82525050565b61305181613c13565b82525050565b61306861306382613c13565b613d9e565b82525050565b61307781613c37565b82525050565b61308681613c43565b82525050565b61309d61309882613c43565b613db0565b82525050565b60006130ae82613ab0565b6130b88185613ac6565b93506130c8818560208601613cbf565b6130d181613f2b565b840191505092915050565b60006130e782613ab0565b6130f18185613ad7565b9350613101818560208601613cbf565b80840191505092915050565b600061311882613abb565b6131228185613ae2565b9350613132818560208601613cbf565b61313b81613f2b565b840191505092915050565b600061315182613abb565b61315b8185613af3565b935061316b818560208601613cbf565b80840191505092915050565b6000815461318481613cf2565b61318e8186613af3565b945060018216600081146131a957600181146131ba576131ed565b60ff198316865281860193506131ed565b6131c385613a9b565b60005b838110156131e5578154818901526001820191506020810190506131c6565b838801955050505b50505092915050565b6000613203602b83613ae2565b915061320e82613f49565b604082019050919050565b6000613226603283613ae2565b915061323182613f98565b604082019050919050565b6000613249602683613ae2565b915061325482613fe7565b604082019050919050565b600061326c601c83613ae2565b915061327782614036565b602082019050919050565b600061328f601c83613ae2565b915061329a8261405f565b602082019050919050565b60006132b2600283613af3565b91506132bd82614088565b600282019050919050565b60006132d5602483613ae2565b91506132e0826140b1565b604082019050919050565b60006132f8601983613ae2565b915061330382614100565b602082019050919050565b600061331b602c83613ae2565b915061332682614129565b604082019050919050565b600061333e602583613ae2565b915061334982614178565b604082019050919050565b6000613361603883613ae2565b915061336c826141c7565b604082019050919050565b6000613384602a83613ae2565b915061338f82614216565b604082019050919050565b60006133a7602983613ae2565b91506133b282614265565b604082019050919050565b60006133ca602083613ae2565b91506133d5826142b4565b602082019050919050565b60006133ed602c83613ae2565b91506133f8826142dd565b604082019050919050565b6000613410602083613ae2565b915061341b8261432c565b602082019050919050565b6000613433602983613ae2565b915061343e82614355565b604082019050919050565b6000613456602183613ae2565b9150613461826143a4565b604082019050919050565b6000613479602183613ae2565b9150613484826143f3565b604082019050919050565b600061349c603183613ae2565b91506134a782614442565b604082019050919050565b60006134bf601183613ae2565b91506134ca82614491565b602082019050919050565b60006134e2602c83613ae2565b91506134ed826144ba565b604082019050919050565b61350181613c99565b82525050565b61351081613ca3565b82525050565b600061352282846130dc565b915081905092915050565b600061353982856130dc565b91506135458284613057565b6014820191508190509392505050565b60006135618285613177565b915061356d8284613146565b91508190509392505050565b6000613584826132a5565b9150613590828561308c565b6020820191506135a0828461308c565b6020820191508190509392505050565b60006020820190506135c56000830184613048565b92915050565b60006060820190506135e06000830186613048565b6135ed6020830185613039565b81810360408301526135ff81846130a3565b9050949350505050565b600060808201905061361e6000830187613048565b61362b6020830186613048565b61363860408301856134f8565b818103606083015261364a81846130a3565b905095945050505050565b600060208201905061366a600083018461306e565b92915050565b6000602082019050613685600083018461307d565b92915050565b60006080820190506136a0600083018761307d565b6136ad60208301866134f8565b6136ba6040830185613048565b6136c7606083018461307d565b95945050505050565b60006080820190506136e5600083018761307d565b6136f26020830186613507565b6136ff604083018561307d565b61370c606083018461307d565b95945050505050565b6000602082019050818103600083015261372f81846130a3565b905092915050565b60006020820190508181036000830152613751818461310d565b905092915050565b60006020820190508181036000830152613772816131f6565b9050919050565b6000602082019050818103600083015261379281613219565b9050919050565b600060208201905081810360008301526137b28161323c565b9050919050565b600060208201905081810360008301526137d28161325f565b9050919050565b600060208201905081810360008301526137f281613282565b9050919050565b60006020820190508181036000830152613812816132c8565b9050919050565b60006020820190508181036000830152613832816132eb565b9050919050565b600060208201905081810360008301526138528161330e565b9050919050565b6000602082019050818103600083015261387281613331565b9050919050565b6000602082019050818103600083015261389281613354565b9050919050565b600060208201905081810360008301526138b281613377565b9050919050565b600060208201905081810360008301526138d28161339a565b9050919050565b600060208201905081810360008301526138f2816133bd565b9050919050565b60006020820190508181036000830152613912816133e0565b9050919050565b6000602082019050818103600083015261393281613403565b9050919050565b6000602082019050818103600083015261395281613426565b9050919050565b6000602082019050818103600083015261397281613449565b9050919050565b600060208201905081810360008301526139928161346c565b9050919050565b600060208201905081810360008301526139b28161348f565b9050919050565b600060208201905081810360008301526139d2816134b2565b9050919050565b600060208201905081810360008301526139f2816134d5565b9050919050565b6000602082019050613a0e60008301846134f8565b92915050565b6000613a1e613a2f565b9050613a2a8282613d24565b919050565b6000604051905090565b600067ffffffffffffffff821115613a5457613a53613ee8565b5b613a5d82613f2b565b9050602081019050919050565b600067ffffffffffffffff821115613a8557613a84613ee8565b5b613a8e82613f2b565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613b0982613c99565b9150613b1483613c99565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613b4957613b48613dfd565b5b828201905092915050565b6000613b5f82613c99565b9150613b6a83613c99565b925082613b7a57613b79613e2c565b5b828204905092915050565b6000613b9082613c99565b9150613b9b83613c99565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613bd457613bd3613dfd565b5b828202905092915050565b6000613bea82613c99565b9150613bf583613c99565b925082821015613c0857613c07613dfd565b5b828203905092915050565b6000613c1e82613c79565b9050919050565b6000613c3082613c79565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613cdd578082015181840152602081019050613cc2565b83811115613cec576000848401525b50505050565b60006002820490506001821680613d0a57607f821691505b60208210811415613d1e57613d1d613e5b565b5b50919050565b613d2d82613f2b565b810181811067ffffffffffffffff82111715613d4c57613d4b613ee8565b5b80604052505050565b6000613d6082613c99565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d9357613d92613dfd565b5b600182019050919050565b6000613da982613dba565b9050919050565b6000819050919050565b6000613dc582613f3c565b9050919050565b6000613dd782613c99565b9150613de283613c99565b925082613df257613df1613e2c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f46756e6374696f6e2063616c6c206e6f74207375636365737366756c00000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360008201527f49474e4552000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f5369676e657220616e64207369676e617475726520646f206e6f74206d61746360008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f49742773206e6f742074696d6520796574000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b61451281613c13565b811461451d57600080fd5b50565b61452981613c37565b811461453457600080fd5b50565b61454081613c43565b811461454b57600080fd5b50565b61455781613c4d565b811461456257600080fd5b50565b61456e81613c99565b811461457957600080fd5b50565b61458581613ca3565b811461459057600080fd5b5056fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a2646970667358221220c44a01bb0c0874215a321c5eff9f805e07b1026d32882d7044947f816461a56164736f6c63430008070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000184e4654424f593a20426f7265642041706520526163657273000000000000000000000000000000000000000000000000000000000000000000000000000000034241520000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a68747470733a2f2f6170692e706c61796e6674626f792e636f6d2f636172747269646765732f6261722f00000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): NFTBOY: Bored Ape Racers
Arg [1] : _symbol (string): BAR
Arg [2] : _uri (string): https://api.playnftboy.com/cartridges/bar/

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000018
Arg [4] : 4e4654424f593a20426f72656420417065205261636572730000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [6] : 4241520000000000000000000000000000000000000000000000000000000000
Arg [7] : 000000000000000000000000000000000000000000000000000000000000002a
Arg [8] : 68747470733a2f2f6170692e706c61796e6674626f792e636f6d2f6361727472
Arg [9] : 69646765732f6261722f00000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

269:2267:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;937:300:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2650:100:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4343:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3866:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;999:1151:15;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;302:43:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1740:113:7;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1297:101:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5402:376:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2576:107:15;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1321:343:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1406:161:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1494:106:1;;;;;;;;;;;;;:::i;:::-;;5849:185:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1930:320:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2257:326:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1900:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1675:94:16;;;;;;;;;;;;;:::i;:::-;;838:166:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;531:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1024:87:16;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2819:104:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2073:97:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4723:327:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6105:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2178:227:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;498:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1012:474;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5121:214:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1924:229:16;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;937:300:7;1084:4;1141:35;1126:50;;;:11;:50;;;;:103;;;;1193:36;1217:11;1193:23;:36::i;:::-;1126:103;1106:123;;937:300;;;:::o;2650:100:6:-;2704:13;2737:5;2730:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2650:100;:::o;4343:308::-;4464:7;4511:16;4519:7;4511;:16::i;:::-;4489:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;4619:15;:24;4635:7;4619:24;;;;;;;;;;;;;;;;;;;;;4612:31;;4343:308;;;:::o;3866:411::-;3947:13;3963:23;3978:7;3963:14;:23::i;:::-;3947:39;;4011:5;4005:11;;:2;:11;;;;3997:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;4105:5;4089:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;4114:37;4131:5;4138:12;:10;:12::i;:::-;4114:16;:37::i;:::-;4089:62;4067:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;4248:21;4257:2;4261:7;4248:8;:21::i;:::-;3936:341;3866:411;;:::o;999:1151:15:-;1200:12;1225:29;1257:152;;;;;;;;1295:6;:19;1302:11;1295:19;;;;;;;;;;;;;;;;1257:152;;;;1335:11;1257:152;;;;;;1380:17;1257:152;;;1225:184;;1444:45;1451:11;1464:6;1472:4;1478;1484;1444:6;:45::i;:::-;1422:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;1639:26;1663:1;1639:6;:19;1646:11;1639:19;;;;;;;;;;;;;;;;:23;;:26;;;;:::i;:::-;1617:6;:19;1624:11;1617:19;;;;;;;;;;;;;;;:48;;;;1683:126;1721:11;1755:10;1781:17;1683:126;;;;;;;;:::i;:::-;;;;;;;;1920:12;1934:23;1969:4;1961:18;;2011:17;2030:11;1994:48;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1961:92;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1919:134;;;;2072:7;2064:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;2132:10;2125:17;;;;;999:1151;;;;;;;:::o;302:43:4:-;;;;;;;;;;;;;;;;;;;:::o;1740:113:7:-;1801:7;1828:10;:17;;;;1821:24;;1740:113;:::o;1297:101:4:-;1348:7;1375:15;;1368:22;;1297:101;:::o;5402:376:6:-;5611:41;5630:12;:10;:12::i;:::-;5644:7;5611:18;:41::i;:::-;5589:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;5742:28;5752:4;5758:2;5762:7;5742:9;:28::i;:::-;5402:376;;;:::o;2576:107:15:-;2629:13;2663:6;:12;2670:4;2663:12;;;;;;;;;;;;;;;;2655:20;;2576:107;;;:::o;1321:343:7:-;1463:7;1518:23;1535:5;1518:16;:23::i;:::-;1510:5;:31;1488:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;1630:12;:19;1643:5;1630:19;;;;;;;;;;;;;;;:26;1650:5;1630:26;;;;;;;;;;;;1623:33;;1321:343;;;;:::o;1406:161:4:-;1449:7;1469:10;1520:9;1514:15;;1557:2;1550:9;;;1406:161;:::o;1494:106:1:-;1255:12:16;:10;:12::i;:::-;1244:23;;:7;:5;:7::i;:::-;:23;;;1236:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1552:7:1::1;:5;:7::i;:::-;1544:25;;:48;1570:21;1544:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;1494:106::o:0;5849:185:6:-;5987:39;6004:4;6010:2;6014:7;5987:39;;;;;;;;;;;;:16;:39::i;:::-;5849:185;;;:::o;1930:320:7:-;2050:7;2105:30;:28;:30::i;:::-;2097:5;:38;2075:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;2225:10;2236:5;2225:17;;;;;;;;:::i;:::-;;;;;;;;;;2218:24;;1930:320;;;:::o;2257:326:6:-;2374:7;2399:13;2415:7;:16;2423:7;2415:16;;;;;;;;;;;;;;;;;;;;;2399:32;;2481:1;2464:19;;:5;:19;;;;2442:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;2570:5;2563:12;;;2257:326;;;:::o;1900:295::-;2017:7;2081:1;2064:19;;:5;:19;;;;2042:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;2171:9;:16;2181:5;2171:16;;;;;;;;;;;;;;;;2164:23;;1900:295;;;:::o;1675:94:16:-;1255:12;:10;:12::i;:::-;1244:23;;:7;:5;:7::i;:::-;:23;;;1236:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1740:21:::1;1758:1;1740:9;:21::i;:::-;1675:94::o:0;838:166:1:-;1255:12:16;:10;:12::i;:::-;1244:23;;:7;:5;:7::i;:::-;:23;;;1236:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;895:18:1::1;916:17;:15;:17::i;:::-;895:38;;944:22;950:3;955:10;944:5;:22::i;:::-;977:19;:17;:19::i;:::-;884:120;838:166:::0;:::o;531:37::-;;;;:::o;1024:87:16:-;1070:7;1097:6;;;;;;;;;;;1090:13;;1024:87;:::o;2819:104:6:-;2875:13;2908:7;2901:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2819:104;:::o;2073:97:1:-;1255:12:16;:10;:12::i;:::-;1244:23;;:7;:5;:7::i;:::-;:23;;;1236:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2158:4:1::1;2143:12;:19;;;;;;;;;;;;:::i;:::-;;2073:97:::0;:::o;4723:327:6:-;4870:12;:10;:12::i;:::-;4858:24;;:8;:24;;;;4850:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4970:8;4925:18;:32;4944:12;:10;:12::i;:::-;4925:32;;;;;;;;;;;;;;;:42;4958:8;4925:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;5023:8;4994:48;;5009:12;:10;:12::i;:::-;4994:48;;;5033:8;4994:48;;;;;;:::i;:::-;;;;;;;;4723:327;;:::o;6105:365::-;6294:41;6313:12;:10;:12::i;:::-;6327:7;6294:18;:41::i;:::-;6272:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;6423:39;6437:4;6443:2;6447:7;6456:5;6423:13;:39::i;:::-;6105:365;;;;:::o;2178:227:1:-;2280:13;2355:12;2369:26;2386:8;2369:16;:26::i;:::-;2338:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2311:86;;2178:227;;;:::o;498:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1012:474::-;1092:9;;1073:15;:28;;1065:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;1149:1;1142:4;:8;:22;;;;;1162:2;1154:4;:10;;1142:22;1134:31;;;;;;1204:4;1197;:11;;;;:::i;:::-;1184:9;:24;1176:33;;;;;;1235:9;1230:249;1254:4;1250:1;:8;1230:249;;;1280:18;1301:17;:15;:17::i;:::-;1280:38;;1347:29;1353:10;1365;1347:5;:29::i;:::-;1396:23;1408:10;1396:23;;;;;;:::i;:::-;;;;;;;;1448:19;:17;:19::i;:::-;1265:214;1260:3;;;;;:::i;:::-;;;;1230:249;;;;1012:474;:::o;5121:214:6:-;5263:4;5292:18;:25;5311:5;5292:25;;;;;;;;;;;;;;;:35;5318:8;5292:35;;;;;;;;;;;;;;;;;;;;;;;;;5285:42;;5121:214;;;;:::o;1924:229:16:-;1255:12;:10;:12::i;:::-;1244:23;;:7;:5;:7::i;:::-;:23;;;1236:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2047:1:::1;2027:22;;:8;:22;;;;2005:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;2126:19;2136:8;2126:9;:19::i;:::-;1924:229:::0;:::o;100:618:2:-;144:22;205:4;183:27;;:10;:27;;;179:508;;;227:18;248:8;;227:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;271:13;287:8;;:15;;271:31;;539:42;509:5;502;498:17;492:24;466:134;456:144;;326:289;;179:508;;;664:10;647:28;;179:508;100:618;:::o;1481:355:6:-;1628:4;1685:25;1670:40;;;:11;:40;;;;:105;;;;1742:33;1727:48;;;:11;:48;;;;1670:105;:158;;;;1792:36;1816:11;1792:23;:36::i;:::-;1670:158;1650:178;;1481:355;;;:::o;8017:127::-;8082:4;8134:1;8106:30;;:7;:16;8114:7;8106:16;;;;;;;;;;;;;;;;;;;;;:30;;;;8099:37;;8017:127;;;:::o;2413:120:1:-;2467:14;2501:24;:22;:24::i;:::-;2494:31;;2413:120;:::o;12140:174:6:-;12242:2;12215:15;:24;12231:7;12215:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;12298:7;12294:2;12260:46;;12269:23;12284:7;12269:14;:23::i;:::-;12260:46;;;;;;;;;;;;12140:174;;:::o;2691:486:15:-;2869:4;2912:1;2894:20;;:6;:20;;;;2886:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;3010:159;3038:47;3057:27;3077:6;3057:19;:27::i;:::-;3038:18;:47::i;:::-;3104:4;3127;3150;3010:159;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2987:182;;:6;:182;;;2967:202;;2691:486;;;;;;;:::o;2763:98:17:-;2821:7;2852:1;2848;:5;;;;:::i;:::-;2841:12;;2763:98;;;;:::o;8311:452:6:-;8440:4;8484:16;8492:7;8484;:16::i;:::-;8462:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;8583:13;8599:23;8614:7;8599:14;:23::i;:::-;8583:39;;8652:5;8641:16;;:7;:16;;;:64;;;;8698:7;8674:31;;:20;8686:7;8674:11;:20::i;:::-;:31;;;8641:64;:113;;;;8722:32;8739:5;8746:7;8722:16;:32::i;:::-;8641:113;8633:122;;;8311:452;;;;:::o;11407:615::-;11580:4;11553:31;;:23;11568:7;11553:14;:23::i;:::-;:31;;;11531:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;11686:1;11672:16;;:2;:16;;;;11664:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;11742:39;11763:4;11769:2;11773:7;11742:20;:39::i;:::-;11846:29;11863:1;11867:7;11846:8;:29::i;:::-;11907:1;11888:9;:15;11898:4;11888:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;11936:1;11919:9;:13;11929:2;11919:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;11967:2;11948:7;:16;11956:7;11948:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;12006:7;12002:2;11987:27;;11996:4;11987:27;;;;;;;;;;;;11407:615;;;:::o;2161:173:16:-;2217:16;2236:6;;;;;;;;;;;2217:25;;2262:8;2253:6;;:17;;;;;;;;;;;;;;;;;;2317:8;2286:40;;2307:8;2286:40;;;;;;;;;;;;2206:128;2161:173;:::o;1608:106:1:-;1657:7;1684:22;1704:1;1684:15;;:19;;:22;;;;:::i;:::-;1677:29;;1608:106;:::o;10099:382:6:-;10193:1;10179:16;;:2;:16;;;;10171:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;10252:16;10260:7;10252;:16::i;:::-;10251:17;10243:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;10314:45;10343:1;10347:2;10351:7;10314:20;:45::i;:::-;10389:1;10372:9;:13;10382:2;10372:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10420:2;10401:7;:16;10409:7;10401:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10465:7;10461:2;10440:33;;10457:1;10440:33;;;;;;;;;;;;10099:382;;:::o;1944:121:1:-;2018:10;;2000:15;;:28;1992:37;;;;;;2040:15;;:17;;;;;;;;;:::i;:::-;;;;;;1944:121::o;7352:352:6:-;7509:28;7519:4;7525:2;7529:7;7509:9;:28::i;:::-;7570:48;7593:4;7599:2;7603:7;7612:5;7570:22;:48::i;:::-;7548:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;7352:352;;;;:::o;288:723:18:-;344:13;574:1;565:5;:10;561:53;;;592:10;;;;;;;;;;;;;;;;;;;;;561:53;624:12;639:5;624:20;;655:14;680:78;695:1;687:4;:9;680:78;;713:8;;;;;:::i;:::-;;;;744:2;736:10;;;;;:::i;:::-;;;680:78;;;768:19;800:6;790:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;768:39;;818:154;834:1;825:5;:10;818:154;;862:1;852:11;;;;;:::i;:::-;;;929:2;921:5;:10;;;;:::i;:::-;908:2;:24;;;;:::i;:::-;895:39;;878:6;885;878:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;958:2;949:11;;;;;:::i;:::-;;;818:154;;;996:6;982:21;;;;;288:723;;;;:::o;787:207:5:-;917:4;961:25;946:40;;;:11;:40;;;;939:47;;787:207;;;:::o;2158:410:15:-;2268:7;323:108;;;;;;;;;;;;;;;;;299:143;;;;;;2422:6;:12;;;2457:6;:11;;;2501:6;:24;;;2491:35;;;;;;2341:204;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2313:247;;;;;;2293:267;;2158:410;;;:::o;1936:258:4:-;2035:7;2137:20;:18;:20::i;:::-;2159:11;2108:63;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2080:106;;;;;;2060:126;;1936:258;;;:::o;2863:589:7:-;3007:45;3034:4;3040:2;3044:7;3007:26;:45::i;:::-;3085:1;3069:18;;:4;:18;;;3065:187;;;3104:40;3136:7;3104:31;:40::i;:::-;3065:187;;;3174:2;3166:10;;:4;:10;;;3162:90;;3193:47;3226:4;3232:7;3193:32;:47::i;:::-;3162:90;3065:187;3280:1;3266:16;;:2;:16;;;3262:183;;;3299:45;3336:7;3299:36;:45::i;:::-;3262:183;;;3372:4;3366:10;;:2;:10;;;3362:83;;3393:40;3421:2;3425:7;3393:27;:40::i;:::-;3362:83;3262:183;2863:589;;;:::o;12879:980:6:-;13034:4;13055:15;:2;:13;;;:15::i;:::-;13051:801;;;13124:2;13108:36;;;13167:12;:10;:12::i;:::-;13202:4;13229:7;13259:5;13108:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;13087:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13483:1;13466:6;:13;:18;13462:320;;;13509:108;;;;;;;;;;:::i;:::-;;;;;;;;13462:320;13732:6;13726:13;13717:6;13713:2;13709:15;13702:38;13087:710;13357:41;;;13347:51;;;:6;:51;;;;13340:58;;;;;13051:801;13836:4;13829:11;;12879:980;;;;;;;:::o;14431:126::-;;;;:::o;4175:164:7:-;4279:10;:17;;;;4252:15;:24;4268:7;4252:24;;;;;;;;;;;:44;;;;4307:10;4323:7;4307:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4175:164;:::o;4966:1002::-;5246:22;5296:1;5271:22;5288:4;5271:16;:22::i;:::-;:26;;;;:::i;:::-;5246:51;;5308:18;5329:17;:26;5347:7;5329:26;;;;;;;;;;;;5308:47;;5476:14;5462:10;:28;5458:328;;5507:19;5529:12;:18;5542:4;5529:18;;;;;;;;;;;;;;;:34;5548:14;5529:34;;;;;;;;;;;;5507:56;;5613:11;5580:12;:18;5593:4;5580:18;;;;;;;;;;;;;;;:30;5599:10;5580:30;;;;;;;;;;;:44;;;;5730:10;5697:17;:30;5715:11;5697:30;;;;;;;;;;;:43;;;;5492:294;5458:328;5882:17;:26;5900:7;5882:26;;;;;;;;;;;5875:33;;;5926:12;:18;5939:4;5926:18;;;;;;;;;;;;;;;:34;5945:14;5926:34;;;;;;;;;;;5919:41;;;5061:907;;4966:1002;;:::o;6263:1079::-;6516:22;6561:1;6541:10;:17;;;;:21;;;;:::i;:::-;6516:46;;6573:18;6594:15;:24;6610:7;6594:24;;;;;;;;;;;;6573:45;;6945:19;6967:10;6978:14;6967:26;;;;;;;;:::i;:::-;;;;;;;;;;6945:48;;7031:11;7006:10;7017;7006:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;7142:10;7111:15;:28;7127:11;7111:28;;;;;;;;;;;:41;;;;7283:15;:24;7299:7;7283:24;;;;;;;;;;;7276:31;;;7318:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6334:1008;;;6263:1079;:::o;3753:221::-;3838:14;3855:20;3872:2;3855:16;:20::i;:::-;3838:37;;3913:7;3886:12;:16;3899:2;3886:16;;;;;;;;;;;;;;;:24;3903:6;3886:24;;;;;;;;;;;:34;;;;3960:6;3931:17;:26;3949:7;3931:26;;;;;;;;;;;:35;;;;3827:147;3753:221;;:::o;743:387:0:-;803:4;1011:12;1078:7;1066:20;1058:28;;1121:1;1114:4;:8;1107:15;;;743:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:19:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:139::-;1171:5;1209:6;1196:20;1187:29;;1225:33;1252:5;1225:33;:::i;:::-;1125:139;;;;:::o;1270:137::-;1315:5;1353:6;1340:20;1331:29;;1369:32;1395:5;1369:32;:::i;:::-;1270:137;;;;:::o;1413:141::-;1469:5;1500:6;1494:13;1485:22;;1516:32;1542:5;1516:32;:::i;:::-;1413:141;;;;:::o;1573:338::-;1628:5;1677:3;1670:4;1662:6;1658:17;1654:27;1644:122;;1685:79;;:::i;:::-;1644:122;1802:6;1789:20;1827:78;1901:3;1893:6;1886:4;1878:6;1874:17;1827:78;:::i;:::-;1818:87;;1634:277;1573:338;;;;:::o;1931:340::-;1987:5;2036:3;2029:4;2021:6;2017:17;2013:27;2003:122;;2044:79;;:::i;:::-;2003:122;2161:6;2148:20;2186:79;2261:3;2253:6;2246:4;2238:6;2234:17;2186:79;:::i;:::-;2177:88;;1993:278;1931:340;;;;:::o;2277:139::-;2323:5;2361:6;2348:20;2339:29;;2377:33;2404:5;2377:33;:::i;:::-;2277:139;;;;:::o;2422:135::-;2466:5;2504:6;2491:20;2482:29;;2520:31;2545:5;2520:31;:::i;:::-;2422:135;;;;:::o;2563:329::-;2622:6;2671:2;2659:9;2650:7;2646:23;2642:32;2639:119;;;2677:79;;:::i;:::-;2639:119;2797:1;2822:53;2867:7;2858:6;2847:9;2843:22;2822:53;:::i;:::-;2812:63;;2768:117;2563:329;;;;:::o;2898:474::-;2966:6;2974;3023:2;3011:9;3002:7;2998:23;2994:32;2991:119;;;3029:79;;:::i;:::-;2991:119;3149:1;3174:53;3219:7;3210:6;3199:9;3195:22;3174:53;:::i;:::-;3164:63;;3120:117;3276:2;3302:53;3347:7;3338:6;3327:9;3323:22;3302:53;:::i;:::-;3292:63;;3247:118;2898:474;;;;;:::o;3378:619::-;3455:6;3463;3471;3520:2;3508:9;3499:7;3495:23;3491:32;3488:119;;;3526:79;;:::i;:::-;3488:119;3646:1;3671:53;3716:7;3707:6;3696:9;3692:22;3671:53;:::i;:::-;3661:63;;3617:117;3773:2;3799:53;3844:7;3835:6;3824:9;3820:22;3799:53;:::i;:::-;3789:63;;3744:118;3901:2;3927:53;3972:7;3963:6;3952:9;3948:22;3927:53;:::i;:::-;3917:63;;3872:118;3378:619;;;;;:::o;4003:943::-;4098:6;4106;4114;4122;4171:3;4159:9;4150:7;4146:23;4142:33;4139:120;;;4178:79;;:::i;:::-;4139:120;4298:1;4323:53;4368:7;4359:6;4348:9;4344:22;4323:53;:::i;:::-;4313:63;;4269:117;4425:2;4451:53;4496:7;4487:6;4476:9;4472:22;4451:53;:::i;:::-;4441:63;;4396:118;4553:2;4579:53;4624:7;4615:6;4604:9;4600:22;4579:53;:::i;:::-;4569:63;;4524:118;4709:2;4698:9;4694:18;4681:32;4740:18;4732:6;4729:30;4726:117;;;4762:79;;:::i;:::-;4726:117;4867:62;4921:7;4912:6;4901:9;4897:22;4867:62;:::i;:::-;4857:72;;4652:287;4003:943;;;;;;;:::o;4952:468::-;5017:6;5025;5074:2;5062:9;5053:7;5049:23;5045:32;5042:119;;;5080:79;;:::i;:::-;5042:119;5200:1;5225:53;5270:7;5261:6;5250:9;5246:22;5225:53;:::i;:::-;5215:63;;5171:117;5327:2;5353:50;5395:7;5386:6;5375:9;5371:22;5353:50;:::i;:::-;5343:60;;5298:115;4952:468;;;;;:::o;5426:1085::-;5528:6;5536;5544;5552;5560;5609:3;5597:9;5588:7;5584:23;5580:33;5577:120;;;5616:79;;:::i;:::-;5577:120;5736:1;5761:53;5806:7;5797:6;5786:9;5782:22;5761:53;:::i;:::-;5751:63;;5707:117;5891:2;5880:9;5876:18;5863:32;5922:18;5914:6;5911:30;5908:117;;;5944:79;;:::i;:::-;5908:117;6049:62;6103:7;6094:6;6083:9;6079:22;6049:62;:::i;:::-;6039:72;;5834:287;6160:2;6186:53;6231:7;6222:6;6211:9;6207:22;6186:53;:::i;:::-;6176:63;;6131:118;6288:2;6314:53;6359:7;6350:6;6339:9;6335:22;6314:53;:::i;:::-;6304:63;;6259:118;6416:3;6443:51;6486:7;6477:6;6466:9;6462:22;6443:51;:::i;:::-;6433:61;;6387:117;5426:1085;;;;;;;;:::o;6517:474::-;6585:6;6593;6642:2;6630:9;6621:7;6617:23;6613:32;6610:119;;;6648:79;;:::i;:::-;6610:119;6768:1;6793:53;6838:7;6829:6;6818:9;6814:22;6793:53;:::i;:::-;6783:63;;6739:117;6895:2;6921:53;6966:7;6957:6;6946:9;6942:22;6921:53;:::i;:::-;6911:63;;6866:118;6517:474;;;;;:::o;6997:327::-;7055:6;7104:2;7092:9;7083:7;7079:23;7075:32;7072:119;;;7110:79;;:::i;:::-;7072:119;7230:1;7255:52;7299:7;7290:6;7279:9;7275:22;7255:52;:::i;:::-;7245:62;;7201:116;6997:327;;;;:::o;7330:349::-;7399:6;7448:2;7436:9;7427:7;7423:23;7419:32;7416:119;;;7454:79;;:::i;:::-;7416:119;7574:1;7599:63;7654:7;7645:6;7634:9;7630:22;7599:63;:::i;:::-;7589:73;;7545:127;7330:349;;;;:::o;7685:509::-;7754:6;7803:2;7791:9;7782:7;7778:23;7774:32;7771:119;;;7809:79;;:::i;:::-;7771:119;7957:1;7946:9;7942:17;7929:31;7987:18;7979:6;7976:30;7973:117;;;8009:79;;:::i;:::-;7973:117;8114:63;8169:7;8160:6;8149:9;8145:22;8114:63;:::i;:::-;8104:73;;7900:287;7685:509;;;;:::o;8200:329::-;8259:6;8308:2;8296:9;8287:7;8283:23;8279:32;8276:119;;;8314:79;;:::i;:::-;8276:119;8434:1;8459:53;8504:7;8495:6;8484:9;8480:22;8459:53;:::i;:::-;8449:63;;8405:117;8200:329;;;;:::o;8535:142::-;8638:32;8664:5;8638:32;:::i;:::-;8633:3;8626:45;8535:142;;:::o;8683:118::-;8770:24;8788:5;8770:24;:::i;:::-;8765:3;8758:37;8683:118;;:::o;8807:157::-;8912:45;8932:24;8950:5;8932:24;:::i;:::-;8912:45;:::i;:::-;8907:3;8900:58;8807:157;;:::o;8970:109::-;9051:21;9066:5;9051:21;:::i;:::-;9046:3;9039:34;8970:109;;:::o;9085:118::-;9172:24;9190:5;9172:24;:::i;:::-;9167:3;9160:37;9085:118;;:::o;9209:157::-;9314:45;9334:24;9352:5;9334:24;:::i;:::-;9314:45;:::i;:::-;9309:3;9302:58;9209:157;;:::o;9372:360::-;9458:3;9486:38;9518:5;9486:38;:::i;:::-;9540:70;9603:6;9598:3;9540:70;:::i;:::-;9533:77;;9619:52;9664:6;9659:3;9652:4;9645:5;9641:16;9619:52;:::i;:::-;9696:29;9718:6;9696:29;:::i;:::-;9691:3;9687:39;9680:46;;9462:270;9372:360;;;;:::o;9738:373::-;9842:3;9870:38;9902:5;9870:38;:::i;:::-;9924:88;10005:6;10000:3;9924:88;:::i;:::-;9917:95;;10021:52;10066:6;10061:3;10054:4;10047:5;10043:16;10021:52;:::i;:::-;10098:6;10093:3;10089:16;10082:23;;9846:265;9738:373;;;;:::o;10117:364::-;10205:3;10233:39;10266:5;10233:39;:::i;:::-;10288:71;10352:6;10347:3;10288:71;:::i;:::-;10281:78;;10368:52;10413:6;10408:3;10401:4;10394:5;10390:16;10368:52;:::i;:::-;10445:29;10467:6;10445:29;:::i;:::-;10440:3;10436:39;10429:46;;10209:272;10117:364;;;;:::o;10487:377::-;10593:3;10621:39;10654:5;10621:39;:::i;:::-;10676:89;10758:6;10753:3;10676:89;:::i;:::-;10669:96;;10774:52;10819:6;10814:3;10807:4;10800:5;10796:16;10774:52;:::i;:::-;10851:6;10846:3;10842:16;10835:23;;10597:267;10487:377;;;;:::o;10894:845::-;10997:3;11034:5;11028:12;11063:36;11089:9;11063:36;:::i;:::-;11115:89;11197:6;11192:3;11115:89;:::i;:::-;11108:96;;11235:1;11224:9;11220:17;11251:1;11246:137;;;;11397:1;11392:341;;;;11213:520;;11246:137;11330:4;11326:9;11315;11311:25;11306:3;11299:38;11366:6;11361:3;11357:16;11350:23;;11246:137;;11392:341;11459:38;11491:5;11459:38;:::i;:::-;11519:1;11533:154;11547:6;11544:1;11541:13;11533:154;;;11621:7;11615:14;11611:1;11606:3;11602:11;11595:35;11671:1;11662:7;11658:15;11647:26;;11569:4;11566:1;11562:12;11557:17;;11533:154;;;11716:6;11711:3;11707:16;11700:23;;11399:334;;11213:520;;11001:738;;10894:845;;;;:::o;11745:366::-;11887:3;11908:67;11972:2;11967:3;11908:67;:::i;:::-;11901:74;;11984:93;12073:3;11984:93;:::i;:::-;12102:2;12097:3;12093:12;12086:19;;11745:366;;;:::o;12117:::-;12259:3;12280:67;12344:2;12339:3;12280:67;:::i;:::-;12273:74;;12356:93;12445:3;12356:93;:::i;:::-;12474:2;12469:3;12465:12;12458:19;;12117:366;;;:::o;12489:::-;12631:3;12652:67;12716:2;12711:3;12652:67;:::i;:::-;12645:74;;12728:93;12817:3;12728:93;:::i;:::-;12846:2;12841:3;12837:12;12830:19;;12489:366;;;:::o;12861:::-;13003:3;13024:67;13088:2;13083:3;13024:67;:::i;:::-;13017:74;;13100:93;13189:3;13100:93;:::i;:::-;13218:2;13213:3;13209:12;13202:19;;12861:366;;;:::o;13233:::-;13375:3;13396:67;13460:2;13455:3;13396:67;:::i;:::-;13389:74;;13472:93;13561:3;13472:93;:::i;:::-;13590:2;13585:3;13581:12;13574:19;;13233:366;;;:::o;13605:400::-;13765:3;13786:84;13868:1;13863:3;13786:84;:::i;:::-;13779:91;;13879:93;13968:3;13879:93;:::i;:::-;13997:1;13992:3;13988:11;13981:18;;13605:400;;;:::o;14011:366::-;14153:3;14174:67;14238:2;14233:3;14174:67;:::i;:::-;14167:74;;14250:93;14339:3;14250:93;:::i;:::-;14368:2;14363:3;14359:12;14352:19;;14011:366;;;:::o;14383:::-;14525:3;14546:67;14610:2;14605:3;14546:67;:::i;:::-;14539:74;;14622:93;14711:3;14622:93;:::i;:::-;14740:2;14735:3;14731:12;14724:19;;14383:366;;;:::o;14755:::-;14897:3;14918:67;14982:2;14977:3;14918:67;:::i;:::-;14911:74;;14994:93;15083:3;14994:93;:::i;:::-;15112:2;15107:3;15103:12;15096:19;;14755:366;;;:::o;15127:::-;15269:3;15290:67;15354:2;15349:3;15290:67;:::i;:::-;15283:74;;15366:93;15455:3;15366:93;:::i;:::-;15484:2;15479:3;15475:12;15468:19;;15127:366;;;:::o;15499:::-;15641:3;15662:67;15726:2;15721:3;15662:67;:::i;:::-;15655:74;;15738:93;15827:3;15738:93;:::i;:::-;15856:2;15851:3;15847:12;15840:19;;15499:366;;;:::o;15871:::-;16013:3;16034:67;16098:2;16093:3;16034:67;:::i;:::-;16027:74;;16110:93;16199:3;16110:93;:::i;:::-;16228:2;16223:3;16219:12;16212:19;;15871:366;;;:::o;16243:::-;16385:3;16406:67;16470:2;16465:3;16406:67;:::i;:::-;16399:74;;16482:93;16571:3;16482:93;:::i;:::-;16600:2;16595:3;16591:12;16584:19;;16243:366;;;:::o;16615:::-;16757:3;16778:67;16842:2;16837:3;16778:67;:::i;:::-;16771:74;;16854:93;16943:3;16854:93;:::i;:::-;16972:2;16967:3;16963:12;16956:19;;16615:366;;;:::o;16987:::-;17129:3;17150:67;17214:2;17209:3;17150:67;:::i;:::-;17143:74;;17226:93;17315:3;17226:93;:::i;:::-;17344:2;17339:3;17335:12;17328:19;;16987:366;;;:::o;17359:::-;17501:3;17522:67;17586:2;17581:3;17522:67;:::i;:::-;17515:74;;17598:93;17687:3;17598:93;:::i;:::-;17716:2;17711:3;17707:12;17700:19;;17359:366;;;:::o;17731:::-;17873:3;17894:67;17958:2;17953:3;17894:67;:::i;:::-;17887:74;;17970:93;18059:3;17970:93;:::i;:::-;18088:2;18083:3;18079:12;18072:19;;17731:366;;;:::o;18103:::-;18245:3;18266:67;18330:2;18325:3;18266:67;:::i;:::-;18259:74;;18342:93;18431:3;18342:93;:::i;:::-;18460:2;18455:3;18451:12;18444:19;;18103:366;;;:::o;18475:::-;18617:3;18638:67;18702:2;18697:3;18638:67;:::i;:::-;18631:74;;18714:93;18803:3;18714:93;:::i;:::-;18832:2;18827:3;18823:12;18816:19;;18475:366;;;:::o;18847:::-;18989:3;19010:67;19074:2;19069:3;19010:67;:::i;:::-;19003:74;;19086:93;19175:3;19086:93;:::i;:::-;19204:2;19199:3;19195:12;19188:19;;18847:366;;;:::o;19219:::-;19361:3;19382:67;19446:2;19441:3;19382:67;:::i;:::-;19375:74;;19458:93;19547:3;19458:93;:::i;:::-;19576:2;19571:3;19567:12;19560:19;;19219:366;;;:::o;19591:::-;19733:3;19754:67;19818:2;19813:3;19754:67;:::i;:::-;19747:74;;19830:93;19919:3;19830:93;:::i;:::-;19948:2;19943:3;19939:12;19932:19;;19591:366;;;:::o;19963:118::-;20050:24;20068:5;20050:24;:::i;:::-;20045:3;20038:37;19963:118;;:::o;20087:112::-;20170:22;20186:5;20170:22;:::i;:::-;20165:3;20158:35;20087:112;;:::o;20205:271::-;20335:3;20357:93;20446:3;20437:6;20357:93;:::i;:::-;20350:100;;20467:3;20460:10;;20205:271;;;;:::o;20482:412::-;20640:3;20662:93;20751:3;20742:6;20662:93;:::i;:::-;20655:100;;20765:75;20836:3;20827:6;20765:75;:::i;:::-;20865:2;20860:3;20856:12;20849:19;;20885:3;20878:10;;20482:412;;;;;:::o;20900:429::-;21077:3;21099:92;21187:3;21178:6;21099:92;:::i;:::-;21092:99;;21208:95;21299:3;21290:6;21208:95;:::i;:::-;21201:102;;21320:3;21313:10;;20900:429;;;;;:::o;21335:663::-;21576:3;21598:148;21742:3;21598:148;:::i;:::-;21591:155;;21756:75;21827:3;21818:6;21756:75;:::i;:::-;21856:2;21851:3;21847:12;21840:19;;21869:75;21940:3;21931:6;21869:75;:::i;:::-;21969:2;21964:3;21960:12;21953:19;;21989:3;21982:10;;21335:663;;;;;:::o;22004:222::-;22097:4;22135:2;22124:9;22120:18;22112:26;;22148:71;22216:1;22205:9;22201:17;22192:6;22148:71;:::i;:::-;22004:222;;;;:::o;22232:561::-;22415:4;22453:2;22442:9;22438:18;22430:26;;22466:71;22534:1;22523:9;22519:17;22510:6;22466:71;:::i;:::-;22547:88;22631:2;22620:9;22616:18;22607:6;22547:88;:::i;:::-;22682:9;22676:4;22672:20;22667:2;22656:9;22652:18;22645:48;22710:76;22781:4;22772:6;22710:76;:::i;:::-;22702:84;;22232:561;;;;;;:::o;22799:640::-;22994:4;23032:3;23021:9;23017:19;23009:27;;23046:71;23114:1;23103:9;23099:17;23090:6;23046:71;:::i;:::-;23127:72;23195:2;23184:9;23180:18;23171:6;23127:72;:::i;:::-;23209;23277:2;23266:9;23262:18;23253:6;23209:72;:::i;:::-;23328:9;23322:4;23318:20;23313:2;23302:9;23298:18;23291:48;23356:76;23427:4;23418:6;23356:76;:::i;:::-;23348:84;;22799:640;;;;;;;:::o;23445:210::-;23532:4;23570:2;23559:9;23555:18;23547:26;;23583:65;23645:1;23634:9;23630:17;23621:6;23583:65;:::i;:::-;23445:210;;;;:::o;23661:222::-;23754:4;23792:2;23781:9;23777:18;23769:26;;23805:71;23873:1;23862:9;23858:17;23849:6;23805:71;:::i;:::-;23661:222;;;;:::o;23889:553::-;24066:4;24104:3;24093:9;24089:19;24081:27;;24118:71;24186:1;24175:9;24171:17;24162:6;24118:71;:::i;:::-;24199:72;24267:2;24256:9;24252:18;24243:6;24199:72;:::i;:::-;24281;24349:2;24338:9;24334:18;24325:6;24281:72;:::i;:::-;24363;24431:2;24420:9;24416:18;24407:6;24363:72;:::i;:::-;23889:553;;;;;;;:::o;24448:545::-;24621:4;24659:3;24648:9;24644:19;24636:27;;24673:71;24741:1;24730:9;24726:17;24717:6;24673:71;:::i;:::-;24754:68;24818:2;24807:9;24803:18;24794:6;24754:68;:::i;:::-;24832:72;24900:2;24889:9;24885:18;24876:6;24832:72;:::i;:::-;24914;24982:2;24971:9;24967:18;24958:6;24914:72;:::i;:::-;24448:545;;;;;;;:::o;24999:309::-;25110:4;25148:2;25137:9;25133:18;25125:26;;25197:9;25191:4;25187:20;25183:1;25172:9;25168:17;25161:47;25225:76;25296:4;25287:6;25225:76;:::i;:::-;25217:84;;24999:309;;;;:::o;25314:313::-;25427:4;25465:2;25454:9;25450:18;25442:26;;25514:9;25508:4;25504:20;25500:1;25489:9;25485:17;25478:47;25542:78;25615:4;25606:6;25542:78;:::i;:::-;25534:86;;25314:313;;;;:::o;25633:419::-;25799:4;25837:2;25826:9;25822:18;25814:26;;25886:9;25880:4;25876:20;25872:1;25861:9;25857:17;25850:47;25914:131;26040:4;25914:131;:::i;:::-;25906:139;;25633:419;;;:::o;26058:::-;26224:4;26262:2;26251:9;26247:18;26239:26;;26311:9;26305:4;26301:20;26297:1;26286:9;26282:17;26275:47;26339:131;26465:4;26339:131;:::i;:::-;26331:139;;26058:419;;;:::o;26483:::-;26649:4;26687:2;26676:9;26672:18;26664:26;;26736:9;26730:4;26726:20;26722:1;26711:9;26707:17;26700:47;26764:131;26890:4;26764:131;:::i;:::-;26756:139;;26483:419;;;:::o;26908:::-;27074:4;27112:2;27101:9;27097:18;27089:26;;27161:9;27155:4;27151:20;27147:1;27136:9;27132:17;27125:47;27189:131;27315:4;27189:131;:::i;:::-;27181:139;;26908:419;;;:::o;27333:::-;27499:4;27537:2;27526:9;27522:18;27514:26;;27586:9;27580:4;27576:20;27572:1;27561:9;27557:17;27550:47;27614:131;27740:4;27614:131;:::i;:::-;27606:139;;27333:419;;;:::o;27758:::-;27924:4;27962:2;27951:9;27947:18;27939:26;;28011:9;28005:4;28001:20;27997:1;27986:9;27982:17;27975:47;28039:131;28165:4;28039:131;:::i;:::-;28031:139;;27758:419;;;:::o;28183:::-;28349:4;28387:2;28376:9;28372:18;28364:26;;28436:9;28430:4;28426:20;28422:1;28411:9;28407:17;28400:47;28464:131;28590:4;28464:131;:::i;:::-;28456:139;;28183:419;;;:::o;28608:::-;28774:4;28812:2;28801:9;28797:18;28789:26;;28861:9;28855:4;28851:20;28847:1;28836:9;28832:17;28825:47;28889:131;29015:4;28889:131;:::i;:::-;28881:139;;28608:419;;;:::o;29033:::-;29199:4;29237:2;29226:9;29222:18;29214:26;;29286:9;29280:4;29276:20;29272:1;29261:9;29257:17;29250:47;29314:131;29440:4;29314:131;:::i;:::-;29306:139;;29033:419;;;:::o;29458:::-;29624:4;29662:2;29651:9;29647:18;29639:26;;29711:9;29705:4;29701:20;29697:1;29686:9;29682:17;29675:47;29739:131;29865:4;29739:131;:::i;:::-;29731:139;;29458:419;;;:::o;29883:::-;30049:4;30087:2;30076:9;30072:18;30064:26;;30136:9;30130:4;30126:20;30122:1;30111:9;30107:17;30100:47;30164:131;30290:4;30164:131;:::i;:::-;30156:139;;29883:419;;;:::o;30308:::-;30474:4;30512:2;30501:9;30497:18;30489:26;;30561:9;30555:4;30551:20;30547:1;30536:9;30532:17;30525:47;30589:131;30715:4;30589:131;:::i;:::-;30581:139;;30308:419;;;:::o;30733:::-;30899:4;30937:2;30926:9;30922:18;30914:26;;30986:9;30980:4;30976:20;30972:1;30961:9;30957:17;30950:47;31014:131;31140:4;31014:131;:::i;:::-;31006:139;;30733:419;;;:::o;31158:::-;31324:4;31362:2;31351:9;31347:18;31339:26;;31411:9;31405:4;31401:20;31397:1;31386:9;31382:17;31375:47;31439:131;31565:4;31439:131;:::i;:::-;31431:139;;31158:419;;;:::o;31583:::-;31749:4;31787:2;31776:9;31772:18;31764:26;;31836:9;31830:4;31826:20;31822:1;31811:9;31807:17;31800:47;31864:131;31990:4;31864:131;:::i;:::-;31856:139;;31583:419;;;:::o;32008:::-;32174:4;32212:2;32201:9;32197:18;32189:26;;32261:9;32255:4;32251:20;32247:1;32236:9;32232:17;32225:47;32289:131;32415:4;32289:131;:::i;:::-;32281:139;;32008:419;;;:::o;32433:::-;32599:4;32637:2;32626:9;32622:18;32614:26;;32686:9;32680:4;32676:20;32672:1;32661:9;32657:17;32650:47;32714:131;32840:4;32714:131;:::i;:::-;32706:139;;32433:419;;;:::o;32858:::-;33024:4;33062:2;33051:9;33047:18;33039:26;;33111:9;33105:4;33101:20;33097:1;33086:9;33082:17;33075:47;33139:131;33265:4;33139:131;:::i;:::-;33131:139;;32858:419;;;:::o;33283:::-;33449:4;33487:2;33476:9;33472:18;33464:26;;33536:9;33530:4;33526:20;33522:1;33511:9;33507:17;33500:47;33564:131;33690:4;33564:131;:::i;:::-;33556:139;;33283:419;;;:::o;33708:::-;33874:4;33912:2;33901:9;33897:18;33889:26;;33961:9;33955:4;33951:20;33947:1;33936:9;33932:17;33925:47;33989:131;34115:4;33989:131;:::i;:::-;33981:139;;33708:419;;;:::o;34133:::-;34299:4;34337:2;34326:9;34322:18;34314:26;;34386:9;34380:4;34376:20;34372:1;34361:9;34357:17;34350:47;34414:131;34540:4;34414:131;:::i;:::-;34406:139;;34133:419;;;:::o;34558:222::-;34651:4;34689:2;34678:9;34674:18;34666:26;;34702:71;34770:1;34759:9;34755:17;34746:6;34702:71;:::i;:::-;34558:222;;;;:::o;34786:129::-;34820:6;34847:20;;:::i;:::-;34837:30;;34876:33;34904:4;34896:6;34876:33;:::i;:::-;34786:129;;;:::o;34921:75::-;34954:6;34987:2;34981:9;34971:19;;34921:75;:::o;35002:307::-;35063:4;35153:18;35145:6;35142:30;35139:56;;;35175:18;;:::i;:::-;35139:56;35213:29;35235:6;35213:29;:::i;:::-;35205:37;;35297:4;35291;35287:15;35279:23;;35002:307;;;:::o;35315:308::-;35377:4;35467:18;35459:6;35456:30;35453:56;;;35489:18;;:::i;:::-;35453:56;35527:29;35549:6;35527:29;:::i;:::-;35519:37;;35611:4;35605;35601:15;35593:23;;35315:308;;;:::o;35629:141::-;35678:4;35701:3;35693:11;;35724:3;35721:1;35714:14;35758:4;35755:1;35745:18;35737:26;;35629:141;;;:::o;35776:98::-;35827:6;35861:5;35855:12;35845:22;;35776:98;;;:::o;35880:99::-;35932:6;35966:5;35960:12;35950:22;;35880:99;;;:::o;35985:168::-;36068:11;36102:6;36097:3;36090:19;36142:4;36137:3;36133:14;36118:29;;35985:168;;;;:::o;36159:147::-;36260:11;36297:3;36282:18;;36159:147;;;;:::o;36312:169::-;36396:11;36430:6;36425:3;36418:19;36470:4;36465:3;36461:14;36446:29;;36312:169;;;;:::o;36487:148::-;36589:11;36626:3;36611:18;;36487:148;;;;:::o;36641:305::-;36681:3;36700:20;36718:1;36700:20;:::i;:::-;36695:25;;36734:20;36752:1;36734:20;:::i;:::-;36729:25;;36888:1;36820:66;36816:74;36813:1;36810:81;36807:107;;;36894:18;;:::i;:::-;36807:107;36938:1;36935;36931:9;36924:16;;36641:305;;;;:::o;36952:185::-;36992:1;37009:20;37027:1;37009:20;:::i;:::-;37004:25;;37043:20;37061:1;37043:20;:::i;:::-;37038:25;;37082:1;37072:35;;37087:18;;:::i;:::-;37072:35;37129:1;37126;37122:9;37117:14;;36952:185;;;;:::o;37143:348::-;37183:7;37206:20;37224:1;37206:20;:::i;:::-;37201:25;;37240:20;37258:1;37240:20;:::i;:::-;37235:25;;37428:1;37360:66;37356:74;37353:1;37350:81;37345:1;37338:9;37331:17;37327:105;37324:131;;;37435:18;;:::i;:::-;37324:131;37483:1;37480;37476:9;37465:20;;37143:348;;;;:::o;37497:191::-;37537:4;37557:20;37575:1;37557:20;:::i;:::-;37552:25;;37591:20;37609:1;37591:20;:::i;:::-;37586:25;;37630:1;37627;37624:8;37621:34;;;37635:18;;:::i;:::-;37621:34;37680:1;37677;37673:9;37665:17;;37497:191;;;;:::o;37694:96::-;37731:7;37760:24;37778:5;37760:24;:::i;:::-;37749:35;;37694:96;;;:::o;37796:104::-;37841:7;37870:24;37888:5;37870:24;:::i;:::-;37859:35;;37796:104;;;:::o;37906:90::-;37940:7;37983:5;37976:13;37969:21;37958:32;;37906:90;;;:::o;38002:77::-;38039:7;38068:5;38057:16;;38002:77;;;:::o;38085:149::-;38121:7;38161:66;38154:5;38150:78;38139:89;;38085:149;;;:::o;38240:126::-;38277:7;38317:42;38310:5;38306:54;38295:65;;38240:126;;;:::o;38372:77::-;38409:7;38438:5;38427:16;;38372:77;;;:::o;38455:86::-;38490:7;38530:4;38523:5;38519:16;38508:27;;38455:86;;;:::o;38547:154::-;38631:6;38626:3;38621;38608:30;38693:1;38684:6;38679:3;38675:16;38668:27;38547:154;;;:::o;38707:307::-;38775:1;38785:113;38799:6;38796:1;38793:13;38785:113;;;38884:1;38879:3;38875:11;38869:18;38865:1;38860:3;38856:11;38849:39;38821:2;38818:1;38814:10;38809:15;;38785:113;;;38916:6;38913:1;38910:13;38907:101;;;38996:1;38987:6;38982:3;38978:16;38971:27;38907:101;38756:258;38707:307;;;:::o;39020:320::-;39064:6;39101:1;39095:4;39091:12;39081:22;;39148:1;39142:4;39138:12;39169:18;39159:81;;39225:4;39217:6;39213:17;39203:27;;39159:81;39287:2;39279:6;39276:14;39256:18;39253:38;39250:84;;;39306:18;;:::i;:::-;39250:84;39071:269;39020:320;;;:::o;39346:281::-;39429:27;39451:4;39429:27;:::i;:::-;39421:6;39417:40;39559:6;39547:10;39544:22;39523:18;39511:10;39508:34;39505:62;39502:88;;;39570:18;;:::i;:::-;39502:88;39610:10;39606:2;39599:22;39389:238;39346:281;;:::o;39633:233::-;39672:3;39695:24;39713:5;39695:24;:::i;:::-;39686:33;;39741:66;39734:5;39731:77;39728:103;;;39811:18;;:::i;:::-;39728:103;39858:1;39851:5;39847:13;39840:20;;39633:233;;;:::o;39872:100::-;39911:7;39940:26;39960:5;39940:26;:::i;:::-;39929:37;;39872:100;;;:::o;39978:79::-;40017:7;40046:5;40035:16;;39978:79;;;:::o;40063:94::-;40102:7;40131:20;40145:5;40131:20;:::i;:::-;40120:31;;40063:94;;;:::o;40163:176::-;40195:1;40212:20;40230:1;40212:20;:::i;:::-;40207:25;;40246:20;40264:1;40246:20;:::i;:::-;40241:25;;40285:1;40275:35;;40290:18;;:::i;:::-;40275:35;40331:1;40328;40324:9;40319:14;;40163:176;;;;:::o;40345:180::-;40393:77;40390:1;40383:88;40490:4;40487:1;40480:15;40514:4;40511:1;40504:15;40531:180;40579:77;40576:1;40569:88;40676:4;40673:1;40666:15;40700:4;40697:1;40690:15;40717:180;40765:77;40762:1;40755:88;40862:4;40859:1;40852:15;40886:4;40883:1;40876:15;40903:180;40951:77;40948:1;40941:88;41048:4;41045:1;41038:15;41072:4;41069:1;41062:15;41089:180;41137:77;41134:1;41127:88;41234:4;41231:1;41224:15;41258:4;41255:1;41248:15;41275:180;41323:77;41320:1;41313:88;41420:4;41417:1;41410:15;41444:4;41441:1;41434:15;41461:117;41570:1;41567;41560:12;41584:117;41693:1;41690;41683:12;41707:117;41816:1;41813;41806:12;41830:117;41939:1;41936;41929:12;41953:102;41994:6;42045:2;42041:7;42036:2;42029:5;42025:14;42021:28;42011:38;;41953:102;;;:::o;42061:94::-;42094:8;42142:5;42138:2;42134:14;42113:35;;42061:94;;;:::o;42161:230::-;42301:34;42297:1;42289:6;42285:14;42278:58;42370:13;42365:2;42357:6;42353:15;42346:38;42161:230;:::o;42397:237::-;42537:34;42533:1;42525:6;42521:14;42514:58;42606:20;42601:2;42593:6;42589:15;42582:45;42397:237;:::o;42640:225::-;42780:34;42776:1;42768:6;42764:14;42757:58;42849:8;42844:2;42836:6;42832:15;42825:33;42640:225;:::o;42871:178::-;43011:30;43007:1;42999:6;42995:14;42988:54;42871:178;:::o;43055:::-;43195:30;43191:1;43183:6;43179:14;43172:54;43055:178;:::o;43239:214::-;43379:66;43375:1;43367:6;43363:14;43356:90;43239:214;:::o;43459:223::-;43599:34;43595:1;43587:6;43583:14;43576:58;43668:6;43663:2;43655:6;43651:15;43644:31;43459:223;:::o;43688:175::-;43828:27;43824:1;43816:6;43812:14;43805:51;43688:175;:::o;43869:231::-;44009:34;44005:1;43997:6;43993:14;43986:58;44078:14;44073:2;44065:6;44061:15;44054:39;43869:231;:::o;44106:224::-;44246:34;44242:1;44234:6;44230:14;44223:58;44315:7;44310:2;44302:6;44298:15;44291:32;44106:224;:::o;44336:243::-;44476:34;44472:1;44464:6;44460:14;44453:58;44545:26;44540:2;44532:6;44528:15;44521:51;44336:243;:::o;44585:229::-;44725:34;44721:1;44713:6;44709:14;44702:58;44794:12;44789:2;44781:6;44777:15;44770:37;44585:229;:::o;44820:228::-;44960:34;44956:1;44948:6;44944:14;44937:58;45029:11;45024:2;45016:6;45012:15;45005:36;44820:228;:::o;45054:182::-;45194:34;45190:1;45182:6;45178:14;45171:58;45054:182;:::o;45242:231::-;45382:34;45378:1;45370:6;45366:14;45359:58;45451:14;45446:2;45438:6;45434:15;45427:39;45242:231;:::o;45479:182::-;45619:34;45615:1;45607:6;45603:14;45596:58;45479:182;:::o;45667:228::-;45807:34;45803:1;45795:6;45791:14;45784:58;45876:11;45871:2;45863:6;45859:15;45852:36;45667:228;:::o;45901:220::-;46041:34;46037:1;46029:6;46025:14;46018:58;46110:3;46105:2;46097:6;46093:15;46086:28;45901:220;:::o;46127:::-;46267:34;46263:1;46255:6;46251:14;46244:58;46336:3;46331:2;46323:6;46319:15;46312:28;46127:220;:::o;46353:236::-;46493:34;46489:1;46481:6;46477:14;46470:58;46562:19;46557:2;46549:6;46545:15;46538:44;46353:236;:::o;46595:167::-;46735:19;46731:1;46723:6;46719:14;46712:43;46595:167;:::o;46768:231::-;46908:34;46904:1;46896:6;46892:14;46885:58;46977:14;46972:2;46964:6;46960:15;46953:39;46768:231;:::o;47005:122::-;47078:24;47096:5;47078:24;:::i;:::-;47071:5;47068:35;47058:63;;47117:1;47114;47107:12;47058:63;47005:122;:::o;47133:116::-;47203:21;47218:5;47203:21;:::i;:::-;47196:5;47193:32;47183:60;;47239:1;47236;47229:12;47183:60;47133:116;:::o;47255:122::-;47328:24;47346:5;47328:24;:::i;:::-;47321:5;47318:35;47308:63;;47367:1;47364;47357:12;47308:63;47255:122;:::o;47383:120::-;47455:23;47472:5;47455:23;:::i;:::-;47448:5;47445:34;47435:62;;47493:1;47490;47483:12;47435:62;47383:120;:::o;47509:122::-;47582:24;47600:5;47582:24;:::i;:::-;47575:5;47572:35;47562:63;;47621:1;47618;47611:12;47562:63;47509:122;:::o;47637:118::-;47708:22;47724:5;47708:22;:::i;:::-;47701:5;47698:33;47688:61;;47745:1;47742;47735:12;47688:61;47637:118;:::o

Swarm Source

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