ETH Price: $2,127.72 (-6.38%)

Token

The Satellite Project by TLN (TLNSAT)
 

Overview

Max Total Supply

47 TLNSAT

Holders

22

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 TLNSAT
0x461d97233526bc554ae20ec701c0defc37d9a295
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:
OsirisAdvancedv1

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 14 of 14: TheSatelliteProject.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./Ownable.sol";
import "./Strings.sol";
import "./ReentrancyGuard.sol";
import { IERC2981, IERC165 } from "./IERC2981.sol";
import "./ERC165.sol";
import "./ERC721.sol";

contract OsirisAdvancedv1 is ERC721, IERC2981, Ownable, ReentrancyGuard {
    // Declarations
    using Strings for uint256;
    uint256 private MAX_SUPPLY = 100;
    uint256 private _currentId;
    uint256 public totalBatches;
    string public baseURI;
    string private _contractURI;
    bool public isActive = false;
    bool public isWLActive = false;
    uint256 public price = 0.001 ether;
    address public beneficiary;
    address public royalties;

    constructor(
        address _beneficiary,
        address _royalties,
        string memory _initialBaseURI,
        string memory _initialContractURI
    ) ERC721("The Satellite Project by TLN", "TLNSAT") {
        beneficiary = _beneficiary;
        royalties = _royalties;
        baseURI = _initialBaseURI;
        _contractURI = _initialContractURI;
    }

    struct Batch {
        uint256 maxSupply;
        uint256 currentSupply;
        uint256 price;
        bool isActive;
    }

    // Mappings
    // Add a mapping to store Allowed Minters
    mapping(address => uint256) public allowedMinters;

    // Add a mapping to store the Batchs
    mapping(uint256 => Batch) public Batchs;

    // Add a nested mapping to store the whitelisted addresses for each Batch
    mapping(uint256 => mapping(address => uint256)) public whitelisted;

    // Add a mapping to store the batchOfToken
    mapping(uint256 => uint256) public batchOfToken;

    // Add a mapping for the blacklist
    mapping(uint256 => bool) public blacklistedTokens;
    mapping(address => bool) public blacklistedAddresses;
    event TokenURICreated(uint256 indexed tokenId, string uri);
    event TokenRemovedFromBlacklist(uint256 indexed tokenId);

    // Accessors

    function setBeneficiary(address _beneficiary) public onlyOwner {
        beneficiary = _beneficiary;
    }

    // Royalty percentage, initially set to 10%
    uint256 public royaltyPercentage = 10;

    function setRoyalties(address _royalties) public onlyOwner {
        royalties = _royalties;
    }

    // Set royalty percentage
    function setRoyaltyPercentage(uint256 _royaltyPercentage) public onlyOwner {
        require(_royaltyPercentage >= 0 && _royaltyPercentage <= 100, "Invalid royalty percentage");
        royaltyPercentage = _royaltyPercentage;
    }

    function setPublicActive(bool _isActive) public onlyOwner {
        isActive = _isActive;
    }

    function setWLActive(bool _isWLActive) public onlyOwner {
        isWLActive = _isWLActive;
    }

    function totalSupply() public view returns (uint256) {
        return _currentId;
    }

    // Metadata

    function setMaxSupply(uint256 _maxSupply) public onlyOwner {
        require(_maxSupply > 0, "Max supply cannot be 0");
        require(_maxSupply > _currentId, "Max supply cannot be less than current supply");
        MAX_SUPPLY = _maxSupply;
    }

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

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

    function contractURI() public view returns (string memory) {
        return _contractURI;
    }

    function setContractURI(string memory uri) public onlyOwner {
        _contractURI = uri;
    }

    // Minting
    // Whitelist Minting
    function mint(uint256 BatchId, uint256 amount, bool isWhitelisted) public payable nonReentrant {
        address sender = _msgSender();
        require(!blacklistedAddresses[sender], "Transfer to a blacklisted address is not allowed");
        require(Batchs[BatchId].isActive, "Batch is closed");
        require(_currentId + amount <= MAX_SUPPLY, "Insufficient mints left");
        require(msg.value == Batchs[BatchId].price * amount, "Incorrect payable amount");

        if (isWLActive) {
            require(isWhitelisted, "Whitelist mint is not active");
            require(whitelisted[BatchId][sender] >= amount, "Not allowed to mint this amount");
            whitelisted[BatchId][sender] -= amount;
        } else {
            require(isActive, "Public mint is not active at the moment.");
        }

        uint256 SpotId = Batchs[BatchId].currentSupply + 1;
        _internalMint(sender, amount, BatchId, SpotId);
    }

    // Withdrawal
    function withdraw() public onlyOwner {
        uint256 balance = address(this).balance;
        uint256 royaltyAmount;
        uint256 beneficiaryAmount;

        // Check if royalty account address is the same as the beneficiary address
        if (royalties == beneficiary) {
            // Send everything to the beneficiary
            beneficiaryAmount = balance;
        } else {
            // Calculate the royalty based on the royalty percentage and the amount for the beneficiary
            royaltyAmount = balance * royaltyPercentage / 100;
            beneficiaryAmount = balance - royaltyAmount;
            payable(royalties).transfer(royaltyAmount); // Transfer royalty to the royalty account
        }
        payable(beneficiary).transfer(beneficiaryAmount); // Transfer the remaining amount to the beneficiary
    }

    // Disburse Abritrary Revenue To Token Owner
    function disburseRevenue(uint256 tokenId) public onlyOwner payable {
        address tokenOwner = ownerOf(tokenId);
        require(!blacklistedAddresses[tokenOwner], "Transfer to a blacklisted address is not allowed");
        payable(tokenOwner).transfer(msg.value);
    }

    // Override Token URI Function
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        if (blacklistedTokens[tokenId]) {
            return string(abi.encodePacked(baseURI, "/blacklisted"));
        }

        uint256 batchId = batchOfToken[tokenId];
        uint256 spotId;

        if (batchId == 1) {
            spotId = tokenId;
        } else {
            uint256 previousBatchesMaxSupply = (batchId - 1) * 20;
            spotId = tokenId - previousBatchesMaxSupply;
        }

        string memory tokenURIPrefix = baseURI;

        return string(abi.encodePacked(tokenURIPrefix, "/", batchId.toString(), "/", spotId.toString(), "/metadata.json"));
    }

    // Add Batch
    function addBatch(uint256 batchId, uint256 maxSupply, uint256 _price) public onlyOwner {
        require(batchId > 0, "Batch ID must be greater than 0");

        // Calculate the total max supply after adding this batch
        uint256 newTotalMaxSupply = 0;
        for (uint256 i = 1; i < batchId; i++) {
            newTotalMaxSupply += Batchs[i].maxSupply;
        }
        newTotalMaxSupply += maxSupply;

        require(newTotalMaxSupply <= MAX_SUPPLY, "Adding this batch would exceed the max supply of the contract");

        Batchs[batchId] = Batch(maxSupply, 0, _price, false);
        totalBatches++;
    }

    // Set Batch to Active
    function setBatchActive(uint256 BatchId, bool _isActive) public onlyOwner {
        Batchs[BatchId].isActive = _isActive;
    }

    // Add functions to manage the whitelist
    // Add to Whitelist
    function addToWhitelist(uint256 BatchId, address user, uint256 amount) public onlyOwner {
        whitelisted[BatchId][user] = amount;
    }

    // Remove from Whitelist
    function removeFromWhitelist(uint256 BatchId, address user) public onlyOwner {
        delete whitelisted[BatchId][user];
    }

    // Private
    // Internal Mint Function
    function _internalMint(address to, uint256 amount, uint256 BatchId, uint256 SpotId) private {
        require(BatchId > 0 && BatchId <= totalBatches, "Invalid BatchId");
        require(_currentId + amount <= MAX_SUPPLY, "Will exceed maximum supply");
        require(Batchs[BatchId].currentSupply + amount <= Batchs[BatchId].maxSupply, "Exceeds Batch maximum supply");

        for (uint256 i = 0; i < amount; i++) {
            uint256 previousBatchesMaxSupply = 0;
            for (uint256 j = 1; j < BatchId; j++) {
                previousBatchesMaxSupply += Batchs[j].maxSupply;
            }
            uint256 tokenId = previousBatchesMaxSupply + SpotId + i;

            _safeMint(to, tokenId);
            batchOfToken[tokenId] = BatchId;
            string memory uri = tokenURI(tokenId);
            emit TokenURICreated(tokenId, uri);
        }

        _currentId += amount;
        Batchs[BatchId].currentSupply += amount;
    }

    // Add functions to manage the blacklist
    // Add to Blacklist
    function blacklistToken(uint256 tokenId) public onlyOwner {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        address tokenOwner = ownerOf(tokenId);
        require(tokenOwner != owner(), "Cannot blacklist the contract owner");
        blacklistedTokens[tokenId] = true;
        blacklistedAddresses[tokenOwner] = true;
        string memory uri = tokenURI(tokenId);
        emit TokenURICreated(tokenId, uri);
    }

    // Reissue Blacklisted Token to Previous Owner
    function reissueBlacklistedToken(uint256 tokenId, address newOwner) public onlyOwner {
        require(blacklistedTokens[tokenId], "Token is not blacklisted");
        blacklistedTokens[tokenId] = false;
        _transfer(ownerOf(tokenId), newOwner, tokenId);
    }

    // Remove from Blacklist
    function removeFromBlacklist(uint256 tokenId) public onlyOwner {
        require(blacklistedTokens[tokenId], "Token is not blacklisted");
        blacklistedTokens[tokenId] = false;
        address tokenOwner = ownerOf(tokenId);
        blacklistedAddresses[tokenOwner] = false;
        emit TokenRemovedFromBlacklist(tokenId);
    }

    // Override Transfer Function
    function _transfer(address from, address to, uint256 tokenId) internal override {
        require(!blacklistedAddresses[to], "Transfer to a blacklisted address is not allowed");
        super._transfer(from, to, tokenId);
    }

    // ERC165
    function supportsInterface(bytes4 interfaceId) public view override(ERC721, IERC165) returns (bool) {
    return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);
    }

    // IERC2981
    // Royalty
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view override returns (address, uint256 royaltyAmount) {
        _tokenId; // silence solc warning
        royaltyAmount = (_salePrice * royaltyPercentage) / 100;
        return (royalties, royaltyAmount);
    }
}

File 1 of 14: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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 functionCallWithValue(target, data, 0, "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");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or 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 {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // 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
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

File 2 of 14: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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 14: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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 4 of 14: ERC721.sol
// SPDX-License-Identifier: Unlicensed
// OpenZeppelin Contracts (last updated v4.8.2) (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 {IERC721A-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721A: address zero is not a valid owner");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721A-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _ownerOf(tokenId);
        require(owner != address(0), "ERC721A: invalid token ID");
        return owner;
    }

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

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

    /**
     * @dev See {IERC721AMetadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

        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 overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721A: approve caller is not token owner or approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721A-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721A-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721A-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721A: caller is not token owner or 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 {IERC721AReceiver-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), "ERC721A: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist
     */
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _owners[tokenId];
    }

    /**
     * @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 _ownerOf(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) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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 {IERC721AReceiver-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 {IERC721AReceiver-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),
            "ERC721A: 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), "ERC721A: mint to the zero address");
        require(!_exists(tokenId), "ERC721A: token already minted");

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

        // Check that tokenId was not minted by `_beforeTokenTransfer` hook
        require(!_exists(tokenId), "ERC721A: token already minted");

        unchecked {
            // Will not overflow unless all 2**256 token ids are minted to the same owner.
            // Given that tokens are minted one by one, it is impossible in practice that
            // this ever happens. Might change if we allow batch minting.
            // The ERC fails to describe this case.
            _balances[to] += 1;
        }

        _owners[tokenId] = to;

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

        _afterTokenTransfer(address(0), to, tokenId, 1);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     * This is an internal function that does not check if the sender is authorized to operate on the token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

        // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook
        owner = ERC721.ownerOf(tokenId);

        // Clear approvals
        delete _tokenApprovals[tokenId];

        unchecked {
            // Cannot overflow, as that would require more tokens to be burned/transferred
            // out than the owner initially received through minting and transferring in.
            _balances[owner] -= 1;
        }
        delete _owners[tokenId];

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

        _afterTokenTransfer(owner, address(0), tokenId, 1);
    }

    /**
     * @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, "ERC721A: transfer from incorrect owner");
        require(to != address(0), "ERC721A: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId, 1);

        // Check that tokenId was not transferred by `_beforeTokenTransfer` hook
        require(ERC721.ownerOf(tokenId) == from, "ERC721A: transfer from incorrect owner");

        // Clear approvals from the previous owner
        delete _tokenApprovals[tokenId];

        unchecked {
            // `_balances[from]` cannot overflow for the same reason as described in `_burn`:
            // `from`'s balance is the number of token held, which is at least one before the current
            // transfer.
            // `_balances[to]` could overflow in the conditions described in `_mint`. That would require
            // all 2**256 token ids to be minted, which in practice is impossible.
            _balances[from] -= 1;
            _balances[to] += 1;
        }
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId, 1);
    }

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

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721A: invalid token ID");
    }

    /**
     * @dev Internal function to invoke {IERC721AReceiver-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("ERC721A: transfer to non ERC721Receiver implementer");
                } else {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.
     * - When `from` is zero, the tokens will be minted for `to`.
     * - When `to` is zero, ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.
     * - When `from` is zero, the tokens were minted for `to`.
     * - When `to` is zero, ``from``'s tokens were burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual {}

    /**
     * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override.
     *
     * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant
     * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such
     * that `ownerOf(tokenId)` is `a`.
     */
    // solhint-disable-next-line func-name-mixedcase
    function __unsafe_increaseBalance(address account, uint256 amount) internal {
        _balances[account] += amount;
    }
}

File 5 of 14: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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 6 of 14: IERC2981.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

File 7 of 14: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.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`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev 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 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

File 8 of 14: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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 14: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.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 `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

File 10 of 14: Math.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

File 11 of 14: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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 12 of 14: ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

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

File 13 of 14: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

