ETH Price: $3,292.20 (-10.49%)

Token

CryptoDemonz (DEMONZv1)
 

Overview

Max Total Supply

6,967 DEMONZv1

Holders

1,527

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
chsinc.eth
Balance
3 DEMONZv1
0x4572f8fad34cc16256bcb13576b0a8dadd3801c4
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

10,000 Unique Crypto Demonz NFTs.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Demonzv1

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 3 of 13: Demonzv1.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

contract Demonzv1 is ERC721Enumerable, Ownable {
    using Strings for uint256;

    uint256 public MAX_TOKENS = 10000;
    uint256 public MAX_MINTABLE_PER_TX = 20;
    uint256 public MAX_PER_WALLET = 50;

    uint256 public minting_price = 0.06 ether;
    string public beginning_uri = "https://blbstrgacct.blob.core.windows.net/metadata/";
    string public ending_uri = ".json";

    mapping (address => uint16) public burn_count;
    bool public minting_allowed = false;

    mapping (address => uint8) public presale_allocation;

    constructor() ERC721 ("CryptoDemonz", "DEMONZv1") {
        presale_allocation[0x02B06E44aEa658d9F113A22Cee32b924B45D5bb0] = 10;
        presale_allocation[0xb1776C152080228214c2E84e39A93311fF3c03C1] = 20;
        presale_allocation[0x0Edc2C64D952E75241590aC5Fb10077395F93DF6] = 30;
        presale_allocation[0x1de70e8fBBFB0Ca0c75234c499b5Db74BAE0D66B] = 8;
        presale_allocation[0x28a9CA0b1bF4bB2d04430A256B35B60DD9fCFc22] = 10;
        presale_allocation[0xFD861f7C8A59Ff456D6f5949c313FF02eB07B686] = 30;
        presale_allocation[0x8464da2C737DfE5B55c0D4BE69Fa7E84eB2249BE] = 20;
        presale_allocation[0x31be8e4756eA0Aa3660C973e882460873970c0da] = 20;
        presale_allocation[0xaC03FCc8fF62B3a3427ea2657CB4b78436C9Bc5F] = 3;
        presale_allocation[0x37b3fAe959F171767E34e33eAF7eE6e7Be2842C3] = 20;
        presale_allocation[0xe8300fBFE3F0E6182cb797A1f9B4e6BB65961aA8] = 5;
        presale_allocation[0x11483a4Fa80708ee902375259fA3B75f89177Fa7] = 6;
        presale_allocation[0xa1BbD8D39eD536DEa030A32F3F6C5916C845A800] = 20;
        presale_allocation[0xC0A564ae0BfBFB5c0d2027559669a785916387a6] = 1;
        presale_allocation[0x6f79ef162babd7DF4527832603185dA5F26b947a] = 1;
        presale_allocation[0xA011A2379E884826ec192bd7f46b2aFa6C356Dc1] = 5;
        presale_allocation[0x2d253a1e93DDf47d84150f2f34A08D507d416A62] = 5;
        presale_allocation[0xc04B7d464c724c8D4d5FE6067938cEDAb82afa12] = 10;
        presale_allocation[0x09242cf44047b58ff0Fbfe8428Ab39f2faAdfF7E] = 20;
        presale_allocation[0x75A08F634704c0060180C3a8E00F2b5991f2E5c9] = 20;
        presale_allocation[0x145c584F2F022997a9d0e5FcB4346042229525E1] = 3;
        presale_allocation[0x30965b30bbBD150d634Ca46D5c9b38B2fb9c2f53] = 10;
        presale_allocation[0xca1B8F95046506fdF2560880b2beB2950CC9aED6] = 20;
        presale_allocation[0xB9f41e10dF1e82Af748505A78bB127246Cea9860] = 20;
        presale_allocation[0x0A9Cb981760b88965BE3acA083cF3cA756EaFb77] = 30;
        presale_allocation[0x0eE0ee6C665EE946b2BF296f5f9219883Ad9DB29] = 20;
        presale_allocation[0x0416B4E5A120b61E6B459dd36DFE5589521AF870] = 10;
        presale_allocation[0x5967993F6315F01bc19561DF2b08e26e38Fb0d5e] = 20;
        presale_allocation[0x0c04187bB588Fe4a76C2060583575baBD5D99B3b] = 10;
        presale_allocation[0xe0C484C905da1488700270f8398419d8B84915B5] = 10;
        presale_allocation[0xF71EcE292584ac18730FD351F08FFaDe12398b82] = 20;
        presale_allocation[0xd2AEb39449b5E25258cceB24f5dd67d8110172D2] = 2;
        presale_allocation[0x93DaEDCa59f895d0c3F3978cd64d9CB981913C33] = 1;
        presale_allocation[0x44dc73292fB745d92EF1906dc362e03f2670Be70] = 6;
        presale_allocation[0xC3847b0324809af87bbc07E5a8E92a6fF8A7D202] = 6;
        presale_allocation[0x9408c666a65F2867A3ef3060766077462f84C717] = 20;
        presale_allocation[0x614621D47DCA95E365f152FEf71071F3B9370771] = 4;
        presale_allocation[0x4B424674eA391E5Ee53925DBAbD73027D06699A9] = 40;
        presale_allocation[0x19b927168996F0179FB1B57E8D27778e532f958A] = 15;
        presale_allocation[0xc04B7d464c724c8D4d5FE6067938cEDAb82afa12] = 10;
        presale_allocation[0x6978339e7549cE63952A625C5D5E8aE67c034f92] = 3;
        presale_allocation[0x70Cbc550D8187824EA1A6F94952C0Fa9B844f8fC] = 3;
        presale_allocation[0x5013C667440a7E6925A11389AdDc1B2a71552CaD] = 10;
        presale_allocation[0x5967993F6315F01bc19561DF2b08e26e38Fb0d5e] = 20;
        presale_allocation[0x8fA469EE658e4Dc604251D1D7C23ED71DAC5aB9D] = 10;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        return string(abi.encodePacked(beginning_uri, tokenId.toString(), ending_uri));
    }

    function preMint(uint256 _num_to_mint) external {
        require(totalSupply() + _num_to_mint <= MAX_TOKENS, "Not enough NFTs left to mint");
        require(presale_allocation[msg.sender] >= _num_to_mint, "Cannot premint that many tokens");

        for (uint256 i = 0; i < _num_to_mint; ++i) {
            _safeMint(msg.sender, totalSupply());
            --presale_allocation[msg.sender];
        }
    }

    function mintToken(uint256 _num_to_mint) external payable {
        require(minting_allowed, "Minting has not begun yet");
        require(msg.value == _num_to_mint * minting_price, "Incorrect amount of ETH sent");
        require(_num_to_mint <= MAX_MINTABLE_PER_TX, "Too many tokens queried for minting");
        require(totalSupply() + _num_to_mint <= MAX_TOKENS, "Not enough NFTs left to mint");
        require(balanceOf(msg.sender) + _num_to_mint <= MAX_PER_WALLET, "Exceeds wallet max allowed balance");

        for (uint256 i = 0; i < _num_to_mint; ++i) {
            _safeMint(msg.sender, totalSupply());
        }
    }

    function burnToken(uint256 _token_id) external {
        require(ownerOf(_token_id) == msg.sender, "Sender is not owner");
        _burn(_token_id);
        ++burn_count[msg.sender];
    }

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

    function toggleMinting() external onlyOwner {
        minting_allowed = !minting_allowed;
    }

    function setMintingPrice(uint256 _new_minting_price) external onlyOwner {
        minting_price = _new_minting_price;
    }

    function mintForGiveaway(uint256 _num_to_mint) external onlyOwner {
        require(totalSupply() < 90, "Cannot mint anymore for giveaways");

        for (uint i = 0; i < _num_to_mint; ++i) {
            _safeMint(msg.sender, totalSupply());
        }
    }

    function setBeginningURI(string memory _new_uri) external onlyOwner {
        beginning_uri = _new_uri;
    }

    function setEndingURI(string memory _new_uri) external onlyOwner {
        ending_uri = _new_uri;
    }

}

File 1 of 13: 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);
    }

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

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

