ETH Price: $3,250.09 (-0.27%)
Gas: 2 Gwei

Token

CryptoWhaleClub (WHALE)
 

Overview

Max Total Supply

0 WHALE

Holders

127

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 WHALE
0x2d7887698e3552386a8624fe912aabd0b82c4bf1
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Crypto Whale Club is a collection of hand-drawn Atlantean whales, forged from 150+ unique attributes/traits with a maximum of 8,888 whales that will ever be minted. There are 20 different types of whales, each representing a different coin or token. 2,000 1st generation whales...

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CryptoWhaleClub

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 3 of 14: CryptoWhaleClub.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721Burnable.sol";
import "./Ownable.sol";
import "./IERC20.sol";
import "./ReentrancyGuard.sol";

contract CryptoWhaleClub is ERC721Burnable, Ownable, ReentrancyGuard {
    using Address for address;
    using Strings for uint256;
    
    // metadata
    bool public metadataLocked = false;
    string public baseURI = "";

    // supply and phases
    uint256 public mintIndex = 1;
    bool public presaleEnded = true;
    bool public publicSaleEnded = false;
    bool public mintPaused = false;
    uint256 public currentPhase = 0;

    // presale whitelist
    mapping(uint256 => mapping(address => uint256)) public mintedDuringPresaleAtPhase;
    
    // limits and parameters
    uint256 public priceEth = 0.06 ether;
    uint256 public priceBlub = 1000;
    uint256 public maxOwnedPerWallet = 2499;
    uint256 public maxMintedPerWallet = 0;
    uint256 public minBlubForPresaleAccess = 3000;

    uint256 public maxSupplyForPhase = 1750;
    uint256 public maxMintedPerWalletForPhasePresale = 5;
    uint256 public maxMintedPerTxForPhaseSale = 20;
    uint256 public maxMintedPerWalletForPhaseWithBlub = 3;

    mapping (address => uint256) public minted;
    mapping (address => mapping(uint256 => uint256)) public mintedPerPhase;
    mapping (address => mapping(uint256 => uint256)) public mintedWithBlubPerPhase;

    // external addresses
    IERC20 public blubToken;

    // shareholders
    address public shareholderMBWallet;
    address public shareholderRewardsWallet;
    uint256 public constant SHAREHOLDER_PERCENTAGE_MB = 25;
    uint256 public constant SHAREHOLDER_PERCENTAGE_OWNER = 65;
    uint256 public constant SHAREHOLDER_PERCENTAGE_REWARDS = 10;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection
     */
    constructor()
        ERC721("CryptoWhaleClub", "WHALE")
    {
        shareholderMBWallet = 0xbCc4CD9BDdaCeFff7e0E7B9dd7a7d7FbC622a960;
        shareholderRewardsWallet = 0x0252799e6CCD2C26371774F178dd4497C2219699;
    }
    
    /**
     * ------------ METADATA ------------ 
     */

    /**
     * @dev Gets base metadata URI
     */
    function _baseURI() internal view override returns (string memory) {
        return baseURI;
    }
    
    /**
     * @dev Sets base metadata URI, callable by owner
     */
    function setBaseUri(string memory _uri) external onlyOwner {
        require(metadataLocked == false);
        baseURI = _uri;
    }
    
    /**
     * @dev Lock metadata URI forever, callable by owner
     */
    function lockMetadata() external onlyOwner {
        require(metadataLocked == false);
        metadataLocked = true;
    }
    
    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token");
        
        string memory base = _baseURI();
        return string(abi.encodePacked(base, tokenId.toString()));
    }
    
    /**
     * ------------ SALE AND PRESALE ------------ 
     */
     
    /**
     * @dev Ends public sale forever, callable by owner
     */
    function endSaleForever() external onlyOwner {
        publicSaleEnded = true;
    }
    
    /**
     * @dev Ends the presale, callable by owner
     */
    function endPresaleForCurrentPhase() external onlyOwner {
        presaleEnded = true;
    }

    /**
     * @dev Advance sale phase
     */
    function advanceToPresaleOfNextPhase() public onlyOwner {
        require(presaleEnded);
        currentPhase++;
        presaleEnded = false;

        if (currentPhase == 2) {
            mintIndex = 2001;
        }
    }

    /**
     * @dev Set mint index manually
     */
    function setMintIndexManually(uint256 _mintIndex) public onlyOwner {
        mintIndex = _mintIndex;
    }

    /**
     * @dev Pause/unpause sale or presale
     */
    function togglePauseMinting() external onlyOwner {
        mintPaused = !mintPaused;
    }

    /**
     * ------------ CONFIGURATION ------------ 
     */

    /**
     * @dev Set BLUB token address
     */
    function setBlubTokenAddress(address _token) external onlyOwner {
        blubToken = IERC20(_token);
    }

    /**
     * @dev Edit general sale parameters
     */
    function editGeneralParameters(uint256 _priceEth, uint256 _priceBlub, uint256 _maxOwnedPerWallet, uint256 _maxMintedPerWallet, uint256 _minBlubForPresaleAccess) external onlyOwner {
        priceEth = _priceEth;
        priceBlub = _priceBlub;
        maxOwnedPerWallet = _maxOwnedPerWallet;
        maxMintedPerWallet = _maxMintedPerWallet;
        minBlubForPresaleAccess = _minBlubForPresaleAccess;
    }


    /**
     * @dev Edit phase-specific parameters
     */
    function editPhaseParameters(uint256 _maxSupplyForPhase, uint256 _maxMintedPerWalletForPhasePresale, uint256 _maxMintedPerTxForPhaseSale, uint256 _maxMintedPerWalletForPhaseWithBlub) public onlyOwner {
        maxSupplyForPhase = _maxSupplyForPhase;
        maxMintedPerWalletForPhasePresale = _maxMintedPerWalletForPhasePresale;
        maxMintedPerTxForPhaseSale = _maxMintedPerTxForPhaseSale;
        maxMintedPerWalletForPhaseWithBlub = _maxMintedPerWalletForPhaseWithBlub;
    }

    /**
     * @dev Edit phase-specific parameters and advance to next phase in a single tx
     */
    function advancePhaseAndSetParameters(uint256 _maxSupplyForPhase, uint256 _maxMintedPerWalletForPhasePresale, uint256 _maxMintedPerTxForPhaseSale, uint256 _maxMintedPerWalletForPhaseWithBlub) external onlyOwner {
        editPhaseParameters(_maxSupplyForPhase, _maxMintedPerWalletForPhasePresale, _maxMintedPerTxForPhaseSale, _maxMintedPerWalletForPhaseWithBlub);
        advanceToPresaleOfNextPhase();
    }

    /**
     * @dev Before transfer hook
     */
    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override {
        if (maxOwnedPerWallet > 0) {
            require(balanceOf(to) < maxOwnedPerWallet, "Receiver holds too many");
        }
    }
     
    /**
     * ------------ MINTING ------------ 
     */
    
    /**
     * @dev Mints `count` tokens to `to` address; internal
     */
    function mintInternal(address to, uint256 count) internal {
        for (uint256 i = 0; i < count; i++) {
            _mint(to, mintIndex);
            mintIndex++;
        }
    }
    
    /**
     * @dev Manual minting by owner, callable by owner;
     */
    function mintOwner(address[] calldata owners, uint256[] calldata tokenIds) external onlyOwner {
        require(owners.length == tokenIds.length, "Bad length");
         
        for (uint256 i = 0; i < tokenIds.length; i++) {
            require(tokenIds[i] >= 1751 && tokenIds[i] <= 2000);
            _mint(owners[i], tokenIds[i]);
        }
    }
    
    /**
     * @dev Check presale eligibility
     */
    function isEligibleForPresale(address wallet) public view returns (bool) {
        if (currentPhase == 1) {
            return true;
        }

        if (address(blubToken) != address(0)) {
            if (blubToken.balanceOf(wallet) >= minBlubForPresaleAccess) {
                return true;
            }
        }

        return false;
    }

    /**
     * @dev Public minting during public sale or presale - internal
     */
    function mint(uint256 count) internal {
        require(!mintPaused, "Minting is currently paused");
        require(currentPhase > 0, "Sale not started");
        require(publicSaleEnded == false, "Sale ended");

        require(maxSupplyForPhase >= count, "Supply exceeded");

        if (maxMintedPerWallet > 0) {
            require(minted[msg.sender] + count <= maxMintedPerWallet, "Minted per wallet limit exceeded");
        }
        
        if (presaleEnded) {
            // public sale checks
            require(count <= maxMintedPerTxForPhaseSale, "Too many tokens");
        } else {
            // presale checks
            require(mintedPerPhase[msg.sender][currentPhase] + count <= maxMintedPerWalletForPhasePresale, "Limit exceeded");
            mintedPerPhase[msg.sender][currentPhase] += count;

            require(isEligibleForPresale(msg.sender), "Not eligible");
        }
        
        maxSupplyForPhase -= count;
        minted[msg.sender] += count;
        mintInternal(msg.sender, count);
    }

    
    /**
     * @dev Public minting (paying with ETH)
     */
    function mintWithEth(uint256 count) external payable{
        require(msg.value == count * priceEth, "Eth value incorrect");        
        mint(count);
    }

    /**
     * @dev Public minting (paying with BLUB)
     */
    function mintWithBlub(uint256 count) external {
        require(currentPhase >= 2, "Not available yet");
        require(mintedWithBlubPerPhase[msg.sender][currentPhase] + count <= maxMintedPerWalletForPhaseWithBlub, "Blub mint limit exceeded");
        
        mintedWithBlubPerPhase[msg.sender][currentPhase] += count;
        blubToken.transferFrom(msg.sender, address(this), priceBlub * count);
        mint(count);
    }

    /**
     * @dev Withdraw ETH from this contract, callable by owner
     */
    function withdrawEth() external nonReentrant {
        require(msg.sender == shareholderMBWallet || msg.sender == owner() || msg.sender == shareholderRewardsWallet, "Only Shareholder");

        uint256 balance = address(this).balance;
        require(balance > 0, "Nothing to withdraw");

        uint256 availableToWithdrawMB = balance * SHAREHOLDER_PERCENTAGE_MB / 100;
        uint256 availableToWithdrawOwner = balance * SHAREHOLDER_PERCENTAGE_OWNER / 100;
        uint256 availableToWithdrawRewards = balance * SHAREHOLDER_PERCENTAGE_REWARDS / 100;

        payable(owner()).transfer(availableToWithdrawOwner);
        payable(shareholderMBWallet).transfer(availableToWithdrawMB);
        payable(shareholderRewardsWallet).transfer(availableToWithdrawRewards);
    }

    /**
     * @dev Withdraw BLUB from this contract, callable by owner
     */
    function withdrawBlub() external nonReentrant {
        require(msg.sender == shareholderMBWallet || msg.sender == owner() || msg.sender == shareholderRewardsWallet, "Only Shareholder");

        uint256 balance = blubToken.balanceOf(address(this));
        require(balance > 0, "Nothing to withdraw");

        uint256 availableToWithdrawMB = balance * SHAREHOLDER_PERCENTAGE_MB / 100;
        uint256 availableToWithdrawOwner = balance * SHAREHOLDER_PERCENTAGE_OWNER / 100;
        uint256 availableToWithdrawRewards = balance * SHAREHOLDER_PERCENTAGE_REWARDS / 100;

        blubToken.transfer(owner(), availableToWithdrawOwner);
        blubToken.transfer(shareholderMBWallet, availableToWithdrawMB);
        blubToken.transfer(shareholderRewardsWallet, availableToWithdrawRewards);
    }
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 5 of 14: ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

File 6 of 14: ERC721Burnable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.3.2 (token/ERC721/extensions/ERC721Burnable.sol)

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./Context.sol";

/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
    }
}

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

pragma solidity ^0.8.0;

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

File 8 of 14: IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

File 10 of 14: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

File 11 of 14: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

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

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

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

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

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