import "./Math.sol";

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @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] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"address","name":"_royalties","type":"address"},{"internalType":"string","name":"_initialBaseURI","type":"string"},{"internalType":"string","name":"_initialContractURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":"uint256","name":"tokenId","type":"uint256"}],"name":"TokenRemovedFromBlacklist","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"uri","type":"string"}],"name":"TokenURICreated","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":"uint256","name":"","type":"uint256"}],"name":"Batchs","outputs":[{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"currentSupply","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"batchId","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"addBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"BatchId","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowedMinters","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"batchOfToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beneficiary","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"blacklistToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blacklistedAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"blacklistedTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"disburseRevenue","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"isWLActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"BatchId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"isWhitelisted","type":"bool"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"reissueBlacklistedToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"removeFromBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"BatchId","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"removeFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royalties","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"BatchId","type":"uint256"},{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setBatchActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"setBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setPublicActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_royalties","type":"address"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_royaltyPercentage","type":"uint256"}],"name":"setRoyaltyPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isWLActive","type":"bool"}],"name":"setWLActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBatches","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"whitelisted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260646008556000600d60006101000a81548160ff0219169083151502179055506000600d60016101000a81548160ff02191690831515021790555066038d7ea4c68000600e55600a6017553480156200005c57600080fd5b5060405162006131380380620061318339818101604052810190620000829190620004b2565b6040518060400160405280601c81526020017f54686520536174656c6c6974652050726f6a65637420627920544c4e000000008152506040518060400160405280600681526020017f544c4e53415400000000000000000000000000000000000000000000000000008152508160009081620000ff9190620007ad565b508060019081620001119190620007ad565b5050506200013462000128620001ec60201b60201c565b620001f460201b60201c565b600160078190555083600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600b9081620001cf9190620007ad565b5080600c9081620001e19190620007ad565b505050505062000894565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002fb82620002ce565b9050919050565b6200030d81620002ee565b81146200031957600080fd5b50565b6000815190506200032d8162000302565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000388826200033d565b810181811067ffffffffffffffff82111715620003aa57620003a96200034e565b5b80604052505050565b6000620003bf620002ba565b9050620003cd82826200037d565b919050565b600067ffffffffffffffff821115620003f057620003ef6200034e565b5b620003fb826200033d565b9050602081019050919050565b60005b83811015620004285780820151818401526020810190506200040b565b60008484015250505050565b60006200044b6200044584620003d2565b620003b3565b9050828152602081018484840111156200046a576200046962000338565b5b6200047784828562000408565b509392505050565b600082601f83011262000497576200049662000333565b5b8151620004a984826020860162000434565b91505092915050565b60008060008060808587031215620004cf57620004ce620002c4565b5b6000620004df878288016200031c565b9450506020620004f2878288016200031c565b935050604085015167ffffffffffffffff811115620005165762000515620002c9565b5b62000524878288016200047f565b925050606085015167ffffffffffffffff811115620005485762000547620002c9565b5b62000556878288016200047f565b91505092959194509250565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620005b557607f821691505b602082108103620005cb57620005ca6200056d565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620006357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620005f6565b620006418683620005f6565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200068e62000688620006828462000659565b62000663565b62000659565b9050919050565b6000819050919050565b620006aa836200066d565b620006c2620006b98262000695565b84845462000603565b825550505050565b600090565b620006d9620006ca565b620006e68184846200069f565b505050565b5b818110156200070e5762000702600082620006cf565b600181019050620006ec565b5050565b601f8211156200075d576200072781620005d1565b6200073284620005e6565b8101602085101562000742578190505b6200075a6200075185620005e6565b830182620006eb565b50505b505050565b600082821c905092915050565b6000620007826000198460080262000762565b1980831691505092915050565b60006200079d83836200076f565b9150826002028217905092915050565b620007b88262000562565b67ffffffffffffffff811115620007d457620007d36200034e565b5b620007e082546200059c565b620007ed82828562000712565b600060209050601f83116001811462000825576000841562000810578287015190505b6200081c85826200078f565b8655506200088c565b601f1984166200083586620005d1565b60005b828110156200085f5784890151825560018201915060208501945060208101905062000838565b868310156200087f57848901516200087b601f8916826200076f565b8355505b6001600288020188555050505b505050505050565b61588d80620008a46000396000f3fe6080604052600436106102e45760003560e01c806369ff6abb11610190578063a22cb465116100dc578063e8a3d48511610095578063f053dc5c1161006f578063f053dc5c14610b52578063f14b5bd614610b7d578063f2fde38b14610ba6578063fea3e61314610bcf576102e4565b8063e8a3d48514610ac1578063e985e9c514610aec578063ea3e6a9914610b29576102e4565b8063a22cb4651461098f578063b88d4fde146109b8578063c87b56dd146109e1578063ca08444914610a1e578063d5749d4214610a5b578063e13119fe14610a98576102e4565b80638aca408c1161014957806395d89b411161012357806395d89b41146108e0578063978a047b1461090b578063a035b1fe14610948578063a1d2119f14610973576102e4565b80638aca408c146108635780638da5cb5b1461088c578063938e3d7b146108b7576102e4565b806369ff6abb146107655780636c0360eb146107905780636f8b44b0146107bb57806370a08231146107e4578063715018a6146108215780638a71bb2d14610838576102e4565b80632a55205a1161024f57806342842e0e116102085780635f4bb80b116101e25780635f4bb80b146106b857806361ba27da146106d45780636352211e146106fd57806367ccec1e1461073a576102e4565b806342842e0e14610626578063456bf1221461064f57806355f804b31461068f576102e4565b80632a55205a146105175780632a9e63c61461055557806338af3eed1461057e5780633b305119146105a95780633ccfd60b146105d2578063423afa66146105e9576102e4565b80631dede107116102a15780631dede1071461040b57806321c2dfea14610434578063227f7abe1461045d57806322f3e2d41461048657806323b872dd146104b157806328c56b99146104da576102e4565b806301ffc9a7146102e957806306fdde0314610326578063081812fc14610351578063095ea7b31461038e57806318160ddd146103b75780631c31f710146103e2575b600080fd5b3480156102f557600080fd5b50610310600480360381019061030b91906138b8565b610bf8565b60405161031d9190613900565b60405180910390f35b34801561033257600080fd5b5061033b610c72565b60405161034891906139ab565b60405180910390f35b34801561035d57600080fd5b5061037860048036038101906103739190613a03565b610d04565b6040516103859190613a71565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b09190613ab8565b610d4a565b005b3480156103c357600080fd5b506103cc610e61565b6040516103d99190613b07565b60405180910390f35b3480156103ee57600080fd5b5061040960048036038101906104049190613b22565b610e6b565b005b34801561041757600080fd5b50610432600480360381019061042d9190613a03565b610eb7565b005b34801561044057600080fd5b5061045b60048036038101906104569190613b4f565b611057565b005b34801561046957600080fd5b50610484600480360381019061047f9190613bce565b6110b9565b005b34801561049257600080fd5b5061049b6110de565b6040516104a89190613900565b60405180910390f35b3480156104bd57600080fd5b506104d860048036038101906104d39190613bfb565b6110f1565b005b3480156104e657600080fd5b5061050160048036038101906104fc9190613a03565b611151565b60405161050e9190613900565b60405180910390f35b34801561052357600080fd5b5061053e60048036038101906105399190613c4e565b611171565b60405161054c929190613c8e565b60405180910390f35b34801561056157600080fd5b5061057c60048036038101906105779190613b22565b6111bc565b005b34801561058a57600080fd5b50610593611208565b6040516105a09190613a71565b60405180910390f35b3480156105b557600080fd5b506105d060048036038101906105cb9190613cb7565b61122e565b005b3480156105de57600080fd5b506105e7611268565b005b3480156105f557600080fd5b50610610600480360381019061060b9190613b22565b6113f9565b60405161061d9190613b07565b60405180910390f35b34801561063257600080fd5b5061064d60048036038101906106489190613bfb565b611411565b005b34801561065b57600080fd5b5061067660048036038101906106719190613a03565b611431565b6040516106869493929190613cf7565b60405180910390f35b34801561069b57600080fd5b506106b660048036038101906106b19190613e71565b61146e565b005b6106d260048036038101906106cd9190613eba565b611489565b005b3480156106e057600080fd5b506106fb60048036038101906106f69190613a03565b611828565b005b34801561070957600080fd5b50610724600480360381019061071f9190613a03565b61188b565b6040516107319190613a71565b60405180910390f35b34801561074657600080fd5b5061074f611911565b60405161075c9190613900565b60405180910390f35b34801561077157600080fd5b5061077a611924565b6040516107879190613b07565b60405180910390f35b34801561079c57600080fd5b506107a561192a565b6040516107b291906139ab565b60405180910390f35b3480156107c757600080fd5b506107e260048036038101906107dd9190613a03565b6119b8565b005b3480156107f057600080fd5b5061080b60048036038101906108069190613b22565b611a51565b6040516108189190613b07565b60405180910390f35b34801561082d57600080fd5b50610836611b08565b005b34801561084457600080fd5b5061084d611b1c565b60405161085a9190613b07565b60405180910390f35b34801561086f57600080fd5b5061088a60048036038101906108859190613bce565b611b22565b005b34801561089857600080fd5b506108a1611b47565b6040516108ae9190613a71565b60405180910390f35b3480156108c357600080fd5b506108de60048036038101906108d99190613e71565b611b71565b005b3480156108ec57600080fd5b506108f5611b8c565b60405161090291906139ab565b60405180910390f35b34801561091757600080fd5b50610932600480360381019061092d9190613f0d565b611c1e565b60405161093f9190613b07565b60405180910390f35b34801561095457600080fd5b5061095d611c43565b60405161096a9190613b07565b60405180910390f35b61098d60048036038101906109889190613a03565b611c49565b005b34801561099b57600080fd5b506109b660048036038101906109b19190613f4d565b611d36565b005b3480156109c457600080fd5b506109df60048036038101906109da919061402e565b611d4c565b005b3480156109ed57600080fd5b50610a086004803603810190610a039190613a03565b611dae565b604051610a1591906139ab565b60405180910390f35b348015610a2a57600080fd5b50610a456004803603810190610a409190613a03565b611f6b565b604051610a529190613b07565b60405180910390f35b348015610a6757600080fd5b50610a826004803603810190610a7d9190613b22565b611f83565b604051610a8f9190613900565b60405180910390f35b348015610aa457600080fd5b50610abf6004803603810190610aba91906140b1565b611fa3565b005b348015610acd57600080fd5b50610ad6612120565b604051610ae391906139ab565b60405180910390f35b348015610af857600080fd5b50610b136004803603810190610b0e9190614104565b6121b2565b604051610b209190613900565b60405180910390f35b348015610b3557600080fd5b50610b506004803603810190610b4b9190613f0d565b612246565b005b348015610b5e57600080fd5b50610b676122f1565b604051610b749190613a71565b60405180910390f35b348015610b8957600080fd5b50610ba46004803603810190610b9f9190613a03565b612317565b005b348015610bb257600080fd5b50610bcd6004803603810190610bc89190613b22565b612441565b005b348015610bdb57600080fd5b50610bf66004803603810190610bf19190613f0d565b6124c4565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c6b5750610c6a82612524565b5b9050919050565b606060008054610c8190614173565b80601f0160208091040260200160405190810160405280929190818152602001828054610cad90614173565b8015610cfa5780601f10610ccf57610100808354040283529160200191610cfa565b820191906000526020600020905b815481529060010190602001808311610cdd57829003601f168201915b5050505050905090565b6000610d0f82612606565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d558261188b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614216565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610de4612651565b73ffffffffffffffffffffffffffffffffffffffff161480610e135750610e1281610e0d612651565b6121b2565b5b610e52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e49906142a8565b60405180910390fd5b610e5c8383612659565b505050565b6000600954905090565b610e73612712565b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610ebf612712565b610ec881612790565b610f07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efe9061433a565b60405180910390fd5b6000610f128261188b565b9050610f1c611b47565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f80906143cc565b60405180910390fd5b60016015600084815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600061101883611dae565b9050827f4c582017928a1bb7075268e9b0ab7e47ccf1bc5cb7638da3e8f97b3cdcc887e68260405161104a91906139ab565b60405180910390a2505050565b61105f612712565b806013600085815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b6110c1612712565b80600d60016101000a81548160ff02191690831515021790555050565b600d60009054906101000a900460ff1681565b6111026110fc612651565b826127d1565b611141576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111389061445e565b60405180910390fd5b61114c838383612866565b505050565b60156020528060005260406000206000915054906101000a900460ff1681565b60008060646017548461118491906144ad565b61118e919061451e565b9050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691509250929050565b6111c4612712565b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611236612712565b806012600084815260200190815260200160002060030160006101000a81548160ff0219169083151502179055505050565b611270612712565b6000479050600080600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036112f75782905061138b565b60646017548461130791906144ad565b611311919061451e565b9150818361131f919061454f565b9050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015611389573d6000803e3d6000fd5b505b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156113f3573d6000803e3d6000fd5b50505050565b60116020528060005260406000206000915090505481565b61142c83838360405180602001604052806000815250611d4c565b505050565b60126020528060005260406000206000915090508060000154908060010154908060020154908060030160009054906101000a900460ff16905084565b611476612712565b80600b9081611485919061472f565b5050565b611491612903565b600061149b612651565b9050601660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561152a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152190614873565b60405180910390fd5b6012600085815260200190815260200160002060030160009054906101000a900460ff1661158d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611584906148df565b60405180910390fd5b6008548360095461159e91906148ff565b11156115df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d69061497f565b60405180910390fd5b82601260008681526020019081526020016000206002015461160191906144ad565b3414611642576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611639906149eb565b60405180910390fd5b600d60019054906101000a900460ff16156117965781611697576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168e90614a57565b60405180910390fd5b826013600086815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561172a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172190614ac3565b60405180910390fd5b826013600086815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461178a919061454f565b925050819055506117e6565b600d60009054906101000a900460ff166117e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117dc90614b55565b60405180910390fd5b5b60006001601260008781526020019081526020016000206001015461180b91906148ff565b905061181982858784612952565b5050611823612ba7565b505050565b611830612712565b60008110158015611842575060648111155b611881576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187890614bc1565b60405180910390fd5b8060178190555050565b60008061189783612bb1565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611908576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ff90614c2d565b60405180910390fd5b80915050919050565b600d60019054906101000a900460ff1681565b600a5481565b600b805461193790614173565b80601f016020809104026020016040519081016040528092919081815260200182805461196390614173565b80156119b05780601f10611985576101008083540402835291602001916119b0565b820191906000526020600020905b81548152906001019060200180831161199357829003601f168201915b505050505081565b6119c0612712565b60008111611a03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fa90614c99565b60405180910390fd5b6009548111611a47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3e90614d2b565b60405180910390fd5b8060088190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ac1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab890614dbd565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611b10612712565b611b1a6000612bee565b565b60175481565b611b2a612712565b80600d60006101000a81548160ff02191690831515021790555050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611b79612712565b80600c9081611b88919061472f565b5050565b606060018054611b9b90614173565b80601f0160208091040260200160405190810160405280929190818152602001828054611bc790614173565b8015611c145780601f10611be957610100808354040283529160200191611c14565b820191906000526020600020905b815481529060010190602001808311611bf757829003601f168201915b5050505050905090565b6013602052816000526040600020602052806000526040600020600091509150505481565b600e5481565b611c51612712565b6000611c5c8261188b565b9050601660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611ceb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce290614873565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611d31573d6000803e3d6000fd5b505050565b611d48611d41612651565b8383612cb4565b5050565b611d5d611d57612651565b836127d1565b611d9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d939061445e565b60405180910390fd5b611da884848484612e20565b50505050565b6060611db982612790565b611df8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611def9061433a565b60405180910390fd5b6015600083815260200190815260200160002060009054906101000a900460ff1615611e4657600b604051602001611e309190614eb7565b6040516020818303038152906040529050611f66565b600060146000848152602001908152602001600020549050600060018203611e7057839050611e9d565b60006014600184611e81919061454f565b611e8b91906144ad565b90508085611e99919061454f565b9150505b6000600b8054611eac90614173565b80601f0160208091040260200160405190810160405280929190818152602001828054611ed890614173565b8015611f255780601f10611efa57610100808354040283529160200191611f25565b820191906000526020600020905b815481529060010190602001808311611f0857829003601f168201915b5050505050905080611f3684612e7c565b611f3f84612e7c565b604051602001611f5193929190614fa2565b60405160208183030381529060405293505050505b919050565b60146020528060005260406000206000915090505481565b60166020528060005260406000206000915054906101000a900460ff1681565b611fab612712565b60008311611fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe590615040565b60405180910390fd5b600080600190505b848110156120355760126000828152602001908152602001600020600001548261202091906148ff565b9150808061202d90615060565b915050611ff6565b50828161204291906148ff565b9050600854811115612089576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120809061511a565b60405180910390fd5b604051806080016040528084815260200160008152602001838152602001600015158152506012600086815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548160ff021916908315150217905550905050600a600081548092919061211590615060565b919050555050505050565b6060600c805461212f90614173565b80601f016020809104026020016040519081016040528092919081815260200182805461215b90614173565b80156121a85780601f1061217d576101008083540402835291602001916121a8565b820191906000526020600020905b81548152906001019060200180831161218b57829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61224e612712565b6015600083815260200190815260200160002060009054906101000a900460ff166122ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a590615186565b60405180910390fd5b60006015600084815260200190815260200160002060006101000a81548160ff0219169083151502179055506122ed6122e68361188b565b8284612866565b5050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61231f612712565b6015600082815260200190815260200160002060009054906101000a900460ff1661237f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237690615186565b60405180910390fd5b60006015600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060006123b68261188b565b90506000601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550817f3fe19a85ed8afb2bce4bea665515d954120221f6e4df37b1fd68d65501fd1fec60405160405180910390a25050565b612449612712565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036124b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124af90615218565b60405180910390fd5b6124c181612bee565b50565b6124cc612712565b6013600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806125ef57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806125ff57506125fe82612f4a565b5b9050919050565b61260f81612790565b61264e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264590614c2d565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166126cc8361188b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61271a612651565b73ffffffffffffffffffffffffffffffffffffffff16612738611b47565b73ffffffffffffffffffffffffffffffffffffffff161461278e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278590615284565b60405180910390fd5b565b60008073ffffffffffffffffffffffffffffffffffffffff166127b283612bb1565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6000806127dd8361188b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061281f575061281e81856121b2565b5b8061285d57508373ffffffffffffffffffffffffffffffffffffffff1661284584610d04565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156128f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ea90614873565b60405180910390fd5b6128fe838383612fb4565b505050565b600260075403612948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293f906152f0565b60405180910390fd5b6002600781905550565b6000821180156129645750600a548211155b6129a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299a9061535c565b60405180910390fd5b600854836009546129b491906148ff565b11156129f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ec906153c8565b60405180910390fd5b6012600083815260200190815260200160002060000154836012600085815260200190815260200160002060010154612a2e91906148ff565b1115612a6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6690615434565b60405180910390fd5b60005b83811015612b5a57600080600190505b84811015612ac157601260008281526020019081526020016000206000015482612aac91906148ff565b91508080612ab990615060565b915050612a82565b506000828483612ad191906148ff565b612adb91906148ff565b9050612ae787826132ad565b8460146000838152602001908152602001600020819055506000612b0a82611dae565b9050817f4c582017928a1bb7075268e9b0ab7e47ccf1bc5cb7638da3e8f97b3cdcc887e682604051612b3c91906139ab565b60405180910390a25050508080612b5290615060565b915050612a72565b508260096000828254612b6d91906148ff565b9250508190555082601260008481526020019081526020016000206001016000828254612b9a91906148ff565b9250508190555050505050565b6001600781905550565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612d22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d19906154a0565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612e139190613900565b60405180910390a3505050565b612e2b848484612866565b612e37848484846132cb565b612e76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6d90615532565b60405180910390fd5b50505050565b606060006001612e8b84613452565b01905060008167ffffffffffffffff811115612eaa57612ea9613d46565b5b6040519080825280601f01601f191660200182016040528015612edc5781602001600182028036833780820191505090505b509050600082602001820190505b600115612f3f578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612f3357612f326144ef565b5b04945060008503612eea575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8273ffffffffffffffffffffffffffffffffffffffff16612fd48261188b565b73ffffffffffffffffffffffffffffffffffffffff161461302a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613021906155c4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613099576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161309090615656565b60405180910390fd5b6130a683838360016135a5565b8273ffffffffffffffffffffffffffffffffffffffff166130c68261188b565b73ffffffffffffffffffffffffffffffffffffffff161461311c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613113906155c4565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46132a883838360016135ab565b505050565b6132c78282604051806020016040528060008152506135b1565b5050565b60006132ec8473ffffffffffffffffffffffffffffffffffffffff1661360c565b15613445578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613315612651565b8786866040518563ffffffff1660e01b815260040161333794939291906156cb565b6020604051808303816000875af192505050801561337357506040513d601f19601f82011682018060405250810190613370919061572c565b60015b6133f5573d80600081146133a3576040519150601f19603f3d011682016040523d82523d6000602084013e6133a8565b606091505b5060008151036133ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133e490615532565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061344a565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106134b0577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816134a6576134a56144ef565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106134ed576d04ee2d6d415b85acef810000000083816134e3576134e26144ef565b5b0492506020810190505b662386f26fc10000831061351c57662386f26fc100008381613512576135116144ef565b5b0492506010810190505b6305f5e1008310613545576305f5e100838161353b5761353a6144ef565b5b0492506008810190505b612710831061356a5761271083816135605761355f6144ef565b5b0492506004810190505b6064831061358d5760648381613583576135826144ef565b5b0492506002810190505b600a831061359c576001810190505b80915050919050565b50505050565b50505050565b6135bb838361362f565b6135c860008484846132cb565b613607576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135fe90615532565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361369e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613695906157cb565b60405180910390fd5b6136a781612790565b156136e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136de90615837565b60405180910390fd5b6136f56000838360016135a5565b6136fe81612790565b1561373e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161373590615837565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46138486000838360016135ab565b5050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61389581613860565b81146138a057600080fd5b50565b6000813590506138b28161388c565b92915050565b6000602082840312156138ce576138cd613856565b5b60006138dc848285016138a3565b91505092915050565b60008115159050919050565b6138fa816138e5565b82525050565b600060208201905061391560008301846138f1565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561395557808201518184015260208101905061393a565b60008484015250505050565b6000601f19601f8301169050919050565b600061397d8261391b565b6139878185613926565b9350613997818560208601613937565b6139a081613961565b840191505092915050565b600060208201905081810360008301526139c58184613972565b905092915050565b6000819050919050565b6139e0816139cd565b81146139eb57600080fd5b50565b6000813590506139fd816139d7565b92915050565b600060208284031215613a1957613a18613856565b5b6000613a27848285016139ee565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a5b82613a30565b9050919050565b613a6b81613a50565b82525050565b6000602082019050613a866000830184613a62565b92915050565b613a9581613a50565b8114613aa057600080fd5b50565b600081359050613ab281613a8c565b92915050565b60008060408385031215613acf57613ace613856565b5b6000613add85828601613aa3565b9250506020613aee858286016139ee565b9150509250929050565b613b01816139cd565b82525050565b6000602082019050613b1c6000830184613af8565b92915050565b600060208284031215613b3857613b37613856565b5b6000613b4684828501613aa3565b91505092915050565b600080600060608486031215613b6857613b67613856565b5b6000613b76868287016139ee565b9350506020613b8786828701613aa3565b9250506040613b98868287016139ee565b9150509250925092565b613bab816138e5565b8114613bb657600080fd5b50565b600081359050613bc881613ba2565b92915050565b600060208284031215613be457613be3613856565b5b6000613bf284828501613bb9565b91505092915050565b600080600060608486031215613c1457613c13613856565b5b6000613c2286828701613aa3565b9350506020613c3386828701613aa3565b9250506040613c44868287016139ee565b9150509250925092565b60008060408385031215613c6557613c64613856565b5b6000613c73858286016139ee565b9250506020613c84858286016139ee565b9150509250929050565b6000604082019050613ca36000830185613a62565b613cb06020830184613af8565b9392505050565b60008060408385031215613cce57613ccd613856565b5b6000613cdc858286016139ee565b9250506020613ced85828601613bb9565b9150509250929050565b6000608082019050613d0c6000830187613af8565b613d196020830186613af8565b613d266040830185613af8565b613d3360608301846138f1565b95945050505050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613d7e82613961565b810181811067ffffffffffffffff82111715613d9d57613d9c613d46565b5b80604052505050565b6000613db061384c565b9050613dbc8282613d75565b919050565b600067ffffffffffffffff821115613ddc57613ddb613d46565b5b613de582613961565b9050602081019050919050565b82818337600083830152505050565b6000613e14613e0f84613dc1565b613da6565b905082815260208101848484011115613e3057613e2f613d41565b5b613e3b848285613df2565b509392505050565b600082601f830112613e5857613e57613d3c565b5b8135613e68848260208601613e01565b91505092915050565b600060208284031215613e8757613e86613856565b5b600082013567ffffffffffffffff811115613ea557613ea461385b565b5b613eb184828501613e43565b91505092915050565b600080600060608486031215613ed357613ed2613856565b5b6000613ee1868287016139ee565b9350506020613ef2868287016139ee565b9250506040613f0386828701613bb9565b9150509250925092565b60008060408385031215613f2457613f23613856565b5b6000613f32858286016139ee565b9250506020613f4385828601613aa3565b9150509250929050565b60008060408385031215613f6457613f63613856565b5b6000613f7285828601613aa3565b9250506020613f8385828601613bb9565b9150509250929050565b600067ffffffffffffffff821115613fa857613fa7613d46565b5b613fb182613961565b9050602081019050919050565b6000613fd1613fcc84613f8d565b613da6565b905082815260208101848484011115613fed57613fec613d41565b5b613ff8848285613df2565b509392505050565b600082601f83011261401557614014613d3c565b5b8135614025848260208601613fbe565b91505092915050565b6000806000806080858703121561404857614047613856565b5b600061405687828801613aa3565b945050602061406787828801613aa3565b9350506040614078878288016139ee565b925050606085013567ffffffffffffffff8111156140995761409861385b565b5b6140a587828801614000565b91505092959194509250565b6000806000606084860312156140ca576140c9613856565b5b60006140d8868287016139ee565b93505060206140e9868287016139ee565b92505060406140fa868287016139ee565b9150509250925092565b6000806040838503121561411b5761411a613856565b5b600061412985828601613aa3565b925050602061413a85828601613aa3565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061418b57607f821691505b60208210810361419e5761419d614144565b5b50919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000614200602283613926565b915061420b826141a4565b604082019050919050565b6000602082019050818103600083015261422f816141f3565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74207460008201527f6f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000602082015250565b6000614292603e83613926565b915061429d82614236565b604082019050919050565b600060208201905081810360008301526142c181614285565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614324602f83613926565b915061432f826142c8565b604082019050919050565b6000602082019050818103600083015261435381614317565b9050919050565b7f43616e6e6f7420626c61636b6c6973742074686520636f6e7472616374206f7760008201527f6e65720000000000000000000000000000000000000000000000000000000000602082015250565b60006143b6602383613926565b91506143c18261435a565b604082019050919050565b600060208201905081810360008301526143e5816143a9565b9050919050565b7f455243373231413a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206f7220617070726f766564000000000000000000000000000000000000602082015250565b6000614448602e83613926565b9150614453826143ec565b604082019050919050565b600060208201905081810360008301526144778161443b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006144b8826139cd565b91506144c3836139cd565b92508282026144d1816139cd565b915082820484148315176144e8576144e761447e565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614529826139cd565b9150614534836139cd565b925082614544576145436144ef565b5b828204905092915050565b600061455a826139cd565b9150614565836139cd565b925082820390508181111561457d5761457c61447e565b5b92915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026145e57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826145a8565b6145ef86836145a8565b95508019841693508086168417925050509392505050565b6000819050919050565b600061462c614627614622846139cd565b614607565b6139cd565b9050919050565b6000819050919050565b61464683614611565b61465a61465282614633565b8484546145b5565b825550505050565b600090565b61466f614662565b61467a81848461463d565b505050565b5b8181101561469e57614693600082614667565b600181019050614680565b5050565b601f8211156146e3576146b481614583565b6146bd84614598565b810160208510156146cc578190505b6146e06146d885614598565b83018261467f565b50505b505050565b600082821c905092915050565b6000614706600019846008026146e8565b1980831691505092915050565b600061471f83836146f5565b9150826002028217905092915050565b6147388261391b565b67ffffffffffffffff81111561475157614750613d46565b5b61475b8254614173565b6147668282856146a2565b600060209050601f8311600181146147995760008415614787578287015190505b6147918582614713565b8655506147f9565b601f1984166147a786614583565b60005b828110156147cf578489015182556001820191506020850194506020810190506147aa565b868310156147ec57848901516147e8601f8916826146f5565b8355505b6001600288020188555050505b505050505050565b7f5472616e7366657220746f206120626c61636b6c69737465642061646472657360008201527f73206973206e6f7420616c6c6f77656400000000000000000000000000000000602082015250565b600061485d603083613926565b915061486882614801565b604082019050919050565b6000602082019050818103600083015261488c81614850565b9050919050565b7f426174636820697320636c6f7365640000000000000000000000000000000000600082015250565b60006148c9600f83613926565b91506148d482614893565b602082019050919050565b600060208201905081810360008301526148f8816148bc565b9050919050565b600061490a826139cd565b9150614915836139cd565b925082820190508082111561492d5761492c61447e565b5b92915050565b7f496e73756666696369656e74206d696e7473206c656674000000000000000000600082015250565b6000614969601783613926565b915061497482614933565b602082019050919050565b600060208201905081810360008301526149988161495c565b9050919050565b7f496e636f72726563742070617961626c6520616d6f756e740000000000000000600082015250565b60006149d5601883613926565b91506149e08261499f565b602082019050919050565b60006020820190508181036000830152614a04816149c8565b9050919050565b7f57686974656c697374206d696e74206973206e6f742061637469766500000000600082015250565b6000614a41601c83613926565b9150614a4c82614a0b565b602082019050919050565b60006020820190508181036000830152614a7081614a34565b9050919050565b7f4e6f7420616c6c6f77656420746f206d696e74207468697320616d6f756e7400600082015250565b6000614aad601f83613926565b9150614ab882614a77565b602082019050919050565b60006020820190508181036000830152614adc81614aa0565b9050919050565b7f5075626c6963206d696e74206973206e6f74206163746976652061742074686560008201527f206d6f6d656e742e000000000000000000000000000000000000000000000000602082015250565b6000614b3f602883613926565b9150614b4a82614ae3565b604082019050919050565b60006020820190508181036000830152614b6e81614b32565b9050919050565b7f496e76616c696420726f79616c74792070657263656e74616765000000000000600082015250565b6000614bab601a83613926565b9150614bb682614b75565b602082019050919050565b60006020820190508181036000830152614bda81614b9e565b9050919050565b7f455243373231413a20696e76616c696420746f6b656e20494400000000000000600082015250565b6000614c17601983613926565b9150614c2282614be1565b602082019050919050565b60006020820190508181036000830152614c4681614c0a565b9050919050565b7f4d617820737570706c792063616e6e6f74206265203000000000000000000000600082015250565b6000614c83601683613926565b9150614c8e82614c4d565b602082019050919050565b60006020820190508181036000830152614cb281614c76565b9050919050565b7f4d617820737570706c792063616e6e6f74206265206c657373207468616e206360008201527f757272656e7420737570706c7900000000000000000000000000000000000000602082015250565b6000614d15602d83613926565b9150614d2082614cb9565b604082019050919050565b60006020820190508181036000830152614d4481614d08565b9050919050565b7f455243373231413a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b6000614da7602a83613926565b9150614db282614d4b565b604082019050919050565b60006020820190508181036000830152614dd681614d9a565b9050919050565b600081905092915050565b60008154614df581614173565b614dff8186614ddd565b94506001821660008114614e1a5760018114614e2f57614e62565b60ff1983168652811515820286019350614e62565b614e3885614583565b60005b83811015614e5a57815481890152600182019150602081019050614e3b565b838801955050505b50505092915050565b7f2f626c61636b6c69737465640000000000000000000000000000000000000000600082015250565b6000614ea1600c83614ddd565b9150614eac82614e6b565b600c82019050919050565b6000614ec38284614de8565b9150614ece82614e94565b915081905092915050565b6000614ee48261391b565b614eee8185614ddd565b9350614efe818560208601613937565b80840191505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b6000614f40600183614ddd565b9150614f4b82614f0a565b600182019050919050565b7f2f6d657461646174612e6a736f6e000000000000000000000000000000000000600082015250565b6000614f8c600e83614ddd565b9150614f9782614f56565b600e82019050919050565b6000614fae8286614ed9565b9150614fb982614f33565b9150614fc58285614ed9565b9150614fd082614f33565b9150614fdc8284614ed9565b9150614fe782614f7f565b9150819050949350505050565b7f4261746368204944206d7573742062652067726561746572207468616e203000600082015250565b600061502a601f83613926565b915061503582614ff4565b602082019050919050565b600060208201905081810360008301526150598161501d565b9050919050565b600061506b826139cd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361509d5761509c61447e565b5b600182019050919050565b7f416464696e67207468697320626174636820776f756c6420657863656564207460008201527f6865206d617820737570706c79206f662074686520636f6e7472616374000000602082015250565b6000615104603d83613926565b915061510f826150a8565b604082019050919050565b60006020820190508181036000830152615133816150f7565b9050919050565b7f546f6b656e206973206e6f7420626c61636b6c69737465640000000000000000600082015250565b6000615170601883613926565b915061517b8261513a565b602082019050919050565b6000602082019050818103600083015261519f81615163565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615202602683613926565b915061520d826151a6565b604082019050919050565b60006020820190508181036000830152615231816151f5565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061526e602083613926565b915061527982615238565b602082019050919050565b6000602082019050818103600083015261529d81615261565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006152da601f83613926565b91506152e5826152a4565b602082019050919050565b60006020820190508181036000830152615309816152cd565b9050919050565b7f496e76616c696420426174636849640000000000000000000000000000000000600082015250565b6000615346600f83613926565b915061535182615310565b602082019050919050565b6000602082019050818103600083015261537581615339565b9050919050565b7f57696c6c20657863656564206d6178696d756d20737570706c79000000000000600082015250565b60006153b2601a83613926565b91506153bd8261537c565b602082019050919050565b600060208201905081810360008301526153e1816153a5565b9050919050565b7f45786365656473204261746368206d6178696d756d20737570706c7900000000600082015250565b600061541e601c83613926565b9150615429826153e8565b602082019050919050565b6000602082019050818103600083015261544d81615411565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b600061548a601a83613926565b915061549582615454565b602082019050919050565b600060208201905081810360008301526154b98161547d565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b600061551c603383613926565b9150615527826154c0565b604082019050919050565b6000602082019050818103600083015261554b8161550f565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b60006155ae602683613926565b91506155b982615552565b604082019050919050565b600060208201905081810360008301526155dd816155a1565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000615640602583613926565b915061564b826155e4565b604082019050919050565b6000602082019050818103600083015261566f81615633565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061569d82615676565b6156a78185615681565b93506156b7818560208601613937565b6156c081613961565b840191505092915050565b60006080820190506156e06000830187613a62565b6156ed6020830186613a62565b6156fa6040830185613af8565b818103606083015261570c8184615692565b905095945050505050565b6000815190506157268161388c565b92915050565b60006020828403121561574257615741613856565b5b600061575084828501615717565b91505092915050565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006157b5602183613926565b91506157c082615759565b604082019050919050565b600060208201905081810360008301526157e4816157a8565b9050919050565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b6000615821601d83613926565b915061582c826157eb565b602082019050919050565b6000602082019050818103600083015261585081615814565b905091905056fea26469706673582212205ab47e4caac55a6c101d489c52046656730b9b422c58a4f577fa816e3b7b1d2964736f6c63430008130033000000000000000000000000004b92939f22fca226ae19039dd06b18f5f6f0e5000000000000000000000000004b92939f22fca226ae19039dd06b18f5f6f0e5000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000002968747470733a2f2f7473702e7468657574696c697479636f6d70616e792e636f2f6d657461646174610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a68747470733a2f2f7473702e7468657574696c697479636f6d70616e792e636f2f636f6e74726163747300000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102e45760003560e01c806369ff6abb11610190578063a22cb465116100dc578063e8a3d48511610095578063f053dc5c1161006f578063f053dc5c14610b52578063f14b5bd614610b7d578063f2fde38b14610ba6578063fea3e61314610bcf576102e4565b8063e8a3d48514610ac1578063e985e9c514610aec578063ea3e6a9914610b29576102e4565b8063a22cb4651461098f578063b88d4fde146109b8578063c87b56dd146109e1578063ca08444914610a1e578063d5749d4214610a5b578063e13119fe14610a98576102e4565b80638aca408c1161014957806395d89b411161012357806395d89b41146108e0578063978a047b1461090b578063a035b1fe14610948578063a1d2119f14610973576102e4565b80638aca408c146108635780638da5cb5b1461088c578063938e3d7b146108b7576102e4565b806369ff6abb146107655780636c0360eb146107905780636f8b44b0146107bb57806370a08231146107e4578063715018a6146108215780638a71bb2d14610838576102e4565b80632a55205a1161024f57806342842e0e116102085780635f4bb80b116101e25780635f4bb80b146106b857806361ba27da146106d45780636352211e146106fd57806367ccec1e1461073a576102e4565b806342842e0e14610626578063456bf1221461064f57806355f804b31461068f576102e4565b80632a55205a146105175780632a9e63c61461055557806338af3eed1461057e5780633b305119146105a95780633ccfd60b146105d2578063423afa66146105e9576102e4565b80631dede107116102a15780631dede1071461040b57806321c2dfea14610434578063227f7abe1461045d57806322f3e2d41461048657806323b872dd146104b157806328c56b99146104da576102e4565b806301ffc9a7146102e957806306fdde0314610326578063081812fc14610351578063095ea7b31461038e57806318160ddd146103b75780631c31f710146103e2575b600080fd5b3480156102f557600080fd5b50610310600480360381019061030b91906138b8565b610bf8565b60405161031d9190613900565b60405180910390f35b34801561033257600080fd5b5061033b610c72565b60405161034891906139ab565b60405180910390f35b34801561035d57600080fd5b5061037860048036038101906103739190613a03565b610d04565b6040516103859190613a71565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b09190613ab8565b610d4a565b005b3480156103c357600080fd5b506103cc610e61565b6040516103d99190613b07565b60405180910390f35b3480156103ee57600080fd5b5061040960048036038101906104049190613b22565b610e6b565b005b34801561041757600080fd5b50610432600480360381019061042d9190613a03565b610eb7565b005b34801561044057600080fd5b5061045b60048036038101906104569190613b4f565b611057565b005b34801561046957600080fd5b50610484600480360381019061047f9190613bce565b6110b9565b005b34801561049257600080fd5b5061049b6110de565b6040516104a89190613900565b60405180910390f35b3480156104bd57600080fd5b506104d860048036038101906104d39190613bfb565b6110f1565b005b3480156104e657600080fd5b5061050160048036038101906104fc9190613a03565b611151565b60405161050e9190613900565b60405180910390f35b34801561052357600080fd5b5061053e60048036038101906105399190613c4e565b611171565b60405161054c929190613c8e565b60405180910390f35b34801561056157600080fd5b5061057c60048036038101906105779190613b22565b6111bc565b005b34801561058a57600080fd5b50610593611208565b6040516105a09190613a71565b60405180910390f35b3480156105b557600080fd5b506105d060048036038101906105cb9190613cb7565b61122e565b005b3480156105de57600080fd5b506105e7611268565b005b3480156105f557600080fd5b50610610600480360381019061060b9190613b22565b6113f9565b60405161061d9190613b07565b60405180910390f35b34801561063257600080fd5b5061064d60048036038101906106489190613bfb565b611411565b005b34801561065b57600080fd5b5061067660048036038101906106719190613a03565b611431565b6040516106869493929190613cf7565b60405180910390f35b34801561069b57600080fd5b506106b660048036038101906106b19190613e71565b61146e565b005b6106d260048036038101906106cd9190613eba565b611489565b005b3480156106e057600080fd5b506106fb60048036038101906106f69190613a03565b611828565b005b34801561070957600080fd5b50610724600480360381019061071f9190613a03565b61188b565b6040516107319190613a71565b60405180910390f35b34801561074657600080fd5b5061074f611911565b60405161075c9190613900565b60405180910390f35b34801561077157600080fd5b5061077a611924565b6040516107879190613b07565b60405180910390f35b34801561079c57600080fd5b506107a561192a565b6040516107b291906139ab565b60405180910390f35b3480156107c757600080fd5b506107e260048036038101906107dd9190613a03565b6119b8565b005b3480156107f057600080fd5b5061080b60048036038101906108069190613b22565b611a51565b6040516108189190613b07565b60405180910390f35b34801561082d57600080fd5b50610836611b08565b005b34801561084457600080fd5b5061084d611b1c565b60405161085a9190613b07565b60405180910390f35b34801561086f57600080fd5b5061088a60048036038101906108859190613bce565b611b22565b005b34801561089857600080fd5b506108a1611b47565b6040516108ae9190613a71565b60405180910390f35b3480156108c357600080fd5b506108de60048036038101906108d99190613e71565b611b71565b005b3480156108ec57600080fd5b506108f5611b8c565b60405161090291906139ab565b60405180910390f35b34801561091757600080fd5b50610932600480360381019061092d9190613f0d565b611c1e565b60405161093f9190613b07565b60405180910390f35b34801561095457600080fd5b5061095d611c43565b60405161096a9190613b07565b60405180910390f35b61098d60048036038101906109889190613a03565b611c49565b005b34801561099b57600080fd5b506109b660048036038101906109b19190613f4d565b611d36565b005b3480156109c457600080fd5b506109df60048036038101906109da919061402e565b611d4c565b005b3480156109ed57600080fd5b50610a086004803603810190610a039190613a03565b611dae565b604051610a1591906139ab565b60405180910390f35b348015610a2a57600080fd5b50610a456004803603810190610a409190613a03565b611f6b565b604051610a529190613b07565b60405180910390f35b348015610a6757600080fd5b50610a826004803603810190610a7d9190613b22565b611f83565b604051610a8f9190613900565b60405180910390f35b348015610aa457600080fd5b50610abf6004803603810190610aba91906140b1565b611fa3565b005b348015610acd57600080fd5b50610ad6612120565b604051610ae391906139ab565b60405180910390f35b348015610af857600080fd5b50610b136004803603810190610b0e9190614104565b6121b2565b604051610b209190613900565b60405180910390f35b348015610b3557600080fd5b50610b506004803603810190610b4b9190613f0d565b612246565b005b348015610b5e57600080fd5b50610b676122f1565b604051610b749190613a71565b60405180910390f35b348015610b8957600080fd5b50610ba46004803603810190610b9f9190613a03565b612317565b005b348015610bb257600080fd5b50610bcd6004803603810190610bc89190613b22565b612441565b005b348015610bdb57600080fd5b50610bf66004803603810190610bf19190613f0d565b6124c4565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c6b5750610c6a82612524565b5b9050919050565b606060008054610c8190614173565b80601f0160208091040260200160405190810160405280929190818152602001828054610cad90614173565b8015610cfa5780601f10610ccf57610100808354040283529160200191610cfa565b820191906000526020600020905b815481529060010190602001808311610cdd57829003601f168201915b5050505050905090565b6000610d0f82612606565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d558261188b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614216565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610de4612651565b73ffffffffffffffffffffffffffffffffffffffff161480610e135750610e1281610e0d612651565b6121b2565b5b610e52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e49906142a8565b60405180910390fd5b610e5c8383612659565b505050565b6000600954905090565b610e73612712565b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610ebf612712565b610ec881612790565b610f07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efe9061433a565b60405180910390fd5b6000610f128261188b565b9050610f1c611b47565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f80906143cc565b60405180910390fd5b60016015600084815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600061101883611dae565b9050827f4c582017928a1bb7075268e9b0ab7e47ccf1bc5cb7638da3e8f97b3cdcc887e68260405161104a91906139ab565b60405180910390a2505050565b61105f612712565b806013600085815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b6110c1612712565b80600d60016101000a81548160ff02191690831515021790555050565b600d60009054906101000a900460ff1681565b6111026110fc612651565b826127d1565b611141576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111389061445e565b60405180910390fd5b61114c838383612866565b505050565b60156020528060005260406000206000915054906101000a900460ff1681565b60008060646017548461118491906144ad565b61118e919061451e565b9050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691509250929050565b6111c4612712565b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611236612712565b806012600084815260200190815260200160002060030160006101000a81548160ff0219169083151502179055505050565b611270612712565b6000479050600080600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036112f75782905061138b565b60646017548461130791906144ad565b611311919061451e565b9150818361131f919061454f565b9050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015611389573d6000803e3d6000fd5b505b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156113f3573d6000803e3d6000fd5b50505050565b60116020528060005260406000206000915090505481565b61142c83838360405180602001604052806000815250611d4c565b505050565b60126020528060005260406000206000915090508060000154908060010154908060020154908060030160009054906101000a900460ff16905084565b611476612712565b80600b9081611485919061472f565b5050565b611491612903565b600061149b612651565b9050601660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561152a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152190614873565b60405180910390fd5b6012600085815260200190815260200160002060030160009054906101000a900460ff1661158d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611584906148df565b60405180910390fd5b6008548360095461159e91906148ff565b11156115df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d69061497f565b60405180910390fd5b82601260008681526020019081526020016000206002015461160191906144ad565b3414611642576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611639906149eb565b60405180910390fd5b600d60019054906101000a900460ff16156117965781611697576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168e90614a57565b60405180910390fd5b826013600086815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561172a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172190614ac3565b60405180910390fd5b826013600086815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461178a919061454f565b925050819055506117e6565b600d60009054906101000a900460ff166117e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117dc90614b55565b60405180910390fd5b5b60006001601260008781526020019081526020016000206001015461180b91906148ff565b905061181982858784612952565b5050611823612ba7565b505050565b611830612712565b60008110158015611842575060648111155b611881576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187890614bc1565b60405180910390fd5b8060178190555050565b60008061189783612bb1565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611908576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ff90614c2d565b60405180910390fd5b80915050919050565b600d60019054906101000a900460ff1681565b600a5481565b600b805461193790614173565b80601f016020809104026020016040519081016040528092919081815260200182805461196390614173565b80156119b05780601f10611985576101008083540402835291602001916119b0565b820191906000526020600020905b81548152906001019060200180831161199357829003601f168201915b505050505081565b6119c0612712565b60008111611a03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fa90614c99565b60405180910390fd5b6009548111611a47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3e90614d2b565b60405180910390fd5b8060088190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ac1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab890614dbd565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611b10612712565b611b1a6000612bee565b565b60175481565b611b2a612712565b80600d60006101000a81548160ff02191690831515021790555050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611b79612712565b80600c9081611b88919061472f565b5050565b606060018054611b9b90614173565b80601f0160208091040260200160405190810160405280929190818152602001828054611bc790614173565b8015611c145780601f10611be957610100808354040283529160200191611c14565b820191906000526020600020905b815481529060010190602001808311611bf757829003601f168201915b5050505050905090565b6013602052816000526040600020602052806000526040600020600091509150505481565b600e5481565b611c51612712565b6000611c5c8261188b565b9050601660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611ceb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce290614873565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611d31573d6000803e3d6000fd5b505050565b611d48611d41612651565b8383612cb4565b5050565b611d5d611d57612651565b836127d1565b611d9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d939061445e565b60405180910390fd5b611da884848484612e20565b50505050565b6060611db982612790565b611df8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611def9061433a565b60405180910390fd5b6015600083815260200190815260200160002060009054906101000a900460ff1615611e4657600b604051602001611e309190614eb7565b6040516020818303038152906040529050611f66565b600060146000848152602001908152602001600020549050600060018203611e7057839050611e9d565b60006014600184611e81919061454f565b611e8b91906144ad565b90508085611e99919061454f565b9150505b6000600b8054611eac90614173565b80601f0160208091040260200160405190810160405280929190818152602001828054611ed890614173565b8015611f255780601f10611efa57610100808354040283529160200191611f25565b820191906000526020600020905b815481529060010190602001808311611f0857829003601f168201915b5050505050905080611f3684612e7c565b611f3f84612e7c565b604051602001611f5193929190614fa2565b60405160208183030381529060405293505050505b919050565b60146020528060005260406000206000915090505481565b60166020528060005260406000206000915054906101000a900460ff1681565b611fab612712565b60008311611fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe590615040565b60405180910390fd5b600080600190505b848110156120355760126000828152602001908152602001600020600001548261202091906148ff565b9150808061202d90615060565b915050611ff6565b50828161204291906148ff565b9050600854811115612089576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120809061511a565b60405180910390fd5b604051806080016040528084815260200160008152602001838152602001600015158152506012600086815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548160ff021916908315150217905550905050600a600081548092919061211590615060565b919050555050505050565b6060600c805461212f90614173565b80601f016020809104026020016040519081016040528092919081815260200182805461215b90614173565b80156121a85780601f1061217d576101008083540402835291602001916121a8565b820191906000526020600020905b81548152906001019060200180831161218b57829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61224e612712565b6015600083815260200190815260200160002060009054906101000a900460ff166122ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a590615186565b60405180910390fd5b60006015600084815260200190815260200160002060006101000a81548160ff0219169083151502179055506122ed6122e68361188b565b8284612866565b5050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61231f612712565b6015600082815260200190815260200160002060009054906101000a900460ff1661237f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237690615186565b60405180910390fd5b60006015600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060006123b68261188b565b90506000601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550817f3fe19a85ed8afb2bce4bea665515d954120221f6e4df37b1fd68d65501fd1fec60405160405180910390a25050565b612449612712565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036124b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124af90615218565b60405180910390fd5b6124c181612bee565b50565b6124cc612712565b6013600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806125ef57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806125ff57506125fe82612f4a565b5b9050919050565b61260f81612790565b61264e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264590614c2d565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166126cc8361188b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61271a612651565b73ffffffffffffffffffffffffffffffffffffffff16612738611b47565b73ffffffffffffffffffffffffffffffffffffffff161461278e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278590615284565b60405180910390fd5b565b60008073ffffffffffffffffffffffffffffffffffffffff166127b283612bb1565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6000806127dd8361188b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061281f575061281e81856121b2565b5b8061285d57508373ffffffffffffffffffffffffffffffffffffffff1661284584610d04565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156128f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ea90614873565b60405180910390fd5b6128fe838383612fb4565b505050565b600260075403612948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293f906152f0565b60405180910390fd5b6002600781905550565b6000821180156129645750600a548211155b6129a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299a9061535c565b60405180910390fd5b600854836009546129b491906148ff565b11156129f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ec906153c8565b60405180910390fd5b6012600083815260200190815260200160002060000154836012600085815260200190815260200160002060010154612a2e91906148ff565b1115612a6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6690615434565b60405180910390fd5b60005b83811015612b5a57600080600190505b84811015612ac157601260008281526020019081526020016000206000015482612aac91906148ff565b91508080612ab990615060565b915050612a82565b506000828483612ad191906148ff565b612adb91906148ff565b9050612ae787826132ad565b8460146000838152602001908152602001600020819055506000612b0a82611dae565b9050817f4c582017928a1bb7075268e9b0ab7e47ccf1bc5cb7638da3e8f97b3cdcc887e682604051612b3c91906139ab565b60405180910390a25050508080612b5290615060565b915050612a72565b508260096000828254612b6d91906148ff565b9250508190555082601260008481526020019081526020016000206001016000828254612b9a91906148ff565b9250508190555050505050565b6001600781905550565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612d22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d19906154a0565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612e139190613900565b60405180910390a3505050565b612e2b848484612866565b612e37848484846132cb565b612e76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6d90615532565b60405180910390fd5b50505050565b606060006001612e8b84613452565b01905060008167ffffffffffffffff811115612eaa57612ea9613d46565b5b6040519080825280601f01601f191660200182016040528015612edc5781602001600182028036833780820191505090505b509050600082602001820190505b600115612f3f578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612f3357612f326144ef565b5b04945060008503612eea575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8273ffffffffffffffffffffffffffffffffffffffff16612fd48261188b565b73ffffffffffffffffffffffffffffffffffffffff161461302a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613021906155c4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613099576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161309090615656565b60405180910390fd5b6130a683838360016135a5565b8273ffffffffffffffffffffffffffffffffffffffff166130c68261188b565b73ffffffffffffffffffffffffffffffffffffffff161461311c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613113906155c4565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46132a883838360016135ab565b505050565b6132c78282604051806020016040528060008152506135b1565b5050565b60006132ec8473ffffffffffffffffffffffffffffffffffffffff1661360c565b15613445578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613315612651565b8786866040518563ffffffff1660e01b815260040161333794939291906156cb565b6020604051808303816000875af192505050801561337357506040513d601f19601f82011682018060405250810190613370919061572c565b60015b6133f5573d80600081146133a3576040519150601f19603f3d011682016040523d82523d6000602084013e6133a8565b606091505b5060008151036133ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133e490615532565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061344a565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106134b0577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816134a6576134a56144ef565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106134ed576d04ee2d6d415b85acef810000000083816134e3576134e26144ef565b5b0492506020810190505b662386f26fc10000831061351c57662386f26fc100008381613512576135116144ef565b5b0492506010810190505b6305f5e1008310613545576305f5e100838161353b5761353a6144ef565b5b0492506008810190505b612710831061356a5761271083816135605761355f6144ef565b5b0492506004810190505b6064831061358d5760648381613583576135826144ef565b5b0492506002810190505b600a831061359c576001810190505b80915050919050565b50505050565b50505050565b6135bb838361362f565b6135c860008484846132cb565b613607576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135fe90615532565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361369e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613695906157cb565b60405180910390fd5b6136a781612790565b156136e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136de90615837565b60405180910390fd5b6136f56000838360016135a5565b6136fe81612790565b1561373e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161373590615837565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46138486000838360016135ab565b5050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61389581613860565b81146138a057600080fd5b50565b6000813590506138b28161388c565b92915050565b6000602082840312156138ce576138cd613856565b5b60006138dc848285016138a3565b91505092915050565b60008115159050919050565b6138fa816138e5565b82525050565b600060208201905061391560008301846138f1565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561395557808201518184015260208101905061393a565b60008484015250505050565b6000601f19601f8301169050919050565b600061397d8261391b565b6139878185613926565b9350613997818560208601613937565b6139a081613961565b840191505092915050565b600060208201905081810360008301526139c58184613972565b905092915050565b6000819050919050565b6139e0816139cd565b81146139eb57600080fd5b50565b6000813590506139fd816139d7565b92915050565b600060208284031215613a1957613a18613856565b5b6000613a27848285016139ee565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a5b82613a30565b9050919050565b613a6b81613a50565b82525050565b6000602082019050613a866000830184613a62565b92915050565b613a9581613a50565b8114613aa057600080fd5b50565b600081359050613ab281613a8c565b92915050565b60008060408385031215613acf57613ace613856565b5b6000613add85828601613aa3565b9250506020613aee858286016139ee565b9150509250929050565b613b01816139cd565b82525050565b6000602082019050613b1c6000830184613af8565b92915050565b600060208284031215613b3857613b37613856565b5b6000613b4684828501613aa3565b91505092915050565b600080600060608486031215613b6857613b67613856565b5b6000613b76868287016139ee565b9350506020613b8786828701613aa3565b9250506040613b98868287016139ee565b9150509250925092565b613bab816138e5565b8114613bb657600080fd5b50565b600081359050613bc881613ba2565b92915050565b600060208284031215613be457613be3613856565b5b6000613bf284828501613bb9565b91505092915050565b600080600060608486031215613c1457613c13613856565b5b6000613c2286828701613aa3565b9350506020613c3386828701613aa3565b9250506040613c44868287016139ee565b9150509250925092565b60008060408385031215613c6557613c64613856565b5b6000613c73858286016139ee565b9250506020613c84858286016139ee565b9150509250929050565b6000604082019050613ca36000830185613a62565b613cb06020830184613af8565b9392505050565b60008060408385031215613cce57613ccd613856565b5b6000613cdc858286016139ee565b9250506020613ced85828601613bb9565b9150509250929050565b6000608082019050613d0c6000830187613af8565b613d196020830186613af8565b613d266040830185613af8565b613d3360608301846138f1565b95945050505050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613d7e82613961565b810181811067ffffffffffffffff82111715613d9d57613d9c613d46565b5b80604052505050565b6000613db061384c565b9050613dbc8282613d75565b919050565b600067ffffffffffffffff821115613ddc57613ddb613d46565b5b613de582613961565b9050602081019050919050565b82818337600083830152505050565b6000613e14613e0f84613dc1565b613da6565b905082815260208101848484011115613e3057613e2f613d41565b5b613e3b848285613df2565b509392505050565b600082601f830112613e5857613e57613d3c565b5b8135613e68848260208601613e01565b91505092915050565b600060208284031215613e8757613e86613856565b5b600082013567ffffffffffffffff811115613ea557613ea461385b565b5b613eb184828501613e43565b91505092915050565b600080600060608486031215613ed357613ed2613856565b5b6000613ee1868287016139ee565b9350506020613ef2868287016139ee565b9250506040613f0386828701613bb9565b9150509250925092565b60008060408385031215613f2457613f23613856565b5b6000613f32858286016139ee565b9250506020613f4385828601613aa3565b9150509250929050565b60008060408385031215613f6457613f63613856565b5b6000613f7285828601613aa3565b9250506020613f8385828601613bb9565b9150509250929050565b600067ffffffffffffffff821115613fa857613fa7613d46565b5b613fb182613961565b9050602081019050919050565b6000613fd1613fcc84613f8d565b613da6565b905082815260208101848484011115613fed57613fec613d41565b5b613ff8848285613df2565b509392505050565b600082601f83011261401557614014613d3c565b5b8135614025848260208601613fbe565b91505092915050565b6000806000806080858703121561404857614047613856565b5b600061405687828801613aa3565b945050602061406787828801613aa3565b9350506040614078878288016139ee565b925050606085013567ffffffffffffffff8111156140995761409861385b565b5b6140a587828801614000565b91505092959194509250565b6000806000606084860312156140ca576140c9613856565b5b60006140d8868287016139ee565b93505060206140e9868287016139ee565b92505060406140fa868287016139ee565b9150509250925092565b6000806040838503121561411b5761411a613856565b5b600061412985828601613aa3565b925050602061413a85828601613aa3565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061418b57607f821691505b60208210810361419e5761419d614144565b5b50919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000614200602283613926565b915061420b826141a4565b604082019050919050565b6000602082019050818103600083015261422f816141f3565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74207460008201527f6f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000602082015250565b6000614292603e83613926565b915061429d82614236565b604082019050919050565b600060208201905081810360008301526142c181614285565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614324602f83613926565b915061432f826142c8565b604082019050919050565b6000602082019050818103600083015261435381614317565b9050919050565b7f43616e6e6f7420626c61636b6c6973742074686520636f6e7472616374206f7760008201527f6e65720000000000000000000000000000000000000000000000000000000000602082015250565b60006143b6602383613926565b91506143c18261435a565b604082019050919050565b600060208201905081810360008301526143e5816143a9565b9050919050565b7f455243373231413a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206f7220617070726f766564000000000000000000000000000000000000602082015250565b6000614448602e83613926565b9150614453826143ec565b604082019050919050565b600060208201905081810360008301526144778161443b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006144b8826139cd565b91506144c3836139cd565b92508282026144d1816139cd565b915082820484148315176144e8576144e761447e565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614529826139cd565b9150614534836139cd565b925082614544576145436144ef565b5b828204905092915050565b600061455a826139cd565b9150614565836139cd565b925082820390508181111561457d5761457c61447e565b5b92915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026145e57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826145a8565b6145ef86836145a8565b95508019841693508086168417925050509392505050565b6000819050919050565b600061462c614627614622846139cd565b614607565b6139cd565b9050919050565b6000819050919050565b61464683614611565b61465a61465282614633565b8484546145b5565b825550505050565b600090565b61466f614662565b61467a81848461463d565b505050565b5b8181101561469e57614693600082614667565b600181019050614680565b5050565b601f8211156146e3576146b481614583565b6146bd84614598565b810160208510156146cc578190505b6146e06146d885614598565b83018261467f565b50505b505050565b600082821c905092915050565b6000614706600019846008026146e8565b1980831691505092915050565b600061471f83836146f5565b9150826002028217905092915050565b6147388261391b565b67ffffffffffffffff81111561475157614750613d46565b5b61475b8254614173565b6147668282856146a2565b600060209050601f8311600181146147995760008415614787578287015190505b6147918582614713565b8655506147f9565b601f1984166147a786614583565b60005b828110156147cf578489015182556001820191506020850194506020810190506147aa565b868310156147ec57848901516147e8601f8916826146f5565b8355505b6001600288020188555050505b505050505050565b7f5472616e7366657220746f206120626c61636b6c69737465642061646472657360008201527f73206973206e6f7420616c6c6f77656400000000000000000000000000000000602082015250565b600061485d603083613926565b915061486882614801565b604082019050919050565b6000602082019050818103600083015261488c81614850565b9050919050565b7f426174636820697320636c6f7365640000000000000000000000000000000000600082015250565b60006148c9600f83613926565b91506148d482614893565b602082019050919050565b600060208201905081810360008301526148f8816148bc565b9050919050565b600061490a826139cd565b9150614915836139cd565b925082820190508082111561492d5761492c61447e565b5b92915050565b7f496e73756666696369656e74206d696e7473206c656674000000000000000000600082015250565b6000614969601783613926565b915061497482614933565b602082019050919050565b600060208201905081810360008301526149988161495c565b9050919050565b7f496e636f72726563742070617961626c6520616d6f756e740000000000000000600082015250565b60006149d5601883613926565b91506149e08261499f565b602082019050919050565b60006020820190508181036000830152614a04816149c8565b9050919050565b7f57686974656c697374206d696e74206973206e6f742061637469766500000000600082015250565b6000614a41601c83613926565b9150614a4c82614a0b565b602082019050919050565b60006020820190508181036000830152614a7081614a34565b9050919050565b7f4e6f7420616c6c6f77656420746f206d696e74207468697320616d6f756e7400600082015250565b6000614aad601f83613926565b9150614ab882614a77565b602082019050919050565b60006020820190508181036000830152614adc81614aa0565b9050919050565b7f5075626c6963206d696e74206973206e6f74206163746976652061742074686560008201527f206d6f6d656e742e000000000000000000000000000000000000000000000000602082015250565b6000614b3f602883613926565b9150614b4a82614ae3565b604082019050919050565b60006020820190508181036000830152614b6e81614b32565b9050919050565b7f496e76616c696420726f79616c74792070657263656e74616765000000000000600082015250565b6000614bab601a83613926565b9150614bb682614b75565b602082019050919050565b60006020820190508181036000830152614bda81614b9e565b9050919050565b7f455243373231413a20696e76616c696420746f6b656e20494400000000000000600082015250565b6000614c17601983613926565b9150614c2282614be1565b602082019050919050565b60006020820190508181036000830152614c4681614c0a565b9050919050565b7f4d617820737570706c792063616e6e6f74206265203000000000000000000000600082015250565b6000614c83601683613926565b9150614c8e82614c4d565b602082019050919050565b60006020820190508181036000830152614cb281614c76565b9050919050565b7f4d617820737570706c792063616e6e6f74206265206c657373207468616e206360008201527f757272656e7420737570706c7900000000000000000000000000000000000000602082015250565b6000614d15602d83613926565b9150614d2082614cb9565b604082019050919050565b60006020820190508181036000830152614d4481614d08565b9050919050565b7f455243373231413a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b6000614da7602a83613926565b9150614db282614d4b565b604082019050919050565b60006020820190508181036000830152614dd681614d9a565b9050919050565b600081905092915050565b60008154614df581614173565b614dff8186614ddd565b94506001821660008114614e1a5760018114614e2f57614e62565b60ff1983168652811515820286019350614e62565b614e3885614583565b60005b83811015614e5a57815481890152600182019150602081019050614e3b565b838801955050505b50505092915050565b7f2f626c61636b6c69737465640000000000000000000000000000000000000000600082015250565b6000614ea1600c83614ddd565b9150614eac82614e6b565b600c82019050919050565b6000614ec38284614de8565b9150614ece82614e94565b915081905092915050565b6000614ee48261391b565b614eee8185614ddd565b9350614efe818560208601613937565b80840191505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b6000614f40600183614ddd565b9150614f4b82614f0a565b600182019050919050565b7f2f6d657461646174612e6a736f6e000000000000000000000000000000000000600082015250565b6000614f8c600e83614ddd565b9150614f9782614f56565b600e82019050919050565b6000614fae8286614ed9565b9150614fb982614f33565b9150614fc58285614ed9565b9150614fd082614f33565b9150614fdc8284614ed9565b9150614fe782614f7f565b9150819050949350505050565b7f4261746368204944206d7573742062652067726561746572207468616e203000600082015250565b600061502a601f83613926565b915061503582614ff4565b602082019050919050565b600060208201905081810360008301526150598161501d565b9050919050565b600061506b826139cd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361509d5761509c61447e565b5b600182019050919050565b7f416464696e67207468697320626174636820776f756c6420657863656564207460008201527f6865206d617820737570706c79206f662074686520636f6e7472616374000000602082015250565b6000615104603d83613926565b915061510f826150a8565b604082019050919050565b60006020820190508181036000830152615133816150f7565b9050919050565b7f546f6b656e206973206e6f7420626c61636b6c69737465640000000000000000600082015250565b6000615170601883613926565b915061517b8261513a565b602082019050919050565b6000602082019050818103600083015261519f81615163565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615202602683613926565b915061520d826151a6565b604082019050919050565b60006020820190508181036000830152615231816151f5565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061526e602083613926565b915061527982615238565b602082019050919050565b6000602082019050818103600083015261529d81615261565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006152da601f83613926565b91506152e5826152a4565b602082019050919050565b60006020820190508181036000830152615309816152cd565b9050919050565b7f496e76616c696420426174636849640000000000000000000000000000000000600082015250565b6000615346600f83613926565b915061535182615310565b602082019050919050565b6000602082019050818103600083015261537581615339565b9050919050565b7f57696c6c20657863656564206d6178696d756d20737570706c79000000000000600082015250565b60006153b2601a83613926565b91506153bd8261537c565b602082019050919050565b600060208201905081810360008301526153e1816153a5565b9050919050565b7f45786365656473204261746368206d6178696d756d20737570706c7900000000600082015250565b600061541e601c83613926565b9150615429826153e8565b602082019050919050565b6000602082019050818103600083015261544d81615411565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b600061548a601a83613926565b915061549582615454565b602082019050919050565b600060208201905081810360008301526154b98161547d565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b600061551c603383613926565b9150615527826154c0565b604082019050919050565b6000602082019050818103600083015261554b8161550f565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b60006155ae602683613926565b91506155b982615552565b604082019050919050565b600060208201905081810360008301526155dd816155a1565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000615640602583613926565b915061564b826155e4565b604082019050919050565b6000602082019050818103600083015261566f81615633565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061569d82615676565b6156a78185615681565b93506156b7818560208601613937565b6156c081613961565b840191505092915050565b60006080820190506156e06000830187613a62565b6156ed6020830186613a62565b6156fa6040830185613af8565b818103606083015261570c8184615692565b905095945050505050565b6000815190506157268161388c565b92915050565b60006020828403121561574257615741613856565b5b600061575084828501615717565b91505092915050565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006157b5602183613926565b91506157c082615759565b604082019050919050565b600060208201905081810360008301526157e4816157a8565b9050919050565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b6000615821601d83613926565b915061582c826157eb565b602082019050919050565b6000602082019050818103600083015261585081615814565b905091905056fea26469706673582212205ab47e4caac55a6c101d489c52046656730b9b422c58a4f577fa816e3b7b1d2964736f6c63430008130033

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