File 2 of 13: 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 4 of 13: 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 5 of 13: 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(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

File 6 of 13: 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 7 of 13: 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 8 of 13: 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 9 of 13: 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 10 of 13: 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 11 of 13: 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 12 of 13: 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 13 of 13: 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":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_MINTABLE_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beginning_uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_token_id","type":"uint256"}],"name":"burnToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"burn_count","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ending_uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_num_to_mint","type":"uint256"}],"name":"mintForGiveaway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_num_to_mint","type":"uint256"}],"name":"mintToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"minting_allowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minting_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"uint256","name":"_num_to_mint","type":"uint256"}],"name":"preMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presale_allocation","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"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":"_new_uri","type":"string"}],"name":"setBeginningURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_new_uri","type":"string"}],"name":"setEndingURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new_minting_price","type":"uint256"}],"name":"setMintingPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052612710600b556014600c556032600d5566d529ae9e860000600e5560405180606001604052806033815260200162005f2060339139600f90805190602001906200005092919062001585565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250601090805190602001906200009e92919062001585565b506000601260006101000a81548160ff021916908315150217905550348015620000c757600080fd5b506040518060400160405280600c81526020017f43727970746f44656d6f6e7a00000000000000000000000000000000000000008152506040518060400160405280600881526020017f44454d4f4e5a763100000000000000000000000000000000000000000000000081525081600090805190602001906200014c92919062001585565b5080600190805190602001906200016592919062001585565b505050620001886200017c620014b760201b60201c565b620014bf60201b60201c565b600a601360007302b06e44aea658d9f113a22cee32b924b45d5bb073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555060146013600073b1776c152080228214c2e84e39a93311ff3c03c173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550601e60136000730edc2c64d952e75241590ac5fb10077395f93df673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550600860136000731de70e8fbbfb0ca0c75234c499b5db74bae0d66b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550600a601360007328a9ca0b1bf4bb2d04430a256b35b60dd9fcfc2273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550601e6013600073fd861f7c8a59ff456d6f5949c313ff02eb07b68673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550601460136000738464da2c737dfe5b55c0d4be69fa7e84eb2249be73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055506014601360007331be8e4756ea0aa3660c973e882460873970c0da73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555060036013600073ac03fcc8ff62b3a3427ea2657cb4b78436c9bc5f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055506014601360007337b3fae959f171767e34e33eaf7ee6e7be2842c373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555060056013600073e8300fbfe3f0e6182cb797a1f9b4e6bb65961aa873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055506006601360007311483a4fa80708ee902375259fa3b75f89177fa773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555060146013600073a1bbd8d39ed536dea030a32f3f6c5916c845a80073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555060016013600073c0a564ae0bfbfb5c0d2027559669a785916387a673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550600160136000736f79ef162babd7df4527832603185da5f26b947a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555060056013600073a011a2379e884826ec192bd7f46b2afa6c356dc173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550600560136000732d253a1e93ddf47d84150f2f34a08d507d416a6273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550600a6013600073c04b7d464c724c8d4d5fe6067938cedab82afa1273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055506014601360007309242cf44047b58ff0fbfe8428ab39f2faadff7e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055506014601360007375a08f634704c0060180c3a8e00f2b5991f2e5c973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555060036013600073145c584f2f022997a9d0e5fcb4346042229525e173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550600a601360007330965b30bbbd150d634ca46d5c9b38b2fb9c2f5373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555060146013600073ca1b8f95046506fdf2560880b2beb2950cc9aed673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555060146013600073b9f41e10df1e82af748505a78bb127246cea986073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550601e60136000730a9cb981760b88965be3aca083cf3ca756eafb7773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550601460136000730ee0ee6c665ee946b2bf296f5f9219883ad9db2973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550600a60136000730416b4e5a120b61e6b459dd36dfe5589521af87073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550601460136000735967993f6315f01bc19561df2b08e26e38fb0d5e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550600a60136000730c04187bb588fe4a76c2060583575babd5d99b3b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550600a6013600073e0c484c905da1488700270f8398419d8b84915b573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555060146013600073f71ece292584ac18730fd351f08ffade12398b8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555060026013600073d2aeb39449b5e25258cceb24f5dd67d8110172d273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055506001601360007393daedca59f895d0c3f3978cd64d9cb981913c3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055506006601360007344dc73292fb745d92ef1906dc362e03f2670be7073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555060066013600073c3847b0324809af87bbc07e5a8e92a6ff8a7d20273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550601460136000739408c666a65f2867a3ef3060766077462f84c71773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555060046013600073614621d47dca95e365f152fef71071f3b937077173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550602860136000734b424674ea391e5ee53925dbabd73027d06699a973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550600f601360007319b927168996f0179fb1b57e8d27778e532f958a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550600a6013600073c04b7d464c724c8d4d5fe6067938cedab82afa1273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550600360136000736978339e7549ce63952a625c5d5e8ae67c034f9273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055506003601360007370cbc550d8187824ea1a6f94952c0fa9b844f8fc73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550600a60136000735013c667440a7e6925a11389addc1b2a71552cad73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550601460136000735967993f6315f01bc19561df2b08e26e38fb0d5e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550600a60136000738fa469ee658e4dc604251d1d7c23ed71dac5ab9d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055506200169a565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620015939062001635565b90600052602060002090601f016020900481019282620015b7576000855562001603565b82601f10620015d257805160ff191683800117855562001603565b8280016001018555821562001603579182015b8281111562001602578251825591602001919060010190620015e5565b5b50905062001612919062001616565b5090565b5b808211156200163157600081600090555060010162001617565b5090565b600060028204905060018216806200164e57607f821691505b602082108114156200166557620016646200166b565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61487680620016aa6000396000f3fe60806040526004361061021a5760003560e01c8063715018a611610123578063ab88a7fa116100ab578063c87b56dd1161006f578063c87b56dd146107ae578063e985e9c5146107eb578063f2b3ea5d14610828578063f2fde38b14610853578063f47c84c51461087c5761021a565b8063ab88a7fa146106d6578063b616f05b14610701578063b88d4fde1461073e578063b9dc7cc414610767578063c634d032146107925761021a565b80638ad433ac116100f25780638ad433ac146106035780638b2c14351461062c5780638da5cb5b1461065757806395d89b4114610682578063a22cb465146106ad5761021a565b8063715018a6146105835780637b47ec1a1461059a5780637d55094d146105c35780638417b47f146105da5761021a565b80632f745c59116101a6578063479bb06f11610175578063479bb06f146104665780634f6ccce7146104a35780635701fc0b146104e05780636352211e1461050957806370a08231146105465761021a565b80632f745c59146103be578063306e8f0c146103fb5780633ccfd60b1461042657806342842e0e1461043d5761021a565b80630f2cdd6c116101ed5780630f2cdd6c146102ed57806318160ddd1461031857806323b872dd14610343578063242877c51461036c57806324a86735146103955761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b50610246600480360381019061024191906132e5565b6108a7565b6040516102539190613911565b60405180910390f35b34801561026857600080fd5b50610271610921565b60405161027e919061392c565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a99190613378565b6109b3565b6040516102bb91906138aa565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e691906132a9565b610a38565b005b3480156102f957600080fd5b50610302610b50565b60405161030f9190613c89565b60405180910390f35b34801561032457600080fd5b5061032d610b56565b60405161033a9190613c89565b60405180910390f35b34801561034f57600080fd5b5061036a600480360381019061036591906131a3565b610b63565b005b34801561037857600080fd5b50610393600480360381019061038e9190613337565b610bc3565b005b3480156103a157600080fd5b506103bc60048036038101906103b79190613378565b610c59565b005b3480156103ca57600080fd5b506103e560048036038101906103e091906132a9565b610d50565b6040516103f29190613c89565b60405180910390f35b34801561040757600080fd5b50610410610df5565b60405161041d9190613c89565b60405180910390f35b34801561043257600080fd5b5061043b610dfb565b005b34801561044957600080fd5b50610464600480360381019061045f91906131a3565b610ec0565b005b34801561047257600080fd5b5061048d6004803603810190610488919061313e565b610ee0565b60405161049a9190613ca4565b60405180910390f35b3480156104af57600080fd5b506104ca60048036038101906104c59190613378565b610f00565b6040516104d79190613c89565b60405180910390f35b3480156104ec57600080fd5b5061050760048036038101906105029190613337565b610f97565b005b34801561051557600080fd5b50610530600480360381019061052b9190613378565b61102d565b60405161053d91906138aa565b60405180910390f35b34801561055257600080fd5b5061056d6004803603810190610568919061313e565b6110df565b60405161057a9190613c89565b60405180910390f35b34801561058f57600080fd5b50610598611197565b005b3480156105a657600080fd5b506105c160048036038101906105bc9190613378565b61121f565b005b3480156105cf57600080fd5b506105d8611314565b005b3480156105e657600080fd5b5061060160048036038101906105fc9190613378565b6113bc565b005b34801561060f57600080fd5b5061062a60048036038101906106259190613378565b611442565b005b34801561063857600080fd5b506106416115cc565b60405161064e9190613911565b60405180910390f35b34801561066357600080fd5b5061066c6115df565b60405161067991906138aa565b60405180910390f35b34801561068e57600080fd5b50610697611609565b6040516106a4919061392c565b60405180910390f35b3480156106b957600080fd5b506106d460048036038101906106cf919061326d565b61169b565b005b3480156106e257600080fd5b506106eb61181c565b6040516106f8919061392c565b60405180910390f35b34801561070d57600080fd5b506107286004803603810190610723919061313e565b6118aa565b6040516107359190613c6e565b60405180910390f35b34801561074a57600080fd5b50610765600480360381019061076091906131f2565b6118cb565b005b34801561077357600080fd5b5061077c61192d565b604051610789919061392c565b60405180910390f35b6107ac60048036038101906107a79190613378565b6119bb565b005b3480156107ba57600080fd5b506107d560048036038101906107d09190613378565b611b7e565b6040516107e2919061392c565b60405180910390f35b3480156107f757600080fd5b50610812600480360381019061080d9190613167565b611bb5565b60405161081f9190613911565b60405180910390f35b34801561083457600080fd5b5061083d611c49565b60405161084a9190613c89565b60405180910390f35b34801561085f57600080fd5b5061087a6004803603810190610875919061313e565b611c4f565b005b34801561088857600080fd5b50610891611d47565b60405161089e9190613c89565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061091a575061091982611d4d565b5b9050919050565b60606000805461093090613fae565b80601f016020809104026020016040519081016040528092919081815260200182805461095c90613fae565b80156109a95780601f1061097e576101008083540402835291602001916109a9565b820191906000526020600020905b81548152906001019060200180831161098c57829003601f168201915b5050505050905090565b60006109be82611e2f565b6109fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f490613b4e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a438261102d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ab4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aab90613bae565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ad3611e9b565b73ffffffffffffffffffffffffffffffffffffffff161480610b025750610b0181610afc611e9b565b611bb5565b5b610b41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3890613ace565b60405180910390fd5b610b4b8383611ea3565b505050565b600d5481565b6000600880549050905090565b610b74610b6e611e9b565b82611f5c565b610bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610baa90613c0e565b60405180910390fd5b610bbe83838361203a565b505050565b610bcb611e9b565b73ffffffffffffffffffffffffffffffffffffffff16610be96115df565b73ffffffffffffffffffffffffffffffffffffffff1614610c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3690613b6e565b60405180910390fd5b8060109080519060200190610c55929190612f62565b5050565b610c61611e9b565b73ffffffffffffffffffffffffffffffffffffffff16610c7f6115df565b73ffffffffffffffffffffffffffffffffffffffff1614610cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccc90613b6e565b60405180910390fd5b605a610cdf610b56565b10610d1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1690613c4e565b60405180910390fd5b60005b81811015610d4c57610d3b33610d36610b56565b612296565b80610d459061403c565b9050610d22565b5050565b6000610d5b836110df565b8210610d9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d939061398e565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600c5481565b610e03611e9b565b73ffffffffffffffffffffffffffffffffffffffff16610e216115df565b73ffffffffffffffffffffffffffffffffffffffff1614610e77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6e90613b6e565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610ebd573d6000803e3d6000fd5b50565b610edb838383604051806020016040528060008152506118cb565b505050565b60136020528060005260406000206000915054906101000a900460ff1681565b6000610f0a610b56565b8210610f4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4290613c2e565b60405180910390fd5b60088281548110610f85577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610f9f611e9b565b73ffffffffffffffffffffffffffffffffffffffff16610fbd6115df565b73ffffffffffffffffffffffffffffffffffffffff1614611013576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100a90613b6e565b60405180910390fd5b80600f9080519060200190611029929190612f62565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cd90613b0e565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611150576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114790613aee565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61119f611e9b565b73ffffffffffffffffffffffffffffffffffffffff166111bd6115df565b73ffffffffffffffffffffffffffffffffffffffff1614611213576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120a90613b6e565b60405180910390fd5b61121d60006122b4565b565b3373ffffffffffffffffffffffffffffffffffffffff1661123f8261102d565b73ffffffffffffffffffffffffffffffffffffffff1614611295576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128c90613bee565b60405180910390fd5b61129e8161237a565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081819054906101000a900461ffff166112f790614011565b91906101000a81548161ffff021916908361ffff16021790555050565b61131c611e9b565b73ffffffffffffffffffffffffffffffffffffffff1661133a6115df565b73ffffffffffffffffffffffffffffffffffffffff1614611390576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138790613b6e565b60405180910390fd5b601260009054906101000a900460ff1615601260006101000a81548160ff021916908315150217905550565b6113c4611e9b565b73ffffffffffffffffffffffffffffffffffffffff166113e26115df565b73ffffffffffffffffffffffffffffffffffffffff1614611438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142f90613b6e565b60405180910390fd5b80600e8190555050565b600b548161144e610b56565b6114589190613d9e565b1115611499576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611490906139ee565b60405180910390fd5b80601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff16101561152b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152290613a8e565b60405180910390fd5b60005b818110156115c85761154733611542610b56565b612296565b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081819054906101000a900460ff1661159f90613f84565b91906101000a81548160ff021916908360ff160217905550806115c19061403c565b905061152e565b5050565b601260009054906101000a900460ff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461161890613fae565b80601f016020809104026020016040519081016040528092919081815260200182805461164490613fae565b80156116915780601f1061166657610100808354040283529160200191611691565b820191906000526020600020905b81548152906001019060200180831161167457829003601f168201915b5050505050905090565b6116a3611e9b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611711576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170890613a6e565b60405180910390fd5b806005600061171e611e9b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117cb611e9b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118109190613911565b60405180910390a35050565b6010805461182990613fae565b80601f016020809104026020016040519081016040528092919081815260200182805461185590613fae565b80156118a25780601f10611877576101008083540402835291602001916118a2565b820191906000526020600020905b81548152906001019060200180831161188557829003601f168201915b505050505081565b60116020528060005260406000206000915054906101000a900461ffff1681565b6118dc6118d6611e9b565b83611f5c565b61191b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191290613c0e565b60405180910390fd5b6119278484848461248b565b50505050565b600f805461193a90613fae565b80601f016020809104026020016040519081016040528092919081815260200182805461196690613fae565b80156119b35780601f10611988576101008083540402835291602001916119b3565b820191906000526020600020905b81548152906001019060200180831161199657829003601f168201915b505050505081565b601260009054906101000a900460ff16611a0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0190613a2e565b60405180910390fd5b600e5481611a189190613e25565b3414611a59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a509061396e565b60405180910390fd5b600c54811115611a9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a959061394e565b60405180910390fd5b600b5481611aaa610b56565b611ab49190613d9e565b1115611af5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aec906139ee565b60405180910390fd5b600d5481611b02336110df565b611b0c9190613d9e565b1115611b4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4490613bce565b60405180910390fd5b60005b81811015611b7a57611b6933611b64610b56565b612296565b80611b739061403c565b9050611b50565b5050565b6060600f611b8b836124e7565b6010604051602001611b9f93929190613879565b6040516020818303038152906040529050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e5481565b611c57611e9b565b73ffffffffffffffffffffffffffffffffffffffff16611c756115df565b73ffffffffffffffffffffffffffffffffffffffff1614611ccb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc290613b6e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d32906139ce565b60405180910390fd5b611d44816122b4565b50565b600b5481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e1857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611e285750611e2782612694565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f168361102d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611f6782611e2f565b611fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9d90613aae565b60405180910390fd5b6000611fb18361102d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061202057508373ffffffffffffffffffffffffffffffffffffffff16612008846109b3565b73ffffffffffffffffffffffffffffffffffffffff16145b8061203157506120308185611bb5565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661205a8261102d565b73ffffffffffffffffffffffffffffffffffffffff16146120b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a790613b8e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612120576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211790613a4e565b60405180910390fd5b61212b8383836126fe565b612136600082611ea3565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121869190613e7f565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121dd9190613d9e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6122b0828260405180602001604052806000815250612812565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006123858261102d565b9050612393816000846126fe565b61239e600083611ea3565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123ee9190613e7f565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b61249684848461203a565b6124a28484848461286d565b6124e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d8906139ae565b60405180910390fd5b50505050565b6060600082141561252f576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061268f565b600082905060005b6000821461256157808061254a9061403c565b915050600a8261255a9190613df4565b9150612537565b60008167ffffffffffffffff8111156125a3577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156125d55781602001600182028036833780820191505090505b5090505b60008514612688576001826125ee9190613e7f565b9150600a856125fd9190614085565b60306126099190613d9e565b60f81b818381518110612645577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126819190613df4565b94506125d9565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612709838383612a04565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561274c5761274781612a09565b61278b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461278a576127898382612a52565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127ce576127c981612bbf565b61280d565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461280c5761280b8282612d02565b5b5b505050565b61281c8383612d81565b612829600084848461286d565b612868576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285f906139ae565b60405180910390fd5b505050565b600061288e8473ffffffffffffffffffffffffffffffffffffffff16612f4f565b156129f7578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128b7611e9b565b8786866040518563ffffffff1660e01b81526004016128d994939291906138c5565b602060405180830381600087803b1580156128f357600080fd5b505af192505050801561292457506040513d601f19601f82011682018060405250810190612921919061330e565b60015b6129a7573d8060008114612954576040519150601f19603f3d011682016040523d82523d6000602084013e612959565b606091505b5060008151141561299f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612996906139ae565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506129fc565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612a5f846110df565b612a699190613e7f565b9050600060076000848152602001908152602001600020549050818114612b4e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612bd39190613e7f565b9050600060096000848152602001908152602001600020549050600060088381548110612c29577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612c71577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612ce6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612d0d836110df565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612df1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de890613b2e565b60405180910390fd5b612dfa81611e2f565b15612e3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3190613a0e565b60405180910390fd5b612e46600083836126fe565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e969190613d9e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612f6e90613fae565b90600052602060002090601f016020900481019282612f905760008555612fd7565b82601f10612fa957805160ff1916838001178555612fd7565b82800160010185558215612fd7579182015b82811115612fd6578251825591602001919060010190612fbb565b5b509050612fe49190612fe8565b5090565b5b80821115613001576000816000905550600101612fe9565b5090565b600061301861301384613ce4565b613cbf565b90508281526020810184848401111561303057600080fd5b61303b848285613f42565b509392505050565b600061305661305184613d15565b613cbf565b90508281526020810184848401111561306e57600080fd5b613079848285613f42565b509392505050565b600081359050613090816147e4565b92915050565b6000813590506130a5816147fb565b92915050565b6000813590506130ba81614812565b92915050565b6000815190506130cf81614812565b92915050565b600082601f8301126130e657600080fd5b81356130f6848260208601613005565b91505092915050565b600082601f83011261311057600080fd5b8135613120848260208601613043565b91505092915050565b60008135905061313881614829565b92915050565b60006020828403121561315057600080fd5b600061315e84828501613081565b91505092915050565b6000806040838503121561317a57600080fd5b600061318885828601613081565b925050602061319985828601613081565b9150509250929050565b6000806000606084860312156131b857600080fd5b60006131c686828701613081565b93505060206131d786828701613081565b92505060406131e886828701613129565b9150509250925092565b6000806000806080858703121561320857600080fd5b600061321687828801613081565b945050602061322787828801613081565b935050604061323887828801613129565b925050606085013567ffffffffffffffff81111561325557600080fd5b613261878288016130d5565b91505092959194509250565b6000806040838503121561328057600080fd5b600061328e85828601613081565b925050602061329f85828601613096565b9150509250929050565b600080604083850312156132bc57600080fd5b60006132ca85828601613081565b92505060206132db85828601613129565b9150509250929050565b6000602082840312156132f757600080fd5b6000613305848285016130ab565b91505092915050565b60006020828403121561332057600080fd5b600061332e848285016130c0565b91505092915050565b60006020828403121561334957600080fd5b600082013567ffffffffffffffff81111561336357600080fd5b61336f848285016130ff565b91505092915050565b60006020828403121561338a57600080fd5b600061339884828501613129565b91505092915050565b6133aa81613eb3565b82525050565b6133b981613ec5565b82525050565b60006133ca82613d5b565b6133d48185613d71565b93506133e4818560208601613f51565b6133ed81614172565b840191505092915050565b600061340382613d66565b61340d8185613d82565b935061341d818560208601613f51565b61342681614172565b840191505092915050565b600061343c82613d66565b6134468185613d93565b9350613456818560208601613f51565b80840191505092915050565b6000815461346f81613fae565b6134798186613d93565b9450600182166000811461349457600181146134a5576134d8565b60ff198316865281860193506134d8565b6134ae85613d46565b60005b838110156134d0578154818901526001820191506020810190506134b1565b838801955050505b50505092915050565b60006134ee602383613d82565b91506134f982614183565b604082019050919050565b6000613511601c83613d82565b915061351c826141d2565b602082019050919050565b6000613534602b83613d82565b915061353f826141fb565b604082019050919050565b6000613557603283613d82565b91506135628261424a565b604082019050919050565b600061357a602683613d82565b915061358582614299565b604082019050919050565b600061359d601c83613d82565b91506135a8826142e8565b602082019050919050565b60006135c0601c83613d82565b91506135cb82614311565b602082019050919050565b60006135e3601983613d82565b91506135ee8261433a565b602082019050919050565b6000613606602483613d82565b915061361182614363565b604082019050919050565b6000613629601983613d82565b9150613634826143b2565b602082019050919050565b600061364c601f83613d82565b9150613657826143db565b602082019050919050565b600061366f602c83613d82565b915061367a82614404565b604082019050919050565b6000613692603883613d82565b915061369d82614453565b604082019050919050565b60006136b5602a83613d82565b91506136c0826144a2565b604082019050919050565b60006136d8602983613d82565b91506136e3826144f1565b604082019050919050565b60006136fb602083613d82565b915061370682614540565b602082019050919050565b600061371e602c83613d82565b915061372982614569565b604082019050919050565b6000613741602083613d82565b915061374c826145b8565b602082019050919050565b6000613764602983613d82565b915061376f826145e1565b604082019050919050565b6000613787602183613d82565b915061379282614630565b604082019050919050565b60006137aa602283613d82565b91506137b58261467f565b604082019050919050565b60006137cd601383613d82565b91506137d8826146ce565b602082019050919050565b60006137f0603183613d82565b91506137fb826146f7565b604082019050919050565b6000613813602c83613d82565b915061381e82614746565b604082019050919050565b6000613836602183613d82565b915061384182614795565b604082019050919050565b61385581613efd565b82525050565b61386481613f2b565b82525050565b61387381613f35565b82525050565b60006138858286613462565b91506138918285613431565b915061389d8284613462565b9150819050949350505050565b60006020820190506138bf60008301846133a1565b92915050565b60006080820190506138da60008301876133a1565b6138e760208301866133a1565b6138f4604083018561385b565b818103606083015261390681846133bf565b905095945050505050565b600060208201905061392660008301846133b0565b92915050565b6000602082019050818103600083015261394681846133f8565b905092915050565b60006020820190508181036000830152613967816134e1565b9050919050565b6000602082019050818103600083015261398781613504565b9050919050565b600060208201905081810360008301526139a781613527565b9050919050565b600060208201905081810360008301526139c78161354a565b9050919050565b600060208201905081810360008301526139e78161356d565b9050919050565b60006020820190508181036000830152613a0781613590565b9050919050565b60006020820190508181036000830152613a27816135b3565b9050919050565b60006020820190508181036000830152613a47816135d6565b9050919050565b60006020820190508181036000830152613a67816135f9565b9050919050565b60006020820190508181036000830152613a878161361c565b9050919050565b60006020820190508181036000830152613aa78161363f565b9050919050565b60006020820190508181036000830152613ac781613662565b9050919050565b60006020820190508181036000830152613ae781613685565b9050919050565b60006020820190508181036000830152613b07816136a8565b9050919050565b60006020820190508181036000830152613b27816136cb565b9050919050565b60006020820190508181036000830152613b47816136ee565b9050919050565b60006020820190508181036000830152613b6781613711565b9050919050565b60006020820190508181036000830152613b8781613734565b9050919050565b60006020820190508181036000830152613ba781613757565b9050919050565b60006020820190508181036000830152613bc78161377a565b9050919050565b60006020820190508181036000830152613be78161379d565b9050919050565b60006020820190508181036000830152613c07816137c0565b9050919050565b60006020820190508181036000830152613c27816137e3565b9050919050565b60006020820190508181036000830152613c4781613806565b9050919050565b60006020820190508181036000830152613c6781613829565b9050919050565b6000602082019050613c83600083018461384c565b92915050565b6000602082019050613c9e600083018461385b565b92915050565b6000602082019050613cb9600083018461386a565b92915050565b6000613cc9613cda565b9050613cd58282613fe0565b919050565b6000604051905090565b600067ffffffffffffffff821115613cff57613cfe614143565b5b613d0882614172565b9050602081019050919050565b600067ffffffffffffffff821115613d3057613d2f614143565b5b613d3982614172565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613da982613f2b565b9150613db483613f2b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613de957613de86140b6565b5b828201905092915050565b6000613dff82613f2b565b9150613e0a83613f2b565b925082613e1a57613e196140e5565b5b828204905092915050565b6000613e3082613f2b565b9150613e3b83613f2b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e7457613e736140b6565b5b828202905092915050565b6000613e8a82613f2b565b9150613e9583613f2b565b925082821015613ea857613ea76140b6565b5b828203905092915050565b6000613ebe82613f0b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613f6f578082015181840152602081019050613f54565b83811115613f7e576000848401525b50505050565b6000613f8f82613f35565b91506000821415613fa357613fa26140b6565b5b600182039050919050565b60006002820490506001821680613fc657607f821691505b60208210811415613fda57613fd9614114565b5b50919050565b613fe982614172565b810181811067ffffffffffffffff8211171561400857614007614143565b5b80604052505050565b600061401c82613efd565b915061ffff821415614031576140306140b6565b5b600182019050919050565b600061404782613f2b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561407a576140796140b6565b5b600182019050919050565b600061409082613f2b565b915061409b83613f2b565b9250826140ab576140aa6140e5565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f546f6f206d616e7920746f6b656e73207175657269656420666f72206d696e7460008201527f696e670000000000000000000000000000000000000000000000000000000000602082015250565b7f496e636f727265637420616d6f756e74206f66204554482073656e7400000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f756768204e465473206c65667420746f206d696e7400000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4d696e74696e6720686173206e6f7420626567756e2079657400000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f43616e6e6f74207072656d696e742074686174206d616e7920746f6b656e7300600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f457863656564732077616c6c6574206d617820616c6c6f7765642062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f53656e646572206973206e6f74206f776e657200000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f43616e6e6f74206d696e7420616e796d6f726520666f7220676976656177617960008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6147ed81613eb3565b81146147f857600080fd5b50565b61480481613ec5565b811461480f57600080fd5b50565b61481b81613ed1565b811461482657600080fd5b50565b61483281613f2b565b811461483d57600080fd5b5056fea264697066735822122009406687855ef5df10837b48c385ba5eaeb35e8620bd877a34dcf8e7c9e2a3c564736f6c6343000804003368747470733a2f2f626c6273747267616363742e626c6f622e636f72652e77696e646f77732e6e65742f6d657461646174612f

