ETH Price: $2,674.83 (+0.23%)

Token

Boxer (Boxer)
 

Overview

Max Total Supply

986 Boxer

Holders

358

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
rodrigoi.eth
Balance
1 Boxer
0x455F0d6743Da6045ad5e861AC9fB4e3b9170AA2D
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:
Boxer

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU AGPLv3 license

Contract Source Code (Solidity Multiple files format)

File 2 of 16: Boxer.sol
//SPDX-License-Identifier: AGPL-3.0-or-later
// Boxer
// Boxer is an omnichain NFT, Produced by dLab.
pragma solidity ^0.8.9;
import "./Ownable.sol";
import "./ERC721Enumerable.sol";
import "./ILayerZeroEndpoint.sol";
import "./ILayerZeroReceiver.sol";
import "./ILayerZeroUserApplicationConfig.sol";

contract Boxer is
    Ownable,
    ERC721Enumerable,
    ILayerZeroReceiver,
    ILayerZeroUserApplicationConfig
{
    string private baseURI;
    uint256 limit = 1;
    uint256 counter = 0;
    uint256 nextId = 0;
    uint256 currentSupply = 200;
    uint256 maxId = 0;
    uint256 gas = 350000;
    ILayerZeroEndpoint public endpoint;
    mapping(uint256 => bytes) public uaMap;

    event ReceiveNFT(
        uint16 _srcChainId,
        address _from,
        uint256 _tokenId,
        uint256 counter
    );

    constructor(
        string memory baseURI_,
        address _endpoint,
        uint256 _startId,
        uint256 _total,
        uint256 _currentSupply
    ) ERC721("Boxer", "Boxer") {
        endpoint = ILayerZeroEndpoint(_endpoint);
        baseURI = baseURI_;
        nextId = _startId;
        maxId = _total;
        currentSupply = _currentSupply;
    }

    function mintSeed(uint256 amount) external onlyOwner {
        require(nextId + 1 <= maxId, "Max supply exceed");
        require(nextId + amount <= currentSupply, "Supply exceed");
        for (uint256 index = 0; index < amount; index++) {
            nextId += 1;
            _safeMint(msg.sender, nextId);
            counter += 1;
        }
    }

    function mint() external payable {
        require(nextId + 1 <= currentSupply, "Mint ended");
        require(nextId + 1 <= maxId, "Max supply exceed");
        require(
            (balanceOf(msg.sender) < limit),
            "Account Balance on Current chain exceeds limit"
        );
        nextId += 1;
        _safeMint(msg.sender, nextId);
        counter += 1;
    }

    function crossChain(uint16 _dstChainId, uint256 tokenId) public payable {
        require(msg.sender == ownerOf(tokenId), "Only owner call cross chain");
        require(uaMap[_dstChainId].length > 0, "Invalid chainId");
        // burn NFT
        _burn(tokenId);
        counter -= 1;
        bytes memory payload = abi.encode(msg.sender, tokenId);

        uint16 version = 1;
        bytes memory adapterParams = abi.encodePacked(version, gas);

        (uint256 messageFee, ) = endpoint.estimateFees(
            _dstChainId,
            address(this),
            payload,
            false,
            adapterParams
        );
        require(msg.value >= messageFee, "Message Fee Not Enough");

        endpoint.send{value: msg.value}(
            _dstChainId,
            uaMap[_dstChainId],
            payload,
            payable(msg.sender),
            address(0x0),
            adapterParams
        );
    }

    function withdraw(uint256 amount) external onlyOwner {
        (bool sent, ) = payable(owner()).call{value: amount}("");
        require(sent, "Error!");
    }

    function setBaseURI(string memory _URI) external onlyOwner {
        baseURI = _URI;
    }

    function lzReceive(
        uint16 _srcChainId,
        bytes memory _from,
        uint64,
        bytes memory _payload
    ) external override {
        require(msg.sender == address(endpoint));
        require(
            _from.length == uaMap[_srcChainId].length &&
                keccak256(_from) == keccak256(uaMap[_srcChainId]),
            "Call must send from valid user application"
        );
        address from;
        assembly {
            from := mload(add(_from, 20))
        }
        (address toAddress, uint256 tokenId) = abi.decode(
            _payload,
            (address, uint256)
        );

        // mint the tokens
        _safeMint(toAddress, tokenId);
        counter += 1;
        emit ReceiveNFT(_srcChainId, toAddress, tokenId, counter);
    }

    function estimateFees(
        uint16 _dstChainId,
        bytes calldata _payload,
        bool _payInZRO,
        bytes calldata _adapterParams
    ) external view returns (uint256 nativeFee, uint256 zroFee) {
        return
            endpoint.estimateFees(
                _dstChainId,
                address(this),
                _payload,
                _payInZRO,
                _adapterParams
            );
    }

    function setUaAddress(uint256 _dstChainId, bytes calldata _uaAddress)
        public
        onlyOwner
    {
        uaMap[_dstChainId] = _uaAddress;
    }

    function setEndpoint(address _endpoint) public onlyOwner {
        endpoint = ILayerZeroEndpoint(_endpoint);
    }

    function setLimit(uint256 _limit) public onlyOwner {
        limit = _limit;
    }

    function setCurrentSupply(uint256 _supply) public onlyOwner {
        currentSupply = _supply;
    }

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

    function setGas(uint256 _gas) external onlyOwner {
        gas = _gas;
    }

    function setConfig(
        uint16 _version,
        uint16 _chainId,
        uint256 _configType,
        bytes calldata _config
    ) external override onlyOwner {
        endpoint.setConfig(_version, _chainId, _configType, _config);
    }

    function setSendVersion(uint16 _version) external override onlyOwner {
        endpoint.setSendVersion(_version);
    }

    function setReceiveVersion(uint16 _version) external override onlyOwner {
        endpoint.setReceiveVersion(_version);
    }

    function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress)
        external
        override
        onlyOwner
    {
        endpoint.forceResumeReceive(_srcChainId, _srcAddress);
    }
}

File 1 of 16: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.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 functionCall(target, data, "Address: low-level call failed");
    }

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

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

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

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

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

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

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

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

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

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

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

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

File 3 of 16: 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 4 of 16: 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 5 of 16: ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

File 6 of 16: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 7 of 16: 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 8 of 16: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

File 9 of 16: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

File 10 of 16: 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 11 of 16: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

File 12 of 16: ILayerZeroEndpoint.sol
// SPDX-License-Identifier: BUSL-1.1

pragma solidity >=0.5.0;

import "./ILayerZeroUserApplicationConfig.sol";

interface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig {
    // @notice send a LayerZero message to the specified address at a LayerZero endpoint.
    // @param _dstChainId - the destination chain identifier
    // @param _destination - the address on destination chain (in bytes). address length/format may vary by chains
    // @param _payload - a custom bytes payload to send to the destination contract
    // @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address
    // @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction
    // @param _adapterParams - parameters for custom functionality. e.g. receive airdropped native gas from the relayer on destination
    function send(uint16 _dstChainId, bytes calldata _destination, bytes calldata _payload, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable;

    // @notice used by the messaging library to publish verified payload
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source contract (as bytes) at the source chain
    // @param _dstAddress - the address on destination chain
    // @param _nonce - the unbound message ordering nonce
    // @param _gasLimit - the gas limit for external contract execution
    // @param _payload - verified payload to send to the destination contract
    function receivePayload(uint16 _srcChainId, bytes calldata _srcAddress, address _dstAddress, uint64 _nonce, uint _gasLimit, bytes calldata _payload) external;

    // @notice get the inboundNonce of a receiver from a source chain which could be EVM or non-EVM chain
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source chain contract address
    function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint64);

    // @notice get the outboundNonce from this source chain which, consequently, is always an EVM
    // @param _srcAddress - the source chain contract address
    function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view returns (uint64);

    // @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery
    // @param _dstChainId - the destination chain identifier
    // @param _userApplication - the user app address on this EVM chain
    // @param _payload - the custom message to send over LayerZero
    // @param _payInZRO - if false, user app pays the protocol fee in native token
    // @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain
    function estimateFees(uint16 _dstChainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParam) external view returns (uint nativeFee, uint zroFee);

    // @notice get this Endpoint's immutable source identifier
    function getChainId() external view returns (uint16);

    // @notice the interface to retry failed message on this Endpoint destination
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source chain contract address
    // @param _payload - the payload to be retried
    function retryPayload(uint16 _srcChainId, bytes calldata _srcAddress, bytes calldata _payload) external;

    // @notice query if any STORED payload (message blocking) at the endpoint.
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source chain contract address
    function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool);

    // @notice query if the _libraryAddress is valid for sending msgs.
    // @param _userApplication - the user app address on this EVM chain
    function getSendLibraryAddress(address _userApplication) external view returns (address);

    // @notice query if the _libraryAddress is valid for receiving msgs.
    // @param _userApplication - the user app address on this EVM chain
    function getReceiveLibraryAddress(address _userApplication) external view returns (address);

    // @notice query if the non-reentrancy guard for send() is on
    // @return true if the guard is on. false otherwise
    function isSendingPayload() external view returns (bool);

    // @notice query if the non-reentrancy guard for receive() is on
    // @return true if the guard is on. false otherwise
    function isReceivingPayload() external view returns (bool);

    // @notice get the configuration of the LayerZero messaging library of the specified version
    // @param _version - messaging library version
    // @param _chainId - the chainId for the pending config change
    // @param _userApplication - the contract address of the user application
    // @param _configType - type of configuration. every messaging library has its own convention.
    function getConfig(uint16 _version, uint16 _chainId, address _userApplication, uint _configType) external view returns (bytes memory);

    // @notice get the send() LayerZero messaging library version
    // @param _userApplication - the contract address of the user application
    function getSendVersion(address _userApplication) external view returns (uint16);

    // @notice get the lzReceive() LayerZero messaging library version
    // @param _userApplication - the contract address of the user application
    function getReceiveVersion(address _userApplication) external view returns (uint16);
}

File 13 of 16: ILayerZeroReceiver.sol
// SPDX-License-Identifier: BUSL-1.1

pragma solidity >=0.5.0;

interface ILayerZeroReceiver {
    // @notice LayerZero endpoint will invoke this function to deliver the message on the destination
    // @param _srcChainId - the source endpoint identifier
    // @param _srcAddress - the source sending contract address from the source chain
    // @param _nonce - the ordered message nonce
    // @param _payload - the signed payload is the UA bytes has encoded to be sent
    function lzReceive(
        uint16 _srcChainId,
        bytes calldata _srcAddress,
        uint64 _nonce,
        bytes calldata _payload
    ) external;
}

File 14 of 16: ILayerZeroUserApplicationConfig.sol
// SPDX-License-Identifier: BUSL-1.1

pragma solidity >=0.5.0;

interface ILayerZeroUserApplicationConfig {
    // @notice set the configuration of the LayerZero messaging library of the specified version
    // @param _version - messaging library version
    // @param _chainId - the chainId for the pending config change
    // @param _configType - type of configuration. every messaging library has its own convention.
    // @param _config - configuration in the bytes. can encode arbitrary content.
    function setConfig(
        uint16 _version,
        uint16 _chainId,
        uint256 _configType,
        bytes calldata _config
    ) external;

    // @notice set the send() LayerZero messaging library version to _version
    // @param _version - new messaging library version
    function setSendVersion(uint16 _version) external;

    // @notice set the lzReceive() LayerZero messaging library version to _version
    // @param _version - new messaging library version
    function setReceiveVersion(uint16 _version) external;

    // @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload
    // @param _srcChainId - the chainId of the source chain
    // @param _srcAddress - the contract address of the source contract at the source chain
    function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress)
        external;
}

