ETH Price: $3,492.09 (+2.51%)
Gas: 2 Gwei

Token

HedgehogsInSocks (HEDGEHOGS)
 

Overview

Max Total Supply

797 HEDGEHOGS

Holders

205

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
harryswan.eth
Balance
15 HEDGEHOGS
0x1e23166b3b73dd2ee9d9db190aceeee8f8edd0aa
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
HedgehogsInSocks

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 6 of 13: HedgehogsInSocks.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

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

contract HedgehogsInSocks is ERC721Enumerable, Ownable {
    uint public constant MAX_HEDGEHOGS = 7777;
	string _baseTokenURI = "https://api.hedgehogsinsocks.com/";
	bool public paused = true;
	uint[7] public happyHedgehogs = [0,0,0,0,0,0,0];

    constructor() ERC721("HedgehogsInSocks", "HEDGEHOGS")  {
        for(uint i = 0; i < 77; i++){
            _safeMint(_msgSender(), totalSupply());
        }
    }

    function mintHedgehogs(address _to, uint _count) public payable {
        if(msg.sender != owner()){
            require(!paused, "Pause");
        }
        require(totalSupply() + _count <= MAX_HEDGEHOGS, "Max limit");
        require(totalSupply() < MAX_HEDGEHOGS, "Sale end");
        if(totalSupply() <= 854 ){
            require(_count <= 3, "Exceeds 3");
        }else{
            require(_count <= 20, "Exceeds 20");
        }
        require(msg.value >= price(_count), "Value below price");

        for(uint i = 0; i < _count; i++){
            _safeMint(_to, totalSupply());
        }
    }

    function price(uint _count) public view returns (uint256) {
        if(totalSupply() <= 777 ){
            return 0; // free 777
        }else{
            return 21000000000000000 * _count; // 0.021 ETH
        }
    }
    
    function selectHappyHedgehogs(uint _index) public onlyOwner {
        require(MAX_HEDGEHOGS == totalSupply() , "Sale not end");
        require(happyHedgehogs[_index] == 0, "Already selected");
        uint256 max = MAX_HEDGEHOGS - 1;
        uint256 randomHash = uint256(keccak256(abi.encodePacked(block.timestamp, block.difficulty)));
        randomHash = randomHash % max;
        address _happyOwner = ownerOf(randomHash);
        require(payable(_happyOwner).send(3300000000000000000));
        happyHedgehogs[_index] = randomHash;
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return _baseTokenURI;
    }
    
    function setBaseURI(string memory baseURI) public onlyOwner {
        _baseTokenURI = baseURI;
    }

    function walletOfOwner(address _owner) external view returns(uint256[] memory) {
        uint tokenCount = balanceOf(_owner);
        uint256[] memory tokensId = new uint256[](tokenCount);
        for(uint i = 0; i < tokenCount; i++){
            tokensId[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokensId;
    }
    
    function pause(bool val) public onlyOwner {
        paused = val;
    }

    function withdrawAll() public payable onlyOwner {
        require(payable(_msgSender()).send(address(this).balance));
    }
}

File 1 of 13: Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 2 of 13: Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 4 of 13: ERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

File 5 of 13: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 7 of 13: IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

File 8 of 13: IERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

File 9 of 13: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../IERC721.sol";

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

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

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

File 10 of 13: IERC721Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../IERC721.sol";

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

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

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

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

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

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_HEDGEHOGS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"happyHedgehogs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"_to","type":"address"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mintHedgehogs","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"uint256","name":"_index","type":"uint256"}],"name":"selectHappyHedgehogs","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":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526040518060600160405280602181526020016200586a60219139600b90805190602001906200003592919062000d0a565b506001600c60006101000a81548160ff0219169083151502179055506040518060e00160405280600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff16815250600d906007620000b292919062000d9b565b50348015620000c057600080fd5b506040518060400160405280601081526020017f4865646765686f6773496e536f636b73000000000000000000000000000000008152506040518060400160405280600981526020017f4845444745484f4753000000000000000000000000000000000000000000000081525081600090805190602001906200014592919062000d0a565b5080600190805190602001906200015e92919062000d0a565b5050506200018162000175620001db60201b60201c565b620001e360201b60201c565b60005b604d811015620001d457620001be620001a2620001db60201b60201c565b620001b2620002a960201b60201c565b620002b660201b60201c565b8080620001cb90620011bd565b91505062000184565b5062001384565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600880549050905090565b620002d8828260405180602001604052806000815250620002dc60201b60201c565b5050565b620002ee83836200034a60201b60201c565b6200030360008484846200053060201b60201c565b62000345576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200033c9062000f9a565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620003bd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003b49062001000565b60405180910390fd5b620003ce81620006ea60201b60201c565b1562000411576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004089062000fbc565b60405180910390fd5b62000425600083836200075660201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200047791906200104f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60006200055e8473ffffffffffffffffffffffffffffffffffffffff166200089d60201b62001a1b1760201c565b15620006dd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0262000590620001db60201b60201c565b8786866040518563ffffffff1660e01b8152600401620005b4949392919062000f46565b602060405180830381600087803b158015620005cf57600080fd5b505af19250505080156200060357506040513d601f19601f8201168201806040525081019062000600919062000e1b565b60015b6200068c573d806000811462000636576040519150601f19603f3d011682016040523d82523d6000602084013e6200063b565b606091505b5060008151141562000684576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200067b9062000f9a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050620006e2565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6200076e838383620008b060201b62001a2e1760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415620007bb57620007b581620008b560201b60201c565b62000803565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146200080257620008018382620008fe60201b60201c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000850576200084a8162000a7b60201b60201c565b62000898565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620008975762000896828262000bc360201b60201c565b5b5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001620009188462000c4f60201b620010e11760201c565b620009249190620010ac565b905060006007600084815260200190815260200160002054905081811462000a0a576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905062000a919190620010ac565b905060006009600084815260200190815260200160002054905060006008838154811062000ae8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811062000b31577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548062000ba7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600062000bdb8362000c4f60201b620010e11760201c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000cc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000cba9062000fde565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b82805462000d189062001187565b90600052602060002090601f01602090048101928262000d3c576000855562000d88565b82601f1062000d5757805160ff191683800117855562000d88565b8280016001018555821562000d88579182015b8281111562000d8757825182559160200191906001019062000d6a565b5b50905062000d97919062000de5565b5090565b826007810192821562000dd2579160200282015b8281111562000dd1578251829060ff1690559160200191906001019062000daf565b5b50905062000de1919062000de5565b5090565b5b8082111562000e0057600081600090555060010162000de6565b5090565b60008151905062000e15816200136a565b92915050565b60006020828403121562000e2e57600080fd5b600062000e3e8482850162000e04565b91505092915050565b62000e5281620010e7565b82525050565b600062000e658262001022565b62000e7181856200102d565b935062000e8381856020860162001151565b62000e8e8162001269565b840191505092915050565b600062000ea86032836200103e565b915062000eb5826200127a565b604082019050919050565b600062000ecf601c836200103e565b915062000edc82620012c9565b602082019050919050565b600062000ef6602a836200103e565b915062000f0382620012f2565b604082019050919050565b600062000f1d6020836200103e565b915062000f2a8262001341565b602082019050919050565b62000f408162001147565b82525050565b600060808201905062000f5d600083018762000e47565b62000f6c602083018662000e47565b62000f7b604083018562000f35565b818103606083015262000f8f818462000e58565b905095945050505050565b6000602082019050818103600083015262000fb58162000e99565b9050919050565b6000602082019050818103600083015262000fd78162000ec0565b9050919050565b6000602082019050818103600083015262000ff98162000ee7565b9050919050565b600060208201905081810360008301526200101b8162000f0e565b9050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b60006200105c8262001147565b9150620010698362001147565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620010a157620010a06200120b565b5b828201905092915050565b6000620010b98262001147565b9150620010c68362001147565b925082821015620010dc57620010db6200120b565b5b828203905092915050565b6000620010f48262001127565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200117157808201518184015260208101905062001154565b8381111562001181576000848401525b50505050565b60006002820490506001821680620011a057607f821691505b60208210811415620011b757620011b66200123a565b5b50919050565b6000620011ca8262001147565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156200120057620011ff6200120b565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6200137581620010fb565b81146200138157600080fd5b50565b6144d680620013946000396000f3fe6080604052600436106101c25760003560e01c806355f804b3116100f75780638da5cb5b11610095578063c01f2b5b11610064578063c01f2b5b14610636578063c87b56dd14610673578063e985e9c5146106b0578063f2fde38b146106ed576101c2565b80638da5cb5b1461058e57806395d89b41146105b9578063a22cb465146105e4578063b88d4fde1461060d576101c2565b806370a08231116100d157806370a0823114610514578063715018a614610551578063804e26b614610568578063853828b614610584576101c2565b806355f804b3146104835780635c975abb146104ac5780636352211e146104d7576101c2565b806323b872dd1161016457806334c5e73e1161013e57806334c5e73e146103b557806342842e0e146103e0578063438b6300146104095780634f6ccce714610446576101c2565b806323b872dd1461031257806326a49e371461033b5780632f745c5914610378576101c2565b806306fdde03116101a057806306fdde0314610256578063081812fc14610281578063095ea7b3146102be57806318160ddd146102e7576101c2565b806301ffc9a7146101c757806302329a2914610204578063047293a41461022d575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190612f5d565b610716565b6040516101fb91906135ec565b60405180910390f35b34801561021057600080fd5b5061022b60048036038101906102269190612f34565b610790565b005b34801561023957600080fd5b50610254600480360381019061024f9190612ff0565b610829565b005b34801561026257600080fd5b5061026b610a58565b6040516102789190613607565b60405180910390f35b34801561028d57600080fd5b506102a860048036038101906102a39190612ff0565b610aea565b6040516102b59190613563565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e09190612ef8565b610b6f565b005b3480156102f357600080fd5b506102fc610c87565b6040516103099190613969565b60405180910390f35b34801561031e57600080fd5b5061033960048036038101906103349190612df2565b610c94565b005b34801561034757600080fd5b50610362600480360381019061035d9190612ff0565b610cf4565b60405161036f9190613969565b60405180910390f35b34801561038457600080fd5b5061039f600480360381019061039a9190612ef8565b610d2a565b6040516103ac9190613969565b60405180910390f35b3480156103c157600080fd5b506103ca610dcf565b6040516103d79190613969565b60405180910390f35b3480156103ec57600080fd5b5061040760048036038101906104029190612df2565b610dd5565b005b34801561041557600080fd5b50610430600480360381019061042b9190612d8d565b610df5565b60405161043d91906135ca565b60405180910390f35b34801561045257600080fd5b5061046d60048036038101906104689190612ff0565b610eef565b60405161047a9190613969565b60405180910390f35b34801561048f57600080fd5b506104aa60048036038101906104a59190612faf565b610f86565b005b3480156104b857600080fd5b506104c161101c565b6040516104ce91906135ec565b60405180910390f35b3480156104e357600080fd5b506104fe60048036038101906104f99190612ff0565b61102f565b60405161050b9190613563565b60405180910390f35b34801561052057600080fd5b5061053b60048036038101906105369190612d8d565b6110e1565b6040516105489190613969565b60405180910390f35b34801561055d57600080fd5b50610566611199565b005b610582600480360381019061057d9190612ef8565b611221565b005b61058c61146b565b005b34801561059a57600080fd5b506105a361152e565b6040516105b09190613563565b60405180910390f35b3480156105c557600080fd5b506105ce611558565b6040516105db9190613607565b60405180910390f35b3480156105f057600080fd5b5061060b60048036038101906106069190612ebc565b6115ea565b005b34801561061957600080fd5b50610634600480360381019061062f9190612e41565b61176b565b005b34801561064257600080fd5b5061065d60048036038101906106589190612ff0565b6117cd565b60405161066a9190613969565b60405180910390f35b34801561067f57600080fd5b5061069a60048036038101906106959190612ff0565b6117e8565b6040516106a79190613607565b60405180910390f35b3480156106bc57600080fd5b506106d760048036038101906106d29190612db6565b61188f565b6040516106e491906135ec565b60405180910390f35b3480156106f957600080fd5b50610714600480360381019061070f9190612d8d565b611923565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610789575061078882611a33565b5b9050919050565b610798611b15565b73ffffffffffffffffffffffffffffffffffffffff166107b661152e565b73ffffffffffffffffffffffffffffffffffffffff161461080c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080390613849565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b610831611b15565b73ffffffffffffffffffffffffffffffffffffffff1661084f61152e565b73ffffffffffffffffffffffffffffffffffffffff16146108a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089c90613849565b60405180910390fd5b6108ad610c87565b611e61146108f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e790613929565b60405180910390fd5b6000600d826007811061092c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01541461096e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096590613629565b60405180910390fd5b60006001611e6161097f9190613b68565b905060004244604051602001610996929190613537565b6040516020818303038152906040528051906020012060001c905081816109bd9190613d08565b905060006109ca8261102f565b90508073ffffffffffffffffffffffffffffffffffffffff166108fc672dcbf4840eca00009081150290604051600060405180830381858888f19350505050610a1257600080fd5b81600d8560078110610a4d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b018190555050505050565b606060008054610a6790613c52565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9390613c52565b8015610ae05780601f10610ab557610100808354040283529160200191610ae0565b820191906000526020600020905b815481529060010190602001808311610ac357829003601f168201915b5050505050905090565b6000610af582611b1d565b610b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2b90613829565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b7a8261102f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be2906138c9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c0a611b15565b73ffffffffffffffffffffffffffffffffffffffff161480610c395750610c3881610c33611b15565b61188f565b5b610c78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6f90613769565b60405180910390fd5b610c828383611b89565b505050565b6000600880549050905090565b610ca5610c9f611b15565b82611c42565b610ce4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdb90613909565b60405180910390fd5b610cef838383611d20565b505050565b6000610309610d01610c87565b11610d0f5760009050610d25565b81664a9b6384488000610d229190613b0e565b90505b919050565b6000610d35836110e1565b8210610d76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6d90613649565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b611e6181565b610df08383836040518060200160405280600081525061176b565b505050565b60606000610e02836110e1565b905060008167ffffffffffffffff811115610e46577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610e745781602001602082028036833780820191505090505b50905060005b82811015610ee457610e8c8582610d2a565b828281518110610ec5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080610edc90613cb5565b915050610e7a565b508092505050919050565b6000610ef9610c87565b8210610f3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3190613949565b60405180910390fd5b60088281548110610f74577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610f8e611b15565b73ffffffffffffffffffffffffffffffffffffffff16610fac61152e565b73ffffffffffffffffffffffffffffffffffffffff1614611002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff990613849565b60405180910390fd5b80600b9080519060200190611018929190612bb1565b5050565b600c60009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cf906137c9565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611152576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611149906137a9565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111a1611b15565b73ffffffffffffffffffffffffffffffffffffffff166111bf61152e565b73ffffffffffffffffffffffffffffffffffffffff1614611215576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120c90613849565b60405180910390fd5b61121f6000611f7c565b565b61122961152e565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112ac57600c60009054906101000a900460ff16156112ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a290613709565b60405180910390fd5b5b611e61816112b8610c87565b6112c29190613a87565b1115611303576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fa90613729565b60405180910390fd5b611e6161130e610c87565b1061134e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134590613809565b60405180910390fd5b610356611359610c87565b116113a75760038111156113a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139990613789565b60405180910390fd5b6113ec565b60148111156113eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e2906138e9565b60405180910390fd5b5b6113f581610cf4565b341015611437576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142e906138a9565b60405180910390fd5b60005b81811015611466576114538361144e610c87565b612042565b808061145e90613cb5565b91505061143a565b505050565b611473611b15565b73ffffffffffffffffffffffffffffffffffffffff1661149161152e565b73ffffffffffffffffffffffffffffffffffffffff16146114e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114de90613849565b60405180910390fd5b6114ef611b15565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061152c57600080fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461156790613c52565b80601f016020809104026020016040519081016040528092919081815260200182805461159390613c52565b80156115e05780601f106115b5576101008083540402835291602001916115e0565b820191906000526020600020905b8154815290600101906020018083116115c357829003601f168201915b5050505050905090565b6115f2611b15565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611660576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611657906136e9565b60405180910390fd5b806005600061166d611b15565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661171a611b15565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161175f91906135ec565b60405180910390a35050565b61177c611776611b15565b83611c42565b6117bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b290613909565b60405180910390fd5b6117c784848484612060565b50505050565b600d81600781106117dd57600080fd5b016000915090505481565b60606117f382611b1d565b611832576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182990613889565b60405180910390fd5b600061183c6120bc565b9050600081511161185c5760405180602001604052806000815250611887565b806118668461214e565b604051602001611877929190613513565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61192b611b15565b73ffffffffffffffffffffffffffffffffffffffff1661194961152e565b73ffffffffffffffffffffffffffffffffffffffff161461199f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199690613849565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0690613689565b60405180910390fd5b611a1881611f7c565b50565b600080823b905060008111915050919050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611afe57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611b0e5750611b0d826122fb565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611bfc8361102f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611c4d82611b1d565b611c8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8390613749565b60405180910390fd5b6000611c978361102f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d0657508373ffffffffffffffffffffffffffffffffffffffff16611cee84610aea565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d175750611d16818561188f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d408261102f565b73ffffffffffffffffffffffffffffffffffffffff1614611d96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8d90613869565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfd906136c9565b60405180910390fd5b611e11838383612365565b611e1c600082611b89565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e6c9190613b68565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ec39190613a87565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61205c828260405180602001604052806000815250612479565b5050565b61206b848484611d20565b612077848484846124d4565b6120b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ad90613669565b60405180910390fd5b50505050565b6060600b80546120cb90613c52565b80601f01602080910402602001604051908101604052809291908181526020018280546120f790613c52565b80156121445780601f1061211957610100808354040283529160200191612144565b820191906000526020600020905b81548152906001019060200180831161212757829003601f168201915b5050505050905090565b60606000821415612196576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506122f6565b600082905060005b600082146121c85780806121b190613cb5565b915050600a826121c19190613add565b915061219e565b60008167ffffffffffffffff81111561220a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561223c5781602001600182028036833780820191505090505b5090505b600085146122ef576001826122559190613b68565b9150600a856122649190613d08565b60306122709190613a87565b60f81b8183815181106122ac577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856122e89190613add565b9450612240565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612370838383611a2e565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123b3576123ae8161266b565b6123f2565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146123f1576123f083826126b4565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124355761243081612821565b612474565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612473576124728282612964565b5b5b505050565b61248383836129e3565b61249060008484846124d4565b6124cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c690613669565b60405180910390fd5b505050565b60006124f58473ffffffffffffffffffffffffffffffffffffffff16611a1b565b1561265e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261251e611b15565b8786866040518563ffffffff1660e01b8152600401612540949392919061357e565b602060405180830381600087803b15801561255a57600080fd5b505af192505050801561258b57506040513d601f19601f820116820180604052508101906125889190612f86565b60015b61260e573d80600081146125bb576040519150601f19603f3d011682016040523d82523d6000602084013e6125c0565b606091505b50600081511415612606576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125fd90613669565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612663565b600190505b949350505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016126c1846110e1565b6126cb9190613b68565b90506000600760008481526020019081526020016000205490508181146127b0576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506128359190613b68565b905060006009600084815260200190815260200160002054905060006008838154811061288b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106128d3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612948577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061296f836110e1565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4a906137e9565b60405180910390fd5b612a5c81611b1d565b15612a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a93906136a9565b60405180910390fd5b612aa860008383612365565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612af89190613a87565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612bbd90613c52565b90600052602060002090601f016020900481019282612bdf5760008555612c26565b82601f10612bf857805160ff1916838001178555612c26565b82800160010185558215612c26579182015b82811115612c25578251825591602001919060010190612c0a565b5b509050612c339190612c37565b5090565b5b80821115612c50576000816000905550600101612c38565b5090565b6000612c67612c62846139a9565b613984565b905082815260208101848484011115612c7f57600080fd5b612c8a848285613c10565b509392505050565b6000612ca5612ca0846139da565b613984565b905082815260208101848484011115612cbd57600080fd5b612cc8848285613c10565b509392505050565b600081359050612cdf81614444565b92915050565b600081359050612cf48161445b565b92915050565b600081359050612d0981614472565b92915050565b600081519050612d1e81614472565b92915050565b600082601f830112612d3557600080fd5b8135612d45848260208601612c54565b91505092915050565b600082601f830112612d5f57600080fd5b8135612d6f848260208601612c92565b91505092915050565b600081359050612d8781614489565b92915050565b600060208284031215612d9f57600080fd5b6000612dad84828501612cd0565b91505092915050565b60008060408385031215612dc957600080fd5b6000612dd785828601612cd0565b9250506020612de885828601612cd0565b9150509250929050565b600080600060608486031215612e0757600080fd5b6000612e1586828701612cd0565b9350506020612e2686828701612cd0565b9250506040612e3786828701612d78565b9150509250925092565b60008060008060808587031215612e5757600080fd5b6000612e6587828801612cd0565b9450506020612e7687828801612cd0565b9350506040612e8787828801612d78565b925050606085013567ffffffffffffffff811115612ea457600080fd5b612eb087828801612d24565b91505092959194509250565b60008060408385031215612ecf57600080fd5b6000612edd85828601612cd0565b9250506020612eee85828601612ce5565b9150509250929050565b60008060408385031215612f0b57600080fd5b6000612f1985828601612cd0565b9250506020612f2a85828601612d78565b9150509250929050565b600060208284031215612f4657600080fd5b6000612f5484828501612ce5565b91505092915050565b600060208284031215612f6f57600080fd5b6000612f7d84828501612cfa565b91505092915050565b600060208284031215612f9857600080fd5b6000612fa684828501612d0f565b91505092915050565b600060208284031215612fc157600080fd5b600082013567ffffffffffffffff811115612fdb57600080fd5b612fe784828501612d4e565b91505092915050565b60006020828403121561300257600080fd5b600061301084828501612d78565b91505092915050565b600061302583836134de565b60208301905092915050565b61303a81613b9c565b82525050565b600061304b82613a1b565b6130558185613a49565b935061306083613a0b565b8060005b838110156130915781516130788882613019565b975061308383613a3c565b925050600181019050613064565b5085935050505092915050565b6130a781613bae565b82525050565b60006130b882613a26565b6130c28185613a5a565b93506130d2818560208601613c1f565b6130db81613df5565b840191505092915050565b60006130f182613a31565b6130fb8185613a6b565b935061310b818560208601613c1f565b61311481613df5565b840191505092915050565b600061312a82613a31565b6131348185613a7c565b9350613144818560208601613c1f565b80840191505092915050565b600061315d601083613a6b565b915061316882613e06565b602082019050919050565b6000613180602b83613a6b565b915061318b82613e2f565b604082019050919050565b60006131a3603283613a6b565b91506131ae82613e7e565b604082019050919050565b60006131c6602683613a6b565b91506131d182613ecd565b604082019050919050565b60006131e9601c83613a6b565b91506131f482613f1c565b602082019050919050565b600061320c602483613a6b565b915061321782613f45565b604082019050919050565b600061322f601983613a6b565b915061323a82613f94565b602082019050919050565b6000613252600583613a6b565b915061325d82613fbd565b602082019050919050565b6000613275600983613a6b565b915061328082613fe6565b602082019050919050565b6000613298602c83613a6b565b91506132a38261400f565b604082019050919050565b60006132bb603883613a6b565b91506132c68261405e565b604082019050919050565b60006132de600983613a6b565b91506132e9826140ad565b602082019050919050565b6000613301602a83613a6b565b915061330c826140d6565b604082019050919050565b6000613324602983613a6b565b915061332f82614125565b604082019050919050565b6000613347602083613a6b565b915061335282614174565b602082019050919050565b600061336a600883613a6b565b91506133758261419d565b602082019050919050565b600061338d602c83613a6b565b9150613398826141c6565b604082019050919050565b60006133b0602083613a6b565b91506133bb82614215565b602082019050919050565b60006133d3602983613a6b565b91506133de8261423e565b604082019050919050565b60006133f6602f83613a6b565b91506134018261428d565b604082019050919050565b6000613419601183613a6b565b9150613424826142dc565b602082019050919050565b600061343c602183613a6b565b915061344782614305565b604082019050919050565b600061345f600a83613a6b565b915061346a82614354565b602082019050919050565b6000613482603183613a6b565b915061348d8261437d565b604082019050919050565b60006134a5600c83613a6b565b91506134b0826143cc565b602082019050919050565b60006134c8602c83613a6b565b91506134d3826143f5565b604082019050919050565b6134e781613c06565b82525050565b6134f681613c06565b82525050565b61350d61350882613c06565b613cfe565b82525050565b600061351f828561311f565b915061352b828461311f565b91508190509392505050565b600061354382856134fc565b60208201915061355382846134fc565b6020820191508190509392505050565b60006020820190506135786000830184613031565b92915050565b60006080820190506135936000830187613031565b6135a06020830186613031565b6135ad60408301856134ed565b81810360608301526135bf81846130ad565b905095945050505050565b600060208201905081810360008301526135e48184613040565b905092915050565b6000602082019050613601600083018461309e565b92915050565b6000602082019050818103600083015261362181846130e6565b905092915050565b6000602082019050818103600083015261364281613150565b9050919050565b6000602082019050818103600083015261366281613173565b9050919050565b6000602082019050818103600083015261368281613196565b9050919050565b600060208201905081810360008301526136a2816131b9565b9050919050565b600060208201905081810360008301526136c2816131dc565b9050919050565b600060208201905081810360008301526136e2816131ff565b9050919050565b6000602082019050818103600083015261370281613222565b9050919050565b6000602082019050818103600083015261372281613245565b9050919050565b6000602082019050818103600083015261374281613268565b9050919050565b600060208201905081810360008301526137628161328b565b9050919050565b60006020820190508181036000830152613782816132ae565b9050919050565b600060208201905081810360008301526137a2816132d1565b9050919050565b600060208201905081810360008301526137c2816132f4565b9050919050565b600060208201905081810360008301526137e281613317565b9050919050565b600060208201905081810360008301526138028161333a565b9050919050565b600060208201905081810360008301526138228161335d565b9050919050565b6000602082019050818103600083015261384281613380565b9050919050565b60006020820190508181036000830152613862816133a3565b9050919050565b60006020820190508181036000830152613882816133c6565b9050919050565b600060208201905081810360008301526138a2816133e9565b9050919050565b600060208201905081810360008301526138c28161340c565b9050919050565b600060208201905081810360008301526138e28161342f565b9050919050565b6000602082019050818103600083015261390281613452565b9050919050565b6000602082019050818103600083015261392281613475565b9050919050565b6000602082019050818103600083015261394281613498565b9050919050565b60006020820190508181036000830152613962816134bb565b9050919050565b600060208201905061397e60008301846134ed565b92915050565b600061398e61399f565b905061399a8282613c84565b919050565b6000604051905090565b600067ffffffffffffffff8211156139c4576139c3613dc6565b5b6139cd82613df5565b9050602081019050919050565b600067ffffffffffffffff8211156139f5576139f4613dc6565b5b6139fe82613df5565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613a9282613c06565b9150613a9d83613c06565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ad257613ad1613d39565b5b828201905092915050565b6000613ae882613c06565b9150613af383613c06565b925082613b0357613b02613d68565b5b828204905092915050565b6000613b1982613c06565b9150613b2483613c06565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b5d57613b5c613d39565b5b828202905092915050565b6000613b7382613c06565b9150613b7e83613c06565b925082821015613b9157613b90613d39565b5b828203905092915050565b6000613ba782613be6565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613c3d578082015181840152602081019050613c22565b83811115613c4c576000848401525b50505050565b60006002820490506001821680613c6a57607f821691505b60208210811415613c7e57613c7d613d97565b5b50919050565b613c8d82613df5565b810181811067ffffffffffffffff82111715613cac57613cab613dc6565b5b80604052505050565b6000613cc082613c06565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613cf357613cf2613d39565b5b600182019050919050565b6000819050919050565b6000613d1382613c06565b9150613d1e83613c06565b925082613d2e57613d2d613d68565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f416c72656164792073656c656374656400000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f5061757365000000000000000000000000000000000000000000000000000000600082015250565b7f4d6178206c696d69740000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4578636565647320330000000000000000000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f53616c6520656e64000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f56616c75652062656c6f77207072696365000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4578636565647320323000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f53616c65206e6f7420656e640000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b61444d81613b9c565b811461445857600080fd5b50565b61446481613bae565b811461446f57600080fd5b50565b61447b81613bba565b811461448657600080fd5b50565b61449281613c06565b811461449d57600080fd5b5056fea26469706673582212209d065e8fe929284355b0cace4ba4206148cb687e34fdd7298b35c448d977b6a864736f6c6343000804003368747470733a2f2f6170692e6865646765686f6773696e736f636b732e636f6d2f

Deployed Bytecode

0x6080604052600436106101c25760003560e01c806355f804b3116100f75780638da5cb5b11610095578063c01f2b5b11610064578063c01f2b5b14610636578063c87b56dd14610673578063e985e9c5146106b0578063f2fde38b146106ed576101c2565b80638da5cb5b1461058e57806395d89b41146105b9578063a22cb465146105e4578063b88d4fde1461060d576101c2565b806370a08231116100d157806370a0823114610514578063715018a614610551578063804e26b614610568578063853828b614610584576101c2565b806355f804b3146104835780635c975abb146104ac5780636352211e146104d7576101c2565b806323b872dd1161016457806334c5e73e1161013e57806334c5e73e146103b557806342842e0e146103e0578063438b6300146104095780634f6ccce714610446576101c2565b806323b872dd1461031257806326a49e371461033b5780632f745c5914610378576101c2565b806306fdde03116101a057806306fdde0314610256578063081812fc14610281578063095ea7b3146102be57806318160ddd146102e7576101c2565b806301ffc9a7146101c757806302329a2914610204578063047293a41461022d575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190612f5d565b610716565b6040516101fb91906135ec565b60405180910390f35b34801561021057600080fd5b5061022b60048036038101906102269190612f34565b610790565b005b34801561023957600080fd5b50610254600480360381019061024f9190612ff0565b610829565b005b34801561026257600080fd5b5061026b610a58565b6040516102789190613607565b60405180910390f35b34801561028d57600080fd5b506102a860048036038101906102a39190612ff0565b610aea565b6040516102b59190613563565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e09190612ef8565b610b6f565b005b3480156102f357600080fd5b506102fc610c87565b6040516103099190613969565b60405180910390f35b34801561031e57600080fd5b5061033960048036038101906103349190612df2565b610c94565b005b34801561034757600080fd5b50610362600480360381019061035d9190612ff0565b610cf4565b60405161036f9190613969565b60405180910390f35b34801561038457600080fd5b5061039f600480360381019061039a9190612ef8565b610d2a565b6040516103ac9190613969565b60405180910390f35b3480156103c157600080fd5b506103ca610dcf565b6040516103d79190613969565b60405180910390f35b3480156103ec57600080fd5b5061040760048036038101906104029190612df2565b610dd5565b005b34801561041557600080fd5b50610430600480360381019061042b9190612d8d565b610df5565b60405161043d91906135ca565b60405180910390f35b34801561045257600080fd5b5061046d60048036038101906104689190612ff0565b610eef565b60405161047a9190613969565b60405180910390f35b34801561048f57600080fd5b506104aa60048036038101906104a59190612faf565b610f86565b005b3480156104b857600080fd5b506104c161101c565b6040516104ce91906135ec565b60405180910390f35b3480156104e357600080fd5b506104fe60048036038101906104f99190612ff0565b61102f565b60405161050b9190613563565b60405180910390f35b34801561052057600080fd5b5061053b60048036038101906105369190612d8d565b6110e1565b6040516105489190613969565b60405180910390f35b34801561055d57600080fd5b50610566611199565b005b610582600480360381019061057d9190612ef8565b611221565b005b61058c61146b565b005b34801561059a57600080fd5b506105a361152e565b6040516105b09190613563565b60405180910390f35b3480156105c557600080fd5b506105ce611558565b6040516105db9190613607565b60405180910390f35b3480156105f057600080fd5b5061060b60048036038101906106069190612ebc565b6115ea565b005b34801561061957600080fd5b50610634600480360381019061062f9190612e41565b61176b565b005b34801561064257600080fd5b5061065d60048036038101906106589190612ff0565b6117cd565b60405161066a9190613969565b60405180910390f35b34801561067f57600080fd5b5061069a60048036038101906106959190612ff0565b6117e8565b6040516106a79190613607565b60405180910390f35b3480156106bc57600080fd5b506106d760048036038101906106d29190612db6565b61188f565b6040516106e491906135ec565b60405180910390f35b3480156106f957600080fd5b50610714600480360381019061070f9190612d8d565b611923565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610789575061078882611a33565b5b9050919050565b610798611b15565b73ffffffffffffffffffffffffffffffffffffffff166107b661152e565b73ffffffffffffffffffffffffffffffffffffffff161461080c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080390613849565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b610831611b15565b73ffffffffffffffffffffffffffffffffffffffff1661084f61152e565b73ffffffffffffffffffffffffffffffffffffffff16146108a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089c90613849565b60405180910390fd5b6108ad610c87565b611e61146108f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e790613929565b60405180910390fd5b6000600d826007811061092c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01541461096e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096590613629565b60405180910390fd5b60006001611e6161097f9190613b68565b905060004244604051602001610996929190613537565b6040516020818303038152906040528051906020012060001c905081816109bd9190613d08565b905060006109ca8261102f565b90508073ffffffffffffffffffffffffffffffffffffffff166108fc672dcbf4840eca00009081150290604051600060405180830381858888f19350505050610a1257600080fd5b81600d8560078110610a4d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b018190555050505050565b606060008054610a6790613c52565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9390613c52565b8015610ae05780601f10610ab557610100808354040283529160200191610ae0565b820191906000526020600020905b815481529060010190602001808311610ac357829003601f168201915b5050505050905090565b6000610af582611b1d565b610b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2b90613829565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b7a8261102f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be2906138c9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c0a611b15565b73ffffffffffffffffffffffffffffffffffffffff161480610c395750610c3881610c33611b15565b61188f565b5b610c78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6f90613769565b60405180910390fd5b610c828383611b89565b505050565b6000600880549050905090565b610ca5610c9f611b15565b82611c42565b610ce4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdb90613909565b60405180910390fd5b610cef838383611d20565b505050565b6000610309610d01610c87565b11610d0f5760009050610d25565b81664a9b6384488000610d229190613b0e565b90505b919050565b6000610d35836110e1565b8210610d76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6d90613649565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b611e6181565b610df08383836040518060200160405280600081525061176b565b505050565b60606000610e02836110e1565b905060008167ffffffffffffffff811115610e46577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610e745781602001602082028036833780820191505090505b50905060005b82811015610ee457610e8c8582610d2a565b828281518110610ec5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080610edc90613cb5565b915050610e7a565b508092505050919050565b6000610ef9610c87565b8210610f3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3190613949565b60405180910390fd5b60088281548110610f74577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610f8e611b15565b73ffffffffffffffffffffffffffffffffffffffff16610fac61152e565b73ffffffffffffffffffffffffffffffffffffffff1614611002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff990613849565b60405180910390fd5b80600b9080519060200190611018929190612bb1565b5050565b600c60009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cf906137c9565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611152576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611149906137a9565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111a1611b15565b73ffffffffffffffffffffffffffffffffffffffff166111bf61152e565b73ffffffffffffffffffffffffffffffffffffffff1614611215576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120c90613849565b60405180910390fd5b61121f6000611f7c565b565b61122961152e565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112ac57600c60009054906101000a900460ff16156112ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a290613709565b60405180910390fd5b5b611e61816112b8610c87565b6112c29190613a87565b1115611303576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fa90613729565b60405180910390fd5b611e6161130e610c87565b1061134e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134590613809565b60405180910390fd5b610356611359610c87565b116113a75760038111156113a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139990613789565b60405180910390fd5b6113ec565b60148111156113eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e2906138e9565b60405180910390fd5b5b6113f581610cf4565b341015611437576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142e906138a9565b60405180910390fd5b60005b81811015611466576114538361144e610c87565b612042565b808061145e90613cb5565b91505061143a565b505050565b611473611b15565b73ffffffffffffffffffffffffffffffffffffffff1661149161152e565b73ffffffffffffffffffffffffffffffffffffffff16146114e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114de90613849565b60405180910390fd5b6114ef611b15565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061152c57600080fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461156790613c52565b80601f016020809104026020016040519081016040528092919081815260200182805461159390613c52565b80156115e05780601f106115b5576101008083540402835291602001916115e0565b820191906000526020600020905b8154815290600101906020018083116115c357829003601f168201915b5050505050905090565b6115f2611b15565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611660576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611657906136e9565b60405180910390fd5b806005600061166d611b15565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661171a611b15565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161175f91906135ec565b60405180910390a35050565b61177c611776611b15565b83611c42565b6117bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b290613909565b60405180910390fd5b6117c784848484612060565b50505050565b600d81600781106117dd57600080fd5b016000915090505481565b60606117f382611b1d565b611832576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182990613889565b60405180910390fd5b600061183c6120bc565b9050600081511161185c5760405180602001604052806000815250611887565b806118668461214e565b604051602001611877929190613513565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61192b611b15565b73ffffffffffffffffffffffffffffffffffffffff1661194961152e565b73ffffffffffffffffffffffffffffffffffffffff161461199f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199690613849565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0690613689565b60405180910390fd5b611a1881611f7c565b50565b600080823b905060008111915050919050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611afe57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611b0e5750611b0d826122fb565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611bfc8361102f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611c4d82611b1d565b611c8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8390613749565b60405180910390fd5b6000611c978361102f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d0657508373ffffffffffffffffffffffffffffffffffffffff16611cee84610aea565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d175750611d16818561188f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d408261102f565b73ffffffffffffffffffffffffffffffffffffffff1614611d96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8d90613869565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfd906136c9565b60405180910390fd5b611e11838383612365565b611e1c600082611b89565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e6c9190613b68565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ec39190613a87565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61205c828260405180602001604052806000815250612479565b5050565b61206b848484611d20565b612077848484846124d4565b6120b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ad90613669565b60405180910390fd5b50505050565b6060600b80546120cb90613c52565b80601f01602080910402602001604051908101604052809291908181526020018280546120f790613c52565b80156121445780601f1061211957610100808354040283529160200191612144565b820191906000526020600020905b81548152906001019060200180831161212757829003601f168201915b5050505050905090565b60606000821415612196576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506122f6565b600082905060005b600082146121c85780806121b190613cb5565b915050600a826121c19190613add565b915061219e565b60008167ffffffffffffffff81111561220a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561223c5781602001600182028036833780820191505090505b5090505b600085146122ef576001826122559190613b68565b9150600a856122649190613d08565b60306122709190613a87565b60f81b8183815181106122ac577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856122e89190613add565b9450612240565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612370838383611a2e565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123b3576123ae8161266b565b6123f2565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146123f1576123f083826126b4565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124355761243081612821565b612474565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612473576124728282612964565b5b5b505050565b61248383836129e3565b61249060008484846124d4565b6124cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c690613669565b60405180910390fd5b505050565b60006124f58473ffffffffffffffffffffffffffffffffffffffff16611a1b565b1561265e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261251e611b15565b8786866040518563ffffffff1660e01b8152600401612540949392919061357e565b602060405180830381600087803b15801561255a57600080fd5b505af192505050801561258b57506040513d601f19601f820116820180604052508101906125889190612f86565b60015b61260e573d80600081146125bb576040519150601f19603f3d011682016040523d82523d6000602084013e6125c0565b606091505b50600081511415612606576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125fd90613669565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612663565b600190505b949350505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016126c1846110e1565b6126cb9190613b68565b90506000600760008481526020019081526020016000205490508181146127b0576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506128359190613b68565b905060006009600084815260200190815260200160002054905060006008838154811061288b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106128d3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612948577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061296f836110e1565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4a906137e9565b60405180910390fd5b612a5c81611b1d565b15612a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a93906136a9565b60405180910390fd5b612aa860008383612365565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612af89190613a87565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612bbd90613c52565b90600052602060002090601f016020900481019282612bdf5760008555612c26565b82601f10612bf857805160ff1916838001178555612c26565b82800160010185558215612c26579182015b82811115612c25578251825591602001919060010190612c0a565b5b509050612c339190612c37565b5090565b5b80821115612c50576000816000905550600101612c38565b5090565b6000612c67612c62846139a9565b613984565b905082815260208101848484011115612c7f57600080fd5b612c8a848285613c10565b509392505050565b6000612ca5612ca0846139da565b613984565b905082815260208101848484011115612cbd57600080fd5b612cc8848285613c10565b509392505050565b600081359050612cdf81614444565b92915050565b600081359050612cf48161445b565b92915050565b600081359050612d0981614472565b92915050565b600081519050612d1e81614472565b92915050565b600082601f830112612d3557600080fd5b8135612d45848260208601612c54565b91505092915050565b600082601f830112612d5f57600080fd5b8135612d6f848260208601612c92565b91505092915050565b600081359050612d8781614489565b92915050565b600060208284031215612d9f57600080fd5b6000612dad84828501612cd0565b91505092915050565b60008060408385031215612dc957600080fd5b6000612dd785828601612cd0565b9250506020612de885828601612cd0565b9150509250929050565b600080600060608486031215612e0757600080fd5b6000612e1586828701612cd0565b9350506020612e2686828701612cd0565b9250506040612e3786828701612d78565b9150509250925092565b60008060008060808587031215612e5757600080fd5b6000612e6587828801612cd0565b9450506020612e7687828801612cd0565b9350506040612e8787828801612d78565b925050606085013567ffffffffffffffff811115612ea457600080fd5b612eb087828801612d24565b91505092959194509250565b60008060408385031215612ecf57600080fd5b6000612edd85828601612cd0565b9250506020612eee85828601612ce5565b9150509250929050565b60008060408385031215612f0b57600080fd5b6000612f1985828601612cd0565b9250506020612f2a85828601612d78565b9150509250929050565b600060208284031215612f4657600080fd5b6000612f5484828501612ce5565b91505092915050565b600060208284031215612f6f57600080fd5b6000612f7d84828501612cfa565b91505092915050565b600060208284031215612f9857600080fd5b6000612fa684828501612d0f565b91505092915050565b600060208284031215612fc157600080fd5b600082013567ffffffffffffffff811115612fdb57600080fd5b612fe784828501612d4e565b91505092915050565b60006020828403121561300257600080fd5b600061301084828501612d78565b91505092915050565b600061302583836134de565b60208301905092915050565b61303a81613b9c565b82525050565b600061304b82613a1b565b6130558185613a49565b935061306083613a0b565b8060005b838110156130915781516130788882613019565b975061308383613a3c565b925050600181019050613064565b5085935050505092915050565b6130a781613bae565b82525050565b60006130b882613a26565b6130c28185613a5a565b93506130d2818560208601613c1f565b6130db81613df5565b840191505092915050565b60006130f182613a31565b6130fb8185613a6b565b935061310b818560208601613c1f565b61311481613df5565b840191505092915050565b600061312a82613a31565b6131348185613a7c565b9350613144818560208601613c1f565b80840191505092915050565b600061315d601083613a6b565b915061316882613e06565b602082019050919050565b6000613180602b83613a6b565b915061318b82613e2f565b604082019050919050565b60006131a3603283613a6b565b91506131ae82613e7e565b604082019050919050565b60006131c6602683613a6b565b91506131d182613ecd565b604082019050919050565b60006131e9601c83613a6b565b91506131f482613f1c565b602082019050919050565b600061320c602483613a6b565b915061321782613f45565b604082019050919050565b600061322f601983613a6b565b915061323a82613f94565b602082019050919050565b6000613252600583613a6b565b915061325d82613fbd565b602082019050919050565b6000613275600983613a6b565b915061328082613fe6565b602082019050919050565b6000613298602c83613a6b565b91506132a38261400f565b604082019050919050565b60006132bb603883613a6b565b91506132c68261405e565b604082019050919050565b60006132de600983613a6b565b91506132e9826140ad565b602082019050919050565b6000613301602a83613a6b565b915061330c826140d6565b604082019050919050565b6000613324602983613a6b565b915061332f82614125565b604082019050919050565b6000613347602083613a6b565b915061335282614174565b602082019050919050565b600061336a600883613a6b565b91506133758261419d565b602082019050919050565b600061338d602c83613a6b565b9150613398826141c6565b604082019050919050565b60006133b0602083613a6b565b91506133bb82614215565b602082019050919050565b60006133d3602983613a6b565b91506133de8261423e565b604082019050919050565b60006133f6602f83613a6b565b91506134018261428d565b604082019050919050565b6000613419601183613a6b565b9150613424826142dc565b602082019050919050565b600061343c602183613a6b565b915061344782614305565b604082019050919050565b600061345f600a83613a6b565b915061346a82614354565b602082019050919050565b6000613482603183613a6b565b915061348d8261437d565b604082019050919050565b60006134a5600c83613a6b565b91506134b0826143cc565b602082019050919050565b60006134c8602c83613a6b565b91506134d3826143f5565b604082019050919050565b6134e781613c06565b82525050565b6134f681613c06565b82525050565b61350d61350882613c06565b613cfe565b82525050565b600061351f828561311f565b915061352b828461311f565b91508190509392505050565b600061354382856134fc565b60208201915061355382846134fc565b6020820191508190509392505050565b60006020820190506135786000830184613031565b92915050565b60006080820190506135936000830187613031565b6135a06020830186613031565b6135ad60408301856134ed565b81810360608301526135bf81846130ad565b905095945050505050565b600060208201905081810360008301526135e48184613040565b905092915050565b6000602082019050613601600083018461309e565b92915050565b6000602082019050818103600083015261362181846130e6565b905092915050565b6000602082019050818103600083015261364281613150565b9050919050565b6000602082019050818103600083015261366281613173565b9050919050565b6000602082019050818103600083015261368281613196565b9050919050565b600060208201905081810360008301526136a2816131b9565b9050919050565b600060208201905081810360008301526136c2816131dc565b9050919050565b600060208201905081810360008301526136e2816131ff565b9050919050565b6000602082019050818103600083015261370281613222565b9050919050565b6000602082019050818103600083015261372281613245565b9050919050565b6000602082019050818103600083015261374281613268565b9050919050565b600060208201905081810360008301526137628161328b565b9050919050565b60006020820190508181036000830152613782816132ae565b9050919050565b600060208201905081810360008301526137a2816132d1565b9050919050565b600060208201905081810360008301526137c2816132f4565b9050919050565b600060208201905081810360008301526137e281613317565b9050919050565b600060208201905081810360008301526138028161333a565b9050919050565b600060208201905081810360008301526138228161335d565b9050919050565b6000602082019050818103600083015261384281613380565b9050919050565b60006020820190508181036000830152613862816133a3565b9050919050565b60006020820190508181036000830152613882816133c6565b9050919050565b600060208201905081810360008301526138a2816133e9565b9050919050565b600060208201905081810360008301526138c28161340c565b9050919050565b600060208201905081810360008301526138e28161342f565b9050919050565b6000602082019050818103600083015261390281613452565b9050919050565b6000602082019050818103600083015261392281613475565b9050919050565b6000602082019050818103600083015261394281613498565b9050919050565b60006020820190508181036000830152613962816134bb565b9050919050565b600060208201905061397e60008301846134ed565b92915050565b600061398e61399f565b905061399a8282613c84565b919050565b6000604051905090565b600067ffffffffffffffff8211156139c4576139c3613dc6565b5b6139cd82613df5565b9050602081019050919050565b600067ffffffffffffffff8211156139f5576139f4613dc6565b5b6139fe82613df5565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613a9282613c06565b9150613a9d83613c06565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ad257613ad1613d39565b5b828201905092915050565b6000613ae882613c06565b9150613af383613c06565b925082613b0357613b02613d68565b5b828204905092915050565b6000613b1982613c06565b9150613b2483613c06565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b5d57613b5c613d39565b5b828202905092915050565b6000613b7382613c06565b9150613b7e83613c06565b925082821015613b9157613b90613d39565b5b828203905092915050565b6000613ba782613be6565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613c3d578082015181840152602081019050613c22565b83811115613c4c576000848401525b50505050565b60006002820490506001821680613c6a57607f821691505b60208210811415613c7e57613c7d613d97565b5b50919050565b613c8d82613df5565b810181811067ffffffffffffffff82111715613cac57613cab613dc6565b5b80604052505050565b6000613cc082613c06565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613cf357613cf2613d39565b5b600182019050919050565b6000819050919050565b6000613d1382613c06565b9150613d1e83613c06565b925082613d2e57613d2d613d68565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f416c72656164792073656c656374656400000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f5061757365000000000000000000000000000000000000000000000000000000600082015250565b7f4d6178206c696d69740000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4578636565647320330000000000000000000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f53616c6520656e64000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f56616c75652062656c6f77207072696365000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4578636565647320323000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f53616c65206e6f7420656e640000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b61444d81613b9c565b811461445857600080fd5b50565b61446481613bae565b811461446f57600080fd5b50565b61447b81613bba565b811461448657600080fd5b50565b61449281613c06565b811461449d57600080fd5b5056fea26469706673582212209d065e8fe929284355b0cace4ba4206148cb687e34fdd7298b35c448d977b6a864736f6c63430008040033

Deployed Bytecode Sourcemap

145:2649:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;938:224:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2585:73:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1438:551;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2349:98:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3860:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3398:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1578:113:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4724:330:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1201:225:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1246:256:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;207:41:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5120:179:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2233:340:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1768:233:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2123:102:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;314:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2052:235:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1790:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1598:92:11;;;;;;;;;;;;;:::i;:::-;;573:620:5;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2666:125;;;:::i;:::-;;966:85:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2511:102:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4144:290;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5365:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;343:47:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2679:329:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4500:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1839:189:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;938:224:4;1040:4;1079:35;1064:50;;;:11;:50;;;;:90;;;;1118:36;1142:11;1118:23;:36::i;:::-;1064:90;1057:97;;938:224;;;:::o;2585:73:5:-;1189:12:11;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2647:3:5::1;2638:6;;:12;;;;;;;;;;;;;;;;;;2585:73:::0;:::o;1438:551::-;1189:12:11;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1534:13:5::1;:11;:13::i;:::-;244:4;1517:30;1509:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;1610:1;1584:14;1599:6;1584:22;;;;;;;;;;;;;;;;;:27;1576:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;1643:11;1673:1;244:4;1657:17;;;;:::i;:::-;1643:31;;1685:18;1741:15;1758:16;1724:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1714:62;;;;;;1706:71;;1685:92;;1814:3;1801:10;:16;;;;:::i;:::-;1788:29;;1828:19;1850;1858:10;1850:7;:19::i;:::-;1828:41;;1896:11;1888:25;;:46;1914:19;1888:46;;;;;;;;;;;;;;;;;;;;;;;1880:55;;;::::0;::::1;;1971:10;1946:14;1961:6;1946:22;;;;;;;;;;;;;;;;:35;;;;1248:1:11;;;1438:551:5::0;:::o;2349:98:3:-;2403:13;2435:5;2428:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2349:98;:::o;3860:217::-;3936:7;3963:16;3971:7;3963;:16::i;:::-;3955:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4046:15;:24;4062:7;4046:24;;;;;;;;;;;;;;;;;;;;;4039:31;;3860:217;;;:::o;3398:401::-;3478:13;3494:23;3509:7;3494:14;:23::i;:::-;3478:39;;3541:5;3535:11;;:2;:11;;;;3527:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3632:5;3616:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3641:37;3658:5;3665:12;:10;:12::i;:::-;3641:16;:37::i;:::-;3616:62;3595:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;3771:21;3780:2;3784:7;3771:8;:21::i;:::-;3398:401;;;:::o;1578:113:4:-;1639:7;1666:10;:17;;;;1659:24;;1578:113;:::o;4724:330:3:-;4913:41;4932:12;:10;:12::i;:::-;4946:7;4913:18;:41::i;:::-;4905:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5019:28;5029:4;5035:2;5039:7;5019:9;:28::i;:::-;4724:330;;;:::o;1201:225:5:-;1250:7;1290:3;1273:13;:11;:13::i;:::-;:20;1270:149;;1317:1;1310:8;;;;1270:149;1388:6;1368:17;:26;;;;:::i;:::-;1361:33;;1201:225;;;;:::o;1246:256:4:-;1343:7;1379:23;1396:5;1379:16;:23::i;:::-;1371:5;:31;1363:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1468:12;:19;1481:5;1468:19;;;;;;;;;;;;;;;:26;1488:5;1468:26;;;;;;;;;;;;1461:33;;1246:256;;;;:::o;207:41:5:-;244:4;207:41;:::o;5120:179:3:-;5253:39;5270:4;5276:2;5280:7;5253:39;;;;;;;;;;;;:16;:39::i;:::-;5120:179;;;:::o;2233:340:5:-;2294:16;2323:15;2341:17;2351:6;2341:9;:17::i;:::-;2323:35;;2369:25;2411:10;2397:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2369:53;;2437:6;2433:107;2453:10;2449:1;:14;2433:107;;;2498:30;2518:6;2526:1;2498:19;:30::i;:::-;2484:8;2493:1;2484:11;;;;;;;;;;;;;;;;;;;;;:44;;;;;2465:3;;;;;:::i;:::-;;;;2433:107;;;;2557:8;2550:15;;;;2233:340;;;:::o;1768:233:4:-;1843:7;1879:30;:28;:30::i;:::-;1871:5;:38;1863:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;1976:10;1987:5;1976:17;;;;;;;;;;;;;;;;;;;;;;;;1969:24;;1768:233;;;:::o;2123:102:5:-;1189:12:11;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2210:7:5::1;2194:13;:23;;;;;;;;;;;;:::i;:::-;;2123:102:::0;:::o;314:25::-;;;;;;;;;;;;;:::o;2052:235:3:-;2124:7;2143:13;2159:7;:16;2167:7;2159:16;;;;;;;;;;;;;;;;;;;;;2143:32;;2210:1;2193:19;;:5;:19;;;;2185:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2275:5;2268:12;;;2052:235;;;:::o;1790:205::-;1862:7;1906:1;1889:19;;:5;:19;;;;1881:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;1972:9;:16;1982:5;1972:16;;;;;;;;;;;;;;;;1965:23;;1790:205;;;:::o;1598:92:11:-;1189:12;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1662:21:::1;1680:1;1662:9;:21::i;:::-;1598:92::o:0;573:620:5:-;665:7;:5;:7::i;:::-;651:21;;:10;:21;;;648:77;;697:6;;;;;;;;;;;696:7;688:25;;;;;;;;;;;;:::i;:::-;;;;;;;;;648:77;244:4;759:6;743:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:39;;735:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;244:4;815:13;:11;:13::i;:::-;:29;807:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;888:3;871:13;:11;:13::i;:::-;:20;868:151;;926:1;916:6;:11;;908:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;868:151;;;990:2;980:6;:12;;972:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;868:151;1050:13;1056:6;1050:5;:13::i;:::-;1037:9;:26;;1029:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;1102:6;1098:88;1118:6;1114:1;:10;1098:88;;;1145:29;1155:3;1160:13;:11;:13::i;:::-;1145:9;:29::i;:::-;1126:3;;;;;:::i;:::-;;;;1098:88;;;;573:620;;:::o;2666:125::-;1189:12:11;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2741:12:5::1;:10;:12::i;:::-;2733:26;;:49;2760:21;2733:49;;;;;;;;;;;;;;;;;;;;;;;2725:58;;;::::0;::::1;;2666:125::o:0;966:85:11:-;1012:7;1038:6;;;;;;;;;;;1031:13;;966:85;:::o;2511:102:3:-;2567:13;2599:7;2592:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2511:102;:::o;4144:290::-;4258:12;:10;:12::i;:::-;4246:24;;:8;:24;;;;4238:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4356:8;4311:18;:32;4330:12;:10;:12::i;:::-;4311:32;;;;;;;;;;;;;;;:42;4344:8;4311:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;4408:8;4379:48;;4394:12;:10;:12::i;:::-;4379:48;;;4418:8;4379:48;;;;;;:::i;:::-;;;;;;;;4144:290;;:::o;5365:320::-;5534:41;5553:12;:10;:12::i;:::-;5567:7;5534:18;:41::i;:::-;5526:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5639:39;5653:4;5659:2;5663:7;5672:5;5639:13;:39::i;:::-;5365:320;;;;:::o;343:47:5:-;;;;;;;;;;;;;;;;;;;;:::o;2679:329:3:-;2752:13;2785:16;2793:7;2785;:16::i;:::-;2777:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;2864:21;2888:10;:8;:10::i;:::-;2864:34;;2939:1;2921:7;2915:21;:25;:86;;;;;;;;;;;;;;;;;2967:7;2976:18;:7;:16;:18::i;:::-;2950:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2915:86;2908:93;;;2679:329;;;:::o;4500:162::-;4597:4;4620:18;:25;4639:5;4620:25;;;;;;;;;;;;;;;:35;4646:8;4620:35;;;;;;;;;;;;;;;;;;;;;;;;;4613:42;;4500:162;;;;:::o;1839:189:11:-;1189:12;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1947:1:::1;1927:22;;:8;:22;;;;1919:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2002:19;2012:8;2002:9;:19::i;:::-;1839:189:::0;:::o;718:377:0:-;778:4;981:12;1046:7;1034:20;1026:28;;1087:1;1080:4;:8;1073:15;;;718:377;;;:::o;13070:122:3:-;;;;:::o;1431:300::-;1533:4;1583:25;1568:40;;;:11;:40;;;;:104;;;;1639:33;1624:48;;;:11;:48;;;;1568:104;:156;;;;1688:36;1712:11;1688:23;:36::i;:::-;1568:156;1549:175;;1431:300;;;:::o;586:96:1:-;639:7;665:10;658:17;;586:96;:::o;7157:125:3:-;7222:4;7273:1;7245:30;;:7;:16;7253:7;7245:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7238:37;;7157:125;;;:::o;11008:171::-;11109:2;11082:15;:24;11098:7;11082:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11164:7;11160:2;11126:46;;11135:23;11150:7;11135:14;:23::i;:::-;11126:46;;;;;;;;;;;;11008:171;;:::o;7440:344::-;7533:4;7557:16;7565:7;7557;:16::i;:::-;7549:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7632:13;7648:23;7663:7;7648:14;:23::i;:::-;7632:39;;7700:5;7689:16;;:7;:16;;;:51;;;;7733:7;7709:31;;:20;7721:7;7709:11;:20::i;:::-;:31;;;7689:51;:87;;;;7744:32;7761:5;7768:7;7744:16;:32::i;:::-;7689:87;7681:96;;;7440:344;;;;:::o;10337:560::-;10491:4;10464:31;;:23;10479:7;10464:14;:23::i;:::-;:31;;;10456:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10573:1;10559:16;;:2;:16;;;;10551:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10627:39;10648:4;10654:2;10658:7;10627:20;:39::i;:::-;10728:29;10745:1;10749:7;10728:8;:29::i;:::-;10787:1;10768:9;:15;10778:4;10768:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10815:1;10798:9;:13;10808:2;10798:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10845:2;10826:7;:16;10834:7;10826:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10882:7;10878:2;10863:27;;10872:4;10863:27;;;;;;;;;;;;10337:560;;;:::o;2034:169:11:-;2089:16;2108:6;;;;;;;;;;;2089:25;;2133:8;2124:6;;:17;;;;;;;;;;;;;;;;;;2187:8;2156:40;;2177:8;2156:40;;;;;;;;;;;;2034:169;;:::o;8114:108:3:-;8189:26;8199:2;8203:7;8189:26;;;;;;;;;;;;:9;:26::i;:::-;8114:108;;:::o;6547:307::-;6698:28;6708:4;6714:2;6718:7;6698:9;:28::i;:::-;6744:48;6767:4;6773:2;6777:7;6786:5;6744:22;:48::i;:::-;6736:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6547:307;;;;:::o;1997:114:5:-;2057:13;2090;2083:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1997:114;:::o;275:703:12:-;331:13;557:1;548:5;:10;544:51;;;574:10;;;;;;;;;;;;;;;;;;;;;544:51;604:12;619:5;604:20;;634:14;658:75;673:1;665:4;:9;658:75;;690:8;;;;;:::i;:::-;;;;720:2;712:10;;;;;:::i;:::-;;;658:75;;;742:19;774:6;764:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;742:39;;791:150;807:1;798:5;:10;791:150;;834:1;824:11;;;;;:::i;:::-;;;900:2;892:5;:10;;;;:::i;:::-;879:2;:24;;;;:::i;:::-;866:39;;849:6;856;849:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;928:2;919:11;;;;;:::i;:::-;;;791:150;;;964:6;950:21;;;;;275:703;;;;:::o;763:155:2:-;848:4;886:25;871:40;;;:11;:40;;;;864:47;;763:155;;;:::o;2614:589:4:-;2758:45;2785:4;2791:2;2795:7;2758:26;:45::i;:::-;2836:1;2820:18;;:4;:18;;;2816:187;;;2855:40;2887:7;2855:31;:40::i;:::-;2816:187;;;2925:2;2917:10;;:4;:10;;;2913:90;;2944:47;2977:4;2983:7;2944:32;:47::i;:::-;2913:90;2816:187;3031:1;3017:16;;:2;:16;;;3013:183;;;3050:45;3087:7;3050:36;:45::i;:::-;3013:183;;;3123:4;3117:10;;:2;:10;;;3113:83;;3144:40;3172:2;3176:7;3144:27;:40::i;:::-;3113:83;3013:183;2614:589;;;:::o;8443:311:3:-;8568:18;8574:2;8578:7;8568:5;:18::i;:::-;8617:54;8648:1;8652:2;8656:7;8665:5;8617:22;:54::i;:::-;8596:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;8443:311;;;:::o;11732:782::-;11882:4;11902:15;:2;:13;;;:15::i;:::-;11898:610;;;11953:2;11937:36;;;11974:12;:10;:12::i;:::-;11988:4;11994:7;12003:5;11937:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;11933:523;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12197:1;12180:6;:13;:18;12176:266;;;12222:60;;;;;;;;;;:::i;:::-;;;;;;;;12176:266;12394:6;12388:13;12379:6;12375:2;12371:15;12364:38;11933:523;12069:45;;;12059:55;;;:6;:55;;;;12052:62;;;;;11898:610;12493:4;12486:11;;11732:782;;;;;;;:::o;3926:164:4:-;4030:10;:17;;;;4003:15;:24;4019:7;4003:24;;;;;;;;;;;:44;;;;4058:10;4074:7;4058:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3926:164;:::o;4717:988::-;4983:22;5033:1;5008:22;5025:4;5008:16;:22::i;:::-;:26;;;;:::i;:::-;4983:51;;5045:18;5066:17;:26;5084:7;5066:26;;;;;;;;;;;;5045:47;;5213:14;5199:10;:28;5195:328;;5244:19;5266:12;:18;5279:4;5266:18;;;;;;;;;;;;;;;:34;5285:14;5266:34;;;;;;;;;;;;5244:56;;5350:11;5317:12;:18;5330:4;5317:18;;;;;;;;;;;;;;;:30;5336:10;5317:30;;;;;;;;;;;:44;;;;5467:10;5434:17;:30;5452:11;5434:30;;;;;;;;;;;:43;;;;5195:328;;5619:17;:26;5637:7;5619:26;;;;;;;;;;;5612:33;;;5663:12;:18;5676:4;5663:18;;;;;;;;;;;;;;;:34;5682:14;5663:34;;;;;;;;;;;5656:41;;;4717:988;;;;:::o;6000:1079::-;6253:22;6298:1;6278:10;:17;;;;:21;;;;:::i;:::-;6253:46;;6310:18;6331:15;:24;6347:7;6331:24;;;;;;;;;;;;6310:45;;6682:19;6704:10;6715:14;6704:26;;;;;;;;;;;;;;;;;;;;;;;;6682:48;;6768:11;6743:10;6754;6743:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;6879:10;6848:15;:28;6864:11;6848:28;;;;;;;;;;;:41;;;;7020:15;:24;7036:7;7020:24;;;;;;;;;;;7013:31;;;7055:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6000:1079;;;;:::o;3504:221::-;3589:14;3606:20;3623:2;3606:16;:20::i;:::-;3589:37;;3664:7;3637:12;:16;3650:2;3637:16;;;;;;;;;;;;;;;:24;3654:6;3637:24;;;;;;;;;;;:34;;;;3711:6;3682:17;:26;3700:7;3682:26;;;;;;;;;;;:35;;;;3504:221;;;:::o;9076:372:3:-;9169:1;9155:16;;:2;:16;;;;9147:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9227:16;9235:7;9227;:16::i;:::-;9226:17;9218:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9287:45;9316:1;9320:2;9324:7;9287:20;:45::i;:::-;9360:1;9343:9;:13;9353:2;9343:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9390:2;9371:7;:16;9379:7;9371:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9433:7;9429:2;9408:33;;9425:1;9408:33;;;;;;;;;;;;9076:372;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:13:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1036:5;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;1190:5;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;1349:5;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;1641:5;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1864:139::-;1910:5;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:262::-;2068:6;2117:2;2105:9;2096:7;2092:23;2088:32;2085:2;;;2133:1;2130;2123:12;2085:2;2176:1;2201:53;2246:7;2237:6;2226:9;2222:22;2201:53;:::i;:::-;2191:63;;2147:117;2075:196;;;;:::o;2277:407::-;2345:6;2353;2402:2;2390:9;2381:7;2377:23;2373:32;2370:2;;;2418:1;2415;2408:12;2370:2;2461:1;2486:53;2531:7;2522:6;2511:9;2507:22;2486:53;:::i;:::-;2476:63;;2432:117;2588:2;2614:53;2659:7;2650:6;2639:9;2635:22;2614:53;:::i;:::-;2604:63;;2559:118;2360:324;;;;;:::o;2690:552::-;2767:6;2775;2783;2832:2;2820:9;2811:7;2807:23;2803:32;2800:2;;;2848:1;2845;2838:12;2800:2;2891:1;2916:53;2961:7;2952:6;2941:9;2937:22;2916:53;:::i;:::-;2906:63;;2862:117;3018:2;3044:53;3089:7;3080:6;3069:9;3065:22;3044:53;:::i;:::-;3034:63;;2989:118;3146:2;3172:53;3217:7;3208:6;3197:9;3193:22;3172:53;:::i;:::-;3162:63;;3117:118;2790:452;;;;;:::o;3248:809::-;3343:6;3351;3359;3367;3416:3;3404:9;3395:7;3391:23;3387:33;3384:2;;;3433:1;3430;3423:12;3384:2;3476:1;3501:53;3546:7;3537:6;3526:9;3522:22;3501:53;:::i;:::-;3491:63;;3447:117;3603:2;3629:53;3674:7;3665:6;3654:9;3650:22;3629:53;:::i;:::-;3619:63;;3574:118;3731:2;3757:53;3802:7;3793:6;3782:9;3778:22;3757:53;:::i;:::-;3747:63;;3702:118;3887:2;3876:9;3872:18;3859:32;3918:18;3910:6;3907:30;3904:2;;;3950:1;3947;3940:12;3904:2;3978:62;4032:7;4023:6;4012:9;4008:22;3978:62;:::i;:::-;3968:72;;3830:220;3374:683;;;;;;;:::o;4063:401::-;4128:6;4136;4185:2;4173:9;4164:7;4160:23;4156:32;4153:2;;;4201:1;4198;4191:12;4153:2;4244:1;4269:53;4314:7;4305:6;4294:9;4290:22;4269:53;:::i;:::-;4259:63;;4215:117;4371:2;4397:50;4439:7;4430:6;4419:9;4415:22;4397:50;:::i;:::-;4387:60;;4342:115;4143:321;;;;;:::o;4470:407::-;4538:6;4546;4595:2;4583:9;4574:7;4570:23;4566:32;4563:2;;;4611:1;4608;4601:12;4563:2;4654:1;4679:53;4724:7;4715:6;4704:9;4700:22;4679:53;:::i;:::-;4669:63;;4625:117;4781:2;4807:53;4852:7;4843:6;4832:9;4828:22;4807:53;:::i;:::-;4797:63;;4752:118;4553:324;;;;;:::o;4883:256::-;4939:6;4988:2;4976:9;4967:7;4963:23;4959:32;4956:2;;;5004:1;5001;4994:12;4956:2;5047:1;5072:50;5114:7;5105:6;5094:9;5090:22;5072:50;:::i;:::-;5062:60;;5018:114;4946:193;;;;:::o;5145:260::-;5203:6;5252:2;5240:9;5231:7;5227:23;5223:32;5220:2;;;5268:1;5265;5258:12;5220:2;5311:1;5336:52;5380:7;5371:6;5360:9;5356:22;5336:52;:::i;:::-;5326:62;;5282:116;5210:195;;;;:::o;5411:282::-;5480:6;5529:2;5517:9;5508:7;5504:23;5500:32;5497:2;;;5545:1;5542;5535:12;5497:2;5588:1;5613:63;5668:7;5659:6;5648:9;5644:22;5613:63;:::i;:::-;5603:73;;5559:127;5487:206;;;;:::o;5699:375::-;5768:6;5817:2;5805:9;5796:7;5792:23;5788:32;5785:2;;;5833:1;5830;5823:12;5785:2;5904:1;5893:9;5889:17;5876:31;5934:18;5926:6;5923:30;5920:2;;;5966:1;5963;5956:12;5920:2;5994:63;6049:7;6040:6;6029:9;6025:22;5994:63;:::i;:::-;5984:73;;5847:220;5775:299;;;;:::o;6080:262::-;6139:6;6188:2;6176:9;6167:7;6163:23;6159:32;6156:2;;;6204:1;6201;6194:12;6156:2;6247:1;6272:53;6317:7;6308:6;6297:9;6293:22;6272:53;:::i;:::-;6262:63;;6218:117;6146:196;;;;:::o;6348:179::-;6417:10;6438:46;6480:3;6472:6;6438:46;:::i;:::-;6516:4;6511:3;6507:14;6493:28;;6428:99;;;;:::o;6533:118::-;6620:24;6638:5;6620:24;:::i;:::-;6615:3;6608:37;6598:53;;:::o;6687:732::-;6806:3;6835:54;6883:5;6835:54;:::i;:::-;6905:86;6984:6;6979:3;6905:86;:::i;:::-;6898:93;;7015:56;7065:5;7015:56;:::i;:::-;7094:7;7125:1;7110:284;7135:6;7132:1;7129:13;7110:284;;;7211:6;7205:13;7238:63;7297:3;7282:13;7238:63;:::i;:::-;7231:70;;7324:60;7377:6;7324:60;:::i;:::-;7314:70;;7170:224;7157:1;7154;7150:9;7145:14;;7110:284;;;7114:14;7410:3;7403:10;;6811:608;;;;;;;:::o;7425:109::-;7506:21;7521:5;7506:21;:::i;:::-;7501:3;7494:34;7484:50;;:::o;7540:360::-;7626:3;7654:38;7686:5;7654:38;:::i;:::-;7708:70;7771:6;7766:3;7708:70;:::i;:::-;7701:77;;7787:52;7832:6;7827:3;7820:4;7813:5;7809:16;7787:52;:::i;:::-;7864:29;7886:6;7864:29;:::i;:::-;7859:3;7855:39;7848:46;;7630:270;;;;;:::o;7906:364::-;7994:3;8022:39;8055:5;8022:39;:::i;:::-;8077:71;8141:6;8136:3;8077:71;:::i;:::-;8070:78;;8157:52;8202:6;8197:3;8190:4;8183:5;8179:16;8157:52;:::i;:::-;8234:29;8256:6;8234:29;:::i;:::-;8229:3;8225:39;8218:46;;7998:272;;;;;:::o;8276:377::-;8382:3;8410:39;8443:5;8410:39;:::i;:::-;8465:89;8547:6;8542:3;8465:89;:::i;:::-;8458:96;;8563:52;8608:6;8603:3;8596:4;8589:5;8585:16;8563:52;:::i;:::-;8640:6;8635:3;8631:16;8624:23;;8386:267;;;;;:::o;8659:366::-;8801:3;8822:67;8886:2;8881:3;8822:67;:::i;:::-;8815:74;;8898:93;8987:3;8898:93;:::i;:::-;9016:2;9011:3;9007:12;9000:19;;8805:220;;;:::o;9031:366::-;9173:3;9194:67;9258:2;9253:3;9194:67;:::i;:::-;9187:74;;9270:93;9359:3;9270:93;:::i;:::-;9388:2;9383:3;9379:12;9372:19;;9177:220;;;:::o;9403:366::-;9545:3;9566:67;9630:2;9625:3;9566:67;:::i;:::-;9559:74;;9642:93;9731:3;9642:93;:::i;:::-;9760:2;9755:3;9751:12;9744:19;;9549:220;;;:::o;9775:366::-;9917:3;9938:67;10002:2;9997:3;9938:67;:::i;:::-;9931:74;;10014:93;10103:3;10014:93;:::i;:::-;10132:2;10127:3;10123:12;10116:19;;9921:220;;;:::o;10147:366::-;10289:3;10310:67;10374:2;10369:3;10310:67;:::i;:::-;10303:74;;10386:93;10475:3;10386:93;:::i;:::-;10504:2;10499:3;10495:12;10488:19;;10293:220;;;:::o;10519:366::-;10661:3;10682:67;10746:2;10741:3;10682:67;:::i;:::-;10675:74;;10758:93;10847:3;10758:93;:::i;:::-;10876:2;10871:3;10867:12;10860:19;;10665:220;;;:::o;10891:366::-;11033:3;11054:67;11118:2;11113:3;11054:67;:::i;:::-;11047:74;;11130:93;11219:3;11130:93;:::i;:::-;11248:2;11243:3;11239:12;11232:19;;11037:220;;;:::o;11263:365::-;11405:3;11426:66;11490:1;11485:3;11426:66;:::i;:::-;11419:73;;11501:93;11590:3;11501:93;:::i;:::-;11619:2;11614:3;11610:12;11603:19;;11409:219;;;:::o;11634:365::-;11776:3;11797:66;11861:1;11856:3;11797:66;:::i;:::-;11790:73;;11872:93;11961:3;11872:93;:::i;:::-;11990:2;11985:3;11981:12;11974:19;;11780:219;;;:::o;12005:366::-;12147:3;12168:67;12232:2;12227:3;12168:67;:::i;:::-;12161:74;;12244:93;12333:3;12244:93;:::i;:::-;12362:2;12357:3;12353:12;12346:19;;12151:220;;;:::o;12377:366::-;12519:3;12540:67;12604:2;12599:3;12540:67;:::i;:::-;12533:74;;12616:93;12705:3;12616:93;:::i;:::-;12734:2;12729:3;12725:12;12718:19;;12523:220;;;:::o;12749:365::-;12891:3;12912:66;12976:1;12971:3;12912:66;:::i;:::-;12905:73;;12987:93;13076:3;12987:93;:::i;:::-;13105:2;13100:3;13096:12;13089:19;;12895:219;;;:::o;13120:366::-;13262:3;13283:67;13347:2;13342:3;13283:67;:::i;:::-;13276:74;;13359:93;13448:3;13359:93;:::i;:::-;13477:2;13472:3;13468:12;13461:19;;13266:220;;;:::o;13492:366::-;13634:3;13655:67;13719:2;13714:3;13655:67;:::i;:::-;13648:74;;13731:93;13820:3;13731:93;:::i;:::-;13849:2;13844:3;13840:12;13833:19;;13638:220;;;:::o;13864:366::-;14006:3;14027:67;14091:2;14086:3;14027:67;:::i;:::-;14020:74;;14103:93;14192:3;14103:93;:::i;:::-;14221:2;14216:3;14212:12;14205:19;;14010:220;;;:::o;14236:365::-;14378:3;14399:66;14463:1;14458:3;14399:66;:::i;:::-;14392:73;;14474:93;14563:3;14474:93;:::i;:::-;14592:2;14587:3;14583:12;14576:19;;14382:219;;;:::o;14607:366::-;14749:3;14770:67;14834:2;14829:3;14770:67;:::i;:::-;14763:74;;14846:93;14935:3;14846:93;:::i;:::-;14964:2;14959:3;14955:12;14948:19;;14753:220;;;:::o;14979:366::-;15121:3;15142:67;15206:2;15201:3;15142:67;:::i;:::-;15135:74;;15218:93;15307:3;15218:93;:::i;:::-;15336:2;15331:3;15327:12;15320:19;;15125:220;;;:::o;15351:366::-;15493:3;15514:67;15578:2;15573:3;15514:67;:::i;:::-;15507:74;;15590:93;15679:3;15590:93;:::i;:::-;15708:2;15703:3;15699:12;15692:19;;15497:220;;;:::o;15723:366::-;15865:3;15886:67;15950:2;15945:3;15886:67;:::i;:::-;15879:74;;15962:93;16051:3;15962:93;:::i;:::-;16080:2;16075:3;16071:12;16064:19;;15869:220;;;:::o;16095:366::-;16237:3;16258:67;16322:2;16317:3;16258:67;:::i;:::-;16251:74;;16334:93;16423:3;16334:93;:::i;:::-;16452:2;16447:3;16443:12;16436:19;;16241:220;;;:::o;16467:366::-;16609:3;16630:67;16694:2;16689:3;16630:67;:::i;:::-;16623:74;;16706:93;16795:3;16706:93;:::i;:::-;16824:2;16819:3;16815:12;16808:19;;16613:220;;;:::o;16839:366::-;16981:3;17002:67;17066:2;17061:3;17002:67;:::i;:::-;16995:74;;17078:93;17167:3;17078:93;:::i;:::-;17196:2;17191:3;17187:12;17180:19;;16985:220;;;:::o;17211:366::-;17353:3;17374:67;17438:2;17433:3;17374:67;:::i;:::-;17367:74;;17450:93;17539:3;17450:93;:::i;:::-;17568:2;17563:3;17559:12;17552:19;;17357:220;;;:::o;17583:366::-;17725:3;17746:67;17810:2;17805:3;17746:67;:::i;:::-;17739:74;;17822:93;17911:3;17822:93;:::i;:::-;17940:2;17935:3;17931:12;17924:19;;17729:220;;;:::o;17955:366::-;18097:3;18118:67;18182:2;18177:3;18118:67;:::i;:::-;18111:74;;18194:93;18283:3;18194:93;:::i;:::-;18312:2;18307:3;18303:12;18296:19;;18101:220;;;:::o;18327:108::-;18404:24;18422:5;18404:24;:::i;:::-;18399:3;18392:37;18382:53;;:::o;18441:118::-;18528:24;18546:5;18528:24;:::i;:::-;18523:3;18516:37;18506:53;;:::o;18565:157::-;18670:45;18690:24;18708:5;18690:24;:::i;:::-;18670:45;:::i;:::-;18665:3;18658:58;18648:74;;:::o;18728:435::-;18908:3;18930:95;19021:3;19012:6;18930:95;:::i;:::-;18923:102;;19042:95;19133:3;19124:6;19042:95;:::i;:::-;19035:102;;19154:3;19147:10;;18912:251;;;;;:::o;19169:397::-;19309:3;19324:75;19395:3;19386:6;19324:75;:::i;:::-;19424:2;19419:3;19415:12;19408:19;;19437:75;19508:3;19499:6;19437:75;:::i;:::-;19537:2;19532:3;19528:12;19521:19;;19557:3;19550:10;;19313:253;;;;;:::o;19572:222::-;19665:4;19703:2;19692:9;19688:18;19680:26;;19716:71;19784:1;19773:9;19769:17;19760:6;19716:71;:::i;:::-;19670:124;;;;:::o;19800:640::-;19995:4;20033:3;20022:9;20018:19;20010:27;;20047:71;20115:1;20104:9;20100:17;20091:6;20047:71;:::i;:::-;20128:72;20196:2;20185:9;20181:18;20172:6;20128:72;:::i;:::-;20210;20278:2;20267:9;20263:18;20254:6;20210:72;:::i;:::-;20329:9;20323:4;20319:20;20314:2;20303:9;20299:18;20292:48;20357:76;20428:4;20419:6;20357:76;:::i;:::-;20349:84;;20000:440;;;;;;;:::o;20446:373::-;20589:4;20627:2;20616:9;20612:18;20604:26;;20676:9;20670:4;20666:20;20662:1;20651:9;20647:17;20640:47;20704:108;20807:4;20798:6;20704:108;:::i;:::-;20696:116;;20594:225;;;;:::o;20825:210::-;20912:4;20950:2;20939:9;20935:18;20927:26;;20963:65;21025:1;21014:9;21010:17;21001:6;20963:65;:::i;:::-;20917:118;;;;:::o;21041:313::-;21154:4;21192:2;21181:9;21177:18;21169:26;;21241:9;21235:4;21231:20;21227:1;21216:9;21212:17;21205:47;21269:78;21342:4;21333:6;21269:78;:::i;:::-;21261:86;;21159:195;;;;:::o;21360:419::-;21526:4;21564:2;21553:9;21549:18;21541:26;;21613:9;21607:4;21603:20;21599:1;21588:9;21584:17;21577:47;21641:131;21767:4;21641:131;:::i;:::-;21633:139;;21531:248;;;:::o;21785:419::-;21951:4;21989:2;21978:9;21974:18;21966:26;;22038:9;22032:4;22028:20;22024:1;22013:9;22009:17;22002:47;22066:131;22192:4;22066:131;:::i;:::-;22058:139;;21956:248;;;:::o;22210:419::-;22376:4;22414:2;22403:9;22399:18;22391:26;;22463:9;22457:4;22453:20;22449:1;22438:9;22434:17;22427:47;22491:131;22617:4;22491:131;:::i;:::-;22483:139;;22381:248;;;:::o;22635:419::-;22801:4;22839:2;22828:9;22824:18;22816:26;;22888:9;22882:4;22878:20;22874:1;22863:9;22859:17;22852:47;22916:131;23042:4;22916:131;:::i;:::-;22908:139;;22806:248;;;:::o;23060:419::-;23226:4;23264:2;23253:9;23249:18;23241:26;;23313:9;23307:4;23303:20;23299:1;23288:9;23284:17;23277:47;23341:131;23467:4;23341:131;:::i;:::-;23333:139;;23231:248;;;:::o;23485:419::-;23651:4;23689:2;23678:9;23674:18;23666:26;;23738:9;23732:4;23728:20;23724:1;23713:9;23709:17;23702:47;23766:131;23892:4;23766:131;:::i;:::-;23758:139;;23656:248;;;:::o;23910:419::-;24076:4;24114:2;24103:9;24099:18;24091:26;;24163:9;24157:4;24153:20;24149:1;24138:9;24134:17;24127:47;24191:131;24317:4;24191:131;:::i;:::-;24183:139;;24081:248;;;:::o;24335:419::-;24501:4;24539:2;24528:9;24524:18;24516:26;;24588:9;24582:4;24578:20;24574:1;24563:9;24559:17;24552:47;24616:131;24742:4;24616:131;:::i;:::-;24608:139;;24506:248;;;:::o;24760:419::-;24926:4;24964:2;24953:9;24949:18;24941:26;;25013:9;25007:4;25003:20;24999:1;24988:9;24984:17;24977:47;25041:131;25167:4;25041:131;:::i;:::-;25033:139;;24931:248;;;:::o;25185:419::-;25351:4;25389:2;25378:9;25374:18;25366:26;;25438:9;25432:4;25428:20;25424:1;25413:9;25409:17;25402:47;25466:131;25592:4;25466:131;:::i;:::-;25458:139;;25356:248;;;:::o;25610:419::-;25776:4;25814:2;25803:9;25799:18;25791:26;;25863:9;25857:4;25853:20;25849:1;25838:9;25834:17;25827:47;25891:131;26017:4;25891:131;:::i;:::-;25883:139;;25781:248;;;:::o;26035:419::-;26201:4;26239:2;26228:9;26224:18;26216:26;;26288:9;26282:4;26278:20;26274:1;26263:9;26259:17;26252:47;26316:131;26442:4;26316:131;:::i;:::-;26308:139;;26206:248;;;:::o;26460:419::-;26626:4;26664:2;26653:9;26649:18;26641:26;;26713:9;26707:4;26703:20;26699:1;26688:9;26684:17;26677:47;26741:131;26867:4;26741:131;:::i;:::-;26733:139;;26631:248;;;:::o;26885:419::-;27051:4;27089:2;27078:9;27074:18;27066:26;;27138:9;27132:4;27128:20;27124:1;27113:9;27109:17;27102:47;27166:131;27292:4;27166:131;:::i;:::-;27158:139;;27056:248;;;:::o;27310:419::-;27476:4;27514:2;27503:9;27499:18;27491:26;;27563:9;27557:4;27553:20;27549:1;27538:9;27534:17;27527:47;27591:131;27717:4;27591:131;:::i;:::-;27583:139;;27481:248;;;:::o;27735:419::-;27901:4;27939:2;27928:9;27924:18;27916:26;;27988:9;27982:4;27978:20;27974:1;27963:9;27959:17;27952:47;28016:131;28142:4;28016:131;:::i;:::-;28008:139;;27906:248;;;:::o;28160:419::-;28326:4;28364:2;28353:9;28349:18;28341:26;;28413:9;28407:4;28403:20;28399:1;28388:9;28384:17;28377:47;28441:131;28567:4;28441:131;:::i;:::-;28433:139;;28331:248;;;:::o;28585:419::-;28751:4;28789:2;28778:9;28774:18;28766:26;;28838:9;28832:4;28828:20;28824:1;28813:9;28809:17;28802:47;28866:131;28992:4;28866:131;:::i;:::-;28858:139;;28756:248;;;:::o;29010:419::-;29176:4;29214:2;29203:9;29199:18;29191:26;;29263:9;29257:4;29253:20;29249:1;29238:9;29234:17;29227:47;29291:131;29417:4;29291:131;:::i;:::-;29283:139;;29181:248;;;:::o;29435:419::-;29601:4;29639:2;29628:9;29624:18;29616:26;;29688:9;29682:4;29678:20;29674:1;29663:9;29659:17;29652:47;29716:131;29842:4;29716:131;:::i;:::-;29708:139;;29606:248;;;:::o;29860:419::-;30026:4;30064:2;30053:9;30049:18;30041:26;;30113:9;30107:4;30103:20;30099:1;30088:9;30084:17;30077:47;30141:131;30267:4;30141:131;:::i;:::-;30133:139;;30031:248;;;:::o;30285:419::-;30451:4;30489:2;30478:9;30474:18;30466:26;;30538:9;30532:4;30528:20;30524:1;30513:9;30509:17;30502:47;30566:131;30692:4;30566:131;:::i;:::-;30558:139;;30456:248;;;:::o;30710:419::-;30876:4;30914:2;30903:9;30899:18;30891:26;;30963:9;30957:4;30953:20;30949:1;30938:9;30934:17;30927:47;30991:131;31117:4;30991:131;:::i;:::-;30983:139;;30881:248;;;:::o;31135:419::-;31301:4;31339:2;31328:9;31324:18;31316:26;;31388:9;31382:4;31378:20;31374:1;31363:9;31359:17;31352:47;31416:131;31542:4;31416:131;:::i;:::-;31408:139;;31306:248;;;:::o;31560:419::-;31726:4;31764:2;31753:9;31749:18;31741:26;;31813:9;31807:4;31803:20;31799:1;31788:9;31784:17;31777:47;31841:131;31967:4;31841:131;:::i;:::-;31833:139;;31731:248;;;:::o;31985:419::-;32151:4;32189:2;32178:9;32174:18;32166:26;;32238:9;32232:4;32228:20;32224:1;32213:9;32209:17;32202:47;32266:131;32392:4;32266:131;:::i;:::-;32258:139;;32156:248;;;:::o;32410:222::-;32503:4;32541:2;32530:9;32526:18;32518:26;;32554:71;32622:1;32611:9;32607:17;32598:6;32554:71;:::i;:::-;32508:124;;;;:::o;32638:129::-;32672:6;32699:20;;:::i;:::-;32689:30;;32728:33;32756:4;32748:6;32728:33;:::i;:::-;32679:88;;;:::o;32773:75::-;32806:6;32839:2;32833:9;32823:19;;32813:35;:::o;32854:307::-;32915:4;33005:18;32997:6;32994:30;32991:2;;;33027:18;;:::i;:::-;32991:2;33065:29;33087:6;33065:29;:::i;:::-;33057:37;;33149:4;33143;33139:15;33131:23;;32920:241;;;:::o;33167:308::-;33229:4;33319:18;33311:6;33308:30;33305:2;;;33341:18;;:::i;:::-;33305:2;33379:29;33401:6;33379:29;:::i;:::-;33371:37;;33463:4;33457;33453:15;33445:23;;33234:241;;;:::o;33481:132::-;33548:4;33571:3;33563:11;;33601:4;33596:3;33592:14;33584:22;;33553:60;;;:::o;33619:114::-;33686:6;33720:5;33714:12;33704:22;;33693:40;;;:::o;33739:98::-;33790:6;33824:5;33818:12;33808:22;;33797:40;;;:::o;33843:99::-;33895:6;33929:5;33923:12;33913:22;;33902:40;;;:::o;33948:113::-;34018:4;34050;34045:3;34041:14;34033:22;;34023:38;;;:::o;34067:184::-;34166:11;34200:6;34195:3;34188:19;34240:4;34235:3;34231:14;34216:29;;34178:73;;;;:::o;34257:168::-;34340:11;34374:6;34369:3;34362:19;34414:4;34409:3;34405:14;34390:29;;34352:73;;;;:::o;34431:169::-;34515:11;34549:6;34544:3;34537:19;34589:4;34584:3;34580:14;34565:29;;34527:73;;;;:::o;34606:148::-;34708:11;34745:3;34730:18;;34720:34;;;;:::o;34760:305::-;34800:3;34819:20;34837:1;34819:20;:::i;:::-;34814:25;;34853:20;34871:1;34853:20;:::i;:::-;34848:25;;35007:1;34939:66;34935:74;34932:1;34929:81;34926:2;;;35013:18;;:::i;:::-;34926:2;35057:1;35054;35050:9;35043:16;;34804:261;;;;:::o;35071:185::-;35111:1;35128:20;35146:1;35128:20;:::i;:::-;35123:25;;35162:20;35180:1;35162:20;:::i;:::-;35157:25;;35201:1;35191:2;;35206:18;;:::i;:::-;35191:2;35248:1;35245;35241:9;35236:14;;35113:143;;;;:::o;35262:348::-;35302:7;35325:20;35343:1;35325:20;:::i;:::-;35320:25;;35359:20;35377:1;35359:20;:::i;:::-;35354:25;;35547:1;35479:66;35475:74;35472:1;35469:81;35464:1;35457:9;35450:17;35446:105;35443:2;;;35554:18;;:::i;:::-;35443:2;35602:1;35599;35595:9;35584:20;;35310:300;;;;:::o;35616:191::-;35656:4;35676:20;35694:1;35676:20;:::i;:::-;35671:25;;35710:20;35728:1;35710:20;:::i;:::-;35705:25;;35749:1;35746;35743:8;35740:2;;;35754:18;;:::i;:::-;35740:2;35799:1;35796;35792:9;35784:17;;35661:146;;;;:::o;35813:96::-;35850:7;35879:24;35897:5;35879:24;:::i;:::-;35868:35;;35858:51;;;:::o;35915:90::-;35949:7;35992:5;35985:13;35978:21;35967:32;;35957:48;;;:::o;36011:149::-;36047:7;36087:66;36080:5;36076:78;36065:89;;36055:105;;;:::o;36166:126::-;36203:7;36243:42;36236:5;36232:54;36221:65;;36211:81;;;:::o;36298:77::-;36335:7;36364:5;36353:16;;36343:32;;;:::o;36381:154::-;36465:6;36460:3;36455;36442:30;36527:1;36518:6;36513:3;36509:16;36502:27;36432:103;;;:::o;36541:307::-;36609:1;36619:113;36633:6;36630:1;36627:13;36619:113;;;36718:1;36713:3;36709:11;36703:18;36699:1;36694:3;36690:11;36683:39;36655:2;36652:1;36648:10;36643:15;;36619:113;;;36750:6;36747:1;36744:13;36741:2;;;36830:1;36821:6;36816:3;36812:16;36805:27;36741:2;36590:258;;;;:::o;36854:320::-;36898:6;36935:1;36929:4;36925:12;36915:22;;36982:1;36976:4;36972:12;37003:18;36993:2;;37059:4;37051:6;37047:17;37037:27;;36993:2;37121;37113:6;37110:14;37090:18;37087:38;37084:2;;;37140:18;;:::i;:::-;37084:2;36905:269;;;;:::o;37180:281::-;37263:27;37285:4;37263:27;:::i;:::-;37255:6;37251:40;37393:6;37381:10;37378:22;37357:18;37345:10;37342:34;37339:62;37336:2;;;37404:18;;:::i;:::-;37336:2;37444:10;37440:2;37433:22;37223:238;;;:::o;37467:233::-;37506:3;37529:24;37547:5;37529:24;:::i;:::-;37520:33;;37575:66;37568:5;37565:77;37562:2;;;37645:18;;:::i;:::-;37562:2;37692:1;37685:5;37681:13;37674:20;;37510:190;;;:::o;37706:79::-;37745:7;37774:5;37763:16;;37753:32;;;:::o;37791:176::-;37823:1;37840:20;37858:1;37840:20;:::i;:::-;37835:25;;37874:20;37892:1;37874:20;:::i;:::-;37869:25;;37913:1;37903:2;;37918:18;;:::i;:::-;37903:2;37959:1;37956;37952:9;37947:14;;37825:142;;;;:::o;37973:180::-;38021:77;38018:1;38011:88;38118:4;38115:1;38108:15;38142:4;38139:1;38132:15;38159:180;38207:77;38204:1;38197:88;38304:4;38301:1;38294:15;38328:4;38325:1;38318:15;38345:180;38393:77;38390:1;38383:88;38490:4;38487:1;38480:15;38514:4;38511:1;38504:15;38531:180;38579:77;38576:1;38569:88;38676:4;38673:1;38666:15;38700:4;38697:1;38690:15;38717:102;38758:6;38809:2;38805:7;38800:2;38793:5;38789:14;38785:28;38775:38;;38765:54;;;:::o;38825:166::-;38965:18;38961:1;38953:6;38949:14;38942:42;38931:60;:::o;38997:230::-;39137:34;39133:1;39125:6;39121:14;39114:58;39206:13;39201:2;39193:6;39189:15;39182:38;39103:124;:::o;39233:237::-;39373:34;39369:1;39361:6;39357:14;39350:58;39442:20;39437:2;39429:6;39425:15;39418:45;39339:131;:::o;39476:225::-;39616:34;39612:1;39604:6;39600:14;39593:58;39685:8;39680:2;39672:6;39668:15;39661:33;39582:119;:::o;39707:178::-;39847:30;39843:1;39835:6;39831:14;39824:54;39813:72;:::o;39891:223::-;40031:34;40027:1;40019:6;40015:14;40008:58;40100:6;40095:2;40087:6;40083:15;40076:31;39997:117;:::o;40120:175::-;40260:27;40256:1;40248:6;40244:14;40237:51;40226:69;:::o;40301:155::-;40441:7;40437:1;40429:6;40425:14;40418:31;40407:49;:::o;40462:159::-;40602:11;40598:1;40590:6;40586:14;40579:35;40568:53;:::o;40627:231::-;40767:34;40763:1;40755:6;40751:14;40744:58;40836:14;40831:2;40823:6;40819:15;40812:39;40733:125;:::o;40864:243::-;41004:34;41000:1;40992:6;40988:14;40981:58;41073:26;41068:2;41060:6;41056:15;41049:51;40970:137;:::o;41113:159::-;41253:11;41249:1;41241:6;41237:14;41230:35;41219:53;:::o;41278:229::-;41418:34;41414:1;41406:6;41402:14;41395:58;41487:12;41482:2;41474:6;41470:15;41463:37;41384:123;:::o;41513:228::-;41653:34;41649:1;41641:6;41637:14;41630:58;41722:11;41717:2;41709:6;41705:15;41698:36;41619:122;:::o;41747:182::-;41887:34;41883:1;41875:6;41871:14;41864:58;41853:76;:::o;41935:158::-;42075:10;42071:1;42063:6;42059:14;42052:34;42041:52;:::o;42099:231::-;42239:34;42235:1;42227:6;42223:14;42216:58;42308:14;42303:2;42295:6;42291:15;42284:39;42205:125;:::o;42336:182::-;42476:34;42472:1;42464:6;42460:14;42453:58;42442:76;:::o;42524:228::-;42664:34;42660:1;42652:6;42648:14;42641:58;42733:11;42728:2;42720:6;42716:15;42709:36;42630:122;:::o;42758:234::-;42898:34;42894:1;42886:6;42882:14;42875:58;42967:17;42962:2;42954:6;42950:15;42943:42;42864:128;:::o;42998:167::-;43138:19;43134:1;43126:6;43122:14;43115:43;43104:61;:::o;43171:220::-;43311:34;43307:1;43299:6;43295:14;43288:58;43380:3;43375:2;43367:6;43363:15;43356:28;43277:114;:::o;43397:160::-;43537:12;43533:1;43525:6;43521:14;43514:36;43503:54;:::o;43563:236::-;43703:34;43699:1;43691:6;43687:14;43680:58;43772:19;43767:2;43759:6;43755:15;43748:44;43669:130;:::o;43805:162::-;43945:14;43941:1;43933:6;43929:14;43922:38;43911:56;:::o;43973:231::-;44113:34;44109:1;44101:6;44097:14;44090:58;44182:14;44177:2;44169:6;44165:15;44158:39;44079:125;:::o;44210:122::-;44283:24;44301:5;44283:24;:::i;:::-;44276:5;44273:35;44263:2;;44322:1;44319;44312:12;44263:2;44253:79;:::o;44338:116::-;44408:21;44423:5;44408:21;:::i;:::-;44401:5;44398:32;44388:2;;44444:1;44441;44434:12;44388:2;44378:76;:::o;44460:120::-;44532:23;44549:5;44532:23;:::i;:::-;44525:5;44522:34;44512:2;;44570:1;44567;44560:12;44512:2;44502:78;:::o;44586:122::-;44659:24;44677:5;44659:24;:::i;:::-;44652:5;44649:35;44639:2;;44698:1;44695;44688:12;44639:2;44629:79;:::o

Swarm Source

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