File 13 of 14: ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.3.2 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

        _;

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"SHAREHOLDER_PERCENTAGE_MB","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SHAREHOLDER_PERCENTAGE_OWNER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SHAREHOLDER_PERCENTAGE_REWARDS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupplyForPhase","type":"uint256"},{"internalType":"uint256","name":"_maxMintedPerWalletForPhasePresale","type":"uint256"},{"internalType":"uint256","name":"_maxMintedPerTxForPhaseSale","type":"uint256"},{"internalType":"uint256","name":"_maxMintedPerWalletForPhaseWithBlub","type":"uint256"}],"name":"advancePhaseAndSetParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"advanceToPresaleOfNextPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blubToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentPhase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_priceEth","type":"uint256"},{"internalType":"uint256","name":"_priceBlub","type":"uint256"},{"internalType":"uint256","name":"_maxOwnedPerWallet","type":"uint256"},{"internalType":"uint256","name":"_maxMintedPerWallet","type":"uint256"},{"internalType":"uint256","name":"_minBlubForPresaleAccess","type":"uint256"}],"name":"editGeneralParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupplyForPhase","type":"uint256"},{"internalType":"uint256","name":"_maxMintedPerWalletForPhasePresale","type":"uint256"},{"internalType":"uint256","name":"_maxMintedPerTxForPhaseSale","type":"uint256"},{"internalType":"uint256","name":"_maxMintedPerWalletForPhaseWithBlub","type":"uint256"}],"name":"editPhaseParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endPresaleForCurrentPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endSaleForever","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":"address","name":"wallet","type":"address"}],"name":"isEligibleForPresale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxMintedPerTxForPhaseSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintedPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintedPerWalletForPhasePresale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintedPerWalletForPhaseWithBlub","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxOwnedPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupplyForPhase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minBlubForPresaleAccess","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"mintOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mintWithBlub","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mintWithEth","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"mintedDuringPresaleAtPhase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintedPerPhase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintedWithBlubPerPhase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleEnded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceBlub","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleEnded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"setBlubTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintIndex","type":"uint256"}],"name":"setMintIndexManually","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shareholderMBWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"shareholderRewardsWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePauseMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawBlub","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawEth","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600860006101000a81548160ff0219169083151502179055506040518060200160405280600081525060099080519060200190620000469291906200032d565b506001600a556001600b60006101000a81548160ff0219169083151502179055506000600b60016101000a81548160ff0219169083151502179055506000600b60026101000a81548160ff0219169083151502179055506000600c5566d529ae9e860000600e556103e8600f556109c36010556000601155610bb86012556106d6601355600560145560146015556003601655348015620000e657600080fd5b506040518060400160405280600f81526020017f43727970746f5768616c65436c756200000000000000000000000000000000008152506040518060400160405280600581526020017f5748414c4500000000000000000000000000000000000000000000000000000081525081600090805190602001906200016b9291906200032d565b508060019080519060200190620001849291906200032d565b505050620001a76200019b6200025f60201b60201c565b6200026760201b60201c565b600160078190555073bcc4cd9bddacefff7e0e7b9dd7a7d7fbc622a960601b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550730252799e6ccd2c26371774f178dd4497c2219699601c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000442565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200033b90620003dd565b90600052602060002090601f0160209004810192826200035f5760008555620003ab565b82601f106200037a57805160ff1916838001178555620003ab565b82800160010185558215620003ab579182015b82811115620003aa5782518255916020019190600101906200038d565b5b509050620003ba9190620003be565b5090565b5b80821115620003d9576000816000905550600101620003bf565b5090565b60006002820490506001821680620003f657607f821691505b602082108114156200040d576200040c62000413565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615f0780620004526000396000f3fe6080604052600436106103975760003560e01c8063715018a6116101dc578063a0ef91df11610102578063d8fa3168116100a0578063e985e9c51161006f578063e985e9c514610d01578063f2fde38b14610d3e578063f74f9bfd14610d67578063f89ef1df14610d9257610397565b8063d8fa316814610c57578063dbb17f7914610c80578063e28b153814610cab578063e580b2b014610cd657610397565b8063b9862e35116100dc578063b9862e3514610bb1578063c16bf73414610bc8578063c87b56dd14610bf1578063c9813c9d14610c2e57610397565b8063a0ef91df14610b48578063a22cb46514610b5f578063b88d4fde14610b8857610397565b80638f4db4d21161017a5780639a559e13116101495780639a559e1314610a7c5780639dba636f14610ab9578063a04ceec514610ae2578063a0bcfc7f14610b1f57610397565b80638f4db4d2146109e4578063911f437f14610a0f57806395d89b4114610a3a578063989bdbb614610a6557610397565b8063822a550f116101b6578063822a550f1461093a57806382c6ee9f146109655780638327032a1461097c5780638da5cb5b146109b957610397565b8063715018a6146108cf578063766905eb146108e65780637e4831d31461090f57610397565b80633e53afc3116102c15780635e1dc4201161025f57806366748e981161022e57806366748e98146107ff57806369d2ceb11461083c5780636c0360eb1461086757806370a082311461089257610397565b80635e1dc420146107435780636352211e1461076e57806364e7c55c146107ab57806365ce5ab7146107d657610397565b80634b4d20df1161029b5780634b4d20df146106ab5780635130e522146106d65780635689d1a91461070157806356916f9f1461071857610397565b80633e53afc31461064257806342842e0e1461065957806342966c681461068257610397565b8063125e0af01161033957806323b872dd1161030857806323b872dd1461059a5780632ca38363146105c35780633c3edf17146105ee5780633c444c091461061757610397565b8063125e0af0146104dc5780631c97b70e146105075780631e7269c51461053257806320c3f80b1461056f57610397565b8063081812fc11610375578063081812fc1461042f578063095ea7b31461046c5780630c557a0e146104955780630df10da9146104c057610397565b806301ffc9a71461039c578063055ad42e146103d957806306fdde0314610404575b600080fd5b3480156103a857600080fd5b506103c360048036038101906103be919061457d565b610da9565b6040516103d09190614de9565b60405180910390f35b3480156103e557600080fd5b506103ee610e8b565b6040516103fb9190615261565b60405180910390f35b34801561041057600080fd5b50610419610e91565b6040516104269190614e1f565b60405180910390f35b34801561043b57600080fd5b5061045660048036038101906104519190614620565b610f23565b6040516104639190614d22565b60405180910390f35b34801561047857600080fd5b50610493600480360381019061048e919061448f565b610fa8565b005b3480156104a157600080fd5b506104aa6110c0565b6040516104b79190615261565b60405180910390f35b6104da60048036038101906104d59190614620565b6110c5565b005b3480156104e857600080fd5b506104f1611120565b6040516104fe9190614de9565b60405180910390f35b34801561051357600080fd5b5061051c611133565b6040516105299190615261565b60405180910390f35b34801561053e57600080fd5b506105596004803603810190610554919061430c565b611139565b6040516105669190615261565b60405180910390f35b34801561057b57600080fd5b50610584611151565b6040516105919190615261565b60405180910390f35b3480156105a657600080fd5b506105c160048036038101906105bc9190614379565b611157565b005b3480156105cf57600080fd5b506105d86111b7565b6040516105e59190615261565b60405180910390f35b3480156105fa57600080fd5b50610615600480360381019061061091906146ba565b6111bd565b005b34801561062357600080fd5b5061062c611253565b6040516106399190614d22565b60405180910390f35b34801561064e57600080fd5b50610657611279565b005b34801561066557600080fd5b50610680600480360381019061067b9190614379565b611321565b005b34801561068e57600080fd5b506106a960048036038101906106a49190614620565b611341565b005b3480156106b757600080fd5b506106c061139d565b6040516106cd9190614d22565b60405180910390f35b3480156106e257600080fd5b506106eb6113c3565b6040516106f89190615261565b60405180910390f35b34801561070d57600080fd5b506107166113c9565b005b34801561072457600080fd5b5061072d611462565b60405161073a9190615261565b60405180910390f35b34801561074f57600080fd5b50610758611468565b6040516107659190615261565b60405180910390f35b34801561077a57600080fd5b5061079560048036038101906107909190614620565b61146d565b6040516107a29190614d22565b60405180910390f35b3480156107b757600080fd5b506107c061151f565b6040516107cd9190614e04565b60405180910390f35b3480156107e257600080fd5b506107fd60048036038101906107f89190614620565b611545565b005b34801561080b57600080fd5b506108266004803603810190610821919061448f565b611761565b6040516108339190615261565b60405180910390f35b34801561084857600080fd5b50610851611786565b60405161085e9190614de9565b60405180910390f35b34801561087357600080fd5b5061087c611799565b6040516108899190614e1f565b60405180910390f35b34801561089e57600080fd5b506108b960048036038101906108b4919061430c565b611827565b6040516108c69190615261565b60405180910390f35b3480156108db57600080fd5b506108e46118df565b005b3480156108f257600080fd5b5061090d6004803603810190610908919061430c565b611967565b005b34801561091b57600080fd5b50610924611a27565b6040516109319190614de9565b60405180910390f35b34801561094657600080fd5b5061094f611a3a565b60405161095c9190615261565b60405180910390f35b34801561097157600080fd5b5061097a611a40565b005b34801561098857600080fd5b506109a3600480360381019061099e919061448f565b611ad9565b6040516109b09190615261565b60405180910390f35b3480156109c557600080fd5b506109ce611afe565b6040516109db9190614d22565b60405180910390f35b3480156109f057600080fd5b506109f9611b28565b604051610a069190615261565b60405180910390f35b348015610a1b57600080fd5b50610a24611b2d565b604051610a319190615261565b60405180910390f35b348015610a4657600080fd5b50610a4f611b33565b604051610a5c9190614e1f565b60405180910390f35b348015610a7157600080fd5b50610a7a611bc5565b005b348015610a8857600080fd5b50610aa36004803603810190610a9e919061430c565b611c7e565b604051610ab09190614de9565b60405180910390f35b348015610ac557600080fd5b50610ae06004803603810190610adb9190614721565b611db1565b005b348015610aee57600080fd5b50610b096004803603810190610b04919061467a565b611e57565b604051610b169190615261565b60405180910390f35b348015610b2b57600080fd5b50610b466004803603810190610b4191906145d7565b611e7c565b005b348015610b5457600080fd5b50610b5d611f32565b005b348015610b6b57600080fd5b50610b866004803603810190610b81919061444f565b612272565b005b348015610b9457600080fd5b50610baf6004803603810190610baa91906143cc565b612288565b005b348015610bbd57600080fd5b50610bc66122ea565b005b348015610bd457600080fd5b50610bef6004803603810190610bea91906146ba565b61280f565b005b348015610bfd57600080fd5b50610c186004803603810190610c139190614620565b6128ad565b604051610c259190614e1f565b60405180910390f35b348015610c3a57600080fd5b50610c556004803603810190610c509190614620565b612935565b005b348015610c6357600080fd5b50610c7e6004803603810190610c7991906144cf565b6129bb565b005b348015610c8c57600080fd5b50610c95612b40565b604051610ca29190615261565b60405180910390f35b348015610cb757600080fd5b50610cc0612b46565b604051610ccd9190615261565b60405180910390f35b348015610ce257600080fd5b50610ceb612b4c565b604051610cf89190614de9565b60405180910390f35b348015610d0d57600080fd5b50610d286004803603810190610d239190614339565b612b5f565b604051610d359190614de9565b60405180910390f35b348015610d4a57600080fd5b50610d656004803603810190610d60919061430c565b612bf3565b005b348015610d7357600080fd5b50610d7c612ceb565b604051610d899190615261565b60405180910390f35b348015610d9e57600080fd5b50610da7612cf1565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e7457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e845750610e8382612dd0565b5b9050919050565b600c5481565b606060008054610ea090615547565b80601f0160208091040260200160405190810160405280929190818152602001828054610ecc90615547565b8015610f195780601f10610eee57610100808354040283529160200191610f19565b820191906000526020600020905b815481529060010190602001808311610efc57829003601f168201915b5050505050905090565b6000610f2e82612e3a565b610f6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f64906150a1565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610fb38261146d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611024576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101b90615161565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611043612ea6565b73ffffffffffffffffffffffffffffffffffffffff16148061107257506110718161106c612ea6565b612b5f565b5b6110b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a890614fe1565b60405180910390fd5b6110bb8383612eae565b505050565b604181565b600e54816110d391906153cd565b3414611114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110b90615041565b60405180910390fd5b61111d81612f67565b50565b600b60019054906101000a900460ff1681565b60155481565b60176020528060005260406000206000915090505481565b60145481565b611168611162612ea6565b82613361565b6111a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119e906151e1565b60405180910390fd5b6111b283838361343f565b505050565b600e5481565b6111c5612ea6565b73ffffffffffffffffffffffffffffffffffffffff166111e3611afe565b73ffffffffffffffffffffffffffffffffffffffff1614611239576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611230906150e1565b60405180910390fd5b6112458484848461280f565b61124d612cf1565b50505050565b601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611281612ea6565b73ffffffffffffffffffffffffffffffffffffffff1661129f611afe565b73ffffffffffffffffffffffffffffffffffffffff16146112f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ec906150e1565b60405180910390fd5b600b60029054906101000a900460ff1615600b60026101000a81548160ff021916908315150217905550565b61133c83838360405180602001604052806000815250612288565b505050565b61135261134c612ea6565b82613361565b611391576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138890615241565b60405180910390fd5b61139a8161369b565b50565b601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f5481565b6113d1612ea6565b73ffffffffffffffffffffffffffffffffffffffff166113ef611afe565b73ffffffffffffffffffffffffffffffffffffffff1614611445576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143c906150e1565b60405180910390fd5b6001600b60006101000a81548160ff021916908315150217905550565b60125481565b600a81565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611516576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150d90615021565b60405180910390fd5b80915050919050565b601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6002600c54101561158b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158290615101565b60405180910390fd5b60165481601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600c548152602001908152602001600020546115ec9190615346565b111561162d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162490615201565b60405180910390fd5b80601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600c548152602001908152602001600020600082825461168f9190615346565b92505081905550601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd333084600f546116e491906153cd565b6040518463ffffffff1660e01b815260040161170293929190614d3d565b602060405180830381600087803b15801561171c57600080fd5b505af1158015611730573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117549190614550565b5061175e81612f67565b50565b6018602052816000526040600020602052806000526040600020600091509150505481565b600860009054906101000a900460ff1681565b600980546117a690615547565b80601f01602080910402602001604051908101604052809291908181526020018280546117d290615547565b801561181f5780601f106117f45761010080835404028352916020019161181f565b820191906000526020600020905b81548152906001019060200180831161180257829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188f90615001565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6118e7612ea6565b73ffffffffffffffffffffffffffffffffffffffff16611905611afe565b73ffffffffffffffffffffffffffffffffffffffff161461195b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611952906150e1565b60405180910390fd5b61196560006137ac565b565b61196f612ea6565b73ffffffffffffffffffffffffffffffffffffffff1661198d611afe565b73ffffffffffffffffffffffffffffffffffffffff16146119e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119da906150e1565b60405180910390fd5b80601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60029054906101000a900460ff1681565b60135481565b611a48612ea6565b73ffffffffffffffffffffffffffffffffffffffff16611a66611afe565b73ffffffffffffffffffffffffffffffffffffffff1614611abc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab3906150e1565b60405180910390fd5b6001600b60016101000a81548160ff021916908315150217905550565b6019602052816000526040600020602052806000526040600020600091509150505481565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601981565b60165481565b606060018054611b4290615547565b80601f0160208091040260200160405190810160405280929190818152602001828054611b6e90615547565b8015611bbb5780601f10611b9057610100808354040283529160200191611bbb565b820191906000526020600020905b815481529060010190602001808311611b9e57829003601f168201915b5050505050905090565b611bcd612ea6565b73ffffffffffffffffffffffffffffffffffffffff16611beb611afe565b73ffffffffffffffffffffffffffffffffffffffff1614611c41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c38906150e1565b60405180910390fd5b60001515600860009054906101000a900460ff16151514611c6157600080fd5b6001600860006101000a81548160ff021916908315150217905550565b60006001600c541415611c945760019050611dac565b600073ffffffffffffffffffffffffffffffffffffffff16601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611da757601254601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401611d489190614d22565b60206040518083038186803b158015611d6057600080fd5b505afa158015611d74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d98919061464d565b10611da65760019050611dac565b5b600090505b919050565b611db9612ea6565b73ffffffffffffffffffffffffffffffffffffffff16611dd7611afe565b73ffffffffffffffffffffffffffffffffffffffff1614611e2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e24906150e1565b60405180910390fd5b84600e8190555083600f819055508260108190555081601181905550806012819055505050505050565b600d602052816000526040600020602052806000526040600020600091509150505481565b611e84612ea6565b73ffffffffffffffffffffffffffffffffffffffff16611ea2611afe565b73ffffffffffffffffffffffffffffffffffffffff1614611ef8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eef906150e1565b60405180910390fd5b60001515600860009054906101000a900460ff16151514611f1857600080fd5b8060099080519060200190611f2e92919061404a565b5050565b60026007541415611f78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6f90615221565b60405180910390fd5b6002600781905550601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061200e5750611fdf611afe565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806120665750601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6120a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209c906151a1565b60405180910390fd5b6000479050600081116120ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e490614e41565b60405180910390fd5b600060646019836120fe91906153cd565b612108919061539c565b90506000606460418461211b91906153cd565b612125919061539c565b905060006064600a8561213891906153cd565b612142919061539c565b905061214c611afe565b73ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015612191573d6000803e3d6000fd5b50601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156121fa573d6000803e3d6000fd5b50601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612263573d6000803e3d6000fd5b50505050506001600781905550565b61228461227d612ea6565b8383613872565b5050565b612299612293612ea6565b83613361565b6122d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122cf906151e1565b60405180910390fd5b6122e4848484846139df565b50505050565b60026007541415612330576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232790615221565b60405180910390fd5b6002600781905550601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806123c65750612397611afe565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061241e5750601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61245d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612454906151a1565b60405180910390fd5b6000601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016124ba9190614d22565b60206040518083038186803b1580156124d257600080fd5b505afa1580156124e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250a919061464d565b90506000811161254f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254690614e41565b60405180910390fd5b6000606460198361256091906153cd565b61256a919061539c565b90506000606460418461257d91906153cd565b612587919061539c565b905060006064600a8561259a91906153cd565b6125a4919061539c565b9050601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6125ec611afe565b846040518363ffffffff1660e01b815260040161260a929190614dc0565b602060405180830381600087803b15801561262457600080fd5b505af1158015612638573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061265c9190614550565b50601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518363ffffffff1660e01b81526004016126dc929190614dc0565b602060405180830381600087803b1580156126f657600080fd5b505af115801561270a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061272e9190614550565b50601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b81526004016127ae929190614dc0565b602060405180830381600087803b1580156127c857600080fd5b505af11580156127dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128009190614550565b50505050506001600781905550565b612817612ea6565b73ffffffffffffffffffffffffffffffffffffffff16612835611afe565b73ffffffffffffffffffffffffffffffffffffffff161461288b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612882906150e1565b60405180910390fd5b8360138190555082601481905550816015819055508060168190555050505050565b60606128b882612e3a565b6128f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ee90615081565b60405180910390fd5b6000612901613a3b565b90508061290d84613acd565b60405160200161291e929190614cfe565b604051602081830303815290604052915050919050565b61293d612ea6565b73ffffffffffffffffffffffffffffffffffffffff1661295b611afe565b73ffffffffffffffffffffffffffffffffffffffff16146129b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a8906150e1565b60405180910390fd5b80600a8190555050565b6129c3612ea6565b73ffffffffffffffffffffffffffffffffffffffff166129e1611afe565b73ffffffffffffffffffffffffffffffffffffffff1614612a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2e906150e1565b60405180910390fd5b818190508484905014612a7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a76906150c1565b60405180910390fd5b60005b82829050811015612b39576106d7838383818110612aa357612aa26156b1565b5b9050602002013510158015612ad357506107d0838383818110612ac957612ac86156b1565b5b9050602002013511155b612adc57600080fd5b612b26858583818110612af257612af16156b1565b5b9050602002016020810190612b07919061430c565b848484818110612b1a57612b196156b1565b5b90506020020135613c2e565b8080612b31906155aa565b915050612a82565b5050505050565b60115481565b60105481565b600b60009054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612bfb612ea6565b73ffffffffffffffffffffffffffffffffffffffff16612c19611afe565b73ffffffffffffffffffffffffffffffffffffffff1614612c6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c66906150e1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612cdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd690614e81565b60405180910390fd5b612ce8816137ac565b50565b600a5481565b612cf9612ea6565b73ffffffffffffffffffffffffffffffffffffffff16612d17611afe565b73ffffffffffffffffffffffffffffffffffffffff1614612d6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d64906150e1565b60405180910390fd5b600b60009054906101000a900460ff16612d8657600080fd5b600c6000815480929190612d99906155aa565b91905055506000600b60006101000a81548160ff0219169083151502179055506002600c541415612dce576107d1600a819055505b565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612f218361146d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600b60029054906101000a900460ff1615612fb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fae906151c1565b60405180910390fd5b6000600c5411612ffc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff390614fc1565b60405180910390fd5b60001515600b60019054906101000a900460ff16151514613052576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304990615141565b60405180910390fd5b806013541015613097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308e90614f81565b60405180910390fd5b600060115411156131325760115481601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546130f09190615346565b1115613131576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161312890615181565b60405180910390fd5b5b600b60009054906101000a900460ff16156131915760155481111561318c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161318390614ea1565b60405180910390fd5b6132e5565b60145481601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600c548152602001908152602001600020546131f29190615346565b1115613233576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161322a90614f01565b60405180910390fd5b80601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600c54815260200190815260200160002060008282546132959190615346565b925050819055506132a533611c7e565b6132e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132db90614fa1565b60405180910390fd5b5b80601360008282546132f79190615427565b9250508190555080601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461334d9190615346565b9250508190555061335e3382613dfc565b50565b600061336c82612e3a565b6133ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133a290614f61565b60405180910390fd5b60006133b68361146d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061342557508373ffffffffffffffffffffffffffffffffffffffff1661340d84610f23565b73ffffffffffffffffffffffffffffffffffffffff16145b8061343657506134358185612b5f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661345f8261146d565b73ffffffffffffffffffffffffffffffffffffffff16146134b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ac90615121565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613525576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351c90614f21565b60405180910390fd5b613530838383613e43565b61353b600082612eae565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461358b9190615427565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546135e29190615346565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006136a68261146d565b90506136b481600084613e43565b6136bf600083612eae565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461370f9190615427565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156138e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138d890614f41565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516139d29190614de9565b60405180910390a3505050565b6139ea84848461343f565b6139f684848484613ea0565b613a35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a2c90614e61565b60405180910390fd5b50505050565b606060098054613a4a90615547565b80601f0160208091040260200160405190810160405280929190818152602001828054613a7690615547565b8015613ac35780601f10613a9857610100808354040283529160200191613ac3565b820191906000526020600020905b815481529060010190602001808311613aa657829003601f168201915b5050505050905090565b60606000821415613b15576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613c29565b600082905060005b60008214613b47578080613b30906155aa565b915050600a82613b40919061539c565b9150613b1d565b60008167ffffffffffffffff811115613b6357613b626156e0565b5b6040519080825280601f01601f191660200182016040528015613b955781602001600182028036833780820191505090505b5090505b60008514613c2257600182613bae9190615427565b9150600a85613bbd91906155f3565b6030613bc99190615346565b60f81b818381518110613bdf57613bde6156b1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613c1b919061539c565b9450613b99565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613c9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c9590615061565b60405180910390fd5b613ca781612e3a565b15613ce7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613cde90614ec1565b60405180910390fd5b613cf360008383613e43565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613d439190615346565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60005b81811015613e3e57613e1383600a54613c2e565b600a6000815480929190613e26906155aa565b91905055508080613e36906155aa565b915050613dff565b505050565b60006010541115613e9b57601054613e5a83611827565b10613e9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e9190614ee1565b60405180910390fd5b5b505050565b6000613ec18473ffffffffffffffffffffffffffffffffffffffff16614037565b1561402a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613eea612ea6565b8786866040518563ffffffff1660e01b8152600401613f0c9493929190614d74565b602060405180830381600087803b158015613f2657600080fd5b505af1925050508015613f5757506040513d601f19601f82011682018060405250810190613f5491906145aa565b60015b613fda573d8060008114613f87576040519150601f19603f3d011682016040523d82523d6000602084013e613f8c565b606091505b50600081511415613fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fc990614e61565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061402f565b600190505b949350505050565b600080823b905060008111915050919050565b82805461405690615547565b90600052602060002090601f01602090048101928261407857600085556140bf565b82601f1061409157805160ff19168380011785556140bf565b828001600101855582156140bf579182015b828111156140be5782518255916020019190600101906140a3565b5b5090506140cc91906140d0565b5090565b5b808211156140e95760008160009055506001016140d1565b5090565b60006141006140fb846152a1565b61527c565b90508281526020810184848401111561411c5761411b61571e565b5b614127848285615505565b509392505050565b600061414261413d846152d2565b61527c565b90508281526020810184848401111561415e5761415d61571e565b5b614169848285615505565b509392505050565b60008135905061418081615e75565b92915050565b60008083601f84011261419c5761419b615714565b5b8235905067ffffffffffffffff8111156141b9576141b861570f565b5b6020830191508360208202830111156141d5576141d4615719565b5b9250929050565b60008083601f8401126141f2576141f1615714565b5b8235905067ffffffffffffffff81111561420f5761420e61570f565b5b60208301915083602082028301111561422b5761422a615719565b5b9250929050565b60008135905061424181615e8c565b92915050565b60008151905061425681615e8c565b92915050565b60008135905061426b81615ea3565b92915050565b60008151905061428081615ea3565b92915050565b600082601f83011261429b5761429a615714565b5b81356142ab8482602086016140ed565b91505092915050565b600082601f8301126142c9576142c8615714565b5b81356142d984826020860161412f565b91505092915050565b6000813590506142f181615eba565b92915050565b60008151905061430681615eba565b92915050565b60006020828403121561432257614321615728565b5b600061433084828501614171565b91505092915050565b600080604083850312156143505761434f615728565b5b600061435e85828601614171565b925050602061436f85828601614171565b9150509250929050565b60008060006060848603121561439257614391615728565b5b60006143a086828701614171565b93505060206143b186828701614171565b92505060406143c2868287016142e2565b9150509250925092565b600080600080608085870312156143e6576143e5615728565b5b60006143f487828801614171565b945050602061440587828801614171565b9350506040614416878288016142e2565b925050606085013567ffffffffffffffff81111561443757614436615723565b5b61444387828801614286565b91505092959194509250565b6000806040838503121561446657614465615728565b5b600061447485828601614171565b925050602061448585828601614232565b9150509250929050565b600080604083850312156144a6576144a5615728565b5b60006144b485828601614171565b92505060206144c5858286016142e2565b9150509250929050565b600080600080604085870312156144e9576144e8615728565b5b600085013567ffffffffffffffff81111561450757614506615723565b5b61451387828801614186565b9450945050602085013567ffffffffffffffff81111561453657614535615723565b5b614542878288016141dc565b925092505092959194509250565b60006020828403121561456657614565615728565b5b600061457484828501614247565b91505092915050565b60006020828403121561459357614592615728565b5b60006145a18482850161425c565b91505092915050565b6000602082840312156145c0576145bf615728565b5b60006145ce84828501614271565b91505092915050565b6000602082840312156145ed576145ec615728565b5b600082013567ffffffffffffffff81111561460b5761460a615723565b5b614617848285016142b4565b91505092915050565b60006020828403121561463657614635615728565b5b6000614644848285016142e2565b91505092915050565b60006020828403121561466357614662615728565b5b6000614671848285016142f7565b91505092915050565b6000806040838503121561469157614690615728565b5b600061469f858286016142e2565b92505060206146b085828601614171565b9150509250929050565b600080600080608085870312156146d4576146d3615728565b5b60006146e2878288016142e2565b94505060206146f3878288016142e2565b9350506040614704878288016142e2565b9250506060614715878288016142e2565b91505092959194509250565b600080600080600060a0868803121561473d5761473c615728565b5b600061474b888289016142e2565b955050602061475c888289016142e2565b945050604061476d888289016142e2565b935050606061477e888289016142e2565b925050608061478f888289016142e2565b9150509295509295909350565b6147a58161545b565b82525050565b6147b48161546d565b82525050565b60006147c582615303565b6147cf8185615319565b93506147df818560208601615514565b6147e88161572d565b840191505092915050565b6147fc816154cf565b82525050565b600061480d8261530e565b614817818561532a565b9350614827818560208601615514565b6148308161572d565b840191505092915050565b60006148468261530e565b614850818561533b565b9350614860818560208601615514565b80840191505092915050565b600061487960138361532a565b91506148848261573e565b602082019050919050565b600061489c60328361532a565b91506148a782615767565b604082019050919050565b60006148bf60268361532a565b91506148ca826157b6565b604082019050919050565b60006148e2600f8361532a565b91506148ed82615805565b602082019050919050565b6000614905601c8361532a565b91506149108261582e565b602082019050919050565b600061492860178361532a565b915061493382615857565b602082019050919050565b600061494b600e8361532a565b915061495682615880565b602082019050919050565b600061496e60248361532a565b9150614979826158a9565b604082019050919050565b600061499160198361532a565b915061499c826158f8565b602082019050919050565b60006149b4602c8361532a565b91506149bf82615921565b604082019050919050565b60006149d7600f8361532a565b91506149e282615970565b602082019050919050565b60006149fa600c8361532a565b9150614a0582615999565b602082019050919050565b6000614a1d60108361532a565b9150614a28826159c2565b602082019050919050565b6000614a4060388361532a565b9150614a4b826159eb565b604082019050919050565b6000614a63602a8361532a565b9150614a6e82615a3a565b604082019050919050565b6000614a8660298361532a565b9150614a9182615a89565b604082019050919050565b6000614aa960138361532a565b9150614ab482615ad8565b602082019050919050565b6000614acc60208361532a565b9150614ad782615b01565b602082019050919050565b6000614aef60318361532a565b9150614afa82615b2a565b604082019050919050565b6000614b12602c8361532a565b9150614b1d82615b79565b604082019050919050565b6000614b35600a8361532a565b9150614b4082615bc8565b602082019050919050565b6000614b5860208361532a565b9150614b6382615bf1565b602082019050919050565b6000614b7b60118361532a565b9150614b8682615c1a565b602082019050919050565b6000614b9e60298361532a565b9150614ba982615c43565b604082019050919050565b6000614bc1600a8361532a565b9150614bcc82615c92565b602082019050919050565b6000614be460218361532a565b9150614bef82615cbb565b604082019050919050565b6000614c0760208361532a565b9150614c1282615d0a565b602082019050919050565b6000614c2a60108361532a565b9150614c3582615d33565b602082019050919050565b6000614c4d601b8361532a565b9150614c5882615d5c565b602082019050919050565b6000614c7060318361532a565b9150614c7b82615d85565b604082019050919050565b6000614c9360188361532a565b9150614c9e82615dd4565b602082019050919050565b6000614cb6601f8361532a565b9150614cc182615dfd565b602082019050919050565b6000614cd960308361532a565b9150614ce482615e26565b604082019050919050565b614cf8816154c5565b82525050565b6000614d0a828561483b565b9150614d16828461483b565b91508190509392505050565b6000602082019050614d37600083018461479c565b92915050565b6000606082019050614d52600083018661479c565b614d5f602083018561479c565b614d6c6040830184614cef565b949350505050565b6000608082019050614d89600083018761479c565b614d96602083018661479c565b614da36040830185614cef565b8181036060830152614db581846147ba565b905095945050505050565b6000604082019050614dd5600083018561479c565b614de26020830184614cef565b9392505050565b6000602082019050614dfe60008301846147ab565b92915050565b6000602082019050614e1960008301846147f3565b92915050565b60006020820190508181036000830152614e398184614802565b905092915050565b60006020820190508181036000830152614e5a8161486c565b9050919050565b60006020820190508181036000830152614e7a8161488f565b9050919050565b60006020820190508181036000830152614e9a816148b2565b9050919050565b60006020820190508181036000830152614eba816148d5565b9050919050565b60006020820190508181036000830152614eda816148f8565b9050919050565b60006020820190508181036000830152614efa8161491b565b9050919050565b60006020820190508181036000830152614f1a8161493e565b9050919050565b60006020820190508181036000830152614f3a81614961565b9050919050565b60006020820190508181036000830152614f5a81614984565b9050919050565b60006020820190508181036000830152614f7a816149a7565b9050919050565b60006020820190508181036000830152614f9a816149ca565b9050919050565b60006020820190508181036000830152614fba816149ed565b9050919050565b60006020820190508181036000830152614fda81614a10565b9050919050565b60006020820190508181036000830152614ffa81614a33565b9050919050565b6000602082019050818103600083015261501a81614a56565b9050919050565b6000602082019050818103600083015261503a81614a79565b9050919050565b6000602082019050818103600083015261505a81614a9c565b9050919050565b6000602082019050818103600083015261507a81614abf565b9050919050565b6000602082019050818103600083015261509a81614ae2565b9050919050565b600060208201905081810360008301526150ba81614b05565b9050919050565b600060208201905081810360008301526150da81614b28565b9050919050565b600060208201905081810360008301526150fa81614b4b565b9050919050565b6000602082019050818103600083015261511a81614b6e565b9050919050565b6000602082019050818103600083015261513a81614b91565b9050919050565b6000602082019050818103600083015261515a81614bb4565b9050919050565b6000602082019050818103600083015261517a81614bd7565b9050919050565b6000602082019050818103600083015261519a81614bfa565b9050919050565b600060208201905081810360008301526151ba81614c1d565b9050919050565b600060208201905081810360008301526151da81614c40565b9050919050565b600060208201905081810360008301526151fa81614c63565b9050919050565b6000602082019050818103600083015261521a81614c86565b9050919050565b6000602082019050818103600083015261523a81614ca9565b9050919050565b6000602082019050818103600083015261525a81614ccc565b9050919050565b60006020820190506152766000830184614cef565b92915050565b6000615286615297565b90506152928282615579565b919050565b6000604051905090565b600067ffffffffffffffff8211156152bc576152bb6156e0565b5b6152c58261572d565b9050602081019050919050565b600067ffffffffffffffff8211156152ed576152ec6156e0565b5b6152f68261572d565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000615351826154c5565b915061535c836154c5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561539157615390615624565b5b828201905092915050565b60006153a7826154c5565b91506153b2836154c5565b9250826153c2576153c1615653565b5b828204905092915050565b60006153d8826154c5565b91506153e3836154c5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561541c5761541b615624565b5b828202905092915050565b6000615432826154c5565b915061543d836154c5565b9250828210156154505761544f615624565b5b828203905092915050565b6000615466826154a5565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006154da826154e1565b9050919050565b60006154ec826154f3565b9050919050565b60006154fe826154a5565b9050919050565b82818337600083830152505050565b60005b83811015615532578082015181840152602081019050615517565b83811115615541576000848401525b50505050565b6000600282049050600182168061555f57607f821691505b6020821081141561557357615572615682565b5b50919050565b6155828261572d565b810181811067ffffffffffffffff821117156155a1576155a06156e0565b5b80604052505050565b60006155b5826154c5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156155e8576155e7615624565b5b600182019050919050565b60006155fe826154c5565b9150615609836154c5565b92508261561957615618615653565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e6f7468696e6720746f20776974686472617700000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f546f6f206d616e7920746f6b656e730000000000000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f526563656976657220686f6c647320746f6f206d616e79000000000000000000600082015250565b7f4c696d6974206578636565646564000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f537570706c792065786365656465640000000000000000000000000000000000600082015250565b7f4e6f7420656c696769626c650000000000000000000000000000000000000000600082015250565b7f53616c65206e6f74207374617274656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4574682076616c756520696e636f727265637400000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f426164206c656e67746800000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e6f7420617661696c61626c6520796574000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f53616c6520656e64656400000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e746564207065722077616c6c6574206c696d6974206578636565646564600082015250565b7f4f6e6c79205368617265686f6c64657200000000000000000000000000000000600082015250565b7f4d696e74696e672069732063757272656e746c79207061757365640000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f426c7562206d696e74206c696d69742065786365656465640000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b615e7e8161545b565b8114615e8957600080fd5b50565b615e958161546d565b8114615ea057600080fd5b50565b615eac81615479565b8114615eb757600080fd5b50565b615ec3816154c5565b8114615ece57600080fd5b5056fea264697066735822122040cb02925ba6bdae83f54d6611e66ced44bfcd898ade57348cd4db1232cf5de064736f6c63430008070033