File 15 of 16: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"},{"internalType":"address","name":"_endpoint","type":"address"},{"internalType":"uint256","name":"_startId","type":"uint256"},{"internalType":"uint256","name":"_total","type":"uint256"},{"internalType":"uint256","name":"_currentSupply","type":"uint256"}],"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":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"counter","type":"uint256"}],"name":"ReceiveNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"crossChain","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"endpoint","outputs":[{"internalType":"contract ILayerZeroEndpoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes","name":"_payload","type":"bytes"},{"internalType":"bool","name":"_payInZRO","type":"bool"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"estimateFees","outputs":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"zroFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"forceResumeReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_from","type":"bytes"},{"internalType":"uint64","name":"","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintSeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"_configType","type":"uint256"},{"internalType":"bytes","name":"_config","type":"bytes"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"}],"name":"setCurrentSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_endpoint","type":"address"}],"name":"setEndpoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gas","type":"uint256"}],"name":"setGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setReceiveVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setSendVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_dstChainId","type":"uint256"},{"internalType":"bytes","name":"_uaAddress","type":"bytes"}],"name":"setUaAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uaMap","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526001600c556000600d556000600e5560c8600f556000601055620557306011553480156200003157600080fd5b50604051620061643803806200616483398181016040528101906200005791906200054a565b6040518060400160405280600581526020017f426f7865720000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f426f786572000000000000000000000000000000000000000000000000000000815250620000e3620000d76200019160201b60201c565b6200019960201b60201c565b8160019080519060200190620000fb9291906200025d565b508060029080519060200190620001149291906200025d565b50505083601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600b9080519060200190620001709291906200025d565b5082600e819055508160108190555080600f81905550505050505062000656565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200026b9062000620565b90600052602060002090601f0160209004810192826200028f5760008555620002db565b82601f10620002aa57805160ff1916838001178555620002db565b82800160010185558215620002db579182015b82811115620002da578251825591602001919060010190620002bd565b5b509050620002ea9190620002ee565b5090565b5b8082111562000309576000816000905550600101620002ef565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000376826200032b565b810181811067ffffffffffffffff821117156200039857620003976200033c565b5b80604052505050565b6000620003ad6200030d565b9050620003bb82826200036b565b919050565b600067ffffffffffffffff821115620003de57620003dd6200033c565b5b620003e9826200032b565b9050602081019050919050565b60005b8381101562000416578082015181840152602081019050620003f9565b8381111562000426576000848401525b50505050565b6000620004436200043d84620003c0565b620003a1565b90508281526020810184848401111562000462576200046162000326565b5b6200046f848285620003f6565b509392505050565b600082601f8301126200048f576200048e62000321565b5b8151620004a18482602086016200042c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620004d782620004aa565b9050919050565b620004e981620004ca565b8114620004f557600080fd5b50565b6000815190506200050981620004de565b92915050565b6000819050919050565b62000524816200050f565b81146200053057600080fd5b50565b600081519050620005448162000519565b92915050565b600080600080600060a0868803121562000569576200056862000317565b5b600086015167ffffffffffffffff8111156200058a57620005896200031c565b5b620005988882890162000477565b9550506020620005ab88828901620004f8565b9450506040620005be8882890162000533565b9350506060620005d18882890162000533565b9250506080620005e48882890162000533565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200063957607f821691505b6020821081141562000650576200064f620005f1565b5b50919050565b615afe80620006666000396000f3fe6080604052600436106102195760003560e01c806355f804b311610123578063b88d4fde116100ab578063dd51faa21161006f578063dd51faa2146107ab578063e71741af146107d4578063e985e9c5146107fd578063f2f5d87c1461083a578063f2fde38b1461087757610219565b8063b88d4fde146106ca578063c87b56dd146106f3578063cbed8b9c14610730578063dbbb415514610759578063dc5473011461078257610219565b806370a08231116100f257806370a08231146105f7578063715018a6146106345780638da5cb5b1461064b57806395d89b4114610676578063a22cb465146106a157610219565b806355f804b31461053d5780635e280f11146105665780636352211e14610591578063655e35be146105ce57610219565b80631e128296116101a65780632e1a7d4d116101755780632e1a7d4d146104485780632f745c591461047157806342842e0e146104ae57806342d65a8d146104d75780634f6ccce71461050057610219565b80631e1282961461039c57806321b4eaa1146103b857806323b872dd146103f657806327ea6f2b1461041f57610219565b8063081812fc116101ed578063081812fc146102d8578063095ea7b31461031557806310ddb1371461033e5780631249c58b1461036757806318160ddd1461037157610219565b80621d35671461021e57806301ffc9a71461024757806306fdde031461028457806307e0db17146102af575b600080fd5b34801561022a57600080fd5b5061024560048036038101906102409190613aa5565b6108a0565b005b34801561025357600080fd5b5061026e60048036038101906102699190613b9c565b610a2d565b60405161027b9190613be4565b60405180910390f35b34801561029057600080fd5b50610299610aa7565b6040516102a69190613c87565b60405180910390f35b3480156102bb57600080fd5b506102d660048036038101906102d19190613ca9565b610b39565b005b3480156102e457600080fd5b506102ff60048036038101906102fa9190613d0c565b610c45565b60405161030c9190613d7a565b60405180910390f35b34801561032157600080fd5b5061033c60048036038101906103379190613dc1565b610cca565b005b34801561034a57600080fd5b5061036560048036038101906103609190613ca9565b610de2565b005b61036f610eee565b005b34801561037d57600080fd5b50610386611022565b6040516103939190613e10565b60405180910390f35b6103b660048036038101906103b19190613e2b565b61102f565b005b3480156103c457600080fd5b506103df60048036038101906103da9190613ef7565b611334565b6040516103ed929190613f9e565b60405180910390f35b34801561040257600080fd5b5061041d60048036038101906104189190613fc7565b6113fc565b005b34801561042b57600080fd5b5061044660048036038101906104419190613d0c565b61145c565b005b34801561045457600080fd5b5061046f600480360381019061046a9190613d0c565b6114e2565b005b34801561047d57600080fd5b5061049860048036038101906104939190613dc1565b611615565b6040516104a59190613e10565b60405180910390f35b3480156104ba57600080fd5b506104d560048036038101906104d09190613fc7565b6116ba565b005b3480156104e357600080fd5b506104fe60048036038101906104f9919061401a565b6116da565b005b34801561050c57600080fd5b5061052760048036038101906105229190613d0c565b6117ec565b6040516105349190613e10565b60405180910390f35b34801561054957600080fd5b50610564600480360381019061055f919061411b565b61185d565b005b34801561057257600080fd5b5061057b6118f3565b60405161058891906141c3565b60405180910390f35b34801561059d57600080fd5b506105b860048036038101906105b39190613d0c565b611919565b6040516105c59190613d7a565b60405180910390f35b3480156105da57600080fd5b506105f560048036038101906105f091906141de565b6119cb565b005b34801561060357600080fd5b5061061e6004803603810190610619919061423e565b611a6f565b60405161062b9190613e10565b60405180910390f35b34801561064057600080fd5b50610649611b27565b005b34801561065757600080fd5b50610660611baf565b60405161066d9190613d7a565b60405180910390f35b34801561068257600080fd5b5061068b611bd8565b6040516106989190613c87565b60405180910390f35b3480156106ad57600080fd5b506106c860048036038101906106c3919061426b565b611c6a565b005b3480156106d657600080fd5b506106f160048036038101906106ec91906142ab565b611c80565b005b3480156106ff57600080fd5b5061071a60048036038101906107159190613d0c565b611ce2565b6040516107279190613c87565b60405180910390f35b34801561073c57600080fd5b506107576004803603810190610752919061432e565b611d89565b005b34801561076557600080fd5b50610780600480360381019061077b919061423e565b611ea1565b005b34801561078e57600080fd5b506107a960048036038101906107a49190613d0c565b611f61565b005b3480156107b757600080fd5b506107d260048036038101906107cd9190613d0c565b611fe7565b005b3480156107e057600080fd5b506107fb60048036038101906107f69190613d0c565b61206d565b005b34801561080957600080fd5b50610824600480360381019061081f91906143b6565b6121f0565b6040516108319190613be4565b60405180910390f35b34801561084657600080fd5b50610861600480360381019061085c9190613d0c565b612284565b60405161086e919061444b565b60405180910390f35b34801561088357600080fd5b5061089e6004803603810190610899919061423e565b612324565b005b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108fa57600080fd5b601360008561ffff168152602001908152602001600020805461091c9061449c565b9050835114801561095e5750601360008561ffff16815260200190815260200160002060405161094c919061456d565b60405180910390208380519060200120145b61099d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610994906145f6565b60405180910390fd5b600060148401519050600080838060200190518101906109bd9190614669565b915091506109cb828261241c565b6001600d60008282546109de91906146d8565b925050819055507fec16668a9529c4fc256054f3e18620ef50c89aec357376cce821207ff1e656f0878383600d54604051610a1c949392919061473d565b60405180910390a150505050505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610aa05750610a9f8261243a565b5b9050919050565b606060018054610ab69061449c565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae29061449c565b8015610b2f5780601f10610b0457610100808354040283529160200191610b2f565b820191906000526020600020905b815481529060010190602001808311610b1257829003601f168201915b5050505050905090565b610b4161251c565b73ffffffffffffffffffffffffffffffffffffffff16610b5f611baf565b73ffffffffffffffffffffffffffffffffffffffff1614610bb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bac906147ce565b60405180910390fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166307e0db17826040518263ffffffff1660e01b8152600401610c1091906147ee565b600060405180830381600087803b158015610c2a57600080fd5b505af1158015610c3e573d6000803e3d6000fd5b5050505050565b6000610c5082612524565b610c8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c869061487b565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cd582611919565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3d9061490d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d6561251c565b73ffffffffffffffffffffffffffffffffffffffff161480610d945750610d9381610d8e61251c565b6121f0565b5b610dd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dca9061499f565b60405180910390fd5b610ddd8383612590565b505050565b610dea61251c565b73ffffffffffffffffffffffffffffffffffffffff16610e08611baf565b73ffffffffffffffffffffffffffffffffffffffff1614610e5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e55906147ce565b60405180910390fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166310ddb137826040518263ffffffff1660e01b8152600401610eb991906147ee565b600060405180830381600087803b158015610ed357600080fd5b505af1158015610ee7573d6000803e3d6000fd5b5050505050565b600f546001600e54610f0091906146d8565b1115610f41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3890614a0b565b60405180910390fd5b6010546001600e54610f5391906146d8565b1115610f94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8b90614a77565b60405180910390fd5b600c54610fa033611a6f565b10610fe0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd790614b09565b60405180910390fd5b6001600e6000828254610ff391906146d8565b9250508190555061100633600e5461241c565b6001600d600082825461101991906146d8565b92505081905550565b6000600980549050905090565b61103881611919565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109c90614b75565b60405180910390fd5b6000601360008461ffff16815260200190815260200160002080546110c99061449c565b90501161110b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110290614be1565b60405180910390fd5b61111481612649565b6001600d60008282546111279190614c01565b9250508190555060003382604051602001611143929190614c35565b6040516020818303038152906040529050600060019050600081601154604051602001611171929190614cb5565b60405160208183030381529060405290506000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340a7bb108730876000876040518663ffffffff1660e01b81526004016111e8959493929190614ce1565b604080518083038186803b1580156111ff57600080fd5b505afa158015611213573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112379190614d42565b5090508034101561127d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127490614dce565b60405180910390fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c58031003488601360008b61ffff16815260200190815260200160002088336000896040518863ffffffff1660e01b81526004016112fa96959493929190614e7d565b6000604051808303818588803b15801561131357600080fd5b505af1158015611327573d6000803e3d6000fd5b5050505050505050505050565b600080601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340a7bb1089308a8a8a8a8a6040518863ffffffff1660e01b815260040161139e9796959493929190614f20565b604080518083038186803b1580156113b557600080fd5b505afa1580156113c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ed9190614d42565b91509150965096945050505050565b61140d61140761251c565b82612766565b61144c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144390614ff7565b60405180910390fd5b611457838383612844565b505050565b61146461251c565b73ffffffffffffffffffffffffffffffffffffffff16611482611baf565b73ffffffffffffffffffffffffffffffffffffffff16146114d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cf906147ce565b60405180910390fd5b80600c8190555050565b6114ea61251c565b73ffffffffffffffffffffffffffffffffffffffff16611508611baf565b73ffffffffffffffffffffffffffffffffffffffff161461155e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611555906147ce565b60405180910390fd5b6000611568611baf565b73ffffffffffffffffffffffffffffffffffffffff168260405161158b9061503d565b60006040518083038185875af1925050503d80600081146115c8576040519150601f19603f3d011682016040523d82523d6000602084013e6115cd565b606091505b5050905080611611576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116089061509e565b60405180910390fd5b5050565b600061162083611a6f565b8210611661576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165890615130565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6116d583838360405180602001604052806000815250611c80565b505050565b6116e261251c565b73ffffffffffffffffffffffffffffffffffffffff16611700611baf565b73ffffffffffffffffffffffffffffffffffffffff1614611756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174d906147ce565b60405180910390fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342d65a8d8484846040518463ffffffff1660e01b81526004016117b593929190615150565b600060405180830381600087803b1580156117cf57600080fd5b505af11580156117e3573d6000803e3d6000fd5b50505050505050565b60006117f6611022565b8210611837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182e906151f4565b60405180910390fd5b6009828154811061184b5761184a615214565b5b90600052602060002001549050919050565b61186561251c565b73ffffffffffffffffffffffffffffffffffffffff16611883611baf565b73ffffffffffffffffffffffffffffffffffffffff16146118d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d0906147ce565b60405180910390fd5b80600b90805190602001906118ef9291906137a8565b5050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b9906152b5565b60405180910390fd5b80915050919050565b6119d361251c565b73ffffffffffffffffffffffffffffffffffffffff166119f1611baf565b73ffffffffffffffffffffffffffffffffffffffff1614611a47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3e906147ce565b60405180910390fd5b8181601360008681526020019081526020016000209190611a6992919061382e565b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ae0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad790615347565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611b2f61251c565b73ffffffffffffffffffffffffffffffffffffffff16611b4d611baf565b73ffffffffffffffffffffffffffffffffffffffff1614611ba3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9a906147ce565b60405180910390fd5b611bad6000612aab565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054611be79061449c565b80601f0160208091040260200160405190810160405280929190818152602001828054611c139061449c565b8015611c605780601f10611c3557610100808354040283529160200191611c60565b820191906000526020600020905b815481529060010190602001808311611c4357829003601f168201915b5050505050905090565b611c7c611c7561251c565b8383612b6f565b5050565b611c91611c8b61251c565b83612766565b611cd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc790614ff7565b60405180910390fd5b611cdc84848484612cdc565b50505050565b6060611ced82612524565b611d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d23906153d9565b60405180910390fd5b6000611d36612d38565b90506000815111611d565760405180602001604052806000815250611d81565b80611d6084612dca565b604051602001611d71929190615435565b6040516020818303038152906040525b915050919050565b611d9161251c565b73ffffffffffffffffffffffffffffffffffffffff16611daf611baf565b73ffffffffffffffffffffffffffffffffffffffff1614611e05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfc906147ce565b60405180910390fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cbed8b9c86868686866040518663ffffffff1660e01b8152600401611e68959493929190615459565b600060405180830381600087803b158015611e8257600080fd5b505af1158015611e96573d6000803e3d6000fd5b505050505050505050565b611ea961251c565b73ffffffffffffffffffffffffffffffffffffffff16611ec7611baf565b73ffffffffffffffffffffffffffffffffffffffff1614611f1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f14906147ce565b60405180910390fd5b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611f6961251c565b73ffffffffffffffffffffffffffffffffffffffff16611f87611baf565b73ffffffffffffffffffffffffffffffffffffffff1614611fdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd4906147ce565b60405180910390fd5b80600f8190555050565b611fef61251c565b73ffffffffffffffffffffffffffffffffffffffff1661200d611baf565b73ffffffffffffffffffffffffffffffffffffffff1614612063576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205a906147ce565b60405180910390fd5b8060118190555050565b61207561251c565b73ffffffffffffffffffffffffffffffffffffffff16612093611baf565b73ffffffffffffffffffffffffffffffffffffffff16146120e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e0906147ce565b60405180910390fd5b6010546001600e546120fb91906146d8565b111561213c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213390614a77565b60405180910390fd5b600f5481600e5461214d91906146d8565b111561218e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612185906154f3565b60405180910390fd5b60005b818110156121ec576001600e60008282546121ac91906146d8565b925050819055506121bf33600e5461241c565b6001600d60008282546121d291906146d8565b9250508190555080806121e490615513565b915050612191565b5050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601360205280600052604060002060009150905080546122a39061449c565b80601f01602080910402602001604051908101604052809291908181526020018280546122cf9061449c565b801561231c5780601f106122f15761010080835404028352916020019161231c565b820191906000526020600020905b8154815290600101906020018083116122ff57829003601f168201915b505050505081565b61232c61251c565b73ffffffffffffffffffffffffffffffffffffffff1661234a611baf565b73ffffffffffffffffffffffffffffffffffffffff16146123a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612397906147ce565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612410576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612407906155ce565b60405180910390fd5b61241981612aab565b50565b612436828260405180602001604052806000815250612f2b565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061250557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612515575061251482612f86565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661260383611919565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061265482611919565b905061266281600084612ff0565b61266d600083612590565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126bd9190614c01565b925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461276281600084613104565b5050565b600061277182612524565b6127b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a790615660565b60405180910390fd5b60006127bb83611919565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061282a57508373ffffffffffffffffffffffffffffffffffffffff1661281284610c45565b73ffffffffffffffffffffffffffffffffffffffff16145b8061283b575061283a81856121f0565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661286482611919565b73ffffffffffffffffffffffffffffffffffffffff16146128ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b1906156f2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561292a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292190615784565b60405180910390fd5b612935838383612ff0565b612940600082612590565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129909190614c01565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129e791906146d8565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612aa6838383613104565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612bde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd5906157f0565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612ccf9190613be4565b60405180910390a3505050565b612ce7848484612844565b612cf384848484613109565b612d32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2990615882565b60405180910390fd5b50505050565b6060600b8054612d479061449c565b80601f0160208091040260200160405190810160405280929190818152602001828054612d739061449c565b8015612dc05780601f10612d9557610100808354040283529160200191612dc0565b820191906000526020600020905b815481529060010190602001808311612da357829003601f168201915b5050505050905090565b60606000821415612e12576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f26565b600082905060005b60008214612e44578080612e2d90615513565b915050600a82612e3d91906158d1565b9150612e1a565b60008167ffffffffffffffff811115612e6057612e5f61393a565b5b6040519080825280601f01601f191660200182016040528015612e925781602001600182028036833780820191505090505b5090505b60008514612f1f57600182612eab9190614c01565b9150600a85612eba9190615902565b6030612ec691906146d8565b60f81b818381518110612edc57612edb615214565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612f1891906158d1565b9450612e96565b8093505050505b919050565b612f3583836132a0565b612f426000848484613109565b612f81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7890615882565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612ffb83838361347a565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561303e576130398161347f565b61307d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461307c5761307b83826134c8565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130c0576130bb81613635565b6130ff565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146130fe576130fd8282613706565b5b5b505050565b505050565b600061312a8473ffffffffffffffffffffffffffffffffffffffff16613785565b15613293578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261315361251c565b8786866040518563ffffffff1660e01b81526004016131759493929190615933565b602060405180830381600087803b15801561318f57600080fd5b505af19250505080156131c057506040513d601f19601f820116820180604052508101906131bd9190615994565b60015b613243573d80600081146131f0576040519150601f19603f3d011682016040523d82523d6000602084013e6131f5565b606091505b5060008151141561323b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161323290615882565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613298565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613310576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161330790615a0d565b60405180910390fd5b61331981612524565b15613359576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335090615a79565b60405180910390fd5b61336560008383612ff0565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133b591906146d8565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461347660008383613104565b5050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016134d584611a6f565b6134df9190614c01565b90506000600860008481526020019081526020016000205490508181146135c4576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016009805490506136499190614c01565b90506000600a600084815260200190815260200160002054905060006009838154811061367957613678615214565b5b90600052602060002001549050806009838154811061369b5761369a615214565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a60008581526020019081526020016000206000905560098054806136ea576136e9615a99565b5b6001900381819060005260206000200160009055905550505050565b600061371183611a6f565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546137b49061449c565b90600052602060002090601f0160209004810192826137d6576000855561381d565b82601f106137ef57805160ff191683800117855561381d565b8280016001018555821561381d579182015b8281111561381c578251825591602001919060010190613801565b5b50905061382a91906138b4565b5090565b82805461383a9061449c565b90600052602060002090601f01602090048101928261385c57600085556138a3565b82601f1061387557803560ff19168380011785556138a3565b828001600101855582156138a3579182015b828111156138a2578235825591602001919060010190613887565b5b5090506138b091906138b4565b5090565b5b808211156138cd5760008160009055506001016138b5565b5090565b6000604051905090565b600080fd5b600080fd5b600061ffff82169050919050565b6138fc816138e5565b811461390757600080fd5b50565b600081359050613919816138f3565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61397282613929565b810181811067ffffffffffffffff821117156139915761399061393a565b5b80604052505050565b60006139a46138d1565b90506139b08282613969565b919050565b600067ffffffffffffffff8211156139d0576139cf61393a565b5b6139d982613929565b9050602081019050919050565b82818337600083830152505050565b6000613a08613a03846139b5565b61399a565b905082815260208101848484011115613a2457613a23613924565b5b613a2f8482856139e6565b509392505050565b600082601f830112613a4c57613a4b61391f565b5b8135613a5c8482602086016139f5565b91505092915050565b600067ffffffffffffffff82169050919050565b613a8281613a65565b8114613a8d57600080fd5b50565b600081359050613a9f81613a79565b92915050565b60008060008060808587031215613abf57613abe6138db565b5b6000613acd8782880161390a565b945050602085013567ffffffffffffffff811115613aee57613aed6138e0565b5b613afa87828801613a37565b9350506040613b0b87828801613a90565b925050606085013567ffffffffffffffff811115613b2c57613b2b6138e0565b5b613b3887828801613a37565b91505092959194509250565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613b7981613b44565b8114613b8457600080fd5b50565b600081359050613b9681613b70565b92915050565b600060208284031215613bb257613bb16138db565b5b6000613bc084828501613b87565b91505092915050565b60008115159050919050565b613bde81613bc9565b82525050565b6000602082019050613bf96000830184613bd5565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613c39578082015181840152602081019050613c1e565b83811115613c48576000848401525b50505050565b6000613c5982613bff565b613c638185613c0a565b9350613c73818560208601613c1b565b613c7c81613929565b840191505092915050565b60006020820190508181036000830152613ca18184613c4e565b905092915050565b600060208284031215613cbf57613cbe6138db565b5b6000613ccd8482850161390a565b91505092915050565b6000819050919050565b613ce981613cd6565b8114613cf457600080fd5b50565b600081359050613d0681613ce0565b92915050565b600060208284031215613d2257613d216138db565b5b6000613d3084828501613cf7565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613d6482613d39565b9050919050565b613d7481613d59565b82525050565b6000602082019050613d8f6000830184613d6b565b92915050565b613d9e81613d59565b8114613da957600080fd5b50565b600081359050613dbb81613d95565b92915050565b60008060408385031215613dd857613dd76138db565b5b6000613de685828601613dac565b9250506020613df785828601613cf7565b9150509250929050565b613e0a81613cd6565b82525050565b6000602082019050613e256000830184613e01565b92915050565b60008060408385031215613e4257613e416138db565b5b6000613e508582860161390a565b9250506020613e6185828601613cf7565b9150509250929050565b600080fd5b600080fd5b60008083601f840112613e8b57613e8a61391f565b5b8235905067ffffffffffffffff811115613ea857613ea7613e6b565b5b602083019150836001820283011115613ec457613ec3613e70565b5b9250929050565b613ed481613bc9565b8114613edf57600080fd5b50565b600081359050613ef181613ecb565b92915050565b60008060008060008060808789031215613f1457613f136138db565b5b6000613f2289828a0161390a565b965050602087013567ffffffffffffffff811115613f4357613f426138e0565b5b613f4f89828a01613e75565b95509550506040613f6289828a01613ee2565b935050606087013567ffffffffffffffff811115613f8357613f826138e0565b5b613f8f89828a01613e75565b92509250509295509295509295565b6000604082019050613fb36000830185613e01565b613fc06020830184613e01565b9392505050565b600080600060608486031215613fe057613fdf6138db565b5b6000613fee86828701613dac565b9350506020613fff86828701613dac565b925050604061401086828701613cf7565b9150509250925092565b600080600060408486031215614033576140326138db565b5b60006140418682870161390a565b935050602084013567ffffffffffffffff811115614062576140616138e0565b5b61406e86828701613e75565b92509250509250925092565b600067ffffffffffffffff8211156140955761409461393a565b5b61409e82613929565b9050602081019050919050565b60006140be6140b98461407a565b61399a565b9050828152602081018484840111156140da576140d9613924565b5b6140e58482856139e6565b509392505050565b600082601f8301126141025761410161391f565b5b81356141128482602086016140ab565b91505092915050565b600060208284031215614131576141306138db565b5b600082013567ffffffffffffffff81111561414f5761414e6138e0565b5b61415b848285016140ed565b91505092915050565b6000819050919050565b600061418961418461417f84613d39565b614164565b613d39565b9050919050565b600061419b8261416e565b9050919050565b60006141ad82614190565b9050919050565b6141bd816141a2565b82525050565b60006020820190506141d860008301846141b4565b92915050565b6000806000604084860312156141f7576141f66138db565b5b600061420586828701613cf7565b935050602084013567ffffffffffffffff811115614226576142256138e0565b5b61423286828701613e75565b92509250509250925092565b600060208284031215614254576142536138db565b5b600061426284828501613dac565b91505092915050565b60008060408385031215614282576142816138db565b5b600061429085828601613dac565b92505060206142a185828601613ee2565b9150509250929050565b600080600080608085870312156142c5576142c46138db565b5b60006142d387828801613dac565b94505060206142e487828801613dac565b93505060406142f587828801613cf7565b925050606085013567ffffffffffffffff811115614316576143156138e0565b5b61432287828801613a37565b91505092959194509250565b60008060008060006080868803121561434a576143496138db565b5b60006143588882890161390a565b95505060206143698882890161390a565b945050604061437a88828901613cf7565b935050606086013567ffffffffffffffff81111561439b5761439a6138e0565b5b6143a788828901613e75565b92509250509295509295909350565b600080604083850312156143cd576143cc6138db565b5b60006143db85828601613dac565b92505060206143ec85828601613dac565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b600061441d826143f6565b6144278185614401565b9350614437818560208601613c1b565b61444081613929565b840191505092915050565b600060208201905081810360008301526144658184614412565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806144b457607f821691505b602082108114156144c8576144c761446d565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546144fb8161449c565b61450581866144ce565b94506001821660008114614520576001811461453157614564565b60ff19831686528186019350614564565b61453a856144d9565b60005b8381101561455c5781548189015260018201915060208101905061453d565b838801955050505b50505092915050565b600061457982846144ee565b915081905092915050565b7f43616c6c206d7573742073656e642066726f6d2076616c69642075736572206160008201527f70706c69636174696f6e00000000000000000000000000000000000000000000602082015250565b60006145e0602a83613c0a565b91506145eb82614584565b604082019050919050565b6000602082019050818103600083015261460f816145d3565b9050919050565b600061462182613d39565b9050919050565b61463181614616565b811461463c57600080fd5b50565b60008151905061464e81614628565b92915050565b60008151905061466381613ce0565b92915050565b600080604083850312156146805761467f6138db565b5b600061468e8582860161463f565b925050602061469f85828601614654565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006146e382613cd6565b91506146ee83613cd6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614723576147226146a9565b5b828201905092915050565b614737816138e5565b82525050565b6000608082019050614752600083018761472e565b61475f6020830186613d6b565b61476c6040830185613e01565b6147796060830184613e01565b95945050505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006147b8602083613c0a565b91506147c382614782565b602082019050919050565b600060208201905081810360008301526147e7816147ab565b9050919050565b6000602082019050614803600083018461472e565b92915050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614865602c83613c0a565b915061487082614809565b604082019050919050565b6000602082019050818103600083015261489481614858565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006148f7602183613c0a565b91506149028261489b565b604082019050919050565b60006020820190508181036000830152614926816148ea565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000614989603883613c0a565b91506149948261492d565b604082019050919050565b600060208201905081810360008301526149b88161497c565b9050919050565b7f4d696e7420656e64656400000000000000000000000000000000000000000000600082015250565b60006149f5600a83613c0a565b9150614a00826149bf565b602082019050919050565b60006020820190508181036000830152614a24816149e8565b9050919050565b7f4d617820737570706c7920657863656564000000000000000000000000000000600082015250565b6000614a61601183613c0a565b9150614a6c82614a2b565b602082019050919050565b60006020820190508181036000830152614a9081614a54565b9050919050565b7f4163636f756e742042616c616e6365206f6e2043757272656e7420636861696e60008201527f2065786365656473206c696d6974000000000000000000000000000000000000602082015250565b6000614af3602e83613c0a565b9150614afe82614a97565b604082019050919050565b60006020820190508181036000830152614b2281614ae6565b9050919050565b7f4f6e6c79206f776e65722063616c6c2063726f737320636861696e0000000000600082015250565b6000614b5f601b83613c0a565b9150614b6a82614b29565b602082019050919050565b60006020820190508181036000830152614b8e81614b52565b9050919050565b7f496e76616c696420636861696e49640000000000000000000000000000000000600082015250565b6000614bcb600f83613c0a565b9150614bd682614b95565b602082019050919050565b60006020820190508181036000830152614bfa81614bbe565b9050919050565b6000614c0c82613cd6565b9150614c1783613cd6565b925082821015614c2a57614c296146a9565b5b828203905092915050565b6000604082019050614c4a6000830185613d6b565b614c576020830184613e01565b9392505050565b60008160f01b9050919050565b6000614c7682614c5e565b9050919050565b614c8e614c89826138e5565b614c6b565b82525050565b6000819050919050565b614caf614caa82613cd6565b614c94565b82525050565b6000614cc18285614c7d565b600282019150614cd18284614c9e565b6020820191508190509392505050565b600060a082019050614cf6600083018861472e565b614d036020830187613d6b565b8181036040830152614d158186614412565b9050614d246060830185613bd5565b8181036080830152614d368184614412565b90509695505050505050565b60008060408385031215614d5957614d586138db565b5b6000614d6785828601614654565b9250506020614d7885828601614654565b9150509250929050565b7f4d65737361676520466565204e6f7420456e6f75676800000000000000000000600082015250565b6000614db8601683613c0a565b9150614dc382614d82565b602082019050919050565b60006020820190508181036000830152614de781614dab565b9050919050565b60008154614dfb8161449c565b614e058186614401565b94506001821660008114614e205760018114614e3257614e65565b60ff1983168652602086019350614e65565b614e3b856144d9565b60005b83811015614e5d57815481890152600182019150602081019050614e3e565b808801955050505b50505092915050565b614e7781614616565b82525050565b600060c082019050614e92600083018961472e565b8181036020830152614ea48188614dee565b90508181036040830152614eb88187614412565b9050614ec76060830186614e6e565b614ed46080830185613d6b565b81810360a0830152614ee68184614412565b9050979650505050505050565b6000614eff8385614401565b9350614f0c8385846139e6565b614f1583613929565b840190509392505050565b600060a082019050614f35600083018a61472e565b614f426020830189613d6b565b8181036040830152614f55818789614ef3565b9050614f646060830186613bd5565b8181036080830152614f77818486614ef3565b905098975050505050505050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000614fe1603183613c0a565b9150614fec82614f85565b604082019050919050565b6000602082019050818103600083015261501081614fd4565b9050919050565b50565b60006150276000836144ce565b915061503282615017565b600082019050919050565b60006150488261501a565b9150819050919050565b7f4572726f72210000000000000000000000000000000000000000000000000000600082015250565b6000615088600683613c0a565b915061509382615052565b602082019050919050565b600060208201905081810360008301526150b78161507b565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b600061511a602b83613c0a565b9150615125826150be565b604082019050919050565b600060208201905081810360008301526151498161510d565b9050919050565b6000604082019050615165600083018661472e565b8181036020830152615178818486614ef3565b9050949350505050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006151de602c83613c0a565b91506151e982615182565b604082019050919050565b6000602082019050818103600083015261520d816151d1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061529f602983613c0a565b91506152aa82615243565b604082019050919050565b600060208201905081810360008301526152ce81615292565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000615331602a83613c0a565b915061533c826152d5565b604082019050919050565b6000602082019050818103600083015261536081615324565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006153c3602f83613c0a565b91506153ce82615367565b604082019050919050565b600060208201905081810360008301526153f2816153b6565b9050919050565b600081905092915050565b600061540f82613bff565b61541981856153f9565b9350615429818560208601613c1b565b80840191505092915050565b60006154418285615404565b915061544d8284615404565b91508190509392505050565b600060808201905061546e600083018861472e565b61547b602083018761472e565b6154886040830186613e01565b818103606083015261549b818486614ef3565b90509695505050505050565b7f537570706c792065786365656400000000000000000000000000000000000000600082015250565b60006154dd600d83613c0a565b91506154e8826154a7565b602082019050919050565b6000602082019050818103600083015261550c816154d0565b9050919050565b600061551e82613cd6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615551576155506146a9565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006155b8602683613c0a565b91506155c38261555c565b604082019050919050565b600060208201905081810360008301526155e7816155ab565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061564a602c83613c0a565b9150615655826155ee565b604082019050919050565b600060208201905081810360008301526156798161563d565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006156dc602583613c0a565b91506156e782615680565b604082019050919050565b6000602082019050818103600083015261570b816156cf565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061576e602483613c0a565b915061577982615712565b604082019050919050565b6000602082019050818103600083015261579d81615761565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006157da601983613c0a565b91506157e5826157a4565b602082019050919050565b60006020820190508181036000830152615809816157cd565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061586c603283613c0a565b915061587782615810565b604082019050919050565b6000602082019050818103600083015261589b8161585f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006158dc82613cd6565b91506158e783613cd6565b9250826158f7576158f66158a2565b5b828204905092915050565b600061590d82613cd6565b915061591883613cd6565b925082615928576159276158a2565b5b828206905092915050565b60006080820190506159486000830187613d6b565b6159556020830186613d6b565b6159626040830185613e01565b81810360608301526159748184614412565b905095945050505050565b60008151905061598e81613b70565b92915050565b6000602082840312156159aa576159a96138db565b5b60006159b88482850161597f565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006159f7602083613c0a565b9150615a02826159c1565b602082019050919050565b60006020820190508181036000830152615a26816159ea565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615a63601c83613c0a565b9150615a6e82615a2d565b602082019050919050565b60006020820190508181036000830152615a9281615a56565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220f6cc9ca5c2712f5cb4e2523faf30f6830aad1ddf60d4cfa5e16633ed89f0c00b64736f6c6343000809003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007d000000000000000000000000000000000000000000000000000000000000000c80000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d5061386d4b536b575675527239333447664e67704c42553671654a4670726d39366f706d7256656a3565516a2f00000000000000000000

