ETH Price: $3,407.67 (+3.42%)

Token

Hiroto Club (HRC)
 

Overview

Max Total Supply

5,555 HRC

Holders

2,135

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
aaronjiang.eth
Balance
1 HRC
0x64e55c710550a89d00f39e38dfd07548b51b4943
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:
HirotoClub

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-08-16
*/

// SPDX-License-Identifier: MIT
// Dev : A Square
pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

pragma solidity ^0.8.0; 

abstract contract ReentrancyGuard { 
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }
    modifier nonReentrant() {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
   _status = _ENTERED;

        _;
        _status = _NOT_ENTERED;
    }
}

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
 
    function toString(uint256 value) internal pure returns (string memory) { 
        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);
    }
 
    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);
    }
 
    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);
    }
}
 
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}
 
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
 
    constructor() {
        _transferOwnership(_msgSender());
    }
 
    function owner() public view virtual returns (address) {
        return _owner;
    } 
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }
 
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }
 
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }
 
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
 
library Address { 
    function isContract(address account) internal view returns (bool) { 
        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    } 
    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");
    }
 
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    } 
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }
 
    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");
    }
 
    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);
    } 
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }
 
    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);
    }
 
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }
 
    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
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else { 
            if (returndata.length > 0) { 

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
 
interface IERC721Receiver { 
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}
 
interface IERC165 { 
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
 
abstract contract ERC165 is IERC165 { 
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
} 
interface IERC721 is IERC165 { 
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); 
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); 
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved); 
    function balanceOf(address owner) external view returns (uint256 balance); 
    function ownerOf(uint256 tokenId) external view returns (address owner); 
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external; 
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external; 
    function approve(address to, uint256 tokenId) external;
 
    function getApproved(uint256 tokenId) external view returns (address operator); 
    function setApprovalForAll(address operator, bool _approved) external; 
    function isApprovedForAll(address owner, address operator) external view returns (bool); 
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
} 
interface IERC721Enumerable is IERC721 { 
    function totalSupply() external view returns (uint256); 
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); 
    function tokenByIndex(uint256 index) external view returns (uint256);
}  
interface IERC721Metadata is IERC721 { 
    function name() external view returns (string memory); 
    function symbol() external view returns (string memory); 
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