Deployed Bytecode

0x6080604052600436106103975760003560e01c8063715018a6116101dc578063a0ef91df11610102578063d8fa3168116100a0578063e985e9c51161006f578063e985e9c514610d01578063f2fde38b14610d3e578063f74f9bfd14610d67578063f89ef1df14610d9257610397565b8063d8fa316814610c57578063dbb17f7914610c80578063e28b153814610cab578063e580b2b014610cd657610397565b8063b9862e35116100dc578063b9862e3514610bb1578063c16bf73414610bc8578063c87b56dd14610bf1578063c9813c9d14610c2e57610397565b8063a0ef91df14610b48578063a22cb46514610b5f578063b88d4fde14610b8857610397565b80638f4db4d21161017a5780639a559e13116101495780639a559e1314610a7c5780639dba636f14610ab9578063a04ceec514610ae2578063a0bcfc7f14610b1f57610397565b80638f4db4d2146109e4578063911f437f14610a0f57806395d89b4114610a3a578063989bdbb614610a6557610397565b8063822a550f116101b6578063822a550f1461093a57806382c6ee9f146109655780638327032a1461097c5780638da5cb5b146109b957610397565b8063715018a6146108cf578063766905eb146108e65780637e4831d31461090f57610397565b80633e53afc3116102c15780635e1dc4201161025f57806366748e981161022e57806366748e98146107ff57806369d2ceb11461083c5780636c0360eb1461086757806370a082311461089257610397565b80635e1dc420146107435780636352211e1461076e57806364e7c55c146107ab57806365ce5ab7146107d657610397565b80634b4d20df1161029b5780634b4d20df146106ab5780635130e522146106d65780635689d1a91461070157806356916f9f1461071857610397565b80633e53afc31461064257806342842e0e1461065957806342966c681461068257610397565b8063125e0af01161033957806323b872dd1161030857806323b872dd1461059a5780632ca38363146105c35780633c3edf17146105ee5780633c444c091461061757610397565b8063125e0af0146104dc5780631c97b70e146105075780631e7269c51461053257806320c3f80b1461056f57610397565b8063081812fc11610375578063081812fc1461042f578063095ea7b31461046c5780630c557a0e146104955780630df10da9146104c057610397565b806301ffc9a71461039c578063055ad42e146103d957806306fdde0314610404575b600080fd5b3480156103a857600080fd5b506103c360048036038101906103be919061457d565b610da9565b6040516103d09190614de9565b60405180910390f35b3480156103e557600080fd5b506103ee610e8b565b6040516103fb9190615261565b60405180910390f35b34801561041057600080fd5b50610419610e91565b6040516104269190614e1f565b60405180910390f35b34801561043b57600080fd5b5061045660048036038101906104519190614620565b610f23565b6040516104639190614d22565b60405180910390f35b34801561047857600080fd5b50610493600480360381019061048e919061448f565b610fa8565b005b3480156104a157600080fd5b506104aa6110c0565b6040516104b79190615261565b60405180910390f35b6104da60048036038101906104d59190614620565b6110c5565b005b3480156104e857600080fd5b506104f1611120565b6040516104fe9190614de9565b60405180910390f35b34801561051357600080fd5b5061051c611133565b6040516105299190615261565b60405180910390f35b34801561053e57600080fd5b506105596004803603810190610554919061430c565b611139565b6040516105669190615261565b60405180910390f35b34801561057b57600080fd5b50610584611151565b6040516105919190615261565b60405180910390f35b3480156105a657600080fd5b506105c160048036038101906105bc9190614379565b611157565b005b3480156105cf57600080fd5b506105d86111b7565b6040516105e59190615261565b60405180910390f35b3480156105fa57600080fd5b50610615600480360381019061061091906146ba565b6111bd565b005b34801561062357600080fd5b5061062c611253565b6040516106399190614d22565b60405180910390f35b34801561064e57600080fd5b50610657611279565b005b34801561066557600080fd5b50610680600480360381019061067b9190614379565b611321565b005b34801561068e57600080fd5b506106a960048036038101906106a49190614620565b611341565b005b3480156106b757600080fd5b506106c061139d565b6040516106cd9190614d22565b60405180910390f35b3480156106e257600080fd5b506106eb6113c3565b6040516106f89190615261565b60405180910390f35b34801561070d57600080fd5b506107166113c9565b005b34801561072457600080fd5b5061072d611462565b60405161073a9190615261565b60405180910390f35b34801561074f57600080fd5b50610758611468565b6040516107659190615261565b60405180910390f35b34801561077a57600080fd5b5061079560048036038101906107909190614620565b61146d565b6040516107a29190614d22565b60405180910390f35b3480156107b757600080fd5b506107c061151f565b6040516107cd9190614e04565b60405180910390f35b3480156107e257600080fd5b506107fd60048036038101906107f89190614620565b611545565b005b34801561080b57600080fd5b506108266004803603810190610821919061448f565b611761565b6040516108339190615261565b60405180910390f35b34801561084857600080fd5b50610851611786565b60405161085e9190614de9565b60405180910390f35b34801561087357600080fd5b5061087c611799565b6040516108899190614e1f565b60405180910390f35b34801561089e57600080fd5b506108b960048036038101906108b4919061430c565b611827565b6040516108c69190615261565b60405180910390f35b3480156108db57600080fd5b506108e46118df565b005b3480156108f257600080fd5b5061090d6004803603810190610908919061430c565b611967565b005b34801561091b57600080fd5b50610924611a27565b6040516109319190614de9565b60405180910390f35b34801561094657600080fd5b5061094f611a3a565b60405161095c9190615261565b60405180910390f35b34801561097157600080fd5b5061097a611a40565b005b34801561098857600080fd5b506109a3600480360381019061099e919061448f565b611ad9565b6040516109b09190615261565b60405180910390f35b3480156109c557600080fd5b506109ce611afe565b6040516109db9190614d22565b60405180910390f35b3480156109f057600080fd5b506109f9611b28565b604051610a069190615261565b60405180910390f35b348015610a1b57600080fd5b50610a24611b2d565b604051610a319190615261565b60405180910390f35b348015610a4657600080fd5b50610a4f611b33565b604051610a5c9190614e1f565b60405180910390f35b348015610a7157600080fd5b50610a7a611bc5565b005b348015610a8857600080fd5b50610aa36004803603810190610a9e919061430c565b611c7e565b604051610ab09190614de9565b60405180910390f35b348015610ac557600080fd5b50610ae06004803603810190610adb9190614721565b611db1565b005b348015610aee57600080fd5b50610b096004803603810190610b04919061467a565b611e57565b604051610b169190615261565b60405180910390f35b348015610b2b57600080fd5b50610b466004803603810190610b4191906145d7565b611e7c565b005b348015610b5457600080fd5b50610b5d611f32565b005b348015610b6b57600080fd5b50610b866004803603810190610b81919061444f565b612272565b005b348015610b9457600080fd5b50610baf6004803603810190610baa91906143cc565b612288565b005b348015610bbd57600080fd5b50610bc66122ea565b005b348015610bd457600080fd5b50610bef6004803603810190610bea91906146ba565b61280f565b005b348015610bfd57600080fd5b50610c186004803603810190610c139190614620565b6128ad565b604051610c259190614e1f565b60405180910390f35b348015610c3a57600080fd5b50610c556004803603810190610c509190614620565b612935565b005b348015610c6357600080fd5b50610c7e6004803603810190610c7991906144cf565b6129bb565b005b348015610c8c57600080fd5b50610c95612b40565b604051610ca29190615261565b60405180910390f35b348015610cb757600080fd5b50610cc0612b46565b604051610ccd9190615261565b60405180910390f35b348015610ce257600080fd5b50610ceb612b4c565b604051610cf89190614de9565b60405180910390f35b348015610d0d57600080fd5b50610d286004803603810190610d239190614339565b612b5f565b604051610d359190614de9565b60405180910390f35b348015610d4a57600080fd5b50610d656004803603810190610d60919061430c565b612bf3565b005b348015610d7357600080fd5b50610d7c612ceb565b604051610d899190615261565b60405180910390f35b348015610d9e57600080fd5b50610da7612cf1565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e7457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e845750610e8382612dd0565b5b9050919050565b600c5481565b606060008054610ea090615547565b80601f0160208091040260200160405190810160405280929190818152602001828054610ecc90615547565b8015610f195780601f10610eee57610100808354040283529160200191610f19565b820191906000526020600020905b815481529060010190602001808311610efc57829003601f168201915b5050505050905090565b6000610f2e82612e3a565b610f6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f64906150a1565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610fb38261146d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611024576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101b90615161565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611043612ea6565b73ffffffffffffffffffffffffffffffffffffffff16148061107257506110718161106c612ea6565b612b5f565b5b6110b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a890614fe1565b60405180910390fd5b6110bb8383612eae565b505050565b604181565b600e54816110d391906153cd565b3414611114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110b90615041565b60405180910390fd5b61111d81612f67565b50565b600b60019054906101000a900460ff1681565b60155481565b60176020528060005260406000206000915090505481565b60145481565b611168611162612ea6565b82613361565b6111a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119e906151e1565b60405180910390fd5b6111b283838361343f565b505050565b600e5481565b6111c5612ea6565b73ffffffffffffffffffffffffffffffffffffffff166111e3611afe565b73ffffffffffffffffffffffffffffffffffffffff1614611239576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611230906150e1565b60405180910390fd5b6112458484848461280f565b61124d612cf1565b50505050565b601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611281612ea6565b73ffffffffffffffffffffffffffffffffffffffff1661129f611afe565b73ffffffffffffffffffffffffffffffffffffffff16146112f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ec906150e1565b60405180910390fd5b600b60029054906101000a900460ff1615600b60026101000a81548160ff021916908315150217905550565b61133c83838360405180602001604052806000815250612288565b505050565b61135261134c612ea6565b82613361565b611391576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138890615241565b60405180910390fd5b61139a8161369b565b50565b601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f5481565b6113d1612ea6565b73ffffffffffffffffffffffffffffffffffffffff166113ef611afe565b73ffffffffffffffffffffffffffffffffffffffff1614611445576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143c906150e1565b60405180910390fd5b6001600b60006101000a81548160ff021916908315150217905550565b60125481565b600a81565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611516576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150d90615021565b60405180910390fd5b80915050919050565b601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6002600c54101561158b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158290615101565b60405180910390fd5b60165481601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600c548152602001908152602001600020546115ec9190615346565b111561162d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162490615201565b60405180910390fd5b80601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600c548152602001908152602001600020600082825461168f9190615346565b92505081905550601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd333084600f546116e491906153cd565b6040518463ffffffff1660e01b815260040161170293929190614d3d565b602060405180830381600087803b15801561171c57600080fd5b505af1158015611730573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117549190614550565b5061175e81612f67565b50565b6018602052816000526040600020602052806000526040600020600091509150505481565b600860009054906101000a900460ff1681565b600980546117a690615547565b80601f01602080910402602001604051908101604052809291908181526020018280546117d290615547565b801561181f5780601f106117f45761010080835404028352916020019161181f565b820191906000526020600020905b81548152906001019060200180831161180257829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188f90615001565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6118e7612ea6565b73ffffffffffffffffffffffffffffffffffffffff16611905611afe565b73ffffffffffffffffffffffffffffffffffffffff161461195b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611952906150e1565b60405180910390fd5b61196560006137ac565b565b61196f612ea6565b73ffffffffffffffffffffffffffffffffffffffff1661198d611afe565b73ffffffffffffffffffffffffffffffffffffffff16146119e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119da906150e1565b60405180910390fd5b80601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60029054906101000a900460ff1681565b60135481565b611a48612ea6565b73ffffffffffffffffffffffffffffffffffffffff16611a66611afe565b73ffffffffffffffffffffffffffffffffffffffff1614611abc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab3906150e1565b60405180910390fd5b6001600b60016101000a81548160ff021916908315150217905550565b6019602052816000526040600020602052806000526040600020600091509150505481565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601981565b60165481565b606060018054611b4290615547565b80601f0160208091040260200160405190810160405280929190818152602001828054611b6e90615547565b8015611bbb5780601f10611b9057610100808354040283529160200191611bbb565b820191906000526020600020905b815481529060010190602001808311611b9e57829003601f168201915b5050505050905090565b611bcd612ea6565b73ffffffffffffffffffffffffffffffffffffffff16611beb611afe565b73ffffffffffffffffffffffffffffffffffffffff1614611c41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c38906150e1565b60405180910390fd5b60001515600860009054906101000a900460ff16151514611c6157600080fd5b6001600860006101000a81548160ff021916908315150217905550565b60006001600c541415611c945760019050611dac565b600073ffffffffffffffffffffffffffffffffffffffff16601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611da757601254601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401611d489190614d22565b60206040518083038186803b158015611d6057600080fd5b505afa158015611d74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d98919061464d565b10611da65760019050611dac565b5b600090505b919050565b611db9612ea6565b73ffffffffffffffffffffffffffffffffffffffff16611dd7611afe565b73ffffffffffffffffffffffffffffffffffffffff1614611e2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e24906150e1565b60405180910390fd5b84600e8190555083600f819055508260108190555081601181905550806012819055505050505050565b600d602052816000526040600020602052806000526040600020600091509150505481565b611e84612ea6565b73ffffffffffffffffffffffffffffffffffffffff16611ea2611afe565b73ffffffffffffffffffffffffffffffffffffffff1614611ef8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eef906150e1565b60405180910390fd5b60001515600860009054906101000a900460ff16151514611f1857600080fd5b8060099080519060200190611f2e92919061404a565b5050565b60026007541415611f78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6f90615221565b60405180910390fd5b6002600781905550601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061200e5750611fdf611afe565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806120665750601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6120a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209c906151a1565b60405180910390fd5b6000479050600081116120ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e490614e41565b60405180910390fd5b600060646019836120fe91906153cd565b612108919061539c565b90506000606460418461211b91906153cd565b612125919061539c565b905060006064600a8561213891906153cd565b612142919061539c565b905061214c611afe565b73ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015612191573d6000803e3d6000fd5b50601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156121fa573d6000803e3d6000fd5b50601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612263573d6000803e3d6000fd5b50505050506001600781905550565b61228461227d612ea6565b8383613872565b5050565b612299612293612ea6565b83613361565b6122d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122cf906151e1565b60405180910390fd5b6122e4848484846139df565b50505050565b60026007541415612330576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232790615221565b60405180910390fd5b6002600781905550601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806123c65750612397611afe565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061241e5750601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61245d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612454906151a1565b60405180910390fd5b6000601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016124ba9190614d22565b60206040518083038186803b1580156124d257600080fd5b505afa1580156124e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250a919061464d565b90506000811161254f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254690614e41565b60405180910390fd5b6000606460198361256091906153cd565b61256a919061539c565b90506000606460418461257d91906153cd565b612587919061539c565b905060006064600a8561259a91906153cd565b6125a4919061539c565b9050601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6125ec611afe565b846040518363ffffffff1660e01b815260040161260a929190614dc0565b602060405180830381600087803b15801561262457600080fd5b505af1158015612638573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061265c9190614550565b50601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518363ffffffff1660e01b81526004016126dc929190614dc0565b602060405180830381600087803b1580156126f657600080fd5b505af115801561270a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061272e9190614550565b50601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b81526004016127ae929190614dc0565b602060405180830381600087803b1580156127c857600080fd5b505af11580156127dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128009190614550565b50505050506001600781905550565b612817612ea6565b73ffffffffffffffffffffffffffffffffffffffff16612835611afe565b73ffffffffffffffffffffffffffffffffffffffff161461288b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612882906150e1565b60405180910390fd5b8360138190555082601481905550816015819055508060168190555050505050565b60606128b882612e3a565b6128f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ee90615081565b60405180910390fd5b6000612901613a3b565b90508061290d84613acd565b60405160200161291e929190614cfe565b604051602081830303815290604052915050919050565b61293d612ea6565b73ffffffffffffffffffffffffffffffffffffffff1661295b611afe565b73ffffffffffffffffffffffffffffffffffffffff16146129b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a8906150e1565b60405180910390fd5b80600a8190555050565b6129c3612ea6565b73ffffffffffffffffffffffffffffffffffffffff166129e1611afe565b73ffffffffffffffffffffffffffffffffffffffff1614612a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2e906150e1565b60405180910390fd5b818190508484905014612a7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a76906150c1565b60405180910390fd5b60005b82829050811015612b39576106d7838383818110612aa357612aa26156b1565b5b9050602002013510158015612ad357506107d0838383818110612ac957612ac86156b1565b5b9050602002013511155b612adc57600080fd5b612b26858583818110612af257612af16156b1565b5b9050602002016020810190612b07919061430c565b848484818110612b1a57612b196156b1565b5b90506020020135613c2e565b8080612b31906155aa565b915050612a82565b5050505050565b60115481565b60105481565b600b60009054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612bfb612ea6565b73ffffffffffffffffffffffffffffffffffffffff16612c19611afe565b73ffffffffffffffffffffffffffffffffffffffff1614612c6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c66906150e1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612cdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd690614e81565b60405180910390fd5b612ce8816137ac565b50565b600a5481565b612cf9612ea6565b73ffffffffffffffffffffffffffffffffffffffff16612d17611afe565b73ffffffffffffffffffffffffffffffffffffffff1614612d6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d64906150e1565b60405180910390fd5b600b60009054906101000a900460ff16612d8657600080fd5b600c6000815480929190612d99906155aa565b91905055506000600b60006101000a81548160ff0219169083151502179055506002600c541415612dce576107d1600a819055505b565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612f218361146d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600b60029054906101000a900460ff1615612fb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fae906151c1565b60405180910390fd5b6000600c5411612ffc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff390614fc1565b60405180910390fd5b60001515600b60019054906101000a900460ff16151514613052576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304990615141565b60405180910390fd5b806013541015613097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308e90614f81565b60405180910390fd5b600060115411156131325760115481601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546130f09190615346565b1115613131576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161312890615181565b60405180910390fd5b5b600b60009054906101000a900460ff16156131915760155481111561318c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161318390614ea1565b60405180910390fd5b6132e5565b60145481601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600c548152602001908152602001600020546131f29190615346565b1115613233576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161322a90614f01565b60405180910390fd5b80601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600c54815260200190815260200160002060008282546132959190615346565b925050819055506132a533611c7e565b6132e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132db90614fa1565b60405180910390fd5b5b80601360008282546132f79190615427565b9250508190555080601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461334d9190615346565b9250508190555061335e3382613dfc565b50565b600061336c82612e3a565b6133ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133a290614f61565b60405180910390fd5b60006133b68361146d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061342557508373ffffffffffffffffffffffffffffffffffffffff1661340d84610f23565b73ffffffffffffffffffffffffffffffffffffffff16145b8061343657506134358185612b5f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661345f8261146d565b73ffffffffffffffffffffffffffffffffffffffff16146134b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ac90615121565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613525576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351c90614f21565b60405180910390fd5b613530838383613e43565b61353b600082612eae565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461358b9190615427565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546135e29190615346565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006136a68261146d565b90506136b481600084613e43565b6136bf600083612eae565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461370f9190615427565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156138e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138d890614f41565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516139d29190614de9565b60405180910390a3505050565b6139ea84848461343f565b6139f684848484613ea0565b613a35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a2c90614e61565b60405180910390fd5b50505050565b606060098054613a4a90615547565b80601f0160208091040260200160405190810160405280929190818152602001828054613a7690615547565b8015613ac35780601f10613a9857610100808354040283529160200191613ac3565b820191906000526020600020905b815481529060010190602001808311613aa657829003601f168201915b5050505050905090565b60606000821415613b15576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613c29565b600082905060005b60008214613b47578080613b30906155aa565b915050600a82613b40919061539c565b9150613b1d565b60008167ffffffffffffffff811115613b6357613b626156e0565b5b6040519080825280601f01601f191660200182016040528015613b955781602001600182028036833780820191505090505b5090505b60008514613c2257600182613bae9190615427565b9150600a85613bbd91906155f3565b6030613bc99190615346565b60f81b818381518110613bdf57613bde6156b1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613c1b919061539c565b9450613b99565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613c9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c9590615061565b60405180910390fd5b613ca781612e3a565b15613ce7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613cde90614ec1565b60405180910390fd5b613cf360008383613e43565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613d439190615346565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60005b81811015613e3e57613e1383600a54613c2e565b600a6000815480929190613e26906155aa565b91905055508080613e36906155aa565b915050613dff565b505050565b60006010541115613e9b57601054613e5a83611827565b10613e9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e9190614ee1565b60405180910390fd5b5b505050565b6000613ec18473ffffffffffffffffffffffffffffffffffffffff16614037565b1561402a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613eea612ea6565b8786866040518563ffffffff1660e01b8152600401613f0c9493929190614d74565b602060405180830381600087803b158015613f2657600080fd5b505af1925050508015613f5757506040513d601f19601f82011682018060405250810190613f5491906145aa565b60015b613fda573d8060008114613f87576040519150601f19603f3d011682016040523d82523d6000602084013e613f8c565b606091505b50600081511415613fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fc990614e61565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061402f565b600190505b949350505050565b600080823b905060008111915050919050565b82805461405690615547565b90600052602060002090601f01602090048101928261407857600085556140bf565b82601f1061409157805160ff19168380011785556140bf565b828001600101855582156140bf579182015b828111156140be5782518255916020019190600101906140a3565b5b5090506140cc91906140d0565b5090565b5b808211156140e95760008160009055506001016140d1565b5090565b60006141006140fb846152a1565b61527c565b90508281526020810184848401111561411c5761411b61571e565b5b614127848285615505565b509392505050565b600061414261413d846152d2565b61527c565b90508281526020810184848401111561415e5761415d61571e565b5b614169848285615505565b509392505050565b60008135905061418081615e75565b92915050565b60008083601f84011261419c5761419b615714565b5b8235905067ffffffffffffffff8111156141b9576141b861570f565b5b6020830191508360208202830111156141d5576141d4615719565b5b9250929050565b60008083601f8401126141f2576141f1615714565b5b8235905067ffffffffffffffff81111561420f5761420e61570f565b5b60208301915083602082028301111561422b5761422a615719565b5b9250929050565b60008135905061424181615e8c565b92915050565b60008151905061425681615e8c565b92915050565b60008135905061426b81615ea3565b92915050565b60008151905061428081615ea3565b92915050565b600082601f83011261429b5761429a615714565b5b81356142ab8482602086016140ed565b91505092915050565b600082601f8301126142c9576142c8615714565b5b81356142d984826020860161412f565b91505092915050565b6000813590506142f181615eba565b92915050565b60008151905061430681615eba565b92915050565b60006020828403121561432257614321615728565b5b600061433084828501614171565b91505092915050565b600080604083850312156143505761434f615728565b5b600061435e85828601614171565b925050602061436f85828601614171565b9150509250929050565b60008060006060848603121561439257614391615728565b5b60006143a086828701614171565b93505060206143b186828701614171565b92505060406143c2868287016142e2565b9150509250925092565b600080600080608085870312156143e6576143e5615728565b5b60006143f487828801614171565b945050602061440587828801614171565b9350506040614416878288016142e2565b925050606085013567ffffffffffffffff81111561443757614436615723565b5b61444387828801614286565b91505092959194509250565b6000806040838503121561446657614465615728565b5b600061447485828601614171565b925050602061448585828601614232565b9150509250929050565b600080604083850312156144a6576144a5615728565b5b60006144b485828601614171565b92505060206144c5858286016142e2565b9150509250929050565b600080600080604085870312156144e9576144e8615728565b5b600085013567ffffffffffffffff81111561450757614506615723565b5b61451387828801614186565b9450945050602085013567ffffffffffffffff81111561453657614535615723565b5b614542878288016141dc565b925092505092959194509250565b60006020828403121561456657614565615728565b5b600061457484828501614247565b91505092915050565b60006020828403121561459357614592615728565b5b60006145a18482850161425c565b91505092915050565b6000602082840312156145c0576145bf615728565b5b60006145ce84828501614271565b91505092915050565b6000602082840312156145ed576145ec615728565b5b600082013567ffffffffffffffff81111561460b5761460a615723565b5b614617848285016142b4565b91505092915050565b60006020828403121561463657614635615728565b5b6000614644848285016142e2565b91505092915050565b60006020828403121561466357614662615728565b5b6000614671848285016142f7565b91505092915050565b6000806040838503121561469157614690615728565b5b600061469f858286016142e2565b92505060206146b085828601614171565b9150509250929050565b600080600080608085870312156146d4576146d3615728565b5b60006146e2878288016142e2565b94505060206146f3878288016142e2565b9350506040614704878288016142e2565b9250506060614715878288016142e2565b91505092959194509250565b600080600080600060a0868803121561473d5761473c615728565b5b600061474b888289016142e2565b955050602061475c888289016142e2565b945050604061476d888289016142e2565b935050606061477e888289016142e2565b925050608061478f888289016142e2565b9150509295509295909350565b6147a58161545b565b82525050565b6147b48161546d565b82525050565b60006147c582615303565b6147cf8185615319565b93506147df818560208601615514565b6147e88161572d565b840191505092915050565b6147fc816154cf565b82525050565b600061480d8261530e565b614817818561532a565b9350614827818560208601615514565b6148308161572d565b840191505092915050565b60006148468261530e565b614850818561533b565b9350614860818560208601615514565b80840191505092915050565b600061487960138361532a565b91506148848261573e565b602082019050919050565b600061489c60328361532a565b91506148a782615767565b604082019050919050565b60006148bf60268361532a565b91506148ca826157b6565b604082019050919050565b60006148e2600f8361532a565b91506148ed82615805565b602082019050919050565b6000614905601c8361532a565b91506149108261582e565b602082019050919050565b600061492860178361532a565b915061493382615857565b602082019050919050565b600061494b600e8361532a565b915061495682615880565b602082019050919050565b600061496e60248361532a565b9150614979826158a9565b604082019050919050565b600061499160198361532a565b915061499c826158f8565b602082019050919050565b60006149b4602c8361532a565b91506149bf82615921565b604082019050919050565b60006149d7600f8361532a565b91506149e282615970565b602082019050919050565b60006149fa600c8361532a565b9150614a0582615999565b602082019050919050565b6000614a1d60108361532a565b9150614a28826159c2565b602082019050919050565b6000614a4060388361532a565b9150614a4b826159eb565b604082019050919050565b6000614a63602a8361532a565b9150614a6e82615a3a565b604082019050919050565b6000614a8660298361532a565b9150614a9182615a89565b604082019050919050565b6000614aa960138361532a565b9150614ab482615ad8565b602082019050919050565b6000614acc60208361532a565b9150614ad782615b01565b602082019050919050565b6000614aef60318361532a565b9150614afa82615b2a565b604082019050919050565b6000614b12602c8361532a565b9150614b1d82615b79565b604082019050919050565b6000614b35600a8361532a565b9150614b4082615bc8565b602082019050919050565b6000614b5860208361532a565b9150614b6382615bf1565b602082019050919050565b6000614b7b60118361532a565b9150614b8682615c1a565b602082019050919050565b6000614b9e60298361532a565b9150614ba982615c43565b604082019050919050565b6000614bc1600a8361532a565b9150614bcc82615c92565b602082019050919050565b6000614be460218361532a565b9150614bef82615cbb565b604082019050919050565b6000614c0760208361532a565b9150614c1282615d0a565b602082019050919050565b6000614c2a60108361532a565b9150614c3582615d33565b602082019050919050565b6000614c4d601b8361532a565b9150614c5882615d5c565b602082019050919050565b6000614c7060318361532a565b9150614c7b82615d85565b604082019050919050565b6000614c9360188361532a565b9150614c9e82615dd4565b602082019050919050565b6000614cb6601f8361532a565b9150614cc182615dfd565b602082019050919050565b6000614cd960308361532a565b9150614ce482615e26565b604082019050919050565b614cf8816154c5565b82525050565b6000614d0a828561483b565b9150614d16828461483b565b91508190509392505050565b6000602082019050614d37600083018461479c565b92915050565b6000606082019050614d52600083018661479c565b614d5f602083018561479c565b614d6c6040830184614cef565b949350505050565b6000608082019050614d89600083018761479c565b614d96602083018661479c565b614da36040830185614cef565b8181036060830152614db581846147ba565b905095945050505050565b6000604082019050614dd5600083018561479c565b614de26020830184614cef565b9392505050565b6000602082019050614dfe60008301846147ab565b92915050565b6000602082019050614e1960008301846147f3565b92915050565b60006020820190508181036000830152614e398184614802565b905092915050565b60006020820190508181036000830152614e5a8161486c565b9050919050565b60006020820190508181036000830152614e7a8161488f565b9050919050565b60006020820190508181036000830152614e9a816148b2565b9050919050565b60006020820190508181036000830152614eba816148d5565b9050919050565b60006020820190508181036000830152614eda816148f8565b9050919050565b60006020820190508181036000830152614efa8161491b565b9050919050565b60006020820190508181036000830152614f1a8161493e565b9050919050565b60006020820190508181036000830152614f3a81614961565b9050919050565b60006020820190508181036000830152614f5a81614984565b9050919050565b60006020820190508181036000830152614f7a816149a7565b9050919050565b60006020820190508181036000830152614f9a816149ca565b9050919050565b60006020820190508181036000830152614fba816149ed565b9050919050565b60006020820190508181036000830152614fda81614a10565b9050919050565b60006020820190508181036000830152614ffa81614a33565b9050919050565b6000602082019050818103600083015261501a81614a56565b9050919050565b6000602082019050818103600083015261503a81614a79565b9050919050565b6000602082019050818103600083015261505a81614a9c565b9050919050565b6000602082019050818103600083015261507a81614abf565b9050919050565b6000602082019050818103600083015261509a81614ae2565b9050919050565b600060208201905081810360008301526150ba81614b05565b9050919050565b600060208201905081810360008301526150da81614b28565b9050919050565b600060208201905081810360008301526150fa81614b4b565b9050919050565b6000602082019050818103600083015261511a81614b6e565b9050919050565b6000602082019050818103600083015261513a81614b91565b9050919050565b6000602082019050818103600083015261515a81614bb4565b9050919050565b6000602082019050818103600083015261517a81614bd7565b9050919050565b6000602082019050818103600083015261519a81614bfa565b9050919050565b600060208201905081810360008301526151ba81614c1d565b9050919050565b600060208201905081810360008301526151da81614c40565b9050919050565b600060208201905081810360008301526151fa81614c63565b9050919050565b6000602082019050818103600083015261521a81614c86565b9050919050565b6000602082019050818103600083015261523a81614ca9565b9050919050565b6000602082019050818103600083015261525a81614ccc565b9050919050565b60006020820190506152766000830184614cef565b92915050565b6000615286615297565b90506152928282615579565b919050565b6000604051905090565b600067ffffffffffffffff8211156152bc576152bb6156e0565b5b6152c58261572d565b9050602081019050919050565b600067ffffffffffffffff8211156152ed576152ec6156e0565b5b6152f68261572d565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000615351826154c5565b915061535c836154c5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561539157615390615624565b5b828201905092915050565b60006153a7826154c5565b91506153b2836154c5565b9250826153c2576153c1615653565b5b828204905092915050565b60006153d8826154c5565b91506153e3836154c5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561541c5761541b615624565b5b828202905092915050565b6000615432826154c5565b915061543d836154c5565b9250828210156154505761544f615624565b5b828203905092915050565b6000615466826154a5565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006154da826154e1565b9050919050565b60006154ec826154f3565b9050919050565b60006154fe826154a5565b9050919050565b82818337600083830152505050565b60005b83811015615532578082015181840152602081019050615517565b83811115615541576000848401525b50505050565b6000600282049050600182168061555f57607f821691505b6020821081141561557357615572615682565b5b50919050565b6155828261572d565b810181811067ffffffffffffffff821117156155a1576155a06156e0565b5b80604052505050565b60006155b5826154c5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156155e8576155e7615624565b5b600182019050919050565b60006155fe826154c5565b9150615609836154c5565b92508261561957615618615653565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e6f7468696e6720746f20776974686472617700000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f546f6f206d616e7920746f6b656e730000000000000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f526563656976657220686f6c647320746f6f206d616e79000000000000000000600082015250565b7f4c696d6974206578636565646564000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f537570706c792065786365656465640000000000000000000000000000000000600082015250565b7f4e6f7420656c696769626c650000000000000000000000000000000000000000600082015250565b7f53616c65206e6f74207374617274656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4574682076616c756520696e636f727265637400000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f426164206c656e67746800000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e6f7420617661696c61626c6520796574000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f53616c6520656e64656400000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e746564207065722077616c6c6574206c696d6974206578636565646564600082015250565b7f4f6e6c79205368617265686f6c64657200000000000000000000000000000000600082015250565b7f4d696e74696e672069732063757272656e746c79207061757365640000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f426c7562206d696e74206c696d69742065786365656465640000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b615e7e8161545b565b8114615e8957600080fd5b50565b615e958161546d565b8114615ea057600080fd5b50565b615eac81615479565b8114615eb757600080fd5b50565b615ec3816154c5565b8114615ece57600080fd5b5056fea264697066735822122040cb02925ba6bdae83f54d6611e66ced44bfcd898ade57348cd4db1232cf5de064736f6c63430008070033