Deployed Bytecode

0x6080604052600436106102195760003560e01c806355f804b311610123578063b88d4fde116100ab578063dd51faa21161006f578063dd51faa2146107ab578063e71741af146107d4578063e985e9c5146107fd578063f2f5d87c1461083a578063f2fde38b1461087757610219565b8063b88d4fde146106ca578063c87b56dd146106f3578063cbed8b9c14610730578063dbbb415514610759578063dc5473011461078257610219565b806370a08231116100f257806370a08231146105f7578063715018a6146106345780638da5cb5b1461064b57806395d89b4114610676578063a22cb465146106a157610219565b806355f804b31461053d5780635e280f11146105665780636352211e14610591578063655e35be146105ce57610219565b80631e128296116101a65780632e1a7d4d116101755780632e1a7d4d146104485780632f745c591461047157806342842e0e146104ae57806342d65a8d146104d75780634f6ccce71461050057610219565b80631e1282961461039c57806321b4eaa1146103b857806323b872dd146103f657806327ea6f2b1461041f57610219565b8063081812fc116101ed578063081812fc146102d8578063095ea7b31461031557806310ddb1371461033e5780631249c58b1461036757806318160ddd1461037157610219565b80621d35671461021e57806301ffc9a71461024757806306fdde031461028457806307e0db17146102af575b600080fd5b34801561022a57600080fd5b5061024560048036038101906102409190613aa5565b6108a0565b005b34801561025357600080fd5b5061026e60048036038101906102699190613b9c565b610a2d565b60405161027b9190613be4565b60405180910390f35b34801561029057600080fd5b50610299610aa7565b6040516102a69190613c87565b60405180910390f35b3480156102bb57600080fd5b506102d660048036038101906102d19190613ca9565b610b39565b005b3480156102e457600080fd5b506102ff60048036038101906102fa9190613d0c565b610c45565b60405161030c9190613d7a565b60405180910390f35b34801561032157600080fd5b5061033c60048036038101906103379190613dc1565b610cca565b005b34801561034a57600080fd5b5061036560048036038101906103609190613ca9565b610de2565b005b61036f610eee565b005b34801561037d57600080fd5b50610386611022565b6040516103939190613e10565b60405180910390f35b6103b660048036038101906103b19190613e2b565b61102f565b005b3480156103c457600080fd5b506103df60048036038101906103da9190613ef7565b611334565b6040516103ed929190613f9e565b60405180910390f35b34801561040257600080fd5b5061041d60048036038101906104189190613fc7565b6113fc565b005b34801561042b57600080fd5b5061044660048036038101906104419190613d0c565b61145c565b005b34801561045457600080fd5b5061046f600480360381019061046a9190613d0c565b6114e2565b005b34801561047d57600080fd5b5061049860048036038101906104939190613dc1565b611615565b6040516104a59190613e10565b60405180910390f35b3480156104ba57600080fd5b506104d560048036038101906104d09190613fc7565b6116ba565b005b3480156104e357600080fd5b506104fe60048036038101906104f9919061401a565b6116da565b005b34801561050c57600080fd5b5061052760048036038101906105229190613d0c565b6117ec565b6040516105349190613e10565b60405180910390f35b34801561054957600080fd5b50610564600480360381019061055f919061411b565b61185d565b005b34801561057257600080fd5b5061057b6118f3565b60405161058891906141c3565b60405180910390f35b34801561059d57600080fd5b506105b860048036038101906105b39190613d0c565b611919565b6040516105c59190613d7a565b60405180910390f35b3480156105da57600080fd5b506105f560048036038101906105f091906141de565b6119cb565b005b34801561060357600080fd5b5061061e6004803603810190610619919061423e565b611a6f565b60405161062b9190613e10565b60405180910390f35b34801561064057600080fd5b50610649611b27565b005b34801561065757600080fd5b50610660611baf565b60405161066d9190613d7a565b60405180910390f35b34801561068257600080fd5b5061068b611bd8565b6040516106989190613c87565b60405180910390f35b3480156106ad57600080fd5b506106c860048036038101906106c3919061426b565b611c6a565b005b3480156106d657600080fd5b506106f160048036038101906106ec91906142ab565b611c80565b005b3480156106ff57600080fd5b5061071a60048036038101906107159190613d0c565b611ce2565b6040516107279190613c87565b60405180910390f35b34801561073c57600080fd5b506107576004803603810190610752919061432e565b611d89565b005b34801561076557600080fd5b50610780600480360381019061077b919061423e565b611ea1565b005b34801561078e57600080fd5b506107a960048036038101906107a49190613d0c565b611f61565b005b3480156107b757600080fd5b506107d260048036038101906107cd9190613d0c565b611fe7565b005b3480156107e057600080fd5b506107fb60048036038101906107f69190613d0c565b61206d565b005b34801561080957600080fd5b50610824600480360381019061081f91906143b6565b6121f0565b6040516108319190613be4565b60405180910390f35b34801561084657600080fd5b50610861600480360381019061085c9190613d0c565b612284565b60405161086e919061444b565b60405180910390f35b34801561088357600080fd5b5061089e6004803603810190610899919061423e565b612324565b005b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108fa57600080fd5b601360008561ffff168152602001908152602001600020805461091c9061449c565b9050835114801561095e5750601360008561ffff16815260200190815260200160002060405161094c919061456d565b60405180910390208380519060200120145b61099d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610994906145f6565b60405180910390fd5b600060148401519050600080838060200190518101906109bd9190614669565b915091506109cb828261241c565b6001600d60008282546109de91906146d8565b925050819055507fec16668a9529c4fc256054f3e18620ef50c89aec357376cce821207ff1e656f0878383600d54604051610a1c949392919061473d565b60405180910390a150505050505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610aa05750610a9f8261243a565b5b9050919050565b606060018054610ab69061449c565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae29061449c565b8015610b2f5780601f10610b0457610100808354040283529160200191610b2f565b820191906000526020600020905b815481529060010190602001808311610b1257829003601f168201915b5050505050905090565b610b4161251c565b73ffffffffffffffffffffffffffffffffffffffff16610b5f611baf565b73ffffffffffffffffffffffffffffffffffffffff1614610bb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bac906147ce565b60405180910390fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166307e0db17826040518263ffffffff1660e01b8152600401610c1091906147ee565b600060405180830381600087803b158015610c2a57600080fd5b505af1158015610c3e573d6000803e3d6000fd5b5050505050565b6000610c5082612524565b610c8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c869061487b565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cd582611919565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3d9061490d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d6561251c565b73ffffffffffffffffffffffffffffffffffffffff161480610d945750610d9381610d8e61251c565b6121f0565b5b610dd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dca9061499f565b60405180910390fd5b610ddd8383612590565b505050565b610dea61251c565b73ffffffffffffffffffffffffffffffffffffffff16610e08611baf565b73ffffffffffffffffffffffffffffffffffffffff1614610e5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e55906147ce565b60405180910390fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166310ddb137826040518263ffffffff1660e01b8152600401610eb991906147ee565b600060405180830381600087803b158015610ed357600080fd5b505af1158015610ee7573d6000803e3d6000fd5b5050505050565b600f546001600e54610f0091906146d8565b1115610f41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3890614a0b565b60405180910390fd5b6010546001600e54610f5391906146d8565b1115610f94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8b90614a77565b60405180910390fd5b600c54610fa033611a6f565b10610fe0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd790614b09565b60405180910390fd5b6001600e6000828254610ff391906146d8565b9250508190555061100633600e5461241c565b6001600d600082825461101991906146d8565b92505081905550565b6000600980549050905090565b61103881611919565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109c90614b75565b60405180910390fd5b6000601360008461ffff16815260200190815260200160002080546110c99061449c565b90501161110b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110290614be1565b60405180910390fd5b61111481612649565b6001600d60008282546111279190614c01565b9250508190555060003382604051602001611143929190614c35565b6040516020818303038152906040529050600060019050600081601154604051602001611171929190614cb5565b60405160208183030381529060405290506000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340a7bb108730876000876040518663ffffffff1660e01b81526004016111e8959493929190614ce1565b604080518083038186803b1580156111ff57600080fd5b505afa158015611213573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112379190614d42565b5090508034101561127d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127490614dce565b60405180910390fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c58031003488601360008b61ffff16815260200190815260200160002088336000896040518863ffffffff1660e01b81526004016112fa96959493929190614e7d565b6000604051808303818588803b15801561131357600080fd5b505af1158015611327573d6000803e3d6000fd5b5050505050505050505050565b600080601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340a7bb1089308a8a8a8a8a6040518863ffffffff1660e01b815260040161139e9796959493929190614f20565b604080518083038186803b1580156113b557600080fd5b505afa1580156113c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ed9190614d42565b91509150965096945050505050565b61140d61140761251c565b82612766565b61144c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144390614ff7565b60405180910390fd5b611457838383612844565b505050565b61146461251c565b73ffffffffffffffffffffffffffffffffffffffff16611482611baf565b73ffffffffffffffffffffffffffffffffffffffff16146114d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cf906147ce565b60405180910390fd5b80600c8190555050565b6114ea61251c565b73ffffffffffffffffffffffffffffffffffffffff16611508611baf565b73ffffffffffffffffffffffffffffffffffffffff161461155e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611555906147ce565b60405180910390fd5b6000611568611baf565b73ffffffffffffffffffffffffffffffffffffffff168260405161158b9061503d565b60006040518083038185875af1925050503d80600081146115c8576040519150601f19603f3d011682016040523d82523d6000602084013e6115cd565b606091505b5050905080611611576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116089061509e565b60405180910390fd5b5050565b600061162083611a6f565b8210611661576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165890615130565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6116d583838360405180602001604052806000815250611c80565b505050565b6116e261251c565b73ffffffffffffffffffffffffffffffffffffffff16611700611baf565b73ffffffffffffffffffffffffffffffffffffffff1614611756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174d906147ce565b60405180910390fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342d65a8d8484846040518463ffffffff1660e01b81526004016117b593929190615150565b600060405180830381600087803b1580156117cf57600080fd5b505af11580156117e3573d6000803e3d6000fd5b50505050505050565b60006117f6611022565b8210611837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182e906151f4565b60405180910390fd5b6009828154811061184b5761184a615214565b5b90600052602060002001549050919050565b61186561251c565b73ffffffffffffffffffffffffffffffffffffffff16611883611baf565b73ffffffffffffffffffffffffffffffffffffffff16146118d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d0906147ce565b60405180910390fd5b80600b90805190602001906118ef9291906137a8565b5050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b9906152b5565b60405180910390fd5b80915050919050565b6119d361251c565b73ffffffffffffffffffffffffffffffffffffffff166119f1611baf565b73ffffffffffffffffffffffffffffffffffffffff1614611a47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3e906147ce565b60405180910390fd5b8181601360008681526020019081526020016000209190611a6992919061382e565b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ae0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad790615347565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611b2f61251c565b73ffffffffffffffffffffffffffffffffffffffff16611b4d611baf565b73ffffffffffffffffffffffffffffffffffffffff1614611ba3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9a906147ce565b60405180910390fd5b611bad6000612aab565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054611be79061449c565b80601f0160208091040260200160405190810160405280929190818152602001828054611c139061449c565b8015611c605780601f10611c3557610100808354040283529160200191611c60565b820191906000526020600020905b815481529060010190602001808311611c4357829003601f168201915b5050505050905090565b611c7c611c7561251c565b8383612b6f565b5050565b611c91611c8b61251c565b83612766565b611cd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc790614ff7565b60405180910390fd5b611cdc84848484612cdc565b50505050565b6060611ced82612524565b611d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d23906153d9565b60405180910390fd5b6000611d36612d38565b90506000815111611d565760405180602001604052806000815250611d81565b80611d6084612dca565b604051602001611d71929190615435565b6040516020818303038152906040525b915050919050565b611d9161251c565b73ffffffffffffffffffffffffffffffffffffffff16611daf611baf565b73ffffffffffffffffffffffffffffffffffffffff1614611e05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfc906147ce565b60405180910390fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cbed8b9c86868686866040518663ffffffff1660e01b8152600401611e68959493929190615459565b600060405180830381600087803b158015611e8257600080fd5b505af1158015611e96573d6000803e3d6000fd5b505050505050505050565b611ea961251c565b73ffffffffffffffffffffffffffffffffffffffff16611ec7611baf565b73ffffffffffffffffffffffffffffffffffffffff1614611f1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f14906147ce565b60405180910390fd5b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611f6961251c565b73ffffffffffffffffffffffffffffffffffffffff16611f87611baf565b73ffffffffffffffffffffffffffffffffffffffff1614611fdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd4906147ce565b60405180910390fd5b80600f8190555050565b611fef61251c565b73ffffffffffffffffffffffffffffffffffffffff1661200d611baf565b73ffffffffffffffffffffffffffffffffffffffff1614612063576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205a906147ce565b60405180910390fd5b8060118190555050565b61207561251c565b73ffffffffffffffffffffffffffffffffffffffff16612093611baf565b73ffffffffffffffffffffffffffffffffffffffff16146120e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e0906147ce565b60405180910390fd5b6010546001600e546120fb91906146d8565b111561213c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213390614a77565b60405180910390fd5b600f5481600e5461214d91906146d8565b111561218e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612185906154f3565b60405180910390fd5b60005b818110156121ec576001600e60008282546121ac91906146d8565b925050819055506121bf33600e5461241c565b6001600d60008282546121d291906146d8565b9250508190555080806121e490615513565b915050612191565b5050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601360205280600052604060002060009150905080546122a39061449c565b80601f01602080910402602001604051908101604052809291908181526020018280546122cf9061449c565b801561231c5780601f106122f15761010080835404028352916020019161231c565b820191906000526020600020905b8154815290600101906020018083116122ff57829003601f168201915b505050505081565b61232c61251c565b73ffffffffffffffffffffffffffffffffffffffff1661234a611baf565b73ffffffffffffffffffffffffffffffffffffffff16146123a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612397906147ce565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612410576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612407906155ce565b60405180910390fd5b61241981612aab565b50565b612436828260405180602001604052806000815250612f2b565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061250557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612515575061251482612f86565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661260383611919565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061265482611919565b905061266281600084612ff0565b61266d600083612590565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126bd9190614c01565b925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461276281600084613104565b5050565b600061277182612524565b6127b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a790615660565b60405180910390fd5b60006127bb83611919565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061282a57508373ffffffffffffffffffffffffffffffffffffffff1661281284610c45565b73ffffffffffffffffffffffffffffffffffffffff16145b8061283b575061283a81856121f0565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661286482611919565b73ffffffffffffffffffffffffffffffffffffffff16146128ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b1906156f2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561292a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292190615784565b60405180910390fd5b612935838383612ff0565b612940600082612590565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129909190614c01565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129e791906146d8565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612aa6838383613104565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612bde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd5906157f0565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612ccf9190613be4565b60405180910390a3505050565b612ce7848484612844565b612cf384848484613109565b612d32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2990615882565b60405180910390fd5b50505050565b6060600b8054612d479061449c565b80601f0160208091040260200160405190810160405280929190818152602001828054612d739061449c565b8015612dc05780601f10612d9557610100808354040283529160200191612dc0565b820191906000526020600020905b815481529060010190602001808311612da357829003601f168201915b5050505050905090565b60606000821415612e12576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f26565b600082905060005b60008214612e44578080612e2d90615513565b915050600a82612e3d91906158d1565b9150612e1a565b60008167ffffffffffffffff811115612e6057612e5f61393a565b5b6040519080825280601f01601f191660200182016040528015612e925781602001600182028036833780820191505090505b5090505b60008514612f1f57600182612eab9190614c01565b9150600a85612eba9190615902565b6030612ec691906146d8565b60f81b818381518110612edc57612edb615214565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612f1891906158d1565b9450612e96565b8093505050505b919050565b612f3583836132a0565b612f426000848484613109565b612f81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7890615882565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612ffb83838361347a565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561303e576130398161347f565b61307d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461307c5761307b83826134c8565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130c0576130bb81613635565b6130ff565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146130fe576130fd8282613706565b5b5b505050565b505050565b600061312a8473ffffffffffffffffffffffffffffffffffffffff16613785565b15613293578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261315361251c565b8786866040518563ffffffff1660e01b81526004016131759493929190615933565b602060405180830381600087803b15801561318f57600080fd5b505af19250505080156131c057506040513d601f19601f820116820180604052508101906131bd9190615994565b60015b613243573d80600081146131f0576040519150601f19603f3d011682016040523d82523d6000602084013e6131f5565b606091505b5060008151141561323b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161323290615882565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613298565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613310576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161330790615a0d565b60405180910390fd5b61331981612524565b15613359576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335090615a79565b60405180910390fd5b61336560008383612ff0565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133b591906146d8565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461347660008383613104565b5050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016134d584611a6f565b6134df9190614c01565b90506000600860008481526020019081526020016000205490508181146135c4576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016009805490506136499190614c01565b90506000600a600084815260200190815260200160002054905060006009838154811061367957613678615214565b5b90600052602060002001549050806009838154811061369b5761369a615214565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a60008581526020019081526020016000206000905560098054806136ea576136e9615a99565b5b6001900381819060005260206000200160009055905550505050565b600061371183611a6f565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546137b49061449c565b90600052602060002090601f0160209004810192826137d6576000855561381d565b82601f106137ef57805160ff191683800117855561381d565b8280016001018555821561381d579182015b8281111561381c578251825591602001919060010190613801565b5b50905061382a91906138b4565b5090565b82805461383a9061449c565b90600052602060002090601f01602090048101928261385c57600085556138a3565b82601f1061387557803560ff19168380011785556138a3565b828001600101855582156138a3579182015b828111156138a2578235825591602001919060010190613887565b5b5090506138b091906138b4565b5090565b5b808211156138cd5760008160009055506001016138b5565b5090565b6000604051905090565b600080fd5b600080fd5b600061ffff82169050919050565b6138fc816138e5565b811461390757600080fd5b50565b600081359050613919816138f3565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61397282613929565b810181811067ffffffffffffffff821117156139915761399061393a565b5b80604052505050565b60006139a46138d1565b90506139b08282613969565b919050565b600067ffffffffffffffff8211156139d0576139cf61393a565b5b6139d982613929565b9050602081019050919050565b82818337600083830152505050565b6000613a08613a03846139b5565b61399a565b905082815260208101848484011115613a2457613a23613924565b5b613a2f8482856139e6565b509392505050565b600082601f830112613a4c57613a4b61391f565b5b8135613a5c8482602086016139f5565b91505092915050565b600067ffffffffffffffff82169050919050565b613a8281613a65565b8114613a8d57600080fd5b50565b600081359050613a9f81613a79565b92915050565b60008060008060808587031215613abf57613abe6138db565b5b6000613acd8782880161390a565b945050602085013567ffffffffffffffff811115613aee57613aed6138e0565b5b613afa87828801613a37565b9350506040613b0b87828801613a90565b925050606085013567ffffffffffffffff811115613b2c57613b2b6138e0565b5b613b3887828801613a37565b91505092959194509250565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613b7981613b44565b8114613b8457600080fd5b50565b600081359050613b9681613b70565b92915050565b600060208284031215613bb257613bb16138db565b5b6000613bc084828501613b87565b91505092915050565b60008115159050919050565b613bde81613bc9565b82525050565b6000602082019050613bf96000830184613bd5565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613c39578082015181840152602081019050613c1e565b83811115613c48576000848401525b50505050565b6000613c5982613bff565b613c638185613c0a565b9350613c73818560208601613c1b565b613c7c81613929565b840191505092915050565b60006020820190508181036000830152613ca18184613c4e565b905092915050565b600060208284031215613cbf57613cbe6138db565b5b6000613ccd8482850161390a565b91505092915050565b6000819050919050565b613ce981613cd6565b8114613cf457600080fd5b50565b600081359050613d0681613ce0565b92915050565b600060208284031215613d2257613d216138db565b5b6000613d3084828501613cf7565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613d6482613d39565b9050919050565b613d7481613d59565b82525050565b6000602082019050613d8f6000830184613d6b565b92915050565b613d9e81613d59565b8114613da957600080fd5b50565b600081359050613dbb81613d95565b92915050565b60008060408385031215613dd857613dd76138db565b5b6000613de685828601613dac565b9250506020613df785828601613cf7565b9150509250929050565b613e0a81613cd6565b82525050565b6000602082019050613e256000830184613e01565b92915050565b60008060408385031215613e4257613e416138db565b5b6000613e508582860161390a565b9250506020613e6185828601613cf7565b9150509250929050565b600080fd5b600080fd5b60008083601f840112613e8b57613e8a61391f565b5b8235905067ffffffffffffffff811115613ea857613ea7613e6b565b5b602083019150836001820283011115613ec457613ec3613e70565b5b9250929050565b613ed481613bc9565b8114613edf57600080fd5b50565b600081359050613ef181613ecb565b92915050565b60008060008060008060808789031215613f1457613f136138db565b5b6000613f2289828a0161390a565b965050602087013567ffffffffffffffff811115613f4357613f426138e0565b5b613f4f89828a01613e75565b95509550506040613f6289828a01613ee2565b935050606087013567ffffffffffffffff811115613f8357613f826138e0565b5b613f8f89828a01613e75565b92509250509295509295509295565b6000604082019050613fb36000830185613e01565b613fc06020830184613e01565b9392505050565b600080600060608486031215613fe057613fdf6138db565b5b6000613fee86828701613dac565b9350506020613fff86828701613dac565b925050604061401086828701613cf7565b9150509250925092565b600080600060408486031215614033576140326138db565b5b60006140418682870161390a565b935050602084013567ffffffffffffffff811115614062576140616138e0565b5b61406e86828701613e75565b92509250509250925092565b600067ffffffffffffffff8211156140955761409461393a565b5b61409e82613929565b9050602081019050919050565b60006140be6140b98461407a565b61399a565b9050828152602081018484840111156140da576140d9613924565b5b6140e58482856139e6565b509392505050565b600082601f8301126141025761410161391f565b5b81356141128482602086016140ab565b91505092915050565b600060208284031215614131576141306138db565b5b600082013567ffffffffffffffff81111561414f5761414e6138e0565b5b61415b848285016140ed565b91505092915050565b6000819050919050565b600061418961418461417f84613d39565b614164565b613d39565b9050919050565b600061419b8261416e565b9050919050565b60006141ad82614190565b9050919050565b6141bd816141a2565b82525050565b60006020820190506141d860008301846141b4565b92915050565b6000806000604084860312156141f7576141f66138db565b5b600061420586828701613cf7565b935050602084013567ffffffffffffffff811115614226576142256138e0565b5b61423286828701613e75565b92509250509250925092565b600060208284031215614254576142536138db565b5b600061426284828501613dac565b91505092915050565b60008060408385031215614282576142816138db565b5b600061429085828601613dac565b92505060206142a185828601613ee2565b9150509250929050565b600080600080608085870312156142c5576142c46138db565b5b60006142d387828801613dac565b94505060206142e487828801613dac565b93505060406142f587828801613cf7565b925050606085013567ffffffffffffffff811115614316576143156138e0565b5b61432287828801613a37565b91505092959194509250565b60008060008060006080868803121561434a576143496138db565b5b60006143588882890161390a565b95505060206143698882890161390a565b945050604061437a88828901613cf7565b935050606086013567ffffffffffffffff81111561439b5761439a6138e0565b5b6143a788828901613e75565b92509250509295509295909350565b600080604083850312156143cd576143cc6138db565b5b60006143db85828601613dac565b92505060206143ec85828601613dac565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b600061441d826143f6565b6144278185614401565b9350614437818560208601613c1b565b61444081613929565b840191505092915050565b600060208201905081810360008301526144658184614412565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806144b457607f821691505b602082108114156144c8576144c761446d565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546144fb8161449c565b61450581866144ce565b94506001821660008114614520576001811461453157614564565b60ff19831686528186019350614564565b61453a856144d9565b60005b8381101561455c5781548189015260018201915060208101905061453d565b838801955050505b50505092915050565b600061457982846144ee565b915081905092915050565b7f43616c6c206d7573742073656e642066726f6d2076616c69642075736572206160008201527f70706c69636174696f6e00000000000000000000000000000000000000000000602082015250565b60006145e0602a83613c0a565b91506145eb82614584565b604082019050919050565b6000602082019050818103600083015261460f816145d3565b9050919050565b600061462182613d39565b9050919050565b61463181614616565b811461463c57600080fd5b50565b60008151905061464e81614628565b92915050565b60008151905061466381613ce0565b92915050565b600080604083850312156146805761467f6138db565b5b600061468e8582860161463f565b925050602061469f85828601614654565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006146e382613cd6565b91506146ee83613cd6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614723576147226146a9565b5b828201905092915050565b614737816138e5565b82525050565b6000608082019050614752600083018761472e565b61475f6020830186613d6b565b61476c6040830185613e01565b6147796060830184613e01565b95945050505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006147b8602083613c0a565b91506147c382614782565b602082019050919050565b600060208201905081810360008301526147e7816147ab565b9050919050565b6000602082019050614803600083018461472e565b92915050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614865602c83613c0a565b915061487082614809565b604082019050919050565b6000602082019050818103600083015261489481614858565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006148f7602183613c0a565b91506149028261489b565b604082019050919050565b60006020820190508181036000830152614926816148ea565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000614989603883613c0a565b91506149948261492d565b604082019050919050565b600060208201905081810360008301526149b88161497c565b9050919050565b7f4d696e7420656e64656400000000000000000000000000000000000000000000600082015250565b60006149f5600a83613c0a565b9150614a00826149bf565b602082019050919050565b60006020820190508181036000830152614a24816149e8565b9050919050565b7f4d617820737570706c7920657863656564000000000000000000000000000000600082015250565b6000614a61601183613c0a565b9150614a6c82614a2b565b602082019050919050565b60006020820190508181036000830152614a9081614a54565b9050919050565b7f4163636f756e742042616c616e6365206f6e2043757272656e7420636861696e60008201527f2065786365656473206c696d6974000000000000000000000000000000000000602082015250565b6000614af3602e83613c0a565b9150614afe82614a97565b604082019050919050565b60006020820190508181036000830152614b2281614ae6565b9050919050565b7f4f6e6c79206f776e65722063616c6c2063726f737320636861696e0000000000600082015250565b6000614b5f601b83613c0a565b9150614b6a82614b29565b602082019050919050565b60006020820190508181036000830152614b8e81614b52565b9050919050565b7f496e76616c696420636861696e49640000000000000000000000000000000000600082015250565b6000614bcb600f83613c0a565b9150614bd682614b95565b602082019050919050565b60006020820190508181036000830152614bfa81614bbe565b9050919050565b6000614c0c82613cd6565b9150614c1783613cd6565b925082821015614c2a57614c296146a9565b5b828203905092915050565b6000604082019050614c4a6000830185613d6b565b614c576020830184613e01565b9392505050565b60008160f01b9050919050565b6000614c7682614c5e565b9050919050565b614c8e614c89826138e5565b614c6b565b82525050565b6000819050919050565b614caf614caa82613cd6565b614c94565b82525050565b6000614cc18285614c7d565b600282019150614cd18284614c9e565b6020820191508190509392505050565b600060a082019050614cf6600083018861472e565b614d036020830187613d6b565b8181036040830152614d158186614412565b9050614d246060830185613bd5565b8181036080830152614d368184614412565b90509695505050505050565b60008060408385031215614d5957614d586138db565b5b6000614d6785828601614654565b9250506020614d7885828601614654565b9150509250929050565b7f4d65737361676520466565204e6f7420456e6f75676800000000000000000000600082015250565b6000614db8601683613c0a565b9150614dc382614d82565b602082019050919050565b60006020820190508181036000830152614de781614dab565b9050919050565b60008154614dfb8161449c565b614e058186614401565b94506001821660008114614e205760018114614e3257614e65565b60ff1983168652602086019350614e65565b614e3b856144d9565b60005b83811015614e5d57815481890152600182019150602081019050614e3e565b808801955050505b50505092915050565b614e7781614616565b82525050565b600060c082019050614e92600083018961472e565b8181036020830152614ea48188614dee565b90508181036040830152614eb88187614412565b9050614ec76060830186614e6e565b614ed46080830185613d6b565b81810360a0830152614ee68184614412565b9050979650505050505050565b6000614eff8385614401565b9350614f0c8385846139e6565b614f1583613929565b840190509392505050565b600060a082019050614f35600083018a61472e565b614f426020830189613d6b565b8181036040830152614f55818789614ef3565b9050614f646060830186613bd5565b8181036080830152614f77818486614ef3565b905098975050505050505050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000614fe1603183613c0a565b9150614fec82614f85565b604082019050919050565b6000602082019050818103600083015261501081614fd4565b9050919050565b50565b60006150276000836144ce565b915061503282615017565b600082019050919050565b60006150488261501a565b9150819050919050565b7f4572726f72210000000000000000000000000000000000000000000000000000600082015250565b6000615088600683613c0a565b915061509382615052565b602082019050919050565b600060208201905081810360008301526150b78161507b565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b600061511a602b83613c0a565b9150615125826150be565b604082019050919050565b600060208201905081810360008301526151498161510d565b9050919050565b6000604082019050615165600083018661472e565b8181036020830152615178818486614ef3565b9050949350505050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006151de602c83613c0a565b91506151e982615182565b604082019050919050565b6000602082019050818103600083015261520d816151d1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061529f602983613c0a565b91506152aa82615243565b604082019050919050565b600060208201905081810360008301526152ce81615292565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000615331602a83613c0a565b915061533c826152d5565b604082019050919050565b6000602082019050818103600083015261536081615324565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006153c3602f83613c0a565b91506153ce82615367565b604082019050919050565b600060208201905081810360008301526153f2816153b6565b9050919050565b600081905092915050565b600061540f82613bff565b61541981856153f9565b9350615429818560208601613c1b565b80840191505092915050565b60006154418285615404565b915061544d8284615404565b91508190509392505050565b600060808201905061546e600083018861472e565b61547b602083018761472e565b6154886040830186613e01565b818103606083015261549b818486614ef3565b90509695505050505050565b7f537570706c792065786365656400000000000000000000000000000000000000600082015250565b60006154dd600d83613c0a565b91506154e8826154a7565b602082019050919050565b6000602082019050818103600083015261550c816154d0565b9050919050565b600061551e82613cd6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615551576155506146a9565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006155b8602683613c0a565b91506155c38261555c565b604082019050919050565b600060208201905081810360008301526155e7816155ab565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061564a602c83613c0a565b9150615655826155ee565b604082019050919050565b600060208201905081810360008301526156798161563d565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006156dc602583613c0a565b91506156e782615680565b604082019050919050565b6000602082019050818103600083015261570b816156cf565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061576e602483613c0a565b915061577982615712565b604082019050919050565b6000602082019050818103600083015261579d81615761565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006157da601983613c0a565b91506157e5826157a4565b602082019050919050565b60006020820190508181036000830152615809816157cd565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061586c603283613c0a565b915061587782615810565b604082019050919050565b6000602082019050818103600083015261589b8161585f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006158dc82613cd6565b91506158e783613cd6565b9250826158f7576158f66158a2565b5b828204905092915050565b600061590d82613cd6565b915061591883613cd6565b925082615928576159276158a2565b5b828206905092915050565b60006080820190506159486000830187613d6b565b6159556020830186613d6b565b6159626040830185613e01565b81810360608301526159748184614412565b905095945050505050565b60008151905061598e81613b70565b92915050565b6000602082840312156159aa576159a96138db565b5b60006159b88482850161597f565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006159f7602083613c0a565b9150615a02826159c1565b602082019050919050565b60006020820190508181036000830152615a26816159ea565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615a63601c83613c0a565b9150615a6e82615a2d565b602082019050919050565b60006020820190508181036000830152615a9281615a56565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220f6cc9ca5c2712f5cb4e2523faf30f6830aad1ddf60d4cfa5e16633ed89f0c00b64736f6c63430008090033

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007d000000000000000000000000000000000000000000000000000000000000000c80000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d5061386d4b536b575675527239333447664e67704c42553671654a4670726d39366f706d7256656a3565516a2f00000000000000000000