Deployed Bytecode

0x60806040526004361061021a5760003560e01c8063715018a611610123578063ab88a7fa116100ab578063c87b56dd1161006f578063c87b56dd146107ae578063e985e9c5146107eb578063f2b3ea5d14610828578063f2fde38b14610853578063f47c84c51461087c5761021a565b8063ab88a7fa146106d6578063b616f05b14610701578063b88d4fde1461073e578063b9dc7cc414610767578063c634d032146107925761021a565b80638ad433ac116100f25780638ad433ac146106035780638b2c14351461062c5780638da5cb5b1461065757806395d89b4114610682578063a22cb465146106ad5761021a565b8063715018a6146105835780637b47ec1a1461059a5780637d55094d146105c35780638417b47f146105da5761021a565b80632f745c59116101a6578063479bb06f11610175578063479bb06f146104665780634f6ccce7146104a35780635701fc0b146104e05780636352211e1461050957806370a08231146105465761021a565b80632f745c59146103be578063306e8f0c146103fb5780633ccfd60b1461042657806342842e0e1461043d5761021a565b80630f2cdd6c116101ed5780630f2cdd6c146102ed57806318160ddd1461031857806323b872dd14610343578063242877c51461036c57806324a86735146103955761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b50610246600480360381019061024191906132e5565b6108a7565b6040516102539190613911565b60405180910390f35b34801561026857600080fd5b50610271610921565b60405161027e919061392c565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a99190613378565b6109b3565b6040516102bb91906138aa565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e691906132a9565b610a38565b005b3480156102f957600080fd5b50610302610b50565b60405161030f9190613c89565b60405180910390f35b34801561032457600080fd5b5061032d610b56565b60405161033a9190613c89565b60405180910390f35b34801561034f57600080fd5b5061036a600480360381019061036591906131a3565b610b63565b005b34801561037857600080fd5b50610393600480360381019061038e9190613337565b610bc3565b005b3480156103a157600080fd5b506103bc60048036038101906103b79190613378565b610c59565b005b3480156103ca57600080fd5b506103e560048036038101906103e091906132a9565b610d50565b6040516103f29190613c89565b60405180910390f35b34801561040757600080fd5b50610410610df5565b60405161041d9190613c89565b60405180910390f35b34801561043257600080fd5b5061043b610dfb565b005b34801561044957600080fd5b50610464600480360381019061045f91906131a3565b610ec0565b005b34801561047257600080fd5b5061048d6004803603810190610488919061313e565b610ee0565b60405161049a9190613ca4565b60405180910390f35b3480156104af57600080fd5b506104ca60048036038101906104c59190613378565b610f00565b6040516104d79190613c89565b60405180910390f35b3480156104ec57600080fd5b5061050760048036038101906105029190613337565b610f97565b005b34801561051557600080fd5b50610530600480360381019061052b9190613378565b61102d565b60405161053d91906138aa565b60405180910390f35b34801561055257600080fd5b5061056d6004803603810190610568919061313e565b6110df565b60405161057a9190613c89565b60405180910390f35b34801561058f57600080fd5b50610598611197565b005b3480156105a657600080fd5b506105c160048036038101906105bc9190613378565b61121f565b005b3480156105cf57600080fd5b506105d8611314565b005b3480156105e657600080fd5b5061060160048036038101906105fc9190613378565b6113bc565b005b34801561060f57600080fd5b5061062a60048036038101906106259190613378565b611442565b005b34801561063857600080fd5b506106416115cc565b60405161064e9190613911565b60405180910390f35b34801561066357600080fd5b5061066c6115df565b60405161067991906138aa565b60405180910390f35b34801561068e57600080fd5b50610697611609565b6040516106a4919061392c565b60405180910390f35b3480156106b957600080fd5b506106d460048036038101906106cf919061326d565b61169b565b005b3480156106e257600080fd5b506106eb61181c565b6040516106f8919061392c565b60405180910390f35b34801561070d57600080fd5b506107286004803603810190610723919061313e565b6118aa565b6040516107359190613c6e565b60405180910390f35b34801561074a57600080fd5b50610765600480360381019061076091906131f2565b6118cb565b005b34801561077357600080fd5b5061077c61192d565b604051610789919061392c565b60405180910390f35b6107ac60048036038101906107a79190613378565b6119bb565b005b3480156107ba57600080fd5b506107d560048036038101906107d09190613378565b611b7e565b6040516107e2919061392c565b60405180910390f35b3480156107f757600080fd5b50610812600480360381019061080d9190613167565b611bb5565b60405161081f9190613911565b60405180910390f35b34801561083457600080fd5b5061083d611c49565b60405161084a9190613c89565b60405180910390f35b34801561085f57600080fd5b5061087a6004803603810190610875919061313e565b611c4f565b005b34801561088857600080fd5b50610891611d47565b60405161089e9190613c89565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061091a575061091982611d4d565b5b9050919050565b60606000805461093090613fae565b80601f016020809104026020016040519081016040528092919081815260200182805461095c90613fae565b80156109a95780601f1061097e576101008083540402835291602001916109a9565b820191906000526020600020905b81548152906001019060200180831161098c57829003601f168201915b5050505050905090565b60006109be82611e2f565b6109fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f490613b4e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a438261102d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ab4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aab90613bae565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ad3611e9b565b73ffffffffffffffffffffffffffffffffffffffff161480610b025750610b0181610afc611e9b565b611bb5565b5b610b41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3890613ace565b60405180910390fd5b610b4b8383611ea3565b505050565b600d5481565b6000600880549050905090565b610b74610b6e611e9b565b82611f5c565b610bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610baa90613c0e565b60405180910390fd5b610bbe83838361203a565b505050565b610bcb611e9b565b73ffffffffffffffffffffffffffffffffffffffff16610be96115df565b73ffffffffffffffffffffffffffffffffffffffff1614610c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3690613b6e565b60405180910390fd5b8060109080519060200190610c55929190612f62565b5050565b610c61611e9b565b73ffffffffffffffffffffffffffffffffffffffff16610c7f6115df565b73ffffffffffffffffffffffffffffffffffffffff1614610cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccc90613b6e565b60405180910390fd5b605a610cdf610b56565b10610d1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1690613c4e565b60405180910390fd5b60005b81811015610d4c57610d3b33610d36610b56565b612296565b80610d459061403c565b9050610d22565b5050565b6000610d5b836110df565b8210610d9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d939061398e565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600c5481565b610e03611e9b565b73ffffffffffffffffffffffffffffffffffffffff16610e216115df565b73ffffffffffffffffffffffffffffffffffffffff1614610e77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6e90613b6e565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610ebd573d6000803e3d6000fd5b50565b610edb838383604051806020016040528060008152506118cb565b505050565b60136020528060005260406000206000915054906101000a900460ff1681565b6000610f0a610b56565b8210610f4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4290613c2e565b60405180910390fd5b60088281548110610f85577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610f9f611e9b565b73ffffffffffffffffffffffffffffffffffffffff16610fbd6115df565b73ffffffffffffffffffffffffffffffffffffffff1614611013576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100a90613b6e565b60405180910390fd5b80600f9080519060200190611029929190612f62565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cd90613b0e565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611150576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114790613aee565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61119f611e9b565b73ffffffffffffffffffffffffffffffffffffffff166111bd6115df565b73ffffffffffffffffffffffffffffffffffffffff1614611213576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120a90613b6e565b60405180910390fd5b61121d60006122b4565b565b3373ffffffffffffffffffffffffffffffffffffffff1661123f8261102d565b73ffffffffffffffffffffffffffffffffffffffff1614611295576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128c90613bee565b60405180910390fd5b61129e8161237a565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081819054906101000a900461ffff166112f790614011565b91906101000a81548161ffff021916908361ffff16021790555050565b61131c611e9b565b73ffffffffffffffffffffffffffffffffffffffff1661133a6115df565b73ffffffffffffffffffffffffffffffffffffffff1614611390576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138790613b6e565b60405180910390fd5b601260009054906101000a900460ff1615601260006101000a81548160ff021916908315150217905550565b6113c4611e9b565b73ffffffffffffffffffffffffffffffffffffffff166113e26115df565b73ffffffffffffffffffffffffffffffffffffffff1614611438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142f90613b6e565b60405180910390fd5b80600e8190555050565b600b548161144e610b56565b6114589190613d9e565b1115611499576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611490906139ee565b60405180910390fd5b80601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff16101561152b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152290613a8e565b60405180910390fd5b60005b818110156115c85761154733611542610b56565b612296565b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081819054906101000a900460ff1661159f90613f84565b91906101000a81548160ff021916908360ff160217905550806115c19061403c565b905061152e565b5050565b601260009054906101000a900460ff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461161890613fae565b80601f016020809104026020016040519081016040528092919081815260200182805461164490613fae565b80156116915780601f1061166657610100808354040283529160200191611691565b820191906000526020600020905b81548152906001019060200180831161167457829003601f168201915b5050505050905090565b6116a3611e9b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611711576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170890613a6e565b60405180910390fd5b806005600061171e611e9b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117cb611e9b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118109190613911565b60405180910390a35050565b6010805461182990613fae565b80601f016020809104026020016040519081016040528092919081815260200182805461185590613fae565b80156118a25780601f10611877576101008083540402835291602001916118a2565b820191906000526020600020905b81548152906001019060200180831161188557829003601f168201915b505050505081565b60116020528060005260406000206000915054906101000a900461ffff1681565b6118dc6118d6611e9b565b83611f5c565b61191b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191290613c0e565b60405180910390fd5b6119278484848461248b565b50505050565b600f805461193a90613fae565b80601f016020809104026020016040519081016040528092919081815260200182805461196690613fae565b80156119b35780601f10611988576101008083540402835291602001916119b3565b820191906000526020600020905b81548152906001019060200180831161199657829003601f168201915b505050505081565b601260009054906101000a900460ff16611a0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0190613a2e565b60405180910390fd5b600e5481611a189190613e25565b3414611a59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a509061396e565b60405180910390fd5b600c54811115611a9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a959061394e565b60405180910390fd5b600b5481611aaa610b56565b611ab49190613d9e565b1115611af5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aec906139ee565b60405180910390fd5b600d5481611b02336110df565b611b0c9190613d9e565b1115611b4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4490613bce565b60405180910390fd5b60005b81811015611b7a57611b6933611b64610b56565b612296565b80611b739061403c565b9050611b50565b5050565b6060600f611b8b836124e7565b6010604051602001611b9f93929190613879565b6040516020818303038152906040529050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e5481565b611c57611e9b565b73ffffffffffffffffffffffffffffffffffffffff16611c756115df565b73ffffffffffffffffffffffffffffffffffffffff1614611ccb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc290613b6e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d32906139ce565b60405180910390fd5b611d44816122b4565b50565b600b5481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e1857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611e285750611e2782612694565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f168361102d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611f6782611e2f565b611fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9d90613aae565b60405180910390fd5b6000611fb18361102d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061202057508373ffffffffffffffffffffffffffffffffffffffff16612008846109b3565b73ffffffffffffffffffffffffffffffffffffffff16145b8061203157506120308185611bb5565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661205a8261102d565b73ffffffffffffffffffffffffffffffffffffffff16146120b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a790613b8e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612120576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211790613a4e565b60405180910390fd5b61212b8383836126fe565b612136600082611ea3565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121869190613e7f565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121dd9190613d9e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6122b0828260405180602001604052806000815250612812565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006123858261102d565b9050612393816000846126fe565b61239e600083611ea3565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123ee9190613e7f565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b61249684848461203a565b6124a28484848461286d565b6124e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d8906139ae565b60405180910390fd5b50505050565b6060600082141561252f576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061268f565b600082905060005b6000821461256157808061254a9061403c565b915050600a8261255a9190613df4565b9150612537565b60008167ffffffffffffffff8111156125a3577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156125d55781602001600182028036833780820191505090505b5090505b60008514612688576001826125ee9190613e7f565b9150600a856125fd9190614085565b60306126099190613d9e565b60f81b818381518110612645577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126819190613df4565b94506125d9565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612709838383612a04565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561274c5761274781612a09565b61278b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461278a576127898382612a52565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127ce576127c981612bbf565b61280d565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461280c5761280b8282612d02565b5b5b505050565b61281c8383612d81565b612829600084848461286d565b612868576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285f906139ae565b60405180910390fd5b505050565b600061288e8473ffffffffffffffffffffffffffffffffffffffff16612f4f565b156129f7578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128b7611e9b565b8786866040518563ffffffff1660e01b81526004016128d994939291906138c5565b602060405180830381600087803b1580156128f357600080fd5b505af192505050801561292457506040513d601f19601f82011682018060405250810190612921919061330e565b60015b6129a7573d8060008114612954576040519150601f19603f3d011682016040523d82523d6000602084013e612959565b606091505b5060008151141561299f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612996906139ae565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506129fc565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612a5f846110df565b612a699190613e7f565b9050600060076000848152602001908152602001600020549050818114612b4e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612bd39190613e7f565b9050600060096000848152602001908152602001600020549050600060088381548110612c29577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612c71577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612ce6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612d0d836110df565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612df1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de890613b2e565b60405180910390fd5b612dfa81611e2f565b15612e3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3190613a0e565b60405180910390fd5b612e46600083836126fe565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e969190613d9e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612f6e90613fae565b90600052602060002090601f016020900481019282612f905760008555612fd7565b82601f10612fa957805160ff1916838001178555612fd7565b82800160010185558215612fd7579182015b82811115612fd6578251825591602001919060010190612fbb565b5b509050612fe49190612fe8565b5090565b5b80821115613001576000816000905550600101612fe9565b5090565b600061301861301384613ce4565b613cbf565b90508281526020810184848401111561303057600080fd5b61303b848285613f42565b509392505050565b600061305661305184613d15565b613cbf565b90508281526020810184848401111561306e57600080fd5b613079848285613f42565b509392505050565b600081359050613090816147e4565b92915050565b6000813590506130a5816147fb565b92915050565b6000813590506130ba81614812565b92915050565b6000815190506130cf81614812565b92915050565b600082601f8301126130e657600080fd5b81356130f6848260208601613005565b91505092915050565b600082601f83011261311057600080fd5b8135613120848260208601613043565b91505092915050565b60008135905061313881614829565b92915050565b60006020828403121561315057600080fd5b600061315e84828501613081565b91505092915050565b6000806040838503121561317a57600080fd5b600061318885828601613081565b925050602061319985828601613081565b9150509250929050565b6000806000606084860312156131b857600080fd5b60006131c686828701613081565b93505060206131d786828701613081565b92505060406131e886828701613129565b9150509250925092565b6000806000806080858703121561320857600080fd5b600061321687828801613081565b945050602061322787828801613081565b935050604061323887828801613129565b925050606085013567ffffffffffffffff81111561325557600080fd5b613261878288016130d5565b91505092959194509250565b6000806040838503121561328057600080fd5b600061328e85828601613081565b925050602061329f85828601613096565b9150509250929050565b600080604083850312156132bc57600080fd5b60006132ca85828601613081565b92505060206132db85828601613129565b9150509250929050565b6000602082840312156132f757600080fd5b6000613305848285016130ab565b91505092915050565b60006020828403121561332057600080fd5b600061332e848285016130c0565b91505092915050565b60006020828403121561334957600080fd5b600082013567ffffffffffffffff81111561336357600080fd5b61336f848285016130ff565b91505092915050565b60006020828403121561338a57600080fd5b600061339884828501613129565b91505092915050565b6133aa81613eb3565b82525050565b6133b981613ec5565b82525050565b60006133ca82613d5b565b6133d48185613d71565b93506133e4818560208601613f51565b6133ed81614172565b840191505092915050565b600061340382613d66565b61340d8185613d82565b935061341d818560208601613f51565b61342681614172565b840191505092915050565b600061343c82613d66565b6134468185613d93565b9350613456818560208601613f51565b80840191505092915050565b6000815461346f81613fae565b6134798186613d93565b9450600182166000811461349457600181146134a5576134d8565b60ff198316865281860193506134d8565b6134ae85613d46565b60005b838110156134d0578154818901526001820191506020810190506134b1565b838801955050505b50505092915050565b60006134ee602383613d82565b91506134f982614183565b604082019050919050565b6000613511601c83613d82565b915061351c826141d2565b602082019050919050565b6000613534602b83613d82565b915061353f826141fb565b604082019050919050565b6000613557603283613d82565b91506135628261424a565b604082019050919050565b600061357a602683613d82565b915061358582614299565b604082019050919050565b600061359d601c83613d82565b91506135a8826142e8565b602082019050919050565b60006135c0601c83613d82565b91506135cb82614311565b602082019050919050565b60006135e3601983613d82565b91506135ee8261433a565b602082019050919050565b6000613606602483613d82565b915061361182614363565b604082019050919050565b6000613629601983613d82565b9150613634826143b2565b602082019050919050565b600061364c601f83613d82565b9150613657826143db565b602082019050919050565b600061366f602c83613d82565b915061367a82614404565b604082019050919050565b6000613692603883613d82565b915061369d82614453565b604082019050919050565b60006136b5602a83613d82565b91506136c0826144a2565b604082019050919050565b60006136d8602983613d82565b91506136e3826144f1565b604082019050919050565b60006136fb602083613d82565b915061370682614540565b602082019050919050565b600061371e602c83613d82565b915061372982614569565b604082019050919050565b6000613741602083613d82565b915061374c826145b8565b602082019050919050565b6000613764602983613d82565b915061376f826145e1565b604082019050919050565b6000613787602183613d82565b915061379282614630565b604082019050919050565b60006137aa602283613d82565b91506137b58261467f565b604082019050919050565b60006137cd601383613d82565b91506137d8826146ce565b602082019050919050565b60006137f0603183613d82565b91506137fb826146f7565b604082019050919050565b6000613813602c83613d82565b915061381e82614746565b604082019050919050565b6000613836602183613d82565b915061384182614795565b604082019050919050565b61385581613efd565b82525050565b61386481613f2b565b82525050565b61387381613f35565b82525050565b60006138858286613462565b91506138918285613431565b915061389d8284613462565b9150819050949350505050565b60006020820190506138bf60008301846133a1565b92915050565b60006080820190506138da60008301876133a1565b6138e760208301866133a1565b6138f4604083018561385b565b818103606083015261390681846133bf565b905095945050505050565b600060208201905061392660008301846133b0565b92915050565b6000602082019050818103600083015261394681846133f8565b905092915050565b60006020820190508181036000830152613967816134e1565b9050919050565b6000602082019050818103600083015261398781613504565b9050919050565b600060208201905081810360008301526139a781613527565b9050919050565b600060208201905081810360008301526139c78161354a565b9050919050565b600060208201905081810360008301526139e78161356d565b9050919050565b60006020820190508181036000830152613a0781613590565b9050919050565b60006020820190508181036000830152613a27816135b3565b9050919050565b60006020820190508181036000830152613a47816135d6565b9050919050565b60006020820190508181036000830152613a67816135f9565b9050919050565b60006020820190508181036000830152613a878161361c565b9050919050565b60006020820190508181036000830152613aa78161363f565b9050919050565b60006020820190508181036000830152613ac781613662565b9050919050565b60006020820190508181036000830152613ae781613685565b9050919050565b60006020820190508181036000830152613b07816136a8565b9050919050565b60006020820190508181036000830152613b27816136cb565b9050919050565b60006020820190508181036000830152613b47816136ee565b9050919050565b60006020820190508181036000830152613b6781613711565b9050919050565b60006020820190508181036000830152613b8781613734565b9050919050565b60006020820190508181036000830152613ba781613757565b9050919050565b60006020820190508181036000830152613bc78161377a565b9050919050565b60006020820190508181036000830152613be78161379d565b9050919050565b60006020820190508181036000830152613c07816137c0565b9050919050565b60006020820190508181036000830152613c27816137e3565b9050919050565b60006020820190508181036000830152613c4781613806565b9050919050565b60006020820190508181036000830152613c6781613829565b9050919050565b6000602082019050613c83600083018461384c565b92915050565b6000602082019050613c9e600083018461385b565b92915050565b6000602082019050613cb9600083018461386a565b92915050565b6000613cc9613cda565b9050613cd58282613fe0565b919050565b6000604051905090565b600067ffffffffffffffff821115613cff57613cfe614143565b5b613d0882614172565b9050602081019050919050565b600067ffffffffffffffff821115613d3057613d2f614143565b5b613d3982614172565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613da982613f2b565b9150613db483613f2b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613de957613de86140b6565b5b828201905092915050565b6000613dff82613f2b565b9150613e0a83613f2b565b925082613e1a57613e196140e5565b5b828204905092915050565b6000613e3082613f2b565b9150613e3b83613f2b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e7457613e736140b6565b5b828202905092915050565b6000613e8a82613f2b565b9150613e9583613f2b565b925082821015613ea857613ea76140b6565b5b828203905092915050565b6000613ebe82613f0b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613f6f578082015181840152602081019050613f54565b83811115613f7e576000848401525b50505050565b6000613f8f82613f35565b91506000821415613fa357613fa26140b6565b5b600182039050919050565b60006002820490506001821680613fc657607f821691505b60208210811415613fda57613fd9614114565b5b50919050565b613fe982614172565b810181811067ffffffffffffffff8211171561400857614007614143565b5b80604052505050565b600061401c82613efd565b915061ffff821415614031576140306140b6565b5b600182019050919050565b600061404782613f2b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561407a576140796140b6565b5b600182019050919050565b600061409082613f2b565b915061409b83613f2b565b9250826140ab576140aa6140e5565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f546f6f206d616e7920746f6b656e73207175657269656420666f72206d696e7460008201527f696e670000000000000000000000000000000000000000000000000000000000602082015250565b7f496e636f727265637420616d6f756e74206f66204554482073656e7400000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f756768204e465473206c65667420746f206d696e7400000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4d696e74696e6720686173206e6f7420626567756e2079657400000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f43616e6e6f74207072656d696e742074686174206d616e7920746f6b656e7300600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f457863656564732077616c6c6574206d617820616c6c6f7765642062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f53656e646572206973206e6f74206f776e657200000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f43616e6e6f74206d696e7420616e796d6f726520666f7220676976656177617960008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6147ed81613eb3565b81146147f857600080fd5b50565b61480481613ec5565b811461480f57600080fd5b50565b61481b81613ed1565b811461482657600080fd5b50565b61483281613f2b565b811461483d57600080fd5b5056fea264697066735822122009406687855ef5df10837b48c385ba5eaeb35e8620bd877a34dcf8e7c9e2a3c564736f6c63430008040033