000000000000000000000000004b92939f22fca226ae19039dd06b18f5f6f0e5000000000000000000000000004b92939f22fca226ae19039dd06b18f5f6f0e5000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000002968747470733a2f2f7473702e7468657574696c697479636f6d70616e792e636f2f6d657461646174610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a68747470733a2f2f7473702e7468657574696c697479636f6d70616e792e636f2f636f6e74726163747300000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _beneficiary (address): 0x004B92939F22fcA226aE19039Dd06B18F5F6F0E5
Arg [1] : _royalties (address): 0x004B92939F22fcA226aE19039Dd06B18F5F6F0E5
Arg [2] : _initialBaseURI (string): https://tsp.theutilitycompany.co/metadata
Arg [3] : _initialContractURI (string): https://tsp.theutilitycompany.co/contracts

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 000000000000000000000000004b92939f22fca226ae19039dd06b18f5f6f0e5
Arg [1] : 000000000000000000000000004b92939f22fca226ae19039dd06b18f5f6f0e5
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000029
Arg [5] : 68747470733a2f2f7473702e7468657574696c697479636f6d70616e792e636f
Arg [6] : 2f6d657461646174610000000000000000000000000000000000000000000000
Arg [7] : 000000000000000000000000000000000000000000000000000000000000002a
Arg [8] : 68747470733a2f2f7473702e7468657574696c697479636f6d70616e792e636f
Arg [9] : 2f636f6e74726163747300000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