-----Decoded View---------------
Arg [0] : baseURI_ (string): ipfs://QmPa8mKSkWVuRr934GfNgpLBU6qeJFprm96opmrVej5eQj/
Arg [1] : _endpoint (address): 0x66A71Dcef29A0fFBDBE3c6a460a3B5BC225Cd675
Arg [2] : _startId (uint256): 0
Arg [3] : _total (uint256): 2000
Arg [4] : _currentSupply (uint256): 200

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 00000000000000000000000000000000000000000000000000000000000007d0
Arg [4] : 00000000000000000000000000000000000000000000000000000000000000c8
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [6] : 697066733a2f2f516d5061386d4b536b575675527239333447664e67704c4255
Arg [7] : 3671654a4670726d39366f706d7256656a3565516a2f00000000000000000000


Deployed Bytecode Sourcemap

302:5401:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3113:784;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;989:290:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2623:98:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5243:119:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4256:295:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3794:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5368:125:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1541:375;;;:::i;:::-;;1760:111:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1922:924:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3903:426;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;5133:364:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4616:82:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2852:159;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1358:331:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5563:179:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5499:202:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1943:308:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3017:90:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;603:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2248:313:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4335:155:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1908:283:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1683:101:14;;;;;;;;;;;;;:::i;:::-;;1051:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2785:102:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4618:181;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5808:354;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2953:451;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4996:241:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4496:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4704:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4914:76;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1185:350;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4865:206:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;643:38:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1933:232:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3113:784:1;3299:8;;;;;;;;;;;3277:31;;:10;:31;;;3269:40;;;;;;3356:5;:18;3362:11;3356:18;;;;;;;;;;;;;:25;;;;;:::i;:::-;;;3340:5;:12;:41;:110;;;;;3431:5;:18;3437:11;3431:18;;;;;;;;;;;;;3421:29;;;;;;:::i;:::-;;;;;;;;3411:5;3401:16;;;;;;:49;3340:110;3319:199;;;;;;;;;;;;:::i;:::-;;;;;;;;;3528:12;3598:2;3591:5;3587:14;3581:21;3573:29;;3622:17;3641:15;3684:8;3660:74;;;;;;;;;;;;:::i;:::-;3621:113;;;;3772:29;3782:9;3793:7;3772:9;:29::i;:::-;3822:1;3811:7;;:12;;;;;;;:::i;:::-;;;;;;;;3838:52;3849:11;3862:9;3873:7;3882;;3838:52;;;;;;;;;:::i;:::-;;;;;;;;3259:638;;;3113:784;;;;:::o;989:290:5:-;1131:4;1185:35;1170:50;;;:11;:50;;;;:102;;;;1236:36;1260:11;1236:23;:36::i;:::-;1170:102;1151:121;;989:290;;;:::o;2623:98:4:-;2677:13;2709:5;2702:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2623:98;:::o;5243:119:1:-;1274:12:14;:10;:12::i;:::-;1263:23;;:7;:5;:7::i;:::-;:23;;;1255:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5322:8:1::1;;;;;;;;;;;:23;;;5346:8;5322:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;5243:119:::0;:::o;4256:295:4:-;4372:7;4416:16;4424:7;4416;:16::i;:::-;4395:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;4520:15;:24;4536:7;4520:24;;;;;;;;;;;;;;;;;;;;;4513:31;;4256:295;;;:::o;3794:401::-;3874:13;3890:23;3905:7;3890:14;:23::i;:::-;3874:39;;3937:5;3931:11;;:2;:11;;;;3923:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;4028:5;4012:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;4037:37;4054:5;4061:12;:10;:12::i;:::-;4037:16;:37::i;:::-;4012:62;3991:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;4167:21;4176:2;4180:7;4167:8;:21::i;:::-;3864:331;3794:401;;:::o;5368:125:1:-;1274:12:14;:10;:12::i;:::-;1263:23;;:7;:5;:7::i;:::-;:23;;;1255:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5450:8:1::1;;;;;;;;;;;:26;;;5477:8;5450:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;5368:125:::0;:::o;1541:375::-;1606:13;;1601:1;1592:6;;:10;;;;:::i;:::-;:27;;1584:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;1666:5;;1661:1;1652:6;;:10;;;;:::i;:::-;:19;;1644:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;1749:5;;1725:21;1735:10;1725:9;:21::i;:::-;:29;1703:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;1847:1;1837:6;;:11;;;;;;;:::i;:::-;;;;;;;;1858:29;1868:10;1880:6;;1858:9;:29::i;:::-;1908:1;1897:7;;:12;;;;;;;:::i;:::-;;;;;;;;1541:375::o;1760:111:5:-;1821:7;1847:10;:17;;;;1840:24;;1760:111;:::o;1922:924:1:-;2026:16;2034:7;2026;:16::i;:::-;2012:30;;:10;:30;;;2004:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;2120:1;2092:5;:18;2098:11;2092:18;;;;;;;;;;;;;:25;;;;;:::i;:::-;;;:29;2084:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;2171:14;2177:7;2171:5;:14::i;:::-;2206:1;2195:7;;:12;;;;;;;:::i;:::-;;;;;;;;2217:20;2251:10;2263:7;2240:31;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2217:54;;2282:14;2299:1;2282:18;;2310:26;2356:7;2365:3;;2339:30;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2310:59;;2381:18;2405:8;;;;;;;;;;;:21;;;2440:11;2473:4;2492:7;2513:5;2532:13;2405:150;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2380:175;;;2586:10;2573:9;:23;;2565:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;2634:8;;;;;;;;;;;:13;;;2655:9;2679:11;2704:5;:18;2710:11;2704:18;;;;;;;;;;;;;2736:7;2765:10;2798:3;2816:13;2634:205;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1994:852;;;;1922:924;;:::o;3903:426::-;4078:17;4097:14;4142:8;;;;;;;;;;;:21;;;4181:11;4218:4;4241:8;;4267:9;4294:14;;4142:180;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4123:199;;;;3903:426;;;;;;;;;:::o;5133:364:4:-;5335:41;5354:12;:10;:12::i;:::-;5368:7;5335:18;:41::i;:::-;5314:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;5462:28;5472:4;5478:2;5482:7;5462:9;:28::i;:::-;5133:364;;;:::o;4616:82:1:-;1274:12:14;:10;:12::i;:::-;1263:23;;:7;:5;:7::i;:::-;:23;;;1255:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4685:6:1::1;4677:5;:14;;;;4616:82:::0;:::o;2852:159::-;1274:12:14;:10;:12::i;:::-;1263:23;;:7;:5;:7::i;:::-;:23;;;1255:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2916:9:1::1;2939:7;:5;:7::i;:::-;2931:21;;2960:6;2931:40;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2915:56;;;2989:4;2981:23;;;;;;;;;;;;:::i;:::-;;;;;;;;;2905:106;2852:159:::0;:::o;1358:331:5:-;1495:7;1547:23;1564:5;1547:16;:23::i;:::-;1539:5;:31;1518:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;1656:12;:19;1669:5;1656:19;;;;;;;;;;;;;;;:26;1676:5;1656:26;;;;;;;;;;;;1649:33;;1358:331;;;;:::o;5563:179:4:-;5696:39;5713:4;5719:2;5723:7;5696:39;;;;;;;;;;;;:16;:39::i;:::-;5563:179;;;:::o;5499:202:1:-;1274:12:14;:10;:12::i;:::-;1263:23;;:7;:5;:7::i;:::-;:23;;;1255:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5641:8:1::1;;;;;;;;;;;:27;;;5669:11;5682;;5641:53;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;5499:202:::0;;;:::o;1943:308:5:-;2058:7;2110:30;:28;:30::i;:::-;2102:5;:38;2081:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;2227:10;2238:5;2227:17;;;;;;;;:::i;:::-;;;;;;;;;;2220:24;;1943:308;;;:::o;3017:90:1:-;1274:12:14;:10;:12::i;:::-;1263:23;;:7;:5;:7::i;:::-;:23;;;1255:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3096:4:1::1;3086:7;:14;;;;;;;;;;;;:::i;:::-;;3017:90:::0;:::o;603:34::-;;;;;;;;;;;;;:::o;2248:313:4:-;2360:7;2383:13;2399:7;:16;2407:7;2399:16;;;;;;;;;;;;;;;;;;;;;2383:32;;2463:1;2446:19;;:5;:19;;;;2425:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;2549:5;2542:12;;;2248:313;;;:::o;4335:155:1:-;1274:12:14;:10;:12::i;:::-;1263:23;;:7;:5;:7::i;:::-;:23;;;1255:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4473:10:1::1;;4452:5;:18;4458:11;4452:18;;;;;;;;;;;:31;;;;;;;:::i;:::-;;4335:155:::0;;;:::o;1908:283:4:-;2020:7;2081:1;2064:19;;:5;:19;;;;2043:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;2168:9;:16;2178:5;2168:16;;;;;;;;;;;;;;;;2161:23;;1908:283;;;:::o;1683:101:14:-;1274:12;:10;:12::i;:::-;1263:23;;:7;:5;:7::i;:::-;:23;;;1255:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1747:30:::1;1774:1;1747:18;:30::i;:::-;1683:101::o:0;1051:85::-;1097:7;1123:6;;;;;;;;;;;1116:13;;1051:85;:::o;2785:102:4:-;2841:13;2873:7;2866:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2785:102;:::o;4618:181::-;4740:52;4759:12;:10;:12::i;:::-;4773:8;4783;4740:18;:52::i;:::-;4618:181;;:::o;5808:354::-;5990:41;6009:12;:10;:12::i;:::-;6023:7;5990:18;:41::i;:::-;5969:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;6116:39;6130:4;6136:2;6140:7;6149:5;6116:13;:39::i;:::-;5808:354;;;;:::o;2953:451::-;3066:13;3116:16;3124:7;3116;:16::i;:::-;3095:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;3216:21;3240:10;:8;:10::i;:::-;3216:34;;3303:1;3285:7;3279:21;:25;:118;;;;;;;;;;;;;;;;;3347:7;3356:18;:7;:16;:18::i;:::-;3330:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3279:118;3260:137;;;2953:451;;;:::o;4996:241:1:-;1274:12:14;:10;:12::i;:::-;1263:23;;:7;:5;:7::i;:::-;:23;;;1255:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5170:8:1::1;;;;;;;;;;;:18;;;5189:8;5199;5209:11;5222:7;;5170:60;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;4996:241:::0;;;;;:::o;4496:114::-;1274:12:14;:10;:12::i;:::-;1263:23;;:7;:5;:7::i;:::-;:23;;;1255:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4593:9:1::1;4563:8;;:40;;;;;;;;;;;;;;;;;;4496:114:::0;:::o;4704:100::-;1274:12:14;:10;:12::i;:::-;1263:23;;:7;:5;:7::i;:::-;:23;;;1255:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4790:7:1::1;4774:13;:23;;;;4704:100:::0;:::o;4914:76::-;1274:12:14;:10;:12::i;:::-;1263:23;;:7;:5;:7::i;:::-;:23;;;1255:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4979:4:1::1;4973:3;:10;;;;4914:76:::0;:::o;1185:350::-;1274:12:14;:10;:12::i;:::-;1263:23;;:7;:5;:7::i;:::-;:23;;;1255:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1270:5:1::1;;1265:1;1256:6;;:10;;;;:::i;:::-;:19;;1248:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;1334:13;;1324:6;1315;;:15;;;;:::i;:::-;:32;;1307:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;1380:13;1375:154;1407:6;1399:5;:14;1375:154;;;1448:1;1438:6;;:11;;;;;;;:::i;:::-;;;;;;;;1463:29;1473:10;1485:6;;1463:9;:29::i;:::-;1517:1;1506:7;;:12;;;;;;;:::i;:::-;;;;;;;;1415:7;;;;;:::i;:::-;;;;1375:154;;;;1185:350:::0;:::o;4865:206:4:-;5002:4;5029:18;:25;5048:5;5029:25;;;;;;;;;;;;;;;:35;5055:8;5029:35;;;;;;;;;;;;;;;;;;;;;;;;;5022:42;;4865:206;;;;:::o;643:38:1:-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1933:232:14:-;1274:12;:10;:12::i;:::-;1263:23;;:7;:5;:7::i;:::-;:23;;;1255:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2054:1:::1;2034:22;;:8;:22;;;;2013:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;2130:28;2149:8;2130:18;:28::i;:::-;1933:232:::0;:::o;8719:108:4:-;8794:26;8804:2;8808:7;8794:26;;;;;;;;;;;;:9;:26::i;:::-;8719:108;;:::o;1505:344::-;1647:4;1701:25;1686:40;;;:11;:40;;;;:104;;;;1757:33;1742:48;;;:11;:48;;;;1686:104;:156;;;;1806:36;1830:11;1806:23;:36::i;:::-;1686:156;1667:175;;1505:344;;;:::o;640:96:2:-;693:7;719:10;712:17;;640:96;:::o;7668:125:4:-;7733:4;7784:1;7756:30;;:7;:16;7764:7;7756:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7749:37;;7668:125;;;:::o;11805:171::-;11906:2;11879:15;:24;11895:7;11879:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11961:7;11957:2;11923:46;;11932:23;11947:7;11932:14;:23::i;:::-;11923:46;;;;;;;;;;;;11805:171;;:::o;10325:406::-;10384:13;10400:23;10415:7;10400:14;:23::i;:::-;10384:39;;10434:48;10455:5;10470:1;10474:7;10434:20;:48::i;:::-;10520:29;10537:1;10541:7;10520:8;:29::i;:::-;10580:1;10560:9;:16;10570:5;10560:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;10598:7;:16;10606:7;10598:16;;;;;;;;;;;;10591:23;;;;;;;;;;;10658:7;10654:1;10630:36;;10639:5;10630:36;;;;;;;;;;;;10677:47;10697:5;10712:1;10716:7;10677:19;:47::i;:::-;10374:357;10325:406;:::o;7951:438::-;8076:4;8117:16;8125:7;8117;:16::i;:::-;8096:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;8213:13;8229:23;8244:7;8229:14;:23::i;:::-;8213:39;;8281:5;8270:16;;:7;:16;;;:63;;;;8326:7;8302:31;;:20;8314:7;8302:11;:20::i;:::-;:31;;;8270:63;:111;;;;8349:32;8366:5;8373:7;8349:16;:32::i;:::-;8270:111;8262:120;;;7951:438;;;;:::o;11055:639::-;11222:4;11195:31;;:23;11210:7;11195:14;:23::i;:::-;:31;;;11174:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;11321:1;11307:16;;:2;:16;;;;11299:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;11375:39;11396:4;11402:2;11406:7;11375:20;:39::i;:::-;11476:29;11493:1;11497:7;11476:8;:29::i;:::-;11535:1;11516:9;:15;11526:4;11516:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;11563:1;11546:9;:13;11556:2;11546:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;11593:2;11574:7;:16;11582:7;11574:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;11630:7;11626:2;11611:27;;11620:4;11611:27;;;;;;;;;;;;11649:38;11669:4;11675:2;11679:7;11649:19;:38::i;:::-;11055:639;;;:::o;2319:187:14:-;2392:16;2411:6;;;;;;;;;;;2392:25;;2436:8;2427:6;;:17;;;;;;;;;;;;;;;;;;2490:8;2459:40;;2480:8;2459:40;;;;;;;;;;;;2382:124;2319:187;:::o;12111:307:4:-;12261:8;12252:17;;:5;:17;;;;12244:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;12347:8;12309:18;:25;12328:5;12309:25;;;;;;;;;;;;;;;:35;12335:8;12309:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;12392:8;12370:41;;12385:5;12370:41;;;12402:8;12370:41;;;;;;:::i;:::-;;;;;;;;12111:307;;;:::o;7024:341::-;7175:28;7185:4;7191:2;7195:7;7175:9;:28::i;:::-;7234:48;7257:4;7263:2;7267:7;7276:5;7234:22;:48::i;:::-;7213:145;;;;;;;;;;;;:::i;:::-;;;;;;;;;7024:341;;;;:::o;4810:98:1:-;4862:13;4894:7;4887:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4810:98;:::o;328:703:15:-;384:13;610:1;601:5;:10;597:51;;;627:10;;;;;;;;;;;;;;;;;;;;;597:51;657:12;672:5;657:20;;687:14;711:75;726:1;718:4;:9;711:75;;743:8;;;;;:::i;:::-;;;;773:2;765:10;;;;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;795:39;;844:150;860:1;851:5;:10;844:150;;887:1;877:11;;;;;:::i;:::-;;;953:2;945:5;:10;;;;:::i;:::-;932:2;:24;;;;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;844:150;;;1017:6;1003:21;;;;;328:703;;;;:::o;9048:311:4:-;9173:18;9179:2;9183:7;9173:5;:18::i;:::-;9222:54;9253:1;9257:2;9261:7;9270:5;9222:22;:54::i;:::-;9201:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;9048:311;;;:::o;829:155:3:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;2847:572:5:-;2986:45;3013:4;3019:2;3023:7;2986:26;:45::i;:::-;3062:1;3046:18;;:4;:18;;;3042:183;;;3080:40;3112:7;3080:31;:40::i;:::-;3042:183;;;3149:2;3141:10;;:4;:10;;;3137:88;;3167:47;3200:4;3206:7;3167:32;:47::i;:::-;3137:88;3042:183;3252:1;3238:16;;:2;:16;;;3234:179;;;3270:45;3307:7;3270:36;:45::i;:::-;3234:179;;;3342:4;3336:10;;:2;:10;;;3332:81;;3362:40;3390:2;3394:7;3362:27;:40::i;:::-;3332:81;3234:179;2847:572;;;:::o;14971:121:4:-;;;;:::o;12971:950::-;13121:4;13141:15;:2;:13;;;:15::i;:::-;13137:778;;;13208:2;13192:36;;;13250:12;:10;:12::i;:::-;13284:4;13310:7;13339:5;13192:170;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;13172:691;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13558:1;13541:6;:13;:18;13537:312;;;13583:106;;;;;;;;;;:::i;:::-;;;;;;;;13537:312;13801:6;13795:13;13786:6;13782:2;13778:15;13771:38;13172:691;13434:41;;;13424:51;;;:6;:51;;;;13417:58;;;;;13137:778;13900:4;13893:11;;12971:950;;;;;;;:::o;9681:427::-;9774:1;9760:16;;:2;:16;;;;9752:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9832:16;9840:7;9832;:16::i;:::-;9831:17;9823:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9892:45;9921:1;9925:2;9929:7;9892:20;:45::i;:::-;9965:1;9948:9;:13;9958:2;9948:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9995:2;9976:7;:16;9984:7;9976:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10038:7;10034:2;10013:33;;10030:1;10013:33;;;;;;;;;;;;10057:44;10085:1;10089:2;10093:7;10057:19;:44::i;:::-;9681:427;;:::o;14477:122::-;;;;:::o;4125:161:5:-;4228:10;:17;;;;4201:15;:24;4217:7;4201:24;;;;;;;;;;;:44;;;;4255:10;4271:7;4255:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4125:161;:::o;4903:982::-;5177:22;5227:1;5202:22;5219:4;5202:16;:22::i;:::-;:26;;;;:::i;:::-;5177:51;;5238:18;5259:17;:26;5277:7;5259:26;;;;;;;;;;;;5238:47;;5403:14;5389:10;:28;5385:323;;5433:19;5455:12;:18;5468:4;5455:18;;;;;;;;;;;;;;;:34;5474:14;5455:34;;;;;;;;;;;;5433:56;;5537:11;5504:12;:18;5517:4;5504:18;;;;;;;;;;;;;;;:30;5523:10;5504:30;;;;;;;;;;;:44;;;;5653:10;5620:17;:30;5638:11;5620:30;;;;;;;;;;;:43;;;;5419:289;5385:323;5801:17;:26;5819:7;5801:26;;;;;;;;;;;5794:33;;;5844:12;:18;5857:4;5844:18;;;;;;;;;;;;;;;:34;5863:14;5844:34;;;;;;;;;;;5837:41;;;4996:889;;4903:982;;:::o;6173:1061::-;6422:22;6467:1;6447:10;:17;;;;:21;;;;:::i;:::-;6422:46;;6478:18;6499:15;:24;6515:7;6499:24;;;;;;;;;;;;6478:45;;6845:19;6867:10;6878:14;6867:26;;;;;;;;:::i;:::-;;;;;;;;;;6845:48;;6929:11;6904:10;6915;6904:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;7039:10;7008:15;:28;7024:11;7008:28;;;;;;;;;;;:41;;;;7177:15;:24;7193:7;7177:24;;;;;;;;;;;7170:31;;;7211:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6244:990;;;6173:1061;:::o;3713:217::-;3797:14;3814:20;3831:2;3814:16;:20::i;:::-;3797:37;;3871:7;3844:12;:16;3857:2;3844:16;;;;;;;;;;;;;;;:24;3861:6;3844:24;;;;;;;;;;;:34;;;;3917:6;3888:17;:26;3906:7;3888:26;;;;;;;;;;;:35;;;;3787:143;3713:217;;:::o;1175:320:0:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:16:-;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:89;370:7;410:6;403:5;399:18;388:29;;334:89;;;:::o;429:120::-;501:23;518:5;501:23;:::i;:::-;494:5;491:34;481:62;;539:1;536;529:12;481:62;429:120;:::o;555:137::-;600:5;638:6;625:20;616:29;;654:32;680:5;654:32;:::i;:::-;555:137;;;;:::o;698:117::-;807:1;804;797:12;821:117;930:1;927;920:12;944:102;985:6;1036:2;1032:7;1027:2;1020:5;1016:14;1012:28;1002:38;;944:102;;;:::o;1052:180::-;1100:77;1097:1;1090:88;1197:4;1194:1;1187:15;1221:4;1218:1;1211:15;1238:281;1321:27;1343:4;1321:27;:::i;:::-;1313:6;1309:40;1451:6;1439:10;1436:22;1415:18;1403:10;1400:34;1397:62;1394:88;;;1462:18;;:::i;:::-;1394:88;1502:10;1498:2;1491:22;1281:238;1238:281;;:::o;1525:129::-;1559:6;1586:20;;:::i;:::-;1576:30;;1615:33;1643:4;1635:6;1615:33;:::i;:::-;1525:129;;;:::o;1660:307::-;1721:4;1811:18;1803:6;1800:30;1797:56;;;1833:18;;:::i;:::-;1797:56;1871:29;1893:6;1871:29;:::i;:::-;1863:37;;1955:4;1949;1945:15;1937:23;;1660:307;;;:::o;1973:154::-;2057:6;2052:3;2047;2034:30;2119:1;2110:6;2105:3;2101:16;2094:27;1973:154;;;:::o;2133:410::-;2210:5;2235:65;2251:48;2292:6;2251:48;:::i;:::-;2235:65;:::i;:::-;2226:74;;2323:6;2316:5;2309:21;2361:4;2354:5;2350:16;2399:3;2390:6;2385:3;2381:16;2378:25;2375:112;;;2406:79;;:::i;:::-;2375:112;2496:41;2530:6;2525:3;2520;2496:41;:::i;:::-;2216:327;2133:410;;;;;:::o;2562:338::-;2617:5;2666:3;2659:4;2651:6;2647:17;2643:27;2633:122;;2674:79;;:::i;:::-;2633:122;2791:6;2778:20;2816:78;2890:3;2882:6;2875:4;2867:6;2863:17;2816:78;:::i;:::-;2807:87;;2623:277;2562:338;;;;:::o;2906:101::-;2942:7;2982:18;2975:5;2971:30;2960:41;;2906:101;;;:::o;3013:120::-;3085:23;3102:5;3085:23;:::i;:::-;3078:5;3075:34;3065:62;;3123:1;3120;3113:12;3065:62;3013:120;:::o;3139:137::-;3184:5;3222:6;3209:20;3200:29;;3238:32;3264:5;3238:32;:::i;:::-;3139:137;;;;:::o;3282:1117::-;3384:6;3392;3400;3408;3457:3;3445:9;3436:7;3432:23;3428:33;3425:120;;;3464:79;;:::i;:::-;3425:120;3584:1;3609:52;3653:7;3644:6;3633:9;3629:22;3609:52;:::i;:::-;3599:62;;3555:116;3738:2;3727:9;3723:18;3710:32;3769:18;3761:6;3758:30;3755:117;;;3791:79;;:::i;:::-;3755:117;3896:62;3950:7;3941:6;3930:9;3926:22;3896:62;:::i;:::-;3886:72;;3681:287;4007:2;4033:52;4077:7;4068:6;4057:9;4053:22;4033:52;:::i;:::-;4023:62;;3978:117;4162:2;4151:9;4147:18;4134:32;4193:18;4185:6;4182:30;4179:117;;;4215:79;;:::i;:::-;4179:117;4320:62;4374:7;4365:6;4354:9;4350:22;4320:62;:::i;:::-;4310:72;;4105:287;3282:1117;;;;;;;:::o;4405:149::-;4441:7;4481:66;4474:5;4470:78;4459:89;;4405:149;;;:::o;4560:120::-;4632:23;4649:5;4632:23;:::i;:::-;4625:5;4622:34;4612:62;;4670:1;4667;4660:12;4612:62;4560:120;:::o;4686:137::-;4731:5;4769:6;4756:20;4747:29;;4785:32;4811:5;4785:32;:::i;:::-;4686:137;;;;:::o;4829:327::-;4887:6;4936:2;4924:9;4915:7;4911:23;4907:32;4904:119;;;4942:79;;:::i;:::-;4904:119;5062:1;5087:52;5131:7;5122:6;5111:9;5107:22;5087:52;:::i;:::-;5077:62;;5033:116;4829:327;;;;:::o;5162:90::-;5196:7;5239:5;5232:13;5225:21;5214:32;;5162:90;;;:::o;5258:109::-;5339:21;5354:5;5339:21;:::i;:::-;5334:3;5327:34;5258:109;;:::o;5373:210::-;5460:4;5498:2;5487:9;5483:18;5475:26;;5511:65;5573:1;5562:9;5558:17;5549:6;5511:65;:::i;:::-;5373:210;;;;:::o;5589:99::-;5641:6;5675:5;5669:12;5659:22;;5589:99;;;:::o;5694:169::-;5778:11;5812:6;5807:3;5800:19;5852:4;5847:3;5843:14;5828:29;;5694:169;;;;:::o;5869:307::-;5937:1;5947:113;5961:6;5958:1;5955:13;5947:113;;;6046:1;6041:3;6037:11;6031:18;6027:1;6022:3;6018:11;6011:39;5983:2;5980:1;5976:10;5971:15;;5947:113;;;6078:6;6075:1;6072:13;6069:101;;;6158:1;6149:6;6144:3;6140:16;6133:27;6069:101;5918:258;5869:307;;;:::o;6182:364::-;6270:3;6298:39;6331:5;6298:39;:::i;:::-;6353:71;6417:6;6412:3;6353:71;:::i;:::-;6346:78;;6433:52;6478:6;6473:3;6466:4;6459:5;6455:16;6433:52;:::i;:::-;6510:29;6532:6;6510:29;:::i;:::-;6505:3;6501:39;6494:46;;6274:272;6182:364;;;;:::o;6552:313::-;6665:4;6703:2;6692:9;6688:18;6680:26;;6752:9;6746:4;6742:20;6738:1;6727:9;6723:17;6716:47;6780:78;6853:4;6844:6;6780:78;:::i;:::-;6772:86;;6552:313;;;;:::o;6871:327::-;6929:6;6978:2;6966:9;6957:7;6953:23;6949:32;6946:119;;;6984:79;;:::i;:::-;6946:119;7104:1;7129:52;7173:7;7164:6;7153:9;7149:22;7129:52;:::i;:::-;7119:62;;7075:116;6871:327;;;;:::o;7204:77::-;7241:7;7270:5;7259:16;;7204:77;;;:::o;7287:122::-;7360:24;7378:5;7360:24;:::i;:::-;7353:5;7350:35;7340:63;;7399:1;7396;7389:12;7340:63;7287:122;:::o;7415:139::-;7461:5;7499:6;7486:20;7477:29;;7515:33;7542:5;7515:33;:::i;:::-;7415:139;;;;:::o;7560:329::-;7619:6;7668:2;7656:9;7647:7;7643:23;7639:32;7636:119;;;7674:79;;:::i;:::-;7636:119;7794:1;7819:53;7864:7;7855:6;7844:9;7840:22;7819:53;:::i;:::-;7809:63;;7765:117;7560:329;;;;:::o;7895:126::-;7932:7;7972:42;7965:5;7961:54;7950:65;;7895:126;;;:::o;8027:96::-;8064:7;8093:24;8111:5;8093:24;:::i;:::-;8082:35;;8027:96;;;:::o;8129:118::-;8216:24;8234:5;8216:24;:::i;:::-;8211:3;8204:37;8129:118;;:::o;8253:222::-;8346:4;8384:2;8373:9;8369:18;8361:26;;8397:71;8465:1;8454:9;8450:17;8441:6;8397:71;:::i;:::-;8253:222;;;;:::o;8481:122::-;8554:24;8572:5;8554:24;:::i;:::-;8547:5;8544:35;8534:63;;8593:1;8590;8583:12;8534:63;8481:122;:::o;8609:139::-;8655:5;8693:6;8680:20;8671:29;;8709:33;8736:5;8709:33;:::i;:::-;8609:139;;;;:::o;8754:474::-;8822:6;8830;8879:2;8867:9;8858:7;8854:23;8850:32;8847:119;;;8885:79;;:::i;:::-;8847:119;9005:1;9030:53;9075:7;9066:6;9055:9;9051:22;9030:53;:::i;:::-;9020:63;;8976:117;9132:2;9158:53;9203:7;9194:6;9183:9;9179:22;9158:53;:::i;:::-;9148:63;;9103:118;8754:474;;;;;:::o;9234:118::-;9321:24;9339:5;9321:24;:::i;:::-;9316:3;9309:37;9234:118;;:::o;9358:222::-;9451:4;9489:2;9478:9;9474:18;9466:26;;9502:71;9570:1;9559:9;9555:17;9546:6;9502:71;:::i;:::-;9358:222;;;;:::o;9586:472::-;9653:6;9661;9710:2;9698:9;9689:7;9685:23;9681:32;9678:119;;;9716:79;;:::i;:::-;9678:119;9836:1;9861:52;9905:7;9896:6;9885:9;9881:22;9861:52;:::i;:::-;9851:62;;9807:116;9962:2;9988:53;10033:7;10024:6;10013:9;10009:22;9988:53;:::i;:::-;9978:63;;9933:118;9586:472;;;;;:::o;10064:117::-;10173:1;10170;10163:12;10187:117;10296:1;10293;10286:12;10323:552;10380:8;10390:6;10440:3;10433:4;10425:6;10421:17;10417:27;10407:122;;10448:79;;:::i;:::-;10407:122;10561:6;10548:20;10538:30;;10591:18;10583:6;10580:30;10577:117;;;10613:79;;:::i;:::-;10577:117;10727:4;10719:6;10715:17;10703:29;;10781:3;10773:4;10765:6;10761:17;10751:8;10747:32;10744:41;10741:128;;;10788:79;;:::i;:::-;10741:128;10323:552;;;;;:::o;10881:116::-;10951:21;10966:5;10951:21;:::i;:::-;10944:5;10941:32;10931:60;;10987:1;10984;10977:12;10931:60;10881:116;:::o;11003:133::-;11046:5;11084:6;11071:20;11062:29;;11100:30;11124:5;11100:30;:::i;:::-;11003:133;;;;:::o;11142:1153::-;11246:6;11254;11262;11270;11278;11286;11335:3;11323:9;11314:7;11310:23;11306:33;11303:120;;;11342:79;;:::i;:::-;11303:120;11462:1;11487:52;11531:7;11522:6;11511:9;11507:22;11487:52;:::i;:::-;11477:62;;11433:116;11616:2;11605:9;11601:18;11588:32;11647:18;11639:6;11636:30;11633:117;;;11669:79;;:::i;:::-;11633:117;11782:64;11838:7;11829:6;11818:9;11814:22;11782:64;:::i;:::-;11764:82;;;;11559:297;11895:2;11921:50;11963:7;11954:6;11943:9;11939:22;11921:50;:::i;:::-;11911:60;;11866:115;12048:2;12037:9;12033:18;12020:32;12079:18;12071:6;12068:30;12065:117;;;12101:79;;:::i;:::-;12065:117;12214:64;12270:7;12261:6;12250:9;12246:22;12214:64;:::i;:::-;12196:82;;;;11991:297;11142:1153;;;;;;;;:::o;12301:332::-;12422:4;12460:2;12449:9;12445:18;12437:26;;12473:71;12541:1;12530:9;12526:17;12517:6;12473:71;:::i;:::-;12554:72;12622:2;12611:9;12607:18;12598:6;12554:72;:::i;:::-;12301:332;;;;;:::o;12639:619::-;12716:6;12724;12732;12781:2;12769:9;12760:7;12756:23;12752:32;12749:119;;;12787:79;;:::i;:::-;12749:119;12907:1;12932:53;12977:7;12968:6;12957:9;12953:22;12932:53;:::i;:::-;12922:63;;12878:117;13034:2;13060:53;13105:7;13096:6;13085:9;13081:22;13060:53;:::i;:::-;13050:63;;13005:118;13162:2;13188:53;13233:7;13224:6;13213:9;13209:22;13188:53;:::i;:::-;13178:63;;13133:118;12639:619;;;;;:::o;13264:670::-;13342:6;13350;13358;13407:2;13395:9;13386:7;13382:23;13378:32;13375:119;;;13413:79;;:::i;:::-;13375:119;13533:1;13558:52;13602:7;13593:6;13582:9;13578:22;13558:52;:::i;:::-;13548:62;;13504:116;13687:2;13676:9;13672:18;13659:32;13718:18;13710:6;13707:30;13704:117;;;13740:79;;:::i;:::-;13704:117;13853:64;13909:7;13900:6;13889:9;13885:22;13853:64;:::i;:::-;13835:82;;;;13630:297;13264:670;;;;;:::o;13940:308::-;14002:4;14092:18;14084:6;14081:30;14078:56;;;14114:18;;:::i;:::-;14078:56;14152:29;14174:6;14152:29;:::i;:::-;14144:37;;14236:4;14230;14226:15;14218:23;;13940:308;;;:::o;14254:412::-;14332:5;14357:66;14373:49;14415:6;14373:49;:::i;:::-;14357:66;:::i;:::-;14348:75;;14446:6;14439:5;14432:21;14484:4;14477:5;14473:16;14522:3;14513:6;14508:3;14504:16;14501:25;14498:112;;;14529:79;;:::i;:::-;14498:112;14619:41;14653:6;14648:3;14643;14619:41;:::i;:::-;14338:328;14254:412;;;;;:::o;14686:340::-;14742:5;14791:3;14784:4;14776:6;14772:17;14768:27;14758:122;;14799:79;;:::i;:::-;14758:122;14916:6;14903:20;14941:79;15016:3;15008:6;15001:4;14993:6;14989:17;14941:79;:::i;:::-;14932:88;;14748:278;14686:340;;;;:::o;15032:509::-;15101:6;15150:2;15138:9;15129:7;15125:23;15121:32;15118:119;;;15156:79;;:::i;:::-;15118:119;15304:1;15293:9;15289:17;15276:31;15334:18;15326:6;15323:30;15320:117;;;15356:79;;:::i;:::-;15320:117;15461:63;15516:7;15507:6;15496:9;15492:22;15461:63;:::i;:::-;15451:73;;15247:287;15032:509;;;;:::o;15547:60::-;15575:3;15596:5;15589:12;;15547:60;;;:::o;15613:142::-;15663:9;15696:53;15714:34;15723:24;15741:5;15723:24;:::i;:::-;15714:34;:::i;:::-;15696:53;:::i;:::-;15683:66;;15613:142;;;:::o;15761:126::-;15811:9;15844:37;15875:5;15844:37;:::i;:::-;15831:50;;15761:126;;;:::o;15893:153::-;15970:9;16003:37;16034:5;16003:37;:::i;:::-;15990:50;;15893:153;;;:::o;16052:185::-;16166:64;16224:5;16166:64;:::i;:::-;16161:3;16154:77;16052:185;;:::o;16243:276::-;16363:4;16401:2;16390:9;16386:18;16378:26;;16414:98;16509:1;16498:9;16494:17;16485:6;16414:98;:::i;:::-;16243:276;;;;:::o;16525:672::-;16604:6;16612;16620;16669:2;16657:9;16648:7;16644:23;16640:32;16637:119;;;16675:79;;:::i;:::-;16637:119;16795:1;16820:53;16865:7;16856:6;16845:9;16841:22;16820:53;:::i;:::-;16810:63;;16766:117;16950:2;16939:9;16935:18;16922:32;16981:18;16973:6;16970:30;16967:117;;;17003:79;;:::i;:::-;16967:117;17116:64;17172:7;17163:6;17152:9;17148:22;17116:64;:::i;:::-;17098:82;;;;16893:297;16525:672;;;;;:::o;17203:329::-;17262:6;17311:2;17299:9;17290:7;17286:23;17282:32;17279:119;;;17317:79;;:::i;:::-;17279:119;17437:1;17462:53;17507:7;17498:6;17487:9;17483:22;17462:53;:::i;:::-;17452:63;;17408:117;17203:329;;;;:::o;17538:468::-;17603:6;17611;17660:2;17648:9;17639:7;17635:23;17631:32;17628:119;;;17666:79;;:::i;:::-;17628:119;17786:1;17811:53;17856:7;17847:6;17836:9;17832:22;17811:53;:::i;:::-;17801:63;;17757:117;17913:2;17939:50;17981:7;17972:6;17961:9;17957:22;17939:50;:::i;:::-;17929:60;;17884:115;17538:468;;;;;:::o;18012:943::-;18107:6;18115;18123;18131;18180:3;18168:9;18159:7;18155:23;18151:33;18148:120;;;18187:79;;:::i;:::-;18148:120;18307:1;18332:53;18377:7;18368:6;18357:9;18353:22;18332:53;:::i;:::-;18322:63;;18278:117;18434:2;18460:53;18505:7;18496:6;18485:9;18481:22;18460:53;:::i;:::-;18450:63;;18405:118;18562:2;18588:53;18633:7;18624:6;18613:9;18609:22;18588:53;:::i;:::-;18578:63;;18533:118;18718:2;18707:9;18703:18;18690:32;18749:18;18741:6;18738:30;18735:117;;;18771:79;;:::i;:::-;18735:117;18876:62;18930:7;18921:6;18910:9;18906:22;18876:62;:::i;:::-;18866:72;;18661:287;18012:943;;;;;;;:::o;18961:959::-;19056:6;19064;19072;19080;19088;19137:3;19125:9;19116:7;19112:23;19108:33;19105:120;;;19144:79;;:::i;:::-;19105:120;19264:1;19289:52;19333:7;19324:6;19313:9;19309:22;19289:52;:::i;:::-;19279:62;;19235:116;19390:2;19416:52;19460:7;19451:6;19440:9;19436:22;19416:52;:::i;:::-;19406:62;;19361:117;19517:2;19543:53;19588:7;19579:6;19568:9;19564:22;19543:53;:::i;:::-;19533:63;;19488:118;19673:2;19662:9;19658:18;19645:32;19704:18;19696:6;19693:30;19690:117;;;19726:79;;:::i;:::-;19690:117;19839:64;19895:7;19886:6;19875:9;19871:22;19839:64;:::i;:::-;19821:82;;;;19616:297;18961:959;;;;;;;;:::o;19926:474::-;19994:6;20002;20051:2;20039:9;20030:7;20026:23;20022:32;20019:119;;;20057:79;;:::i;:::-;20019:119;20177:1;20202:53;20247:7;20238:6;20227:9;20223:22;20202:53;:::i;:::-;20192:63;;20148:117;20304:2;20330:53;20375:7;20366:6;20355:9;20351:22;20330:53;:::i;:::-;20320:63;;20275:118;19926:474;;;;;:::o;20406:98::-;20457:6;20491:5;20485:12;20475:22;;20406:98;;;:::o;20510:168::-;20593:11;20627:6;20622:3;20615:19;20667:4;20662:3;20658:14;20643:29;;20510:168;;;;:::o;20684:360::-;20770:3;20798:38;20830:5;20798:38;:::i;:::-;20852:70;20915:6;20910:3;20852:70;:::i;:::-;20845:77;;20931:52;20976:6;20971:3;20964:4;20957:5;20953:16;20931:52;:::i;:::-;21008:29;21030:6;21008:29;:::i;:::-;21003:3;20999:39;20992:46;;20774:270;20684:360;;;;:::o;21050:309::-;21161:4;21199:2;21188:9;21184:18;21176:26;;21248:9;21242:4;21238:20;21234:1;21223:9;21219:17;21212:47;21276:76;21347:4;21338:6;21276:76;:::i;:::-;21268:84;;21050:309;;;;:::o;21365:180::-;21413:77;21410:1;21403:88;21510:4;21507:1;21500:15;21534:4;21531:1;21524:15;21551:320;21595:6;21632:1;21626:4;21622:12;21612:22;;21679:1;21673:4;21669:12;21700:18;21690:81;;21756:4;21748:6;21744:17;21734:27;;21690:81;21818:2;21810:6;21807:14;21787:18;21784:38;21781:84;;;21837:18;;:::i;:::-;21781:84;21602:269;21551:320;;;:::o;21877:147::-;21978:11;22015:3;22000:18;;21877:147;;;;:::o;22030:140::-;22078:4;22101:3;22093:11;;22124:3;22121:1;22114:14;22158:4;22155:1;22145:18;22137:26;;22030:140;;;:::o;22198:841::-;22299:3;22336:5;22330:12;22365:36;22391:9;22365:36;:::i;:::-;22417:88;22498:6;22493:3;22417:88;:::i;:::-;22410:95;;22536:1;22525:9;22521:17;22552:1;22547:137;;;;22698:1;22693:340;;;;22514:519;;22547:137;22631:4;22627:9;22616;22612:25;22607:3;22600:38;22667:6;22662:3;22658:16;22651:23;;22547:137;;22693:340;22760:37;22791:5;22760:37;:::i;:::-;22819:1;22833:154;22847:6;22844:1;22841:13;22833:154;;;22921:7;22915:14;22911:1;22906:3;22902:11;22895:35;22971:1;22962:7;22958:15;22947:26;;22869:4;22866:1;22862:12;22857:17;;22833:154;;;23016:6;23011:3;23007:16;23000:23;;22700:333;;22514:519;;22303:736;;22198:841;;;;:::o;23045:265::-;23172:3;23194:90;23280:3;23271:6;23194:90;:::i;:::-;23187:97;;23301:3;23294:10;;23045:265;;;;:::o;23316:229::-;23456:34;23452:1;23444:6;23440:14;23433:58;23525:12;23520:2;23512:6;23508:15;23501:37;23316:229;:::o;23551:366::-;23693:3;23714:67;23778:2;23773:3;23714:67;:::i;:::-;23707:74;;23790:93;23879:3;23790:93;:::i;:::-;23908:2;23903:3;23899:12;23892:19;;23551:366;;;:::o;23923:419::-;24089:4;24127:2;24116:9;24112:18;24104:26;;24176:9;24170:4;24166:20;24162:1;24151:9;24147:17;24140:47;24204:131;24330:4;24204:131;:::i;:::-;24196:139;;23923:419;;;:::o;24348:104::-;24393:7;24422:24;24440:5;24422:24;:::i;:::-;24411:35;;24348:104;;;:::o;24458:138::-;24539:32;24565:5;24539:32;:::i;:::-;24532:5;24529:43;24519:71;;24586:1;24583;24576:12;24519:71;24458:138;:::o;24602:159::-;24667:5;24698:6;24692:13;24683:22;;24714:41;24749:5;24714:41;:::i;:::-;24602:159;;;;:::o;24767:143::-;24824:5;24855:6;24849:13;24840:22;;24871:33;24898:5;24871:33;:::i;:::-;24767:143;;;;:::o;24916:523::-;25003:6;25011;25060:2;25048:9;25039:7;25035:23;25031:32;25028:119;;;25066:79;;:::i;:::-;25028:119;25186:1;25211:72;25275:7;25266:6;25255:9;25251:22;25211:72;:::i;:::-;25201:82;;25157:136;25332:2;25358:64;25414:7;25405:6;25394:9;25390:22;25358:64;:::i;:::-;25348:74;;25303:129;24916:523;;;;;:::o;25445:180::-;25493:77;25490:1;25483:88;25590:4;25587:1;25580:15;25614:4;25611:1;25604:15;25631:305;25671:3;25690:20;25708:1;25690:20;:::i;:::-;25685:25;;25724:20;25742:1;25724:20;:::i;:::-;25719:25;;25878:1;25810:66;25806:74;25803:1;25800:81;25797:107;;;25884:18;;:::i;:::-;25797:107;25928:1;25925;25921:9;25914:16;;25631:305;;;;:::o;25942:115::-;26027:23;26044:5;26027:23;:::i;:::-;26022:3;26015:36;25942:115;;:::o;26063:549::-;26238:4;26276:3;26265:9;26261:19;26253:27;;26290:69;26356:1;26345:9;26341:17;26332:6;26290:69;:::i;:::-;26369:72;26437:2;26426:9;26422:18;26413:6;26369:72;:::i;:::-;26451;26519:2;26508:9;26504:18;26495:6;26451:72;:::i;:::-;26533;26601:2;26590:9;26586:18;26577:6;26533:72;:::i;:::-;26063:549;;;;;;;:::o;26618:182::-;26758:34;26754:1;26746:6;26742:14;26735:58;26618:182;:::o;26806:366::-;26948:3;26969:67;27033:2;27028:3;26969:67;:::i;:::-;26962:74;;27045:93;27134:3;27045:93;:::i;:::-;27163:2;27158:3;27154:12;27147:19;;26806:366;;;:::o;27178:419::-;27344:4;27382:2;27371:9;27367:18;27359:26;;27431:9;27425:4;27421:20;27417:1;27406:9;27402:17;27395:47;27459:131;27585:4;27459:131;:::i;:::-;27451:139;;27178:419;;;:::o;27603:218::-;27694:4;27732:2;27721:9;27717:18;27709:26;;27745:69;27811:1;27800:9;27796:17;27787:6;27745:69;:::i;:::-;27603:218;;;;:::o;27827:231::-;27967:34;27963:1;27955:6;27951:14;27944:58;28036:14;28031:2;28023:6;28019:15;28012:39;27827:231;:::o;28064:366::-;28206:3;28227:67;28291:2;28286:3;28227:67;:::i;:::-;28220:74;;28303:93;28392:3;28303:93;:::i;:::-;28421:2;28416:3;28412:12;28405:19;;28064:366;;;:::o;28436:419::-;28602:4;28640:2;28629:9;28625:18;28617:26;;28689:9;28683:4;28679:20;28675:1;28664:9;28660:17;28653:47;28717:131;28843:4;28717:131;:::i;:::-;28709:139;;28436:419;;;:::o;28861:220::-;29001:34;28997:1;28989:6;28985:14;28978:58;29070:3;29065:2;29057:6;29053:15;29046:28;28861:220;:::o;29087:366::-;29229:3;29250:67;29314:2;29309:3;29250:67;:::i;:::-;29243:74;;29326:93;29415:3;29326:93;:::i;:::-;29444:2;29439:3;29435:12;29428:19;;29087:366;;;:::o;29459:419::-;29625:4;29663:2;29652:9;29648:18;29640:26;;29712:9;29706:4;29702:20;29698:1;29687:9;29683:17;29676:47;29740:131;29866:4;29740:131;:::i;:::-;29732:139;;29459:419;;;:::o;29884:243::-;30024:34;30020:1;30012:6;30008:14;30001:58;30093:26;30088:2;30080:6;30076:15;30069:51;29884:243;:::o;30133:366::-;30275:3;30296:67;30360:2;30355:3;30296:67;:::i;:::-;30289:74;;30372:93;30461:3;30372:93;:::i;:::-;30490:2;30485:3;30481:12;30474:19;;30133:366;;;:::o;30505:419::-;30671:4;30709:2;30698:9;30694:18;30686:26;;30758:9;30752:4;30748:20;30744:1;30733:9;30729:17;30722:47;30786:131;30912:4;30786:131;:::i;:::-;30778:139;;30505:419;;;:::o;30930:160::-;31070:12;31066:1;31058:6;31054:14;31047:36;30930:160;:::o;31096:366::-;31238:3;31259:67;31323:2;31318:3;31259:67;:::i;:::-;31252:74;;31335:93;31424:3;31335:93;:::i;:::-;31453:2;31448:3;31444:12;31437:19;;31096:366;;;:::o;31468:419::-;31634:4;31672:2;31661:9;31657:18;31649:26;;31721:9;31715:4;31711:20;31707:1;31696:9;31692:17;31685:47;31749:131;31875:4;31749:131;:::i;:::-;31741:139;;31468:419;;;:::o;31893:167::-;32033:19;32029:1;32021:6;32017:14;32010:43;31893:167;:::o;32066:366::-;32208:3;32229:67;32293:2;32288:3;32229:67;:::i;:::-;32222:74;;32305:93;32394:3;32305:93;:::i;:::-;32423:2;32418:3;32414:12;32407:19;;32066:366;;;:::o;32438:419::-;32604:4;32642:2;32631:9;32627:18;32619:26;;32691:9;32685:4;32681:20;32677:1;32666:9;32662:17;32655:47;32719:131;32845:4;32719:131;:::i;:::-;32711:139;;32438:419;;;:::o;32863:233::-;33003:34;32999:1;32991:6;32987:14;32980:58;33072:16;33067:2;33059:6;33055:15;33048:41;32863:233;:::o;33102:366::-;33244:3;33265:67;33329:2;33324:3;33265:67;:::i;:::-;33258:74;;33341:93;33430:3;33341:93;:::i;:::-;33459:2;33454:3;33450:12;33443:19;;33102:366;;;:::o;33474:419::-;33640:4;33678:2;33667:9;33663:18;33655:26;;33727:9;33721:4;33717:20;33713:1;33702:9;33698:17;33691:47;33755:131;33881:4;33755:131;:::i;:::-;33747:139;;33474:419;;;:::o;33899:177::-;34039:29;34035:1;34027:6;34023:14;34016:53;33899:177;:::o;34082:366::-;34224:3;34245:67;34309:2;34304:3;34245:67;:::i;:::-;34238:74;;34321:93;34410:3;34321:93;:::i;:::-;34439:2;34434:3;34430:12;34423:19;;34082:366;;;:::o;34454:419::-;34620:4;34658:2;34647:9;34643:18;34635:26;;34707:9;34701:4;34697:20;34693:1;34682:9;34678:17;34671:47;34735:131;34861:4;34735:131;:::i;:::-;34727:139;;34454:419;;;:::o;34879:165::-;35019:17;35015:1;35007:6;35003:14;34996:41;34879:165;:::o;35050:366::-;35192:3;35213:67;35277:2;35272:3;35213:67;:::i;:::-;35206:74;;35289:93;35378:3;35289:93;:::i;:::-;35407:2;35402:3;35398:12;35391:19;;35050:366;;;:::o;35422:419::-;35588:4;35626:2;35615:9;35611:18;35603:26;;35675:9;35669:4;35665:20;35661:1;35650:9;35646:17;35639:47;35703:131;35829:4;35703:131;:::i;:::-;35695:139;;35422:419;;;:::o;35847:191::-;35887:4;35907:20;35925:1;35907:20;:::i;:::-;35902:25;;35941:20;35959:1;35941:20;:::i;:::-;35936:25;;35980:1;35977;35974:8;35971:34;;;35985:18;;:::i;:::-;35971:34;36030:1;36027;36023:9;36015:17;;35847:191;;;;:::o;36044:332::-;36165:4;36203:2;36192:9;36188:18;36180:26;;36216:71;36284:1;36273:9;36269:17;36260:6;36216:71;:::i;:::-;36297:72;36365:2;36354:9;36350:18;36341:6;36297:72;:::i;:::-;36044:332;;;;;:::o;36382:96::-;36416:8;36465:5;36460:3;36456:15;36435:36;;36382:96;;;:::o;36484:94::-;36522:7;36551:21;36566:5;36551:21;:::i;:::-;36540:32;;36484:94;;;:::o;36584:153::-;36687:43;36706:23;36723:5;36706:23;:::i;:::-;36687:43;:::i;:::-;36682:3;36675:56;36584:153;;:::o;36743:79::-;36782:7;36811:5;36800:16;;36743:79;;;:::o;36828:157::-;36933:45;36953:24;36971:5;36953:24;:::i;:::-;36933:45;:::i;:::-;36928:3;36921:58;36828:157;;:::o;36991:392::-;37129:3;37144:73;37213:3;37204:6;37144:73;:::i;:::-;37242:1;37237:3;37233:11;37226:18;;37254:75;37325:3;37316:6;37254:75;:::i;:::-;37354:2;37349:3;37345:12;37338:19;;37374:3;37367:10;;36991:392;;;;;:::o;37389:822::-;37622:4;37660:3;37649:9;37645:19;37637:27;;37674:69;37740:1;37729:9;37725:17;37716:6;37674:69;:::i;:::-;37753:72;37821:2;37810:9;37806:18;37797:6;37753:72;:::i;:::-;37872:9;37866:4;37862:20;37857:2;37846:9;37842:18;37835:48;37900:76;37971:4;37962:6;37900:76;:::i;:::-;37892:84;;37986:66;38048:2;38037:9;38033:18;38024:6;37986:66;:::i;:::-;38100:9;38094:4;38090:20;38084:3;38073:9;38069:19;38062:49;38128:76;38199:4;38190:6;38128:76;:::i;:::-;38120:84;;37389:822;;;;;;;;:::o;38217:507::-;38296:6;38304;38353:2;38341:9;38332:7;38328:23;38324:32;38321:119;;;38359:79;;:::i;:::-;38321:119;38479:1;38504:64;38560:7;38551:6;38540:9;38536:22;38504:64;:::i;:::-;38494:74;;38450:128;38617:2;38643:64;38699:7;38690:6;38679:9;38675:22;38643:64;:::i;:::-;38633:74;;38588:129;38217:507;;;;;:::o;38730:172::-;38870:24;38866:1;38858:6;38854:14;38847:48;38730:172;:::o;38908:366::-;39050:3;39071:67;39135:2;39130:3;39071:67;:::i;:::-;39064:74;;39147:93;39236:3;39147:93;:::i;:::-;39265:2;39260:3;39256:12;39249:19;;38908:366;;;:::o;39280:419::-;39446:4;39484:2;39473:9;39469:18;39461:26;;39533:9;39527:4;39523:20;39519:1;39508:9;39504:17;39497:47;39561:131;39687:4;39561:131;:::i;:::-;39553:139;;39280:419;;;:::o;39727:798::-;39810:3;39847:5;39841:12;39876:36;39902:9;39876:36;:::i;:::-;39928:70;39991:6;39986:3;39928:70;:::i;:::-;39921:77;;40029:1;40018:9;40014:17;40045:1;40040:135;;;;40189:1;40184:335;;;;40007:512;;40040:135;40124:4;40120:9;40109;40105:25;40100:3;40093:38;40160:4;40155:3;40151:14;40144:21;;40040:135;;40184:335;40251:37;40282:5;40251:37;:::i;:::-;40310:1;40324:154;40338:6;40335:1;40332:13;40324:154;;;40412:7;40406:14;40402:1;40397:3;40393:11;40386:35;40462:1;40453:7;40449:15;40438:26;;40360:4;40357:1;40353:12;40348:17;;40324:154;;;40507:1;40502:3;40498:11;40491:18;;40191:328;;40007:512;;39814:711;;39727:798;;;;:::o;40531:142::-;40634:32;40660:5;40634:32;:::i;:::-;40629:3;40622:45;40531:142;;:::o;40679:1058::-;40977:4;41015:3;41004:9;41000:19;40992:27;;41029:69;41095:1;41084:9;41080:17;41071:6;41029:69;:::i;:::-;41145:9;41139:4;41135:20;41130:2;41119:9;41115:18;41108:48;41173:73;41241:4;41232:6;41173:73;:::i;:::-;41165:81;;41293:9;41287:4;41283:20;41278:2;41267:9;41263:18;41256:48;41321:76;41392:4;41383:6;41321:76;:::i;:::-;41313:84;;41407:88;41491:2;41480:9;41476:18;41467:6;41407:88;:::i;:::-;41505:73;41573:3;41562:9;41558:19;41549:6;41505:73;:::i;:::-;41626:9;41620:4;41616:20;41610:3;41599:9;41595:19;41588:49;41654:76;41725:4;41716:6;41654:76;:::i;:::-;41646:84;;40679:1058;;;;;;;;;:::o;41765:301::-;41861:3;41882:70;41945:6;41940:3;41882:70;:::i;:::-;41875:77;;41962:43;41998:6;41993:3;41986:5;41962:43;:::i;:::-;42030:29;42052:6;42030:29;:::i;:::-;42025:3;42021:39;42014:46;;41765:301;;;;;:::o;42072:862::-;42325:4;42363:3;42352:9;42348:19;42340:27;;42377:69;42443:1;42432:9;42428:17;42419:6;42377:69;:::i;:::-;42456:72;42524:2;42513:9;42509:18;42500:6;42456:72;:::i;:::-;42575:9;42569:4;42565:20;42560:2;42549:9;42545:18;42538:48;42603:86;42684:4;42675:6;42667;42603:86;:::i;:::-;42595:94;;42699:66;42761:2;42750:9;42746:18;42737:6;42699:66;:::i;:::-;42813:9;42807:4;42803:20;42797:3;42786:9;42782:19;42775:49;42841:86;42922:4;42913:6;42905;42841:86;:::i;:::-;42833:94;;42072:862;;;;;;;;;;:::o;42940:236::-;43080:34;43076:1;43068:6;43064:14;43057:58;43149:19;43144:2;43136:6;43132:15;43125:44;42940:236;:::o;43182:366::-;43324:3;43345:67;43409:2;43404:3;43345:67;:::i;:::-;43338:74;;43421:93;43510:3;43421:93;:::i;:::-;43539:2;43534:3;43530:12;43523:19;;43182:366;;;:::o;43554:419::-;43720:4;43758:2;43747:9;43743:18;43735:26;;43807:9;43801:4;43797:20;43793:1;43782:9;43778:17;43771:47;43835:131;43961:4;43835:131;:::i;:::-;43827:139;;43554:419;;;:::o;43979:114::-;;:::o;44099:398::-;44258:3;44279:83;44360:1;44355:3;44279:83;:::i;:::-;44272:90;;44371:93;44460:3;44371:93;:::i;:::-;44489:1;44484:3;44480:11;44473:18;;44099:398;;;:::o;44503:379::-;44687:3;44709:147;44852:3;44709:147;:::i;:::-;44702:154;;44873:3;44866:10;;44503:379;;;:::o;44888:156::-;45028:8;45024:1;45016:6;45012:14;45005:32;44888:156;:::o;45050:365::-;45192:3;45213:66;45277:1;45272:3;45213:66;:::i;:::-;45206:73;;45288:93;45377:3;45288:93;:::i;:::-;45406:2;45401:3;45397:12;45390:19;;45050:365;;;:::o;45421:419::-;45587:4;45625:2;45614:9;45610:18;45602:26;;45674:9;45668:4;45664:20;45660:1;45649:9;45645:17;45638:47;45702:131;45828:4;45702:131;:::i;:::-;45694:139;;45421:419;;;:::o;45846:230::-;45986:34;45982:1;45974:6;45970:14;45963:58;46055:13;46050:2;46042:6;46038:15;46031:38;45846:230;:::o;46082:366::-;46224:3;46245:67;46309:2;46304:3;46245:67;:::i;:::-;46238:74;;46321:93;46410:3;46321:93;:::i;:::-;46439:2;46434:3;46430:12;46423:19;;46082:366;;;:::o;46454:419::-;46620:4;46658:2;46647:9;46643:18;46635:26;;46707:9;46701:4;46697:20;46693:1;46682:9;46678:17;46671:47;46735:131;46861:4;46735:131;:::i;:::-;46727:139;;46454:419;;;:::o;46879:435::-;47026:4;47064:2;47053:9;47049:18;47041:26;;47077:69;47143:1;47132:9;47128:17;47119:6;47077:69;:::i;:::-;47193:9;47187:4;47183:20;47178:2;47167:9;47163:18;47156:48;47221:86;47302:4;47293:6;47285;47221:86;:::i;:::-;47213:94;;46879:435;;;;;;:::o;47320:231::-;47460:34;47456:1;47448:6;47444:14;47437:58;47529:14;47524:2;47516:6;47512:15;47505:39;47320:231;:::o;47557:366::-;47699:3;47720:67;47784:2;47779:3;47720:67;:::i;:::-;47713:74;;47796:93;47885:3;47796:93;:::i;:::-;47914:2;47909:3;47905:12;47898:19;;47557:366;;;:::o;47929:419::-;48095:4;48133:2;48122:9;48118:18;48110:26;;48182:9;48176:4;48172:20;48168:1;48157:9;48153:17;48146:47;48210:131;48336:4;48210:131;:::i;:::-;48202:139;;47929:419;;;:::o;48354:180::-;48402:77;48399:1;48392:88;48499:4;48496:1;48489:15;48523:4;48520:1;48513:15;48540:228;48680:34;48676:1;48668:6;48664:14;48657:58;48749:11;48744:2;48736:6;48732:15;48725:36;48540:228;:::o;48774:366::-;48916:3;48937:67;49001:2;48996:3;48937:67;:::i;:::-;48930:74;;49013:93;49102:3;49013:93;:::i;:::-;49131:2;49126:3;49122:12;49115:19;;48774:366;;;:::o;49146:419::-;49312:4;49350:2;49339:9;49335:18;49327:26;;49399:9;49393:4;49389:20;49385:1;49374:9;49370:17;49363:47;49427:131;49553:4;49427:131;:::i;:::-;49419:139;;49146:419;;;:::o;49571:229::-;49711:34;49707:1;49699:6;49695:14;49688:58;49780:12;49775:2;49767:6;49763:15;49756:37;49571:229;:::o;49806:366::-;49948:3;49969:67;50033:2;50028:3;49969:67;:::i;:::-;49962:74;;50045:93;50134:3;50045:93;:::i;:::-;50163:2;50158:3;50154:12;50147:19;;49806:366;;;:::o;50178:419::-;50344:4;50382:2;50371:9;50367:18;50359:26;;50431:9;50425:4;50421:20;50417:1;50406:9;50402:17;50395:47;50459:131;50585:4;50459:131;:::i;:::-;50451:139;;50178:419;;;:::o;50603:234::-;50743:34;50739:1;50731:6;50727:14;50720:58;50812:17;50807:2;50799:6;50795:15;50788:42;50603:234;:::o;50843:366::-;50985:3;51006:67;51070:2;51065:3;51006:67;:::i;:::-;50999:74;;51082:93;51171:3;51082:93;:::i;:::-;51200:2;51195:3;51191:12;51184:19;;50843:366;;;:::o;51215:419::-;51381:4;51419:2;51408:9;51404:18;51396:26;;51468:9;51462:4;51458:20;51454:1;51443:9;51439:17;51432:47;51496:131;51622:4;51496:131;:::i;:::-;51488:139;;51215:419;;;:::o;51640:148::-;51742:11;51779:3;51764:18;;51640:148;;;;:::o;51794:377::-;51900:3;51928:39;51961:5;51928:39;:::i;:::-;51983:89;52065:6;52060:3;51983:89;:::i;:::-;51976:96;;52081:52;52126:6;52121:3;52114:4;52107:5;52103:16;52081:52;:::i;:::-;52158:6;52153:3;52149:16;52142:23;;51904:267;51794:377;;;;:::o;52177:435::-;52357:3;52379:95;52470:3;52461:6;52379:95;:::i;:::-;52372:102;;52491:95;52582:3;52573:6;52491:95;:::i;:::-;52484:102;;52603:3;52596:10;;52177:435;;;;;:::o;52618:652::-;52819:4;52857:3;52846:9;52842:19;52834:27;;52871:69;52937:1;52926:9;52922:17;52913:6;52871:69;:::i;:::-;52950:70;53016:2;53005:9;53001:18;52992:6;52950:70;:::i;:::-;53030:72;53098:2;53087:9;53083:18;53074:6;53030:72;:::i;:::-;53149:9;53143:4;53139:20;53134:2;53123:9;53119:18;53112:48;53177:86;53258:4;53249:6;53241;53177:86;:::i;:::-;53169:94;;52618:652;;;;;;;;:::o;53276:163::-;53416:15;53412:1;53404:6;53400:14;53393:39;53276:163;:::o;53445:366::-;53587:3;53608:67;53672:2;53667:3;53608:67;:::i;:::-;53601:74;;53684:93;53773:3;53684:93;:::i;:::-;53802:2;53797:3;53793:12;53786:19;;53445:366;;;:::o;53817:419::-;53983:4;54021:2;54010:9;54006:18;53998:26;;54070:9;54064:4;54060:20;54056:1;54045:9;54041:17;54034:47;54098:131;54224:4;54098:131;:::i;:::-;54090:139;;53817:419;;;:::o;54242:233::-;54281:3;54304:24;54322:5;54304:24;:::i;:::-;54295:33;;54350:66;54343:5;54340:77;54337:103;;;54420:18;;:::i;:::-;54337:103;54467:1;54460:5;54456:13;54449:20;;54242:233;;;:::o;54481:225::-;54621:34;54617:1;54609:6;54605:14;54598:58;54690:8;54685:2;54677:6;54673:15;54666:33;54481:225;:::o;54712:366::-;54854:3;54875:67;54939:2;54934:3;54875:67;:::i;:::-;54868:74;;54951:93;55040:3;54951:93;:::i;:::-;55069:2;55064:3;55060:12;55053:19;;54712:366;;;:::o;55084:419::-;55250:4;55288:2;55277:9;55273:18;55265:26;;55337:9;55331:4;55327:20;55323:1;55312:9;55308:17;55301:47;55365:131;55491:4;55365:131;:::i;:::-;55357:139;;55084:419;;;:::o;55509:231::-;55649:34;55645:1;55637:6;55633:14;55626:58;55718:14;55713:2;55705:6;55701:15;55694:39;55509:231;:::o;55746:366::-;55888:3;55909:67;55973:2;55968:3;55909:67;:::i;:::-;55902:74;;55985:93;56074:3;55985:93;:::i;:::-;56103:2;56098:3;56094:12;56087:19;;55746:366;;;:::o;56118:419::-;56284:4;56322:2;56311:9;56307:18;56299:26;;56371:9;56365:4;56361:20;56357:1;56346:9;56342:17;56335:47;56399:131;56525:4;56399:131;:::i;:::-;56391:139;;56118:419;;;:::o;56543:224::-;56683:34;56679:1;56671:6;56667:14;56660:58;56752:7;56747:2;56739:6;56735:15;56728:32;56543:224;:::o;56773:366::-;56915:3;56936:67;57000:2;56995:3;56936:67;:::i;:::-;56929:74;;57012:93;57101:3;57012:93;:::i;:::-;57130:2;57125:3;57121:12;57114:19;;56773:366;;;:::o;57145:419::-;57311:4;57349:2;57338:9;57334:18;57326:26;;57398:9;57392:4;57388:20;57384:1;57373:9;57369:17;57362:47;57426:131;57552:4;57426:131;:::i;:::-;57418:139;;57145:419;;;:::o;57570:223::-;57710:34;57706:1;57698:6;57694:14;57687:58;57779:6;57774:2;57766:6;57762:15;57755:31;57570:223;:::o;57799:366::-;57941:3;57962:67;58026:2;58021:3;57962:67;:::i;:::-;57955:74;;58038:93;58127:3;58038:93;:::i;:::-;58156:2;58151:3;58147:12;58140:19;;57799:366;;;:::o;58171:419::-;58337:4;58375:2;58364:9;58360:18;58352:26;;58424:9;58418:4;58414:20;58410:1;58399:9;58395:17;58388:47;58452:131;58578:4;58452:131;:::i;:::-;58444:139;;58171:419;;;:::o;58596:175::-;58736:27;58732:1;58724:6;58720:14;58713:51;58596:175;:::o;58777:366::-;58919:3;58940:67;59004:2;58999:3;58940:67;:::i;:::-;58933:74;;59016:93;59105:3;59016:93;:::i;:::-;59134:2;59129:3;59125:12;59118:19;;58777:366;;;:::o;59149:419::-;59315:4;59353:2;59342:9;59338:18;59330:26;;59402:9;59396:4;59392:20;59388:1;59377:9;59373:17;59366:47;59430:131;59556:4;59430:131;:::i;:::-;59422:139;;59149:419;;;:::o;59574:237::-;59714:34;59710:1;59702:6;59698:14;59691:58;59783:20;59778:2;59770:6;59766:15;59759:45;59574:237;:::o;59817:366::-;59959:3;59980:67;60044:2;60039:3;59980:67;:::i;:::-;59973:74;;60056:93;60145:3;60056:93;:::i;:::-;60174:2;60169:3;60165:12;60158:19;;59817:366;;;:::o;60189:419::-;60355:4;60393:2;60382:9;60378:18;60370:26;;60442:9;60436:4;60432:20;60428:1;60417:9;60413:17;60406:47;60470:131;60596:4;60470:131;:::i;:::-;60462:139;;60189:419;;;:::o;60614:180::-;60662:77;60659:1;60652:88;60759:4;60756:1;60749:15;60783:4;60780:1;60773:15;60800:185;60840:1;60857:20;60875:1;60857:20;:::i;:::-;60852:25;;60891:20;60909:1;60891:20;:::i;:::-;60886:25;;60930:1;60920:35;;60935:18;;:::i;:::-;60920:35;60977:1;60974;60970:9;60965:14;;60800:185;;;;:::o;60991:176::-;61023:1;61040:20;61058:1;61040:20;:::i;:::-;61035:25;;61074:20;61092:1;61074:20;:::i;:::-;61069:25;;61113:1;61103:35;;61118:18;;:::i;:::-;61103:35;61159:1;61156;61152:9;61147:14;;60991:176;;;;:::o;61173:640::-;61368:4;61406:3;61395:9;61391:19;61383:27;;61420:71;61488:1;61477:9;61473:17;61464:6;61420:71;:::i;:::-;61501:72;61569:2;61558:9;61554:18;61545:6;61501:72;:::i;:::-;61583;61651:2;61640:9;61636:18;61627:6;61583:72;:::i;:::-;61702:9;61696:4;61692:20;61687:2;61676:9;61672:18;61665:48;61730:76;61801:4;61792:6;61730:76;:::i;:::-;61722:84;;61173:640;;;;;;;:::o;61819:141::-;61875:5;61906:6;61900:13;61891:22;;61922:32;61948:5;61922:32;:::i;:::-;61819:141;;;;:::o;61966:349::-;62035:6;62084:2;62072:9;62063:7;62059:23;62055:32;62052:119;;;62090:79;;:::i;:::-;62052:119;62210:1;62235:63;62290:7;62281:6;62270:9;62266:22;62235:63;:::i;:::-;62225:73;;62181:127;61966:349;;;;:::o;62321:182::-;62461:34;62457:1;62449:6;62445:14;62438:58;62321:182;:::o;62509:366::-;62651:3;62672:67;62736:2;62731:3;62672:67;:::i;:::-;62665:74;;62748:93;62837:3;62748:93;:::i;:::-;62866:2;62861:3;62857:12;62850:19;;62509:366;;;:::o;62881:419::-;63047:4;63085:2;63074:9;63070:18;63062:26;;63134:9;63128:4;63124:20;63120:1;63109:9;63105:17;63098:47;63162:131;63288:4;63162:131;:::i;:::-;63154:139;;62881:419;;;:::o;63306:178::-;63446:30;63442:1;63434:6;63430:14;63423:54;63306:178;:::o;63490:366::-;63632:3;63653:67;63717:2;63712:3;63653:67;:::i;:::-;63646:74;;63729:93;63818:3;63729:93;:::i;:::-;63847:2;63842:3;63838:12;63831:19;;63490:366;;;:::o;63862:419::-;64028:4;64066:2;64055:9;64051:18;64043:26;;64115:9;64109:4;64105:20;64101:1;64090:9;64086:17;64079:47;64143:131;64269:4;64143:131;:::i;:::-;64135:139;;63862:419;;;:::o;64287:180::-;64335:77;64332:1;64325:88;64432:4;64429:1;64422:15;64456:4;64453:1;64446:15

Swarm Source

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