Deployed Bytecode Sourcemap

172:6437:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;937:224:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2426:100:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3985:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3508:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;346:34:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1577:113:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4875:339:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6499:105:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6108:264;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1245:256:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;300:39:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5753:109;;;;;;;;;;;;;:::i;:::-;;5285:185:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;666:52:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1767:233:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6380:111:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2120:239:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1850:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1650:94:11;;;;;;;;;;;;;:::i;:::-;;5553:192:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5870:97;;;;;;;;;;;;;:::i;:::-;;5975:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4480:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;622:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;999:87:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2595:104:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4278:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;527:34:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;570:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5541:328:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;437:83:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4904:641;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4287:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4644:164:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;389:41:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1899:192:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;260:33:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;937:224:5;1039:4;1078:35;1063:50;;;:11;:50;;;;:90;;;;1117:36;1141:11;1117:23;:36::i;:::-;1063:90;1056:97;;937:224;;;:::o;2426:100:4:-;2480:13;2513:5;2506:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2426:100;:::o;3985:221::-;4061:7;4089:16;4097:7;4089;:16::i;:::-;4081:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4174:15;:24;4190:7;4174:24;;;;;;;;;;;;;;;;;;;;;4167:31;;3985:221;;;:::o;3508:411::-;3589:13;3605:23;3620:7;3605:14;:23::i;:::-;3589:39;;3653:5;3647:11;;:2;:11;;;;3639:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3747:5;3731:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3756:37;3773:5;3780:12;:10;:12::i;:::-;3756:16;:37::i;:::-;3731:62;3709:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;3890:21;3899:2;3903:7;3890:8;:21::i;:::-;3508:411;;;:::o;346:34:2:-;;;;:::o;1577:113:5:-;1638:7;1665:10;:17;;;;1658:24;;1577:113;:::o;4875:339:4:-;5070:41;5089:12;:10;:12::i;:::-;5103:7;5070:18;:41::i;:::-;5062:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5178:28;5188:4;5194:2;5198:7;5178:9;:28::i;:::-;4875:339;;;:::o;6499:105:2:-;1230:12:11;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6588:8:2::1;6575:10;:21;;;;;;;;;;;;:::i;:::-;;6499:105:::0;:::o;6108:264::-;1230:12:11;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6209:2:2::1;6193:13;:11;:13::i;:::-;:18;6185:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;6267:6;6262:103;6283:12;6279:1;:16;6262:103;;;6317:36;6327:10;6339:13;:11;:13::i;:::-;6317:9;:36::i;:::-;6297:3;;;;:::i;:::-;;;6262:103;;;;6108:264:::0;:::o;1245:256:5:-;1342:7;1378:23;1395:5;1378:16;:23::i;:::-;1370:5;:31;1362:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1467:12;:19;1480:5;1467:19;;;;;;;;;;;;;;;:26;1487:5;1467:26;;;;;;;;;;;;1460:33;;1245:256;;;;:::o;300:39:2:-;;;;:::o;5753:109::-;1230:12:11;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5811:10:2::1;5803:28;;:51;5832:21;5803:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;5753:109::o:0;5285:185:4:-;5423:39;5440:4;5446:2;5450:7;5423:39;;;;;;;;;;;;:16;:39::i;:::-;5285:185;;;:::o;666:52:2:-;;;;;;;;;;;;;;;;;;;;;;:::o;1767:233:5:-;1842:7;1878:30;:28;:30::i;:::-;1870:5;:38;1862:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;1975:10;1986:5;1975:17;;;;;;;;;;;;;;;;;;;;;;;;1968:24;;1767:233;;;:::o;6380:111:2:-;1230:12:11;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6475:8:2::1;6459:13;:24;;;;;;;;;;;;:::i;:::-;;6380:111:::0;:::o;2120:239:4:-;2192:7;2212:13;2228:7;:16;2236:7;2228:16;;;;;;;;;;;;;;;;;;;;;2212:32;;2280:1;2263:19;;:5;:19;;;;2255:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2346:5;2339:12;;;2120:239;;;:::o;1850:208::-;1922:7;1967:1;1950:19;;:5;:19;;;;1942:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2034:9;:16;2044:5;2034:16;;;;;;;;;;;;;;;;2027:23;;1850:208;;;:::o;1650:94:11:-;1230:12;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1715:21:::1;1733:1;1715:9;:21::i;:::-;1650:94::o:0;5553:192:2:-;5641:10;5619:32;;:18;5627:9;5619:7;:18::i;:::-;:32;;;5611:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;5686:16;5692:9;5686:5;:16::i;:::-;5715:10;:22;5726:10;5715:22;;;;;;;;;;;;;;;;5713:24;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;5553:192;:::o;5870:97::-;1230:12:11;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5944:15:2::1;;;;;;;;;;;5943:16;5925:15;;:34;;;;;;;;;;;;;;;;;;5870:97::o:0;5975:125::-;1230:12:11;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6074:18:2::1;6058:13;:34;;;;5975:125:::0;:::o;4480:416::-;4579:10;;4563:12;4547:13;:11;:13::i;:::-;:28;;;;:::i;:::-;:42;;4539:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;4675:12;4641:18;:30;4660:10;4641:30;;;;;;;;;;;;;;;;;;;;;;;;;:46;;;;4633:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;4741:9;4736:153;4760:12;4756:1;:16;4736:153;;;4794:36;4804:10;4816:13;:11;:13::i;:::-;4794:9;:36::i;:::-;4847:18;:30;4866:10;4847:30;;;;;;;;;;;;;;;;4845:32;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;4774:3;;;;:::i;:::-;;;4736:153;;;;4480:416;:::o;622:35::-;;;;;;;;;;;;;:::o;999:87:11:-;1045:7;1072:6;;;;;;;;;;;1065:13;;999:87;:::o;2595:104:4:-;2651:13;2684:7;2677:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2595:104;:::o;4278:295::-;4393:12;:10;:12::i;:::-;4381:24;;:8;:24;;;;4373:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4493:8;4448:18;:32;4467:12;:10;:12::i;:::-;4448:32;;;;;;;;;;;;;;;:42;4481:8;4448:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;4546:8;4517:48;;4532:12;:10;:12::i;:::-;4517:48;;;4556:8;4517:48;;;;;;:::i;:::-;;;;;;;;4278:295;;:::o;527:34:2:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;570:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;5541:328:4:-;5716:41;5735:12;:10;:12::i;:::-;5749:7;5716:18;:41::i;:::-;5708:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5822:39;5836:4;5842:2;5846:7;5855:5;5822:13;:39::i;:::-;5541:328;;;;:::o;437:83:2:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4904:641::-;4981:15;;;;;;;;;;;4973:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;5073:13;;5058:12;:28;;;;:::i;:::-;5045:9;:41;5037:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;5154:19;;5138:12;:35;;5130:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;5264:10;;5248:12;5232:13;:11;:13::i;:::-;:28;;;;:::i;:::-;:42;;5224:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;5366:14;;5350:12;5326:21;5336:10;5326:9;:21::i;:::-;:36;;;;:::i;:::-;:54;;5318:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;5437:9;5432:106;5456:12;5452:1;:16;5432:106;;;5490:36;5500:10;5512:13;:11;:13::i;:::-;5490:9;:36::i;:::-;5470:3;;;;:::i;:::-;;;5432:106;;;;4904:641;:::o;4287:185::-;4360:13;4417;4432:18;:7;:16;:18::i;:::-;4452:10;4400:63;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4386:78;;4287:185;;;:::o;4644:164:4:-;4741:4;4765:18;:25;4784:5;4765:25;;;;;;;;;;;;;;;:35;4791:8;4765:35;;;;;;;;;;;;;;;;;;;;;;;;;4758:42;;4644:164;;;;:::o;389:41:2:-;;;;:::o;1899:192:11:-;1230:12;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2008:1:::1;1988:22;;:8;:22;;;;1980:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2064:19;2074:8;2064:9;:19::i;:::-;1899:192:::0;:::o;260:33:2:-;;;;:::o;1481:305:4:-;1583:4;1635:25;1620:40;;;:11;:40;;;;:105;;;;1692:33;1677:48;;;:11;:48;;;;1620:105;:158;;;;1742:36;1766:11;1742:23;:36::i;:::-;1620:158;1600:178;;1481:305;;;:::o;7379:127::-;7444:4;7496:1;7468:30;;:7;:16;7476:7;7468:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7461:37;;7379:127;;;:::o;601:98:1:-;654:7;681:10;674:17;;601:98;:::o;11361:174:4:-;11463:2;11436:15;:24;11452:7;11436:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11519:7;11515:2;11481:46;;11490:23;11505:7;11490:14;:23::i;:::-;11481:46;;;;;;;;;;;;11361:174;;:::o;7673:348::-;7766:4;7791:16;7799:7;7791;:16::i;:::-;7783:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7867:13;7883:23;7898:7;7883:14;:23::i;:::-;7867:39;;7936:5;7925:16;;:7;:16;;;:51;;;;7969:7;7945:31;;:20;7957:7;7945:11;:20::i;:::-;:31;;;7925:51;:87;;;;7980:32;7997:5;8004:7;7980:16;:32::i;:::-;7925:87;7917:96;;;7673:348;;;;:::o;10665:578::-;10824:4;10797:31;;:23;10812:7;10797:14;:23::i;:::-;:31;;;10789:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10907:1;10893:16;;:2;:16;;;;10885:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10963:39;10984:4;10990:2;10994:7;10963:20;:39::i;:::-;11067:29;11084:1;11088:7;11067:8;:29::i;:::-;11128:1;11109:9;:15;11119:4;11109:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;11157:1;11140:9;:13;11150:2;11140:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;11188:2;11169:7;:16;11177:7;11169:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;11227:7;11223:2;11208:27;;11217:4;11208:27;;;;;;;;;;;;10665:578;;;:::o;8363:110::-;8439:26;8449:2;8453:7;8439:26;;;;;;;;;;;;:9;:26::i;:::-;8363:110;;:::o;2099:173:11:-;2155:16;2174:6;;;;;;;;;;;2155:25;;2200:8;2191:6;;:17;;;;;;;;;;;;;;;;;;2255:8;2224:40;;2245:8;2224:40;;;;;;;;;;;;2099:173;;:::o;9968:360:4:-;10028:13;10044:23;10059:7;10044:14;:23::i;:::-;10028:39;;10080:48;10101:5;10116:1;10120:7;10080:20;:48::i;:::-;10169:29;10186:1;10190:7;10169:8;:29::i;:::-;10231:1;10211:9;:16;10221:5;10211:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;10250:7;:16;10258:7;10250:16;;;;;;;;;;;;10243:23;;;;;;;;;;;10312:7;10308:1;10284:36;;10293:5;10284:36;;;;;;;;;;;;9968:360;;:::o;6751:315::-;6908:28;6918:4;6924:2;6928:7;6908:9;:28::i;:::-;6955:48;6978:4;6984:2;6988:7;6997:5;6955:22;:48::i;:::-;6947:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6751:315;;;;:::o;288:723:12:-;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;958:2;949:11;;;;;:::i;:::-;;;818:154;;;996:6;982:21;;;;;288:723;;;;:::o;787:157:3:-;872:4;911:25;896:40;;;:11;:40;;;;889:47;;787:157;;;:::o;2613:589:5:-;2757:45;2784:4;2790:2;2794:7;2757:26;:45::i;:::-;2835:1;2819:18;;:4;:18;;;2815:187;;;2854:40;2886:7;2854:31;:40::i;:::-;2815:187;;;2924:2;2916:10;;:4;:10;;;2912:90;;2943:47;2976:4;2982:7;2943:32;:47::i;:::-;2912:90;2815:187;3030:1;3016:16;;:2;:16;;;3012:183;;;3049:45;3086:7;3049:36;:45::i;:::-;3012:183;;;3122:4;3116:10;;:2;:10;;;3112:83;;3143:40;3171:2;3175:7;3143:27;:40::i;:::-;3112:83;3012:183;2613:589;;;:::o;8700:321:4:-;8830:18;8836:2;8840:7;8830:5;:18::i;:::-;8881:54;8912:1;8916:2;8920:7;8929:5;8881:22;:54::i;:::-;8859:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;8700:321;;;:::o;12100:803::-;12255:4;12276:15;:2;:13;;;:15::i;:::-;12272:624;;;12328:2;12312:36;;;12349:12;:10;:12::i;:::-;12363:4;12369:7;12378:5;12312:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12308:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12575:1;12558:6;:13;:18;12554:272;;;12601:60;;;;;;;;;;:::i;:::-;;;;;;;;12554:272;12776:6;12770:13;12761:6;12757:2;12753:15;12746:38;12308:533;12445:45;;;12435:55;;;:6;:55;;;;12428:62;;;;;12272:624;12880:4;12873:11;;12100:803;;;;;;;:::o;13475:126::-;;;;:::o;3925:164:5:-;4029:10;:17;;;;4002:15;:24;4018:7;4002:24;;;;;;;;;;;:44;;;;4057:10;4073:7;4057:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3925:164;:::o;4716:988::-;4982:22;5032:1;5007:22;5024:4;5007:16;:22::i;:::-;:26;;;;:::i;:::-;4982:51;;5044:18;5065:17;:26;5083:7;5065:26;;;;;;;;;;;;5044:47;;5212:14;5198:10;:28;5194:328;;5243:19;5265:12;:18;5278:4;5265:18;;;;;;;;;;;;;;;:34;5284:14;5265:34;;;;;;;;;;;;5243:56;;5349:11;5316:12;:18;5329:4;5316:18;;;;;;;;;;;;;;;:30;5335:10;5316:30;;;;;;;;;;;:44;;;;5466:10;5433:17;:30;5451:11;5433:30;;;;;;;;;;;:43;;;;5194:328;;5618:17;:26;5636:7;5618:26;;;;;;;;;;;5611:33;;;5662:12;:18;5675:4;5662:18;;;;;;;;;;;;;;;:34;5681:14;5662:34;;;;;;;;;;;5655:41;;;4716:988;;;;:::o;5999:1079::-;6252:22;6297:1;6277:10;:17;;;;:21;;;;:::i;:::-;6252:46;;6309:18;6330:15;:24;6346:7;6330:24;;;;;;;;;;;;6309:45;;6681:19;6703:10;6714:14;6703:26;;;;;;;;;;;;;;;;;;;;;;;;6681:48;;6767:11;6742:10;6753;6742:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;6878:10;6847:15;:28;6863:11;6847:28;;;;;;;;;;;:41;;;;7019:15;:24;7035:7;7019:24;;;;;;;;;;;7012:31;;;7054:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5999:1079;;;;:::o;3503:221::-;3588:14;3605:20;3622:2;3605:16;:20::i;:::-;3588:37;;3663:7;3636:12;:16;3649:2;3636:16;;;;;;;;;;;;;;;:24;3653:6;3636:24;;;;;;;;;;;:34;;;;3710:6;3681:17;:26;3699:7;3681:26;;;;;;;;;;;:35;;;;3503:221;;;:::o;9357:382:4:-;9451:1;9437:16;;:2;:16;;;;9429:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9510:16;9518:7;9510;:16::i;:::-;9509:17;9501:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9572:45;9601:1;9605:2;9609:7;9572:20;:45::i;:::-;9647:1;9630:9;:13;9640:2;9630:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9678:2;9659:7;:16;9667:7;9659:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9723:7;9719:2;9698:33;;9715:1;9698:33;;;;;;;;;;;;9357:382;;:::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:343:13:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1036:5;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;1190:5;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;1349:5;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;1641:5;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1864:139::-;1910:5;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:262::-;2068:6;2117:2;2105:9;2096:7;2092:23;2088:32;2085:2;;;2133:1;2130;2123:12;2085:2;2176:1;2201:53;2246:7;2237:6;2226:9;2222:22;2201:53;:::i;:::-;2191:63;;2147:117;2075:196;;;;:::o;2277:407::-;2345:6;2353;2402:2;2390:9;2381:7;2377:23;2373:32;2370:2;;;2418:1;2415;2408:12;2370:2;2461:1;2486:53;2531:7;2522:6;2511:9;2507:22;2486:53;:::i;:::-;2476:63;;2432:117;2588:2;2614:53;2659:7;2650:6;2639:9;2635:22;2614:53;:::i;:::-;2604:63;;2559:118;2360:324;;;;;:::o;2690:552::-;2767:6;2775;2783;2832:2;2820:9;2811:7;2807:23;2803:32;2800:2;;;2848:1;2845;2838:12;2800:2;2891:1;2916:53;2961:7;2952:6;2941:9;2937:22;2916:53;:::i;:::-;2906:63;;2862:117;3018:2;3044:53;3089:7;3080:6;3069:9;3065:22;3044:53;:::i;:::-;3034:63;;2989:118;3146:2;3172:53;3217:7;3208:6;3197:9;3193:22;3172:53;:::i;:::-;3162:63;;3117:118;2790:452;;;;;:::o;3248:809::-;3343:6;3351;3359;3367;3416:3;3404:9;3395:7;3391:23;3387:33;3384:2;;;3433:1;3430;3423:12;3384:2;3476:1;3501:53;3546:7;3537:6;3526:9;3522:22;3501:53;:::i;:::-;3491:63;;3447:117;3603:2;3629:53;3674:7;3665:6;3654:9;3650:22;3629:53;:::i;:::-;3619:63;;3574:118;3731:2;3757:53;3802:7;3793:6;3782:9;3778:22;3757:53;:::i;:::-;3747:63;;3702:118;3887:2;3876:9;3872:18;3859:32;3918:18;3910:6;3907:30;3904:2;;;3950:1;3947;3940:12;3904:2;3978:62;4032:7;4023:6;4012:9;4008:22;3978:62;:::i;:::-;3968:72;;3830:220;3374:683;;;;;;;:::o;4063:401::-;4128:6;4136;4185:2;4173:9;4164:7;4160:23;4156:32;4153:2;;;4201:1;4198;4191:12;4153:2;4244:1;4269:53;4314:7;4305:6;4294:9;4290:22;4269:53;:::i;:::-;4259:63;;4215:117;4371:2;4397:50;4439:7;4430:6;4419:9;4415:22;4397:50;:::i;:::-;4387:60;;4342:115;4143:321;;;;;:::o;4470:407::-;4538:6;4546;4595:2;4583:9;4574:7;4570:23;4566:32;4563:2;;;4611:1;4608;4601:12;4563:2;4654:1;4679:53;4724:7;4715:6;4704:9;4700:22;4679:53;:::i;:::-;4669:63;;4625:117;4781:2;4807:53;4852:7;4843:6;4832:9;4828:22;4807:53;:::i;:::-;4797:63;;4752:118;4553:324;;;;;:::o;4883:260::-;4941:6;4990:2;4978:9;4969:7;4965:23;4961:32;4958:2;;;5006:1;5003;4996:12;4958:2;5049:1;5074:52;5118:7;5109:6;5098:9;5094:22;5074:52;:::i;:::-;5064:62;;5020:116;4948:195;;;;:::o;5149:282::-;5218:6;5267:2;5255:9;5246:7;5242:23;5238:32;5235:2;;;5283:1;5280;5273:12;5235:2;5326:1;5351:63;5406:7;5397:6;5386:9;5382:22;5351:63;:::i;:::-;5341:73;;5297:127;5225:206;;;;:::o;5437:375::-;5506:6;5555:2;5543:9;5534:7;5530:23;5526:32;5523:2;;;5571:1;5568;5561:12;5523:2;5642:1;5631:9;5627:17;5614:31;5672:18;5664:6;5661:30;5658:2;;;5704:1;5701;5694:12;5658:2;5732:63;5787:7;5778:6;5767:9;5763:22;5732:63;:::i;:::-;5722:73;;5585:220;5513:299;;;;:::o;5818:262::-;5877:6;5926:2;5914:9;5905:7;5901:23;5897:32;5894:2;;;5942:1;5939;5932:12;5894:2;5985:1;6010:53;6055:7;6046:6;6035:9;6031:22;6010:53;:::i;:::-;6000:63;;5956:117;5884:196;;;;:::o;6086:118::-;6173:24;6191:5;6173:24;:::i;:::-;6168:3;6161:37;6151:53;;:::o;6210:109::-;6291:21;6306:5;6291:21;:::i;:::-;6286:3;6279:34;6269:50;;:::o;6325:360::-;6411:3;6439:38;6471:5;6439:38;:::i;:::-;6493:70;6556:6;6551:3;6493:70;:::i;:::-;6486:77;;6572:52;6617:6;6612:3;6605:4;6598:5;6594:16;6572:52;:::i;:::-;6649:29;6671:6;6649:29;:::i;:::-;6644:3;6640:39;6633:46;;6415:270;;;;;:::o;6691:364::-;6779:3;6807:39;6840:5;6807:39;:::i;:::-;6862:71;6926:6;6921:3;6862:71;:::i;:::-;6855:78;;6942:52;6987:6;6982:3;6975:4;6968:5;6964:16;6942:52;:::i;:::-;7019:29;7041:6;7019:29;:::i;:::-;7014:3;7010:39;7003:46;;6783:272;;;;;:::o;7061:377::-;7167:3;7195:39;7228:5;7195:39;:::i;:::-;7250:89;7332:6;7327:3;7250:89;:::i;:::-;7243:96;;7348:52;7393:6;7388:3;7381:4;7374:5;7370:16;7348:52;:::i;:::-;7425:6;7420:3;7416:16;7409:23;;7171:267;;;;;:::o;7468:845::-;7571:3;7608:5;7602:12;7637:36;7663:9;7637:36;:::i;:::-;7689:89;7771:6;7766:3;7689:89;:::i;:::-;7682:96;;7809:1;7798:9;7794:17;7825:1;7820:137;;;;7971:1;7966:341;;;;7787:520;;7820:137;7904:4;7900:9;7889;7885:25;7880:3;7873:38;7940:6;7935:3;7931:16;7924:23;;7820:137;;7966:341;8033:38;8065:5;8033:38;:::i;:::-;8093:1;8107:154;8121:6;8118:1;8115:13;8107:154;;;8195:7;8189:14;8185:1;8180:3;8176:11;8169:35;8245:1;8236:7;8232:15;8221:26;;8143:4;8140:1;8136:12;8131:17;;8107:154;;;8290:6;8285:3;8281:16;8274:23;;7973:334;;7787:520;;7575:738;;;;;;:::o;8319:366::-;8461:3;8482:67;8546:2;8541:3;8482:67;:::i;:::-;8475:74;;8558:93;8647:3;8558:93;:::i;:::-;8676:2;8671:3;8667:12;8660:19;;8465:220;;;:::o;8691:366::-;8833:3;8854:67;8918:2;8913:3;8854:67;:::i;:::-;8847:74;;8930:93;9019:3;8930:93;:::i;:::-;9048:2;9043:3;9039:12;9032:19;;8837:220;;;:::o;9063:366::-;9205:3;9226:67;9290:2;9285:3;9226:67;:::i;:::-;9219:74;;9302:93;9391:3;9302:93;:::i;:::-;9420:2;9415:3;9411:12;9404:19;;9209:220;;;:::o;9435:366::-;9577:3;9598:67;9662:2;9657:3;9598:67;:::i;:::-;9591:74;;9674:93;9763:3;9674:93;:::i;:::-;9792:2;9787:3;9783:12;9776:19;;9581:220;;;:::o;9807:366::-;9949:3;9970:67;10034:2;10029:3;9970:67;:::i;:::-;9963:74;;10046:93;10135:3;10046:93;:::i;:::-;10164:2;10159:3;10155:12;10148:19;;9953:220;;;:::o;10179:366::-;10321:3;10342:67;10406:2;10401:3;10342:67;:::i;:::-;10335:74;;10418:93;10507:3;10418:93;:::i;:::-;10536:2;10531:3;10527:12;10520:19;;10325:220;;;:::o;10551:366::-;10693:3;10714:67;10778:2;10773:3;10714:67;:::i;:::-;10707:74;;10790:93;10879:3;10790:93;:::i;:::-;10908:2;10903:3;10899:12;10892:19;;10697:220;;;:::o;10923:366::-;11065:3;11086:67;11150:2;11145:3;11086:67;:::i;:::-;11079:74;;11162:93;11251:3;11162:93;:::i;:::-;11280:2;11275:3;11271:12;11264:19;;11069:220;;;:::o;11295:366::-;11437:3;11458:67;11522:2;11517:3;11458:67;:::i;:::-;11451:74;;11534:93;11623:3;11534:93;:::i;:::-;11652:2;11647:3;11643:12;11636:19;;11441:220;;;:::o;11667:366::-;11809:3;11830:67;11894:2;11889:3;11830:67;:::i;:::-;11823:74;;11906:93;11995:3;11906:93;:::i;:::-;12024:2;12019:3;12015:12;12008:19;;11813:220;;;:::o;12039:366::-;12181:3;12202:67;12266:2;12261:3;12202:67;:::i;:::-;12195:74;;12278:93;12367:3;12278:93;:::i;:::-;12396:2;12391:3;12387:12;12380:19;;12185:220;;;:::o;12411:366::-;12553:3;12574:67;12638:2;12633:3;12574:67;:::i;:::-;12567:74;;12650:93;12739:3;12650:93;:::i;:::-;12768:2;12763:3;12759:12;12752:19;;12557:220;;;:::o;12783:366::-;12925:3;12946:67;13010:2;13005:3;12946:67;:::i;:::-;12939:74;;13022:93;13111:3;13022:93;:::i;:::-;13140:2;13135:3;13131:12;13124:19;;12929:220;;;:::o;13155:366::-;13297:3;13318:67;13382:2;13377:3;13318:67;:::i;:::-;13311:74;;13394:93;13483:3;13394:93;:::i;:::-;13512:2;13507:3;13503:12;13496:19;;13301:220;;;:::o;13527:366::-;13669:3;13690:67;13754:2;13749:3;13690:67;:::i;:::-;13683:74;;13766:93;13855:3;13766:93;:::i;:::-;13884:2;13879:3;13875:12;13868:19;;13673:220;;;:::o;13899:366::-;14041:3;14062:67;14126:2;14121:3;14062:67;:::i;:::-;14055:74;;14138:93;14227:3;14138:93;:::i;:::-;14256:2;14251:3;14247:12;14240:19;;14045:220;;;:::o;14271:366::-;14413:3;14434:67;14498:2;14493:3;14434:67;:::i;:::-;14427:74;;14510:93;14599:3;14510:93;:::i;:::-;14628:2;14623:3;14619:12;14612:19;;14417:220;;;:::o;14643:366::-;14785:3;14806:67;14870:2;14865:3;14806:67;:::i;:::-;14799:74;;14882:93;14971:3;14882:93;:::i;:::-;15000:2;14995:3;14991:12;14984:19;;14789:220;;;:::o;15015:366::-;15157:3;15178:67;15242:2;15237:3;15178:67;:::i;:::-;15171:74;;15254:93;15343:3;15254:93;:::i;:::-;15372:2;15367:3;15363:12;15356:19;;15161:220;;;:::o;15387:366::-;15529:3;15550:67;15614:2;15609:3;15550:67;:::i;:::-;15543:74;;15626:93;15715:3;15626:93;:::i;:::-;15744:2;15739:3;15735:12;15728:19;;15533:220;;;:::o;15759:366::-;15901:3;15922:67;15986:2;15981:3;15922:67;:::i;:::-;15915:74;;15998:93;16087:3;15998:93;:::i;:::-;16116:2;16111:3;16107:12;16100:19;;15905:220;;;:::o;16131:366::-;16273:3;16294:67;16358:2;16353:3;16294:67;:::i;:::-;16287:74;;16370:93;16459:3;16370:93;:::i;:::-;16488:2;16483:3;16479:12;16472:19;;16277:220;;;:::o;16503:366::-;16645:3;16666:67;16730:2;16725:3;16666:67;:::i;:::-;16659:74;;16742:93;16831:3;16742:93;:::i;:::-;16860:2;16855:3;16851:12;16844:19;;16649:220;;;:::o;16875:366::-;17017:3;17038:67;17102:2;17097:3;17038:67;:::i;:::-;17031:74;;17114:93;17203:3;17114:93;:::i;:::-;17232:2;17227:3;17223:12;17216:19;;17021:220;;;:::o;17247:366::-;17389:3;17410:67;17474:2;17469:3;17410:67;:::i;:::-;17403:74;;17486:93;17575:3;17486:93;:::i;:::-;17604:2;17599:3;17595:12;17588:19;;17393:220;;;:::o;17619:115::-;17704:23;17721:5;17704:23;:::i;:::-;17699:3;17692:36;17682:52;;:::o;17740:118::-;17827:24;17845:5;17827:24;:::i;:::-;17822:3;17815:37;17805:53;;:::o;17864:112::-;17947:22;17963:5;17947:22;:::i;:::-;17942:3;17935:35;17925:51;;:::o;17982:583::-;18204:3;18226:92;18314:3;18305:6;18226:92;:::i;:::-;18219:99;;18335:95;18426:3;18417:6;18335:95;:::i;:::-;18328:102;;18447:92;18535:3;18526:6;18447:92;:::i;:::-;18440:99;;18556:3;18549:10;;18208:357;;;;;;:::o;18571:222::-;18664:4;18702:2;18691:9;18687:18;18679:26;;18715:71;18783:1;18772:9;18768:17;18759:6;18715:71;:::i;:::-;18669:124;;;;:::o;18799:640::-;18994:4;19032:3;19021:9;19017:19;19009:27;;19046:71;19114:1;19103:9;19099:17;19090:6;19046:71;:::i;:::-;19127:72;19195:2;19184:9;19180:18;19171:6;19127:72;:::i;:::-;19209;19277:2;19266:9;19262:18;19253:6;19209:72;:::i;:::-;19328:9;19322:4;19318:20;19313:2;19302:9;19298:18;19291:48;19356:76;19427:4;19418:6;19356:76;:::i;:::-;19348:84;;18999:440;;;;;;;:::o;19445:210::-;19532:4;19570:2;19559:9;19555:18;19547:26;;19583:65;19645:1;19634:9;19630:17;19621:6;19583:65;:::i;:::-;19537:118;;;;:::o;19661:313::-;19774:4;19812:2;19801:9;19797:18;19789:26;;19861:9;19855:4;19851:20;19847:1;19836:9;19832:17;19825:47;19889:78;19962:4;19953:6;19889:78;:::i;:::-;19881:86;;19779:195;;;;:::o;19980:419::-;20146:4;20184:2;20173:9;20169:18;20161:26;;20233:9;20227:4;20223:20;20219:1;20208:9;20204:17;20197:47;20261:131;20387:4;20261:131;:::i;:::-;20253:139;;20151:248;;;:::o;20405:419::-;20571:4;20609:2;20598:9;20594:18;20586:26;;20658:9;20652:4;20648:20;20644:1;20633:9;20629:17;20622:47;20686:131;20812:4;20686:131;:::i;:::-;20678:139;;20576:248;;;:::o;20830:419::-;20996:4;21034:2;21023:9;21019:18;21011:26;;21083:9;21077:4;21073:20;21069:1;21058:9;21054:17;21047:47;21111:131;21237:4;21111:131;:::i;:::-;21103:139;;21001:248;;;:::o;21255:419::-;21421:4;21459:2;21448:9;21444:18;21436:26;;21508:9;21502:4;21498:20;21494:1;21483:9;21479:17;21472:47;21536:131;21662:4;21536:131;:::i;:::-;21528:139;;21426:248;;;:::o;21680:419::-;21846:4;21884:2;21873:9;21869:18;21861:26;;21933:9;21927:4;21923:20;21919:1;21908:9;21904:17;21897:47;21961:131;22087:4;21961:131;:::i;:::-;21953:139;;21851:248;;;:::o;22105:419::-;22271:4;22309:2;22298:9;22294:18;22286:26;;22358:9;22352:4;22348:20;22344:1;22333:9;22329:17;22322:47;22386:131;22512:4;22386:131;:::i;:::-;22378:139;;22276:248;;;:::o;22530:419::-;22696:4;22734:2;22723:9;22719:18;22711:26;;22783:9;22777:4;22773:20;22769:1;22758:9;22754:17;22747:47;22811:131;22937:4;22811:131;:::i;:::-;22803:139;;22701:248;;;:::o;22955:419::-;23121:4;23159:2;23148:9;23144:18;23136:26;;23208:9;23202:4;23198:20;23194:1;23183:9;23179:17;23172:47;23236:131;23362:4;23236:131;:::i;:::-;23228:139;;23126:248;;;:::o;23380:419::-;23546:4;23584:2;23573:9;23569:18;23561:26;;23633:9;23627:4;23623:20;23619:1;23608:9;23604:17;23597:47;23661:131;23787:4;23661:131;:::i;:::-;23653:139;;23551:248;;;:::o;23805:419::-;23971:4;24009:2;23998:9;23994:18;23986:26;;24058:9;24052:4;24048:20;24044:1;24033:9;24029:17;24022:47;24086:131;24212:4;24086:131;:::i;:::-;24078:139;;23976:248;;;:::o;24230:419::-;24396:4;24434:2;24423:9;24419:18;24411:26;;24483:9;24477:4;24473:20;24469:1;24458:9;24454:17;24447:47;24511:131;24637:4;24511:131;:::i;:::-;24503:139;;24401:248;;;:::o;24655:419::-;24821:4;24859:2;24848:9;24844:18;24836:26;;24908:9;24902:4;24898:20;24894:1;24883:9;24879:17;24872:47;24936:131;25062:4;24936:131;:::i;:::-;24928:139;;24826:248;;;:::o;25080:419::-;25246:4;25284:2;25273:9;25269:18;25261:26;;25333:9;25327:4;25323:20;25319:1;25308:9;25304:17;25297:47;25361:131;25487:4;25361:131;:::i;:::-;25353:139;;25251:248;;;:::o;25505:419::-;25671:4;25709:2;25698:9;25694:18;25686:26;;25758:9;25752:4;25748:20;25744:1;25733:9;25729:17;25722:47;25786:131;25912:4;25786:131;:::i;:::-;25778:139;;25676:248;;;:::o;25930:419::-;26096:4;26134:2;26123:9;26119:18;26111:26;;26183:9;26177:4;26173:20;26169:1;26158:9;26154:17;26147:47;26211:131;26337:4;26211:131;:::i;:::-;26203:139;;26101:248;;;:::o;26355:419::-;26521:4;26559:2;26548:9;26544:18;26536:26;;26608:9;26602:4;26598:20;26594:1;26583:9;26579:17;26572:47;26636:131;26762:4;26636:131;:::i;:::-;26628:139;;26526:248;;;:::o;26780:419::-;26946:4;26984:2;26973:9;26969:18;26961:26;;27033:9;27027:4;27023:20;27019:1;27008:9;27004:17;26997:47;27061:131;27187:4;27061:131;:::i;:::-;27053:139;;26951:248;;;:::o;27205:419::-;27371:4;27409:2;27398:9;27394:18;27386:26;;27458:9;27452:4;27448:20;27444:1;27433:9;27429:17;27422:47;27486:131;27612:4;27486:131;:::i;:::-;27478:139;;27376:248;;;:::o;27630:419::-;27796:4;27834:2;27823:9;27819:18;27811:26;;27883:9;27877:4;27873:20;27869:1;27858:9;27854:17;27847:47;27911:131;28037:4;27911:131;:::i;:::-;27903:139;;27801:248;;;:::o;28055:419::-;28221:4;28259:2;28248:9;28244:18;28236:26;;28308:9;28302:4;28298:20;28294:1;28283:9;28279:17;28272:47;28336:131;28462:4;28336:131;:::i;:::-;28328:139;;28226:248;;;:::o;28480:419::-;28646:4;28684:2;28673:9;28669:18;28661:26;;28733:9;28727:4;28723:20;28719:1;28708:9;28704:17;28697:47;28761:131;28887:4;28761:131;:::i;:::-;28753:139;;28651:248;;;:::o;28905:419::-;29071:4;29109:2;29098:9;29094:18;29086:26;;29158:9;29152:4;29148:20;29144:1;29133:9;29129:17;29122:47;29186:131;29312:4;29186:131;:::i;:::-;29178:139;;29076:248;;;:::o;29330:419::-;29496:4;29534:2;29523:9;29519:18;29511:26;;29583:9;29577:4;29573:20;29569:1;29558:9;29554:17;29547:47;29611:131;29737:4;29611:131;:::i;:::-;29603:139;;29501:248;;;:::o;29755:419::-;29921:4;29959:2;29948:9;29944:18;29936:26;;30008:9;30002:4;29998:20;29994:1;29983:9;29979:17;29972:47;30036:131;30162:4;30036:131;:::i;:::-;30028:139;;29926:248;;;:::o;30180:419::-;30346:4;30384:2;30373:9;30369:18;30361:26;;30433:9;30427:4;30423:20;30419:1;30408:9;30404:17;30397:47;30461:131;30587:4;30461:131;:::i;:::-;30453:139;;30351:248;;;:::o;30605:218::-;30696:4;30734:2;30723:9;30719:18;30711:26;;30747:69;30813:1;30802:9;30798:17;30789:6;30747:69;:::i;:::-;30701:122;;;;:::o;30829:222::-;30922:4;30960:2;30949:9;30945:18;30937:26;;30973:71;31041:1;31030:9;31026:17;31017:6;30973:71;:::i;:::-;30927:124;;;;:::o;31057:214::-;31146:4;31184:2;31173:9;31169:18;31161:26;;31197:67;31261:1;31250:9;31246:17;31237:6;31197:67;:::i;:::-;31151:120;;;;:::o;31277:129::-;31311:6;31338:20;;:::i;:::-;31328:30;;31367:33;31395:4;31387:6;31367:33;:::i;:::-;31318:88;;;:::o;31412:75::-;31445:6;31478:2;31472:9;31462:19;;31452:35;:::o;31493:307::-;31554:4;31644:18;31636:6;31633:30;31630:2;;;31666:18;;:::i;:::-;31630:2;31704:29;31726:6;31704:29;:::i;:::-;31696:37;;31788:4;31782;31778:15;31770:23;;31559:241;;;:::o;31806:308::-;31868:4;31958:18;31950:6;31947:30;31944:2;;;31980:18;;:::i;:::-;31944:2;32018:29;32040:6;32018:29;:::i;:::-;32010:37;;32102:4;32096;32092:15;32084:23;;31873:241;;;:::o;32120:141::-;32169:4;32192:3;32184:11;;32215:3;32212:1;32205:14;32249:4;32246:1;32236:18;32228:26;;32174:87;;;:::o;32267:98::-;32318:6;32352:5;32346:12;32336:22;;32325:40;;;:::o;32371:99::-;32423:6;32457:5;32451:12;32441:22;;32430:40;;;:::o;32476:168::-;32559:11;32593:6;32588:3;32581:19;32633:4;32628:3;32624:14;32609:29;;32571:73;;;;:::o;32650:169::-;32734:11;32768:6;32763:3;32756:19;32808:4;32803:3;32799:14;32784:29;;32746:73;;;;:::o;32825:148::-;32927:11;32964:3;32949:18;;32939:34;;;;:::o;32979:305::-;33019:3;33038:20;33056:1;33038:20;:::i;:::-;33033:25;;33072:20;33090:1;33072:20;:::i;:::-;33067:25;;33226:1;33158:66;33154:74;33151:1;33148:81;33145:2;;;33232:18;;:::i;:::-;33145:2;33276:1;33273;33269:9;33262:16;;33023:261;;;;:::o;33290:185::-;33330:1;33347:20;33365:1;33347:20;:::i;:::-;33342:25;;33381:20;33399:1;33381:20;:::i;:::-;33376:25;;33420:1;33410:2;;33425:18;;:::i;:::-;33410:2;33467:1;33464;33460:9;33455:14;;33332:143;;;;:::o;33481:348::-;33521:7;33544:20;33562:1;33544:20;:::i;:::-;33539:25;;33578:20;33596:1;33578:20;:::i;:::-;33573:25;;33766:1;33698:66;33694:74;33691:1;33688:81;33683:1;33676:9;33669:17;33665:105;33662:2;;;33773:18;;:::i;:::-;33662:2;33821:1;33818;33814:9;33803:20;;33529:300;;;;:::o;33835:191::-;33875:4;33895:20;33913:1;33895:20;:::i;:::-;33890:25;;33929:20;33947:1;33929:20;:::i;:::-;33924:25;;33968:1;33965;33962:8;33959:2;;;33973:18;;:::i;:::-;33959:2;34018:1;34015;34011:9;34003:17;;33880:146;;;;:::o;34032:96::-;34069:7;34098:24;34116:5;34098:24;:::i;:::-;34087:35;;34077:51;;;:::o;34134:90::-;34168:7;34211:5;34204:13;34197:21;34186:32;;34176:48;;;:::o;34230:149::-;34266:7;34306:66;34299:5;34295:78;34284:89;;34274:105;;;:::o;34385:89::-;34421:7;34461:6;34454:5;34450:18;34439:29;;34429:45;;;:::o;34480:126::-;34517:7;34557:42;34550:5;34546:54;34535:65;;34525:81;;;:::o;34612:77::-;34649:7;34678:5;34667:16;;34657:32;;;:::o;34695:86::-;34730:7;34770:4;34763:5;34759:16;34748:27;;34738:43;;;:::o;34787:154::-;34871:6;34866:3;34861;34848:30;34933:1;34924:6;34919:3;34915:16;34908:27;34838:103;;;:::o;34947:307::-;35015:1;35025:113;35039:6;35036:1;35033:13;35025:113;;;35124:1;35119:3;35115:11;35109:18;35105:1;35100:3;35096:11;35089:39;35061:2;35058:1;35054:10;35049:15;;35025:113;;;35156:6;35153:1;35150:13;35147:2;;;35236:1;35227:6;35222:3;35218:16;35211:27;35147:2;34996:258;;;;:::o;35260:167::-;35297:3;35320:22;35336:5;35320:22;:::i;:::-;35311:31;;35364:4;35357:5;35354:15;35351:2;;;35372:18;;:::i;:::-;35351:2;35419:1;35412:5;35408:13;35401:20;;35301:126;;;:::o;35433:320::-;35477:6;35514:1;35508:4;35504:12;35494:22;;35561:1;35555:4;35551:12;35582:18;35572:2;;35638:4;35630:6;35626:17;35616:27;;35572:2;35700;35692:6;35689:14;35669:18;35666:38;35663:2;;;35719:18;;:::i;:::-;35663:2;35484:269;;;;:::o;35759:281::-;35842:27;35864:4;35842:27;:::i;:::-;35834:6;35830:40;35972:6;35960:10;35957:22;35936:18;35924:10;35921:34;35918:62;35915:2;;;35983:18;;:::i;:::-;35915:2;36023:10;36019:2;36012:22;35802:238;;;:::o;36046:171::-;36084:3;36107:23;36124:5;36107:23;:::i;:::-;36098:32;;36152:6;36145:5;36142:17;36139:2;;;36162:18;;:::i;:::-;36139:2;36209:1;36202:5;36198:13;36191:20;;36088:129;;;:::o;36223:233::-;36262:3;36285:24;36303:5;36285:24;:::i;:::-;36276:33;;36331:66;36324:5;36321:77;36318:2;;;36401:18;;:::i;:::-;36318:2;36448:1;36441:5;36437:13;36430:20;;36266:190;;;:::o;36462:176::-;36494:1;36511:20;36529:1;36511:20;:::i;:::-;36506:25;;36545:20;36563:1;36545:20;:::i;:::-;36540:25;;36584:1;36574:2;;36589:18;;:::i;:::-;36574:2;36630:1;36627;36623:9;36618:14;;36496:142;;;;:::o;36644:180::-;36692:77;36689:1;36682:88;36789:4;36786:1;36779:15;36813:4;36810:1;36803:15;36830:180;36878:77;36875:1;36868:88;36975:4;36972:1;36965:15;36999:4;36996:1;36989:15;37016:180;37064:77;37061:1;37054:88;37161:4;37158:1;37151:15;37185:4;37182:1;37175:15;37202:180;37250:77;37247:1;37240:88;37347:4;37344:1;37337:15;37371:4;37368:1;37361:15;37388:102;37429:6;37480:2;37476:7;37471:2;37464:5;37460:14;37456:28;37446:38;;37436:54;;;:::o;37496:222::-;37636:34;37632:1;37624:6;37620:14;37613:58;37705:5;37700:2;37692:6;37688:15;37681:30;37602:116;:::o;37724:178::-;37864:30;37860:1;37852:6;37848:14;37841:54;37830:72;:::o;37908:230::-;38048:34;38044:1;38036:6;38032:14;38025:58;38117:13;38112:2;38104:6;38100:15;38093:38;38014:124;:::o;38144:237::-;38284:34;38280:1;38272:6;38268:14;38261:58;38353:20;38348:2;38340:6;38336:15;38329:45;38250:131;:::o;38387:225::-;38527:34;38523:1;38515:6;38511:14;38504:58;38596:8;38591:2;38583:6;38579:15;38572:33;38493:119;:::o;38618:178::-;38758:30;38754:1;38746:6;38742:14;38735:54;38724:72;:::o;38802:178::-;38942:30;38938:1;38930:6;38926:14;38919:54;38908:72;:::o;38986:175::-;39126:27;39122:1;39114:6;39110:14;39103:51;39092:69;:::o;39167:223::-;39307:34;39303:1;39295:6;39291:14;39284:58;39376:6;39371:2;39363:6;39359:15;39352:31;39273:117;:::o;39396:175::-;39536:27;39532:1;39524:6;39520:14;39513:51;39502:69;:::o;39577:181::-;39717:33;39713:1;39705:6;39701:14;39694:57;39683:75;:::o;39764:231::-;39904:34;39900:1;39892:6;39888:14;39881:58;39973:14;39968:2;39960:6;39956:15;39949:39;39870:125;:::o;40001:243::-;40141:34;40137:1;40129:6;40125:14;40118:58;40210:26;40205:2;40197:6;40193:15;40186:51;40107:137;:::o;40250:229::-;40390:34;40386:1;40378:6;40374:14;40367:58;40459:12;40454:2;40446:6;40442:15;40435:37;40356:123;:::o;40485:228::-;40625:34;40621:1;40613:6;40609:14;40602:58;40694:11;40689:2;40681:6;40677:15;40670:36;40591:122;:::o;40719:182::-;40859:34;40855:1;40847:6;40843:14;40836:58;40825:76;:::o;40907:231::-;41047:34;41043:1;41035:6;41031:14;41024:58;41116:14;41111:2;41103:6;41099:15;41092:39;41013:125;:::o;41144:182::-;41284:34;41280:1;41272:6;41268:14;41261:58;41250:76;:::o;41332:228::-;41472:34;41468:1;41460:6;41456:14;41449:58;41541:11;41536:2;41528:6;41524:15;41517:36;41438:122;:::o;41566:220::-;41706:34;41702:1;41694:6;41690:14;41683:58;41775:3;41770:2;41762:6;41758:15;41751:28;41672:114;:::o;41792:221::-;41932:34;41928:1;41920:6;41916:14;41909:58;42001:4;41996:2;41988:6;41984:15;41977:29;41898:115;:::o;42019:169::-;42159:21;42155:1;42147:6;42143:14;42136:45;42125:63;:::o;42194:236::-;42334:34;42330:1;42322:6;42318:14;42311:58;42403:19;42398:2;42390:6;42386:15;42379:44;42300:130;:::o;42436:231::-;42576:34;42572:1;42564:6;42560:14;42553:58;42645:14;42640:2;42632:6;42628:15;42621:39;42542:125;:::o;42673:220::-;42813:34;42809:1;42801:6;42797:14;42790:58;42882:3;42877:2;42869:6;42865:15;42858:28;42779:114;:::o;42899:122::-;42972:24;42990:5;42972:24;:::i;:::-;42965:5;42962:35;42952:2;;43011:1;43008;43001:12;42952:2;42942:79;:::o;43027:116::-;43097:21;43112:5;43097:21;:::i;:::-;43090:5;43087:32;43077:2;;43133:1;43130;43123:12;43077:2;43067:76;:::o;43149:120::-;43221:23;43238:5;43221:23;:::i;:::-;43214:5;43211:34;43201:2;;43259:1;43256;43249:12;43201:2;43191:78;:::o;43275:122::-;43348:24;43366:5;43348:24;:::i;:::-;43341:5;43338:35;43328:2;;43387:1;43384;43377:12;43328:2;43318:79;:::o

Swarm Source

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