    // 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;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 1;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @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 override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _ownershipOf(tokenId).addr;
    }

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        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 override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

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

        _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 {
        _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 {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        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 TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

contract HirotoClub is Ownable, ERC721A, ReentrancyGuard {
  using Strings for uint256;

  uint256 public MAX_PER_Transaction = 3; // maximam amount that user can mint/Transaction
  uint256 public MAX_PER_WALLET = 3; // maximam amount that user can mint/Wallet

  mapping(address => uint256) public publicClaimedBy;

  uint256 private constant TotalCollectionSize_ = 5555; // total number of nfts
  uint256 private constant MaxMintPerBatch_ = 20; //max mint per transaction

  uint256 public PRICE = 0.0089 ether; 
  string private _baseTokenURI;
  string private _uriBeforeReveal;
  bool public revealed = false;

  uint public status = 0; //0-pause 1-Whitelist 2-Public
 
  constructor() ERC721A("Hiroto Club","HRC") {
  }

  modifier callerIsUser() {
    require(tx.origin == msg.sender, "The caller is another contract");
    _;
  }
 
  function mint(uint256 quantity) external payable callerIsUser {
    require(status == 2 , "Sale is not Active");
    require(totalSupply() + quantity <= TotalCollectionSize_, "reached max supply");
    require(quantity <= MAX_PER_Transaction,"can not mint this many");
    require(msg.value >= PRICE * quantity, "Need to send more ETH.");

    publicClaimedBy[msg.sender] += quantity;
    require(publicClaimedBy[msg.sender] <= MAX_PER_WALLET, "Purchase exceeds max allowed");

    _safeMint(msg.sender, quantity);
  }

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

    if(revealed == false){
        return _uriBeforeReveal;
    }
        string memory baseURI = _baseURI();
        return
            bytes(baseURI).length > 0
            ? string(abi.encodePacked(baseURI, "/", tokenId.toString(), ".json")) : "";
  }

  function changeRevealStatus() public onlyOwner {
        revealed = true;
  }

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

   function setURIbeforeReveal(string memory URI) external onlyOwner {
    _uriBeforeReveal = URI;
  }

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

  function numberMinted(address owner) public view returns (uint256) {
    return _numberMinted(owner);
  }
  function getOwnershipData(uint256 tokenId)
    external
    view
    returns (TokenOwnership memory)
  {
    return _ownershipOf(tokenId);
  }

  function withdrawMoney() external onlyOwner nonReentrant {
    (bool success, ) = msg.sender.call{value: address(this).balance}("");
    require(success, "Transfer failed.");
  }

  function changeMintPrice(uint256 _newPrice) external onlyOwner
  {
      PRICE = _newPrice;
  }

  function changeMAX_PER_Transaction(uint256 q) external onlyOwner
  {
      MAX_PER_Transaction = q;
  }

     function changeMAX_PER_WALLET(uint256 q) external onlyOwner
  {
      MAX_PER_WALLET = q;
  }

  function setStatus(uint256 s)external onlyOwner{
      status = s;
  }

   function getStatus()public view returns(uint){
      return status;
  }
    
  function getPrice(uint256 _quantity) public view returns (uint256) {
       
        return _quantity*PRICE;
    }

  function airdrop(address sendTo, uint quantity)public onlyOwner{
    require(totalSupply() + quantity <= TotalCollectionSize_, "reached max supply");
    _safeMint(sendTo, quantity);
  }

    //    WhiteList CODE STARTS    //

    uint256 public whiteListMaxMint = 1;
    uint256 public whiteListPerWallet = 1;
    bytes32 public whitelistMerkleRoot;
    uint256 public itemPriceWhiteList = 0 ether;
    mapping(address => uint256) public whiteListClaimedBy;
    uint256 public TotalWLavailable = 5555; // total number of nfts


    function setWhitelistMerkleRoot(bytes32 _whitelistMerkleRoot) external onlyOwner {
        whitelistMerkleRoot = _whitelistMerkleRoot;
    }

    function getWhitelistPrice(uint256 _quantity) public view returns (uint256) {
       
           return _quantity*itemPriceWhiteList;
    }

    function inWhitelist(bytes32[] memory _proof, address _owner) public view returns (bool) {
        return MerkleProof.verify(_proof, whitelistMerkleRoot, keccak256(abi.encodePacked(_owner)));
    }


    function purchaseWhiteListTokens(uint256 _howMany, bytes32[] calldata _proof) external payable {
        require(status == 1 , "Sale is not active ");
        require(totalSupply()+_howMany<=TotalWLavailable,"Quantity must be lesser then MaxSupply");
        require(inWhitelist(_proof, msg.sender), "You are not in presale");
        require(_howMany <= whiteListMaxMint,"can not mint this many");
        require(msg.value >= _howMany * itemPriceWhiteList, "Try to send more ETH");

        whiteListClaimedBy[msg.sender] += _howMany;
        require(whiteListClaimedBy[msg.sender] <= whiteListPerWallet, "Purchase exceeds max allowed");

        _safeMint(msg.sender, _howMany);

    }

     function setWhiteListMaxMint(uint256 _whiteListMaxMint) external onlyOwner {
        whiteListMaxMint = _whiteListMaxMint;
    }

     function setWhiteListPerWallet(uint256 _whiteListPerWallet) external onlyOwner {
        whiteListPerWallet = _whiteListPerWallet;
    }

     function setWLavailable(uint256 _whiteListCollection) external onlyOwner {
        TotalWLavailable = _whiteListCollection;
    }

    function setPriceWhiteList(uint256 _itemPriceWhiteList) external onlyOwner {
        itemPriceWhiteList = _itemPriceWhiteList;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"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_PER_Transaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TotalWLavailable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sendTo","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"q","type":"uint256"}],"name":"changeMAX_PER_Transaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"q","type":"uint256"}],"name":"changeMAX_PER_WALLET","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"changeMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"changeRevealStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStatus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"getWhitelistPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"},{"internalType":"address","name":"_owner","type":"address"}],"name":"inWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"itemPriceWhiteList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"address","name":"","type":"address"}],"name":"publicClaimedBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_howMany","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"purchaseWhiteListTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_itemPriceWhiteList","type":"uint256"}],"name":"setPriceWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"s","type":"uint256"}],"name":"setStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setURIbeforeReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_whiteListCollection","type":"uint256"}],"name":"setWLavailable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_whiteListMaxMint","type":"uint256"}],"name":"setWhiteListMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_whiteListPerWallet","type":"uint256"}],"name":"setWhiteListPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_whitelistMerkleRoot","type":"bytes32"}],"name":"setWhitelistMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"status","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"","type":"address"}],"name":"whiteListClaimedBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whiteListMaxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whiteListPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526003600a556003600b55661f9e80ba804000600d556000601060006101000a81548160ff02191690831515021790555060006011556001601255600160135560006015556115b36017553480156200005b57600080fd5b506040518060400160405280600b81526020017f4869726f746f20436c75620000000000000000000000000000000000000000008152506040518060400160405280600381526020017f4852430000000000000000000000000000000000000000000000000000000000815250620000e8620000dc6200014060201b60201c565b6200014860201b60201c565b81600390805190602001906200010092919062000215565b5080600490805190602001906200011992919062000215565b506200012a6200020c60201b60201c565b600181905550505060016009819055506200032a565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006001905090565b8280546200022390620002c5565b90600052602060002090601f01602090048101928262000247576000855562000293565b82601f106200026257805160ff191683800117855562000293565b8280016001018555821562000293579182015b828111156200029257825182559160200191906001019062000275565b5b509050620002a29190620002a6565b5090565b5b80821115620002c1576000816000905550600101620002a7565b5090565b60006002820490506001821680620002de57607f821691505b60208210811415620002f557620002f4620002fb565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614dff806200033a6000396000f3fe6080604052600436106102e45760003560e01c80637cdd702e11610190578063aa98e0c6116100dc578063c87b56dd11610095578063e75722301161006f578063e757223014610b1a578063e8006bb014610b57578063e985e9c514610b80578063f2fde38b14610bbd576102e4565b8063c87b56dd14610a63578063dc33e68114610aa0578063e5ec56a014610add576102e4565b8063aa98e0c614610969578063ac44600214610994578063aebceff4146109ab578063b88d4fde146109e8578063bd32fb6614610a11578063c7b8fca714610a3a576102e4565b8063915a647f11610149578063a0712d6811610123578063a0712d68146108d2578063a22cb465146108ee578063a40ece7a14610917578063a5cdae2d14610940576102e4565b8063915a647f1461083f5780639231ab2a1461086a57806395d89b41146108a7576102e4565b80637cdd702e14610741578063852cbaee1461076c5780638825b014146107975780638ba4cc3c146107c05780638d859f3e146107e95780638da5cb5b14610814576102e4565b80632d5b005d1161024f57806351d7ff931161020857806369ba1a75116101e257806369ba1a751461068757806370a08231146106b0578063715018a6146106ed5780637523614314610704576102e4565b806351d7ff93146105f657806355f804b3146106215780636352211e1461064a576102e4565b80632d5b005d1461050e5780632ea7c5d9146105255780633fd173661461054e57806342842e0e146105775780634e69d560146105a057806351830227146105cb576102e4565b806318160ddd116102a157806318160ddd146103fe5780631984b28614610429578063200d2ed21461046657806323b872dd146104915780632632d5f8146104ba5780632ba2865b146104e5576102e4565b806301ffc9a7146102e957806306fdde0314610326578063081812fc14610351578063095ea7b31461038e5780630f2cdd6c146103b757806310157fc3146103e2575b600080fd5b3480156102f557600080fd5b50610310600480360381019061030b9190613ccc565b610be6565b60405161031d91906142a8565b60405180910390f35b34801561033257600080fd5b5061033b610cc8565b60405161034891906142de565b60405180910390f35b34801561035d57600080fd5b5061037860048036038101906103739190613d6f565b610d5a565b6040516103859190614241565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b09190613c03565b610dd6565b005b3480156103c357600080fd5b506103cc610ee1565b6040516103d991906144fb565b60405180910390f35b6103fc60048036038101906103f79190613d9c565b610ee7565b005b34801561040a57600080fd5b5061041361118b565b60405161042091906144fb565b60405180910390f35b34801561043557600080fd5b50610450600480360381019061044b9190613a80565b6111a2565b60405161045d91906144fb565b60405180910390f35b34801561047257600080fd5b5061047b6111ba565b60405161048891906144fb565b60405180910390f35b34801561049d57600080fd5b506104b860048036038101906104b39190613aed565b6111c0565b005b3480156104c657600080fd5b506104cf6111d0565b6040516104dc91906144fb565b60405180910390f35b3480156104f157600080fd5b5061050c60048036038101906105079190613d6f565b6111d6565b005b34801561051a57600080fd5b5061052361125c565b005b34801561053157600080fd5b5061054c60048036038101906105479190613d6f565b6112f5565b005b34801561055a57600080fd5b5061057560048036038101906105709190613d6f565b61137b565b005b34801561058357600080fd5b5061059e60048036038101906105999190613aed565b611401565b005b3480156105ac57600080fd5b506105b5611421565b6040516105c291906144fb565b60405180910390f35b3480156105d757600080fd5b506105e061142b565b6040516105ed91906142a8565b60405180910390f35b34801561060257600080fd5b5061060b61143e565b60405161061891906144fb565b60405180910390f35b34801561062d57600080fd5b5061064860048036038101906106439190613d26565b611444565b005b34801561065657600080fd5b50610671600480360381019061066c9190613d6f565b6114da565b60405161067e9190614241565b60405180910390f35b34801561069357600080fd5b506106ae60048036038101906106a99190613d6f565b6114f0565b005b3480156106bc57600080fd5b506106d760048036038101906106d29190613a80565b611576565b6040516106e491906144fb565b60405180910390f35b3480156106f957600080fd5b50610702611646565b005b34801561071057600080fd5b5061072b60048036038101906107269190613a80565b6116ce565b60405161073891906144fb565b60405180910390f35b34801561074d57600080fd5b506107566116e6565b60405161076391906144fb565b60405180910390f35b34801561077857600080fd5b506107816116ec565b60405161078e91906144fb565b60405180910390f35b3480156107a357600080fd5b506107be60048036038101906107b99190613d6f565b6116f2565b005b3480156107cc57600080fd5b506107e760048036038101906107e29190613c03565b611778565b005b3480156107f557600080fd5b506107fe611859565b60405161080b91906144fb565b60405180910390f35b34801561082057600080fd5b5061082961185f565b6040516108369190614241565b60405180910390f35b34801561084b57600080fd5b50610854611888565b60405161086191906144fb565b60405180910390f35b34801561087657600080fd5b50610891600480360381019061088c9190613d6f565b61188e565b60405161089e91906144e0565b60405180910390f35b3480156108b357600080fd5b506108bc6118a6565b6040516108c991906142de565b60405180910390f35b6108ec60048036038101906108e79190613d6f565b611938565b005b3480156108fa57600080fd5b5061091560048036038101906109109190613bc3565b611bbe565b005b34801561092357600080fd5b5061093e60048036038101906109399190613d6f565b611d36565b005b34801561094c57600080fd5b5061096760048036038101906109629190613d6f565b611dbc565b005b34801561097557600080fd5b5061097e611e42565b60405161098b91906142c3565b60405180910390f35b3480156109a057600080fd5b506109a9611e48565b005b3480156109b757600080fd5b506109d260048036038101906109cd9190613d6f565b611fc9565b6040516109df91906144fb565b60405180910390f35b3480156109f457600080fd5b50610a0f6004803603810190610a0a9190613b40565b611fe0565b005b348015610a1d57600080fd5b50610a386004803603810190610a339190613c9f565b61205c565b005b348015610a4657600080fd5b50610a616004803603810190610a5c9190613d26565b6120e2565b005b348015610a6f57600080fd5b50610a8a6004803603810190610a859190613d6f565b612178565b604051610a9791906142de565b60405180910390f35b348015610aac57600080fd5b50610ac76004803603810190610ac29190613a80565b6122ce565b604051610ad491906144fb565b60405180910390f35b348015610ae957600080fd5b50610b046004803603810190610aff9190613c43565b6122e0565b604051610b1191906142a8565b60405180910390f35b348015610b2657600080fd5b50610b416004803603810190610b3c9190613d6f565b61231d565b604051610b4e91906144fb565b60405180910390f35b348015610b6357600080fd5b50610b7e6004803603810190610b799190613d6f565b612334565b005b348015610b8c57600080fd5b50610ba76004803603810190610ba29190613aad565b6123ba565b604051610bb491906142a8565b60405180910390f35b348015610bc957600080fd5b50610be46004803603810190610bdf9190613a80565b61244e565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610cb157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610cc15750610cc082612546565b5b9050919050565b606060038054610cd790614800565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0390614800565b8015610d505780601f10610d2557610100808354040283529160200191610d50565b820191906000526020600020905b815481529060010190602001808311610d3357829003601f168201915b5050505050905090565b6000610d65826125b0565b610d9b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610de1826114da565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e49576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e686125fe565b73ffffffffffffffffffffffffffffffffffffffff1614158015610e9a5750610e9881610e936125fe565b6123ba565b155b15610ed1576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610edc838383612606565b505050565b600b5481565b600160115414610f2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2390614340565b60405180910390fd5b60175483610f3861118b565b610f429190614617565b1115610f83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7a90614400565b60405180910390fd5b610fce828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050336122e0565b61100d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611004906143c0565b60405180910390fd5b601254831115611052576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104990614480565b60405180910390fd5b60155483611060919061469e565b3410156110a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109990614320565b60405180910390fd5b82601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110f19190614617565b92505081905550601354601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561117c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611173906144a0565b60405180910390fd5b61118633846126b8565b505050565b60006111956126d6565b6002546001540303905090565b60166020528060005260406000206000915090505481565b60115481565b6111cb8383836126df565b505050565b60155481565b6111de6125fe565b73ffffffffffffffffffffffffffffffffffffffff166111fc61185f565b73ffffffffffffffffffffffffffffffffffffffff1614611252576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611249906143e0565b60405180910390fd5b80600b8190555050565b6112646125fe565b73ffffffffffffffffffffffffffffffffffffffff1661128261185f565b73ffffffffffffffffffffffffffffffffffffffff16146112d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cf906143e0565b60405180910390fd5b6001601060006101000a81548160ff021916908315150217905550565b6112fd6125fe565b73ffffffffffffffffffffffffffffffffffffffff1661131b61185f565b73ffffffffffffffffffffffffffffffffffffffff1614611371576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611368906143e0565b60405180910390fd5b8060128190555050565b6113836125fe565b73ffffffffffffffffffffffffffffffffffffffff166113a161185f565b73ffffffffffffffffffffffffffffffffffffffff16146113f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ee906143e0565b60405180910390fd5b80600d8190555050565b61141c83838360405180602001604052806000815250611fe0565b505050565b6000601154905090565b601060009054906101000a900460ff1681565b600a5481565b61144c6125fe565b73ffffffffffffffffffffffffffffffffffffffff1661146a61185f565b73ffffffffffffffffffffffffffffffffffffffff16146114c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b7906143e0565b60405180910390fd5b80600e90805190602001906114d6929190613748565b5050565b60006114e582612b95565b600001519050919050565b6114f86125fe565b73ffffffffffffffffffffffffffffffffffffffff1661151661185f565b73ffffffffffffffffffffffffffffffffffffffff161461156c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611563906143e0565b60405180910390fd5b8060118190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115de576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61164e6125fe565b73ffffffffffffffffffffffffffffffffffffffff1661166c61185f565b73ffffffffffffffffffffffffffffffffffffffff16146116c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b9906143e0565b60405180910390fd5b6116cc6000612e24565b565b600c6020528060005260406000206000915090505481565b60125481565b60135481565b6116fa6125fe565b73ffffffffffffffffffffffffffffffffffffffff1661171861185f565b73ffffffffffffffffffffffffffffffffffffffff161461176e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611765906143e0565b60405180910390fd5b8060158190555050565b6117806125fe565b73ffffffffffffffffffffffffffffffffffffffff1661179e61185f565b73ffffffffffffffffffffffffffffffffffffffff16146117f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117eb906143e0565b60405180910390fd5b6115b38161180061118b565b61180a9190614617565b111561184b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611842906143a0565b60405180910390fd5b61185582826126b8565b5050565b600d5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60175481565b6118966137ce565b61189f82612b95565b9050919050565b6060600480546118b590614800565b80601f01602080910402602001604051908101604052809291908181526020018280546118e190614800565b801561192e5780601f106119035761010080835404028352916020019161192e565b820191906000526020600020905b81548152906001019060200180831161191157829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146119a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199d90614380565b60405180910390fd5b6002601154146119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e290614360565b60405180910390fd5b6115b3816119f761118b565b611a019190614617565b1115611a42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a39906143a0565b60405180910390fd5b600a54811115611a87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7e90614480565b60405180910390fd5b80600d54611a95919061469e565b341015611ad7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ace90614460565b60405180910390fd5b80600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b269190614617565b92505081905550600b54600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611bb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba8906144a0565b60405180910390fd5b611bbb33826126b8565b50565b611bc66125fe565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c2b576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611c386125fe565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ce56125fe565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d2a91906142a8565b60405180910390a35050565b611d3e6125fe565b73ffffffffffffffffffffffffffffffffffffffff16611d5c61185f565b73ffffffffffffffffffffffffffffffffffffffff1614611db2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da9906143e0565b60405180910390fd5b80600a8190555050565b611dc46125fe565b73ffffffffffffffffffffffffffffffffffffffff16611de261185f565b73ffffffffffffffffffffffffffffffffffffffff1614611e38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2f906143e0565b60405180910390fd5b8060138190555050565b60145481565b611e506125fe565b73ffffffffffffffffffffffffffffffffffffffff16611e6e61185f565b73ffffffffffffffffffffffffffffffffffffffff1614611ec4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebb906143e0565b60405180910390fd5b60026009541415611f0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f01906144c0565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051611f389061422c565b60006040518083038185875af1925050503d8060008114611f75576040519150601f19603f3d011682016040523d82523d6000602084013e611f7a565b606091505b5050905080611fbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb590614440565b60405180910390fd5b506001600981905550565b600060155482611fd9919061469e565b9050919050565b611feb8484846126df565b61200a8373ffffffffffffffffffffffffffffffffffffffff16612ee8565b801561201f575061201d84848484612efb565b155b15612056576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6120646125fe565b73ffffffffffffffffffffffffffffffffffffffff1661208261185f565b73ffffffffffffffffffffffffffffffffffffffff16146120d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cf906143e0565b60405180910390fd5b8060148190555050565b6120ea6125fe565b73ffffffffffffffffffffffffffffffffffffffff1661210861185f565b73ffffffffffffffffffffffffffffffffffffffff161461215e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612155906143e0565b60405180910390fd5b80600f9080519060200190612174929190613748565b5050565b6060612183826125b0565b6121c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b990614420565b60405180910390fd5b60001515601060009054906101000a900460ff161515141561227057600f80546121eb90614800565b80601f016020809104026020016040519081016040528092919081815260200182805461221790614800565b80156122645780601f1061223957610100808354040283529160200191612264565b820191906000526020600020905b81548152906001019060200180831161224757829003601f168201915b505050505090506122c9565b600061227a61305b565b9050600081511161229a57604051806020016040528060008152506122c5565b806122a4846130ed565b6040516020016122b59291906141f2565b6040516020818303038152906040525b9150505b919050565b60006122d98261324e565b9050919050565b600061231583601454846040516020016122fa91906141d7565b604051602081830303815290604052805190602001206132b8565b905092915050565b6000600d548261232d919061469e565b9050919050565b61233c6125fe565b73ffffffffffffffffffffffffffffffffffffffff1661235a61185f565b73ffffffffffffffffffffffffffffffffffffffff16146123b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a7906143e0565b60405180910390fd5b8060178190555050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6124566125fe565b73ffffffffffffffffffffffffffffffffffffffff1661247461185f565b73ffffffffffffffffffffffffffffffffffffffff16146124ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c1906143e0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561253a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253190614300565b60405180910390fd5b61254381612e24565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816125bb6126d6565b111580156125ca575060015482105b80156125f7575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6126d28282604051806020016040528060008152506132cf565b5050565b60006001905090565b60006126ea82612b95565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612755576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166127766125fe565b73ffffffffffffffffffffffffffffffffffffffff1614806127a557506127a48561279f6125fe565b6123ba565b5b806127ea57506127b36125fe565b73ffffffffffffffffffffffffffffffffffffffff166127d284610d5a565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612823576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561288a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61289785858560016132e1565b6128a360008487612606565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612b23576001548214612b2257878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b8e85858560016132e7565b5050505050565b612b9d6137ce565b600082905080612bab6126d6565b11158015612bba575060015481105b15612ded576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612deb57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612ccf578092505050612e1f565b5b600115612dea57818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612de5578092505050612e1f565b612cd0565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f216125fe565b8786866040518563ffffffff1660e01b8152600401612f43949392919061425c565b602060405180830381600087803b158015612f5d57600080fd5b505af1925050508015612f8e57506040513d601f19601f82011682018060405250810190612f8b9190613cf9565b60015b613008573d8060008114612fbe576040519150601f19603f3d011682016040523d82523d6000602084013e612fc3565b606091505b50600081511415613000576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600e805461306a90614800565b80601f016020809104026020016040519081016040528092919081815260200182805461309690614800565b80156130e35780601f106130b8576101008083540402835291602001916130e3565b820191906000526020600020905b8154815290600101906020018083116130c657829003601f168201915b5050505050905090565b60606000821415613135576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613249565b600082905060005b6000821461316757808061315090614863565b915050600a82613160919061466d565b915061313d565b60008167ffffffffffffffff811115613183576131826149bd565b5b6040519080825280601f01601f1916602001820160405280156131b55781602001600182028036833780820191505090505b5090505b60008514613242576001826131ce91906146f8565b9150600a856131dd91906148d0565b60306131e99190614617565b60f81b8183815181106131ff576131fe61498e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561323b919061466d565b94506131b9565b8093505050505b919050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6000826132c585846132ed565b1490509392505050565b6132dc8383836001613362565b505050565b50505050565b50505050565b60008082905060005b84518110156133575760008582815181106133145761331361498e565b5b602002602001015190508083116133365761332f8382613731565b9250613343565b6133408184613731565b92505b50808061334f90614863565b9150506132f6565b508091505092915050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156133d0576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141561340b576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61341860008683876132e1565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156135e257506135e18773ffffffffffffffffffffffffffffffffffffffff16612ee8565b5b156136a8575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46136576000888480600101955088612efb565b61368d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156135e85782600154146136a357600080fd5b613714565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156136a9575b81600181905550505061372a60008683876132e7565b5050505050565b600082600052816020526040600020905092915050565b82805461375490614800565b90600052602060002090601f01602090048101928261377657600085556137bd565b82601f1061378f57805160ff19168380011785556137bd565b828001600101855582156137bd579182015b828111156137bc5782518255916020019190600101906137a1565b5b5090506137ca9190613811565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561382a576000816000905550600101613812565b5090565b600061384161383c8461453b565b614516565b90508083825260208201905082856020860282011115613864576138636149f6565b5b60005b85811015613894578161387a88826139d0565b845260208401935060208301925050600181019050613867565b5050509392505050565b60006138b16138ac84614567565b614516565b9050828152602081018484840111156138cd576138cc6149fb565b5b6138d88482856147be565b509392505050565b60006138f36138ee84614598565b614516565b90508281526020810184848401111561390f5761390e6149fb565b5b61391a8482856147be565b509392505050565b60008135905061393181614d56565b92915050565b60008083601f84011261394d5761394c6149f1565b5b8235905067ffffffffffffffff81111561396a576139696149ec565b5b602083019150836020820283011115613986576139856149f6565b5b9250929050565b600082601f8301126139a2576139a16149f1565b5b81356139b284826020860161382e565b91505092915050565b6000813590506139ca81614d6d565b92915050565b6000813590506139df81614d84565b92915050565b6000813590506139f481614d9b565b92915050565b600081519050613a0981614d9b565b92915050565b600082601f830112613a2457613a236149f1565b5b8135613a3484826020860161389e565b91505092915050565b600082601f830112613a5257613a516149f1565b5b8135613a628482602086016138e0565b91505092915050565b600081359050613a7a81614db2565b92915050565b600060208284031215613a9657613a95614a05565b5b6000613aa484828501613922565b91505092915050565b60008060408385031215613ac457613ac3614a05565b5b6000613ad285828601613922565b9250506020613ae385828601613922565b9150509250929050565b600080600060608486031215613b0657613b05614a05565b5b6000613b1486828701613922565b9350506020613b2586828701613922565b9250506040613b3686828701613a6b565b9150509250925092565b60008060008060808587031215613b5a57613b59614a05565b5b6000613b6887828801613922565b9450506020613b7987828801613922565b9350506040613b8a87828801613a6b565b925050606085013567ffffffffffffffff811115613bab57613baa614a00565b5b613bb787828801613a0f565b91505092959194509250565b60008060408385031215613bda57613bd9614a05565b5b6000613be885828601613922565b9250506020613bf9858286016139bb565b9150509250929050565b60008060408385031215613c1a57613c19614a05565b5b6000613c2885828601613922565b9250506020613c3985828601613a6b565b9150509250929050565b60008060408385031215613c5a57613c59614a05565b5b600083013567ffffffffffffffff811115613c7857613c77614a00565b5b613c848582860161398d565b9250506020613c9585828601613922565b9150509250929050565b600060208284031215613cb557613cb4614a05565b5b6000613cc3848285016139d0565b91505092915050565b600060208284031215613ce257613ce1614a05565b5b6000613cf0848285016139e5565b91505092915050565b600060208284031215613d0f57613d0e614a05565b5b6000613d1d848285016139fa565b91505092915050565b600060208284031215613d3c57613d3b614a05565b5b600082013567ffffffffffffffff811115613d5a57613d59614a00565b5b613d6684828501613a3d565b91505092915050565b600060208284031215613d8557613d84614a05565b5b6000613d9384828501613a6b565b91505092915050565b600080600060408486031215613db557613db4614a05565b5b6000613dc386828701613a6b565b935050602084013567ffffffffffffffff811115613de457613de3614a00565b5b613df086828701613937565b92509250509250925092565b613e058161472c565b82525050565b613e148161472c565b82525050565b613e2b613e268261472c565b6148ac565b82525050565b613e3a8161473e565b82525050565b613e498161473e565b82525050565b613e588161474a565b82525050565b6000613e69826145c9565b613e7381856145df565b9350613e838185602086016147cd565b613e8c81614a0a565b840191505092915050565b6000613ea2826145d4565b613eac81856145fb565b9350613ebc8185602086016147cd565b613ec581614a0a565b840191505092915050565b6000613edb826145d4565b613ee5818561460c565b9350613ef58185602086016147cd565b80840191505092915050565b6000613f0e6026836145fb565b9150613f1982614a28565b604082019050919050565b6000613f316014836145fb565b9150613f3c82614a77565b602082019050919050565b6000613f546013836145fb565b9150613f5f82614aa0565b602082019050919050565b6000613f776012836145fb565b9150613f8282614ac9565b602082019050919050565b6000613f9a601e836145fb565b9150613fa582614af2565b602082019050919050565b6000613fbd6012836145fb565b9150613fc882614b1b565b602082019050919050565b6000613fe06016836145fb565b9150613feb82614b44565b602082019050919050565b600061400360058361460c565b915061400e82614b6d565b600582019050919050565b60006140266020836145fb565b915061403182614b96565b602082019050919050565b60006140496026836145fb565b915061405482614bbf565b604082019050919050565b600061406c602f836145fb565b915061407782614c0e565b604082019050919050565b600061408f6000836145f0565b915061409a82614c5d565b600082019050919050565b60006140b26010836145fb565b91506140bd82614c60565b602082019050919050565b60006140d56016836145fb565b91506140e082614c89565b602082019050919050565b60006140f86016836145fb565b915061410382614cb2565b602082019050919050565b600061411b601c836145fb565b915061412682614cdb565b602082019050919050565b600061413e601f836145fb565b915061414982614d04565b602082019050919050565b600061416160018361460c565b915061416c82614d2d565b600182019050919050565b60608201600082015161418d6000850182613dfc565b5060208201516141a060208501826141c8565b5060408201516141b36040850182613e31565b50505050565b6141c2816147a0565b82525050565b6141d1816147aa565b82525050565b60006141e38284613e1a565b60148201915081905092915050565b60006141fe8285613ed0565b915061420982614154565b91506142158284613ed0565b915061422082613ff6565b91508190509392505050565b600061423782614082565b9150819050919050565b60006020820190506142566000830184613e0b565b92915050565b60006080820190506142716000830187613e0b565b61427e6020830186613e0b565b61428b60408301856141b9565b818103606083015261429d8184613e5e565b905095945050505050565b60006020820190506142bd6000830184613e40565b92915050565b60006020820190506142d86000830184613e4f565b92915050565b600060208201905081810360008301526142f88184613e97565b905092915050565b6000602082019050818103600083015261431981613f01565b9050919050565b6000602082019050818103600083015261433981613f24565b9050919050565b6000602082019050818103600083015261435981613f47565b9050919050565b6000602082019050818103600083015261437981613f6a565b9050919050565b6000602082019050818103600083015261439981613f8d565b9050919050565b600060208201905081810360008301526143b981613fb0565b9050919050565b600060208201905081810360008301526143d981613fd3565b9050919050565b600060208201905081810360008301526143f981614019565b9050919050565b600060208201905081810360008301526144198161403c565b9050919050565b600060208201905081810360008301526144398161405f565b9050919050565b60006020820190508181036000830152614459816140a5565b9050919050565b60006020820190508181036000830152614479816140c8565b9050919050565b60006020820190508181036000830152614499816140eb565b9050919050565b600060208201905081810360008301526144b98161410e565b9050919050565b600060208201905081810360008301526144d981614131565b9050919050565b60006060820190506144f56000830184614177565b92915050565b600060208201905061451060008301846141b9565b92915050565b6000614520614531565b905061452c8282614832565b919050565b6000604051905090565b600067ffffffffffffffff821115614556576145556149bd565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614582576145816149bd565b5b61458b82614a0a565b9050602081019050919050565b600067ffffffffffffffff8211156145b3576145b26149bd565b5b6145bc82614a0a565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614622826147a0565b915061462d836147a0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561466257614661614901565b5b828201905092915050565b6000614678826147a0565b9150614683836147a0565b92508261469357614692614930565b5b828204905092915050565b60006146a9826147a0565b91506146b4836147a0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156146ed576146ec614901565b5b828202905092915050565b6000614703826147a0565b915061470e836147a0565b92508282101561472157614720614901565b5b828203905092915050565b600061473782614780565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b838110156147eb5780820151818401526020810190506147d0565b838111156147fa576000848401525b50505050565b6000600282049050600182168061481857607f821691505b6020821081141561482c5761482b61495f565b5b50919050565b61483b82614a0a565b810181811067ffffffffffffffff8211171561485a576148596149bd565b5b80604052505050565b600061486e826147a0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148a1576148a0614901565b5b600182019050919050565b60006148b7826148be565b9050919050565b60006148c982614a1b565b9050919050565b60006148db826147a0565b91506148e6836147a0565b9250826148f6576148f5614930565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f54727920746f2073656e64206d6f726520455448000000000000000000000000600082015250565b7f53616c65206973206e6f74206163746976652000000000000000000000000000600082015250565b7f53616c65206973206e6f74204163746976650000000000000000000000000000600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f596f7520617265206e6f7420696e2070726573616c6500000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5175616e74697479206d757374206265206c6573736572207468656e204d617860008201527f537570706c790000000000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b7f63616e206e6f74206d696e742074686973206d616e7900000000000000000000600082015250565b7f50757263686173652065786365656473206d617820616c6c6f77656400000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b614d5f8161472c565b8114614d6a57600080fd5b50565b614d768161473e565b8114614d8157600080fd5b50565b614d8d8161474a565b8114614d9857600080fd5b50565b614da481614754565b8114614daf57600080fd5b50565b614dbb816147a0565b8114614dc657600080fd5b5056fea26469706673582212205416551077cd9717436ca31dec3d214f0bee15a52faa7f7ab94271f01d44835c64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102e45760003560e01c80637cdd702e11610190578063aa98e0c6116100dc578063c87b56dd11610095578063e75722301161006f578063e757223014610b1a578063e8006bb014610b57578063e985e9c514610b80578063f2fde38b14610bbd576102e4565b8063c87b56dd14610a63578063dc33e68114610aa0578063e5ec56a014610add576102e4565b8063aa98e0c614610969578063ac44600214610994578063aebceff4146109ab578063b88d4fde146109e8578063bd32fb6614610a11578063c7b8fca714610a3a576102e4565b8063915a647f11610149578063a0712d6811610123578063a0712d68146108d2578063a22cb465146108ee578063a40ece7a14610917578063a5cdae2d14610940576102e4565b8063915a647f1461083f5780639231ab2a1461086a57806395d89b41146108a7576102e4565b80637cdd702e14610741578063852cbaee1461076c5780638825b014146107975780638ba4cc3c146107c05780638d859f3e146107e95780638da5cb5b14610814576102e4565b80632d5b005d1161024f57806351d7ff931161020857806369ba1a75116101e257806369ba1a751461068757806370a08231146106b0578063715018a6146106ed5780637523614314610704576102e4565b806351d7ff93146105f657806355f804b3146106215780636352211e1461064a576102e4565b80632d5b005d1461050e5780632ea7c5d9146105255780633fd173661461054e57806342842e0e146105775780634e69d560146105a057806351830227146105cb576102e4565b806318160ddd116102a157806318160ddd146103fe5780631984b28614610429578063200d2ed21461046657806323b872dd146104915780632632d5f8146104ba5780632ba2865b146104e5576102e4565b806301ffc9a7146102e957806306fdde0314610326578063081812fc14610351578063095ea7b31461038e5780630f2cdd6c146103b757806310157fc3146103e2575b600080fd5b3480156102f557600080fd5b50610310600480360381019061030b9190613ccc565b610be6565b60405161031d91906142a8565b60405180910390f35b34801561033257600080fd5b5061033b610cc8565b60405161034891906142de565b60405180910390f35b34801561035d57600080fd5b5061037860048036038101906103739190613d6f565b610d5a565b6040516103859190614241565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b09190613c03565b610dd6565b005b3480156103c357600080fd5b506103cc610ee1565b6040516103d991906144fb565b60405180910390f35b6103fc60048036038101906103f79190613d9c565b610ee7565b005b34801561040a57600080fd5b5061041361118b565b60405161042091906144fb565b60405180910390f35b34801561043557600080fd5b50610450600480360381019061044b9190613a80565b6111a2565b60405161045d91906144fb565b60405180910390f35b34801561047257600080fd5b5061047b6111ba565b60405161048891906144fb565b60405180910390f35b34801561049d57600080fd5b506104b860048036038101906104b39190613aed565b6111c0565b005b3480156104c657600080fd5b506104cf6111d0565b6040516104dc91906144fb565b60405180910390f35b3480156104f157600080fd5b5061050c60048036038101906105079190613d6f565b6111d6565b005b34801561051a57600080fd5b5061052361125c565b005b34801561053157600080fd5b5061054c60048036038101906105479190613d6f565b6112f5565b005b34801561055a57600080fd5b5061057560048036038101906105709190613d6f565b61137b565b005b34801561058357600080fd5b5061059e60048036038101906105999190613aed565b611401565b005b3480156105ac57600080fd5b506105b5611421565b6040516105c291906144fb565b60405180910390f35b3480156105d757600080fd5b506105e061142b565b6040516105ed91906142a8565b60405180910390f35b34801561060257600080fd5b5061060b61143e565b60405161061891906144fb565b60405180910390f35b34801561062d57600080fd5b5061064860048036038101906106439190613d26565b611444565b005b34801561065657600080fd5b50610671600480360381019061066c9190613d6f565b6114da565b60405161067e9190614241565b60405180910390f35b34801561069357600080fd5b506106ae60048036038101906106a99190613d6f565b6114f0565b005b3480156106bc57600080fd5b506106d760048036038101906106d29190613a80565b611576565b6040516106e491906144fb565b60405180910390f35b3480156106f957600080fd5b50610702611646565b005b34801561071057600080fd5b5061072b60048036038101906107269190613a80565b6116ce565b60405161073891906144fb565b60405180910390f35b34801561074d57600080fd5b506107566116e6565b60405161076391906144fb565b60405180910390f35b34801561077857600080fd5b506107816116ec565b60405161078e91906144fb565b60405180910390f35b3480156107a357600080fd5b506107be60048036038101906107b99190613d6f565b6116f2565b005b3480156107cc57600080fd5b506107e760048036038101906107e29190613c03565b611778565b005b3480156107f557600080fd5b506107fe611859565b60405161080b91906144fb565b60405180910390f35b34801561082057600080fd5b5061082961185f565b6040516108369190614241565b60405180910390f35b34801561084b57600080fd5b50610854611888565b60405161086191906144fb565b60405180910390f35b34801561087657600080fd5b50610891600480360381019061088c9190613d6f565b61188e565b60405161089e91906144e0565b60405180910390f35b3480156108b357600080fd5b506108bc6118a6565b6040516108c991906142de565b60405180910390f35b6108ec60048036038101906108e79190613d6f565b611938565b005b3480156108fa57600080fd5b5061091560048036038101906109109190613bc3565b611bbe565b005b34801561092357600080fd5b5061093e60048036038101906109399190613d6f565b611d36565b005b34801561094c57600080fd5b5061096760048036038101906109629190613d6f565b611dbc565b005b34801561097557600080fd5b5061097e611e42565b60405161098b91906142c3565b60405180910390f35b3480156109a057600080fd5b506109a9611e48565b005b3480156109b757600080fd5b506109d260048036038101906109cd9190613d6f565b611fc9565b6040516109df91906144fb565b60405180910390f35b3480156109f457600080fd5b50610a0f6004803603810190610a0a9190613b40565b611fe0565b005b348015610a1d57600080fd5b50610a386004803603810190610a339190613c9f565b61205c565b005b348015610a4657600080fd5b50610a616004803603810190610a5c9190613d26565b6120e2565b005b348015610a6f57600080fd5b50610a8a6004803603810190610a859190613d6f565b612178565b604051610a9791906142de565b60405180910390f35b348015610aac57600080fd5b50610ac76004803603810190610ac29190613a80565b6122ce565b604051610ad491906144fb565b60405180910390f35b348015610ae957600080fd5b50610b046004803603810190610aff9190613c43565b6122e0565b604051610b1191906142a8565b60405180910390f35b348015610b2657600080fd5b50610b416004803603810190610b3c9190613d6f565b61231d565b604051610b4e91906144fb565b60405180910390f35b348015610b6357600080fd5b50610b7e6004803603810190610b799190613d6f565b612334565b005b348015610b8c57600080fd5b50610ba76004803603810190610ba29190613aad565b6123ba565b604051610bb491906142a8565b60405180910390f35b348015610bc957600080fd5b50610be46004803603810190610bdf9190613a80565b61244e565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610cb157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610cc15750610cc082612546565b5b9050919050565b606060038054610cd790614800565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0390614800565b8015610d505780601f10610d2557610100808354040283529160200191610d50565b820191906000526020600020905b815481529060010190602001808311610d3357829003601f168201915b5050505050905090565b6000610d65826125b0565b610d9b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610de1826114da565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e49576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e686125fe565b73ffffffffffffffffffffffffffffffffffffffff1614158015610e9a5750610e9881610e936125fe565b6123ba565b155b15610ed1576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610edc838383612606565b505050565b600b5481565b600160115414610f2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2390614340565b60405180910390fd5b60175483610f3861118b565b610f429190614617565b1115610f83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7a90614400565b60405180910390fd5b610fce828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050336122e0565b61100d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611004906143c0565b60405180910390fd5b601254831115611052576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104990614480565b60405180910390fd5b60155483611060919061469e565b3410156110a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109990614320565b60405180910390fd5b82601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110f19190614617565b92505081905550601354601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561117c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611173906144a0565b60405180910390fd5b61118633846126b8565b505050565b60006111956126d6565b6002546001540303905090565b60166020528060005260406000206000915090505481565b60115481565b6111cb8383836126df565b505050565b60155481565b6111de6125fe565b73ffffffffffffffffffffffffffffffffffffffff166111fc61185f565b73ffffffffffffffffffffffffffffffffffffffff1614611252576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611249906143e0565b60405180910390fd5b80600b8190555050565b6112646125fe565b73ffffffffffffffffffffffffffffffffffffffff1661128261185f565b73ffffffffffffffffffffffffffffffffffffffff16146112d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cf906143e0565b60405180910390fd5b6001601060006101000a81548160ff021916908315150217905550565b6112fd6125fe565b73ffffffffffffffffffffffffffffffffffffffff1661131b61185f565b73ffffffffffffffffffffffffffffffffffffffff1614611371576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611368906143e0565b60405180910390fd5b8060128190555050565b6113836125fe565b73ffffffffffffffffffffffffffffffffffffffff166113a161185f565b73ffffffffffffffffffffffffffffffffffffffff16146113f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ee906143e0565b60405180910390fd5b80600d8190555050565b61141c83838360405180602001604052806000815250611fe0565b505050565b6000601154905090565b601060009054906101000a900460ff1681565b600a5481565b61144c6125fe565b73ffffffffffffffffffffffffffffffffffffffff1661146a61185f565b73ffffffffffffffffffffffffffffffffffffffff16146114c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b7906143e0565b60405180910390fd5b80600e90805190602001906114d6929190613748565b5050565b60006114e582612b95565b600001519050919050565b6114f86125fe565b73ffffffffffffffffffffffffffffffffffffffff1661151661185f565b73ffffffffffffffffffffffffffffffffffffffff161461156c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611563906143e0565b60405180910390fd5b8060118190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115de576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61164e6125fe565b73ffffffffffffffffffffffffffffffffffffffff1661166c61185f565b73ffffffffffffffffffffffffffffffffffffffff16146116c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b9906143e0565b60405180910390fd5b6116cc6000612e24565b565b600c6020528060005260406000206000915090505481565b60125481565b60135481565b6116fa6125fe565b73ffffffffffffffffffffffffffffffffffffffff1661171861185f565b73ffffffffffffffffffffffffffffffffffffffff161461176e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611765906143e0565b60405180910390fd5b8060158190555050565b6117806125fe565b73ffffffffffffffffffffffffffffffffffffffff1661179e61185f565b73ffffffffffffffffffffffffffffffffffffffff16146117f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117eb906143e0565b60405180910390fd5b6115b38161180061118b565b61180a9190614617565b111561184b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611842906143a0565b60405180910390fd5b61185582826126b8565b5050565b600d5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60175481565b6118966137ce565b61189f82612b95565b9050919050565b6060600480546118b590614800565b80601f01602080910402602001604051908101604052809291908181526020018280546118e190614800565b801561192e5780601f106119035761010080835404028352916020019161192e565b820191906000526020600020905b81548152906001019060200180831161191157829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146119a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199d90614380565b60405180910390fd5b6002601154146119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e290614360565b60405180910390fd5b6115b3816119f761118b565b611a019190614617565b1115611a42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a39906143a0565b60405180910390fd5b600a54811115611a87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7e90614480565b60405180910390fd5b80600d54611a95919061469e565b341015611ad7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ace90614460565b60405180910390fd5b80600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b269190614617565b92505081905550600b54600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611bb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba8906144a0565b60405180910390fd5b611bbb33826126b8565b50565b611bc66125fe565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c2b576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611c386125fe565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ce56125fe565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d2a91906142a8565b60405180910390a35050565b611d3e6125fe565b73ffffffffffffffffffffffffffffffffffffffff16611d5c61185f565b73ffffffffffffffffffffffffffffffffffffffff1614611db2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da9906143e0565b60405180910390fd5b80600a8190555050565b611dc46125fe565b73ffffffffffffffffffffffffffffffffffffffff16611de261185f565b73ffffffffffffffffffffffffffffffffffffffff1614611e38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2f906143e0565b60405180910390fd5b8060138190555050565b60145481565b611e506125fe565b73ffffffffffffffffffffffffffffffffffffffff16611e6e61185f565b73ffffffffffffffffffffffffffffffffffffffff1614611ec4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebb906143e0565b60405180910390fd5b60026009541415611f0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f01906144c0565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051611f389061422c565b60006040518083038185875af1925050503d8060008114611f75576040519150601f19603f3d011682016040523d82523d6000602084013e611f7a565b606091505b5050905080611fbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb590614440565b60405180910390fd5b506001600981905550565b600060155482611fd9919061469e565b9050919050565b611feb8484846126df565b61200a8373ffffffffffffffffffffffffffffffffffffffff16612ee8565b801561201f575061201d84848484612efb565b155b15612056576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6120646125fe565b73ffffffffffffffffffffffffffffffffffffffff1661208261185f565b73ffffffffffffffffffffffffffffffffffffffff16146120d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cf906143e0565b60405180910390fd5b8060148190555050565b6120ea6125fe565b73ffffffffffffffffffffffffffffffffffffffff1661210861185f565b73ffffffffffffffffffffffffffffffffffffffff161461215e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612155906143e0565b60405180910390fd5b80600f9080519060200190612174929190613748565b5050565b6060612183826125b0565b6121c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b990614420565b60405180910390fd5b60001515601060009054906101000a900460ff161515141561227057600f80546121eb90614800565b80601f016020809104026020016040519081016040528092919081815260200182805461221790614800565b80156122645780601f1061223957610100808354040283529160200191612264565b820191906000526020600020905b81548152906001019060200180831161224757829003601f168201915b505050505090506122c9565b600061227a61305b565b9050600081511161229a57604051806020016040528060008152506122c5565b806122a4846130ed565b6040516020016122b59291906141f2565b6040516020818303038152906040525b9150505b919050565b60006122d98261324e565b9050919050565b600061231583601454846040516020016122fa91906141d7565b604051602081830303815290604052805190602001206132b8565b905092915050565b6000600d548261232d919061469e565b9050919050565b61233c6125fe565b73ffffffffffffffffffffffffffffffffffffffff1661235a61185f565b73ffffffffffffffffffffffffffffffffffffffff16146123b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a7906143e0565b60405180910390fd5b8060178190555050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6124566125fe565b73ffffffffffffffffffffffffffffffffffffffff1661247461185f565b73ffffffffffffffffffffffffffffffffffffffff16146124ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c1906143e0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561253a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253190614300565b60405180910390fd5b61254381612e24565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816125bb6126d6565b111580156125ca575060015482105b80156125f7575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6126d28282604051806020016040528060008152506132cf565b5050565b60006001905090565b60006126ea82612b95565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612755576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166127766125fe565b73ffffffffffffffffffffffffffffffffffffffff1614806127a557506127a48561279f6125fe565b6123ba565b5b806127ea57506127b36125fe565b73ffffffffffffffffffffffffffffffffffffffff166127d284610d5a565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612823576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561288a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61289785858560016132e1565b6128a360008487612606565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612b23576001548214612b2257878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b8e85858560016132e7565b5050505050565b612b9d6137ce565b600082905080612bab6126d6565b11158015612bba575060015481105b15612ded576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612deb57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612ccf578092505050612e1f565b5b600115612dea57818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612de5578092505050612e1f565b612cd0565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f216125fe565b8786866040518563ffffffff1660e01b8152600401612f43949392919061425c565b602060405180830381600087803b158015612f5d57600080fd5b505af1925050508015612f8e57506040513d601f19601f82011682018060405250810190612f8b9190613cf9565b60015b613008573d8060008114612fbe576040519150601f19603f3d011682016040523d82523d6000602084013e612fc3565b606091505b50600081511415613000576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600e805461306a90614800565b80601f016020809104026020016040519081016040528092919081815260200182805461309690614800565b80156130e35780601f106130b8576101008083540402835291602001916130e3565b820191906000526020600020905b8154815290600101906020018083116130c657829003601f168201915b5050505050905090565b60606000821415613135576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613249565b600082905060005b6000821461316757808061315090614863565b915050600a82613160919061466d565b915061313d565b60008167ffffffffffffffff811115613183576131826149bd565b5b6040519080825280601f01601f1916602001820160405280156131b55781602001600182028036833780820191505090505b5090505b60008514613242576001826131ce91906146f8565b9150600a856131dd91906148d0565b60306131e99190614617565b60f81b8183815181106131ff576131fe61498e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561323b919061466d565b94506131b9565b8093505050505b919050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6000826132c585846132ed565b1490509392505050565b6132dc8383836001613362565b505050565b50505050565b50505050565b60008082905060005b84518110156133575760008582815181106133145761331361498e565b5b602002602001015190508083116133365761332f8382613731565b9250613343565b6133408184613731565b92505b50808061334f90614863565b9150506132f6565b508091505092915050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156133d0576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141561340b576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61341860008683876132e1565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156135e257506135e18773ffffffffffffffffffffffffffffffffffffffff16612ee8565b5b156136a8575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46136576000888480600101955088612efb565b61368d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156135e85782600154146136a357600080fd5b613714565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156136a9575b81600181905550505061372a60008683876132e7565b5050505050565b600082600052816020526040600020905092915050565b82805461375490614800565b90600052602060002090601f01602090048101928261377657600085556137bd565b82601f1061378f57805160ff19168380011785556137bd565b828001600101855582156137bd579182015b828111156137bc5782518255916020019190600101906137a1565b5b5090506137ca9190613811565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561382a576000816000905550600101613812565b5090565b600061384161383c8461453b565b614516565b90508083825260208201905082856020860282011115613864576138636149f6565b5b60005b85811015613894578161387a88826139d0565b845260208401935060208301925050600181019050613867565b5050509392505050565b60006138b16138ac84614567565b614516565b9050828152602081018484840111156138cd576138cc6149fb565b5b6138d88482856147be565b509392505050565b60006138f36138ee84614598565b614516565b90508281526020810184848401111561390f5761390e6149fb565b5b61391a8482856147be565b509392505050565b60008135905061393181614d56565b92915050565b60008083601f84011261394d5761394c6149f1565b5b8235905067ffffffffffffffff81111561396a576139696149ec565b5b602083019150836020820283011115613986576139856149f6565b5b9250929050565b600082601f8301126139a2576139a16149f1565b5b81356139b284826020860161382e565b91505092915050565b6000813590506139ca81614d6d565b92915050565b6000813590506139df81614d84565b92915050565b6000813590506139f481614d9b565b92915050565b600081519050613a0981614d9b565b92915050565b600082601f830112613a2457613a236149f1565b5b8135613a3484826020860161389e565b91505092915050565b600082601f830112613a5257613a516149f1565b5b8135613a628482602086016138e0565b91505092915050565b600081359050613a7a81614db2565b92915050565b600060208284031215613a9657613a95614a05565b5b6000613aa484828501613922565b91505092915050565b60008060408385031215613ac457613ac3614a05565b5b6000613ad285828601613922565b9250506020613ae385828601613922565b9150509250929050565b600080600060608486031215613b0657613b05614a05565b5b6000613b1486828701613922565b9350506020613b2586828701613922565b9250506040613b3686828701613a6b565b9150509250925092565b60008060008060808587031215613b5a57613b59614a05565b5b6000613b6887828801613922565b9450506020613b7987828801613922565b9350506040613b8a87828801613a6b565b925050606085013567ffffffffffffffff811115613bab57613baa614a00565b5b613bb787828801613a0f565b91505092959194509250565b60008060408385031215613bda57613bd9614a05565b5b6000613be885828601613922565b9250506020613bf9858286016139bb565b9150509250929050565b60008060408385031215613c1a57613c19614a05565b5b6000613c2885828601613922565b9250506020613c3985828601613a6b565b9150509250929050565b60008060408385031215613c5a57613c59614a05565b5b600083013567ffffffffffffffff811115613c7857613c77614a00565b5b613c848582860161398d565b9250506020613c9585828601613922565b9150509250929050565b600060208284031215613cb557613cb4614a05565b5b6000613cc3848285016139d0565b91505092915050565b600060208284031215613ce257613ce1614a05565b5b6000613cf0848285016139e5565b91505092915050565b600060208284031215613d0f57613d0e614a05565b5b6000613d1d848285016139fa565b91505092915050565b600060208284031215613d3c57613d3b614a05565b5b600082013567ffffffffffffffff811115613d5a57613d59614a00565b5b613d6684828501613a3d565b91505092915050565b600060208284031215613d8557613d84614a05565b5b6000613d9384828501613a6b565b91505092915050565b600080600060408486031215613db557613db4614a05565b5b6000613dc386828701613a6b565b935050602084013567ffffffffffffffff811115613de457613de3614a00565b5b613df086828701613937565b92509250509250925092565b613e058161472c565b82525050565b613e148161472c565b82525050565b613e2b613e268261472c565b6148ac565b82525050565b613e3a8161473e565b82525050565b613e498161473e565b82525050565b613e588161474a565b82525050565b6000613e69826145c9565b613e7381856145df565b9350613e838185602086016147cd565b613e8c81614a0a565b840191505092915050565b6000613ea2826145d4565b613eac81856145fb565b9350613ebc8185602086016147cd565b613ec581614a0a565b840191505092915050565b6000613edb826145d4565b613ee5818561460c565b9350613ef58185602086016147cd565b80840191505092915050565b6000613f0e6026836145fb565b9150613f1982614a28565b604082019050919050565b6000613f316014836145fb565b9150613f3c82614a77565b602082019050919050565b6000613f546013836145fb565b9150613f5f82614aa0565b602082019050919050565b6000613f776012836145fb565b9150613f8282614ac9565b602082019050919050565b6000613f9a601e836145fb565b9150613fa582614af2565b602082019050919050565b6000613fbd6012836145fb565b9150613fc882614b1b565b602082019050919050565b6000613fe06016836145fb565b9150613feb82614b44565b602082019050919050565b600061400360058361460c565b915061400e82614b6d565b600582019050919050565b60006140266020836145fb565b915061403182614b96565b602082019050919050565b60006140496026836145fb565b915061405482614bbf565b604082019050919050565b600061406c602f836145fb565b915061407782614c0e565b604082019050919050565b600061408f6000836145f0565b915061409a82614c5d565b600082019050919050565b60006140b26010836145fb565b91506140bd82614c60565b602082019050919050565b60006140d56016836145fb565b91506140e082614c89565b602082019050919050565b60006140f86016836145fb565b915061410382614cb2565b602082019050919050565b600061411b601c836145fb565b915061412682614cdb565b602082019050919050565b600061413e601f836145fb565b915061414982614d04565b602082019050919050565b600061416160018361460c565b915061416c82614d2d565b600182019050919050565b60608201600082015161418d6000850182613dfc565b5060208201516141a060208501826141c8565b5060408201516141b36040850182613e31565b50505050565b6141c2816147a0565b82525050565b6141d1816147aa565b82525050565b60006141e38284613e1a565b60148201915081905092915050565b60006141fe8285613ed0565b915061420982614154565b91506142158284613ed0565b915061422082613ff6565b91508190509392505050565b600061423782614082565b9150819050919050565b60006020820190506142566000830184613e0b565b92915050565b60006080820190506142716000830187613e0b565b61427e6020830186613e0b565b61428b60408301856141b9565b818103606083015261429d8184613e5e565b905095945050505050565b60006020820190506142bd6000830184613e40565b92915050565b60006020820190506142d86000830184613e4f565b92915050565b600060208201905081810360008301526142f88184613e97565b905092915050565b6000602082019050818103600083015261431981613f01565b9050919050565b6000602082019050818103600083015261433981613f24565b9050919050565b6000602082019050818103600083015261435981613f47565b9050919050565b6000602082019050818103600083015261437981613f6a565b9050919050565b6000602082019050818103600083015261439981613f8d565b9050919050565b600060208201905081810360008301526143b981613fb0565b9050919050565b600060208201905081810360008301526143d981613fd3565b9050919050565b600060208201905081810360008301526143f981614019565b9050919050565b600060208201905081810360008301526144198161403c565b9050919050565b600060208201905081810360008301526144398161405f565b9050919050565b60006020820190508181036000830152614459816140a5565b9050919050565b60006020820190508181036000830152614479816140c8565b9050919050565b60006020820190508181036000830152614499816140eb565b9050919050565b600060208201905081810360008301526144b98161410e565b9050919050565b600060208201905081810360008301526144d981614131565b9050919050565b60006060820190506144f56000830184614177565b92915050565b600060208201905061451060008301846141b9565b92915050565b6000614520614531565b905061452c8282614832565b919050565b6000604051905090565b600067ffffffffffffffff821115614556576145556149bd565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614582576145816149bd565b5b61458b82614a0a565b9050602081019050919050565b600067ffffffffffffffff8211156145b3576145b26149bd565b5b6145bc82614a0a565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614622826147a0565b915061462d836147a0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561466257614661614901565b5b828201905092915050565b6000614678826147a0565b9150614683836147a0565b92508261469357614692614930565b5b828204905092915050565b60006146a9826147a0565b91506146b4836147a0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156146ed576146ec614901565b5b828202905092915050565b6000614703826147a0565b915061470e836147a0565b92508282101561472157614720614901565b5b828203905092915050565b600061473782614780565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b838110156147eb5780820151818401526020810190506147d0565b838111156147fa576000848401525b50505050565b6000600282049050600182168061481857607f821691505b6020821081141561482c5761482b61495f565b5b50919050565b61483b82614a0a565b810181811067ffffffffffffffff8211171561485a576148596149bd565b5b80604052505050565b600061486e826147a0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148a1576148a0614901565b5b600182019050919050565b60006148b7826148be565b9050919050565b60006148c982614a1b565b9050919050565b60006148db826147a0565b91506148e6836147a0565b9250826148f6576148f5614930565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f54727920746f2073656e64206d6f726520455448000000000000000000000000600082015250565b7f53616c65206973206e6f74206163746976652000000000000000000000000000600082015250565b7f53616c65206973206e6f74204163746976650000000000000000000000000000600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f596f7520617265206e6f7420696e2070726573616c6500000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5175616e74697479206d757374206265206c6573736572207468656e204d617860008201527f537570706c790000000000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b7f63616e206e6f74206d696e742074686973206d616e7900000000000000000000600082015250565b7f50757263686173652065786365656473206d617820616c6c6f77656400000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b614d5f8161472c565b8114614d6a57600080fd5b50565b614d768161473e565b8114614d8157600080fd5b50565b614d8d8161474a565b8114614d9857600080fd5b50565b614da481614754565b8114614daf57600080fd5b50565b614dbb816147a0565b8114614dc657600080fd5b5056fea26469706673582212205416551077cd9717436ca31dec3d214f0bee15a52faa7f7ab94271f01d44835c64736f6c63430008070033