246:10708:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10424:203;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2418:98:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3888:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3418:408;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2820:89:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2016:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8954:468;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7547:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2713:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;546:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4568:327:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1751:49:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10668:283;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;2227:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;659:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7339:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4631:850;;;;;;;;;;;;;:::i;:::-;;1305:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4962:179:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1405:39:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;3197:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3653:951;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2366:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2135:220:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;581:30:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;450:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;484:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2936:253;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1872:205:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1824:101:10;;;;;;;;;;;;;:::i;:::-;;2181:37:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2608:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1194:85:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3506:97:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2581:102:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1532:66:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;618:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5539:278;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4123:153:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5208:315;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5861:782:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1655:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1807:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6669:634;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3401:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4343:162:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9482:269:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;692:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9789:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2074:198:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7727:129:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10424:203;10518:4;10553:26;10538:41;;;:11;:41;;;;:81;;;;10583:36;10607:11;10583:23;:36::i;:::-;10538:81;10531:88;;10424:203;;;:::o;2418:98:3:-;2472:13;2504:5;2497:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2418:98;:::o;3888:167::-;3964:7;3983:23;3998:7;3983:14;:23::i;:::-;4024:15;:24;4040:7;4024:24;;;;;;;;;;;;;;;;;;;;;4017:31;;3888:167;;;:::o;3418:408::-;3498:13;3514:23;3529:7;3514:14;:23::i;:::-;3498:39;;3561:5;3555:11;;:2;:11;;;3547:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;3653:5;3637:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3662:37;3679:5;3686:12;:10;:12::i;:::-;3662:16;:37::i;:::-;3637:62;3616:171;;;;;;;;;;;;:::i;:::-;;;;;;;;;3798:21;3807:2;3811:7;3798:8;:21::i;:::-;3488:338;3418:408;;:::o;2820:89:13:-;2864:7;2891:10;;2884:17;;2820:89;:::o;2016:108::-;1087:13:10;:11;:13::i;:::-;2104:12:13::1;2090:11;;:26;;;;;;;;;;;;;;;;;;2016:108:::0;:::o;8954:468::-;1087:13:10;:11;:13::i;:::-;9031:16:13::1;9039:7;9031;:16::i;:::-;9023:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;9110:18;9131:16;9139:7;9131;:16::i;:::-;9110:37;;9180:7;:5;:7::i;:::-;9166:21;;:10;:21;;::::0;9158:69:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;9267:4;9238:17;:26;9256:7;9238:26;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;9317:4;9282:20;:32;9303:10;9282:32;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;9332:17;9352;9361:7;9352:8;:17::i;:::-;9332:37;;9401:7;9385:29;9410:3;9385:29;;;;;;:::i;:::-;;;;;;;;9012:410;;8954:468:::0;:::o;7547:142::-;1087:13:10;:11;:13::i;:::-;7675:6:13::1;7646:11;:20;7658:7;7646:20;;;;;;;;;;;:26;7667:4;7646:26;;;;;;;;;;;;;;;:35;;;;7547:142:::0;;;:::o;2713:99::-;1087:13:10;:11;:13::i;:::-;2793:11:13::1;2780:10;;:24;;;;;;;;;;;;;;;;;;2713:99:::0;:::o;546:28::-;;;;;;;;;;;;;:::o;4568:327:3:-;4757:41;4776:12;:10;:12::i;:::-;4790:7;4757:18;:41::i;:::-;4749:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;4860:28;4870:4;4876:2;4880:7;4860:9;:28::i;:::-;4568:327;;;:::o;1751:49:13:-;;;;;;;;;;;;;;;;;;;;;;:::o;10668:283::-;10759:7;10768:21;10896:3;10875:17;;10862:10;:30;;;;:::i;:::-;10861:38;;;;:::i;:::-;10845:54;;10918:9;;;;;;;;;;;10910:33;;10668:283;;;;;:::o;2227:100::-;1087:13:10;:11;:13::i;:::-;2309:10:13::1;2297:9;;:22;;;;;;;;;;;;;;;;;;2227:100:::0;:::o;659:26::-;;;;;;;;;;;;;:::o;7339:129::-;1087:13:10;:11;:13::i;:::-;7451:9:13::1;7424:6;:15;7431:7;7424:15;;;;;;;;;;;:24;;;:36;;;;;;;;;;;;;;;;;;7339:129:::0;;:::o;4631:850::-;1087:13:10;:11;:13::i;:::-;4679:15:13::1;4697:21;4679:39;;4729:21;4761:25:::0;4900:11:::1;;;;;;;;;;;4887:24;;:9;;;;;;;;;;;:24;;::::0;4883:480:::1;;4999:7;4979:27;;4883:480;;;5190:3;5170:17;;5160:7;:27;;;;:::i;:::-;:33;;;;:::i;:::-;5144:49;;5238:13;5228:7;:23;;;;:::i;:::-;5208:43;;5274:9;;;;;;;;;;;5266:27;;:42;5294:13;5266:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;4883:480;5381:11;;;;;;;;;;;5373:29;;:48;5403:17;5373:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;4668:813;;;4631:850::o:0;1305:49::-;;;;;;;;;;;;;;;;;:::o;4962:179:3:-;5095:39;5112:4;5118:2;5122:7;5095:39;;;;;;;;;;;;:16;:39::i;:::-;4962:179;;;:::o;1405:39:13:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3197:88::-;1087:13:10;:11;:13::i;:::-;3274:3:13::1;3264:7;:13;;;;;;:::i;:::-;;3197:88:::0;:::o;3653:951::-;2261:21:11;:19;:21::i;:::-;3759:14:13::1;3776:12;:10;:12::i;:::-;3759:29;;3808:20;:28;3829:6;3808:28;;;;;;;;;;;;;;;;;;;;;;;;;3807:29;3799:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;3908:6;:15;3915:7;3908:15;;;;;;;;;;;:24;;;;;;;;;;;;3900:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;3994:10;;3984:6;3971:10;;:19;;;;:::i;:::-;:33;;3963:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;4088:6;4064;:15;4071:7;4064:15;;;;;;;;;;;:21;;;:30;;;;:::i;:::-;4051:9;:43;4043:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;4140:10;;;;;;;;;;;4136:341;;;4175:13;4167:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;4276:6;4244:11;:20;4256:7;4244:20;;;;;;;;;;;:28;4265:6;4244:28;;;;;;;;;;;;;;;;:38;;4236:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;4365:6;4333:11;:20;4345:7;4333:20;;;;;;;;;;;:28;4354:6;4333:28;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;4136:341;;;4412:8;;;;;;;;;;;4404:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;4136:341;4489:14;4538:1;4506:6;:15;4513:7;4506:15;;;;;;;;;;;:29;;;:33;;;;:::i;:::-;4489:50;;4550:46;4564:6;4572;4580:7;4589:6;4550:13;:46::i;:::-;3748:856;;2303:20:11::0;:18;:20::i;:::-;3653:951:13;;;:::o;2366:234::-;1087:13:10;:11;:13::i;:::-;2482:1:13::1;2460:18;:23;;:52;;;;;2509:3;2487:18;:25;;2460:52;2452:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;2574:18;2554:17;:38;;;;2366:234:::0;:::o;2135:220:3:-;2207:7;2226:13;2242:17;2251:7;2242:8;:17::i;:::-;2226:33;;2294:1;2277:19;;:5;:19;;;2269:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;2343:5;2336:12;;;2135:220;;;:::o;581:30:13:-;;;;;;;;;;;;;:::o;450:27::-;;;;:::o;484:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2936:253::-;1087:13:10;:11;:13::i;:::-;3027:1:13::1;3014:10;:14;3006:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;3087:10;;3074;:23;3066:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;3171:10;3158;:23;;;;2936:253:::0;:::o;1872:205:3:-;1944:7;1988:1;1971:19;;:5;:19;;;1963:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2054:9;:16;2064:5;2054:16;;;;;;;;;;;;;;;;2047:23;;1872:205;;;:::o;1824:101:10:-;1087:13;:11;:13::i;:::-;1888:30:::1;1915:1;1888:18;:30::i;:::-;1824:101::o:0;2181:37:13:-;;;;:::o;2608:97::-;1087:13:10;:11;:13::i;:::-;2688:9:13::1;2677:8;;:20;;;;;;;;;;;;;;;;;;2608:97:::0;:::o;1194:85:10:-;1240:7;1266:6;;;;;;;;;;;1259:13;;1194:85;:::o;3506:97:13:-;1087:13:10;:11;:13::i;:::-;3592:3:13::1;3577:12;:18;;;;;;:::i;:::-;;3506:97:::0;:::o;2581:102:3:-;2637:13;2669:7;2662:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2581:102;:::o;1532:66:13:-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;618:34::-;;;;:::o;5539:278::-;1087:13:10;:11;:13::i;:::-;5617:18:13::1;5638:16;5646:7;5638;:16::i;:::-;5617:37;;5674:20;:32;5695:10;5674:32;;;;;;;;;;;;;;;;;;;;;;;;;5673:33;5665:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;5778:10;5770:28;;:39;5799:9;5770:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;5606:211;5539:278:::0;:::o;4123:153:3:-;4217:52;4236:12;:10;:12::i;:::-;4250:8;4260;4217:18;:52::i;:::-;4123:153;;:::o;5208:315::-;5376:41;5395:12;:10;:12::i;:::-;5409:7;5376:18;:41::i;:::-;5368:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;5478:38;5492:4;5498:2;5502:7;5511:4;5478:13;:38::i;:::-;5208:315;;;;:::o;5861:782:13:-;5934:13;5968:16;5976:7;5968;:16::i;:::-;5960:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;6053:17;:26;6071:7;6053:26;;;;;;;;;;;;;;;;;;;;;6049:115;;;6127:7;6110:41;;;;;;;;:::i;:::-;;;;;;;;;;;;;6096:56;;;;6049:115;6176:15;6194:12;:21;6207:7;6194:21;;;;;;;;;;;;6176:39;;6226:14;6268:1;6257:7;:12;6253:205;;6295:7;6286:16;;6253:205;;;6335:32;6386:2;6381:1;6371:7;:11;;;;:::i;:::-;6370:18;;;;:::i;:::-;6335:53;;6422:24;6412:7;:34;;;;:::i;:::-;6403:43;;6320:138;6253:205;6470:28;6501:7;6470:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6552:14;6573:18;:7;:16;:18::i;:::-;6598:17;:6;:15;:17::i;:::-;6535:99;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6521:114;;;;;5861:782;;;;:::o;1655:47::-;;;;;;;;;;;;;;;;;:::o;1807:52::-;;;;;;;;;;;;;;;;;;;;;;:::o;6669:634::-;1087:13:10;:11;:13::i;:::-;6785:1:13::1;6775:7;:11;6767:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;6902:25;6947:9:::0;6959:1:::1;6947:13;;6942:105;6966:7;6962:1;:11;6942:105;;;7016:6;:9;7023:1;7016:9;;;;;;;;;;;:19;;;6995:40;;;;;:::i;:::-;;;6975:3;;;;;:::i;:::-;;;;6942:105;;;;7078:9;7057:30;;;;;:::i;:::-;;;7129:10;;7108:17;:31;;7100:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;7236:34;;;;;;;;7242:9;7236:34;;;;7253:1;7236:34;;;;7256:6;7236:34;;;;7264:5;7236:34;;;;::::0;7218:6:::1;:15;7225:7;7218:15;;;;;;;;;;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7281:12;;:14;;;;;;;;;:::i;:::-;;;;;;6756:547;6669:634:::0;;;:::o;3401:97::-;3445:13;3478:12;3471:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3401:97;:::o;4343:162:3:-;4440:4;4463:18;:25;4482:5;4463:25;;;;;;;;;;;;;;;:35;4489:8;4463:35;;;;;;;;;;;;;;;;;;;;;;;;;4456:42;;4343:162;;;;:::o;9482:269:13:-;1087:13:10;:11;:13::i;:::-;9586:17:13::1;:26;9604:7;9586:26;;;;;;;;;;;;;;;;;;;;;9578:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;9681:5;9652:17;:26;9670:7;9652:26;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;9697:46;9707:16;9715:7;9707;:16::i;:::-;9725:8;9735:7;9697:9;:46::i;:::-;9482:269:::0;;:::o;692:24::-;;;;;;;;;;;;;:::o;9789:339::-;1087:13:10;:11;:13::i;:::-;9871:17:13::1;:26;9889:7;9871:26;;;;;;;;;;;;;;;;;;;;;9863:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;9966:5;9937:17;:26;9955:7;9937:26;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;9982:18;10003:16;10011:7;10003;:16::i;:::-;9982:37;;10065:5;10030:20;:32;10051:10;10030:32;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;10112:7;10086:34;;;;;;;;;;9852:276;9789:339:::0;:::o;2074:198:10:-;1087:13;:11;:13::i;:::-;2182:1:::1;2162:22;;:8;:22;;::::0;2154:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2237:28;2256:8;2237:18;:28::i;:::-;2074:198:::0;:::o;7727:129:13:-;1087:13:10;:11;:13::i;:::-;7822:11:13::1;:20;7834:7;7822:20;;;;;;;;;;;:26;7843:4;7822:26;;;;;;;;;;;;;;;7815:33;;;7727:129:::0;;:::o;1512:300:3:-;1614:4;1664:25;1649:40;;;:11;:40;;;;:104;;;;1720:33;1705:48;;;:11;:48;;;;1649:104;:156;;;;1769:36;1793:11;1769:23;:36::i;:::-;1649:156;1630:175;;1512:300;;;:::o;13438:134::-;13519:16;13527:7;13519;:16::i;:::-;13511:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;13438:134;:::o;640:96:1:-;693:7;719:10;712:17;;640:96;:::o;12739:171:3:-;12840:2;12813:15;:24;12829:7;12813:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;12895:7;12891:2;12857:46;;12866:23;12881:7;12866:14;:23::i;:::-;12857:46;;;;;;;;;;;;12739:171;;:::o;1352:130:10:-;1426:12;:10;:12::i;:::-;1415:23;;:7;:5;:7::i;:::-;:23;;;1407:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1352:130::o;7218:126:3:-;7283:4;7335:1;7306:31;;:17;7315:7;7306:8;:17::i;:::-;:31;;;;7299:38;;7218:126;;;:::o;7502:261::-;7595:4;7611:13;7627:23;7642:7;7627:14;:23::i;:::-;7611:39;;7679:5;7668:16;;:7;:16;;;:52;;;;7688:32;7705:5;7712:7;7688:16;:32::i;:::-;7668:52;:87;;;;7748:7;7724:31;;:20;7736:7;7724:11;:20::i;:::-;:31;;;7668:87;7660:96;;;7502:261;;;;:::o;10171:230:13:-;10271:20;:24;10292:2;10271:24;;;;;;;;;;;;;;;;;;;;;;;;;10270:25;10262:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;10359:34;10375:4;10381:2;10385:7;10359:15;:34::i;:::-;10171:230;;;:::o;2336:287:11:-;1759:1;2468:7;;:19;2460:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1759:1;2598:7;:18;;;;2336:287::o;7911:964:13:-;8032:1;8022:7;:11;:38;;;;;8048:12;;8037:7;:23;;8022:38;8014:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;8122:10;;8112:6;8099:10;;:19;;;;:::i;:::-;:33;;8091:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;8224:6;:15;8231:7;8224:15;;;;;;;;;;;:25;;;8214:6;8182;:15;8189:7;8182:15;;;;;;;;;;;:29;;;:38;;;;:::i;:::-;:67;;8174:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;8300:9;8295:490;8319:6;8315:1;:10;8295:490;;;8347:32;8403:9;8415:1;8403:13;;8398:120;8422:7;8418:1;:11;8398:120;;;8483:6;:9;8490:1;8483:9;;;;;;;;;;;:19;;;8455:47;;;;;:::i;:::-;;;8431:3;;;;;:::i;:::-;;;;8398:120;;;;8532:15;8586:1;8577:6;8550:24;:33;;;;:::i;:::-;:37;;;;:::i;:::-;8532:55;;8604:22;8614:2;8618:7;8604:9;:22::i;:::-;8665:7;8641:12;:21;8654:7;8641:21;;;;;;;;;;;:31;;;;8687:17;8707;8716:7;8707:8;:17::i;:::-;8687:37;;8760:7;8744:29;8769:3;8744:29;;;;;;:::i;:::-;;;;;;;;8332:453;;;8327:3;;;;;:::i;:::-;;;;8295:490;;;;8811:6;8797:10;;:20;;;;;;;:::i;:::-;;;;;;;;8861:6;8828;:15;8835:7;8828:15;;;;;;;;;;;:29;;;:39;;;;;;;:::i;:::-;;;;;;;;7911:964;;;;:::o;2629:209:11:-;1716:1;2809:7;:22;;;;2629:209::o;6800:115:3:-;6866:7;6892;:16;6900:7;6892:16;;;;;;;;;;;;;;;;;;;;;6885:23;;6800:115;;;:::o;2426:187:10:-;2499:16;2518:6;;;;;;;;;;;2499:25;;2543:8;2534:6;;:17;;;;;;;;;;;;;;;;;;2597:8;2566:40;;2587:8;2566:40;;;;;;;;;;;;2489:124;2426:187;:::o;13046:308:3:-;13196:8;13187:17;;:5;:17;;;13179:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;13283:8;13245:18;:25;13264:5;13245:25;;;;;;;;;;;;;;;:35;13271:8;13245:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;13328:8;13306:41;;13321:5;13306:41;;;13338:8;13306:41;;;;;;:::i;:::-;;;;;;;;13046:308;;;:::o;6385:306::-;6535:28;6545:4;6551:2;6555:7;6535:9;:28::i;:::-;6581:47;6604:4;6610:2;6614:7;6623:4;6581:22;:47::i;:::-;6573:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6385:306;;;;:::o;410:696:12:-;466:13;515:14;552:1;532:17;543:5;532:10;:17::i;:::-;:21;515:38;;567:20;601:6;590:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;567:41;;622:11;748:6;744:2;740:15;732:6;728:28;721:35;;783:280;790:4;783:280;;;814:5;;;;;;;;953:8;948:2;941:5;937:14;932:30;927:3;919:44;1007:2;998:11;;;;;;:::i;:::-;;;;;1040:1;1031:5;:10;783:280;1027:21;783:280;1083:6;1076:13;;;;;410:696;;;:::o;829:155:2:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;11391:1236:3:-;11545:4;11518:31;;:23;11533:7;11518:14;:23::i;:::-;:31;;;11510:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;11624:1;11610:16;;:2;:16;;;11602:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;11679:42;11700:4;11706:2;11710:7;11719:1;11679:20;:42::i;:::-;11848:4;11821:31;;:23;11836:7;11821:14;:23::i;:::-;:31;;;11813:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;11964:15;:24;11980:7;11964:24;;;;;;;;;;;;11957:31;;;;;;;;;;;12451:1;12432:9;:15;12442:4;12432:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;12483:1;12466:9;:13;12476:2;12466:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;12523:2;12504:7;:16;12512:7;12504:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;12560:7;12556:2;12541:27;;12550:4;12541:27;;;;;;;;;;;;12579:41;12599:4;12605:2;12609:7;12618:1;12579:19;:41::i;:::-;11391:1236;;;:::o;8094:108::-;8169:26;8179:2;8183:7;8169:26;;;;;;;;;;;;:9;:26::i;:::-;8094:108;;:::o;14125:832::-;14274:4;14294:15;:2;:13;;;:15::i;:::-;14290:661;;;14345:2;14329:36;;;14366:12;:10;:12::i;:::-;14380:4;14386:7;14395:4;14329:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;14325:574;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14584:1;14567:6;:13;:18;14563:322;;14609:61;;;;;;;;;;:::i;:::-;;;;;;;;14563:322;14837:6;14831:13;14822:6;14818:2;14814:15;14807:38;14325:574;14460:41;;;14450:51;;;:6;:51;;;;14443:58;;;;;14290:661;14936:4;14929:11;;14125:832;;;;;;;:::o;9889:890:9:-;9942:7;9961:14;9978:1;9961:18;;10026:6;10017:5;:15;10013:99;;10061:6;10052:15;;;;;;:::i;:::-;;;;;10095:2;10085:12;;;;10013:99;10138:6;10129:5;:15;10125:99;;10173:6;10164:15;;;;;;:::i;:::-;;;;;10207:2;10197:12;;;;10125:99;10250:6;10241:5;:15;10237:99;;10285:6;10276:15;;;;;;:::i;:::-;;;;;10319:2;10309:12;;;;10237:99;10362:5;10353;:14;10349:96;;10396:5;10387:14;;;;;;:::i;:::-;;;;;10429:1;10419:11;;;;10349:96;10471:5;10462;:14;10458:96;;10505:5;10496:14;;;;;;:::i;:::-;;;;;10538:1;10528:11;;;;10458:96;10580:5;10571;:14;10567:96;;10614:5;10605:14;;;;;;:::i;:::-;;;;;10647:1;10637:11;;;;10567:96;10689:5;10680;:14;10676:64;;10724:1;10714:11;;;;10676:64;10766:6;10759:13;;;9889:890;;;:::o;15673:154:3:-;;;;;:::o;16533:153::-;;;;;:::o;8424:310::-;8548:18;8554:2;8558:7;8548:5;:18::i;:::-;8597:53;8628:1;8632:2;8636:7;8645:4;8597:22;:53::i;:::-;8576:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;8424:310;;;:::o;1175:320:0:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;9056:923:3:-;9149:1;9135:16;;:2;:16;;;9127:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;9208:16;9216:7;9208;:16::i;:::-;9207:17;9199:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;9269:48;9298:1;9302:2;9306:7;9315:1;9269:20;:48::i;:::-;9413:16;9421:7;9413;:16::i;:::-;9412:17;9404:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;9822:1;9805:9;:13;9815:2;9805:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;9863:2;9844:7;:16;9852:7;9844:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9906:7;9902:2;9881:33;;9898:1;9881:33;;;;;;;;;;;;9925:47;9953:1;9957:2;9961:7;9970:1;9925:19;:47::i;:::-;9056:923;;:::o;7:75:14:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:329::-;5301:6;5350:2;5338:9;5329:7;5325:23;5321:32;5318:119;;;5356:79;;:::i;:::-;5318:119;5476:1;5501:53;5546:7;5537:6;5526:9;5522:22;5501:53;:::i;:::-;5491:63;;5447:117;5242:329;;;;:::o;5577:619::-;5654:6;5662;5670;5719:2;5707:9;5698:7;5694:23;5690:32;5687:119;;;5725:79;;:::i;:::-;5687:119;5845:1;5870:53;5915:7;5906:6;5895:9;5891:22;5870:53;:::i;:::-;5860:63;;5816:117;5972:2;5998:53;6043:7;6034:6;6023:9;6019:22;5998:53;:::i;:::-;5988:63;;5943:118;6100:2;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6071:118;5577:619;;;;;:::o;6202:116::-;6272:21;6287:5;6272:21;:::i;:::-;6265:5;6262:32;6252:60;;6308:1;6305;6298:12;6252:60;6202:116;:::o;6324:133::-;6367:5;6405:6;6392:20;6383:29;;6421:30;6445:5;6421:30;:::i;:::-;6324:133;;;;:::o;6463:323::-;6519:6;6568:2;6556:9;6547:7;6543:23;6539:32;6536:119;;;6574:79;;:::i;:::-;6536:119;6694:1;6719:50;6761:7;6752:6;6741:9;6737:22;6719:50;:::i;:::-;6709:60;;6665:114;6463:323;;;;:::o;6792:619::-;6869:6;6877;6885;6934:2;6922:9;6913:7;6909:23;6905:32;6902:119;;;6940:79;;:::i;:::-;6902:119;7060:1;7085:53;7130:7;7121:6;7110:9;7106:22;7085:53;:::i;:::-;7075:63;;7031:117;7187:2;7213:53;7258:7;7249:6;7238:9;7234:22;7213:53;:::i;:::-;7203:63;;7158:118;7315:2;7341:53;7386:7;7377:6;7366:9;7362:22;7341:53;:::i;:::-;7331:63;;7286:118;6792:619;;;;;:::o;7417:474::-;7485:6;7493;7542:2;7530:9;7521:7;7517:23;7513:32;7510:119;;;7548:79;;:::i;:::-;7510:119;7668:1;7693:53;7738:7;7729:6;7718:9;7714:22;7693:53;:::i;:::-;7683:63;;7639:117;7795:2;7821:53;7866:7;7857:6;7846:9;7842:22;7821:53;:::i;:::-;7811:63;;7766:118;7417:474;;;;;:::o;7897:332::-;8018:4;8056:2;8045:9;8041:18;8033:26;;8069:71;8137:1;8126:9;8122:17;8113:6;8069:71;:::i;:::-;8150:72;8218:2;8207:9;8203:18;8194:6;8150:72;:::i;:::-;7897:332;;;;;:::o;8235:468::-;8300:6;8308;8357:2;8345:9;8336:7;8332:23;8328:32;8325:119;;;8363:79;;:::i;:::-;8325:119;8483:1;8508:53;8553:7;8544:6;8533:9;8529:22;8508:53;:::i;:::-;8498:63;;8454:117;8610:2;8636:50;8678:7;8669:6;8658:9;8654:22;8636:50;:::i;:::-;8626:60;;8581:115;8235:468;;;;;:::o;8709:541::-;8880:4;8918:3;8907:9;8903:19;8895:27;;8932:71;9000:1;8989:9;8985:17;8976:6;8932:71;:::i;:::-;9013:72;9081:2;9070:9;9066:18;9057:6;9013:72;:::i;:::-;9095;9163:2;9152:9;9148:18;9139:6;9095:72;:::i;:::-;9177:66;9239:2;9228:9;9224:18;9215:6;9177:66;:::i;:::-;8709:541;;;;;;;:::o;9256:117::-;9365:1;9362;9355:12;9379:117;9488:1;9485;9478:12;9502:180;9550:77;9547:1;9540:88;9647:4;9644:1;9637:15;9671:4;9668:1;9661:15;9688:281;9771:27;9793:4;9771:27;:::i;:::-;9763:6;9759:40;9901:6;9889:10;9886:22;9865:18;9853:10;9850:34;9847:62;9844:88;;;9912:18;;:::i;:::-;9844:88;9952:10;9948:2;9941:22;9731:238;9688:281;;:::o;9975:129::-;10009:6;10036:20;;:::i;:::-;10026:30;;10065:33;10093:4;10085:6;10065:33;:::i;:::-;9975:129;;;:::o;10110:308::-;10172:4;10262:18;10254:6;10251:30;10248:56;;;10284:18;;:::i;:::-;10248:56;10322:29;10344:6;10322:29;:::i;:::-;10314:37;;10406:4;10400;10396:15;10388:23;;10110:308;;;:::o;10424:146::-;10521:6;10516:3;10511;10498:30;10562:1;10553:6;10548:3;10544:16;10537:27;10424:146;;;:::o;10576:425::-;10654:5;10679:66;10695:49;10737:6;10695:49;:::i;:::-;10679:66;:::i;:::-;10670:75;;10768:6;10761:5;10754:21;10806:4;10799:5;10795:16;10844:3;10835:6;10830:3;10826:16;10823:25;10820:112;;;10851:79;;:::i;:::-;10820:112;10941:54;10988:6;10983:3;10978;10941:54;:::i;:::-;10660:341;10576:425;;;;;:::o;11021:340::-;11077:5;11126:3;11119:4;11111:6;11107:17;11103:27;11093:122;;11134:79;;:::i;:::-;11093:122;11251:6;11238:20;11276:79;11351:3;11343:6;11336:4;11328:6;11324:17;11276:79;:::i;:::-;11267:88;;11083:278;11021:340;;;;:::o;11367:509::-;11436:6;11485:2;11473:9;11464:7;11460:23;11456:32;11453:119;;;11491:79;;:::i;:::-;11453:119;11639:1;11628:9;11624:17;11611:31;11669:18;11661:6;11658:30;11655:117;;;11691:79;;:::i;:::-;11655:117;11796:63;11851:7;11842:6;11831:9;11827:22;11796:63;:::i;:::-;11786:73;;11582:287;11367:509;;;;:::o;11882:613::-;11956:6;11964;11972;12021:2;12009:9;12000:7;11996:23;11992:32;11989:119;;;12027:79;;:::i;:::-;11989:119;12147:1;12172:53;12217:7;12208:6;12197:9;12193:22;12172:53;:::i;:::-;12162:63;;12118:117;12274:2;12300:53;12345:7;12336:6;12325:9;12321:22;12300:53;:::i;:::-;12290:63;;12245:118;12402:2;12428:50;12470:7;12461:6;12450:9;12446:22;12428:50;:::i;:::-;12418:60;;12373:115;11882:613;;;;;:::o;12501:474::-;12569:6;12577;12626:2;12614:9;12605:7;12601:23;12597:32;12594:119;;;12632:79;;:::i;:::-;12594:119;12752:1;12777:53;12822:7;12813:6;12802:9;12798:22;12777:53;:::i;:::-;12767:63;;12723:117;12879:2;12905:53;12950:7;12941:6;12930:9;12926:22;12905:53;:::i;:::-;12895:63;;12850:118;12501:474;;;;;:::o;12981:468::-;13046:6;13054;13103:2;13091:9;13082:7;13078:23;13074:32;13071:119;;;13109:79;;:::i;:::-;13071:119;13229:1;13254:53;13299:7;13290:6;13279:9;13275:22;13254:53;:::i;:::-;13244:63;;13200:117;13356:2;13382:50;13424:7;13415:6;13404:9;13400:22;13382:50;:::i;:::-;13372:60;;13327:115;12981:468;;;;;:::o;13455:307::-;13516:4;13606:18;13598:6;13595:30;13592:56;;;13628:18;;:::i;:::-;13592:56;13666:29;13688:6;13666:29;:::i;:::-;13658:37;;13750:4;13744;13740:15;13732:23;;13455:307;;;:::o;13768:423::-;13845:5;13870:65;13886:48;13927:6;13886:48;:::i;:::-;13870:65;:::i;:::-;13861:74;;13958:6;13951:5;13944:21;13996:4;13989:5;13985:16;14034:3;14025:6;14020:3;14016:16;14013:25;14010:112;;;14041:79;;:::i;:::-;14010:112;14131:54;14178:6;14173:3;14168;14131:54;:::i;:::-;13851:340;13768:423;;;;;:::o;14210:338::-;14265:5;14314:3;14307:4;14299:6;14295:17;14291:27;14281:122;;14322:79;;:::i;:::-;14281:122;14439:6;14426:20;14464:78;14538:3;14530:6;14523:4;14515:6;14511:17;14464:78;:::i;:::-;14455:87;;14271:277;14210:338;;;;:::o;14554:943::-;14649:6;14657;14665;14673;14722:3;14710:9;14701:7;14697:23;14693:33;14690:120;;;14729:79;;:::i;:::-;14690:120;14849:1;14874:53;14919:7;14910:6;14899:9;14895:22;14874:53;:::i;:::-;14864:63;;14820:117;14976:2;15002:53;15047:7;15038:6;15027:9;15023:22;15002:53;:::i;:::-;14992:63;;14947:118;15104:2;15130:53;15175:7;15166:6;15155:9;15151:22;15130:53;:::i;:::-;15120:63;;15075:118;15260:2;15249:9;15245:18;15232:32;15291:18;15283:6;15280:30;15277:117;;;15313:79;;:::i;:::-;15277:117;15418:62;15472:7;15463:6;15452:9;15448:22;15418:62;:::i;:::-;15408:72;;15203:287;14554:943;;;;;;;:::o;15503:619::-;15580:6;15588;15596;15645:2;15633:9;15624:7;15620:23;15616:32;15613:119;;;15651:79;;:::i;:::-;15613:119;15771:1;15796:53;15841:7;15832:6;15821:9;15817:22;15796:53;:::i;:::-;15786:63;;15742:117;15898:2;15924:53;15969:7;15960:6;15949:9;15945:22;15924:53;:::i;:::-;15914:63;;15869:118;16026:2;16052:53;16097:7;16088:6;16077:9;16073:22;16052:53;:::i;:::-;16042:63;;15997:118;15503:619;;;;;:::o;16128:474::-;16196:6;16204;16253:2;16241:9;16232:7;16228:23;16224:32;16221:119;;;16259:79;;:::i;:::-;16221:119;16379:1;16404:53;16449:7;16440:6;16429:9;16425:22;16404:53;:::i;:::-;16394:63;;16350:117;16506:2;16532:53;16577:7;16568:6;16557:9;16553:22;16532:53;:::i;:::-;16522:63;;16477:118;16128:474;;;;;:::o;16608:180::-;16656:77;16653:1;16646:88;16753:4;16750:1;16743:15;16777:4;16774:1;16767:15;16794:320;16838:6;16875:1;16869:4;16865:12;16855:22;;16922:1;16916:4;16912:12;16943:18;16933:81;;16999:4;16991:6;16987:17;16977:27;;16933:81;17061:2;17053:6;17050:14;17030:18;17027:38;17024:84;;17080:18;;:::i;:::-;17024:84;16845:269;16794:320;;;:::o;17120:221::-;17260:34;17256:1;17248:6;17244:14;17237:58;17329:4;17324:2;17316:6;17312:15;17305:29;17120:221;:::o;17347:366::-;17489:3;17510:67;17574:2;17569:3;17510:67;:::i;:::-;17503:74;;17586:93;17675:3;17586:93;:::i;:::-;17704:2;17699:3;17695:12;17688:19;;17347:366;;;:::o;17719:419::-;17885:4;17923:2;17912:9;17908:18;17900:26;;17972:9;17966:4;17962:20;17958:1;17947:9;17943:17;17936:47;18000:131;18126:4;18000:131;:::i;:::-;17992:139;;17719:419;;;:::o;18144:249::-;18284:34;18280:1;18272:6;18268:14;18261:58;18353:32;18348:2;18340:6;18336:15;18329:57;18144:249;:::o;18399:366::-;18541:3;18562:67;18626:2;18621:3;18562:67;:::i;:::-;18555:74;;18638:93;18727:3;18638:93;:::i;:::-;18756:2;18751:3;18747:12;18740:19;;18399:366;;;:::o;18771:419::-;18937:4;18975:2;18964:9;18960:18;18952:26;;19024:9;19018:4;19014:20;19010:1;18999:9;18995:17;18988:47;19052:131;19178:4;19052:131;:::i;:::-;19044:139;;18771:419;;;:::o;19196:234::-;19336:34;19332:1;19324:6;19320:14;19313:58;19405:17;19400:2;19392:6;19388:15;19381:42;19196:234;:::o;19436:366::-;19578:3;19599:67;19663:2;19658:3;19599:67;:::i;:::-;19592:74;;19675:93;19764:3;19675:93;:::i;:::-;19793:2;19788:3;19784:12;19777:19;;19436:366;;;:::o;19808:419::-;19974:4;20012:2;20001:9;19997:18;19989:26;;20061:9;20055:4;20051:20;20047:1;20036:9;20032:17;20025:47;20089:131;20215:4;20089:131;:::i;:::-;20081:139;;19808:419;;;:::o;20233:222::-;20373:34;20369:1;20361:6;20357:14;20350:58;20442:5;20437:2;20429:6;20425:15;20418:30;20233:222;:::o;20461:366::-;20603:3;20624:67;20688:2;20683:3;20624:67;:::i;:::-;20617:74;;20700:93;20789:3;20700:93;:::i;:::-;20818:2;20813:3;20809:12;20802:19;;20461:366;;;:::o;20833:419::-;20999:4;21037:2;21026:9;21022:18;21014:26;;21086:9;21080:4;21076:20;21072:1;21061:9;21057:17;21050:47;21114:131;21240:4;21114:131;:::i;:::-;21106:139;;20833:419;;;:::o;21258:233::-;21398:34;21394:1;21386:6;21382:14;21375:58;21467:16;21462:2;21454:6;21450:15;21443:41;21258:233;:::o;21497:366::-;21639:3;21660:67;21724:2;21719:3;21660:67;:::i;:::-;21653:74;;21736:93;21825:3;21736:93;:::i;:::-;21854:2;21849:3;21845:12;21838:19;;21497:366;;;:::o;21869:419::-;22035:4;22073:2;22062:9;22058:18;22050:26;;22122:9;22116:4;22112:20;22108:1;22097:9;22093:17;22086:47;22150:131;22276:4;22150:131;:::i;:::-;22142:139;;21869:419;;;:::o;22294:180::-;22342:77;22339:1;22332:88;22439:4;22436:1;22429:15;22463:4;22460:1;22453:15;22480:410;22520:7;22543:20;22561:1;22543:20;:::i;:::-;22538:25;;22577:20;22595:1;22577:20;:::i;:::-;22572:25;;22632:1;22629;22625:9;22654:30;22672:11;22654:30;:::i;:::-;22643:41;;22833:1;22824:7;22820:15;22817:1;22814:22;22794:1;22787:9;22767:83;22744:139;;22863:18;;:::i;:::-;22744:139;22528:362;22480:410;;;;:::o;22896:180::-;22944:77;22941:1;22934:88;23041:4;23038:1;23031:15;23065:4;23062:1;23055:15;23082:185;23122:1;23139:20;23157:1;23139:20;:::i;:::-;23134:25;;23173:20;23191:1;23173:20;:::i;:::-;23168:25;;23212:1;23202:35;;23217:18;;:::i;:::-;23202:35;23259:1;23256;23252:9;23247:14;;23082:185;;;;:::o;23273:194::-;23313:4;23333:20;23351:1;23333:20;:::i;:::-;23328:25;;23367:20;23385:1;23367:20;:::i;:::-;23362:25;;23411:1;23408;23404:9;23396:17;;23435:1;23429:4;23426:11;23423:37;;;23440:18;;:::i;:::-;23423:37;23273:194;;;;:::o;23473:141::-;23522:4;23545:3;23537:11;;23568:3;23565:1;23558:14;23602:4;23599:1;23589:18;23581:26;;23473:141;;;:::o;23620:93::-;23657:6;23704:2;23699;23692:5;23688:14;23684:23;23674:33;;23620:93;;;:::o;23719:107::-;23763:8;23813:5;23807:4;23803:16;23782:37;;23719:107;;;;:::o;23832:393::-;23901:6;23951:1;23939:10;23935:18;23974:97;24004:66;23993:9;23974:97;:::i;:::-;24092:39;24122:8;24111:9;24092:39;:::i;:::-;24080:51;;24164:4;24160:9;24153:5;24149:21;24140:30;;24213:4;24203:8;24199:19;24192:5;24189:30;24179:40;;23908:317;;23832:393;;;;;:::o;24231:60::-;24259:3;24280:5;24273:12;;24231:60;;;:::o;24297:142::-;24347:9;24380:53;24398:34;24407:24;24425:5;24407:24;:::i;:::-;24398:34;:::i;:::-;24380:53;:::i;:::-;24367:66;;24297:142;;;:::o;24445:75::-;24488:3;24509:5;24502:12;;24445:75;;;:::o;24526:269::-;24636:39;24667:7;24636:39;:::i;:::-;24697:91;24746:41;24770:16;24746:41;:::i;:::-;24738:6;24731:4;24725:11;24697:91;:::i;:::-;24691:4;24684:105;24602:193;24526:269;;;:::o;24801:73::-;24846:3;24801:73;:::o;24880:189::-;24957:32;;:::i;:::-;24998:65;25056:6;25048;25042:4;24998:65;:::i;:::-;24933:136;24880:189;;:::o;25075:186::-;25135:120;25152:3;25145:5;25142:14;25135:120;;;25206:39;25243:1;25236:5;25206:39;:::i;:::-;25179:1;25172:5;25168:13;25159:22;;25135:120;;;25075:186;;:::o;25267:543::-;25368:2;25363:3;25360:11;25357:446;;;25402:38;25434:5;25402:38;:::i;:::-;25486:29;25504:10;25486:29;:::i;:::-;25476:8;25472:44;25669:2;25657:10;25654:18;25651:49;;;25690:8;25675:23;;25651:49;25713:80;25769:22;25787:3;25769:22;:::i;:::-;25759:8;25755:37;25742:11;25713:80;:::i;:::-;25372:431;;25357:446;25267:543;;;:::o;25816:117::-;25870:8;25920:5;25914:4;25910:16;25889:37;;25816:117;;;;:::o;25939:169::-;25983:6;26016:51;26064:1;26060:6;26052:5;26049:1;26045:13;26016:51;:::i;:::-;26012:56;26097:4;26091;26087:15;26077:25;;25990:118;25939:169;;;;:::o;26113:295::-;26189:4;26335:29;26360:3;26354:4;26335:29;:::i;:::-;26327:37;;26397:3;26394:1;26390:11;26384:4;26381:21;26373:29;;26113:295;;;;:::o;26413:1395::-;26530:37;26563:3;26530:37;:::i;:::-;26632:18;26624:6;26621:30;26618:56;;;26654:18;;:::i;:::-;26618:56;26698:38;26730:4;26724:11;26698:38;:::i;:::-;26783:67;26843:6;26835;26829:4;26783:67;:::i;:::-;26877:1;26901:4;26888:17;;26933:2;26925:6;26922:14;26950:1;26945:618;;;;27607:1;27624:6;27621:77;;;27673:9;27668:3;27664:19;27658:26;27649:35;;27621:77;27724:67;27784:6;27777:5;27724:67;:::i;:::-;27718:4;27711:81;27580:222;26915:887;;26945:618;26997:4;26993:9;26985:6;26981:22;27031:37;27063:4;27031:37;:::i;:::-;27090:1;27104:208;27118:7;27115:1;27112:14;27104:208;;;27197:9;27192:3;27188:19;27182:26;27174:6;27167:42;27248:1;27240:6;27236:14;27226:24;;27295:2;27284:9;27280:18;27267:31;;27141:4;27138:1;27134:12;27129:17;;27104:208;;;27340:6;27331:7;27328:19;27325:179;;;27398:9;27393:3;27389:19;27383:26;27441:48;27483:4;27475:6;27471:17;27460:9;27441:48;:::i;:::-;27433:6;27426:64;27348:156;27325:179;27550:1;27546;27538:6;27534:14;27530:22;27524:4;27517:36;26952:611;;;26915:887;;26505:1303;;;26413:1395;;:::o;27814:235::-;27954:34;27950:1;27942:6;27938:14;27931:58;28023:18;28018:2;28010:6;28006:15;27999:43;27814:235;:::o;28055:366::-;28197:3;28218:67;28282:2;28277:3;28218:67;:::i;:::-;28211:74;;28294:93;28383:3;28294:93;:::i;:::-;28412:2;28407:3;28403:12;28396:19;;28055:366;;;:::o;28427:419::-;28593:4;28631:2;28620:9;28616:18;28608:26;;28680:9;28674:4;28670:20;28666:1;28655:9;28651:17;28644:47;28708:131;28834:4;28708:131;:::i;:::-;28700:139;;28427:419;;;:::o;28852:165::-;28992:17;28988:1;28980:6;28976:14;28969:41;28852:165;:::o;29023:366::-;29165:3;29186:67;29250:2;29245:3;29186:67;:::i;:::-;29179:74;;29262:93;29351:3;29262:93;:::i;:::-;29380:2;29375:3;29371:12;29364:19;;29023:366;;;:::o;29395:419::-;29561:4;29599:2;29588:9;29584:18;29576:26;;29648:9;29642:4;29638:20;29634:1;29623:9;29619:17;29612:47;29676:131;29802:4;29676:131;:::i;:::-;29668:139;;29395:419;;;:::o;29820:191::-;29860:3;29879:20;29897:1;29879:20;:::i;:::-;29874:25;;29913:20;29931:1;29913:20;:::i;:::-;29908:25;;29956:1;29953;29949:9;29942:16;;29977:3;29974:1;29971:10;29968:36;;;29984:18;;:::i;:::-;29968:36;29820:191;;;;:::o;30017:173::-;30157:25;30153:1;30145:6;30141:14;30134:49;30017:173;:::o;30196:366::-;30338:3;30359:67;30423:2;30418:3;30359:67;:::i;:::-;30352:74;;30435:93;30524:3;30435:93;:::i;:::-;30553:2;30548:3;30544:12;30537:19;;30196:366;;;:::o;30568:419::-;30734:4;30772:2;30761:9;30757:18;30749:26;;30821:9;30815:4;30811:20;30807:1;30796:9;30792:17;30785:47;30849:131;30975:4;30849:131;:::i;:::-;30841:139;;30568:419;;;:::o;30993:174::-;31133:26;31129:1;31121:6;31117:14;31110:50;30993:174;:::o;31173:366::-;31315:3;31336:67;31400:2;31395:3;31336:67;:::i;:::-;31329:74;;31412:93;31501:3;31412:93;:::i;:::-;31530:2;31525:3;31521:12;31514:19;;31173:366;;;:::o;31545:419::-;31711:4;31749:2;31738:9;31734:18;31726:26;;31798:9;31792:4;31788:20;31784:1;31773:9;31769:17;31762:47;31826:131;31952:4;31826:131;:::i;:::-;31818:139;;31545:419;;;:::o;31970:178::-;32110:30;32106:1;32098:6;32094:14;32087:54;31970:178;:::o;32154:366::-;32296:3;32317:67;32381:2;32376:3;32317:67;:::i;:::-;32310:74;;32393:93;32482:3;32393:93;:::i;:::-;32511:2;32506:3;32502:12;32495:19;;32154:366;;;:::o;32526:419::-;32692:4;32730:2;32719:9;32715:18;32707:26;;32779:9;32773:4;32769:20;32765:1;32754:9;32750:17;32743:47;32807:131;32933:4;32807:131;:::i;:::-;32799:139;;32526:419;;;:::o;32951:181::-;33091:33;33087:1;33079:6;33075:14;33068:57;32951:181;:::o;33138:366::-;33280:3;33301:67;33365:2;33360:3;33301:67;:::i;:::-;33294:74;;33377:93;33466:3;33377:93;:::i;:::-;33495:2;33490:3;33486:12;33479:19;;33138:366;;;:::o;33510:419::-;33676:4;33714:2;33703:9;33699:18;33691:26;;33763:9;33757:4;33753:20;33749:1;33738:9;33734:17;33727:47;33791:131;33917:4;33791:131;:::i;:::-;33783:139;;33510:419;;;:::o;33935:227::-;34075:34;34071:1;34063:6;34059:14;34052:58;34144:10;34139:2;34131:6;34127:15;34120:35;33935:227;:::o;34168:366::-;34310:3;34331:67;34395:2;34390:3;34331:67;:::i;:::-;34324:74;;34407:93;34496:3;34407:93;:::i;:::-;34525:2;34520:3;34516:12;34509:19;;34168:366;;;:::o;34540:419::-;34706:4;34744:2;34733:9;34729:18;34721:26;;34793:9;34787:4;34783:20;34779:1;34768:9;34764:17;34757:47;34821:131;34947:4;34821:131;:::i;:::-;34813:139;;34540:419;;;:::o;34965:176::-;35105:28;35101:1;35093:6;35089:14;35082:52;34965:176;:::o;35147:366::-;35289:3;35310:67;35374:2;35369:3;35310:67;:::i;:::-;35303:74;;35386:93;35475:3;35386:93;:::i;:::-;35504:2;35499:3;35495:12;35488:19;;35147:366;;;:::o;35519:419::-;35685:4;35723:2;35712:9;35708:18;35700:26;;35772:9;35766:4;35762:20;35758:1;35747:9;35743:17;35736:47;35800:131;35926:4;35800:131;:::i;:::-;35792:139;;35519:419;;;:::o;35944:175::-;36084:27;36080:1;36072:6;36068:14;36061:51;35944:175;:::o;36125:366::-;36267:3;36288:67;36352:2;36347:3;36288:67;:::i;:::-;36281:74;;36364:93;36453:3;36364:93;:::i;:::-;36482:2;36477:3;36473:12;36466:19;;36125:366;;;:::o;36497:419::-;36663:4;36701:2;36690:9;36686:18;36678:26;;36750:9;36744:4;36740:20;36736:1;36725:9;36721:17;36714:47;36778:131;36904:4;36778:131;:::i;:::-;36770:139;;36497:419;;;:::o;36922:172::-;37062:24;37058:1;37050:6;37046:14;37039:48;36922:172;:::o;37100:366::-;37242:3;37263:67;37327:2;37322:3;37263:67;:::i;:::-;37256:74;;37339:93;37428:3;37339:93;:::i;:::-;37457:2;37452:3;37448:12;37441:19;;37100:366;;;:::o;37472:419::-;37638:4;37676:2;37665:9;37661:18;37653:26;;37725:9;37719:4;37715:20;37711:1;37700:9;37696:17;37689:47;37753:131;37879:4;37753:131;:::i;:::-;37745:139;;37472:419;;;:::o;37897:232::-;38037:34;38033:1;38025:6;38021:14;38014:58;38106:15;38101:2;38093:6;38089:15;38082:40;37897:232;:::o;38135:366::-;38277:3;38298:67;38362:2;38357:3;38298:67;:::i;:::-;38291:74;;38374:93;38463:3;38374:93;:::i;:::-;38492:2;38487:3;38483:12;38476:19;;38135:366;;;:::o;38507:419::-;38673:4;38711:2;38700:9;38696:18;38688:26;;38760:9;38754:4;38750:20;38746:1;38735:9;38731:17;38724:47;38788:131;38914:4;38788:131;:::i;:::-;38780:139;;38507:419;;;:::o;38932:229::-;39072:34;39068:1;39060:6;39056:14;39049:58;39141:12;39136:2;39128:6;39124:15;39117:37;38932:229;:::o;39167:366::-;39309:3;39330:67;39394:2;39389:3;39330:67;:::i;:::-;39323:74;;39406:93;39495:3;39406:93;:::i;:::-;39524:2;39519:3;39515:12;39508:19;;39167:366;;;:::o;39539:419::-;39705:4;39743:2;39732:9;39728:18;39720:26;;39792:9;39786:4;39782:20;39778:1;39767:9;39763:17;39756:47;39820:131;39946:4;39820:131;:::i;:::-;39812:139;;39539:419;;;:::o;39964:148::-;40066:11;40103:3;40088:18;;39964:148;;;;:::o;40142:874::-;40245:3;40282:5;40276:12;40311:36;40337:9;40311:36;:::i;:::-;40363:89;40445:6;40440:3;40363:89;:::i;:::-;40356:96;;40483:1;40472:9;40468:17;40499:1;40494:166;;;;40674:1;40669:341;;;;40461:549;;40494:166;40578:4;40574:9;40563;40559:25;40554:3;40547:38;40640:6;40633:14;40626:22;40618:6;40614:35;40609:3;40605:45;40598:52;;40494:166;;40669:341;40736:38;40768:5;40736:38;:::i;:::-;40796:1;40810:154;40824:6;40821:1;40818:13;40810:154;;;40898:7;40892:14;40888:1;40883:3;40879:11;40872:35;40948:1;40939:7;40935:15;40924:26;;40846:4;40843:1;40839:12;40834:17;;40810:154;;;40993:6;40988:3;40984:16;40977:23;;40676:334;;40461:549;;40249:767;;40142:874;;;;:::o;41022:162::-;41162:14;41158:1;41150:6;41146:14;41139:38;41022:162;:::o;41190:402::-;41350:3;41371:85;41453:2;41448:3;41371:85;:::i;:::-;41364:92;;41465:93;41554:3;41465:93;:::i;:::-;41583:2;41578:3;41574:12;41567:19;;41190:402;;;:::o;41598:535::-;41828:3;41850:92;41938:3;41929:6;41850:92;:::i;:::-;41843:99;;41959:148;42103:3;41959:148;:::i;:::-;41952:155;;42124:3;42117:10;;41598:535;;;;:::o;42139:390::-;42245:3;42273:39;42306:5;42273:39;:::i;:::-;42328:89;42410:6;42405:3;42328:89;:::i;:::-;42321:96;;42426:65;42484:6;42479:3;42472:4;42465:5;42461:16;42426:65;:::i;:::-;42516:6;42511:3;42507:16;42500:23;;42249:280;42139:390;;;;:::o;42535:151::-;42675:3;42671:1;42663:6;42659:14;42652:27;42535:151;:::o;42692:400::-;42852:3;42873:84;42955:1;42950:3;42873:84;:::i;:::-;42866:91;;42966:93;43055:3;42966:93;:::i;:::-;43084:1;43079:3;43075:11;43068:18;;42692:400;;;:::o;43098:164::-;43238:16;43234:1;43226:6;43222:14;43215:40;43098:164;:::o;43268:402::-;43428:3;43449:85;43531:2;43526:3;43449:85;:::i;:::-;43442:92;;43543:93;43632:3;43543:93;:::i;:::-;43661:2;43656:3;43652:12;43645:19;;43268:402;;;:::o;43676:1393::-;44207:3;44229:95;44320:3;44311:6;44229:95;:::i;:::-;44222:102;;44341:148;44485:3;44341:148;:::i;:::-;44334:155;;44506:95;44597:3;44588:6;44506:95;:::i;:::-;44499:102;;44618:148;44762:3;44618:148;:::i;:::-;44611:155;;44783:95;44874:3;44865:6;44783:95;:::i;:::-;44776:102;;44895:148;45039:3;44895:148;:::i;:::-;44888:155;;45060:3;45053:10;;43676:1393;;;;;;:::o;45075:181::-;45215:33;45211:1;45203:6;45199:14;45192:57;45075:181;:::o;45262:366::-;45404:3;45425:67;45489:2;45484:3;45425:67;:::i;:::-;45418:74;;45501:93;45590:3;45501:93;:::i;:::-;45619:2;45614:3;45610:12;45603:19;;45262:366;;;:::o;45634:419::-;45800:4;45838:2;45827:9;45823:18;45815:26;;45887:9;45881:4;45877:20;45873:1;45862:9;45858:17;45851:47;45915:131;46041:4;45915:131;:::i;:::-;45907:139;;45634:419;;;:::o;46059:233::-;46098:3;46121:24;46139:5;46121:24;:::i;:::-;46112:33;;46167:66;46160:5;46157:77;46154:103;;46237:18;;:::i;:::-;46154:103;46284:1;46277:5;46273:13;46266:20;;46059:233;;;:::o;46298:248::-;46438:34;46434:1;46426:6;46422:14;46415:58;46507:31;46502:2;46494:6;46490:15;46483:56;46298:248;:::o;46552:366::-;46694:3;46715:67;46779:2;46774:3;46715:67;:::i;:::-;46708:74;;46791:93;46880:3;46791:93;:::i;:::-;46909:2;46904:3;46900:12;46893:19;;46552:366;;;:::o;46924:419::-;47090:4;47128:2;47117:9;47113:18;47105:26;;47177:9;47171:4;47167:20;47163:1;47152:9;47148:17;47141:47;47205:131;47331:4;47205:131;:::i;:::-;47197:139;;46924:419;;;:::o;47349:174::-;47489:26;47485:1;47477:6;47473:14;47466:50;47349:174;:::o;47529:366::-;47671:3;47692:67;47756:2;47751:3;47692:67;:::i;:::-;47685:74;;47768:93;47857:3;47768:93;:::i;:::-;47886:2;47881:3;47877:12;47870:19;;47529:366;;;:::o;47901:419::-;48067:4;48105:2;48094:9;48090:18;48082:26;;48154:9;48148:4;48144:20;48140:1;48129:9;48125:17;48118:47;48182:131;48308:4;48182:131;:::i;:::-;48174:139;;47901:419;;;:::o;48326:225::-;48466:34;48462:1;48454:6;48450:14;48443:58;48535:8;48530:2;48522:6;48518:15;48511:33;48326:225;:::o;48557:366::-;48699:3;48720:67;48784:2;48779:3;48720:67;:::i;:::-;48713:74;;48796:93;48885:3;48796:93;:::i;:::-;48914:2;48909:3;48905:12;48898:19;;48557:366;;;:::o;48929:419::-;49095:4;49133:2;49122:9;49118:18;49110:26;;49182:9;49176:4;49172:20;49168:1;49157:9;49153:17;49146:47;49210:131;49336:4;49210:131;:::i;:::-;49202:139;;48929:419;;;:::o;49354:182::-;49494:34;49490:1;49482:6;49478:14;49471:58;49354:182;:::o;49542:366::-;49684:3;49705:67;49769:2;49764:3;49705:67;:::i;:::-;49698:74;;49781:93;49870:3;49781:93;:::i;:::-;49899:2;49894:3;49890:12;49883:19;;49542:366;;;:::o;49914:419::-;50080:4;50118:2;50107:9;50103:18;50095:26;;50167:9;50161:4;50157:20;50153:1;50142:9;50138:17;50131:47;50195:131;50321:4;50195:131;:::i;:::-;50187:139;;49914:419;;;:::o;50339:181::-;50479:33;50475:1;50467:6;50463:14;50456:57;50339:181;:::o;50526:366::-;50668:3;50689:67;50753:2;50748:3;50689:67;:::i;:::-;50682:74;;50765:93;50854:3;50765:93;:::i;:::-;50883:2;50878:3;50874:12;50867:19;;50526:366;;;:::o;50898:419::-;51064:4;51102:2;51091:9;51087:18;51079:26;;51151:9;51145:4;51141:20;51137:1;51126:9;51122:17;51115:47;51179:131;51305:4;51179:131;:::i;:::-;51171:139;;50898:419;;;:::o;51323:165::-;51463:17;51459:1;51451:6;51447:14;51440:41;51323:165;:::o;51494:366::-;51636:3;51657:67;51721:2;51716:3;51657:67;:::i;:::-;51650:74;;51733:93;51822:3;51733:93;:::i;:::-;51851:2;51846:3;51842:12;51835:19;;51494:366;;;:::o;51866:419::-;52032:4;52070:2;52059:9;52055:18;52047:26;;52119:9;52113:4;52109:20;52105:1;52094:9;52090:17;52083:47;52147:131;52273:4;52147:131;:::i;:::-;52139:139;;51866:419;;;:::o;52291:176::-;52431:28;52427:1;52419:6;52415:14;52408:52;52291:176;:::o;52473:366::-;52615:3;52636:67;52700:2;52695:3;52636:67;:::i;:::-;52629:74;;52712:93;52801:3;52712:93;:::i;:::-;52830:2;52825:3;52821:12;52814:19;;52473:366;;;:::o;52845:419::-;53011:4;53049:2;53038:9;53034:18;53026:26;;53098:9;53092:4;53088:20;53084:1;53073:9;53069:17;53062:47;53126:131;53252:4;53126:131;:::i;:::-;53118:139;;52845:419;;;:::o;53270:178::-;53410:30;53406:1;53398:6;53394:14;53387:54;53270:178;:::o;53454:366::-;53596:3;53617:67;53681:2;53676:3;53617:67;:::i;:::-;53610:74;;53693:93;53782:3;53693:93;:::i;:::-;53811:2;53806:3;53802:12;53795:19;;53454:366;;;:::o;53826:419::-;53992:4;54030:2;54019:9;54015:18;54007:26;;54079:9;54073:4;54069:20;54065:1;54054:9;54050:17;54043:47;54107:131;54233:4;54107:131;:::i;:::-;54099:139;;53826:419;;;:::o;54251:176::-;54391:28;54387:1;54379:6;54375:14;54368:52;54251:176;:::o;54433:366::-;54575:3;54596:67;54660:2;54655:3;54596:67;:::i;:::-;54589:74;;54672:93;54761:3;54672:93;:::i;:::-;54790:2;54785:3;54781:12;54774:19;;54433:366;;;:::o;54805:419::-;54971:4;55009:2;54998:9;54994:18;54986:26;;55058:9;55052:4;55048:20;55044:1;55033:9;55029:17;55022:47;55086:131;55212:4;55086:131;:::i;:::-;55078:139;;54805:419;;;:::o;55230:238::-;55370:34;55366:1;55358:6;55354:14;55347:58;55439:21;55434:2;55426:6;55422:15;55415:46;55230:238;:::o;55474:366::-;55616:3;55637:67;55701:2;55696:3;55637:67;:::i;:::-;55630:74;;55713:93;55802:3;55713:93;:::i;:::-;55831:2;55826:3;55822:12;55815:19;;55474:366;;;:::o;55846:419::-;56012:4;56050:2;56039:9;56035:18;56027:26;;56099:9;56093:4;56089:20;56085:1;56074:9;56070:17;56063:47;56127:131;56253:4;56127:131;:::i;:::-;56119:139;;55846:419;;;:::o;56271:225::-;56411:34;56407:1;56399:6;56395:14;56388:58;56480:8;56475:2;56467:6;56463:15;56456:33;56271:225;:::o;56502:366::-;56644:3;56665:67;56729:2;56724:3;56665:67;:::i;:::-;56658:74;;56741:93;56830:3;56741:93;:::i;:::-;56859:2;56854:3;56850:12;56843:19;;56502:366;;;:::o;56874:419::-;57040:4;57078:2;57067:9;57063:18;57055:26;;57127:9;57121:4;57117:20;57113:1;57102:9;57098:17;57091:47;57155:131;57281:4;57155:131;:::i;:::-;57147:139;;56874:419;;;:::o;57299:224::-;57439:34;57435:1;57427:6;57423:14;57416:58;57508:7;57503:2;57495:6;57491:15;57484:32;57299:224;:::o;57529:366::-;57671:3;57692:67;57756:2;57751:3;57692:67;:::i;:::-;57685:74;;57768:93;57857:3;57768:93;:::i;:::-;57886:2;57881:3;57877:12;57870:19;;57529:366;;;:::o;57901:419::-;58067:4;58105:2;58094:9;58090:18;58082:26;;58154:9;58148:4;58144:20;58140:1;58129:9;58125:17;58118:47;58182:131;58308:4;58182:131;:::i;:::-;58174:139;;57901:419;;;:::o;58326:98::-;58377:6;58411:5;58405:12;58395:22;;58326:98;;;:::o;58430:168::-;58513:11;58547:6;58542:3;58535:19;58587:4;58582:3;58578:14;58563:29;;58430:168;;;;:::o;58604:373::-;58690:3;58718:38;58750:5;58718:38;:::i;:::-;58772:70;58835:6;58830:3;58772:70;:::i;:::-;58765:77;;58851:65;58909:6;58904:3;58897:4;58890:5;58886:16;58851:65;:::i;:::-;58941:29;58963:6;58941:29;:::i;:::-;58936:3;58932:39;58925:46;;58694:283;58604:373;;;;:::o;58983:640::-;59178:4;59216:3;59205:9;59201:19;59193:27;;59230:71;59298:1;59287:9;59283:17;59274:6;59230:71;:::i;:::-;59311:72;59379:2;59368:9;59364:18;59355:6;59311:72;:::i;:::-;59393;59461:2;59450:9;59446:18;59437:6;59393:72;:::i;:::-;59512:9;59506:4;59502:20;59497:2;59486:9;59482:18;59475:48;59540:76;59611:4;59602:6;59540:76;:::i;:::-;59532:84;;58983:640;;;;;;;:::o;59629:141::-;59685:5;59716:6;59710:13;59701:22;;59732:32;59758:5;59732:32;:::i;:::-;59629:141;;;;:::o;59776:349::-;59845:6;59894:2;59882:9;59873:7;59869:23;59865:32;59862:119;;;59900:79;;:::i;:::-;59862:119;60020:1;60045:63;60100:7;60091:6;60080:9;60076:22;60045:63;:::i;:::-;60035:73;;59991:127;59776:349;;;;:::o;60131:220::-;60271:34;60267:1;60259:6;60255:14;60248:58;60340:3;60335:2;60327:6;60323:15;60316:28;60131:220;:::o;60357:366::-;60499:3;60520:67;60584:2;60579:3;60520:67;:::i;:::-;60513:74;;60596:93;60685:3;60596:93;:::i;:::-;60714:2;60709:3;60705:12;60698:19;;60357:366;;;:::o;60729:419::-;60895:4;60933:2;60922:9;60918:18;60910:26;;60982:9;60976:4;60972:20;60968:1;60957:9;60953:17;60946:47;61010:131;61136:4;61010:131;:::i;:::-;61002:139;;60729:419;;;:::o;61154:179::-;61294:31;61290:1;61282:6;61278:14;61271:55;61154:179;:::o;61339:366::-;61481:3;61502:67;61566:2;61561:3;61502:67;:::i;:::-;61495:74;;61578:93;61667:3;61578:93;:::i;:::-;61696:2;61691:3;61687:12;61680:19;;61339:366;;;:::o;61711:419::-;61877:4;61915:2;61904:9;61900:18;61892:26;;61964:9;61958:4;61954:20;61950:1;61939:9;61935:17;61928:47;61992:131;62118:4;61992:131;:::i;:::-;61984:139;;61711:419;;;:::o

Swarm Source

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