ETH Price: $3,470.35 (+3.03%)

Token

Phudgy Penguins (PHUDGIES)
 

Overview

Max Total Supply

0 PHUDGIES

Holders

296

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
icculus.eth
Balance
20 PHUDGIES
0x0a0871c2ea6f24149758dc5bd1136d337b7f47b8
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
PhudgyPenguins

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 12 of 13: PhudgyPenguins.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./Ownable.sol";
import "./Strings.sol";
import "./Counters.sol";
import "./Phake.sol";

contract PhudgyPenguins is ERC721, Ownable {
    using Strings for uint256;
    using Counters for Counters.Counter;
    Counters.Counter private _tokenSupply;
    
    bool public public_sale_running = false;

    // mainnet
    Phake private immutable Phunks = Phake(0xf07468eAd8cf26c752C676E43C814FEe9c8CF402);
    Phake private immutable PudgyPenguins = Phake(0xBd3531dA5CF5857e7CfAA92426877b022e612cf8);
    Phake private immutable PHAYC = Phake(0xcb88735A1eAe17fF2A2aBAEC1ba03d877F4Bc055);

    string private base_uri = "https://ipfs.io/ipfs/QmTgCQtL9Eec4uwu3tJajWSmEJjC5AKv1QCkFr33iKm2c3/";
    
    constructor () ERC721("Phudgy Penguins", "PHUDGIES") {
        _safeMint(0xcf541b1323c83D671009535815b9e92CaA70e017, _tokenSupply.current());
        _tokenSupply.increment();
    }

    function setBaseURI(string memory new_uri) external onlyOwner {
        base_uri = new_uri;
    }
    
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        return string(abi.encodePacked(base_uri, tokenId.toString(), ".json"));
    }   

    function publicMint(uint _quantity) external payable {
        require(public_sale_running, "Public sale is not running");
        require(_quantity <= 20, "Invalid number of tokens queries for minting");
        require(_tokenSupply.current() + _quantity <= 8888, "Not enough tokens left to mint");

        if (Phunks.balanceOf(msg.sender) + PudgyPenguins.balanceOf(msg.sender) + PHAYC.balanceOf(msg.sender) > 0) {
            if (_tokenSupply.current() >= 2222) {
                require(msg.value == 0.02 ether * _quantity, "Incorrect ETH sent to mint");
            } else {
                require(msg.value == 0, "Bro it's free...");
            }
        } else {
            if (_tokenSupply.current() >= 6666) {
                require(msg.value == 0.04 ether * _quantity, "Incorrect ETH sent to mint");
            } else if (_tokenSupply.current() >= 4444) {
                require(msg.value == 0.03 ether * _quantity, "Incorrect ETH sent to mint");
            } else if (_tokenSupply.current() >= 2222) {
                require(msg.value == 0.02 ether * _quantity, "Incorrect ETH sent to mint");
            } else {
                require(msg.value == 0.01 ether * _quantity, "Incorrect ETH sent to mint");
            }
        }  
            
        for (uint i = 0; i < _quantity; ++i) {
            _safeMint(msg.sender, _tokenSupply.current());
            _tokenSupply.increment();
        }
    }

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

File 1 of 13: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Address.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 2 of 13: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 3 of 13: Counters.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

File 4 of 13: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol)

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
// OpenZeppelin Contracts v4.4.0 (token/ERC721/ERC721.sol)

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 {
        _setApprovalForAll(_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 Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

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

File 6 of 13: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

File 7 of 13: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721.sol)

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 8 of 13: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Metadata.sol)

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 9 of 13: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