Deployed Bytecode Sourcemap

32885:5641:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15140:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18253:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19756:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19319:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33071:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37255:700;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14389:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36613:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33518:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20621:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36563:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35811:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34729:79;;;;;;;;;;;;;:::i;:::-;;37964:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35592:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20862:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35992:73;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33483:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32979:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34814:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18061:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35913:72;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15509:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5171:103;;;;;;;;;;;;;:::i;:::-;;33155:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36436:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36478:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38389:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36198:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33373:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4948:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36673:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35251:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18422:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33752:528;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20032:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35696:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38103:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36522:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35405:181;;;;;;;;;;;;;:::i;:::-;;36896:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21118:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36746:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34919:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34287:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35140:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37046:199;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36075:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38250:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20390:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5283:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15140:305;15242:4;15294:25;15279:40;;;:11;:40;;;;:105;;;;15351:33;15336:48;;;:11;:48;;;;15279:105;:158;;;;15401:36;15425:11;15401:23;:36::i;:::-;15279:158;15259:178;;15140:305;;;:::o;18253:100::-;18307:13;18340:5;18333:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18253:100;:::o;19756:204::-;19824:7;19849:16;19857:7;19849;:16::i;:::-;19844:64;;19874:34;;;;;;;;;;;;;;19844:64;19928:15;:24;19944:7;19928:24;;;;;;;;;;;;;;;;;;;;;19921:31;;19756:204;;;:::o;19319:371::-;19392:13;19408:24;19424:7;19408:15;:24::i;:::-;19392:40;;19453:5;19447:11;;:2;:11;;;19443:48;;;19467:24;;;;;;;;;;;;;;19443:48;19524:5;19508:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;19534:37;19551:5;19558:12;:10;:12::i;:::-;19534:16;:37::i;:::-;19533:38;19508:63;19504:138;;;19595:35;;;;;;;;;;;;;;19504:138;19654:28;19663:2;19667:7;19676:5;19654:8;:28::i;:::-;19381:309;19319:371;;:::o;33071:33::-;;;;:::o;37255:700::-;37379:1;37369:6;;:11;37361:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;37448:16;;37438:8;37424:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:40;;37416:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;37525:31;37537:6;;37525:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37545:10;37525:11;:31::i;:::-;37517:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;37614:16;;37602:8;:28;;37594:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;37699:18;;37688:8;:29;;;;:::i;:::-;37675:9;:42;;37667:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;37789:8;37755:18;:30;37774:10;37755:30;;;;;;;;;;;;;;;;:42;;;;;;;:::i;:::-;;;;;;;;37850:18;;37816;:30;37835:10;37816:30;;;;;;;;;;;;;;;;:52;;37808:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;37914:31;37924:10;37936:8;37914:9;:31::i;:::-;37255:700;;;:::o;14389:303::-;14433:7;14658:15;:13;:15::i;:::-;14643:12;;14627:13;;:28;:46;14620:53;;14389:303;:::o;36613:53::-;;;;;;;;;;;;;;;;;:::o;33518:22::-;;;;:::o;20621:170::-;20755:28;20765:4;20771:2;20775:7;20755:9;:28::i;:::-;20621:170;;;:::o;36563:43::-;;;;:::o;35811:96::-;5093:12;:10;:12::i;:::-;5082:23;;:7;:5;:7::i;:::-;:23;;;5074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35900:1:::1;35883:14;:18;;;;35811:96:::0;:::o;34729:79::-;5093:12;:10;:12::i;:::-;5082:23;;:7;:5;:7::i;:::-;:23;;;5074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34798:4:::1;34787:8;;:15;;;;;;;;;;;;;;;;;;34729:79::o:0;37964:130::-;5093:12;:10;:12::i;:::-;5082:23;;:7;:5;:7::i;:::-;:23;;;5074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38069:17:::1;38050:16;:36;;;;37964:130:::0;:::o;35592:98::-;5093:12;:10;:12::i;:::-;5082:23;;:7;:5;:7::i;:::-;:23;;;5074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35675:9:::1;35667:5;:17;;;;35592:98:::0;:::o;20862:185::-;21000:39;21017:4;21023:2;21027:7;21000:39;;;;;;;;;;;;:16;:39::i;:::-;20862:185;;;:::o;35992:73::-;36032:4;36053:6;;36046:13;;35992:73;:::o;33483:28::-;;;;;;;;;;;;;:::o;32979:38::-;;;;:::o;34814:98::-;5093:12;:10;:12::i;:::-;5082:23;;:7;:5;:7::i;:::-;:23;;;5074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34899:7:::1;34883:13;:23;;;;;;;;;;;;:::i;:::-;;34814:98:::0;:::o;18061:125::-;18125:7;18152:21;18165:7;18152:12;:21::i;:::-;:26;;;18145:33;;18061:125;;;:::o;35913:72::-;5093:12;:10;:12::i;:::-;5082:23;;:7;:5;:7::i;:::-;:23;;;5074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35978:1:::1;35969:6;:10;;;;35913:72:::0;:::o;15509:206::-;15573:7;15614:1;15597:19;;:5;:19;;;15593:60;;;15625:28;;;;;;;;;;;;;;15593:60;15679:12;:19;15692:5;15679:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;15671:36;;15664:43;;15509:206;;;:::o;5171:103::-;5093:12;:10;:12::i;:::-;5082:23;;:7;:5;:7::i;:::-;:23;;;5074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5236:30:::1;5263:1;5236:18;:30::i;:::-;5171:103::o:0;33155:50::-;;;;;;;;;;;;;;;;;:::o;36436:35::-;;;;:::o;36478:37::-;;;;:::o;38389:134::-;5093:12;:10;:12::i;:::-;5082:23;;:7;:5;:7::i;:::-;:23;;;5074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38496:19:::1;38475:18;:40;;;;38389:134:::0;:::o;36198:189::-;5093:12;:10;:12::i;:::-;5082:23;;:7;:5;:7::i;:::-;:23;;;5074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33260:4:::1;36292:8;36276:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:48;;36268:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;36354:27;36364:6;36372:8;36354:9;:27::i;:::-;36198:189:::0;;:::o;33373:35::-;;;;:::o;4948:87::-;4994:7;5021:6;;;;;;;;;;;5014:13;;4948:87;:::o;36673:38::-;;;;:::o;35251:148::-;35332:21;;:::i;:::-;35372;35385:7;35372:12;:21::i;:::-;35365:28;;35251:148;;;:::o;18422:104::-;18478:13;18511:7;18504:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18422:104;:::o;33752:528::-;33686:10;33673:23;;:9;:23;;;33665:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;33839:1:::1;33829:6;;:11;33821:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;33260:4;33895:8;33879:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:48;;33871:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;33977:19;;33965:8;:31;;33957:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34058:8;34050:5;;:16;;;;:::i;:::-;34037:9;:29;;34029:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;34133:8;34102:15;:27;34118:10;34102:27;;;;;;;;;;;;;;;;:39;;;;;;;:::i;:::-;;;;;;;;34187:14;;34156:15;:27;34172:10;34156:27;;;;;;;;;;;;;;;;:45;;34148:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;34243:31;34253:10;34265:8;34243:9;:31::i;:::-;33752:528:::0;:::o;20032:287::-;20143:12;:10;:12::i;:::-;20131:24;;:8;:24;;;20127:54;;;20164:17;;;;;;;;;;;;;;20127:54;20239:8;20194:18;:32;20213:12;:10;:12::i;:::-;20194:32;;;;;;;;;;;;;;;:42;20227:8;20194:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;20292:8;20263:48;;20278:12;:10;:12::i;:::-;20263:48;;;20302:8;20263:48;;;;;;:::i;:::-;;;;;;;;20032:287;;:::o;35696:106::-;5093:12;:10;:12::i;:::-;5082:23;;:7;:5;:7::i;:::-;:23;;;5074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35795:1:::1;35773:19;:23;;;;35696:106:::0;:::o;38103:138::-;5093:12;:10;:12::i;:::-;5082:23;;:7;:5;:7::i;:::-;:23;;;5074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38214:19:::1;38193:18;:40;;;;38103:138:::0;:::o;36522:34::-;;;;:::o;35405:181::-;5093:12;:10;:12::i;:::-;5082:23;;:7;:5;:7::i;:::-;:23;;;5074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2730:1:::1;2876:7;;:19;;2868:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;2730:1;2937:7;:18;;;;35470:12:::2;35488:10;:15;;35511:21;35488:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35469:68;;;35552:7;35544:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;35462:124;2686:1:::1;2980:7;:22;;;;35405:181::o:0;36896:142::-;36963:7;37012:18;;37002:9;:28;;;;:::i;:::-;36995:35;;36896:142;;;:::o;21118:369::-;21285:28;21295:4;21301:2;21305:7;21285:9;:28::i;:::-;21328:15;:2;:13;;;:15::i;:::-;:76;;;;;21348:56;21379:4;21385:2;21389:7;21398:5;21348:30;:56::i;:::-;21347:57;21328:76;21324:156;;;21428:40;;;;;;;;;;;;;;21324:156;21118:369;;;;:::o;36746:142::-;5093:12;:10;:12::i;:::-;5082:23;;:7;:5;:7::i;:::-;:23;;;5074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36860:20:::1;36838:19;:42;;;;36746:142:::0;:::o;34919:101::-;5093:12;:10;:12::i;:::-;5082:23;;:7;:5;:7::i;:::-;:23;;;5074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35011:3:::1;34992:16;:22;;;;;;;;;;;;:::i;:::-;;34919:101:::0;:::o;34287:436::-;34360:13;34390:16;34398:7;34390;:16::i;:::-;34382:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;34481:5;34469:17;;:8;;;;;;;;;;;:17;;;34466:63;;;34505:16;34498:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34466:63;34539:21;34563:10;:8;:10::i;:::-;34539:34;;34628:1;34610:7;34604:21;:25;:113;;;;;;;;;;;;;;;;;34669:7;34683:18;:7;:16;:18::i;:::-;34652:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;34604:113;34584:133;;;34287:436;;;;:::o;35140:107::-;35198:7;35221:20;35235:5;35221:13;:20::i;:::-;35214:27;;35140:107;;;:::o;37046:199::-;37129:4;37153:84;37172:6;37180:19;;37228:6;37211:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;37201:35;;;;;;37153:18;:84::i;:::-;37146:91;;37046:199;;;;:::o;36075:117::-;36133:7;36179:5;;36169:9;:15;;;;:::i;:::-;36162:22;;36075:117;;;:::o;38250:131::-;5093:12;:10;:12::i;:::-;5082:23;;:7;:5;:7::i;:::-;:23;;;5074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38353:20:::1;38334:16;:39;;;;38250:131:::0;:::o;20390:164::-;20487:4;20511:18;:25;20530:5;20511:25;;;;;;;;;;;;;;;:35;20537:8;20511:35;;;;;;;;;;;;;;;;;;;;;;;;;20504:42;;20390:164;;;;:::o;5283:201::-;5093:12;:10;:12::i;:::-;5082:23;;:7;:5;:7::i;:::-;:23;;;5074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5392:1:::1;5372:22;;:8;:22;;;;5364:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5448:28;5467:8;5448:18;:28::i;:::-;5283:201:::0;:::o;9601:157::-;9686:4;9725:25;9710:40;;;:11;:40;;;;9703:47;;9601:157;;;:::o;21742:174::-;21799:4;21842:7;21823:15;:13;:15::i;:::-;:26;;:53;;;;;21863:13;;21853:7;:23;21823:53;:85;;;;;21881:11;:20;21893:7;21881:20;;;;;;;;;;;:27;;;;;;;;;;;;21880:28;21823:85;21816:92;;21742:174;;;:::o;4491:98::-;4544:7;4571:10;4564:17;;4491:98;:::o;29899:196::-;30041:2;30014:15;:24;30030:7;30014:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30079:7;30075:2;30059:28;;30068:5;30059:28;;;;;;;;;;;;29899:196;;;:::o;21924:104::-;21993:27;22003:2;22007:8;21993:27;;;;;;;;;;;;:9;:27::i;:::-;21924:104;;:::o;14163:92::-;14219:7;14246:1;14239:8;;14163:92;:::o;24842:2130::-;24957:35;24995:21;25008:7;24995:12;:21::i;:::-;24957:59;;25055:4;25033:26;;:13;:18;;;:26;;;25029:67;;25068:28;;;;;;;;;;;;;;25029:67;25109:22;25151:4;25135:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;25172:36;25189:4;25195:12;:10;:12::i;:::-;25172:16;:36::i;:::-;25135:73;:126;;;;25249:12;:10;:12::i;:::-;25225:36;;:20;25237:7;25225:11;:20::i;:::-;:36;;;25135:126;25109:153;;25280:17;25275:66;;25306:35;;;;;;;;;;;;;;25275:66;25370:1;25356:16;;:2;:16;;;25352:52;;;25381:23;;;;;;;;;;;;;;25352:52;25417:43;25439:4;25445:2;25449:7;25458:1;25417:21;:43::i;:::-;25525:35;25542:1;25546:7;25555:4;25525:8;:35::i;:::-;25886:1;25856:12;:18;25869:4;25856:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25930:1;25902:12;:16;25915:2;25902:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25948:31;25982:11;:20;25994:7;25982:20;;;;;;;;;;;25948:54;;26033:2;26017:8;:13;;;:18;;;;;;;;;;;;;;;;;;26083:15;26050:8;:23;;;:49;;;;;;;;;;;;;;;;;;26351:19;26383:1;26373:7;:11;26351:33;;26399:31;26433:11;:24;26445:11;26433:24;;;;;;;;;;;26399:58;;26501:1;26476:27;;:8;:13;;;;;;;;;;;;:27;;;26472:384;;;26686:13;;26671:11;:28;26667:174;;26740:4;26724:8;:13;;;:20;;;;;;;;;;;;;;;;;;26793:13;:28;;;26767:8;:23;;;:54;;;;;;;;;;;;;;;;;;26667:174;26472:384;25831:1036;;;26903:7;26899:2;26884:27;;26893:4;26884:27;;;;;;;;;;;;26922:42;26943:4;26949:2;26953:7;26962:1;26922:20;:42::i;:::-;24946:2026;;24842:2130;;;:::o;16890:1109::-;16952:21;;:::i;:::-;16986:12;17001:7;16986:22;;17069:4;17050:15;:13;:15::i;:::-;:23;;:47;;;;;17084:13;;17077:4;:20;17050:47;17046:886;;;17118:31;17152:11;:17;17164:4;17152:17;;;;;;;;;;;17118:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17193:9;:16;;;17188:729;;17264:1;17238:28;;:9;:14;;;:28;;;17234:101;;17302:9;17295:16;;;;;;17234:101;17637:261;17644:4;17637:261;;;17677:6;;;;;;;;17722:11;:17;17734:4;17722:17;;;;;;;;;;;17710:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17796:1;17770:28;;:9;:14;;;:28;;;17766:109;;17838:9;17831:16;;;;;;17766:109;17637:261;;;17188:729;17099:833;17046:886;17960:31;;;;;;;;;;;;;;16890:1109;;;;:::o;5493:191::-;5567:16;5586:6;;;;;;;;;;;5567:25;;5612:8;5603:6;;:17;;;;;;;;;;;;;;;;;;5667:8;5636:40;;5657:8;5636:40;;;;;;;;;;;;5556:128;5493:191;:::o;5716:197::-;5776:4;5794:12;5861:7;5849:20;5841:28;;5904:1;5897:4;:8;5890:15;;;5716:197;;;:::o;30587:667::-;30750:4;30787:2;30771:36;;;30808:12;:10;:12::i;:::-;30822:4;30828:7;30837:5;30771:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30767:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31022:1;31005:6;:13;:18;31001:235;;;31051:40;;;;;;;;;;;;;;31001:235;31194:6;31188:13;31179:6;31175:2;31171:15;31164:38;30767:480;30900:45;;;30890:55;;;:6;:55;;;;30883:62;;;30587:667;;;;;;:::o;35026:108::-;35086:13;35115;35108:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35026:108;:::o;3108:533::-;3164:13;3204:1;3195:5;:10;3191:53;;;3222:10;;;;;;;;;;;;;;;;;;;;;3191:53;3254:12;3269:5;3254:20;;3285:14;3310:78;3325:1;3317:4;:9;3310:78;;3343:8;;;;;:::i;:::-;;;;3374:2;3366:10;;;;;:::i;:::-;;;3310:78;;;3398:19;3430:6;3420:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3398:39;;3448:154;3464:1;3455:5;:10;3448:154;;3492:1;3482:11;;;;;:::i;:::-;;;3559:2;3551:5;:10;;;;:::i;:::-;3538:2;:24;;;;:::i;:::-;3525:39;;3508:6;3515;3508:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3588:2;3579:11;;;;;:::i;:::-;;;3448:154;;;3626:6;3612:21;;;;;3108:533;;;;:::o;15797:137::-;15858:7;15893:12;:19;15906:5;15893:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;15885:41;;15878:48;;15797:137;;;:::o;1111:190::-;1236:4;1289;1260:25;1273:5;1280:4;1260:12;:25::i;:::-;:33;1253:40;;1111:190;;;;;:::o;22391:163::-;22514:32;22520:2;22524:8;22534:5;22541:4;22514:5;:32::i;:::-;22391:163;;;:::o;31902:159::-;;;;;:::o;32720:158::-;;;;;:::o;1662:675::-;1745:7;1765:20;1788:4;1765:27;;1808:9;1803:497;1827:5;:12;1823:1;:16;1803:497;;;1861:20;1884:5;1890:1;1884:8;;;;;;;;:::i;:::-;;;;;;;;1861:31;;1927:12;1911;:28;1907:382;;2054:42;2069:12;2083;2054:14;:42::i;:::-;2039:57;;1907:382;;;2231:42;2246:12;2260;2231:14;:42::i;:::-;2216:57;;1907:382;1846:454;1841:3;;;;;:::i;:::-;;;;1803:497;;;;2317:12;2310:19;;;1662:675;;;;:::o;22813:1775::-;22952:20;22975:13;;22952:36;;23017:1;23003:16;;:2;:16;;;22999:48;;;23028:19;;;;;;;;;;;;;;22999:48;23074:1;23062:8;:13;23058:44;;;23084:18;;;;;;;;;;;;;;23058:44;23115:61;23145:1;23149:2;23153:12;23167:8;23115:21;:61::i;:::-;23488:8;23453:12;:16;23466:2;23453:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23552:8;23512:12;:16;23525:2;23512:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23611:2;23578:11;:25;23590:12;23578:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;23678:15;23628:11;:25;23640:12;23628:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;23711:20;23734:12;23711:35;;23761:11;23790:8;23775:12;:23;23761:37;;23819:4;:23;;;;;23827:15;:2;:13;;;:15::i;:::-;23819:23;23815:641;;;23863:314;23919:12;23915:2;23894:38;;23911:1;23894:38;;;;;;;;;;;;23960:69;23999:1;24003:2;24007:14;;;;;;24023:5;23960:30;:69::i;:::-;23955:174;;24065:40;;;;;;;;;;;;;;23955:174;24172:3;24156:12;:19;;23863:314;;24258:12;24241:13;;:29;24237:43;;24272:8;;;24237:43;23815:641;;;24321:120;24377:14;;;;;;24373:2;24352:40;;24369:1;24352:40;;;;;;;;;;;;24436:3;24420:12;:19;;24321:120;;23815:641;24486:12;24470:13;:28;;;;23428:1082;;24520:60;24549:1;24553:2;24557:12;24571:8;24520:20;:60::i;:::-;22941:1647;22813:1775;;;;:::o;2345:224::-;2413:13;2476:1;2470:4;2463:15;2505:1;2499:4;2492:15;2546:4;2540;2530:21;2521:30;;2345:224;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:568::-;1821:8;1831:6;1881:3;1874:4;1866:6;1862:17;1858:27;1848:122;;1889:79;;:::i;:::-;1848:122;2002:6;1989:20;1979:30;;2032:18;2024:6;2021:30;2018:117;;;2054:79;;:::i;:::-;2018:117;2168:4;2160:6;2156:17;2144:29;;2222:3;2214:4;2206:6;2202:17;2192:8;2188:32;2185:41;2182:128;;;2229:79;;:::i;:::-;2182:128;1748:568;;;;;:::o;2339:370::-;2410:5;2459:3;2452:4;2444:6;2440:17;2436:27;2426:122;;2467:79;;:::i;:::-;2426:122;2584:6;2571:20;2609:94;2699:3;2691:6;2684:4;2676:6;2672:17;2609:94;:::i;:::-;2600:103;;2416:293;2339:370;;;;:::o;2715:133::-;2758:5;2796:6;2783:20;2774:29;;2812:30;2836:5;2812:30;:::i;:::-;2715:133;;;;:::o;2854:139::-;2900:5;2938:6;2925:20;2916:29;;2954:33;2981:5;2954:33;:::i;:::-;2854:139;;;;:::o;2999:137::-;3044:5;3082:6;3069:20;3060:29;;3098:32;3124:5;3098:32;:::i;:::-;2999:137;;;;:::o;3142:141::-;3198:5;3229:6;3223:13;3214:22;;3245:32;3271:5;3245:32;:::i;:::-;3142:141;;;;:::o;3302:338::-;3357:5;3406:3;3399:4;3391:6;3387:17;3383:27;3373:122;;3414:79;;:::i;:::-;3373:122;3531:6;3518:20;3556:78;3630:3;3622:6;3615:4;3607:6;3603:17;3556:78;:::i;:::-;3547:87;;3363:277;3302:338;;;;:::o;3660:340::-;3716:5;3765:3;3758:4;3750:6;3746:17;3742:27;3732:122;;3773:79;;:::i;:::-;3732:122;3890:6;3877:20;3915:79;3990:3;3982:6;3975:4;3967:6;3963:17;3915:79;:::i;:::-;3906:88;;3722:278;3660:340;;;;:::o;4006:139::-;4052:5;4090:6;4077:20;4068:29;;4106:33;4133:5;4106:33;:::i;:::-;4006:139;;;;:::o;4151:329::-;4210:6;4259:2;4247:9;4238:7;4234:23;4230:32;4227:119;;;4265:79;;:::i;:::-;4227:119;4385:1;4410:53;4455:7;4446:6;4435:9;4431:22;4410:53;:::i;:::-;4400:63;;4356:117;4151:329;;;;:::o;4486:474::-;4554:6;4562;4611:2;4599:9;4590:7;4586:23;4582:32;4579:119;;;4617:79;;:::i;:::-;4579:119;4737:1;4762:53;4807:7;4798:6;4787:9;4783:22;4762:53;:::i;:::-;4752:63;;4708:117;4864:2;4890:53;4935:7;4926:6;4915:9;4911:22;4890:53;:::i;:::-;4880:63;;4835:118;4486:474;;;;;:::o;4966:619::-;5043:6;5051;5059;5108:2;5096:9;5087:7;5083:23;5079:32;5076:119;;;5114:79;;:::i;:::-;5076:119;5234:1;5259:53;5304:7;5295:6;5284:9;5280:22;5259:53;:::i;:::-;5249:63;;5205:117;5361:2;5387:53;5432:7;5423:6;5412:9;5408:22;5387:53;:::i;:::-;5377:63;;5332:118;5489:2;5515:53;5560:7;5551:6;5540:9;5536:22;5515:53;:::i;:::-;5505:63;;5460:118;4966:619;;;;;:::o;5591:943::-;5686:6;5694;5702;5710;5759:3;5747:9;5738:7;5734:23;5730:33;5727:120;;;5766:79;;:::i;:::-;5727:120;5886:1;5911:53;5956:7;5947:6;5936:9;5932:22;5911:53;:::i;:::-;5901:63;;5857:117;6013:2;6039:53;6084:7;6075:6;6064:9;6060:22;6039:53;:::i;:::-;6029:63;;5984:118;6141:2;6167:53;6212:7;6203:6;6192:9;6188:22;6167:53;:::i;:::-;6157:63;;6112:118;6297:2;6286:9;6282:18;6269:32;6328:18;6320:6;6317:30;6314:117;;;6350:79;;:::i;:::-;6314:117;6455:62;6509:7;6500:6;6489:9;6485:22;6455:62;:::i;:::-;6445:72;;6240:287;5591:943;;;;;;;:::o;6540:468::-;6605:6;6613;6662:2;6650:9;6641:7;6637:23;6633:32;6630:119;;;6668:79;;:::i;:::-;6630:119;6788:1;6813:53;6858:7;6849:6;6838:9;6834:22;6813:53;:::i;:::-;6803:63;;6759:117;6915:2;6941:50;6983:7;6974:6;6963:9;6959:22;6941:50;:::i;:::-;6931:60;;6886:115;6540:468;;;;;:::o;7014:474::-;7082:6;7090;7139:2;7127:9;7118:7;7114:23;7110:32;7107:119;;;7145:79;;:::i;:::-;7107:119;7265:1;7290:53;7335:7;7326:6;7315:9;7311:22;7290:53;:::i;:::-;7280:63;;7236:117;7392:2;7418:53;7463:7;7454:6;7443:9;7439:22;7418:53;:::i;:::-;7408:63;;7363:118;7014:474;;;;;:::o;7494:684::-;7587:6;7595;7644:2;7632:9;7623:7;7619:23;7615:32;7612:119;;;7650:79;;:::i;:::-;7612:119;7798:1;7787:9;7783:17;7770:31;7828:18;7820:6;7817:30;7814:117;;;7850:79;;:::i;:::-;7814:117;7955:78;8025:7;8016:6;8005:9;8001:22;7955:78;:::i;:::-;7945:88;;7741:302;8082:2;8108:53;8153:7;8144:6;8133:9;8129:22;8108:53;:::i;:::-;8098:63;;8053:118;7494:684;;;;;:::o;8184:329::-;8243:6;8292:2;8280:9;8271:7;8267:23;8263:32;8260:119;;;8298:79;;:::i;:::-;8260:119;8418:1;8443:53;8488:7;8479:6;8468:9;8464:22;8443:53;:::i;:::-;8433:63;;8389:117;8184:329;;;;:::o;8519:327::-;8577:6;8626:2;8614:9;8605:7;8601:23;8597:32;8594:119;;;8632:79;;:::i;:::-;8594:119;8752:1;8777:52;8821:7;8812:6;8801:9;8797:22;8777:52;:::i;:::-;8767:62;;8723:116;8519:327;;;;:::o;8852:349::-;8921:6;8970:2;8958:9;8949:7;8945:23;8941:32;8938:119;;;8976:79;;:::i;:::-;8938:119;9096:1;9121:63;9176:7;9167:6;9156:9;9152:22;9121:63;:::i;:::-;9111:73;;9067:127;8852:349;;;;:::o;9207:509::-;9276:6;9325:2;9313:9;9304:7;9300:23;9296:32;9293:119;;;9331:79;;:::i;:::-;9293:119;9479:1;9468:9;9464:17;9451:31;9509:18;9501:6;9498:30;9495:117;;;9531:79;;:::i;:::-;9495:117;9636:63;9691:7;9682:6;9671:9;9667:22;9636:63;:::i;:::-;9626:73;;9422:287;9207:509;;;;:::o;9722:329::-;9781:6;9830:2;9818:9;9809:7;9805:23;9801:32;9798:119;;;9836:79;;:::i;:::-;9798:119;9956:1;9981:53;10026:7;10017:6;10006:9;10002:22;9981:53;:::i;:::-;9971:63;;9927:117;9722:329;;;;:::o;10057:704::-;10152:6;10160;10168;10217:2;10205:9;10196:7;10192:23;10188:32;10185:119;;;10223:79;;:::i;:::-;10185:119;10343:1;10368:53;10413:7;10404:6;10393:9;10389:22;10368:53;:::i;:::-;10358:63;;10314:117;10498:2;10487:9;10483:18;10470:32;10529:18;10521:6;10518:30;10515:117;;;10551:79;;:::i;:::-;10515:117;10664:80;10736:7;10727:6;10716:9;10712:22;10664:80;:::i;:::-;10646:98;;;;10441:313;10057:704;;;;;:::o;10767:108::-;10844:24;10862:5;10844:24;:::i;:::-;10839:3;10832:37;10767:108;;:::o;10881:118::-;10968:24;10986:5;10968:24;:::i;:::-;10963:3;10956:37;10881:118;;:::o;11005:157::-;11110:45;11130:24;11148:5;11130:24;:::i;:::-;11110:45;:::i;:::-;11105:3;11098:58;11005:157;;:::o;11168:99::-;11239:21;11254:5;11239:21;:::i;:::-;11234:3;11227:34;11168:99;;:::o;11273:109::-;11354:21;11369:5;11354:21;:::i;:::-;11349:3;11342:34;11273:109;;:::o;11388:118::-;11475:24;11493:5;11475:24;:::i;:::-;11470:3;11463:37;11388:118;;:::o;11512:360::-;11598:3;11626:38;11658:5;11626:38;:::i;:::-;11680:70;11743:6;11738:3;11680:70;:::i;:::-;11673:77;;11759:52;11804:6;11799:3;11792:4;11785:5;11781:16;11759:52;:::i;:::-;11836:29;11858:6;11836:29;:::i;:::-;11831:3;11827:39;11820:46;;11602:270;11512:360;;;;:::o;11878:364::-;11966:3;11994:39;12027:5;11994:39;:::i;:::-;12049:71;12113:6;12108:3;12049:71;:::i;:::-;12042:78;;12129:52;12174:6;12169:3;12162:4;12155:5;12151:16;12129:52;:::i;:::-;12206:29;12228:6;12206:29;:::i;:::-;12201:3;12197:39;12190:46;;11970:272;11878:364;;;;:::o;12248:377::-;12354:3;12382:39;12415:5;12382:39;:::i;:::-;12437:89;12519:6;12514:3;12437:89;:::i;:::-;12430:96;;12535:52;12580:6;12575:3;12568:4;12561:5;12557:16;12535:52;:::i;:::-;12612:6;12607:3;12603:16;12596:23;;12358:267;12248:377;;;;:::o;12631:366::-;12773:3;12794:67;12858:2;12853:3;12794:67;:::i;:::-;12787:74;;12870:93;12959:3;12870:93;:::i;:::-;12988:2;12983:3;12979:12;12972:19;;12631:366;;;:::o;13003:::-;13145:3;13166:67;13230:2;13225:3;13166:67;:::i;:::-;13159:74;;13242:93;13331:3;13242:93;:::i;:::-;13360:2;13355:3;13351:12;13344:19;;13003:366;;;:::o;13375:::-;13517:3;13538:67;13602:2;13597:3;13538:67;:::i;:::-;13531:74;;13614:93;13703:3;13614:93;:::i;:::-;13732:2;13727:3;13723:12;13716:19;;13375:366;;;:::o;13747:::-;13889:3;13910:67;13974:2;13969:3;13910:67;:::i;:::-;13903:74;;13986:93;14075:3;13986:93;:::i;:::-;14104:2;14099:3;14095:12;14088:19;;13747:366;;;:::o;14119:::-;14261:3;14282:67;14346:2;14341:3;14282:67;:::i;:::-;14275:74;;14358:93;14447:3;14358:93;:::i;:::-;14476:2;14471:3;14467:12;14460:19;;14119:366;;;:::o;14491:::-;14633:3;14654:67;14718:2;14713:3;14654:67;:::i;:::-;14647:74;;14730:93;14819:3;14730:93;:::i;:::-;14848:2;14843:3;14839:12;14832:19;;14491:366;;;:::o;14863:::-;15005:3;15026:67;15090:2;15085:3;15026:67;:::i;:::-;15019:74;;15102:93;15191:3;15102:93;:::i;:::-;15220:2;15215:3;15211:12;15204:19;;14863:366;;;:::o;15235:400::-;15395:3;15416:84;15498:1;15493:3;15416:84;:::i;:::-;15409:91;;15509:93;15598:3;15509:93;:::i;:::-;15627:1;15622:3;15618:11;15611:18;;15235:400;;;:::o;15641:366::-;15783:3;15804:67;15868:2;15863:3;15804:67;:::i;:::-;15797:74;;15880:93;15969:3;15880:93;:::i;:::-;15998:2;15993:3;15989:12;15982:19;;15641:366;;;:::o;16013:::-;16155:3;16176:67;16240:2;16235:3;16176:67;:::i;:::-;16169:74;;16252:93;16341:3;16252:93;:::i;:::-;16370:2;16365:3;16361:12;16354:19;;16013:366;;;:::o;16385:::-;16527:3;16548:67;16612:2;16607:3;16548:67;:::i;:::-;16541:74;;16624:93;16713:3;16624:93;:::i;:::-;16742:2;16737:3;16733:12;16726:19;;16385:366;;;:::o;16757:398::-;16916:3;16937:83;17018:1;17013:3;16937:83;:::i;:::-;16930:90;;17029:93;17118:3;17029:93;:::i;:::-;17147:1;17142:3;17138:11;17131:18;;16757:398;;;:::o;17161:366::-;17303:3;17324:67;17388:2;17383:3;17324:67;:::i;:::-;17317:74;;17400:93;17489:3;17400:93;:::i;:::-;17518:2;17513:3;17509:12;17502:19;;17161:366;;;:::o;17533:::-;17675:3;17696:67;17760:2;17755:3;17696:67;:::i;:::-;17689:74;;17772:93;17861:3;17772:93;:::i;:::-;17890:2;17885:3;17881:12;17874:19;;17533:366;;;:::o;17905:::-;18047:3;18068:67;18132:2;18127:3;18068:67;:::i;:::-;18061:74;;18144:93;18233:3;18144:93;:::i;:::-;18262:2;18257:3;18253:12;18246:19;;17905:366;;;:::o;18277:::-;18419:3;18440:67;18504:2;18499:3;18440:67;:::i;:::-;18433:74;;18516:93;18605:3;18516:93;:::i;:::-;18634:2;18629:3;18625:12;18618:19;;18277:366;;;:::o;18649:::-;18791:3;18812:67;18876:2;18871:3;18812:67;:::i;:::-;18805:74;;18888:93;18977:3;18888:93;:::i;:::-;19006:2;19001:3;18997:12;18990:19;;18649:366;;;:::o;19021:400::-;19181:3;19202:84;19284:1;19279:3;19202:84;:::i;:::-;19195:91;;19295:93;19384:3;19295:93;:::i;:::-;19413:1;19408:3;19404:11;19397:18;;19021:400;;;:::o;19497:697::-;19656:4;19651:3;19647:14;19743:4;19736:5;19732:16;19726:23;19762:63;19819:4;19814:3;19810:14;19796:12;19762:63;:::i;:::-;19671:164;19927:4;19920:5;19916:16;19910:23;19946:61;20001:4;19996:3;19992:14;19978:12;19946:61;:::i;:::-;19845:172;20101:4;20094:5;20090:16;20084:23;20120:57;20171:4;20166:3;20162:14;20148:12;20120:57;:::i;:::-;20027:160;19625:569;19497:697;;:::o;20200:118::-;20287:24;20305:5;20287:24;:::i;:::-;20282:3;20275:37;20200:118;;:::o;20324:105::-;20399:23;20416:5;20399:23;:::i;:::-;20394:3;20387:36;20324:105;;:::o;20435:256::-;20547:3;20562:75;20633:3;20624:6;20562:75;:::i;:::-;20662:2;20657:3;20653:12;20646:19;;20682:3;20675:10;;20435:256;;;;:::o;20697:967::-;21079:3;21101:95;21192:3;21183:6;21101:95;:::i;:::-;21094:102;;21213:148;21357:3;21213:148;:::i;:::-;21206:155;;21378:95;21469:3;21460:6;21378:95;:::i;:::-;21371:102;;21490:148;21634:3;21490:148;:::i;:::-;21483:155;;21655:3;21648:10;;20697:967;;;;;:::o;21670:379::-;21854:3;21876:147;22019:3;21876:147;:::i;:::-;21869:154;;22040:3;22033:10;;21670:379;;;:::o;22055:222::-;22148:4;22186:2;22175:9;22171:18;22163:26;;22199:71;22267:1;22256:9;22252:17;22243:6;22199:71;:::i;:::-;22055:222;;;;:::o;22283:640::-;22478:4;22516:3;22505:9;22501:19;22493:27;;22530:71;22598:1;22587:9;22583:17;22574:6;22530:71;:::i;:::-;22611:72;22679:2;22668:9;22664:18;22655:6;22611:72;:::i;:::-;22693;22761:2;22750:9;22746:18;22737:6;22693:72;:::i;:::-;22812:9;22806:4;22802:20;22797:2;22786:9;22782:18;22775:48;22840:76;22911:4;22902:6;22840:76;:::i;:::-;22832:84;;22283:640;;;;;;;:::o;22929:210::-;23016:4;23054:2;23043:9;23039:18;23031:26;;23067:65;23129:1;23118:9;23114:17;23105:6;23067:65;:::i;:::-;22929:210;;;;:::o;23145:222::-;23238:4;23276:2;23265:9;23261:18;23253:26;;23289:71;23357:1;23346:9;23342:17;23333:6;23289:71;:::i;:::-;23145:222;;;;:::o;23373:313::-;23486:4;23524:2;23513:9;23509:18;23501:26;;23573:9;23567:4;23563:20;23559:1;23548:9;23544:17;23537:47;23601:78;23674:4;23665:6;23601:78;:::i;:::-;23593:86;;23373:313;;;;:::o;23692:419::-;23858:4;23896:2;23885:9;23881:18;23873:26;;23945:9;23939:4;23935:20;23931:1;23920:9;23916:17;23909:47;23973:131;24099:4;23973:131;:::i;:::-;23965:139;;23692:419;;;:::o;24117:::-;24283:4;24321:2;24310:9;24306:18;24298:26;;24370:9;24364:4;24360:20;24356:1;24345:9;24341:17;24334:47;24398:131;24524:4;24398:131;:::i;:::-;24390:139;;24117:419;;;:::o;24542:::-;24708:4;24746:2;24735:9;24731:18;24723:26;;24795:9;24789:4;24785:20;24781:1;24770:9;24766:17;24759:47;24823:131;24949:4;24823:131;:::i;:::-;24815:139;;24542:419;;;:::o;24967:::-;25133:4;25171:2;25160:9;25156:18;25148:26;;25220:9;25214:4;25210:20;25206:1;25195:9;25191:17;25184:47;25248:131;25374:4;25248:131;:::i;:::-;25240:139;;24967:419;;;:::o;25392:::-;25558:4;25596:2;25585:9;25581:18;25573:26;;25645:9;25639:4;25635:20;25631:1;25620:9;25616:17;25609:47;25673:131;25799:4;25673:131;:::i;:::-;25665:139;;25392:419;;;:::o;25817:::-;25983:4;26021:2;26010:9;26006:18;25998:26;;26070:9;26064:4;26060:20;26056:1;26045:9;26041:17;26034:47;26098:131;26224:4;26098:131;:::i;:::-;26090:139;;25817:419;;;:::o;26242:::-;26408:4;26446:2;26435:9;26431:18;26423:26;;26495:9;26489:4;26485:20;26481:1;26470:9;26466:17;26459:47;26523:131;26649:4;26523:131;:::i;:::-;26515:139;;26242:419;;;:::o;26667:::-;26833:4;26871:2;26860:9;26856:18;26848:26;;26920:9;26914:4;26910:20;26906:1;26895:9;26891:17;26884:47;26948:131;27074:4;26948:131;:::i;:::-;26940:139;;26667:419;;;:::o;27092:::-;27258:4;27296:2;27285:9;27281:18;27273:26;;27345:9;27339:4;27335:20;27331:1;27320:9;27316:17;27309:47;27373:131;27499:4;27373:131;:::i;:::-;27365:139;;27092:419;;;:::o;27517:::-;27683:4;27721:2;27710:9;27706:18;27698:26;;27770:9;27764:4;27760:20;27756:1;27745:9;27741:17;27734:47;27798:131;27924:4;27798:131;:::i;:::-;27790:139;;27517:419;;;:::o;27942:::-;28108:4;28146:2;28135:9;28131:18;28123:26;;28195:9;28189:4;28185:20;28181:1;28170:9;28166:17;28159:47;28223:131;28349:4;28223:131;:::i;:::-;28215:139;;27942:419;;;:::o;28367:::-;28533:4;28571:2;28560:9;28556:18;28548:26;;28620:9;28614:4;28610:20;28606:1;28595:9;28591:17;28584:47;28648:131;28774:4;28648:131;:::i;:::-;28640:139;;28367:419;;;:::o;28792:::-;28958:4;28996:2;28985:9;28981:18;28973:26;;29045:9;29039:4;29035:20;29031:1;29020:9;29016:17;29009:47;29073:131;29199:4;29073:131;:::i;:::-;29065:139;;28792:419;;;:::o;29217:::-;29383:4;29421:2;29410:9;29406:18;29398:26;;29470:9;29464:4;29460:20;29456:1;29445:9;29441:17;29434:47;29498:131;29624:4;29498:131;:::i;:::-;29490:139;;29217:419;;;:::o;29642:::-;29808:4;29846:2;29835:9;29831:18;29823:26;;29895:9;29889:4;29885:20;29881:1;29870:9;29866:17;29859:47;29923:131;30049:4;29923:131;:::i;:::-;29915:139;;29642:419;;;:::o;30067:346::-;30222:4;30260:2;30249:9;30245:18;30237:26;;30273:133;30403:1;30392:9;30388:17;30379:6;30273:133;:::i;:::-;30067:346;;;;:::o;30419:222::-;30512:4;30550:2;30539:9;30535:18;30527:26;;30563:71;30631:1;30620:9;30616:17;30607:6;30563:71;:::i;:::-;30419:222;;;;:::o;30647:129::-;30681:6;30708:20;;:::i;:::-;30698:30;;30737:33;30765:4;30757:6;30737:33;:::i;:::-;30647:129;;;:::o;30782:75::-;30815:6;30848:2;30842:9;30832:19;;30782:75;:::o;30863:311::-;30940:4;31030:18;31022:6;31019:30;31016:56;;;31052:18;;:::i;:::-;31016:56;31102:4;31094:6;31090:17;31082:25;;31162:4;31156;31152:15;31144:23;;30863:311;;;:::o;31180:307::-;31241:4;31331:18;31323:6;31320:30;31317:56;;;31353:18;;:::i;:::-;31317:56;31391:29;31413:6;31391:29;:::i;:::-;31383:37;;31475:4;31469;31465:15;31457:23;;31180:307;;;:::o;31493:308::-;31555:4;31645:18;31637:6;31634:30;31631:56;;;31667:18;;:::i;:::-;31631:56;31705:29;31727:6;31705:29;:::i;:::-;31697:37;;31789:4;31783;31779:15;31771:23;;31493:308;;;:::o;31807:98::-;31858:6;31892:5;31886:12;31876:22;;31807:98;;;:::o;31911:99::-;31963:6;31997:5;31991:12;31981:22;;31911:99;;;:::o;32016:168::-;32099:11;32133:6;32128:3;32121:19;32173:4;32168:3;32164:14;32149:29;;32016:168;;;;:::o;32190:147::-;32291:11;32328:3;32313:18;;32190:147;;;;:::o;32343:169::-;32427:11;32461:6;32456:3;32449:19;32501:4;32496:3;32492:14;32477:29;;32343:169;;;;:::o;32518:148::-;32620:11;32657:3;32642:18;;32518:148;;;;:::o;32672:305::-;32712:3;32731:20;32749:1;32731:20;:::i;:::-;32726:25;;32765:20;32783:1;32765:20;:::i;:::-;32760:25;;32919:1;32851:66;32847:74;32844:1;32841:81;32838:107;;;32925:18;;:::i;:::-;32838:107;32969:1;32966;32962:9;32955:16;;32672:305;;;;:::o;32983:185::-;33023:1;33040:20;33058:1;33040:20;:::i;:::-;33035:25;;33074:20;33092:1;33074:20;:::i;:::-;33069:25;;33113:1;33103:35;;33118:18;;:::i;:::-;33103:35;33160:1;33157;33153:9;33148:14;;32983:185;;;;:::o;33174:348::-;33214:7;33237:20;33255:1;33237:20;:::i;:::-;33232:25;;33271:20;33289:1;33271:20;:::i;:::-;33266:25;;33459:1;33391:66;33387:74;33384:1;33381:81;33376:1;33369:9;33362:17;33358:105;33355:131;;;33466:18;;:::i;:::-;33355:131;33514:1;33511;33507:9;33496:20;;33174:348;;;;:::o;33528:191::-;33568:4;33588:20;33606:1;33588:20;:::i;:::-;33583:25;;33622:20;33640:1;33622:20;:::i;:::-;33617:25;;33661:1;33658;33655:8;33652:34;;;33666:18;;:::i;:::-;33652:34;33711:1;33708;33704:9;33696:17;;33528:191;;;;:::o;33725:96::-;33762:7;33791:24;33809:5;33791:24;:::i;:::-;33780:35;;33725:96;;;:::o;33827:90::-;33861:7;33904:5;33897:13;33890:21;33879:32;;33827:90;;;:::o;33923:77::-;33960:7;33989:5;33978:16;;33923:77;;;:::o;34006:149::-;34042:7;34082:66;34075:5;34071:78;34060:89;;34006:149;;;:::o;34161:126::-;34198:7;34238:42;34231:5;34227:54;34216:65;;34161:126;;;:::o;34293:77::-;34330:7;34359:5;34348:16;;34293:77;;;:::o;34376:101::-;34412:7;34452:18;34445:5;34441:30;34430:41;;34376:101;;;:::o;34483:154::-;34567:6;34562:3;34557;34544:30;34629:1;34620:6;34615:3;34611:16;34604:27;34483:154;;;:::o;34643:307::-;34711:1;34721:113;34735:6;34732:1;34729:13;34721:113;;;34820:1;34815:3;34811:11;34805:18;34801:1;34796:3;34792:11;34785:39;34757:2;34754:1;34750:10;34745:15;;34721:113;;;34852:6;34849:1;34846:13;34843:101;;;34932:1;34923:6;34918:3;34914:16;34907:27;34843:101;34692:258;34643:307;;;:::o;34956:320::-;35000:6;35037:1;35031:4;35027:12;35017:22;;35084:1;35078:4;35074:12;35105:18;35095:81;;35161:4;35153:6;35149:17;35139:27;;35095:81;35223:2;35215:6;35212:14;35192:18;35189:38;35186:84;;;35242:18;;:::i;:::-;35186:84;35007:269;34956:320;;;:::o;35282:281::-;35365:27;35387:4;35365:27;:::i;:::-;35357:6;35353:40;35495:6;35483:10;35480:22;35459:18;35447:10;35444:34;35441:62;35438:88;;;35506:18;;:::i;:::-;35438:88;35546:10;35542:2;35535:22;35325:238;35282:281;;:::o;35569:233::-;35608:3;35631:24;35649:5;35631:24;:::i;:::-;35622:33;;35677:66;35670:5;35667:77;35664:103;;;35747:18;;:::i;:::-;35664:103;35794:1;35787:5;35783:13;35776:20;;35569:233;;;:::o;35808:100::-;35847:7;35876:26;35896:5;35876:26;:::i;:::-;35865:37;;35808:100;;;:::o;35914:94::-;35953:7;35982:20;35996:5;35982:20;:::i;:::-;35971:31;;35914:94;;;:::o;36014:176::-;36046:1;36063:20;36081:1;36063:20;:::i;:::-;36058:25;;36097:20;36115:1;36097:20;:::i;:::-;36092:25;;36136:1;36126:35;;36141:18;;:::i;:::-;36126:35;36182:1;36179;36175:9;36170:14;;36014:176;;;;:::o;36196:180::-;36244:77;36241:1;36234:88;36341:4;36338:1;36331:15;36365:4;36362:1;36355:15;36382:180;36430:77;36427:1;36420:88;36527:4;36524:1;36517:15;36551:4;36548:1;36541:15;36568:180;36616:77;36613:1;36606:88;36713:4;36710:1;36703:15;36737:4;36734:1;36727:15;36754:180;36802:77;36799:1;36792:88;36899:4;36896:1;36889:15;36923:4;36920:1;36913:15;36940:180;36988:77;36985:1;36978:88;37085:4;37082:1;37075:15;37109:4;37106:1;37099:15;37126:117;37235:1;37232;37225:12;37249:117;37358:1;37355;37348:12;37372:117;37481:1;37478;37471:12;37495:117;37604:1;37601;37594:12;37618:117;37727:1;37724;37717:12;37741:117;37850:1;37847;37840:12;37864:102;37905:6;37956:2;37952:7;37947:2;37940:5;37936:14;37932:28;37922:38;;37864:102;;;:::o;37972:94::-;38005:8;38053:5;38049:2;38045:14;38024:35;;37972:94;;;:::o;38072:225::-;38212:34;38208:1;38200:6;38196:14;38189:58;38281:8;38276:2;38268:6;38264:15;38257:33;38072:225;:::o;38303:170::-;38443:22;38439:1;38431:6;38427:14;38420:46;38303:170;:::o;38479:169::-;38619:21;38615:1;38607:6;38603:14;38596:45;38479:169;:::o;38654:168::-;38794:20;38790:1;38782:6;38778:14;38771:44;38654:168;:::o;38828:180::-;38968:32;38964:1;38956:6;38952:14;38945:56;38828:180;:::o;39014:168::-;39154:20;39150:1;39142:6;39138:14;39131:44;39014:168;:::o;39188:172::-;39328:24;39324:1;39316:6;39312:14;39305:48;39188:172;:::o;39366:155::-;39506:7;39502:1;39494:6;39490:14;39483:31;39366:155;:::o;39527:182::-;39667:34;39663:1;39655:6;39651:14;39644:58;39527:182;:::o;39715:225::-;39855:34;39851:1;39843:6;39839:14;39832:58;39924:8;39919:2;39911:6;39907:15;39900:33;39715:225;:::o;39946:234::-;40086:34;40082:1;40074:6;40070:14;40063:58;40155:17;40150:2;40142:6;40138:15;40131:42;39946:234;:::o;40186:114::-;;:::o;40306:166::-;40446:18;40442:1;40434:6;40430:14;40423:42;40306:166;:::o;40478:172::-;40618:24;40614:1;40606:6;40602:14;40595:48;40478:172;:::o;40656:::-;40796:24;40792:1;40784:6;40780:14;40773:48;40656:172;:::o;40834:178::-;40974:30;40970:1;40962:6;40958:14;40951:54;40834:178;:::o;41018:181::-;41158:33;41154:1;41146:6;41142:14;41135:57;41018:181;:::o;41205:151::-;41345:3;41341:1;41333:6;41329:14;41322:27;41205:151;:::o;41362:122::-;41435:24;41453:5;41435:24;:::i;:::-;41428:5;41425:35;41415:63;;41474:1;41471;41464:12;41415:63;41362:122;:::o;41490:116::-;41560:21;41575:5;41560:21;:::i;:::-;41553:5;41550:32;41540:60;;41596:1;41593;41586:12;41540:60;41490:116;:::o;41612:122::-;41685:24;41703:5;41685:24;:::i;:::-;41678:5;41675:35;41665:63;;41724:1;41721;41714:12;41665:63;41612:122;:::o;41740:120::-;41812:23;41829:5;41812:23;:::i;:::-;41805:5;41802:34;41792:62;;41850:1;41847;41840:12;41792:62;41740:120;:::o;41866:122::-;41939:24;41957:5;41939:24;:::i;:::-;41932:5;41929:35;41919:63;;41978:1;41975;41968:12;41919:63;41866:122;:::o

Swarm Source

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