Deployed Bytecode Sourcemap

178:11031:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1490:300:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;595:31:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2408:98:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3919:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3457:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1671:57:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8767:162;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;516:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1115:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1230:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1056:52;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4646:330:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;785:36:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5623:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1523:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4139:92;;;;;;;;;;;;;:::i;:::-;;5042:179:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;535:245:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1564:39:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;828:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3517:94;;;;;;;;;;;;;:::i;:::-;;956:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1735:59;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2111:235:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1470:23:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9002:433;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1279:70;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;341:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;382:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1849:205:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1661:101:11;;;;;;;;;;;;;:::i;:::-;;4362:109:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;558:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1010:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3352:86;;;;;;;;;;;;;:::i;:::-;;1356:78;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1029:85:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1610:54:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1168:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2570:102:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2682:126:2;;;;;;;;;;;;;:::i;:::-;;7182:359;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4539:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;661:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2459:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9525:785;;;;;;;;;;;;;:::i;:::-;;4203:153:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5287:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10401:805:2;;;;;;;;;;;;;:::i;:::-;;5024:488;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2883:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3962:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6756:357;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;912:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;866:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;478:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4422:162:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1911:198:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;443:28:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3669:230;;;;;;;;;;;;;:::i;:::-;;1490:300:4;1592:4;1642:25;1627:40;;;:11;:40;;;;:104;;;;1698:33;1683:48;;;:11;:48;;;;1627:104;:156;;;;1747:36;1771:11;1747:23;:36::i;:::-;1627:156;1608:175;;1490:300;;;:::o;595:31:2:-;;;;:::o;2408:98:4:-;2462:13;2494:5;2487:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2408:98;:::o;3919:217::-;3995:7;4022:16;4030:7;4022;:16::i;:::-;4014:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4105:15;:24;4121:7;4105:24;;;;;;;;;;;;;;;;;;;;;4098:31;;3919:217;;;:::o;3457:401::-;3537:13;3553:23;3568:7;3553:14;:23::i;:::-;3537:39;;3600:5;3594:11;;:2;:11;;;;3586:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3691:5;3675:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3700:37;3717:5;3724:12;:10;:12::i;:::-;3700:16;:37::i;:::-;3675:62;3654:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;3830:21;3839:2;3843:7;3830:8;:21::i;:::-;3527:331;3457:401;;:::o;1671:57:2:-;1726:2;1671:57;:::o;8767:162::-;8859:8;;8851:5;:16;;;;:::i;:::-;8838:9;:29;8830:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;8910:11;8915:5;8910:4;:11::i;:::-;8767:162;:::o;516:35::-;;;;;;;;;;;;;:::o;1115:46::-;;;;:::o;1230:42::-;;;;;;;;;;;;;;;;;:::o;1056:52::-;;;;:::o;4646:330:4:-;4835:41;4854:12;:10;:12::i;:::-;4868:7;4835:18;:41::i;:::-;4827:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;4941:28;4951:4;4957:2;4961:7;4941:9;:28::i;:::-;4646:330;;;:::o;785:36:2:-;;;;:::o;5623:411::-;1252:12:11;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5845:141:2::1;5865:18;5885:34;5921:27;5950:35;5845:19;:141::i;:::-;5997:29;:27;:29::i;:::-;5623:411:::0;;;;:::o;1523:34::-;;;;;;;;;;;;;:::o;4139:92::-;1252:12:11;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4213:10:2::1;;;;;;;;;;;4212:11;4199:10;;:24;;;;;;;;;;;;;;;;;;4139:92::o:0;5042:179:4:-;5175:39;5192:4;5198:2;5202:7;5175:39;;;;;;;;;;;;:16;:39::i;:::-;5042:179;;;:::o;535:245:5:-;653:41;672:12;:10;:12::i;:::-;686:7;653:18;:41::i;:::-;645:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;758:14;764:7;758:5;:14::i;:::-;535:245;:::o;1564:39:2:-;;;;;;;;;;;;;:::o;828:31::-;;;;:::o;3517:94::-;1252:12:11;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3599:4:2::1;3584:12;;:19;;;;;;;;;;;;;;;;;;3517:94::o:0;956:45::-;;;;:::o;1735:59::-;1792:2;1735:59;:::o;2111:235:4:-;2183:7;2202:13;2218:7;:16;2226:7;2218:16;;;;;;;;;;;;;;;;;;;;;2202:32;;2269:1;2252:19;;:5;:19;;;;2244:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2334:5;2327:12;;;2111:235;;;:::o;1470:23:2:-;;;;;;;;;;;;;:::o;9002:433::-;9083:1;9067:12;;:17;;9059:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;9185:34;;9176:5;9125:22;:34;9148:10;9125:34;;;;;;;;;;;;;;;:48;9160:12;;9125:48;;;;;;;;;;;;:56;;;;:::i;:::-;:94;;9117:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;9321:5;9269:22;:34;9292:10;9269:34;;;;;;;;;;;;;;;:48;9304:12;;9269:48;;;;;;;;;;;;:57;;;;;;;:::i;:::-;;;;;;;;9337:9;;;;;;;;;;;:22;;;9360:10;9380:4;9399:5;9387:9;;:17;;;;:::i;:::-;9337:68;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;9416:11;9421:5;9416:4;:11::i;:::-;9002:433;:::o;1279:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;341:34::-;;;;;;;;;;;;;:::o;382:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1849:205:4:-;1921:7;1965:1;1948:19;;:5;:19;;;;1940:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2031:9;:16;2041:5;2031:16;;;;;;;;;;;;;;;;2024:23;;1849:205;;;:::o;1661:101:11:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;4362:109:2:-;1252:12:11;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4456:6:2::1;4437:9;;:26;;;;;;;;;;;;;;;;;;4362:109:::0;:::o;558:30::-;;;;;;;;;;;;;:::o;1010:39::-;;;;:::o;3352:86::-;1252:12:11;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3426:4:2::1;3408:15;;:22;;;;;;;;;;;;;;;;;;3352:86::o:0;1356:78::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1029:85:11:-;1075:7;1101:6;;;;;;;;;;;1094:13;;1029:85;:::o;1610:54:2:-;1662:2;1610:54;:::o;1168:53::-;;;;:::o;2570:102:4:-;2626:13;2658:7;2651:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2570:102;:::o;2682:126:2:-;1252:12:11;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2762:5:2::1;2744:23;;:14;;;;;;;;;;;:23;;;2736:32;;;::::0;::::1;;2796:4;2779:14;;:21;;;;;;;;;;;;;;;;;;2682:126::o:0;7182:359::-;7249:4;7286:1;7270:12;;:17;7266:61;;;7311:4;7304:11;;;;7266:61;7373:1;7343:32;;7351:9;;;;;;;;;;;7343:32;;;7339:170;;7427:23;;7396:9;;;;;;;;;;;:19;;;7416:6;7396:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;7392:106;;7478:4;7471:11;;;;7392:106;7339:170;7528:5;7521:12;;7182:359;;;;:::o;4539:413::-;1252:12:11;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4741:9:2::1;4730:8;:20;;;;4773:10;4761:9;:22;;;;4814:18;4794:17;:38;;;;4864:19;4843:18;:40;;;;4920:24;4894:23;:50;;;;4539:413:::0;;;;;:::o;661:81::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2459:135::-;1252:12:11;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2555:5:2::1;2537:23;;:14;;;;;;;;;;;:23;;;2529:32;;;::::0;::::1;;2582:4;2572:7;:14;;;;;;;;;;;;:::i;:::-;;2459:135:::0;:::o;9525:785::-;1778:1:12;2376:7;;:19;;2368:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1778:1;2509:7;:18;;;;9603:19:2::1;;;;;;;;;;;9589:33;;:10;:33;;;:58;;;;9640:7;:5;:7::i;:::-;9626:21;;:10;:21;;;9589:58;:100;;;;9665:24;;;;;;;;;;;9651:38;;:10;:38;;;9589:100;9581:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;9723:15;9741:21;9723:39;;9791:1;9781:7;:11;9773:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;9829:29;9899:3;1662:2;9861:7;:35;;;;:::i;:::-;:41;;;;:::i;:::-;9829:73;;9913:32;9989:3;1726:2;9948:7;:38;;;;:::i;:::-;:44;;;;:::i;:::-;9913:79;;10003:34;10083:3;1792:2;10040:7;:40;;;;:::i;:::-;:46;;;;:::i;:::-;10003:83;;10107:7;:5;:7::i;:::-;10099:25;;:51;10125:24;10099:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;10169:19;;;;;;;;;;;10161:37;;:60;10199:21;10161:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;10240:24;;;;;;;;;;;10232:42;;:70;10275:26;10232:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;9570:740;;;;1734:1:12::0;2688:7;:22;;;;9525:785:2:o;4203:153:4:-;4297:52;4316:12;:10;:12::i;:::-;4330:8;4340;4297:18;:52::i;:::-;4203:153;;:::o;5287:320::-;5456:41;5475:12;:10;:12::i;:::-;5489:7;5456:18;:41::i;:::-;5448:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5561:39;5575:4;5581:2;5585:7;5594:5;5561:13;:39::i;:::-;5287:320;;;;:::o;10401:805:2:-;1778:1:12;2376:7;;:19;;2368:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1778:1;2509:7;:18;;;;10480:19:2::1;;;;;;;;;;;10466:33;;:10;:33;;;:58;;;;10517:7;:5;:7::i;:::-;10503:21;;:10;:21;;;10466:58;:100;;;;10542:24;;;;;;;;;;;10528:38;;:10;:38;;;10466:100;10458:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;10600:15;10618:9;;;;;;;;;;;:19;;;10646:4;10618:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10600:52;;10681:1;10671:7;:11;10663:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;10719:29;10789:3;1662:2;10751:7;:35;;;;:::i;:::-;:41;;;;:::i;:::-;10719:73;;10803:32;10879:3;1726:2;10838:7;:38;;;;:::i;:::-;:44;;;;:::i;:::-;10803:79;;10893:34;10973:3;1792:2;10930:7;:40;;;;:::i;:::-;:46;;;;:::i;:::-;10893:83;;10989:9;;;;;;;;;;;:18;;;11008:7;:5;:7::i;:::-;11017:24;10989:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;11053:9;;;;;;;;;;;:18;;;11072:19;;;;;;;;;;;11093:21;11053:62;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;11126:9;;;;;;;;;;;:18;;;11145:24;;;;;;;;;;;11171:26;11126:72;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;10447:759;;;;1734:1:12::0;2688:7;:22;;;;10401:805:2:o;5024:488::-;1252:12:11;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5255:18:2::1;5235:17;:38;;;;5320:34;5284:33;:70;;;;5394:27;5365:26;:56;;;;5469:35;5432:34;:72;;;;5024:488:::0;;;;:::o;2883:305::-;2956:13;2990:16;2998:7;2990;:16::i;:::-;2982:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;3081:18;3102:10;:8;:10::i;:::-;3081:31;;3154:4;3160:18;:7;:16;:18::i;:::-;3137:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3123:57;;;2883:305;;;:::o;3962:108::-;1252:12:11;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4052:10:2::1;4040:9;:22;;;;3962:108:::0;:::o;6756:357::-;1252:12:11;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6886:8:2::1;;:15;;6869:6;;:13;;:32;6861:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;6943:9;6938:168;6962:8;;:15;;6958:1;:19;6938:168;;;7022:4;7007:8;;7016:1;7007:11;;;;;;;:::i;:::-;;;;;;;;:19;;:42;;;;;7045:4;7030:8;;7039:1;7030:11;;;;;;;:::i;:::-;;;;;;;;:19;;7007:42;6999:51;;;::::0;::::1;;7065:29;7071:6;;7078:1;7071:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;7082:8;;7091:1;7082:11;;;;;;;:::i;:::-;;;;;;;;7065:5;:29::i;:::-;6979:3;;;;;:::i;:::-;;;;6938:168;;;;6756:357:::0;;;;:::o;912:37::-;;;;:::o;866:39::-;;;;:::o;478:31::-;;;;;;;;;;;;;:::o;4422:162:4:-;4519:4;4542:18;:25;4561:5;4542:25;;;;;;;;;;;;;;;:35;4568:8;4542:35;;;;;;;;;;;;;;;;;;;;;;;;;4535:42;;4422:162;;;;:::o;1911:198:11:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2019:1:::1;1999:22;;:8;:22;;;;1991:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;443:28:2:-;;;;:::o;3669:230::-;1252:12:11;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3744:12:2::1;;;;;;;;;;;3736:21;;;::::0;::::1;;3768:12;;:14;;;;;;;;;:::i;:::-;;;;;;3808:5;3793:12;;:20;;;;;;;;;;;;;;;;;;3846:1;3830:12;;:17;3826:66;;;3876:4;3864:9;:16;;;;3826:66;3669:230::o:0;829:155:3:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;7079:125:4:-;7144:4;7195:1;7167:30;;:7;:16;7175:7;7167:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7160:37;;7079:125;;;:::o;640:96:1:-;693:7;719:10;712:17;;640:96;:::o;10930:171:4:-;11031:2;11004:15;:24;11020:7;11004:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11086:7;11082:2;11048:46;;11057:23;11072:7;11057:14;:23::i;:::-;11048:46;;;;;;;;;;;;10930:171;;:::o;7636:1053:2:-;7694:10;;;;;;;;;;;7693:11;7685:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;7770:1;7755:12;;:16;7747:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;7830:5;7811:24;;:15;;;;;;;;;;;:24;;;7803:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;7892:5;7871:17;;:26;;7863:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;7955:1;7934:18;;:22;7930:148;;;8011:18;;8002:5;7981:6;:18;7988:10;7981:18;;;;;;;;;;;;;;;;:26;;;;:::i;:::-;:48;;7973:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;7930:148;8102:12;;;;;;;;;;;8098:457;;;8183:26;;8174:5;:35;;8166:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;8098:457;;;8353:33;;8344:5;8301:14;:26;8316:10;8301:26;;;;;;;;;;;;;;;:40;8328:12;;8301:40;;;;;;;;;;;;:48;;;;:::i;:::-;:85;;8293:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;8464:5;8420:14;:26;8435:10;8420:26;;;;;;;;;;;;;;;:40;8447:12;;8420:40;;;;;;;;;;;;:49;;;;;;;:::i;:::-;;;;;;;;8494:32;8515:10;8494:20;:32::i;:::-;8486:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;8098:457;8596:5;8575:17;;:26;;;;;;;:::i;:::-;;;;;;;;8634:5;8612:6;:18;8619:10;8612:18;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;8650:31;8663:10;8675:5;8650:12;:31::i;:::-;7636:1053;:::o;7362:344:4:-;7455:4;7479:16;7487:7;7479;:16::i;:::-;7471:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7554:13;7570:23;7585:7;7570:14;:23::i;:::-;7554:39;;7622:5;7611:16;;:7;:16;;;:51;;;;7655:7;7631:31;;:20;7643:7;7631:11;:20::i;:::-;:31;;;7611:51;:87;;;;7666:32;7683:5;7690:7;7666:16;:32::i;:::-;7611:87;7603:96;;;7362:344;;;;:::o;10259:560::-;10413:4;10386:31;;:23;10401:7;10386:14;:23::i;:::-;:31;;;10378:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10495:1;10481:16;;:2;:16;;;;10473:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10549:39;10570:4;10576:2;10580:7;10549:20;:39::i;:::-;10650:29;10667:1;10671:7;10650:8;:29::i;:::-;10709:1;10690:9;:15;10700:4;10690:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10737:1;10720:9;:13;10730:2;10720:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10767:2;10748:7;:16;10756:7;10748:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10804:7;10800:2;10785:27;;10794:4;10785:27;;;;;;;;;;;;10259:560;;;:::o;9587:348::-;9646:13;9662:23;9677:7;9662:14;:23::i;:::-;9646:39;;9696:48;9717:5;9732:1;9736:7;9696:20;:48::i;:::-;9782:29;9799:1;9803:7;9782:8;:29::i;:::-;9842:1;9822:9;:16;9832:5;9822:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;9860:7;:16;9868:7;9860:16;;;;;;;;;;;;9853:23;;;;;;;;;;;9920:7;9916:1;9892:36;;9901:5;9892:36;;;;;;;;;;;;9636:299;9587:348;:::o;2263:187:11:-;2336:16;2355:6;;;;;;;;;;;2336:25;;2380:8;2371:6;;:17;;;;;;;;;;;;;;;;;;2434:8;2403:40;;2424:8;2403:40;;;;;;;;;;;;2326:124;2263:187;:::o;11236:307:4:-;11386:8;11377:17;;:5;:17;;;;11369:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;11472:8;11434:18;:25;11453:5;11434:25;;;;;;;;;;;;;;;:35;11460:8;11434:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;11517:8;11495:41;;11510:5;11495:41;;;11527:8;11495:41;;;;;;:::i;:::-;;;;;;;;11236:307;;;:::o;6469:::-;6620:28;6630:4;6636:2;6640:7;6620:9;:28::i;:::-;6666:48;6689:4;6695:2;6699:7;6708:5;6666:22;:48::i;:::-;6658:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6469:307;;;;:::o;2274:100:2:-;2326:13;2359:7;2352:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2274:100;:::o;328:703:13:-;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;8998:372:4:-;9091:1;9077:16;;:2;:16;;;;9069:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9149:16;9157:7;9149;:16::i;:::-;9148:17;9140:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9209:45;9238:1;9242:2;9246:7;9209:20;:45::i;:::-;9282:1;9265:9;:13;9275:2;9265:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9312:2;9293:7;:16;9301:7;9293:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9355:7;9351:2;9330:33;;9347:1;9330:33;;;;;;;;;;;;8998:372;;:::o;6484:185:2:-;6558:9;6553:109;6577:5;6573:1;:9;6553:109;;;6604:20;6610:2;6614:9;;6604:5;:20::i;:::-;6639:9;;:11;;;;;;;;;:::i;:::-;;;;;;6584:3;;;;;:::i;:::-;;;;6553:109;;;;6484:185;;:::o;6094:232::-;6220:1;6200:17;;:21;6196:123;;;6262:17;;6246:13;6256:2;6246:9;:13::i;:::-;:33;6238:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;6196:123;6094:232;;;:::o;12096:778:4:-;12246:4;12266:15;:2;:13;;;:15::i;:::-;12262:606;;;12317:2;12301:36;;;12338:12;:10;:12::i;:::-;12352:4;12358:7;12367:5;12301:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12297:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12557:1;12540:6;:13;:18;12536:266;;;12582:60;;;;;;;;;;:::i;:::-;;;;;;;;12536:266;12754:6;12748:13;12739:6;12735:2;12731:15;12724:38;12297:519;12433:41;;;12423:51;;;:6;:51;;;;12416:58;;;;;12262:606;12853:4;12846:11;;12096:778;;;;;;;:::o;771:377:0:-;831:4;1034:12;1099:7;1087:20;1079:28;;1140:1;1133:4;:8;1126:15;;;771:377;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:14:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1594:::-;1667:8;1677:6;1727:3;1720:4;1712:6;1708:17;1704:27;1694:122;;1735:79;;:::i;:::-;1694:122;1848:6;1835:20;1825:30;;1878:18;1870:6;1867:30;1864:117;;;1900:79;;:::i;:::-;1864:117;2014:4;2006:6;2002:17;1990:29;;2068:3;2060:4;2052:6;2048:17;2038:8;2034:32;2031:41;2028:128;;;2075:79;;:::i;:::-;2028:128;1594:568;;;;;:::o;2168:133::-;2211:5;2249:6;2236:20;2227:29;;2265:30;2289:5;2265:30;:::i;:::-;2168:133;;;;:::o;2307:137::-;2361:5;2392:6;2386:13;2377:22;;2408:30;2432:5;2408:30;:::i;:::-;2307:137;;;;:::o;2450:::-;2495:5;2533:6;2520:20;2511:29;;2549:32;2575:5;2549:32;:::i;:::-;2450:137;;;;:::o;2593:141::-;2649:5;2680:6;2674:13;2665:22;;2696:32;2722:5;2696:32;:::i;:::-;2593:141;;;;:::o;2753:338::-;2808:5;2857:3;2850:4;2842:6;2838:17;2834:27;2824:122;;2865:79;;:::i;:::-;2824:122;2982:6;2969:20;3007:78;3081:3;3073:6;3066:4;3058:6;3054:17;3007:78;:::i;:::-;2998:87;;2814:277;2753:338;;;;:::o;3111:340::-;3167:5;3216:3;3209:4;3201:6;3197:17;3193:27;3183:122;;3224:79;;:::i;:::-;3183:122;3341:6;3328:20;3366:79;3441:3;3433:6;3426:4;3418:6;3414:17;3366:79;:::i;:::-;3357:88;;3173:278;3111:340;;;;:::o;3457:139::-;3503:5;3541:6;3528:20;3519:29;;3557:33;3584:5;3557:33;:::i;:::-;3457:139;;;;:::o;3602:143::-;3659:5;3690:6;3684:13;3675:22;;3706:33;3733:5;3706:33;:::i;:::-;3602:143;;;;:::o;3751:329::-;3810:6;3859:2;3847:9;3838:7;3834:23;3830:32;3827:119;;;3865:79;;:::i;:::-;3827:119;3985:1;4010:53;4055:7;4046:6;4035:9;4031:22;4010:53;:::i;:::-;4000:63;;3956:117;3751:329;;;;:::o;4086:474::-;4154:6;4162;4211:2;4199:9;4190:7;4186:23;4182:32;4179:119;;;4217:79;;:::i;:::-;4179:119;4337:1;4362:53;4407:7;4398:6;4387:9;4383:22;4362:53;:::i;:::-;4352:63;;4308:117;4464:2;4490:53;4535:7;4526:6;4515:9;4511:22;4490:53;:::i;:::-;4480:63;;4435:118;4086:474;;;;;:::o;4566:619::-;4643:6;4651;4659;4708:2;4696:9;4687:7;4683:23;4679:32;4676:119;;;4714:79;;:::i;:::-;4676:119;4834:1;4859:53;4904:7;4895:6;4884:9;4880:22;4859:53;:::i;:::-;4849:63;;4805:117;4961:2;4987:53;5032:7;5023:6;5012:9;5008:22;4987:53;:::i;:::-;4977:63;;4932:118;5089:2;5115:53;5160:7;5151:6;5140:9;5136:22;5115:53;:::i;:::-;5105:63;;5060:118;4566:619;;;;;:::o;5191:943::-;5286:6;5294;5302;5310;5359:3;5347:9;5338:7;5334:23;5330:33;5327:120;;;5366:79;;:::i;:::-;5327:120;5486:1;5511:53;5556:7;5547:6;5536:9;5532:22;5511:53;:::i;:::-;5501:63;;5457:117;5613:2;5639:53;5684:7;5675:6;5664:9;5660:22;5639:53;:::i;:::-;5629:63;;5584:118;5741:2;5767:53;5812:7;5803:6;5792:9;5788:22;5767:53;:::i;:::-;5757:63;;5712:118;5897:2;5886:9;5882:18;5869:32;5928:18;5920:6;5917:30;5914:117;;;5950:79;;:::i;:::-;5914:117;6055:62;6109:7;6100:6;6089:9;6085:22;6055:62;:::i;:::-;6045:72;;5840:287;5191:943;;;;;;;:::o;6140:468::-;6205:6;6213;6262:2;6250:9;6241:7;6237:23;6233:32;6230:119;;;6268:79;;:::i;:::-;6230:119;6388:1;6413:53;6458:7;6449:6;6438:9;6434:22;6413:53;:::i;:::-;6403:63;;6359:117;6515:2;6541:50;6583:7;6574:6;6563:9;6559:22;6541:50;:::i;:::-;6531:60;;6486:115;6140:468;;;;;:::o;6614:474::-;6682:6;6690;6739:2;6727:9;6718:7;6714:23;6710:32;6707:119;;;6745:79;;:::i;:::-;6707:119;6865:1;6890:53;6935:7;6926:6;6915:9;6911:22;6890:53;:::i;:::-;6880:63;;6836:117;6992:2;7018:53;7063:7;7054:6;7043:9;7039:22;7018:53;:::i;:::-;7008:63;;6963:118;6614:474;;;;;:::o;7094:934::-;7216:6;7224;7232;7240;7289:2;7277:9;7268:7;7264:23;7260:32;7257:119;;;7295:79;;:::i;:::-;7257:119;7443:1;7432:9;7428:17;7415:31;7473:18;7465:6;7462:30;7459:117;;;7495:79;;:::i;:::-;7459:117;7608:80;7680:7;7671:6;7660:9;7656:22;7608:80;:::i;:::-;7590:98;;;;7386:312;7765:2;7754:9;7750:18;7737:32;7796:18;7788:6;7785:30;7782:117;;;7818:79;;:::i;:::-;7782:117;7931:80;8003:7;7994:6;7983:9;7979:22;7931:80;:::i;:::-;7913:98;;;;7708:313;7094:934;;;;;;;:::o;8034:345::-;8101:6;8150:2;8138:9;8129:7;8125:23;8121:32;8118:119;;;8156:79;;:::i;:::-;8118:119;8276:1;8301:61;8354:7;8345:6;8334:9;8330:22;8301:61;:::i;:::-;8291:71;;8247:125;8034:345;;;;:::o;8385:327::-;8443:6;8492:2;8480:9;8471:7;8467:23;8463:32;8460:119;;;8498:79;;:::i;:::-;8460:119;8618:1;8643:52;8687:7;8678:6;8667:9;8663:22;8643:52;:::i;:::-;8633:62;;8589:116;8385:327;;;;:::o;8718:349::-;8787:6;8836:2;8824:9;8815:7;8811:23;8807:32;8804:119;;;8842:79;;:::i;:::-;8804:119;8962:1;8987:63;9042:7;9033:6;9022:9;9018:22;8987:63;:::i;:::-;8977:73;;8933:127;8718:349;;;;:::o;9073:509::-;9142:6;9191:2;9179:9;9170:7;9166:23;9162:32;9159:119;;;9197:79;;:::i;:::-;9159:119;9345:1;9334:9;9330:17;9317:31;9375:18;9367:6;9364:30;9361:117;;;9397:79;;:::i;:::-;9361:117;9502:63;9557:7;9548:6;9537:9;9533:22;9502:63;:::i;:::-;9492:73;;9288:287;9073:509;;;;:::o;9588:329::-;9647:6;9696:2;9684:9;9675:7;9671:23;9667:32;9664:119;;;9702:79;;:::i;:::-;9664:119;9822:1;9847:53;9892:7;9883:6;9872:9;9868:22;9847:53;:::i;:::-;9837:63;;9793:117;9588:329;;;;:::o;9923:351::-;9993:6;10042:2;10030:9;10021:7;10017:23;10013:32;10010:119;;;10048:79;;:::i;:::-;10010:119;10168:1;10193:64;10249:7;10240:6;10229:9;10225:22;10193:64;:::i;:::-;10183:74;;10139:128;9923:351;;;;:::o;10280:474::-;10348:6;10356;10405:2;10393:9;10384:7;10380:23;10376:32;10373:119;;;10411:79;;:::i;:::-;10373:119;10531:1;10556:53;10601:7;10592:6;10581:9;10577:22;10556:53;:::i;:::-;10546:63;;10502:117;10658:2;10684:53;10729:7;10720:6;10709:9;10705:22;10684:53;:::i;:::-;10674:63;;10629:118;10280:474;;;;;:::o;10760:765::-;10846:6;10854;10862;10870;10919:3;10907:9;10898:7;10894:23;10890:33;10887:120;;;10926:79;;:::i;:::-;10887:120;11046:1;11071:53;11116:7;11107:6;11096:9;11092:22;11071:53;:::i;:::-;11061:63;;11017:117;11173:2;11199:53;11244:7;11235:6;11224:9;11220:22;11199:53;:::i;:::-;11189:63;;11144:118;11301:2;11327:53;11372:7;11363:6;11352:9;11348:22;11327:53;:::i;:::-;11317:63;;11272:118;11429:2;11455:53;11500:7;11491:6;11480:9;11476:22;11455:53;:::i;:::-;11445:63;;11400:118;10760:765;;;;;;;:::o;11531:911::-;11626:6;11634;11642;11650;11658;11707:3;11695:9;11686:7;11682:23;11678:33;11675:120;;;11714:79;;:::i;:::-;11675:120;11834:1;11859:53;11904:7;11895:6;11884:9;11880:22;11859:53;:::i;:::-;11849:63;;11805:117;11961:2;11987:53;12032:7;12023:6;12012:9;12008:22;11987:53;:::i;:::-;11977:63;;11932:118;12089:2;12115:53;12160:7;12151:6;12140:9;12136:22;12115:53;:::i;:::-;12105:63;;12060:118;12217:2;12243:53;12288:7;12279:6;12268:9;12264:22;12243:53;:::i;:::-;12233:63;;12188:118;12345:3;12372:53;12417:7;12408:6;12397:9;12393:22;12372:53;:::i;:::-;12362:63;;12316:119;11531:911;;;;;;;;:::o;12448:118::-;12535:24;12553:5;12535:24;:::i;:::-;12530:3;12523:37;12448:118;;:::o;12572:109::-;12653:21;12668:5;12653:21;:::i;:::-;12648:3;12641:34;12572:109;;:::o;12687:360::-;12773:3;12801:38;12833:5;12801:38;:::i;:::-;12855:70;12918:6;12913:3;12855:70;:::i;:::-;12848:77;;12934:52;12979:6;12974:3;12967:4;12960:5;12956:16;12934:52;:::i;:::-;13011:29;13033:6;13011:29;:::i;:::-;13006:3;13002:39;12995:46;;12777:270;12687:360;;;;:::o;13053:161::-;13155:52;13201:5;13155:52;:::i;:::-;13150:3;13143:65;13053:161;;:::o;13220:364::-;13308:3;13336:39;13369:5;13336:39;:::i;:::-;13391:71;13455:6;13450:3;13391:71;:::i;:::-;13384:78;;13471:52;13516:6;13511:3;13504:4;13497:5;13493:16;13471:52;:::i;:::-;13548:29;13570:6;13548:29;:::i;:::-;13543:3;13539:39;13532:46;;13312:272;13220:364;;;;:::o;13590:377::-;13696:3;13724:39;13757:5;13724:39;:::i;:::-;13779:89;13861:6;13856:3;13779:89;:::i;:::-;13772:96;;13877:52;13922:6;13917:3;13910:4;13903:5;13899:16;13877:52;:::i;:::-;13954:6;13949:3;13945:16;13938:23;;13700:267;13590:377;;;;:::o;13973:366::-;14115:3;14136:67;14200:2;14195:3;14136:67;:::i;:::-;14129:74;;14212:93;14301:3;14212:93;:::i;:::-;14330:2;14325:3;14321:12;14314:19;;13973:366;;;:::o;14345:::-;14487:3;14508:67;14572:2;14567:3;14508:67;:::i;:::-;14501:74;;14584:93;14673:3;14584:93;:::i;:::-;14702:2;14697:3;14693:12;14686:19;;14345:366;;;:::o;14717:::-;14859:3;14880:67;14944:2;14939:3;14880:67;:::i;:::-;14873:74;;14956:93;15045:3;14956:93;:::i;:::-;15074:2;15069:3;15065:12;15058:19;;14717:366;;;:::o;15089:::-;15231:3;15252:67;15316:2;15311:3;15252:67;:::i;:::-;15245:74;;15328:93;15417:3;15328:93;:::i;:::-;15446:2;15441:3;15437:12;15430:19;;15089:366;;;:::o;15461:::-;15603:3;15624:67;15688:2;15683:3;15624:67;:::i;:::-;15617:74;;15700:93;15789:3;15700:93;:::i;:::-;15818:2;15813:3;15809:12;15802:19;;15461:366;;;:::o;15833:::-;15975:3;15996:67;16060:2;16055:3;15996:67;:::i;:::-;15989:74;;16072:93;16161:3;16072:93;:::i;:::-;16190:2;16185:3;16181:12;16174:19;;15833:366;;;:::o;16205:::-;16347:3;16368:67;16432:2;16427:3;16368:67;:::i;:::-;16361:74;;16444:93;16533:3;16444:93;:::i;:::-;16562:2;16557:3;16553:12;16546:19;;16205:366;;;:::o;16577:::-;16719:3;16740:67;16804:2;16799:3;16740:67;:::i;:::-;16733:74;;16816:93;16905:3;16816:93;:::i;:::-;16934:2;16929:3;16925:12;16918:19;;16577:366;;;:::o;16949:::-;17091:3;17112:67;17176:2;17171:3;17112:67;:::i;:::-;17105:74;;17188:93;17277:3;17188:93;:::i;:::-;17306:2;17301:3;17297:12;17290:19;;16949:366;;;:::o;17321:::-;17463:3;17484:67;17548:2;17543:3;17484:67;:::i;:::-;17477:74;;17560:93;17649:3;17560:93;:::i;:::-;17678:2;17673:3;17669:12;17662:19;;17321:366;;;:::o;17693:::-;17835:3;17856:67;17920:2;17915:3;17856:67;:::i;:::-;17849:74;;17932:93;18021:3;17932:93;:::i;:::-;18050:2;18045:3;18041:12;18034:19;;17693:366;;;:::o;18065:::-;18207:3;18228:67;18292:2;18287:3;18228:67;:::i;:::-;18221:74;;18304:93;18393:3;18304:93;:::i;:::-;18422:2;18417:3;18413:12;18406:19;;18065:366;;;:::o;18437:::-;18579:3;18600:67;18664:2;18659:3;18600:67;:::i;:::-;18593:74;;18676:93;18765:3;18676:93;:::i;:::-;18794:2;18789:3;18785:12;18778:19;;18437:366;;;:::o;18809:::-;18951:3;18972:67;19036:2;19031:3;18972:67;:::i;:::-;18965:74;;19048:93;19137:3;19048:93;:::i;:::-;19166:2;19161:3;19157:12;19150:19;;18809:366;;;:::o;19181:::-;19323:3;19344:67;19408:2;19403:3;19344:67;:::i;:::-;19337:74;;19420:93;19509:3;19420:93;:::i;:::-;19538:2;19533:3;19529:12;19522:19;;19181:366;;;:::o;19553:::-;19695:3;19716:67;19780:2;19775:3;19716:67;:::i;:::-;19709:74;;19792:93;19881:3;19792:93;:::i;:::-;19910:2;19905:3;19901:12;19894:19;;19553:366;;;:::o;19925:::-;20067:3;20088:67;20152:2;20147:3;20088:67;:::i;:::-;20081:74;;20164:93;20253:3;20164:93;:::i;:::-;20282:2;20277:3;20273:12;20266:19;;19925:366;;;:::o;20297:::-;20439:3;20460:67;20524:2;20519:3;20460:67;:::i;:::-;20453:74;;20536:93;20625:3;20536:93;:::i;:::-;20654:2;20649:3;20645:12;20638:19;;20297:366;;;:::o;20669:::-;20811:3;20832:67;20896:2;20891:3;20832:67;:::i;:::-;20825:74;;20908:93;20997:3;20908:93;:::i;:::-;21026:2;21021:3;21017:12;21010:19;;20669:366;;;:::o;21041:::-;21183:3;21204:67;21268:2;21263:3;21204:67;:::i;:::-;21197:74;;21280:93;21369:3;21280:93;:::i;:::-;21398:2;21393:3;21389:12;21382:19;;21041:366;;;:::o;21413:::-;21555:3;21576:67;21640:2;21635:3;21576:67;:::i;:::-;21569:74;;21652:93;21741:3;21652:93;:::i;:::-;21770:2;21765:3;21761:12;21754:19;;21413:366;;;:::o;21785:::-;21927:3;21948:67;22012:2;22007:3;21948:67;:::i;:::-;21941:74;;22024:93;22113:3;22024:93;:::i;:::-;22142:2;22137:3;22133:12;22126:19;;21785:366;;;:::o;22157:::-;22299:3;22320:67;22384:2;22379:3;22320:67;:::i;:::-;22313:74;;22396:93;22485:3;22396:93;:::i;:::-;22514:2;22509:3;22505:12;22498:19;;22157:366;;;:::o;22529:::-;22671:3;22692:67;22756:2;22751:3;22692:67;:::i;:::-;22685:74;;22768:93;22857:3;22768:93;:::i;:::-;22886:2;22881:3;22877:12;22870:19;;22529:366;;;:::o;22901:::-;23043:3;23064:67;23128:2;23123:3;23064:67;:::i;:::-;23057:74;;23140:93;23229:3;23140:93;:::i;:::-;23258:2;23253:3;23249:12;23242:19;;22901:366;;;:::o;23273:::-;23415:3;23436:67;23500:2;23495:3;23436:67;:::i;:::-;23429:74;;23512:93;23601:3;23512:93;:::i;:::-;23630:2;23625:3;23621:12;23614:19;;23273:366;;;:::o;23645:::-;23787:3;23808:67;23872:2;23867:3;23808:67;:::i;:::-;23801:74;;23884:93;23973:3;23884:93;:::i;:::-;24002:2;23997:3;23993:12;23986:19;;23645:366;;;:::o;24017:::-;24159:3;24180:67;24244:2;24239:3;24180:67;:::i;:::-;24173:74;;24256:93;24345:3;24256:93;:::i;:::-;24374:2;24369:3;24365:12;24358:19;;24017:366;;;:::o;24389:::-;24531:3;24552:67;24616:2;24611:3;24552:67;:::i;:::-;24545:74;;24628:93;24717:3;24628:93;:::i;:::-;24746:2;24741:3;24737:12;24730:19;;24389:366;;;:::o;24761:::-;24903:3;24924:67;24988:2;24983:3;24924:67;:::i;:::-;24917:74;;25000:93;25089:3;25000:93;:::i;:::-;25118:2;25113:3;25109:12;25102:19;;24761:366;;;:::o;25133:::-;25275:3;25296:67;25360:2;25355:3;25296:67;:::i;:::-;25289:74;;25372:93;25461:3;25372:93;:::i;:::-;25490:2;25485:3;25481:12;25474:19;;25133:366;;;:::o;25505:::-;25647:3;25668:67;25732:2;25727:3;25668:67;:::i;:::-;25661:74;;25744:93;25833:3;25744:93;:::i;:::-;25862:2;25857:3;25853:12;25846:19;;25505:366;;;:::o;25877:::-;26019:3;26040:67;26104:2;26099:3;26040:67;:::i;:::-;26033:74;;26116:93;26205:3;26116:93;:::i;:::-;26234:2;26229:3;26225:12;26218:19;;25877:366;;;:::o;26249:118::-;26336:24;26354:5;26336:24;:::i;:::-;26331:3;26324:37;26249:118;;:::o;26373:435::-;26553:3;26575:95;26666:3;26657:6;26575:95;:::i;:::-;26568:102;;26687:95;26778:3;26769:6;26687:95;:::i;:::-;26680:102;;26799:3;26792:10;;26373:435;;;;;:::o;26814:222::-;26907:4;26945:2;26934:9;26930:18;26922:26;;26958:71;27026:1;27015:9;27011:17;27002:6;26958:71;:::i;:::-;26814:222;;;;:::o;27042:442::-;27191:4;27229:2;27218:9;27214:18;27206:26;;27242:71;27310:1;27299:9;27295:17;27286:6;27242:71;:::i;:::-;27323:72;27391:2;27380:9;27376:18;27367:6;27323:72;:::i;:::-;27405;27473:2;27462:9;27458:18;27449:6;27405:72;:::i;:::-;27042:442;;;;;;:::o;27490:640::-;27685:4;27723:3;27712:9;27708:19;27700:27;;27737:71;27805:1;27794:9;27790:17;27781:6;27737:71;:::i;:::-;27818:72;27886:2;27875:9;27871:18;27862:6;27818:72;:::i;:::-;27900;27968:2;27957:9;27953:18;27944:6;27900:72;:::i;:::-;28019:9;28013:4;28009:20;28004:2;27993:9;27989:18;27982:48;28047:76;28118:4;28109:6;28047:76;:::i;:::-;28039:84;;27490:640;;;;;;;:::o;28136:332::-;28257:4;28295:2;28284:9;28280:18;28272:26;;28308:71;28376:1;28365:9;28361:17;28352:6;28308:71;:::i;:::-;28389:72;28457:2;28446:9;28442:18;28433:6;28389:72;:::i;:::-;28136:332;;;;;:::o;28474:210::-;28561:4;28599:2;28588:9;28584:18;28576:26;;28612:65;28674:1;28663:9;28659:17;28650:6;28612:65;:::i;:::-;28474:210;;;;:::o;28690:252::-;28798:4;28836:2;28825:9;28821:18;28813:26;;28849:86;28932:1;28921:9;28917:17;28908:6;28849:86;:::i;:::-;28690:252;;;;:::o;28948:313::-;29061:4;29099:2;29088:9;29084:18;29076:26;;29148:9;29142:4;29138:20;29134:1;29123:9;29119:17;29112:47;29176:78;29249:4;29240:6;29176:78;:::i;:::-;29168:86;;28948:313;;;;:::o;29267:419::-;29433:4;29471:2;29460:9;29456:18;29448:26;;29520:9;29514:4;29510:20;29506:1;29495:9;29491:17;29484:47;29548:131;29674:4;29548:131;:::i;:::-;29540:139;;29267:419;;;:::o;29692:::-;29858:4;29896:2;29885:9;29881:18;29873:26;;29945:9;29939:4;29935:20;29931:1;29920:9;29916:17;29909:47;29973:131;30099:4;29973:131;:::i;:::-;29965:139;;29692:419;;;:::o;30117:::-;30283:4;30321:2;30310:9;30306:18;30298:26;;30370:9;30364:4;30360:20;30356:1;30345:9;30341:17;30334:47;30398:131;30524:4;30398:131;:::i;:::-;30390:139;;30117:419;;;:::o;30542:::-;30708:4;30746:2;30735:9;30731:18;30723:26;;30795:9;30789:4;30785:20;30781:1;30770:9;30766:17;30759:47;30823:131;30949:4;30823:131;:::i;:::-;30815:139;;30542:419;;;:::o;30967:::-;31133:4;31171:2;31160:9;31156:18;31148:26;;31220:9;31214:4;31210:20;31206:1;31195:9;31191:17;31184:47;31248:131;31374:4;31248:131;:::i;:::-;31240:139;;30967:419;;;:::o;31392:::-;31558:4;31596:2;31585:9;31581:18;31573:26;;31645:9;31639:4;31635:20;31631:1;31620:9;31616:17;31609:47;31673:131;31799:4;31673:131;:::i;:::-;31665:139;;31392:419;;;:::o;31817:::-;31983:4;32021:2;32010:9;32006:18;31998:26;;32070:9;32064:4;32060:20;32056:1;32045:9;32041:17;32034:47;32098:131;32224:4;32098:131;:::i;:::-;32090:139;;31817:419;;;:::o;32242:::-;32408:4;32446:2;32435:9;32431:18;32423:26;;32495:9;32489:4;32485:20;32481:1;32470:9;32466:17;32459:47;32523:131;32649:4;32523:131;:::i;:::-;32515:139;;32242:419;;;:::o;32667:::-;32833:4;32871:2;32860:9;32856:18;32848:26;;32920:9;32914:4;32910:20;32906:1;32895:9;32891:17;32884:47;32948:131;33074:4;32948:131;:::i;:::-;32940:139;;32667:419;;;:::o;33092:::-;33258:4;33296:2;33285:9;33281:18;33273:26;;33345:9;33339:4;33335:20;33331:1;33320:9;33316:17;33309:47;33373:131;33499:4;33373:131;:::i;:::-;33365:139;;33092:419;;;:::o;33517:::-;33683:4;33721:2;33710:9;33706:18;33698:26;;33770:9;33764:4;33760:20;33756:1;33745:9;33741:17;33734:47;33798:131;33924:4;33798:131;:::i;:::-;33790:139;;33517:419;;;:::o;33942:::-;34108:4;34146:2;34135:9;34131:18;34123:26;;34195:9;34189:4;34185:20;34181:1;34170:9;34166:17;34159:47;34223:131;34349:4;34223:131;:::i;:::-;34215:139;;33942:419;;;:::o;34367:::-;34533:4;34571:2;34560:9;34556:18;34548:26;;34620:9;34614:4;34610:20;34606:1;34595:9;34591:17;34584:47;34648:131;34774:4;34648:131;:::i;:::-;34640:139;;34367:419;;;:::o;34792:::-;34958:4;34996:2;34985:9;34981:18;34973:26;;35045:9;35039:4;35035:20;35031:1;35020:9;35016:17;35009:47;35073:131;35199:4;35073:131;:::i;:::-;35065:139;;34792:419;;;:::o;35217:::-;35383:4;35421:2;35410:9;35406:18;35398:26;;35470:9;35464:4;35460:20;35456:1;35445:9;35441:17;35434:47;35498:131;35624:4;35498:131;:::i;:::-;35490:139;;35217:419;;;:::o;35642:::-;35808:4;35846:2;35835:9;35831:18;35823:26;;35895:9;35889:4;35885:20;35881:1;35870:9;35866:17;35859:47;35923:131;36049:4;35923:131;:::i;:::-;35915:139;;35642:419;;;:::o;36067:::-;36233:4;36271:2;36260:9;36256:18;36248:26;;36320:9;36314:4;36310:20;36306:1;36295:9;36291:17;36284:47;36348:131;36474:4;36348:131;:::i;:::-;36340:139;;36067:419;;;:::o;36492:::-;36658:4;36696:2;36685:9;36681:18;36673:26;;36745:9;36739:4;36735:20;36731:1;36720:9;36716:17;36709:47;36773:131;36899:4;36773:131;:::i;:::-;36765:139;;36492:419;;;:::o;36917:::-;37083:4;37121:2;37110:9;37106:18;37098:26;;37170:9;37164:4;37160:20;37156:1;37145:9;37141:17;37134:47;37198:131;37324:4;37198:131;:::i;:::-;37190:139;;36917:419;;;:::o;37342:::-;37508:4;37546:2;37535:9;37531:18;37523:26;;37595:9;37589:4;37585:20;37581:1;37570:9;37566:17;37559:47;37623:131;37749:4;37623:131;:::i;:::-;37615:139;;37342:419;;;:::o;37767:::-;37933:4;37971:2;37960:9;37956:18;37948:26;;38020:9;38014:4;38010:20;38006:1;37995:9;37991:17;37984:47;38048:131;38174:4;38048:131;:::i;:::-;38040:139;;37767:419;;;:::o;38192:::-;38358:4;38396:2;38385:9;38381:18;38373:26;;38445:9;38439:4;38435:20;38431:1;38420:9;38416:17;38409:47;38473:131;38599:4;38473:131;:::i;:::-;38465:139;;38192:419;;;:::o;38617:::-;38783:4;38821:2;38810:9;38806:18;38798:26;;38870:9;38864:4;38860:20;38856:1;38845:9;38841:17;38834:47;38898:131;39024:4;38898:131;:::i;:::-;38890:139;;38617:419;;;:::o;39042:::-;39208:4;39246:2;39235:9;39231:18;39223:26;;39295:9;39289:4;39285:20;39281:1;39270:9;39266:17;39259:47;39323:131;39449:4;39323:131;:::i;:::-;39315:139;;39042:419;;;:::o;39467:::-;39633:4;39671:2;39660:9;39656:18;39648:26;;39720:9;39714:4;39710:20;39706:1;39695:9;39691:17;39684:47;39748:131;39874:4;39748:131;:::i;:::-;39740:139;;39467:419;;;:::o;39892:::-;40058:4;40096:2;40085:9;40081:18;40073:26;;40145:9;40139:4;40135:20;40131:1;40120:9;40116:17;40109:47;40173:131;40299:4;40173:131;:::i;:::-;40165:139;;39892:419;;;:::o;40317:::-;40483:4;40521:2;40510:9;40506:18;40498:26;;40570:9;40564:4;40560:20;40556:1;40545:9;40541:17;40534:47;40598:131;40724:4;40598:131;:::i;:::-;40590:139;;40317:419;;;:::o;40742:::-;40908:4;40946:2;40935:9;40931:18;40923:26;;40995:9;40989:4;40985:20;40981:1;40970:9;40966:17;40959:47;41023:131;41149:4;41023:131;:::i;:::-;41015:139;;40742:419;;;:::o;41167:::-;41333:4;41371:2;41360:9;41356:18;41348:26;;41420:9;41414:4;41410:20;41406:1;41395:9;41391:17;41384:47;41448:131;41574:4;41448:131;:::i;:::-;41440:139;;41167:419;;;:::o;41592:::-;41758:4;41796:2;41785:9;41781:18;41773:26;;41845:9;41839:4;41835:20;41831:1;41820:9;41816:17;41809:47;41873:131;41999:4;41873:131;:::i;:::-;41865:139;;41592:419;;;:::o;42017:::-;42183:4;42221:2;42210:9;42206:18;42198:26;;42270:9;42264:4;42260:20;42256:1;42245:9;42241:17;42234:47;42298:131;42424:4;42298:131;:::i;:::-;42290:139;;42017:419;;;:::o;42442:::-;42608:4;42646:2;42635:9;42631:18;42623:26;;42695:9;42689:4;42685:20;42681:1;42670:9;42666:17;42659:47;42723:131;42849:4;42723:131;:::i;:::-;42715:139;;42442:419;;;:::o;42867:::-;43033:4;43071:2;43060:9;43056:18;43048:26;;43120:9;43114:4;43110:20;43106:1;43095:9;43091:17;43084:47;43148:131;43274:4;43148:131;:::i;:::-;43140:139;;42867:419;;;:::o;43292:222::-;43385:4;43423:2;43412:9;43408:18;43400:26;;43436:71;43504:1;43493:9;43489:17;43480:6;43436:71;:::i;:::-;43292:222;;;;:::o;43520:129::-;43554:6;43581:20;;:::i;:::-;43571:30;;43610:33;43638:4;43630:6;43610:33;:::i;:::-;43520:129;;;:::o;43655:75::-;43688:6;43721:2;43715:9;43705:19;;43655:75;:::o;43736:307::-;43797:4;43887:18;43879:6;43876:30;43873:56;;;43909:18;;:::i;:::-;43873:56;43947:29;43969:6;43947:29;:::i;:::-;43939:37;;44031:4;44025;44021:15;44013:23;;43736:307;;;:::o;44049:308::-;44111:4;44201:18;44193:6;44190:30;44187:56;;;44223:18;;:::i;:::-;44187:56;44261:29;44283:6;44261:29;:::i;:::-;44253:37;;44345:4;44339;44335:15;44327:23;;44049:308;;;:::o;44363:98::-;44414:6;44448:5;44442:12;44432:22;;44363:98;;;:::o;44467:99::-;44519:6;44553:5;44547:12;44537:22;;44467:99;;;:::o;44572:168::-;44655:11;44689:6;44684:3;44677:19;44729:4;44724:3;44720:14;44705:29;;44572:168;;;;:::o;44746:169::-;44830:11;44864:6;44859:3;44852:19;44904:4;44899:3;44895:14;44880:29;;44746:169;;;;:::o;44921:148::-;45023:11;45060:3;45045:18;;44921:148;;;;:::o;45075:305::-;45115:3;45134:20;45152:1;45134:20;:::i;:::-;45129:25;;45168:20;45186:1;45168:20;:::i;:::-;45163:25;;45322:1;45254:66;45250:74;45247:1;45244:81;45241:107;;;45328:18;;:::i;:::-;45241:107;45372:1;45369;45365:9;45358:16;;45075:305;;;;:::o;45386:185::-;45426:1;45443:20;45461:1;45443:20;:::i;:::-;45438:25;;45477:20;45495:1;45477:20;:::i;:::-;45472:25;;45516:1;45506:35;;45521:18;;:::i;:::-;45506:35;45563:1;45560;45556:9;45551:14;;45386:185;;;;:::o;45577:348::-;45617:7;45640:20;45658:1;45640:20;:::i;:::-;45635:25;;45674:20;45692:1;45674:20;:::i;:::-;45669:25;;45862:1;45794:66;45790:74;45787:1;45784:81;45779:1;45772:9;45765:17;45761:105;45758:131;;;45869:18;;:::i;:::-;45758:131;45917:1;45914;45910:9;45899:20;;45577:348;;;;:::o;45931:191::-;45971:4;45991:20;46009:1;45991:20;:::i;:::-;45986:25;;46025:20;46043:1;46025:20;:::i;:::-;46020:25;;46064:1;46061;46058:8;46055:34;;;46069:18;;:::i;:::-;46055:34;46114:1;46111;46107:9;46099:17;;45931:191;;;;:::o;46128:96::-;46165:7;46194:24;46212:5;46194:24;:::i;:::-;46183:35;;46128:96;;;:::o;46230:90::-;46264:7;46307:5;46300:13;46293:21;46282:32;;46230:90;;;:::o;46326:149::-;46362:7;46402:66;46395:5;46391:78;46380:89;;46326:149;;;:::o;46481:126::-;46518:7;46558:42;46551:5;46547:54;46536:65;;46481:126;;;:::o;46613:77::-;46650:7;46679:5;46668:16;;46613:77;;;:::o;46696:141::-;46761:9;46794:37;46825:5;46794:37;:::i;:::-;46781:50;;46696:141;;;:::o;46843:126::-;46893:9;46926:37;46957:5;46926:37;:::i;:::-;46913:50;;46843:126;;;:::o;46975:113::-;47025:9;47058:24;47076:5;47058:24;:::i;:::-;47045:37;;46975:113;;;:::o;47094:154::-;47178:6;47173:3;47168;47155:30;47240:1;47231:6;47226:3;47222:16;47215:27;47094:154;;;:::o;47254:307::-;47322:1;47332:113;47346:6;47343:1;47340:13;47332:113;;;47431:1;47426:3;47422:11;47416:18;47412:1;47407:3;47403:11;47396:39;47368:2;47365:1;47361:10;47356:15;;47332:113;;;47463:6;47460:1;47457:13;47454:101;;;47543:1;47534:6;47529:3;47525:16;47518:27;47454:101;47303:258;47254:307;;;:::o;47567:320::-;47611:6;47648:1;47642:4;47638:12;47628:22;;47695:1;47689:4;47685:12;47716:18;47706:81;;47772:4;47764:6;47760:17;47750:27;;47706:81;47834:2;47826:6;47823:14;47803:18;47800:38;47797:84;;;47853:18;;:::i;:::-;47797:84;47618:269;47567:320;;;:::o;47893:281::-;47976:27;47998:4;47976:27;:::i;:::-;47968:6;47964:40;48106:6;48094:10;48091:22;48070:18;48058:10;48055:34;48052:62;48049:88;;;48117:18;;:::i;:::-;48049:88;48157:10;48153:2;48146:22;47936:238;47893:281;;:::o;48180:233::-;48219:3;48242:24;48260:5;48242:24;:::i;:::-;48233:33;;48288:66;48281:5;48278:77;48275:103;;;48358:18;;:::i;:::-;48275:103;48405:1;48398:5;48394:13;48387:20;;48180:233;;;:::o;48419:176::-;48451:1;48468:20;48486:1;48468:20;:::i;:::-;48463:25;;48502:20;48520:1;48502:20;:::i;:::-;48497:25;;48541:1;48531:35;;48546:18;;:::i;:::-;48531:35;48587:1;48584;48580:9;48575:14;;48419:176;;;;:::o;48601:180::-;48649:77;48646:1;48639:88;48746:4;48743:1;48736:15;48770:4;48767:1;48760:15;48787:180;48835:77;48832:1;48825:88;48932:4;48929:1;48922:15;48956:4;48953:1;48946:15;48973:180;49021:77;49018:1;49011:88;49118:4;49115:1;49108:15;49142:4;49139:1;49132:15;49159:180;49207:77;49204:1;49197:88;49304:4;49301:1;49294:15;49328:4;49325:1;49318:15;49345:180;49393:77;49390:1;49383:88;49490:4;49487:1;49480:15;49514:4;49511:1;49504:15;49531:117;49640:1;49637;49630:12;49654:117;49763:1;49760;49753:12;49777:117;49886:1;49883;49876:12;49900:117;50009:1;50006;49999:12;50023:117;50132:1;50129;50122:12;50146:117;50255:1;50252;50245:12;50269:102;50310:6;50361:2;50357:7;50352:2;50345:5;50341:14;50337:28;50327:38;;50269:102;;;:::o;50377:169::-;50517:21;50513:1;50505:6;50501:14;50494:45;50377:169;:::o;50552:237::-;50692:34;50688:1;50680:6;50676:14;50669:58;50761:20;50756:2;50748:6;50744:15;50737:45;50552:237;:::o;50795:225::-;50935:34;50931:1;50923:6;50919:14;50912:58;51004:8;50999:2;50991:6;50987:15;50980:33;50795:225;:::o;51026:165::-;51166:17;51162:1;51154:6;51150:14;51143:41;51026:165;:::o;51197:178::-;51337:30;51333:1;51325:6;51321:14;51314:54;51197:178;:::o;51381:173::-;51521:25;51517:1;51509:6;51505:14;51498:49;51381:173;:::o;51560:164::-;51700:16;51696:1;51688:6;51684:14;51677:40;51560:164;:::o;51730:223::-;51870:34;51866:1;51858:6;51854:14;51847:58;51939:6;51934:2;51926:6;51922:15;51915:31;51730:223;:::o;51959:175::-;52099:27;52095:1;52087:6;52083:14;52076:51;51959:175;:::o;52140:231::-;52280:34;52276:1;52268:6;52264:14;52257:58;52349:14;52344:2;52336:6;52332:15;52325:39;52140:231;:::o;52377:165::-;52517:17;52513:1;52505:6;52501:14;52494:41;52377:165;:::o;52548:162::-;52688:14;52684:1;52676:6;52672:14;52665:38;52548:162;:::o;52716:166::-;52856:18;52852:1;52844:6;52840:14;52833:42;52716:166;:::o;52888:243::-;53028:34;53024:1;53016:6;53012:14;53005:58;53097:26;53092:2;53084:6;53080:15;53073:51;52888:243;:::o;53137:229::-;53277:34;53273:1;53265:6;53261:14;53254:58;53346:12;53341:2;53333:6;53329:15;53322:37;53137:229;:::o;53372:228::-;53512:34;53508:1;53500:6;53496:14;53489:58;53581:11;53576:2;53568:6;53564:15;53557:36;53372:228;:::o;53606:169::-;53746:21;53742:1;53734:6;53730:14;53723:45;53606:169;:::o;53781:182::-;53921:34;53917:1;53909:6;53905:14;53898:58;53781:182;:::o;53969:236::-;54109:34;54105:1;54097:6;54093:14;54086:58;54178:19;54173:2;54165:6;54161:15;54154:44;53969:236;:::o;54211:231::-;54351:34;54347:1;54339:6;54335:14;54328:58;54420:14;54415:2;54407:6;54403:15;54396:39;54211:231;:::o;54448:160::-;54588:12;54584:1;54576:6;54572:14;54565:36;54448:160;:::o;54614:182::-;54754:34;54750:1;54742:6;54738:14;54731:58;54614:182;:::o;54802:167::-;54942:19;54938:1;54930:6;54926:14;54919:43;54802:167;:::o;54975:228::-;55115:34;55111:1;55103:6;55099:14;55092:58;55184:11;55179:2;55171:6;55167:15;55160:36;54975:228;:::o;55209:160::-;55349:12;55345:1;55337:6;55333:14;55326:36;55209:160;:::o;55375:220::-;55515:34;55511:1;55503:6;55499:14;55492:58;55584:3;55579:2;55571:6;55567:15;55560:28;55375:220;:::o;55601:182::-;55741:34;55737:1;55729:6;55725:14;55718:58;55601:182;:::o;55789:166::-;55929:18;55925:1;55917:6;55913:14;55906:42;55789:166;:::o;55961:177::-;56101:29;56097:1;56089:6;56085:14;56078:53;55961:177;:::o;56144:236::-;56284:34;56280:1;56272:6;56268:14;56261:58;56353:19;56348:2;56340:6;56336:15;56329:44;56144:236;:::o;56386:174::-;56526:26;56522:1;56514:6;56510:14;56503:50;56386:174;:::o;56566:181::-;56706:33;56702:1;56694:6;56690:14;56683:57;56566:181;:::o;56753:235::-;56893:34;56889:1;56881:6;56877:14;56870:58;56962:18;56957:2;56949:6;56945:15;56938:43;56753:235;:::o;56994:122::-;57067:24;57085:5;57067:24;:::i;:::-;57060:5;57057:35;57047:63;;57106:1;57103;57096:12;57047:63;56994:122;:::o;57122:116::-;57192:21;57207:5;57192:21;:::i;:::-;57185:5;57182:32;57172:60;;57228:1;57225;57218:12;57172:60;57122:116;:::o;57244:120::-;57316:23;57333:5;57316:23;:::i;:::-;57309:5;57306:34;57296:62;;57354:1;57351;57344:12;57296:62;57244:120;:::o;57370:122::-;57443:24;57461:5;57443:24;:::i;:::-;57436:5;57433:35;57423:63;;57482:1;57479;57472:12;57423:63;57370:122;:::o

Swarm Source

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