File 10 of 13: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (access/Ownable.sol)

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() {
        _transferOwnership(_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 {
        _transferOwnership(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");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 11 of 13: Phake.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

abstract contract Phake {
    function balanceOf(address owner) public view virtual returns (uint256);
}

File 13 of 13: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"_quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"public_sale_running","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"setBaseURI","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":"togglePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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"}]

60e06040526000600860006101000a81548160ff02191690831515021790555073f07468ead8cf26c752c676e43c814fee9c8cf40273ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1660601b81525073bd3531da5cf5857e7cfaa92426877b022e612cf873ffffffffffffffffffffffffffffffffffffffff1660a09073ffffffffffffffffffffffffffffffffffffffff1660601b81525073cb88735a1eae17ff2a2abaec1ba03d877f4bc05573ffffffffffffffffffffffffffffffffffffffff1660c09073ffffffffffffffffffffffffffffffffffffffff1660601b815250604051806080016040528060448152602001620045bc60449139600990805190602001906200012e92919062000800565b503480156200013c57600080fd5b506040518060400160405280600f81526020017f5068756467792050656e6775696e7300000000000000000000000000000000008152506040518060400160405280600881526020017f50485544474945530000000000000000000000000000000000000000000000008152508160009080519060200190620001c192919062000800565b508060019080519060200190620001da92919062000800565b505050620001fd620001f16200025660201b60201c565b6200025e60201b60201c565b6200023973cf541b1323c83d671009535815b9e92caa70e0176200022d60076200032460201b620014e31760201c565b6200033260201b60201c565b6200025060076200035860201b620014f11760201c565b62000d1a565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b620003548282604051806020016040528060008152506200036e60201b60201c565b5050565b6001816000016000828254019250508190555050565b620003808383620003dc60201b60201c565b620003956000848484620005c260201b60201c565b620003d7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003ce9062000a25565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200044f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004469062000a69565b60405180910390fd5b62000460816200077c60201b60201c565b15620004a3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200049a9062000a47565b60405180910390fd5b620004b760008383620007e860201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000509919062000ab8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000620005f08473ffffffffffffffffffffffffffffffffffffffff16620007ed60201b620015071760201c565b156200076f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620006226200025660201b60201c565b8786866040518563ffffffff1660e01b8152600401620006469493929190620009d1565b602060405180830381600087803b1580156200066157600080fd5b505af19250505080156200069557506040513d601f19601f82011682018060405250810190620006929190620008c7565b60015b6200071e573d8060008114620006c8576040519150601f19603f3d011682016040523d82523d6000602084013e620006cd565b606091505b5060008151141562000716576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200070d9062000a25565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505062000774565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b505050565b600080823b905060008111915050919050565b8280546200080e9062000bb5565b90600052602060002090601f0160209004810192826200083257600085556200087e565b82601f106200084d57805160ff19168380011785556200087e565b828001600101855582156200087e579182015b828111156200087d57825182559160200191906001019062000860565b5b5090506200088d919062000891565b5090565b5b80821115620008ac57600081600090555060010162000892565b5090565b600081519050620008c18162000d00565b92915050565b600060208284031215620008e057620008df62000c49565b5b6000620008f084828501620008b0565b91505092915050565b620009048162000b15565b82525050565b6000620009178262000a8b565b62000923818562000a96565b93506200093581856020860162000b7f565b620009408162000c4e565b840191505092915050565b60006200095a60328362000aa7565b9150620009678262000c5f565b604082019050919050565b600062000981601c8362000aa7565b91506200098e8262000cae565b602082019050919050565b6000620009a860208362000aa7565b9150620009b58262000cd7565b602082019050919050565b620009cb8162000b75565b82525050565b6000608082019050620009e86000830187620008f9565b620009f76020830186620008f9565b62000a066040830185620009c0565b818103606083015262000a1a81846200090a565b905095945050505050565b6000602082019050818103600083015262000a40816200094b565b9050919050565b6000602082019050818103600083015262000a628162000972565b9050919050565b6000602082019050818103600083015262000a848162000999565b9050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600062000ac58262000b75565b915062000ad28362000b75565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000b0a5762000b0962000beb565b5b828201905092915050565b600062000b228262000b55565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000b9f57808201518184015260208101905062000b82565b8381111562000baf576000848401525b50505050565b6000600282049050600182168062000bce57607f821691505b6020821081141562000be55762000be462000c1a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b62000d0b8162000b29565b811462000d1757600080fd5b50565b60805160601c60a05160601c60c05160601c61386962000d53600039600061092a015260006109d301526000610a7c01526138696000f3fe60806040526004361061012a5760003560e01c806370a08231116100ab578063b88d4fde1161006f578063b88d4fde146103bb578063c87b56dd146103e4578063e222c7f914610421578063e6f6ef1e14610438578063e985e9c514610463578063f2fde38b146104a05761012a565b806370a08231146102e8578063715018a6146103255780638da5cb5b1461033c57806395d89b4114610367578063a22cb465146103925761012a565b80632db11544116100f25780632db11544146102265780633ccfd60b1461024257806342842e0e1461025957806355f804b3146102825780636352211e146102ab5761012a565b806301ffc9a71461012f57806306fdde031461016c578063081812fc14610197578063095ea7b3146101d457806323b872dd146101fd575b600080fd5b34801561013b57600080fd5b5061015660048036038101906101519190612582565b6104c9565b6040516101639190612b43565b60405180910390f35b34801561017857600080fd5b506101816105ab565b60405161018e9190612b5e565b60405180910390f35b3480156101a357600080fd5b506101be60048036038101906101b99190612625565b61063d565b6040516101cb9190612adc565b60405180910390f35b3480156101e057600080fd5b506101fb60048036038101906101f69190612542565b6106c2565b005b34801561020957600080fd5b50610224600480360381019061021f919061242c565b6107da565b005b610240600480360381019061023b9190612625565b61083a565b005b34801561024e57600080fd5b50610257610dc7565b005b34801561026557600080fd5b50610280600480360381019061027b919061242c565b610e8c565b005b34801561028e57600080fd5b506102a960048036038101906102a491906125dc565b610eac565b005b3480156102b757600080fd5b506102d260048036038101906102cd9190612625565b610f42565b6040516102df9190612adc565b60405180910390f35b3480156102f457600080fd5b5061030f600480360381019061030a91906123bf565b610ff4565b60405161031c9190612e00565b60405180910390f35b34801561033157600080fd5b5061033a6110ac565b005b34801561034857600080fd5b50610351611134565b60405161035e9190612adc565b60405180910390f35b34801561037357600080fd5b5061037c61115e565b6040516103899190612b5e565b60405180910390f35b34801561039e57600080fd5b506103b960048036038101906103b49190612502565b6111f0565b005b3480156103c757600080fd5b506103e260048036038101906103dd919061247f565b611206565b005b3480156103f057600080fd5b5061040b60048036038101906104069190612625565b611268565b6040516104189190612b5e565b60405180910390f35b34801561042d57600080fd5b5061043661129c565b005b34801561044457600080fd5b5061044d611344565b60405161045a9190612b43565b60405180910390f35b34801561046f57600080fd5b5061048a600480360381019061048591906123ec565b611357565b6040516104979190612b43565b60405180910390f35b3480156104ac57600080fd5b506104c760048036038101906104c291906123bf565b6113eb565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061059457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105a457506105a38261151a565b5b9050919050565b6060600080546105ba906130c5565b80601f01602080910402602001604051908101604052809291908181526020018280546105e6906130c5565b80156106335780601f1061060857610100808354040283529160200191610633565b820191906000526020600020905b81548152906001019060200180831161061657829003601f168201915b5050505050905090565b600061064882611584565b610687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067e90612d00565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106cd82610f42565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561073e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073590612d80565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661075d6115f0565b73ffffffffffffffffffffffffffffffffffffffff16148061078c575061078b816107866115f0565b611357565b5b6107cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c290612c80565b60405180910390fd5b6107d583836115f8565b505050565b6107eb6107e56115f0565b826116b1565b61082a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082190612dc0565b60405180910390fd5b61083583838361178f565b505050565b600860009054906101000a900460ff16610889576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088090612da0565b60405180910390fd5b60148111156108cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c490612ba0565b60405180910390fd5b6122b8816108db60076114e3565b6108e59190612efa565b1115610926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091d90612d60565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016109819190612adc565b60206040518083038186803b15801561099957600080fd5b505afa1580156109ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d19190612652565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610a2a9190612adc565b60206040518083038186803b158015610a4257600080fd5b505afa158015610a56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7a9190612652565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610ad39190612adc565b60206040518083038186803b158015610aeb57600080fd5b505afa158015610aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b239190612652565b610b2d9190612efa565b610b379190612efa565b1115610bf1576108ae610b4a60076114e3565b10610ba8578066470de4df820000610b629190612f81565b3414610ba3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9a90612de0565b60405180910390fd5b610bec565b60003414610beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be290612b80565b60405180910390fd5b5b610d8a565b611a0a610bfe60076114e3565b10610c5c5780668e1bc9bf040000610c169190612f81565b3414610c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4e90612de0565b60405180910390fd5b610d89565b61115c610c6960076114e3565b10610cc75780666a94d74f430000610c819190612f81565b3414610cc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb990612de0565b60405180910390fd5b610d88565b6108ae610cd460076114e3565b10610d32578066470de4df820000610cec9190612f81565b3414610d2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2490612de0565b60405180910390fd5b610d87565b80662386f26fc10000610d459190612f81565b3414610d86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7d90612de0565b60405180910390fd5b5b5b5b5b60005b81811015610dc357610da833610da360076114e3565b6119eb565b610db260076114f1565b80610dbc90613128565b9050610d8d565b5050565b610dcf6115f0565b73ffffffffffffffffffffffffffffffffffffffff16610ded611134565b73ffffffffffffffffffffffffffffffffffffffff1614610e43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3a90612d20565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610e89573d6000803e3d6000fd5b50565b610ea783838360405180602001604052806000815250611206565b505050565b610eb46115f0565b73ffffffffffffffffffffffffffffffffffffffff16610ed2611134565b73ffffffffffffffffffffffffffffffffffffffff1614610f28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1f90612d20565b60405180910390fd5b8060099080519060200190610f3e9291906121be565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe290612cc0565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611065576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105c90612ca0565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110b46115f0565b73ffffffffffffffffffffffffffffffffffffffff166110d2611134565b73ffffffffffffffffffffffffffffffffffffffff1614611128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111f90612d20565b60405180910390fd5b6111326000611a09565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461116d906130c5565b80601f0160208091040260200160405190810160405280929190818152602001828054611199906130c5565b80156111e65780601f106111bb576101008083540402835291602001916111e6565b820191906000526020600020905b8154815290600101906020018083116111c957829003601f168201915b5050505050905090565b6112026111fb6115f0565b8383611acf565b5050565b6112176112116115f0565b836116b1565b611256576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124d90612dc0565b60405180910390fd5b61126284848484611c3c565b50505050565b6060600961127583611c98565b604051602001611286929190612aad565b6040516020818303038152906040529050919050565b6112a46115f0565b73ffffffffffffffffffffffffffffffffffffffff166112c2611134565b73ffffffffffffffffffffffffffffffffffffffff1614611318576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130f90612d20565b60405180910390fd5b600860009054906101000a900460ff1615600860006101000a81548160ff021916908315150217905550565b600860009054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6113f36115f0565b73ffffffffffffffffffffffffffffffffffffffff16611411611134565b73ffffffffffffffffffffffffffffffffffffffff1614611467576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145e90612d20565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ce90612be0565b60405180910390fd5b6114e081611a09565b50565b600081600001549050919050565b6001816000016000828254019250508190555050565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661166b83610f42565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006116bc82611584565b6116fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f290612c60565b60405180910390fd5b600061170683610f42565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061177557508373ffffffffffffffffffffffffffffffffffffffff1661175d8461063d565b73ffffffffffffffffffffffffffffffffffffffff16145b8061178657506117858185611357565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166117af82610f42565b73ffffffffffffffffffffffffffffffffffffffff1614611805576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fc90612d40565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611875576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186c90612c20565b60405180910390fd5b611880838383611df9565b61188b6000826115f8565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118db9190612fdb565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119329190612efa565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611a05828260405180602001604052806000815250611dfe565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611b3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3590612c40565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c2f9190612b43565b60405180910390a3505050565b611c4784848461178f565b611c5384848484611e59565b611c92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8990612bc0565b60405180910390fd5b50505050565b60606000821415611ce0576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611df4565b600082905060005b60008214611d12578080611cfb90613128565b915050600a82611d0b9190612f50565b9150611ce8565b60008167ffffffffffffffff811115611d2e57611d2d61325e565b5b6040519080825280601f01601f191660200182016040528015611d605781602001600182028036833780820191505090505b5090505b60008514611ded57600182611d799190612fdb565b9150600a85611d889190613171565b6030611d949190612efa565b60f81b818381518110611daa57611da961322f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611de69190612f50565b9450611d64565b8093505050505b919050565b505050565b611e088383611ff0565b611e156000848484611e59565b611e54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4b90612bc0565b60405180910390fd5b505050565b6000611e7a8473ffffffffffffffffffffffffffffffffffffffff16611507565b15611fe3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611ea36115f0565b8786866040518563ffffffff1660e01b8152600401611ec59493929190612af7565b602060405180830381600087803b158015611edf57600080fd5b505af1925050508015611f1057506040513d601f19601f82011682018060405250810190611f0d91906125af565b60015b611f93573d8060008114611f40576040519150601f19603f3d011682016040523d82523d6000602084013e611f45565b606091505b50600081511415611f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8290612bc0565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611fe8565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612060576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205790612ce0565b60405180910390fd5b61206981611584565b156120a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a090612c00565b60405180910390fd5b6120b560008383611df9565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121059190612efa565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546121ca906130c5565b90600052602060002090601f0160209004810192826121ec5760008555612233565b82601f1061220557805160ff1916838001178555612233565b82800160010185558215612233579182015b82811115612232578251825591602001919060010190612217565b5b5090506122409190612244565b5090565b5b8082111561225d576000816000905550600101612245565b5090565b600061227461226f84612e40565b612e1b565b9050828152602081018484840111156122905761228f613292565b5b61229b848285613083565b509392505050565b60006122b66122b184612e71565b612e1b565b9050828152602081018484840111156122d2576122d1613292565b5b6122dd848285613083565b509392505050565b6000813590506122f4816137d7565b92915050565b600081359050612309816137ee565b92915050565b60008135905061231e81613805565b92915050565b60008151905061233381613805565b92915050565b600082601f83011261234e5761234d61328d565b5b813561235e848260208601612261565b91505092915050565b600082601f83011261237c5761237b61328d565b5b813561238c8482602086016122a3565b91505092915050565b6000813590506123a48161381c565b92915050565b6000815190506123b98161381c565b92915050565b6000602082840312156123d5576123d461329c565b5b60006123e3848285016122e5565b91505092915050565b600080604083850312156124035761240261329c565b5b6000612411858286016122e5565b9250506020612422858286016122e5565b9150509250929050565b6000806000606084860312156124455761244461329c565b5b6000612453868287016122e5565b9350506020612464868287016122e5565b925050604061247586828701612395565b9150509250925092565b600080600080608085870312156124995761249861329c565b5b60006124a7878288016122e5565b94505060206124b8878288016122e5565b93505060406124c987828801612395565b925050606085013567ffffffffffffffff8111156124ea576124e9613297565b5b6124f687828801612339565b91505092959194509250565b600080604083850312156125195761251861329c565b5b6000612527858286016122e5565b9250506020612538858286016122fa565b9150509250929050565b600080604083850312156125595761255861329c565b5b6000612567858286016122e5565b925050602061257885828601612395565b9150509250929050565b6000602082840312156125985761259761329c565b5b60006125a68482850161230f565b91505092915050565b6000602082840312156125c5576125c461329c565b5b60006125d384828501612324565b91505092915050565b6000602082840312156125f2576125f161329c565b5b600082013567ffffffffffffffff8111156126105761260f613297565b5b61261c84828501612367565b91505092915050565b60006020828403121561263b5761263a61329c565b5b600061264984828501612395565b91505092915050565b6000602082840312156126685761266761329c565b5b6000612676848285016123aa565b91505092915050565b6126888161300f565b82525050565b61269781613021565b82525050565b60006126a882612eb7565b6126b28185612ecd565b93506126c2818560208601613092565b6126cb816132a1565b840191505092915050565b60006126e182612ec2565b6126eb8185612ede565b93506126fb818560208601613092565b612704816132a1565b840191505092915050565b600061271a82612ec2565b6127248185612eef565b9350612734818560208601613092565b80840191505092915050565b6000815461274d816130c5565b6127578186612eef565b945060018216600081146127725760018114612783576127b6565b60ff198316865281860193506127b6565b61278c85612ea2565b60005b838110156127ae5781548189015260018201915060208101905061278f565b838801955050505b50505092915050565b60006127cc601083612ede565b91506127d7826132b2565b602082019050919050565b60006127ef602c83612ede565b91506127fa826132db565b604082019050919050565b6000612812603283612ede565b915061281d8261332a565b604082019050919050565b6000612835602683612ede565b915061284082613379565b604082019050919050565b6000612858601c83612ede565b9150612863826133c8565b602082019050919050565b600061287b602483612ede565b9150612886826133f1565b604082019050919050565b600061289e601983612ede565b91506128a982613440565b602082019050919050565b60006128c1602c83612ede565b91506128cc82613469565b604082019050919050565b60006128e4603883612ede565b91506128ef826134b8565b604082019050919050565b6000612907602a83612ede565b915061291282613507565b604082019050919050565b600061292a602983612ede565b915061293582613556565b604082019050919050565b600061294d602083612ede565b9150612958826135a5565b602082019050919050565b6000612970602c83612ede565b915061297b826135ce565b604082019050919050565b6000612993600583612eef565b915061299e8261361d565b600582019050919050565b60006129b6602083612ede565b91506129c182613646565b602082019050919050565b60006129d9602983612ede565b91506129e48261366f565b604082019050919050565b60006129fc601e83612ede565b9150612a07826136be565b602082019050919050565b6000612a1f602183612ede565b9150612a2a826136e7565b604082019050919050565b6000612a42601a83612ede565b9150612a4d82613736565b602082019050919050565b6000612a65603183612ede565b9150612a708261375f565b604082019050919050565b6000612a88601a83612ede565b9150612a93826137ae565b602082019050919050565b612aa781613079565b82525050565b6000612ab98285612740565b9150612ac5828461270f565b9150612ad082612986565b91508190509392505050565b6000602082019050612af1600083018461267f565b92915050565b6000608082019050612b0c600083018761267f565b612b19602083018661267f565b612b266040830185612a9e565b8181036060830152612b38818461269d565b905095945050505050565b6000602082019050612b58600083018461268e565b92915050565b60006020820190508181036000830152612b7881846126d6565b905092915050565b60006020820190508181036000830152612b99816127bf565b9050919050565b60006020820190508181036000830152612bb9816127e2565b9050919050565b60006020820190508181036000830152612bd981612805565b9050919050565b60006020820190508181036000830152612bf981612828565b9050919050565b60006020820190508181036000830152612c198161284b565b9050919050565b60006020820190508181036000830152612c398161286e565b9050919050565b60006020820190508181036000830152612c5981612891565b9050919050565b60006020820190508181036000830152612c79816128b4565b9050919050565b60006020820190508181036000830152612c99816128d7565b9050919050565b60006020820190508181036000830152612cb9816128fa565b9050919050565b60006020820190508181036000830152612cd98161291d565b9050919050565b60006020820190508181036000830152612cf981612940565b9050919050565b60006020820190508181036000830152612d1981612963565b9050919050565b60006020820190508181036000830152612d39816129a9565b9050919050565b60006020820190508181036000830152612d59816129cc565b9050919050565b60006020820190508181036000830152612d79816129ef565b9050919050565b60006020820190508181036000830152612d9981612a12565b9050919050565b60006020820190508181036000830152612db981612a35565b9050919050565b60006020820190508181036000830152612dd981612a58565b9050919050565b60006020820190508181036000830152612df981612a7b565b9050919050565b6000602082019050612e156000830184612a9e565b92915050565b6000612e25612e36565b9050612e3182826130f7565b919050565b6000604051905090565b600067ffffffffffffffff821115612e5b57612e5a61325e565b5b612e64826132a1565b9050602081019050919050565b600067ffffffffffffffff821115612e8c57612e8b61325e565b5b612e95826132a1565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612f0582613079565b9150612f1083613079565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612f4557612f446131a2565b5b828201905092915050565b6000612f5b82613079565b9150612f6683613079565b925082612f7657612f756131d1565b5b828204905092915050565b6000612f8c82613079565b9150612f9783613079565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612fd057612fcf6131a2565b5b828202905092915050565b6000612fe682613079565b9150612ff183613079565b925082821015613004576130036131a2565b5b828203905092915050565b600061301a82613059565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156130b0578082015181840152602081019050613095565b838111156130bf576000848401525b50505050565b600060028204905060018216806130dd57607f821691505b602082108114156130f1576130f0613200565b5b50919050565b613100826132a1565b810181811067ffffffffffffffff8211171561311f5761311e61325e565b5b80604052505050565b600061313382613079565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613166576131656131a2565b5b600182019050919050565b600061317c82613079565b915061318783613079565b925082613197576131966131d1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f42726f206974277320667265652e2e2e00000000000000000000000000000000600082015250565b7f496e76616c6964206e756d626572206f6620746f6b656e73207175657269657360008201527f20666f72206d696e74696e670000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820746f6b656e73206c65667420746f206d696e740000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f5075626c69632073616c65206973206e6f742072756e6e696e67000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f496e636f7272656374204554482073656e7420746f206d696e74000000000000600082015250565b6137e08161300f565b81146137eb57600080fd5b50565b6137f781613021565b811461380257600080fd5b50565b61380e8161302d565b811461381957600080fd5b50565b61382581613079565b811461383057600080fd5b5056fea2646970667358221220ec2b6bb3b57776fe1ab585894e0d80b65adb8850c1a3536ba8012505c5c04fcd64736f6c6343000807003368747470733a2f2f697066732e696f2f697066732f516d54674351744c394565633475777533744a616a57536d454a6a4335414b763151436b46723333694b6d3263332f

Deployed Bytecode

0x60806040526004361061012a5760003560e01c806370a08231116100ab578063b88d4fde1161006f578063b88d4fde146103bb578063c87b56dd146103e4578063e222c7f914610421578063e6f6ef1e14610438578063e985e9c514610463578063f2fde38b146104a05761012a565b806370a08231146102e8578063715018a6146103255780638da5cb5b1461033c57806395d89b4114610367578063a22cb465146103925761012a565b80632db11544116100f25780632db11544146102265780633ccfd60b1461024257806342842e0e1461025957806355f804b3146102825780636352211e146102ab5761012a565b806301ffc9a71461012f57806306fdde031461016c578063081812fc14610197578063095ea7b3146101d457806323b872dd146101fd575b600080fd5b34801561013b57600080fd5b5061015660048036038101906101519190612582565b6104c9565b6040516101639190612b43565b60405180910390f35b34801561017857600080fd5b506101816105ab565b60405161018e9190612b5e565b60405180910390f35b3480156101a357600080fd5b506101be60048036038101906101b99190612625565b61063d565b6040516101cb9190612adc565b60405180910390f35b3480156101e057600080fd5b506101fb60048036038101906101f69190612542565b6106c2565b005b34801561020957600080fd5b50610224600480360381019061021f919061242c565b6107da565b005b610240600480360381019061023b9190612625565b61083a565b005b34801561024e57600080fd5b50610257610dc7565b005b34801561026557600080fd5b50610280600480360381019061027b919061242c565b610e8c565b005b34801561028e57600080fd5b506102a960048036038101906102a491906125dc565b610eac565b005b3480156102b757600080fd5b506102d260048036038101906102cd9190612625565b610f42565b6040516102df9190612adc565b60405180910390f35b3480156102f457600080fd5b5061030f600480360381019061030a91906123bf565b610ff4565b60405161031c9190612e00565b60405180910390f35b34801561033157600080fd5b5061033a6110ac565b005b34801561034857600080fd5b50610351611134565b60405161035e9190612adc565b60405180910390f35b34801561037357600080fd5b5061037c61115e565b6040516103899190612b5e565b60405180910390f35b34801561039e57600080fd5b506103b960048036038101906103b49190612502565b6111f0565b005b3480156103c757600080fd5b506103e260048036038101906103dd919061247f565b611206565b005b3480156103f057600080fd5b5061040b60048036038101906104069190612625565b611268565b6040516104189190612b5e565b60405180910390f35b34801561042d57600080fd5b5061043661129c565b005b34801561044457600080fd5b5061044d611344565b60405161045a9190612b43565b60405180910390f35b34801561046f57600080fd5b5061048a600480360381019061048591906123ec565b611357565b6040516104979190612b43565b60405180910390f35b3480156104ac57600080fd5b506104c760048036038101906104c291906123bf565b6113eb565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061059457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105a457506105a38261151a565b5b9050919050565b6060600080546105ba906130c5565b80601f01602080910402602001604051908101604052809291908181526020018280546105e6906130c5565b80156106335780601f1061060857610100808354040283529160200191610633565b820191906000526020600020905b81548152906001019060200180831161061657829003601f168201915b5050505050905090565b600061064882611584565b610687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067e90612d00565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106cd82610f42565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561073e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073590612d80565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661075d6115f0565b73ffffffffffffffffffffffffffffffffffffffff16148061078c575061078b816107866115f0565b611357565b5b6107cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c290612c80565b60405180910390fd5b6107d583836115f8565b505050565b6107eb6107e56115f0565b826116b1565b61082a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082190612dc0565b60405180910390fd5b61083583838361178f565b505050565b600860009054906101000a900460ff16610889576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088090612da0565b60405180910390fd5b60148111156108cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c490612ba0565b60405180910390fd5b6122b8816108db60076114e3565b6108e59190612efa565b1115610926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091d90612d60565b60405180910390fd5b60007f000000000000000000000000cb88735a1eae17ff2a2abaec1ba03d877f4bc05573ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016109819190612adc565b60206040518083038186803b15801561099957600080fd5b505afa1580156109ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d19190612652565b7f000000000000000000000000bd3531da5cf5857e7cfaa92426877b022e612cf873ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610a2a9190612adc565b60206040518083038186803b158015610a4257600080fd5b505afa158015610a56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7a9190612652565b7f000000000000000000000000f07468ead8cf26c752c676e43c814fee9c8cf40273ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610ad39190612adc565b60206040518083038186803b158015610aeb57600080fd5b505afa158015610aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b239190612652565b610b2d9190612efa565b610b379190612efa565b1115610bf1576108ae610b4a60076114e3565b10610ba8578066470de4df820000610b629190612f81565b3414610ba3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9a90612de0565b60405180910390fd5b610bec565b60003414610beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be290612b80565b60405180910390fd5b5b610d8a565b611a0a610bfe60076114e3565b10610c5c5780668e1bc9bf040000610c169190612f81565b3414610c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4e90612de0565b60405180910390fd5b610d89565b61115c610c6960076114e3565b10610cc75780666a94d74f430000610c819190612f81565b3414610cc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb990612de0565b60405180910390fd5b610d88565b6108ae610cd460076114e3565b10610d32578066470de4df820000610cec9190612f81565b3414610d2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2490612de0565b60405180910390fd5b610d87565b80662386f26fc10000610d459190612f81565b3414610d86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7d90612de0565b60405180910390fd5b5b5b5b5b60005b81811015610dc357610da833610da360076114e3565b6119eb565b610db260076114f1565b80610dbc90613128565b9050610d8d565b5050565b610dcf6115f0565b73ffffffffffffffffffffffffffffffffffffffff16610ded611134565b73ffffffffffffffffffffffffffffffffffffffff1614610e43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3a90612d20565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610e89573d6000803e3d6000fd5b50565b610ea783838360405180602001604052806000815250611206565b505050565b610eb46115f0565b73ffffffffffffffffffffffffffffffffffffffff16610ed2611134565b73ffffffffffffffffffffffffffffffffffffffff1614610f28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1f90612d20565b60405180910390fd5b8060099080519060200190610f3e9291906121be565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe290612cc0565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611065576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105c90612ca0565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110b46115f0565b73ffffffffffffffffffffffffffffffffffffffff166110d2611134565b73ffffffffffffffffffffffffffffffffffffffff1614611128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111f90612d20565b60405180910390fd5b6111326000611a09565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461116d906130c5565b80601f0160208091040260200160405190810160405280929190818152602001828054611199906130c5565b80156111e65780601f106111bb576101008083540402835291602001916111e6565b820191906000526020600020905b8154815290600101906020018083116111c957829003601f168201915b5050505050905090565b6112026111fb6115f0565b8383611acf565b5050565b6112176112116115f0565b836116b1565b611256576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124d90612dc0565b60405180910390fd5b61126284848484611c3c565b50505050565b6060600961127583611c98565b604051602001611286929190612aad565b6040516020818303038152906040529050919050565b6112a46115f0565b73ffffffffffffffffffffffffffffffffffffffff166112c2611134565b73ffffffffffffffffffffffffffffffffffffffff1614611318576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130f90612d20565b60405180910390fd5b600860009054906101000a900460ff1615600860006101000a81548160ff021916908315150217905550565b600860009054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6113f36115f0565b73ffffffffffffffffffffffffffffffffffffffff16611411611134565b73ffffffffffffffffffffffffffffffffffffffff1614611467576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145e90612d20565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ce90612be0565b60405180910390fd5b6114e081611a09565b50565b600081600001549050919050565b6001816000016000828254019250508190555050565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661166b83610f42565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006116bc82611584565b6116fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f290612c60565b60405180910390fd5b600061170683610f42565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061177557508373ffffffffffffffffffffffffffffffffffffffff1661175d8461063d565b73ffffffffffffffffffffffffffffffffffffffff16145b8061178657506117858185611357565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166117af82610f42565b73ffffffffffffffffffffffffffffffffffffffff1614611805576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fc90612d40565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611875576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186c90612c20565b60405180910390fd5b611880838383611df9565b61188b6000826115f8565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118db9190612fdb565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119329190612efa565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611a05828260405180602001604052806000815250611dfe565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611b3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3590612c40565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c2f9190612b43565b60405180910390a3505050565b611c4784848461178f565b611c5384848484611e59565b611c92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8990612bc0565b60405180910390fd5b50505050565b60606000821415611ce0576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611df4565b600082905060005b60008214611d12578080611cfb90613128565b915050600a82611d0b9190612f50565b9150611ce8565b60008167ffffffffffffffff811115611d2e57611d2d61325e565b5b6040519080825280601f01601f191660200182016040528015611d605781602001600182028036833780820191505090505b5090505b60008514611ded57600182611d799190612fdb565b9150600a85611d889190613171565b6030611d949190612efa565b60f81b818381518110611daa57611da961322f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611de69190612f50565b9450611d64565b8093505050505b919050565b505050565b611e088383611ff0565b611e156000848484611e59565b611e54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4b90612bc0565b60405180910390fd5b505050565b6000611e7a8473ffffffffffffffffffffffffffffffffffffffff16611507565b15611fe3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611ea36115f0565b8786866040518563ffffffff1660e01b8152600401611ec59493929190612af7565b602060405180830381600087803b158015611edf57600080fd5b505af1925050508015611f1057506040513d601f19601f82011682018060405250810190611f0d91906125af565b60015b611f93573d8060008114611f40576040519150601f19603f3d011682016040523d82523d6000602084013e611f45565b606091505b50600081511415611f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8290612bc0565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611fe8565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612060576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205790612ce0565b60405180910390fd5b61206981611584565b156120a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a090612c00565b60405180910390fd5b6120b560008383611df9565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121059190612efa565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546121ca906130c5565b90600052602060002090601f0160209004810192826121ec5760008555612233565b82601f1061220557805160ff1916838001178555612233565b82800160010185558215612233579182015b82811115612232578251825591602001919060010190612217565b5b5090506122409190612244565b5090565b5b8082111561225d576000816000905550600101612245565b5090565b600061227461226f84612e40565b612e1b565b9050828152602081018484840111156122905761228f613292565b5b61229b848285613083565b509392505050565b60006122b66122b184612e71565b612e1b565b9050828152602081018484840111156122d2576122d1613292565b5b6122dd848285613083565b509392505050565b6000813590506122f4816137d7565b92915050565b600081359050612309816137ee565b92915050565b60008135905061231e81613805565b92915050565b60008151905061233381613805565b92915050565b600082601f83011261234e5761234d61328d565b5b813561235e848260208601612261565b91505092915050565b600082601f83011261237c5761237b61328d565b5b813561238c8482602086016122a3565b91505092915050565b6000813590506123a48161381c565b92915050565b6000815190506123b98161381c565b92915050565b6000602082840312156123d5576123d461329c565b5b60006123e3848285016122e5565b91505092915050565b600080604083850312156124035761240261329c565b5b6000612411858286016122e5565b9250506020612422858286016122e5565b9150509250929050565b6000806000606084860312156124455761244461329c565b5b6000612453868287016122e5565b9350506020612464868287016122e5565b925050604061247586828701612395565b9150509250925092565b600080600080608085870312156124995761249861329c565b5b60006124a7878288016122e5565b94505060206124b8878288016122e5565b93505060406124c987828801612395565b925050606085013567ffffffffffffffff8111156124ea576124e9613297565b5b6124f687828801612339565b91505092959194509250565b600080604083850312156125195761251861329c565b5b6000612527858286016122e5565b9250506020612538858286016122fa565b9150509250929050565b600080604083850312156125595761255861329c565b5b6000612567858286016122e5565b925050602061257885828601612395565b9150509250929050565b6000602082840312156125985761259761329c565b5b60006125a68482850161230f565b91505092915050565b6000602082840312156125c5576125c461329c565b5b60006125d384828501612324565b91505092915050565b6000602082840312156125f2576125f161329c565b5b600082013567ffffffffffffffff8111156126105761260f613297565b5b61261c84828501612367565b91505092915050565b60006020828403121561263b5761263a61329c565b5b600061264984828501612395565b91505092915050565b6000602082840312156126685761266761329c565b5b6000612676848285016123aa565b91505092915050565b6126888161300f565b82525050565b61269781613021565b82525050565b60006126a882612eb7565b6126b28185612ecd565b93506126c2818560208601613092565b6126cb816132a1565b840191505092915050565b60006126e182612ec2565b6126eb8185612ede565b93506126fb818560208601613092565b612704816132a1565b840191505092915050565b600061271a82612ec2565b6127248185612eef565b9350612734818560208601613092565b80840191505092915050565b6000815461274d816130c5565b6127578186612eef565b945060018216600081146127725760018114612783576127b6565b60ff198316865281860193506127b6565b61278c85612ea2565b60005b838110156127ae5781548189015260018201915060208101905061278f565b838801955050505b50505092915050565b60006127cc601083612ede565b91506127d7826132b2565b602082019050919050565b60006127ef602c83612ede565b91506127fa826132db565b604082019050919050565b6000612812603283612ede565b915061281d8261332a565b604082019050919050565b6000612835602683612ede565b915061284082613379565b604082019050919050565b6000612858601c83612ede565b9150612863826133c8565b602082019050919050565b600061287b602483612ede565b9150612886826133f1565b604082019050919050565b600061289e601983612ede565b91506128a982613440565b602082019050919050565b60006128c1602c83612ede565b91506128cc82613469565b604082019050919050565b60006128e4603883612ede565b91506128ef826134b8565b604082019050919050565b6000612907602a83612ede565b915061291282613507565b604082019050919050565b600061292a602983612ede565b915061293582613556565b604082019050919050565b600061294d602083612ede565b9150612958826135a5565b602082019050919050565b6000612970602c83612ede565b915061297b826135ce565b604082019050919050565b6000612993600583612eef565b915061299e8261361d565b600582019050919050565b60006129b6602083612ede565b91506129c182613646565b602082019050919050565b60006129d9602983612ede565b91506129e48261366f565b604082019050919050565b60006129fc601e83612ede565b9150612a07826136be565b602082019050919050565b6000612a1f602183612ede565b9150612a2a826136e7565b604082019050919050565b6000612a42601a83612ede565b9150612a4d82613736565b602082019050919050565b6000612a65603183612ede565b9150612a708261375f565b604082019050919050565b6000612a88601a83612ede565b9150612a93826137ae565b602082019050919050565b612aa781613079565b82525050565b6000612ab98285612740565b9150612ac5828461270f565b9150612ad082612986565b91508190509392505050565b6000602082019050612af1600083018461267f565b92915050565b6000608082019050612b0c600083018761267f565b612b19602083018661267f565b612b266040830185612a9e565b8181036060830152612b38818461269d565b905095945050505050565b6000602082019050612b58600083018461268e565b92915050565b60006020820190508181036000830152612b7881846126d6565b905092915050565b60006020820190508181036000830152612b99816127bf565b9050919050565b60006020820190508181036000830152612bb9816127e2565b9050919050565b60006020820190508181036000830152612bd981612805565b9050919050565b60006020820190508181036000830152612bf981612828565b9050919050565b60006020820190508181036000830152612c198161284b565b9050919050565b60006020820190508181036000830152612c398161286e565b9050919050565b60006020820190508181036000830152612c5981612891565b9050919050565b60006020820190508181036000830152612c79816128b4565b9050919050565b60006020820190508181036000830152612c99816128d7565b9050919050565b60006020820190508181036000830152612cb9816128fa565b9050919050565b60006020820190508181036000830152612cd98161291d565b9050919050565b60006020820190508181036000830152612cf981612940565b9050919050565b60006020820190508181036000830152612d1981612963565b9050919050565b60006020820190508181036000830152612d39816129a9565b9050919050565b60006020820190508181036000830152612d59816129cc565b9050919050565b60006020820190508181036000830152612d79816129ef565b9050919050565b60006020820190508181036000830152612d9981612a12565b9050919050565b60006020820190508181036000830152612db981612a35565b9050919050565b60006020820190508181036000830152612dd981612a58565b9050919050565b60006020820190508181036000830152612df981612a7b565b9050919050565b6000602082019050612e156000830184612a9e565b92915050565b6000612e25612e36565b9050612e3182826130f7565b919050565b6000604051905090565b600067ffffffffffffffff821115612e5b57612e5a61325e565b5b612e64826132a1565b9050602081019050919050565b600067ffffffffffffffff821115612e8c57612e8b61325e565b5b612e95826132a1565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612f0582613079565b9150612f1083613079565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612f4557612f446131a2565b5b828201905092915050565b6000612f5b82613079565b9150612f6683613079565b925082612f7657612f756131d1565b5b828204905092915050565b6000612f8c82613079565b9150612f9783613079565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612fd057612fcf6131a2565b5b828202905092915050565b6000612fe682613079565b9150612ff183613079565b925082821015613004576130036131a2565b5b828203905092915050565b600061301a82613059565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156130b0578082015181840152602081019050613095565b838111156130bf576000848401525b50505050565b600060028204905060018216806130dd57607f821691505b602082108114156130f1576130f0613200565b5b50919050565b613100826132a1565b810181811067ffffffffffffffff8211171561311f5761311e61325e565b5b80604052505050565b600061313382613079565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613166576131656131a2565b5b600182019050919050565b600061317c82613079565b915061318783613079565b925082613197576131966131d1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f42726f206974277320667265652e2e2e00000000000000000000000000000000600082015250565b7f496e76616c6964206e756d626572206f6620746f6b656e73207175657269657360008201527f20666f72206d696e74696e670000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820746f6b656e73206c65667420746f206d696e740000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f5075626c69632073616c65206973206e6f742072756e6e696e67000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f496e636f7272656374204554482073656e7420746f206d696e74000000000000600082015250565b6137e08161300f565b81146137eb57600080fd5b50565b6137f781613021565b811461380257600080fd5b50565b61380e8161302d565b811461381957600080fd5b50565b61382581613079565b811461383057600080fd5b5056fea2646970667358221220ec2b6bb3b57776fe1ab585894e0d80b65adb8850c1a3536ba8012505c5c04fcd64736f6c63430008070033

Deployed Bytecode Sourcemap

177:2740:11:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1500:300:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2418:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3929:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3467:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4656:330;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1263:1423:11;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2808:107;;;;;;;;;;;;;:::i;:::-;;5052:179:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;972:97:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2121:235:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1859:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1661:101:9;;;;;;;;;;;;;:::i;:::-;;1029:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2580:102:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4213:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5297:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1079:175:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2692:106;;;;;;;;;;;;;:::i;:::-;;346:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4432:162:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1911:198:9;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1500:300:4;1602:4;1652:25;1637:40;;;:11;:40;;;;:104;;;;1708:33;1693:48;;;:11;:48;;;;1637:104;:156;;;;1757:36;1781:11;1757:23;:36::i;:::-;1637:156;1618:175;;1500:300;;;:::o;2418:98::-;2472:13;2504:5;2497:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2418:98;:::o;3929:217::-;4005:7;4032:16;4040:7;4032;:16::i;:::-;4024:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4115:15;:24;4131:7;4115:24;;;;;;;;;;;;;;;;;;;;;4108:31;;3929:217;;;:::o;3467:401::-;3547:13;3563:23;3578:7;3563:14;:23::i;:::-;3547:39;;3610:5;3604:11;;:2;:11;;;;3596:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3701:5;3685:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3710:37;3727:5;3734:12;:10;:12::i;:::-;3710:16;:37::i;:::-;3685:62;3664:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;3840:21;3849:2;3853:7;3840:8;:21::i;:::-;3537:331;3467:401;;:::o;4656:330::-;4845:41;4864:12;:10;:12::i;:::-;4878:7;4845:18;:41::i;:::-;4837:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;4951:28;4961:4;4967:2;4971:7;4951:9;:28::i;:::-;4656:330;;;:::o;1263:1423:11:-;1334:19;;;;;;;;;;;1326:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;1415:2;1402:9;:15;;1394:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;1522:4;1509:9;1484:22;:12;:20;:22::i;:::-;:34;;;;:::i;:::-;:42;;1476:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;1675:1;1645:5;:15;;;1661:10;1645:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1607:13;:23;;;1631:10;1607:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1576:6;:16;;;1593:10;1576:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:66;;;;:::i;:::-;:96;;;;:::i;:::-;:100;1572:939;;;1722:4;1696:22;:12;:20;:22::i;:::-;:30;1692:225;;1780:9;1767:10;:22;;;;:::i;:::-;1754:9;:35;1746:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;1692:225;;;1880:1;1867:9;:14;1859:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;1692:225;1572:939;;;1977:4;1951:22;:12;:20;:22::i;:::-;:30;1947:554;;2035:9;2022:10;:22;;;;:::i;:::-;2009:9;:35;2001:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;1947:554;;;2126:4;2100:22;:12;:20;:22::i;:::-;:30;2096:405;;2184:9;2171:10;:22;;;;:::i;:::-;2158:9;:35;2150:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2096:405;;;2275:4;2249:22;:12;:20;:22::i;:::-;:30;2245:256;;2333:9;2320:10;:22;;;;:::i;:::-;2307:9;:35;2299:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2245:256;;;2446:9;2433:10;:22;;;;:::i;:::-;2420:9;:35;2412:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2245:256;2096:405;1947:554;1572:939;2540:6;2535:145;2556:9;2552:1;:13;2535:145;;;2586:45;2596:10;2608:22;:12;:20;:22::i;:::-;2586:9;:45::i;:::-;2645:24;:12;:22;:24::i;:::-;2567:3;;;;:::i;:::-;;;2535:145;;;;1263:1423;:::o;2808:107::-;1252:12:9;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2865:10:11::1;2857:28;;:51;2886:21;2857:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;2808:107::o:0;5052:179:4:-;5185:39;5202:4;5208:2;5212:7;5185:39;;;;;;;;;;;;:16;:39::i;:::-;5052:179;;;:::o;972:97:11:-;1252:12:9;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1055:7:11::1;1044:8;:18;;;;;;;;;;;;:::i;:::-;;972:97:::0;:::o;2121:235:4:-;2193:7;2212:13;2228:7;:16;2236:7;2228:16;;;;;;;;;;;;;;;;;;;;;2212:32;;2279:1;2262:19;;:5;:19;;;;2254:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2344:5;2337:12;;;2121:235;;;:::o;1859:205::-;1931:7;1975:1;1958:19;;:5;:19;;;;1950:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2041:9;:16;2051:5;2041:16;;;;;;;;;;;;;;;;2034:23;;1859:205;;;:::o;1661:101:9:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;1029:85::-;1075:7;1101:6;;;;;;;;;;;1094:13;;1029:85;:::o;2580:102:4:-;2636:13;2668:7;2661:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2580:102;:::o;4213:153::-;4307:52;4326:12;:10;:12::i;:::-;4340:8;4350;4307:18;:52::i;:::-;4213:153;;:::o;5297:320::-;5466:41;5485:12;:10;:12::i;:::-;5499:7;5466:18;:41::i;:::-;5458:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5571:39;5585:4;5591:2;5595:7;5604:5;5571:13;:39::i;:::-;5297:320;;;;:::o;1079:175:11:-;1152:13;1208:8;1218:18;:7;:16;:18::i;:::-;1191:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1177:70;;1079:175;;;:::o;2692:106::-;1252:12:9;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2772:19:11::1;;;;;;;;;;;2771:20;2749:19;;:42;;;;;;;;;;;;;;;;;;2692:106::o:0;346:39::-;;;;;;;;;;;;;:::o;4432:162:4:-;4529:4;4552:18;:25;4571:5;4552:25;;;;;;;;;;;;;;;:35;4578:8;4552:35;;;;;;;;;;;;;;;;;;;;;;;;;4545:42;;4432:162;;;;:::o;1911:198:9:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2019:1:::1;1999:22;;:8;:22;;;;1991:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;827:112:2:-;892:7;918;:14;;;911:21;;827:112;;;:::o;945:123::-;1050:1;1032:7;:14;;;:19;;;;;;;;;;;945:123;:::o;771:377:0:-;831:4;1034:12;1099:7;1087:20;1079:28;;1140:1;1133:4;:8;1126:15;;;771:377;;;:::o;829:155:3:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;7089:125:4:-;7154:4;7205:1;7177:30;;:7;:16;7185:7;7177:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7170:37;;7089:125;;;:::o;640:96:1:-;693:7;719:10;712:17;;640:96;:::o;10940:171:4:-;11041:2;11014:15;:24;11030:7;11014:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11096:7;11092:2;11058:46;;11067:23;11082:7;11067:14;:23::i;:::-;11058:46;;;;;;;;;;;;10940:171;;:::o;7372:344::-;7465:4;7489:16;7497:7;7489;:16::i;:::-;7481:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7564:13;7580:23;7595:7;7580:14;:23::i;:::-;7564:39;;7632:5;7621:16;;:7;:16;;;:51;;;;7665:7;7641:31;;:20;7653:7;7641:11;:20::i;:::-;:31;;;7621:51;:87;;;;7676:32;7693:5;7700:7;7676:16;:32::i;:::-;7621:87;7613:96;;;7372:344;;;;:::o;10269:560::-;10423:4;10396:31;;:23;10411:7;10396:14;:23::i;:::-;:31;;;10388:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10505:1;10491:16;;:2;:16;;;;10483:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10559:39;10580:4;10586:2;10590:7;10559:20;:39::i;:::-;10660:29;10677:1;10681:7;10660:8;:29::i;:::-;10719:1;10700:9;:15;10710:4;10700:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10747:1;10730:9;:13;10740:2;10730:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10777:2;10758:7;:16;10766:7;10758:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10814:7;10810:2;10795:27;;10804:4;10795:27;;;;;;;;;;;;10269:560;;;:::o;8046:108::-;8121:26;8131:2;8135:7;8121:26;;;;;;;;;;;;:9;:26::i;:::-;8046:108;;:::o;2263:187:9:-;2336:16;2355:6;;;;;;;;;;;2336:25;;2380:8;2371:6;;:17;;;;;;;;;;;;;;;;;;2434:8;2403:40;;2424:8;2403:40;;;;;;;;;;;;2326:124;2263:187;:::o;11246:307:4:-;11396:8;11387:17;;:5;:17;;;;11379:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;11482:8;11444:18;:25;11463:5;11444:25;;;;;;;;;;;;;;;:35;11470:8;11444:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;11527:8;11505:41;;11520:5;11505:41;;;11537:8;11505:41;;;;;;:::i;:::-;;;;;;;;11246:307;;;:::o;6479:::-;6630:28;6640:4;6646:2;6650:7;6630:9;:28::i;:::-;6676:48;6699:4;6705:2;6709:7;6718:5;6676:22;:48::i;:::-;6668:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6479:307;;;;:::o;328:703:12:-;384:13;610:1;601:5;:10;597:51;;;627:10;;;;;;;;;;;;;;;;;;;;;597:51;657:12;672:5;657:20;;687:14;711:75;726:1;718:4;:9;711:75;;743:8;;;;;:::i;:::-;;;;773:2;765:10;;;;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;795:39;;844:150;860:1;851:5;:10;844:150;;887:1;877:11;;;;;:::i;:::-;;;953:2;945:5;:10;;;;:::i;:::-;932:2;:24;;;;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;844:150;;;1017:6;1003:21;;;;;328:703;;;;:::o;13440:122:4:-;;;;:::o;8375:311::-;8500:18;8506:2;8510:7;8500:5;:18::i;:::-;8549:54;8580:1;8584:2;8588:7;8597:5;8549:22;:54::i;:::-;8528:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;8375:311;;;:::o;12106:778::-;12256:4;12276:15;:2;:13;;;:15::i;:::-;12272:606;;;12327:2;12311:36;;;12348:12;:10;:12::i;:::-;12362:4;12368:7;12377:5;12311:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12307:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12567:1;12550:6;:13;:18;12546:266;;;12592:60;;;;;;;;;;:::i;:::-;;;;;;;;12546:266;12764:6;12758:13;12749:6;12745:2;12741:15;12734:38;12307:519;12443:41;;;12433:51;;;:6;:51;;;;12426:58;;;;;12272:606;12863:4;12856:11;;12106:778;;;;;;;:::o;9008:372::-;9101:1;9087:16;;:2;:16;;;;9079:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9159:16;9167:7;9159;:16::i;:::-;9158:17;9150:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9219:45;9248:1;9252:2;9256:7;9219:20;:45::i;:::-;9292:1;9275:9;:13;9285:2;9275:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9322:2;9303:7;:16;9311:7;9303:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9365:7;9361:2;9340:33;;9357:1;9340:33;;;;;;;;;;;;9008:372;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410: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:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:143::-;2334:5;2365:6;2359:13;2350:22;;2381:33;2408:5;2381:33;:::i;:::-;2277:143;;;;:::o;2426:329::-;2485:6;2534:2;2522:9;2513:7;2509:23;2505:32;2502:119;;;2540:79;;:::i;:::-;2502:119;2660:1;2685:53;2730:7;2721:6;2710:9;2706:22;2685:53;:::i;:::-;2675:63;;2631:117;2426:329;;;;:::o;2761:474::-;2829:6;2837;2886:2;2874:9;2865:7;2861:23;2857:32;2854:119;;;2892:79;;:::i;:::-;2854:119;3012:1;3037:53;3082:7;3073:6;3062:9;3058:22;3037:53;:::i;:::-;3027:63;;2983:117;3139:2;3165:53;3210:7;3201:6;3190:9;3186:22;3165:53;:::i;:::-;3155:63;;3110:118;2761:474;;;;;:::o;3241:619::-;3318:6;3326;3334;3383:2;3371:9;3362:7;3358:23;3354:32;3351:119;;;3389:79;;:::i;:::-;3351:119;3509:1;3534:53;3579:7;3570:6;3559:9;3555:22;3534:53;:::i;:::-;3524:63;;3480:117;3636:2;3662:53;3707:7;3698:6;3687:9;3683:22;3662:53;:::i;:::-;3652:63;;3607:118;3764:2;3790:53;3835:7;3826:6;3815:9;3811:22;3790:53;:::i;:::-;3780:63;;3735:118;3241:619;;;;;:::o;3866:943::-;3961:6;3969;3977;3985;4034:3;4022:9;4013:7;4009:23;4005:33;4002:120;;;4041:79;;:::i;:::-;4002:120;4161:1;4186:53;4231:7;4222:6;4211:9;4207:22;4186:53;:::i;:::-;4176:63;;4132:117;4288:2;4314:53;4359:7;4350:6;4339:9;4335:22;4314:53;:::i;:::-;4304:63;;4259:118;4416:2;4442:53;4487:7;4478:6;4467:9;4463:22;4442:53;:::i;:::-;4432:63;;4387:118;4572:2;4561:9;4557:18;4544:32;4603:18;4595:6;4592:30;4589:117;;;4625:79;;:::i;:::-;4589:117;4730:62;4784:7;4775:6;4764:9;4760:22;4730:62;:::i;:::-;4720:72;;4515:287;3866:943;;;;;;;:::o;4815:468::-;4880:6;4888;4937:2;4925:9;4916:7;4912:23;4908:32;4905:119;;;4943:79;;:::i;:::-;4905:119;5063:1;5088:53;5133:7;5124:6;5113:9;5109:22;5088:53;:::i;:::-;5078:63;;5034:117;5190:2;5216:50;5258:7;5249:6;5238:9;5234:22;5216:50;:::i;:::-;5206:60;;5161:115;4815:468;;;;;:::o;5289:474::-;5357:6;5365;5414:2;5402:9;5393:7;5389:23;5385:32;5382:119;;;5420:79;;:::i;:::-;5382:119;5540:1;5565:53;5610:7;5601:6;5590:9;5586:22;5565:53;:::i;:::-;5555:63;;5511:117;5667:2;5693:53;5738:7;5729:6;5718:9;5714:22;5693:53;:::i;:::-;5683:63;;5638:118;5289:474;;;;;:::o;5769:327::-;5827:6;5876:2;5864:9;5855:7;5851:23;5847:32;5844:119;;;5882:79;;:::i;:::-;5844:119;6002:1;6027:52;6071:7;6062:6;6051:9;6047:22;6027:52;:::i;:::-;6017:62;;5973:116;5769:327;;;;:::o;6102:349::-;6171:6;6220:2;6208:9;6199:7;6195:23;6191:32;6188:119;;;6226:79;;:::i;:::-;6188:119;6346:1;6371:63;6426:7;6417:6;6406:9;6402:22;6371:63;:::i;:::-;6361:73;;6317:127;6102:349;;;;:::o;6457:509::-;6526:6;6575:2;6563:9;6554:7;6550:23;6546:32;6543:119;;;6581:79;;:::i;:::-;6543:119;6729:1;6718:9;6714:17;6701:31;6759:18;6751:6;6748:30;6745:117;;;6781:79;;:::i;:::-;6745:117;6886:63;6941:7;6932:6;6921:9;6917:22;6886:63;:::i;:::-;6876:73;;6672:287;6457:509;;;;:::o;6972:329::-;7031:6;7080:2;7068:9;7059:7;7055:23;7051:32;7048:119;;;7086:79;;:::i;:::-;7048:119;7206:1;7231:53;7276:7;7267:6;7256:9;7252:22;7231:53;:::i;:::-;7221:63;;7177:117;6972:329;;;;:::o;7307:351::-;7377:6;7426:2;7414:9;7405:7;7401:23;7397:32;7394:119;;;7432:79;;:::i;:::-;7394:119;7552:1;7577:64;7633:7;7624:6;7613:9;7609:22;7577:64;:::i;:::-;7567:74;;7523:128;7307:351;;;;:::o;7664:118::-;7751:24;7769:5;7751:24;:::i;:::-;7746:3;7739:37;7664:118;;:::o;7788:109::-;7869:21;7884:5;7869:21;:::i;:::-;7864:3;7857:34;7788:109;;:::o;7903:360::-;7989:3;8017:38;8049:5;8017:38;:::i;:::-;8071:70;8134:6;8129:3;8071:70;:::i;:::-;8064:77;;8150:52;8195:6;8190:3;8183:4;8176:5;8172:16;8150:52;:::i;:::-;8227:29;8249:6;8227:29;:::i;:::-;8222:3;8218:39;8211:46;;7993:270;7903:360;;;;:::o;8269:364::-;8357:3;8385:39;8418:5;8385:39;:::i;:::-;8440:71;8504:6;8499:3;8440:71;:::i;:::-;8433:78;;8520:52;8565:6;8560:3;8553:4;8546:5;8542:16;8520:52;:::i;:::-;8597:29;8619:6;8597:29;:::i;:::-;8592:3;8588:39;8581:46;;8361:272;8269:364;;;;:::o;8639:377::-;8745:3;8773:39;8806:5;8773:39;:::i;:::-;8828:89;8910:6;8905:3;8828:89;:::i;:::-;8821:96;;8926:52;8971:6;8966:3;8959:4;8952:5;8948:16;8926:52;:::i;:::-;9003:6;8998:3;8994:16;8987:23;;8749:267;8639:377;;;;:::o;9046:845::-;9149:3;9186:5;9180:12;9215:36;9241:9;9215:36;:::i;:::-;9267:89;9349:6;9344:3;9267:89;:::i;:::-;9260:96;;9387:1;9376:9;9372:17;9403:1;9398:137;;;;9549:1;9544:341;;;;9365:520;;9398:137;9482:4;9478:9;9467;9463:25;9458:3;9451:38;9518:6;9513:3;9509:16;9502:23;;9398:137;;9544:341;9611:38;9643:5;9611:38;:::i;:::-;9671:1;9685:154;9699:6;9696:1;9693:13;9685:154;;;9773:7;9767:14;9763:1;9758:3;9754:11;9747:35;9823:1;9814:7;9810:15;9799:26;;9721:4;9718:1;9714:12;9709:17;;9685:154;;;9868:6;9863:3;9859:16;9852:23;;9551:334;;9365:520;;9153:738;;9046:845;;;;:::o;9897:366::-;10039:3;10060:67;10124:2;10119:3;10060:67;:::i;:::-;10053:74;;10136:93;10225:3;10136:93;:::i;:::-;10254:2;10249:3;10245:12;10238:19;;9897:366;;;:::o;10269:::-;10411:3;10432:67;10496:2;10491:3;10432:67;:::i;:::-;10425:74;;10508:93;10597:3;10508:93;:::i;:::-;10626:2;10621:3;10617:12;10610:19;;10269:366;;;:::o;10641:::-;10783:3;10804:67;10868:2;10863:3;10804:67;:::i;:::-;10797:74;;10880:93;10969:3;10880:93;:::i;:::-;10998:2;10993:3;10989:12;10982:19;;10641:366;;;:::o;11013:::-;11155:3;11176:67;11240:2;11235:3;11176:67;:::i;:::-;11169:74;;11252:93;11341:3;11252:93;:::i;:::-;11370:2;11365:3;11361:12;11354:19;;11013:366;;;:::o;11385:::-;11527:3;11548:67;11612:2;11607:3;11548:67;:::i;:::-;11541:74;;11624:93;11713:3;11624:93;:::i;:::-;11742:2;11737:3;11733:12;11726:19;;11385:366;;;:::o;11757:::-;11899:3;11920:67;11984:2;11979:3;11920:67;:::i;:::-;11913:74;;11996:93;12085:3;11996:93;:::i;:::-;12114:2;12109:3;12105:12;12098:19;;11757:366;;;:::o;12129:::-;12271:3;12292:67;12356:2;12351:3;12292:67;:::i;:::-;12285:74;;12368:93;12457:3;12368:93;:::i;:::-;12486:2;12481:3;12477:12;12470:19;;12129:366;;;:::o;12501:::-;12643:3;12664:67;12728:2;12723:3;12664:67;:::i;:::-;12657:74;;12740:93;12829:3;12740:93;:::i;:::-;12858:2;12853:3;12849:12;12842:19;;12501:366;;;:::o;12873:::-;13015:3;13036:67;13100:2;13095:3;13036:67;:::i;:::-;13029:74;;13112:93;13201:3;13112:93;:::i;:::-;13230:2;13225:3;13221:12;13214:19;;12873:366;;;:::o;13245:::-;13387:3;13408:67;13472:2;13467:3;13408:67;:::i;:::-;13401:74;;13484:93;13573:3;13484:93;:::i;:::-;13602:2;13597:3;13593:12;13586:19;;13245:366;;;:::o;13617:::-;13759:3;13780:67;13844:2;13839:3;13780:67;:::i;:::-;13773:74;;13856:93;13945:3;13856:93;:::i;:::-;13974:2;13969:3;13965:12;13958:19;;13617:366;;;:::o;13989:::-;14131:3;14152:67;14216:2;14211:3;14152:67;:::i;:::-;14145:74;;14228:93;14317:3;14228:93;:::i;:::-;14346:2;14341:3;14337:12;14330:19;;13989:366;;;:::o;14361:::-;14503:3;14524:67;14588:2;14583:3;14524:67;:::i;:::-;14517:74;;14600:93;14689:3;14600:93;:::i;:::-;14718:2;14713:3;14709:12;14702:19;;14361:366;;;:::o;14733:400::-;14893:3;14914:84;14996:1;14991:3;14914:84;:::i;:::-;14907:91;;15007:93;15096:3;15007:93;:::i;:::-;15125:1;15120:3;15116:11;15109:18;;14733:400;;;:::o;15139:366::-;15281:3;15302:67;15366:2;15361:3;15302:67;:::i;:::-;15295:74;;15378:93;15467:3;15378:93;:::i;:::-;15496:2;15491:3;15487:12;15480:19;;15139:366;;;:::o;15511:::-;15653:3;15674:67;15738:2;15733:3;15674:67;:::i;:::-;15667:74;;15750:93;15839:3;15750:93;:::i;:::-;15868:2;15863:3;15859:12;15852:19;;15511:366;;;:::o;15883:::-;16025:3;16046:67;16110:2;16105:3;16046:67;:::i;:::-;16039:74;;16122:93;16211:3;16122:93;:::i;:::-;16240:2;16235:3;16231:12;16224:19;;15883:366;;;:::o;16255:::-;16397:3;16418:67;16482:2;16477:3;16418:67;:::i;:::-;16411:74;;16494:93;16583:3;16494:93;:::i;:::-;16612:2;16607:3;16603:12;16596:19;;16255:366;;;:::o;16627:::-;16769:3;16790:67;16854:2;16849:3;16790:67;:::i;:::-;16783:74;;16866:93;16955:3;16866:93;:::i;:::-;16984:2;16979:3;16975:12;16968:19;;16627:366;;;:::o;16999:::-;17141:3;17162:67;17226:2;17221:3;17162:67;:::i;:::-;17155:74;;17238:93;17327:3;17238:93;:::i;:::-;17356:2;17351:3;17347:12;17340:19;;16999:366;;;:::o;17371:::-;17513:3;17534:67;17598:2;17593:3;17534:67;:::i;:::-;17527:74;;17610:93;17699:3;17610:93;:::i;:::-;17728:2;17723:3;17719:12;17712:19;;17371:366;;;:::o;17743:118::-;17830:24;17848:5;17830:24;:::i;:::-;17825:3;17818:37;17743:118;;:::o;17867:695::-;18145:3;18167:92;18255:3;18246:6;18167:92;:::i;:::-;18160:99;;18276:95;18367:3;18358:6;18276:95;:::i;:::-;18269:102;;18388:148;18532:3;18388:148;:::i;:::-;18381:155;;18553:3;18546:10;;17867:695;;;;;:::o;18568:222::-;18661:4;18699:2;18688:9;18684:18;18676:26;;18712:71;18780:1;18769:9;18765:17;18756:6;18712:71;:::i;:::-;18568:222;;;;:::o;18796:640::-;18991:4;19029:3;19018:9;19014:19;19006:27;;19043:71;19111:1;19100:9;19096:17;19087:6;19043:71;:::i;:::-;19124:72;19192:2;19181:9;19177:18;19168:6;19124:72;:::i;:::-;19206;19274:2;19263:9;19259:18;19250:6;19206:72;:::i;:::-;19325:9;19319:4;19315:20;19310:2;19299:9;19295:18;19288:48;19353:76;19424:4;19415:6;19353:76;:::i;:::-;19345:84;;18796:640;;;;;;;:::o;19442:210::-;19529:4;19567:2;19556:9;19552:18;19544:26;;19580:65;19642:1;19631:9;19627:17;19618:6;19580:65;:::i;:::-;19442:210;;;;:::o;19658:313::-;19771:4;19809:2;19798:9;19794:18;19786:26;;19858:9;19852:4;19848:20;19844:1;19833:9;19829:17;19822:47;19886:78;19959:4;19950:6;19886:78;:::i;:::-;19878:86;;19658:313;;;;:::o;19977:419::-;20143:4;20181:2;20170:9;20166:18;20158:26;;20230:9;20224:4;20220:20;20216:1;20205:9;20201:17;20194:47;20258:131;20384:4;20258:131;:::i;:::-;20250:139;;19977:419;;;:::o;20402:::-;20568:4;20606:2;20595:9;20591:18;20583:26;;20655:9;20649:4;20645:20;20641:1;20630:9;20626:17;20619:47;20683:131;20809:4;20683:131;:::i;:::-;20675:139;;20402:419;;;:::o;20827:::-;20993:4;21031:2;21020:9;21016:18;21008:26;;21080:9;21074:4;21070:20;21066:1;21055:9;21051:17;21044:47;21108:131;21234:4;21108:131;:::i;:::-;21100:139;;20827:419;;;:::o;21252:::-;21418:4;21456:2;21445:9;21441:18;21433:26;;21505:9;21499:4;21495:20;21491:1;21480:9;21476:17;21469:47;21533:131;21659:4;21533:131;:::i;:::-;21525:139;;21252:419;;;:::o;21677:::-;21843:4;21881:2;21870:9;21866:18;21858:26;;21930:9;21924:4;21920:20;21916:1;21905:9;21901:17;21894:47;21958:131;22084:4;21958:131;:::i;:::-;21950:139;;21677:419;;;:::o;22102:::-;22268:4;22306:2;22295:9;22291:18;22283:26;;22355:9;22349:4;22345:20;22341:1;22330:9;22326:17;22319:47;22383:131;22509:4;22383:131;:::i;:::-;22375:139;;22102:419;;;:::o;22527:::-;22693:4;22731:2;22720:9;22716:18;22708:26;;22780:9;22774:4;22770:20;22766:1;22755:9;22751:17;22744:47;22808:131;22934:4;22808:131;:::i;:::-;22800:139;;22527:419;;;:::o;22952:::-;23118:4;23156:2;23145:9;23141:18;23133:26;;23205:9;23199:4;23195:20;23191:1;23180:9;23176:17;23169:47;23233:131;23359:4;23233:131;:::i;:::-;23225:139;;22952:419;;;:::o;23377:::-;23543:4;23581:2;23570:9;23566:18;23558:26;;23630:9;23624:4;23620:20;23616:1;23605:9;23601:17;23594:47;23658:131;23784:4;23658:131;:::i;:::-;23650:139;;23377:419;;;:::o;23802:::-;23968:4;24006:2;23995:9;23991:18;23983:26;;24055:9;24049:4;24045:20;24041:1;24030:9;24026:17;24019:47;24083:131;24209:4;24083:131;:::i;:::-;24075:139;;23802:419;;;:::o;24227:::-;24393:4;24431:2;24420:9;24416:18;24408:26;;24480:9;24474:4;24470:20;24466:1;24455:9;24451:17;24444:47;24508:131;24634:4;24508:131;:::i;:::-;24500:139;;24227:419;;;:::o;24652:::-;24818:4;24856:2;24845:9;24841:18;24833:26;;24905:9;24899:4;24895:20;24891:1;24880:9;24876:17;24869:47;24933:131;25059:4;24933:131;:::i;:::-;24925:139;;24652:419;;;:::o;25077:::-;25243:4;25281:2;25270:9;25266:18;25258:26;;25330:9;25324:4;25320:20;25316:1;25305:9;25301:17;25294:47;25358:131;25484:4;25358:131;:::i;:::-;25350:139;;25077:419;;;:::o;25502:::-;25668:4;25706:2;25695:9;25691:18;25683:26;;25755:9;25749:4;25745:20;25741:1;25730:9;25726:17;25719:47;25783:131;25909:4;25783:131;:::i;:::-;25775:139;;25502:419;;;:::o;25927:::-;26093:4;26131:2;26120:9;26116:18;26108:26;;26180:9;26174:4;26170:20;26166:1;26155:9;26151:17;26144:47;26208:131;26334:4;26208:131;:::i;:::-;26200:139;;25927:419;;;:::o;26352:::-;26518:4;26556:2;26545:9;26541:18;26533:26;;26605:9;26599:4;26595:20;26591:1;26580:9;26576:17;26569:47;26633:131;26759:4;26633:131;:::i;:::-;26625:139;;26352:419;;;:::o;26777:::-;26943:4;26981:2;26970:9;26966:18;26958:26;;27030:9;27024:4;27020:20;27016:1;27005:9;27001:17;26994:47;27058:131;27184:4;27058:131;:::i;:::-;27050:139;;26777:419;;;:::o;27202:::-;27368:4;27406:2;27395:9;27391:18;27383:26;;27455:9;27449:4;27445:20;27441:1;27430:9;27426:17;27419:47;27483:131;27609:4;27483:131;:::i;:::-;27475:139;;27202:419;;;:::o;27627:::-;27793:4;27831:2;27820:9;27816:18;27808:26;;27880:9;27874:4;27870:20;27866:1;27855:9;27851:17;27844:47;27908:131;28034:4;27908:131;:::i;:::-;27900:139;;27627:419;;;:::o;28052:::-;28218:4;28256:2;28245:9;28241:18;28233:26;;28305:9;28299:4;28295:20;28291:1;28280:9;28276:17;28269:47;28333:131;28459:4;28333:131;:::i;:::-;28325:139;;28052:419;;;:::o;28477:222::-;28570:4;28608:2;28597:9;28593:18;28585:26;;28621:71;28689:1;28678:9;28674:17;28665:6;28621:71;:::i;:::-;28477:222;;;;:::o;28705:129::-;28739:6;28766:20;;:::i;:::-;28756:30;;28795:33;28823:4;28815:6;28795:33;:::i;:::-;28705:129;;;:::o;28840:75::-;28873:6;28906:2;28900:9;28890:19;;28840:75;:::o;28921:307::-;28982:4;29072:18;29064:6;29061:30;29058:56;;;29094:18;;:::i;:::-;29058:56;29132:29;29154:6;29132:29;:::i;:::-;29124:37;;29216:4;29210;29206:15;29198:23;;28921:307;;;:::o;29234:308::-;29296:4;29386:18;29378:6;29375:30;29372:56;;;29408:18;;:::i;:::-;29372:56;29446:29;29468:6;29446:29;:::i;:::-;29438:37;;29530:4;29524;29520:15;29512:23;;29234:308;;;:::o;29548:141::-;29597:4;29620:3;29612:11;;29643:3;29640:1;29633:14;29677:4;29674:1;29664:18;29656:26;;29548:141;;;:::o;29695:98::-;29746:6;29780:5;29774:12;29764:22;;29695:98;;;:::o;29799:99::-;29851:6;29885:5;29879:12;29869:22;;29799:99;;;:::o;29904:168::-;29987:11;30021:6;30016:3;30009:19;30061:4;30056:3;30052:14;30037:29;;29904:168;;;;:::o;30078:169::-;30162:11;30196:6;30191:3;30184:19;30236:4;30231:3;30227:14;30212:29;;30078:169;;;;:::o;30253:148::-;30355:11;30392:3;30377:18;;30253:148;;;;:::o;30407:305::-;30447:3;30466:20;30484:1;30466:20;:::i;:::-;30461:25;;30500:20;30518:1;30500:20;:::i;:::-;30495:25;;30654:1;30586:66;30582:74;30579:1;30576:81;30573:107;;;30660:18;;:::i;:::-;30573:107;30704:1;30701;30697:9;30690:16;;30407:305;;;;:::o;30718:185::-;30758:1;30775:20;30793:1;30775:20;:::i;:::-;30770:25;;30809:20;30827:1;30809:20;:::i;:::-;30804:25;;30848:1;30838:35;;30853:18;;:::i;:::-;30838:35;30895:1;30892;30888:9;30883:14;;30718:185;;;;:::o;30909:348::-;30949:7;30972:20;30990:1;30972:20;:::i;:::-;30967:25;;31006:20;31024:1;31006:20;:::i;:::-;31001:25;;31194:1;31126:66;31122:74;31119:1;31116:81;31111:1;31104:9;31097:17;31093:105;31090:131;;;31201:18;;:::i;:::-;31090:131;31249:1;31246;31242:9;31231:20;;30909:348;;;;:::o;31263:191::-;31303:4;31323:20;31341:1;31323:20;:::i;:::-;31318:25;;31357:20;31375:1;31357:20;:::i;:::-;31352:25;;31396:1;31393;31390:8;31387:34;;;31401:18;;:::i;:::-;31387:34;31446:1;31443;31439:9;31431:17;;31263:191;;;;:::o;31460:96::-;31497:7;31526:24;31544:5;31526:24;:::i;:::-;31515:35;;31460:96;;;:::o;31562:90::-;31596:7;31639:5;31632:13;31625:21;31614:32;;31562:90;;;:::o;31658:149::-;31694:7;31734:66;31727:5;31723:78;31712:89;;31658:149;;;:::o;31813:126::-;31850:7;31890:42;31883:5;31879:54;31868:65;;31813:126;;;:::o;31945:77::-;31982:7;32011:5;32000:16;;31945:77;;;:::o;32028:154::-;32112:6;32107:3;32102;32089:30;32174:1;32165:6;32160:3;32156:16;32149:27;32028:154;;;:::o;32188:307::-;32256:1;32266:113;32280:6;32277:1;32274:13;32266:113;;;32365:1;32360:3;32356:11;32350:18;32346:1;32341:3;32337:11;32330:39;32302:2;32299:1;32295:10;32290:15;;32266:113;;;32397:6;32394:1;32391:13;32388:101;;;32477:1;32468:6;32463:3;32459:16;32452:27;32388:101;32237:258;32188:307;;;:::o;32501:320::-;32545:6;32582:1;32576:4;32572:12;32562:22;;32629:1;32623:4;32619:12;32650:18;32640:81;;32706:4;32698:6;32694:17;32684:27;;32640:81;32768:2;32760:6;32757:14;32737:18;32734:38;32731:84;;;32787:18;;:::i;:::-;32731:84;32552:269;32501:320;;;:::o;32827:281::-;32910:27;32932:4;32910:27;:::i;:::-;32902:6;32898:40;33040:6;33028:10;33025:22;33004:18;32992:10;32989:34;32986:62;32983:88;;;33051:18;;:::i;:::-;32983:88;33091:10;33087:2;33080:22;32870:238;32827:281;;:::o;33114:233::-;33153:3;33176:24;33194:5;33176:24;:::i;:::-;33167:33;;33222:66;33215:5;33212:77;33209:103;;;33292:18;;:::i;:::-;33209:103;33339:1;33332:5;33328:13;33321:20;;33114:233;;;:::o;33353:176::-;33385:1;33402:20;33420:1;33402:20;:::i;:::-;33397:25;;33436:20;33454:1;33436:20;:::i;:::-;33431:25;;33475:1;33465:35;;33480:18;;:::i;:::-;33465:35;33521:1;33518;33514:9;33509:14;;33353:176;;;;:::o;33535:180::-;33583:77;33580:1;33573:88;33680:4;33677:1;33670:15;33704:4;33701:1;33694:15;33721:180;33769:77;33766:1;33759:88;33866:4;33863:1;33856:15;33890:4;33887:1;33880:15;33907:180;33955:77;33952:1;33945:88;34052:4;34049:1;34042:15;34076:4;34073:1;34066:15;34093:180;34141:77;34138:1;34131:88;34238:4;34235:1;34228:15;34262:4;34259:1;34252:15;34279:180;34327:77;34324:1;34317:88;34424:4;34421:1;34414:15;34448:4;34445:1;34438:15;34465:117;34574:1;34571;34564:12;34588:117;34697:1;34694;34687:12;34711:117;34820:1;34817;34810:12;34834:117;34943:1;34940;34933:12;34957:102;34998:6;35049:2;35045:7;35040:2;35033:5;35029:14;35025:28;35015:38;;34957:102;;;:::o;35065:166::-;35205:18;35201:1;35193:6;35189:14;35182:42;35065:166;:::o;35237:231::-;35377:34;35373:1;35365:6;35361:14;35354:58;35446:14;35441:2;35433:6;35429:15;35422:39;35237:231;:::o;35474:237::-;35614:34;35610:1;35602:6;35598:14;35591:58;35683:20;35678:2;35670:6;35666:15;35659:45;35474:237;:::o;35717:225::-;35857:34;35853:1;35845:6;35841:14;35834:58;35926:8;35921:2;35913:6;35909:15;35902:33;35717:225;:::o;35948:178::-;36088:30;36084:1;36076:6;36072:14;36065:54;35948:178;:::o;36132:223::-;36272:34;36268:1;36260:6;36256:14;36249:58;36341:6;36336:2;36328:6;36324:15;36317:31;36132:223;:::o;36361:175::-;36501:27;36497:1;36489:6;36485:14;36478:51;36361:175;:::o;36542:231::-;36682:34;36678:1;36670:6;36666:14;36659:58;36751:14;36746:2;36738:6;36734:15;36727:39;36542:231;:::o;36779:243::-;36919:34;36915:1;36907:6;36903:14;36896:58;36988:26;36983:2;36975:6;36971:15;36964:51;36779:243;:::o;37028:229::-;37168:34;37164:1;37156:6;37152:14;37145:58;37237:12;37232:2;37224:6;37220:15;37213:37;37028:229;:::o;37263:228::-;37403:34;37399:1;37391:6;37387:14;37380:58;37472:11;37467:2;37459:6;37455:15;37448:36;37263:228;:::o;37497:182::-;37637:34;37633:1;37625:6;37621:14;37614:58;37497:182;:::o;37685:231::-;37825:34;37821:1;37813:6;37809:14;37802:58;37894:14;37889:2;37881:6;37877:15;37870:39;37685:231;:::o;37922:155::-;38062:7;38058:1;38050:6;38046:14;38039:31;37922:155;:::o;38083:182::-;38223:34;38219:1;38211:6;38207:14;38200:58;38083:182;:::o;38271:228::-;38411:34;38407:1;38399:6;38395:14;38388:58;38480:11;38475:2;38467:6;38463:15;38456:36;38271:228;:::o;38505:180::-;38645:32;38641:1;38633:6;38629:14;38622:56;38505:180;:::o;38691:220::-;38831:34;38827:1;38819:6;38815:14;38808:58;38900:3;38895:2;38887:6;38883:15;38876:28;38691:220;:::o;38917:176::-;39057:28;39053:1;39045:6;39041:14;39034:52;38917:176;:::o;39099:236::-;39239:34;39235:1;39227:6;39223:14;39216:58;39308:19;39303:2;39295:6;39291:15;39284:44;39099:236;:::o;39341:176::-;39481:28;39477:1;39469:6;39465:14;39458:52;39341:176;:::o;39523:122::-;39596:24;39614:5;39596:24;:::i;:::-;39589:5;39586:35;39576:63;;39635:1;39632;39625:12;39576:63;39523:122;:::o;39651:116::-;39721:21;39736:5;39721:21;:::i;:::-;39714:5;39711:32;39701:60;;39757:1;39754;39747:12;39701:60;39651:116;:::o;39773:120::-;39845:23;39862:5;39845:23;:::i;:::-;39838:5;39835:34;39825:62;;39883:1;39880;39873:12;39825:62;39773:120;:::o;39899:122::-;39972:24;39990:5;39972:24;:::i;:::-;39965:5;39962:35;39952:63;;40011:1;40008;40001:12;39952:63;39899:122;:::o

Swarm Source

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