ETH Price: $2,600.75 (-2.24%)
Gas: 1 Gwei

Token

Beaniez Official (BO)
 

Overview

Max Total Supply

777 BO

Holders

153

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
4 BO
0x0883BB23890EDD5854BB057D0E049E5a4601C7E2
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:
BeaniezOfficial

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-06-02
*/

// SPDX-License-Identifier: MIT

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 BeaniezOfficial is Ownable, ERC721A, ReentrancyGuard {
    using Strings for uint256;


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

  mapping(address => uint256) public publicClaimedBy;

  uint256 public  PRICE = 0.03 ether; 

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

  string private _baseTokenURI;
  uint public reserve = 0;


  uint public status = 0; //0-pause 1-whitelist 2-public

  constructor() ERC721A("Beaniez Official","BO") {

  }

  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_-reserve, "reached max supply");
    require(quantity <= MAX_PER_Transaction,"can not mint this many");
    require(msg.value >= PRICE * quantity, "Need to send more ETH.");


    _safeMint(msg.sender, quantity);
  }

   function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
    require(_exists(tokenId),"ERC721Metadata: URI query for nonexistent token");
    string memory baseURI = _baseURI();
    return
      bytes(baseURI).length > 0
        ? string(abi.encodePacked(baseURI, "/", tokenId.toString(), ".json")) : "";
  }

  function setBaseURI(string memory baseURI) external onlyOwner {
    _baseTokenURI = baseURI;
  }
  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 setStatus(uint256 s)external onlyOwner{
      status = s;
  }

   function getStatus()public view returns(uint){
      return status;
  }

 function setReserveTokens(uint256 _quantity) public onlyOwner {
        reserve=_quantity;
    }
    
  function getPrice(uint256 _quantity) public view returns (uint256) {
       
        return _quantity*PRICE;
    }

 function mintReserveTokens(uint quantity) public onlyOwner {
        require(quantity <= reserve, "The quantity exceeds the reserve.");
        reserve -= quantity;
        _safeMint(msg.sender, quantity);

    }

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


    //    WhiteList CODE STARTS    //

    uint256 public MAX_PER_WL_TRANSACTION = 3; // maximam amount that user can mint/Wallet
    bytes32 public whitelistMerkleRoot;
    uint256 public itemPriceWhiteList = 0.03 ether;
    mapping(address => uint256) public whiteListClaimedBy;
    uint256 private TotalWLavailable = 3333; // 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(msg.value >= _howMany * itemPriceWhiteList, "Try to send more ETH");
        require(_howMany <= MAX_PER_WL_TRANSACTION , "can not mint this many");

        _safeMint(msg.sender, _howMany);

    }

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

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

    function changeMAX_PER_WL_TRANSACTION(uint256 q) external onlyOwner
  {
      MAX_PER_WL_TRANSACTION = q;
  }
}

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_WL_TRANSACTION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","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_WL_TRANSACTION","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"changeMintPrice","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":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintReserveTokens","outputs":[],"stateMutability":"nonpayable","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":"reserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"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":"_quantity","type":"uint256"}],"name":"setReserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"s","type":"uint256"}],"name":"setStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_whiteListCollection","type":"uint256"}],"name":"setWLavailable","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":"whitelistMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526003600a55666a94d74f430000600c556000600e556000600f556003601055666a94d74f430000601255610d056014553480156200004157600080fd5b506040518060400160405280601081526020017f4265616e69657a204f6666696369616c000000000000000000000000000000008152506040518060400160405280600281526020017f424f000000000000000000000000000000000000000000000000000000000000815250620000ce620000c26200012660201b60201c565b6200012e60201b60201c565b8160039080519060200190620000e6929190620001fb565b508060049080519060200190620000ff929190620001fb565b5062000110620001f260201b60201c565b6001819055505050600160098190555062000310565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006001905090565b8280546200020990620002ab565b90600052602060002090601f0160209004810192826200022d576000855562000279565b82601f106200024857805160ff191683800117855562000279565b8280016001018555821562000279579182015b82811115620002785782518255916020019190600101906200025b565b5b5090506200028891906200028c565b5090565b5b80821115620002a75760008160009055506001016200028d565b5090565b60006002820490506001821680620002c457607f821691505b60208210811415620002db57620002da620002e1565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6149ba80620003206000396000f3fe60806040526004361061027d5760003560e01c80638ba4cc3c1161014f578063b88d4fde116100c1578063e5ec56a01161007a578063e5ec56a01461098a578063e7572230146109c7578063e7d61da814610a04578063e8006bb014610a2f578063e985e9c514610a58578063f2fde38b14610a955761027d565b8063b88d4fde1461086a578063bd32fb6614610893578063c49e8062146108bc578063c87b56dd146108e5578063cd3293de14610922578063dc33e6811461094d5761027d565b8063a0712d6811610113578063a0712d681461077d578063a22cb46514610799578063a40ece7a146107c2578063aa98e0c6146107eb578063ac44600214610816578063aebceff41461082d5761027d565b80638ba4cc3c146106965780638d859f3e146106bf5780638da5cb5b146106ea5780639231ab2a1461071557806395d89b41146107525761027d565b80633fd17366116101f357806369ba1a75116101ac57806369ba1a751461058a5780636a44e173146105b357806370a08231146105dc578063715018a61461061957806375236143146106305780638825b0141461066d5761027d565b80633fd173661461047c57806342842e0e146104a55780634e69d560146104ce57806351d7ff93146104f957806355f804b3146105245780636352211e1461054d5761027d565b806318160ddd1161024557806318160ddd1461036c5780631984b28614610397578063200d2ed2146103d457806323b872dd146103ff5780632632d5f814610428578063288bd8fd146104535761027d565b806301ffc9a71461028257806306fdde03146102bf578063081812fc146102ea578063095ea7b31461032757806310157fc314610350575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190613861565b610abe565b6040516102b69190613e3d565b60405180910390f35b3480156102cb57600080fd5b506102d4610ba0565b6040516102e19190613e73565b60405180910390f35b3480156102f657600080fd5b50610311600480360381019061030c9190613904565b610c32565b60405161031e9190613dd6565b60405180910390f35b34801561033357600080fd5b5061034e60048036038101906103499190613798565b610cae565b005b61036a60048036038101906103659190613931565b610db9565b005b34801561037857600080fd5b50610381610f83565b60405161038e9190614090565b60405180910390f35b3480156103a357600080fd5b506103be60048036038101906103b99190613615565b610f9a565b6040516103cb9190614090565b60405180910390f35b3480156103e057600080fd5b506103e9610fb2565b6040516103f69190614090565b60405180910390f35b34801561040b57600080fd5b5061042660048036038101906104219190613682565b610fb8565b005b34801561043457600080fd5b5061043d610fc8565b60405161044a9190614090565b60405180910390f35b34801561045f57600080fd5b5061047a60048036038101906104759190613904565b610fce565b005b34801561048857600080fd5b506104a3600480360381019061049e9190613904565b6110b5565b005b3480156104b157600080fd5b506104cc60048036038101906104c79190613682565b61113b565b005b3480156104da57600080fd5b506104e361115b565b6040516104f09190614090565b60405180910390f35b34801561050557600080fd5b5061050e611165565b60405161051b9190614090565b60405180910390f35b34801561053057600080fd5b5061054b600480360381019061054691906138bb565b61116b565b005b34801561055957600080fd5b50610574600480360381019061056f9190613904565b611201565b6040516105819190613dd6565b60405180910390f35b34801561059657600080fd5b506105b160048036038101906105ac9190613904565b611217565b005b3480156105bf57600080fd5b506105da60048036038101906105d59190613904565b61129d565b005b3480156105e857600080fd5b5061060360048036038101906105fe9190613615565b611323565b6040516106109190614090565b60405180910390f35b34801561062557600080fd5b5061062e6113f3565b005b34801561063c57600080fd5b5061065760048036038101906106529190613615565b61147b565b6040516106649190614090565b60405180910390f35b34801561067957600080fd5b50610694600480360381019061068f9190613904565b611493565b005b3480156106a257600080fd5b506106bd60048036038101906106b89190613798565b611519565b005b3480156106cb57600080fd5b506106d46115fa565b6040516106e19190614090565b60405180910390f35b3480156106f657600080fd5b506106ff611600565b60405161070c9190613dd6565b60405180910390f35b34801561072157600080fd5b5061073c60048036038101906107379190613904565b611629565b6040516107499190614075565b60405180910390f35b34801561075e57600080fd5b50610767611641565b6040516107749190613e73565b60405180910390f35b61079760048036038101906107929190613904565b6116d3565b005b3480156107a557600080fd5b506107c060048036038101906107bb9190613758565b61188c565b005b3480156107ce57600080fd5b506107e960048036038101906107e49190613904565b611a04565b005b3480156107f757600080fd5b50610800611a8a565b60405161080d9190613e58565b60405180910390f35b34801561082257600080fd5b5061082b611a90565b005b34801561083957600080fd5b50610854600480360381019061084f9190613904565b611c11565b6040516108619190614090565b60405180910390f35b34801561087657600080fd5b50610891600480360381019061088c91906136d5565b611c28565b005b34801561089f57600080fd5b506108ba60048036038101906108b59190613834565b611ca4565b005b3480156108c857600080fd5b506108e360048036038101906108de9190613904565b611d2a565b005b3480156108f157600080fd5b5061090c60048036038101906109079190613904565b611db0565b6040516109199190613e73565b60405180910390f35b34801561092e57600080fd5b50610937611e57565b6040516109449190614090565b60405180910390f35b34801561095957600080fd5b50610974600480360381019061096f9190613615565b611e5d565b6040516109819190614090565b60405180910390f35b34801561099657600080fd5b506109b160048036038101906109ac91906137d8565b611e6f565b6040516109be9190613e3d565b60405180910390f35b3480156109d357600080fd5b506109ee60048036038101906109e99190613904565b611eac565b6040516109fb9190614090565b60405180910390f35b348015610a1057600080fd5b50610a19611ec3565b604051610a269190614090565b60405180910390f35b348015610a3b57600080fd5b50610a566004803603810190610a519190613904565b611ec9565b005b348015610a6457600080fd5b50610a7f6004803603810190610a7a9190613642565b611f4f565b604051610a8c9190613e3d565b60405180910390f35b348015610aa157600080fd5b50610abc6004803603810190610ab79190613615565b611fe3565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b8957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b995750610b98826120db565b5b9050919050565b606060038054610baf90614395565b80601f0160208091040260200160405190810160405280929190818152602001828054610bdb90614395565b8015610c285780601f10610bfd57610100808354040283529160200191610c28565b820191906000526020600020905b815481529060010190602001808311610c0b57829003601f168201915b5050505050905090565b6000610c3d82612145565b610c73576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cb982611201565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d21576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d40612193565b73ffffffffffffffffffffffffffffffffffffffff1614158015610d725750610d7081610d6b612193565b611f4f565b155b15610da9576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610db483838361219b565b505050565b6001600f5414610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df590613ed5565b60405180910390fd5b60145483610e0a610f83565b610e1491906141ac565b1115610e55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4c90613fb5565b60405180910390fd5b610ea0828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505033611e6f565b610edf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed690613f75565b60405180910390fd5b60125483610eed9190614233565b341015610f2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2690613eb5565b60405180910390fd5b601054831115610f74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6b90614035565b60405180910390fd5b610f7e338461224d565b505050565b6000610f8d61226b565b6002546001540303905090565b60136020528060005260406000206000915090505481565b600f5481565b610fc3838383612274565b505050565b60125481565b610fd6612193565b73ffffffffffffffffffffffffffffffffffffffff16610ff4611600565b73ffffffffffffffffffffffffffffffffffffffff161461104a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104190613f95565b60405180910390fd5b600e5481111561108f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108690613ef5565b60405180910390fd5b80600e60008282546110a1919061428d565b925050819055506110b2338261224d565b50565b6110bd612193565b73ffffffffffffffffffffffffffffffffffffffff166110db611600565b73ffffffffffffffffffffffffffffffffffffffff1614611131576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112890613f95565b60405180910390fd5b80600c8190555050565b61115683838360405180602001604052806000815250611c28565b505050565b6000600f54905090565b600a5481565b611173612193565b73ffffffffffffffffffffffffffffffffffffffff16611191611600565b73ffffffffffffffffffffffffffffffffffffffff16146111e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111de90613f95565b60405180910390fd5b80600d90805190602001906111fd9291906132dd565b5050565b600061120c8261272a565b600001519050919050565b61121f612193565b73ffffffffffffffffffffffffffffffffffffffff1661123d611600565b73ffffffffffffffffffffffffffffffffffffffff1614611293576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128a90613f95565b60405180910390fd5b80600f8190555050565b6112a5612193565b73ffffffffffffffffffffffffffffffffffffffff166112c3611600565b73ffffffffffffffffffffffffffffffffffffffff1614611319576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131090613f95565b60405180910390fd5b80600e8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561138b576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6113fb612193565b73ffffffffffffffffffffffffffffffffffffffff16611419611600565b73ffffffffffffffffffffffffffffffffffffffff161461146f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146690613f95565b60405180910390fd5b61147960006129b9565b565b600b6020528060005260406000206000915090505481565b61149b612193565b73ffffffffffffffffffffffffffffffffffffffff166114b9611600565b73ffffffffffffffffffffffffffffffffffffffff161461150f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150690613f95565b60405180910390fd5b8060128190555050565b611521612193565b73ffffffffffffffffffffffffffffffffffffffff1661153f611600565b73ffffffffffffffffffffffffffffffffffffffff1614611595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158c90613f95565b60405180910390fd5b610d05816115a1610f83565b6115ab91906141ac565b11156115ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e390613f55565b60405180910390fd5b6115f6828261224d565b5050565b600c5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611631613363565b61163a8261272a565b9050919050565b60606004805461165090614395565b80601f016020809104026020016040519081016040528092919081815260200182805461167c90614395565b80156116c95780601f1061169e576101008083540402835291602001916116c9565b820191906000526020600020905b8154815290600101906020018083116116ac57829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173890613f35565b60405180910390fd5b6002600f5414611786576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177d90613f15565b60405180910390fd5b600e54610d05611796919061428d565b8161179f610f83565b6117a991906141ac565b11156117ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e190613f55565b60405180910390fd5b600a5481111561182f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182690614035565b60405180910390fd5b80600c5461183d9190614233565b34101561187f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187690614015565b60405180910390fd5b611889338261224d565b50565b611894612193565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118f9576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611906612193565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166119b3612193565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119f89190613e3d565b60405180910390a35050565b611a0c612193565b73ffffffffffffffffffffffffffffffffffffffff16611a2a611600565b73ffffffffffffffffffffffffffffffffffffffff1614611a80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7790613f95565b60405180910390fd5b80600a8190555050565b60115481565b611a98612193565b73ffffffffffffffffffffffffffffffffffffffff16611ab6611600565b73ffffffffffffffffffffffffffffffffffffffff1614611b0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0390613f95565b60405180910390fd5b60026009541415611b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4990614055565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051611b8090613dc1565b60006040518083038185875af1925050503d8060008114611bbd576040519150601f19603f3d011682016040523d82523d6000602084013e611bc2565b606091505b5050905080611c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfd90613ff5565b60405180910390fd5b506001600981905550565b600060125482611c219190614233565b9050919050565b611c33848484612274565b611c528373ffffffffffffffffffffffffffffffffffffffff16612a7d565b8015611c675750611c6584848484612a90565b155b15611c9e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b611cac612193565b73ffffffffffffffffffffffffffffffffffffffff16611cca611600565b73ffffffffffffffffffffffffffffffffffffffff1614611d20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1790613f95565b60405180910390fd5b8060118190555050565b611d32612193565b73ffffffffffffffffffffffffffffffffffffffff16611d50611600565b73ffffffffffffffffffffffffffffffffffffffff1614611da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9d90613f95565b60405180910390fd5b8060108190555050565b6060611dbb82612145565b611dfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df190613fd5565b60405180910390fd5b6000611e04612bf0565b90506000815111611e245760405180602001604052806000815250611e4f565b80611e2e84612c82565b604051602001611e3f929190613d87565b6040516020818303038152906040525b915050919050565b600e5481565b6000611e6882612de3565b9050919050565b6000611ea48360115484604051602001611e899190613d6c565b60405160208183030381529060405280519060200120612e4d565b905092915050565b6000600c5482611ebc9190614233565b9050919050565b60105481565b611ed1612193565b73ffffffffffffffffffffffffffffffffffffffff16611eef611600565b73ffffffffffffffffffffffffffffffffffffffff1614611f45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3c90613f95565b60405180910390fd5b8060148190555050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611feb612193565b73ffffffffffffffffffffffffffffffffffffffff16612009611600565b73ffffffffffffffffffffffffffffffffffffffff161461205f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205690613f95565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c690613e95565b60405180910390fd5b6120d8816129b9565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161215061226b565b1115801561215f575060015482105b801561218c575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b612267828260405180602001604052806000815250612e64565b5050565b60006001905090565b600061227f8261272a565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146122ea576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661230b612193565b73ffffffffffffffffffffffffffffffffffffffff16148061233a575061233985612334612193565b611f4f565b5b8061237f5750612348612193565b73ffffffffffffffffffffffffffffffffffffffff1661236784610c32565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806123b8576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561241f576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61242c8585856001612e76565b6124386000848761219b565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156126b85760015482146126b757878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127238585856001612e7c565b5050505050565b612732613363565b60008290508061274061226b565b1115801561274f575060015481105b15612982576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161298057600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146128645780925050506129b4565b5b60011561297f57818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461297a5780925050506129b4565b612865565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ab6612193565b8786866040518563ffffffff1660e01b8152600401612ad89493929190613df1565b602060405180830381600087803b158015612af257600080fd5b505af1925050508015612b2357506040513d601f19601f82011682018060405250810190612b20919061388e565b60015b612b9d573d8060008114612b53576040519150601f19603f3d011682016040523d82523d6000602084013e612b58565b606091505b50600081511415612b95576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600d8054612bff90614395565b80601f0160208091040260200160405190810160405280929190818152602001828054612c2b90614395565b8015612c785780601f10612c4d57610100808354040283529160200191612c78565b820191906000526020600020905b815481529060010190602001808311612c5b57829003601f168201915b5050505050905090565b60606000821415612cca576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612dde565b600082905060005b60008214612cfc578080612ce5906143f8565b915050600a82612cf59190614202565b9150612cd2565b60008167ffffffffffffffff811115612d1857612d17614552565b5b6040519080825280601f01601f191660200182016040528015612d4a5781602001600182028036833780820191505090505b5090505b60008514612dd757600182612d63919061428d565b9150600a85612d729190614465565b6030612d7e91906141ac565b60f81b818381518110612d9457612d93614523565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612dd09190614202565b9450612d4e565b8093505050505b919050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b600082612e5a8584612e82565b1490509392505050565b612e718383836001612ef7565b505050565b50505050565b50505050565b60008082905060005b8451811015612eec576000858281518110612ea957612ea8614523565b5b60200260200101519050808311612ecb57612ec483826132c6565b9250612ed8565b612ed581846132c6565b92505b508080612ee4906143f8565b915050612e8b565b508091505092915050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612f65576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612fa0576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612fad6000868387612e76565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561317757506131768773ffffffffffffffffffffffffffffffffffffffff16612a7d565b5b1561323d575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131ec6000888480600101955088612a90565b613222576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561317d57826001541461323857600080fd5b6132a9565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082141561323e575b8160018190555050506132bf6000868387612e7c565b5050505050565b600082600052816020526040600020905092915050565b8280546132e990614395565b90600052602060002090601f01602090048101928261330b5760008555613352565b82601f1061332457805160ff1916838001178555613352565b82800160010185558215613352579182015b82811115613351578251825591602001919060010190613336565b5b50905061335f91906133a6565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156133bf5760008160009055506001016133a7565b5090565b60006133d66133d1846140d0565b6140ab565b905080838252602082019050828560208602820111156133f9576133f861458b565b5b60005b85811015613429578161340f8882613565565b8452602084019350602083019250506001810190506133fc565b5050509392505050565b6000613446613441846140fc565b6140ab565b90508281526020810184848401111561346257613461614590565b5b61346d848285614353565b509392505050565b60006134886134838461412d565b6140ab565b9050828152602081018484840111156134a4576134a3614590565b5b6134af848285614353565b509392505050565b6000813590506134c681614911565b92915050565b60008083601f8401126134e2576134e1614586565b5b8235905067ffffffffffffffff8111156134ff576134fe614581565b5b60208301915083602082028301111561351b5761351a61458b565b5b9250929050565b600082601f83011261353757613536614586565b5b81356135478482602086016133c3565b91505092915050565b60008135905061355f81614928565b92915050565b6000813590506135748161493f565b92915050565b60008135905061358981614956565b92915050565b60008151905061359e81614956565b92915050565b600082601f8301126135b9576135b8614586565b5b81356135c9848260208601613433565b91505092915050565b600082601f8301126135e7576135e6614586565b5b81356135f7848260208601613475565b91505092915050565b60008135905061360f8161496d565b92915050565b60006020828403121561362b5761362a61459a565b5b6000613639848285016134b7565b91505092915050565b600080604083850312156136595761365861459a565b5b6000613667858286016134b7565b9250506020613678858286016134b7565b9150509250929050565b60008060006060848603121561369b5761369a61459a565b5b60006136a9868287016134b7565b93505060206136ba868287016134b7565b92505060406136cb86828701613600565b9150509250925092565b600080600080608085870312156136ef576136ee61459a565b5b60006136fd878288016134b7565b945050602061370e878288016134b7565b935050604061371f87828801613600565b925050606085013567ffffffffffffffff8111156137405761373f614595565b5b61374c878288016135a4565b91505092959194509250565b6000806040838503121561376f5761376e61459a565b5b600061377d858286016134b7565b925050602061378e85828601613550565b9150509250929050565b600080604083850312156137af576137ae61459a565b5b60006137bd858286016134b7565b92505060206137ce85828601613600565b9150509250929050565b600080604083850312156137ef576137ee61459a565b5b600083013567ffffffffffffffff81111561380d5761380c614595565b5b61381985828601613522565b925050602061382a858286016134b7565b9150509250929050565b60006020828403121561384a5761384961459a565b5b600061385884828501613565565b91505092915050565b6000602082840312156138775761387661459a565b5b60006138858482850161357a565b91505092915050565b6000602082840312156138a4576138a361459a565b5b60006138b28482850161358f565b91505092915050565b6000602082840312156138d1576138d061459a565b5b600082013567ffffffffffffffff8111156138ef576138ee614595565b5b6138fb848285016135d2565b91505092915050565b60006020828403121561391a5761391961459a565b5b600061392884828501613600565b91505092915050565b60008060006040848603121561394a5761394961459a565b5b600061395886828701613600565b935050602084013567ffffffffffffffff81111561397957613978614595565b5b613985868287016134cc565b92509250509250925092565b61399a816142c1565b82525050565b6139a9816142c1565b82525050565b6139c06139bb826142c1565b614441565b82525050565b6139cf816142d3565b82525050565b6139de816142d3565b82525050565b6139ed816142df565b82525050565b60006139fe8261415e565b613a088185614174565b9350613a18818560208601614362565b613a218161459f565b840191505092915050565b6000613a3782614169565b613a418185614190565b9350613a51818560208601614362565b613a5a8161459f565b840191505092915050565b6000613a7082614169565b613a7a81856141a1565b9350613a8a818560208601614362565b80840191505092915050565b6000613aa3602683614190565b9150613aae826145bd565b604082019050919050565b6000613ac6601483614190565b9150613ad18261460c565b602082019050919050565b6000613ae9601383614190565b9150613af482614635565b602082019050919050565b6000613b0c602183614190565b9150613b178261465e565b604082019050919050565b6000613b2f601283614190565b9150613b3a826146ad565b602082019050919050565b6000613b52601e83614190565b9150613b5d826146d6565b602082019050919050565b6000613b75601283614190565b9150613b80826146ff565b602082019050919050565b6000613b98601683614190565b9150613ba382614728565b602082019050919050565b6000613bbb6005836141a1565b9150613bc682614751565b600582019050919050565b6000613bde602083614190565b9150613be98261477a565b602082019050919050565b6000613c01602683614190565b9150613c0c826147a3565b604082019050919050565b6000613c24602f83614190565b9150613c2f826147f2565b604082019050919050565b6000613c47600083614185565b9150613c5282614841565b600082019050919050565b6000613c6a601083614190565b9150613c7582614844565b602082019050919050565b6000613c8d601683614190565b9150613c988261486d565b602082019050919050565b6000613cb0601683614190565b9150613cbb82614896565b602082019050919050565b6000613cd3601f83614190565b9150613cde826148bf565b602082019050919050565b6000613cf66001836141a1565b9150613d01826148e8565b600182019050919050565b606082016000820151613d226000850182613991565b506020820151613d356020850182613d5d565b506040820151613d4860408501826139c6565b50505050565b613d5781614335565b82525050565b613d668161433f565b82525050565b6000613d7882846139af565b60148201915081905092915050565b6000613d938285613a65565b9150613d9e82613ce9565b9150613daa8284613a65565b9150613db582613bae565b91508190509392505050565b6000613dcc82613c3a565b9150819050919050565b6000602082019050613deb60008301846139a0565b92915050565b6000608082019050613e0660008301876139a0565b613e1360208301866139a0565b613e206040830185613d4e565b8181036060830152613e3281846139f3565b905095945050505050565b6000602082019050613e5260008301846139d5565b92915050565b6000602082019050613e6d60008301846139e4565b92915050565b60006020820190508181036000830152613e8d8184613a2c565b905092915050565b60006020820190508181036000830152613eae81613a96565b9050919050565b60006020820190508181036000830152613ece81613ab9565b9050919050565b60006020820190508181036000830152613eee81613adc565b9050919050565b60006020820190508181036000830152613f0e81613aff565b9050919050565b60006020820190508181036000830152613f2e81613b22565b9050919050565b60006020820190508181036000830152613f4e81613b45565b9050919050565b60006020820190508181036000830152613f6e81613b68565b9050919050565b60006020820190508181036000830152613f8e81613b8b565b9050919050565b60006020820190508181036000830152613fae81613bd1565b9050919050565b60006020820190508181036000830152613fce81613bf4565b9050919050565b60006020820190508181036000830152613fee81613c17565b9050919050565b6000602082019050818103600083015261400e81613c5d565b9050919050565b6000602082019050818103600083015261402e81613c80565b9050919050565b6000602082019050818103600083015261404e81613ca3565b9050919050565b6000602082019050818103600083015261406e81613cc6565b9050919050565b600060608201905061408a6000830184613d0c565b92915050565b60006020820190506140a56000830184613d4e565b92915050565b60006140b56140c6565b90506140c182826143c7565b919050565b6000604051905090565b600067ffffffffffffffff8211156140eb576140ea614552565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561411757614116614552565b5b6141208261459f565b9050602081019050919050565b600067ffffffffffffffff82111561414857614147614552565b5b6141518261459f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006141b782614335565b91506141c283614335565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156141f7576141f6614496565b5b828201905092915050565b600061420d82614335565b915061421883614335565b925082614228576142276144c5565b5b828204905092915050565b600061423e82614335565b915061424983614335565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561428257614281614496565b5b828202905092915050565b600061429882614335565b91506142a383614335565b9250828210156142b6576142b5614496565b5b828203905092915050565b60006142cc82614315565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015614380578082015181840152602081019050614365565b8381111561438f576000848401525b50505050565b600060028204905060018216806143ad57607f821691505b602082108114156143c1576143c06144f4565b5b50919050565b6143d08261459f565b810181811067ffffffffffffffff821117156143ef576143ee614552565b5b80604052505050565b600061440382614335565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561443657614435614496565b5b600182019050919050565b600061444c82614453565b9050919050565b600061445e826145b0565b9050919050565b600061447082614335565b915061447b83614335565b92508261448b5761448a6144c5565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f54727920746f2073656e64206d6f726520455448000000000000000000000000600082015250565b7f53616c65206973206e6f74206163746976652000000000000000000000000000600082015250565b7f546865207175616e74697479206578636565647320746865207265736572766560008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c65206973206e6f74204163746976650000000000000000000000000000600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f596f7520617265206e6f7420696e2070726573616c6500000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5175616e74697479206d757374206265206c6573736572207468656e204d617860008201527f537570706c790000000000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b7f63616e206e6f74206d696e742074686973206d616e7900000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b61491a816142c1565b811461492557600080fd5b50565b614931816142d3565b811461493c57600080fd5b50565b614948816142df565b811461495357600080fd5b50565b61495f816142e9565b811461496a57600080fd5b50565b61497681614335565b811461498157600080fd5b5056fea2646970667358221220e2117ae0ca18330e21753ebeb8233ba4a4f26e0c44a8e3447076ca0fe521445064736f6c63430008070033

Deployed Bytecode

0x60806040526004361061027d5760003560e01c80638ba4cc3c1161014f578063b88d4fde116100c1578063e5ec56a01161007a578063e5ec56a01461098a578063e7572230146109c7578063e7d61da814610a04578063e8006bb014610a2f578063e985e9c514610a58578063f2fde38b14610a955761027d565b8063b88d4fde1461086a578063bd32fb6614610893578063c49e8062146108bc578063c87b56dd146108e5578063cd3293de14610922578063dc33e6811461094d5761027d565b8063a0712d6811610113578063a0712d681461077d578063a22cb46514610799578063a40ece7a146107c2578063aa98e0c6146107eb578063ac44600214610816578063aebceff41461082d5761027d565b80638ba4cc3c146106965780638d859f3e146106bf5780638da5cb5b146106ea5780639231ab2a1461071557806395d89b41146107525761027d565b80633fd17366116101f357806369ba1a75116101ac57806369ba1a751461058a5780636a44e173146105b357806370a08231146105dc578063715018a61461061957806375236143146106305780638825b0141461066d5761027d565b80633fd173661461047c57806342842e0e146104a55780634e69d560146104ce57806351d7ff93146104f957806355f804b3146105245780636352211e1461054d5761027d565b806318160ddd1161024557806318160ddd1461036c5780631984b28614610397578063200d2ed2146103d457806323b872dd146103ff5780632632d5f814610428578063288bd8fd146104535761027d565b806301ffc9a71461028257806306fdde03146102bf578063081812fc146102ea578063095ea7b31461032757806310157fc314610350575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190613861565b610abe565b6040516102b69190613e3d565b60405180910390f35b3480156102cb57600080fd5b506102d4610ba0565b6040516102e19190613e73565b60405180910390f35b3480156102f657600080fd5b50610311600480360381019061030c9190613904565b610c32565b60405161031e9190613dd6565b60405180910390f35b34801561033357600080fd5b5061034e60048036038101906103499190613798565b610cae565b005b61036a60048036038101906103659190613931565b610db9565b005b34801561037857600080fd5b50610381610f83565b60405161038e9190614090565b60405180910390f35b3480156103a357600080fd5b506103be60048036038101906103b99190613615565b610f9a565b6040516103cb9190614090565b60405180910390f35b3480156103e057600080fd5b506103e9610fb2565b6040516103f69190614090565b60405180910390f35b34801561040b57600080fd5b5061042660048036038101906104219190613682565b610fb8565b005b34801561043457600080fd5b5061043d610fc8565b60405161044a9190614090565b60405180910390f35b34801561045f57600080fd5b5061047a60048036038101906104759190613904565b610fce565b005b34801561048857600080fd5b506104a3600480360381019061049e9190613904565b6110b5565b005b3480156104b157600080fd5b506104cc60048036038101906104c79190613682565b61113b565b005b3480156104da57600080fd5b506104e361115b565b6040516104f09190614090565b60405180910390f35b34801561050557600080fd5b5061050e611165565b60405161051b9190614090565b60405180910390f35b34801561053057600080fd5b5061054b600480360381019061054691906138bb565b61116b565b005b34801561055957600080fd5b50610574600480360381019061056f9190613904565b611201565b6040516105819190613dd6565b60405180910390f35b34801561059657600080fd5b506105b160048036038101906105ac9190613904565b611217565b005b3480156105bf57600080fd5b506105da60048036038101906105d59190613904565b61129d565b005b3480156105e857600080fd5b5061060360048036038101906105fe9190613615565b611323565b6040516106109190614090565b60405180910390f35b34801561062557600080fd5b5061062e6113f3565b005b34801561063c57600080fd5b5061065760048036038101906106529190613615565b61147b565b6040516106649190614090565b60405180910390f35b34801561067957600080fd5b50610694600480360381019061068f9190613904565b611493565b005b3480156106a257600080fd5b506106bd60048036038101906106b89190613798565b611519565b005b3480156106cb57600080fd5b506106d46115fa565b6040516106e19190614090565b60405180910390f35b3480156106f657600080fd5b506106ff611600565b60405161070c9190613dd6565b60405180910390f35b34801561072157600080fd5b5061073c60048036038101906107379190613904565b611629565b6040516107499190614075565b60405180910390f35b34801561075e57600080fd5b50610767611641565b6040516107749190613e73565b60405180910390f35b61079760048036038101906107929190613904565b6116d3565b005b3480156107a557600080fd5b506107c060048036038101906107bb9190613758565b61188c565b005b3480156107ce57600080fd5b506107e960048036038101906107e49190613904565b611a04565b005b3480156107f757600080fd5b50610800611a8a565b60405161080d9190613e58565b60405180910390f35b34801561082257600080fd5b5061082b611a90565b005b34801561083957600080fd5b50610854600480360381019061084f9190613904565b611c11565b6040516108619190614090565b60405180910390f35b34801561087657600080fd5b50610891600480360381019061088c91906136d5565b611c28565b005b34801561089f57600080fd5b506108ba60048036038101906108b59190613834565b611ca4565b005b3480156108c857600080fd5b506108e360048036038101906108de9190613904565b611d2a565b005b3480156108f157600080fd5b5061090c60048036038101906109079190613904565b611db0565b6040516109199190613e73565b60405180910390f35b34801561092e57600080fd5b50610937611e57565b6040516109449190614090565b60405180910390f35b34801561095957600080fd5b50610974600480360381019061096f9190613615565b611e5d565b6040516109819190614090565b60405180910390f35b34801561099657600080fd5b506109b160048036038101906109ac91906137d8565b611e6f565b6040516109be9190613e3d565b60405180910390f35b3480156109d357600080fd5b506109ee60048036038101906109e99190613904565b611eac565b6040516109fb9190614090565b60405180910390f35b348015610a1057600080fd5b50610a19611ec3565b604051610a269190614090565b60405180910390f35b348015610a3b57600080fd5b50610a566004803603810190610a519190613904565b611ec9565b005b348015610a6457600080fd5b50610a7f6004803603810190610a7a9190613642565b611f4f565b604051610a8c9190613e3d565b60405180910390f35b348015610aa157600080fd5b50610abc6004803603810190610ab79190613615565b611fe3565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b8957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b995750610b98826120db565b5b9050919050565b606060038054610baf90614395565b80601f0160208091040260200160405190810160405280929190818152602001828054610bdb90614395565b8015610c285780601f10610bfd57610100808354040283529160200191610c28565b820191906000526020600020905b815481529060010190602001808311610c0b57829003601f168201915b5050505050905090565b6000610c3d82612145565b610c73576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cb982611201565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d21576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d40612193565b73ffffffffffffffffffffffffffffffffffffffff1614158015610d725750610d7081610d6b612193565b611f4f565b155b15610da9576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610db483838361219b565b505050565b6001600f5414610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df590613ed5565b60405180910390fd5b60145483610e0a610f83565b610e1491906141ac565b1115610e55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4c90613fb5565b60405180910390fd5b610ea0828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505033611e6f565b610edf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed690613f75565b60405180910390fd5b60125483610eed9190614233565b341015610f2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2690613eb5565b60405180910390fd5b601054831115610f74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6b90614035565b60405180910390fd5b610f7e338461224d565b505050565b6000610f8d61226b565b6002546001540303905090565b60136020528060005260406000206000915090505481565b600f5481565b610fc3838383612274565b505050565b60125481565b610fd6612193565b73ffffffffffffffffffffffffffffffffffffffff16610ff4611600565b73ffffffffffffffffffffffffffffffffffffffff161461104a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104190613f95565b60405180910390fd5b600e5481111561108f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108690613ef5565b60405180910390fd5b80600e60008282546110a1919061428d565b925050819055506110b2338261224d565b50565b6110bd612193565b73ffffffffffffffffffffffffffffffffffffffff166110db611600565b73ffffffffffffffffffffffffffffffffffffffff1614611131576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112890613f95565b60405180910390fd5b80600c8190555050565b61115683838360405180602001604052806000815250611c28565b505050565b6000600f54905090565b600a5481565b611173612193565b73ffffffffffffffffffffffffffffffffffffffff16611191611600565b73ffffffffffffffffffffffffffffffffffffffff16146111e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111de90613f95565b60405180910390fd5b80600d90805190602001906111fd9291906132dd565b5050565b600061120c8261272a565b600001519050919050565b61121f612193565b73ffffffffffffffffffffffffffffffffffffffff1661123d611600565b73ffffffffffffffffffffffffffffffffffffffff1614611293576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128a90613f95565b60405180910390fd5b80600f8190555050565b6112a5612193565b73ffffffffffffffffffffffffffffffffffffffff166112c3611600565b73ffffffffffffffffffffffffffffffffffffffff1614611319576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131090613f95565b60405180910390fd5b80600e8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561138b576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6113fb612193565b73ffffffffffffffffffffffffffffffffffffffff16611419611600565b73ffffffffffffffffffffffffffffffffffffffff161461146f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146690613f95565b60405180910390fd5b61147960006129b9565b565b600b6020528060005260406000206000915090505481565b61149b612193565b73ffffffffffffffffffffffffffffffffffffffff166114b9611600565b73ffffffffffffffffffffffffffffffffffffffff161461150f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150690613f95565b60405180910390fd5b8060128190555050565b611521612193565b73ffffffffffffffffffffffffffffffffffffffff1661153f611600565b73ffffffffffffffffffffffffffffffffffffffff1614611595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158c90613f95565b60405180910390fd5b610d05816115a1610f83565b6115ab91906141ac565b11156115ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e390613f55565b60405180910390fd5b6115f6828261224d565b5050565b600c5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611631613363565b61163a8261272a565b9050919050565b60606004805461165090614395565b80601f016020809104026020016040519081016040528092919081815260200182805461167c90614395565b80156116c95780601f1061169e576101008083540402835291602001916116c9565b820191906000526020600020905b8154815290600101906020018083116116ac57829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173890613f35565b60405180910390fd5b6002600f5414611786576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177d90613f15565b60405180910390fd5b600e54610d05611796919061428d565b8161179f610f83565b6117a991906141ac565b11156117ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e190613f55565b60405180910390fd5b600a5481111561182f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182690614035565b60405180910390fd5b80600c5461183d9190614233565b34101561187f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187690614015565b60405180910390fd5b611889338261224d565b50565b611894612193565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118f9576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611906612193565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166119b3612193565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119f89190613e3d565b60405180910390a35050565b611a0c612193565b73ffffffffffffffffffffffffffffffffffffffff16611a2a611600565b73ffffffffffffffffffffffffffffffffffffffff1614611a80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7790613f95565b60405180910390fd5b80600a8190555050565b60115481565b611a98612193565b73ffffffffffffffffffffffffffffffffffffffff16611ab6611600565b73ffffffffffffffffffffffffffffffffffffffff1614611b0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0390613f95565b60405180910390fd5b60026009541415611b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4990614055565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051611b8090613dc1565b60006040518083038185875af1925050503d8060008114611bbd576040519150601f19603f3d011682016040523d82523d6000602084013e611bc2565b606091505b5050905080611c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfd90613ff5565b60405180910390fd5b506001600981905550565b600060125482611c219190614233565b9050919050565b611c33848484612274565b611c528373ffffffffffffffffffffffffffffffffffffffff16612a7d565b8015611c675750611c6584848484612a90565b155b15611c9e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b611cac612193565b73ffffffffffffffffffffffffffffffffffffffff16611cca611600565b73ffffffffffffffffffffffffffffffffffffffff1614611d20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1790613f95565b60405180910390fd5b8060118190555050565b611d32612193565b73ffffffffffffffffffffffffffffffffffffffff16611d50611600565b73ffffffffffffffffffffffffffffffffffffffff1614611da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9d90613f95565b60405180910390fd5b8060108190555050565b6060611dbb82612145565b611dfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df190613fd5565b60405180910390fd5b6000611e04612bf0565b90506000815111611e245760405180602001604052806000815250611e4f565b80611e2e84612c82565b604051602001611e3f929190613d87565b6040516020818303038152906040525b915050919050565b600e5481565b6000611e6882612de3565b9050919050565b6000611ea48360115484604051602001611e899190613d6c565b60405160208183030381529060405280519060200120612e4d565b905092915050565b6000600c5482611ebc9190614233565b9050919050565b60105481565b611ed1612193565b73ffffffffffffffffffffffffffffffffffffffff16611eef611600565b73ffffffffffffffffffffffffffffffffffffffff1614611f45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3c90613f95565b60405180910390fd5b8060148190555050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611feb612193565b73ffffffffffffffffffffffffffffffffffffffff16612009611600565b73ffffffffffffffffffffffffffffffffffffffff161461205f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205690613f95565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c690613e95565b60405180910390fd5b6120d8816129b9565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161215061226b565b1115801561215f575060015482105b801561218c575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b612267828260405180602001604052806000815250612e64565b5050565b60006001905090565b600061227f8261272a565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146122ea576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661230b612193565b73ffffffffffffffffffffffffffffffffffffffff16148061233a575061233985612334612193565b611f4f565b5b8061237f5750612348612193565b73ffffffffffffffffffffffffffffffffffffffff1661236784610c32565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806123b8576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561241f576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61242c8585856001612e76565b6124386000848761219b565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156126b85760015482146126b757878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127238585856001612e7c565b5050505050565b612732613363565b60008290508061274061226b565b1115801561274f575060015481105b15612982576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161298057600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146128645780925050506129b4565b5b60011561297f57818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461297a5780925050506129b4565b612865565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ab6612193565b8786866040518563ffffffff1660e01b8152600401612ad89493929190613df1565b602060405180830381600087803b158015612af257600080fd5b505af1925050508015612b2357506040513d601f19601f82011682018060405250810190612b20919061388e565b60015b612b9d573d8060008114612b53576040519150601f19603f3d011682016040523d82523d6000602084013e612b58565b606091505b50600081511415612b95576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600d8054612bff90614395565b80601f0160208091040260200160405190810160405280929190818152602001828054612c2b90614395565b8015612c785780601f10612c4d57610100808354040283529160200191612c78565b820191906000526020600020905b815481529060010190602001808311612c5b57829003601f168201915b5050505050905090565b60606000821415612cca576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612dde565b600082905060005b60008214612cfc578080612ce5906143f8565b915050600a82612cf59190614202565b9150612cd2565b60008167ffffffffffffffff811115612d1857612d17614552565b5b6040519080825280601f01601f191660200182016040528015612d4a5781602001600182028036833780820191505090505b5090505b60008514612dd757600182612d63919061428d565b9150600a85612d729190614465565b6030612d7e91906141ac565b60f81b818381518110612d9457612d93614523565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612dd09190614202565b9450612d4e565b8093505050505b919050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b600082612e5a8584612e82565b1490509392505050565b612e718383836001612ef7565b505050565b50505050565b50505050565b60008082905060005b8451811015612eec576000858281518110612ea957612ea8614523565b5b60200260200101519050808311612ecb57612ec483826132c6565b9250612ed8565b612ed581846132c6565b92505b508080612ee4906143f8565b915050612e8b565b508091505092915050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612f65576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612fa0576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612fad6000868387612e76565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561317757506131768773ffffffffffffffffffffffffffffffffffffffff16612a7d565b5b1561323d575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131ec6000888480600101955088612a90565b613222576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561317d57826001541461323857600080fd5b6132a9565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082141561323e575b8160018190555050506132bf6000868387612e7c565b5050505050565b600082600052816020526040600020905092915050565b8280546132e990614395565b90600052602060002090601f01602090048101928261330b5760008555613352565b82601f1061332457805160ff1916838001178555613352565b82800160010185558215613352579182015b82811115613351578251825591602001919060010190613336565b5b50905061335f91906133a6565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156133bf5760008160009055506001016133a7565b5090565b60006133d66133d1846140d0565b6140ab565b905080838252602082019050828560208602820111156133f9576133f861458b565b5b60005b85811015613429578161340f8882613565565b8452602084019350602083019250506001810190506133fc565b5050509392505050565b6000613446613441846140fc565b6140ab565b90508281526020810184848401111561346257613461614590565b5b61346d848285614353565b509392505050565b60006134886134838461412d565b6140ab565b9050828152602081018484840111156134a4576134a3614590565b5b6134af848285614353565b509392505050565b6000813590506134c681614911565b92915050565b60008083601f8401126134e2576134e1614586565b5b8235905067ffffffffffffffff8111156134ff576134fe614581565b5b60208301915083602082028301111561351b5761351a61458b565b5b9250929050565b600082601f83011261353757613536614586565b5b81356135478482602086016133c3565b91505092915050565b60008135905061355f81614928565b92915050565b6000813590506135748161493f565b92915050565b60008135905061358981614956565b92915050565b60008151905061359e81614956565b92915050565b600082601f8301126135b9576135b8614586565b5b81356135c9848260208601613433565b91505092915050565b600082601f8301126135e7576135e6614586565b5b81356135f7848260208601613475565b91505092915050565b60008135905061360f8161496d565b92915050565b60006020828403121561362b5761362a61459a565b5b6000613639848285016134b7565b91505092915050565b600080604083850312156136595761365861459a565b5b6000613667858286016134b7565b9250506020613678858286016134b7565b9150509250929050565b60008060006060848603121561369b5761369a61459a565b5b60006136a9868287016134b7565b93505060206136ba868287016134b7565b92505060406136cb86828701613600565b9150509250925092565b600080600080608085870312156136ef576136ee61459a565b5b60006136fd878288016134b7565b945050602061370e878288016134b7565b935050604061371f87828801613600565b925050606085013567ffffffffffffffff8111156137405761373f614595565b5b61374c878288016135a4565b91505092959194509250565b6000806040838503121561376f5761376e61459a565b5b600061377d858286016134b7565b925050602061378e85828601613550565b9150509250929050565b600080604083850312156137af576137ae61459a565b5b60006137bd858286016134b7565b92505060206137ce85828601613600565b9150509250929050565b600080604083850312156137ef576137ee61459a565b5b600083013567ffffffffffffffff81111561380d5761380c614595565b5b61381985828601613522565b925050602061382a858286016134b7565b9150509250929050565b60006020828403121561384a5761384961459a565b5b600061385884828501613565565b91505092915050565b6000602082840312156138775761387661459a565b5b60006138858482850161357a565b91505092915050565b6000602082840312156138a4576138a361459a565b5b60006138b28482850161358f565b91505092915050565b6000602082840312156138d1576138d061459a565b5b600082013567ffffffffffffffff8111156138ef576138ee614595565b5b6138fb848285016135d2565b91505092915050565b60006020828403121561391a5761391961459a565b5b600061392884828501613600565b91505092915050565b60008060006040848603121561394a5761394961459a565b5b600061395886828701613600565b935050602084013567ffffffffffffffff81111561397957613978614595565b5b613985868287016134cc565b92509250509250925092565b61399a816142c1565b82525050565b6139a9816142c1565b82525050565b6139c06139bb826142c1565b614441565b82525050565b6139cf816142d3565b82525050565b6139de816142d3565b82525050565b6139ed816142df565b82525050565b60006139fe8261415e565b613a088185614174565b9350613a18818560208601614362565b613a218161459f565b840191505092915050565b6000613a3782614169565b613a418185614190565b9350613a51818560208601614362565b613a5a8161459f565b840191505092915050565b6000613a7082614169565b613a7a81856141a1565b9350613a8a818560208601614362565b80840191505092915050565b6000613aa3602683614190565b9150613aae826145bd565b604082019050919050565b6000613ac6601483614190565b9150613ad18261460c565b602082019050919050565b6000613ae9601383614190565b9150613af482614635565b602082019050919050565b6000613b0c602183614190565b9150613b178261465e565b604082019050919050565b6000613b2f601283614190565b9150613b3a826146ad565b602082019050919050565b6000613b52601e83614190565b9150613b5d826146d6565b602082019050919050565b6000613b75601283614190565b9150613b80826146ff565b602082019050919050565b6000613b98601683614190565b9150613ba382614728565b602082019050919050565b6000613bbb6005836141a1565b9150613bc682614751565b600582019050919050565b6000613bde602083614190565b9150613be98261477a565b602082019050919050565b6000613c01602683614190565b9150613c0c826147a3565b604082019050919050565b6000613c24602f83614190565b9150613c2f826147f2565b604082019050919050565b6000613c47600083614185565b9150613c5282614841565b600082019050919050565b6000613c6a601083614190565b9150613c7582614844565b602082019050919050565b6000613c8d601683614190565b9150613c988261486d565b602082019050919050565b6000613cb0601683614190565b9150613cbb82614896565b602082019050919050565b6000613cd3601f83614190565b9150613cde826148bf565b602082019050919050565b6000613cf66001836141a1565b9150613d01826148e8565b600182019050919050565b606082016000820151613d226000850182613991565b506020820151613d356020850182613d5d565b506040820151613d4860408501826139c6565b50505050565b613d5781614335565b82525050565b613d668161433f565b82525050565b6000613d7882846139af565b60148201915081905092915050565b6000613d938285613a65565b9150613d9e82613ce9565b9150613daa8284613a65565b9150613db582613bae565b91508190509392505050565b6000613dcc82613c3a565b9150819050919050565b6000602082019050613deb60008301846139a0565b92915050565b6000608082019050613e0660008301876139a0565b613e1360208301866139a0565b613e206040830185613d4e565b8181036060830152613e3281846139f3565b905095945050505050565b6000602082019050613e5260008301846139d5565b92915050565b6000602082019050613e6d60008301846139e4565b92915050565b60006020820190508181036000830152613e8d8184613a2c565b905092915050565b60006020820190508181036000830152613eae81613a96565b9050919050565b60006020820190508181036000830152613ece81613ab9565b9050919050565b60006020820190508181036000830152613eee81613adc565b9050919050565b60006020820190508181036000830152613f0e81613aff565b9050919050565b60006020820190508181036000830152613f2e81613b22565b9050919050565b60006020820190508181036000830152613f4e81613b45565b9050919050565b60006020820190508181036000830152613f6e81613b68565b9050919050565b60006020820190508181036000830152613f8e81613b8b565b9050919050565b60006020820190508181036000830152613fae81613bd1565b9050919050565b60006020820190508181036000830152613fce81613bf4565b9050919050565b60006020820190508181036000830152613fee81613c17565b9050919050565b6000602082019050818103600083015261400e81613c5d565b9050919050565b6000602082019050818103600083015261402e81613c80565b9050919050565b6000602082019050818103600083015261404e81613ca3565b9050919050565b6000602082019050818103600083015261406e81613cc6565b9050919050565b600060608201905061408a6000830184613d0c565b92915050565b60006020820190506140a56000830184613d4e565b92915050565b60006140b56140c6565b90506140c182826143c7565b919050565b6000604051905090565b600067ffffffffffffffff8211156140eb576140ea614552565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561411757614116614552565b5b6141208261459f565b9050602081019050919050565b600067ffffffffffffffff82111561414857614147614552565b5b6141518261459f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006141b782614335565b91506141c283614335565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156141f7576141f6614496565b5b828201905092915050565b600061420d82614335565b915061421883614335565b925082614228576142276144c5565b5b828204905092915050565b600061423e82614335565b915061424983614335565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561428257614281614496565b5b828202905092915050565b600061429882614335565b91506142a383614335565b9250828210156142b6576142b5614496565b5b828203905092915050565b60006142cc82614315565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015614380578082015181840152602081019050614365565b8381111561438f576000848401525b50505050565b600060028204905060018216806143ad57607f821691505b602082108114156143c1576143c06144f4565b5b50919050565b6143d08261459f565b810181811067ffffffffffffffff821117156143ef576143ee614552565b5b80604052505050565b600061440382614335565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561443657614435614496565b5b600182019050919050565b600061444c82614453565b9050919050565b600061445e826145b0565b9050919050565b600061447082614335565b915061447b83614335565b92508261448b5761448a6144c5565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f54727920746f2073656e64206d6f726520455448000000000000000000000000600082015250565b7f53616c65206973206e6f74206163746976652000000000000000000000000000600082015250565b7f546865207175616e74697479206578636565647320746865207265736572766560008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c65206973206e6f74204163746976650000000000000000000000000000600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f596f7520617265206e6f7420696e2070726573616c6500000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5175616e74697479206d757374206265206c6573736572207468656e204d617860008201527f537570706c790000000000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b7f63616e206e6f74206d696e742074686973206d616e7900000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b61491a816142c1565b811461492557600080fd5b50565b614931816142d3565b811461493c57600080fd5b50565b614948816142df565b811461495357600080fd5b50565b61495f816142e9565b811461496a57600080fd5b50565b61497681614335565b811461498157600080fd5b5056fea2646970667358221220e2117ae0ca18330e21753ebeb8233ba4a4f26e0c44a8e3447076ca0fe521445064736f6c63430008070033

Deployed Bytecode Sourcemap

32868:5035:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15123:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18236:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19739:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19302:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36949:549;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14372:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36306:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33390:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20604:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36253:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35657:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35054:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20845:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35349:73;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32971:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34386:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18044:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35270:72;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35427:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15492:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5154:103;;;;;;;;;;;;;:::i;:::-;;33065:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37646:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35880:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33122:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4931:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34713:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18405:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33629:397;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20015:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35158:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36212:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34867:181;;;;;;;;;;;;;:::i;:::-;;36590:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21101:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36440:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37788:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34033:347;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33358:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34602:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36740:199;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35535:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36120:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37507:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20373:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5266:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15123:305;15225:4;15277:25;15262:40;;;:11;:40;;;;:105;;;;15334:33;15319:48;;;:11;:48;;;;15262:105;:158;;;;15384:36;15408:11;15384:23;:36::i;:::-;15262:158;15242:178;;15123:305;;;:::o;18236:100::-;18290:13;18323:5;18316:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18236:100;:::o;19739:204::-;19807:7;19832:16;19840:7;19832;:16::i;:::-;19827:64;;19857:34;;;;;;;;;;;;;;19827:64;19911:15;:24;19927:7;19911:24;;;;;;;;;;;;;;;;;;;;;19904:31;;19739:204;;;:::o;19302:371::-;19375:13;19391:24;19407:7;19391:15;:24::i;:::-;19375:40;;19436:5;19430:11;;:2;:11;;;19426:48;;;19450:24;;;;;;;;;;;;;;19426:48;19507:5;19491:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;19517:37;19534:5;19541:12;:10;:12::i;:::-;19517:16;:37::i;:::-;19516:38;19491:63;19487:138;;;19578:35;;;;;;;;;;;;;;19487:138;19637:28;19646:2;19650:7;19659:5;19637:8;:28::i;:::-;19364:309;19302:371;;:::o;36949:549::-;37073:1;37063:6;;:11;37055:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;37142:16;;37132:8;37118:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:40;;37110:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;37219:31;37231:6;;37219:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37239:10;37219:11;:31::i;:::-;37211:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;37320:18;;37309:8;:29;;;;:::i;:::-;37296:9;:42;;37288:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;37394:22;;37382:8;:34;;37374:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;37457:31;37467:10;37479:8;37457:9;:31::i;:::-;36949:549;;;:::o;14372:303::-;14416:7;14641:15;:13;:15::i;:::-;14626:12;;14610:13;;:28;:46;14603:53;;14372:303;:::o;36306:53::-;;;;;;;;;;;;;;;;;:::o;33390:22::-;;;;:::o;20604:170::-;20738:28;20748:4;20754:2;20758:7;20738:9;:28::i;:::-;20604:170;;;:::o;36253:46::-;;;;:::o;35657:217::-;5076:12;:10;:12::i;:::-;5065:23;;:7;:5;:7::i;:::-;:23;;;5057:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35747:7:::1;;35735:8;:19;;35727:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;35814:8;35803:7;;:19;;;;;;;:::i;:::-;;;;;;;;35833:31;35843:10;35855:8;35833:9;:31::i;:::-;35657:217:::0;:::o;35054:98::-;5076:12;:10;:12::i;:::-;5065:23;;:7;:5;:7::i;:::-;:23;;;5057:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35137:9:::1;35129:5;:17;;;;35054:98:::0;:::o;20845:185::-;20983:39;21000:4;21006:2;21010:7;20983:39;;;;;;;;;;;;:16;:39::i;:::-;20845:185;;;:::o;35349:73::-;35389:4;35410:6;;35403:13;;35349:73;:::o;32971:38::-;;;;:::o;34386:98::-;5076:12;:10;:12::i;:::-;5065:23;;:7;:5;:7::i;:::-;:23;;;5057:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34471:7:::1;34455:13;:23;;;;;;;;;;;;:::i;:::-;;34386:98:::0;:::o;18044:125::-;18108:7;18135:21;18148:7;18135:12;:21::i;:::-;:26;;;18128:33;;18044:125;;;:::o;35270:72::-;5076:12;:10;:12::i;:::-;5065:23;;:7;:5;:7::i;:::-;:23;;;5057:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35335:1:::1;35326:6;:10;;;;35270:72:::0;:::o;35427:98::-;5076:12;:10;:12::i;:::-;5065:23;;:7;:5;:7::i;:::-;:23;;;5057:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35508:9:::1;35500:7;:17;;;;35427:98:::0;:::o;15492:206::-;15556:7;15597:1;15580:19;;:5;:19;;;15576:60;;;15608:28;;;;;;;;;;;;;;15576:60;15662:12;:19;15675:5;15662:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;15654:36;;15647:43;;15492:206;;;:::o;5154:103::-;5076:12;:10;:12::i;:::-;5065:23;;:7;:5;:7::i;:::-;:23;;;5057:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5219:30:::1;5246:1;5219:18;:30::i;:::-;5154:103::o:0;33065:50::-;;;;;;;;;;;;;;;;;:::o;37646:134::-;5076:12;:10;:12::i;:::-;5065:23;;:7;:5;:7::i;:::-;:23;;;5057:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37753:19:::1;37732:18;:40;;;;37646:134:::0;:::o;35880:189::-;5076:12;:10;:12::i;:::-;5065:23;;:7;:5;:7::i;:::-;:23;;;5057:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33212:4:::1;35974:8;35958:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:48;;35950:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;36036:27;36046:6;36054:8;36036:9;:27::i;:::-;35880:189:::0;;:::o;33122:34::-;;;;:::o;4931:87::-;4977:7;5004:6;;;;;;;;;;;4997:13;;4931:87;:::o;34713:148::-;34794:21;;:::i;:::-;34834;34847:7;34834:12;:21::i;:::-;34827:28;;34713:148;;;:::o;18405:104::-;18461:13;18494:7;18487:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18405:104;:::o;33629:397::-;33563:10;33550:23;;:9;:23;;;33542:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;33716:1:::1;33706:6;;:11;33698:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;33805:7;;33212:4;33784:28;;;;:::i;:::-;33772:8;33756:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:56;;33748:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;33862:19;;33850:8;:31;;33842:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33943:8;33935:5;;:16;;;;:::i;:::-;33922:9;:29;;33914:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;33989:31;33999:10;34011:8;33989:9;:31::i;:::-;33629:397:::0;:::o;20015:287::-;20126:12;:10;:12::i;:::-;20114:24;;:8;:24;;;20110:54;;;20147:17;;;;;;;;;;;;;;20110:54;20222:8;20177:18;:32;20196:12;:10;:12::i;:::-;20177:32;;;;;;;;;;;;;;;:42;20210:8;20177:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;20275:8;20246:48;;20261:12;:10;:12::i;:::-;20246:48;;;20285:8;20246:48;;;;;;:::i;:::-;;;;;;;;20015:287;;:::o;35158:106::-;5076:12;:10;:12::i;:::-;5065:23;;:7;:5;:7::i;:::-;:23;;;5057:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35257:1:::1;35235:19;:23;;;;35158:106:::0;:::o;36212:34::-;;;;:::o;34867:181::-;5076:12;:10;:12::i;:::-;5065:23;;:7;:5;:7::i;:::-;:23;;;5057:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2713:1:::1;2859:7;;:19;;2851:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;2713:1;2920:7;:18;;;;34932:12:::2;34950:10;:15;;34973:21;34950:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34931:68;;;35014:7;35006:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;34924:124;2669:1:::1;2963:7;:22;;;;34867:181::o:0;36590:142::-;36657:7;36706:18;;36696:9;:28;;;;:::i;:::-;36689:35;;36590:142;;;:::o;21101:369::-;21268:28;21278:4;21284:2;21288:7;21268:9;:28::i;:::-;21311:15;:2;:13;;;:15::i;:::-;:76;;;;;21331:56;21362:4;21368:2;21372:7;21381:5;21331:30;:56::i;:::-;21330:57;21311:76;21307:156;;;21411:40;;;;;;;;;;;;;;21307:156;21101:369;;;;:::o;36440:142::-;5076:12;:10;:12::i;:::-;5065:23;;:7;:5;:7::i;:::-;:23;;;5057:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36554:20:::1;36532:19;:42;;;;36440:142:::0;:::o;37788:112::-;5076:12;:10;:12::i;:::-;5065:23;;:7;:5;:7::i;:::-;:23;;;5057:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37893:1:::1;37868:22;:26;;;;37788:112:::0;:::o;34033:347::-;34106:13;34136:16;34144:7;34136;:16::i;:::-;34128:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;34210:21;34234:10;:8;:10::i;:::-;34210:34;;34289:1;34271:7;34265:21;:25;:109;;;;;;;;;;;;;;;;;34326:7;34340:18;:7;:16;:18::i;:::-;34309:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;34265:109;34251:123;;;34033:347;;;:::o;33358:23::-;;;;:::o;34602:107::-;34660:7;34683:20;34697:5;34683:13;:20::i;:::-;34676:27;;34602:107;;;:::o;36740:199::-;36823:4;36847:84;36866:6;36874:19;;36922:6;36905:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;36895:35;;;;;;36847:18;:84::i;:::-;36840:91;;36740:199;;;;:::o;35535:117::-;35593:7;35639:5;;35629:9;:15;;;;:::i;:::-;35622:22;;35535:117;;;:::o;36120:41::-;;;;:::o;37507:131::-;5076:12;:10;:12::i;:::-;5065:23;;:7;:5;:7::i;:::-;:23;;;5057:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37610:20:::1;37591:16;:39;;;;37507:131:::0;:::o;20373:164::-;20470:4;20494:18;:25;20513:5;20494:25;;;;;;;;;;;;;;;:35;20520:8;20494:35;;;;;;;;;;;;;;;;;;;;;;;;;20487:42;;20373:164;;;;:::o;5266:201::-;5076:12;:10;:12::i;:::-;5065:23;;:7;:5;:7::i;:::-;:23;;;5057:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5375:1:::1;5355:22;;:8;:22;;;;5347:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5431:28;5450:8;5431:18;:28::i;:::-;5266:201:::0;:::o;9584:157::-;9669:4;9708:25;9693:40;;;:11;:40;;;;9686:47;;9584:157;;;:::o;21725:174::-;21782:4;21825:7;21806:15;:13;:15::i;:::-;:26;;:53;;;;;21846:13;;21836:7;:23;21806:53;:85;;;;;21864:11;:20;21876:7;21864:20;;;;;;;;;;;:27;;;;;;;;;;;;21863:28;21806:85;21799:92;;21725:174;;;:::o;4474:98::-;4527:7;4554:10;4547:17;;4474:98;:::o;29882:196::-;30024:2;29997:15;:24;30013:7;29997:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30062:7;30058:2;30042:28;;30051:5;30042:28;;;;;;;;;;;;29882:196;;;:::o;21907:104::-;21976:27;21986:2;21990:8;21976:27;;;;;;;;;;;;:9;:27::i;:::-;21907:104;;:::o;14146:92::-;14202:7;14229:1;14222:8;;14146:92;:::o;24825:2130::-;24940:35;24978:21;24991:7;24978:12;:21::i;:::-;24940:59;;25038:4;25016:26;;:13;:18;;;:26;;;25012:67;;25051:28;;;;;;;;;;;;;;25012:67;25092:22;25134:4;25118:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;25155:36;25172:4;25178:12;:10;:12::i;:::-;25155:16;:36::i;:::-;25118:73;:126;;;;25232:12;:10;:12::i;:::-;25208:36;;:20;25220:7;25208:11;:20::i;:::-;:36;;;25118:126;25092:153;;25263:17;25258:66;;25289:35;;;;;;;;;;;;;;25258:66;25353:1;25339:16;;:2;:16;;;25335:52;;;25364:23;;;;;;;;;;;;;;25335:52;25400:43;25422:4;25428:2;25432:7;25441:1;25400:21;:43::i;:::-;25508:35;25525:1;25529:7;25538:4;25508:8;:35::i;:::-;25869:1;25839:12;:18;25852:4;25839:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25913:1;25885:12;:16;25898:2;25885:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25931:31;25965:11;:20;25977:7;25965:20;;;;;;;;;;;25931:54;;26016:2;26000:8;:13;;;:18;;;;;;;;;;;;;;;;;;26066:15;26033:8;:23;;;:49;;;;;;;;;;;;;;;;;;26334:19;26366:1;26356:7;:11;26334:33;;26382:31;26416:11;:24;26428:11;26416:24;;;;;;;;;;;26382:58;;26484:1;26459:27;;:8;:13;;;;;;;;;;;;:27;;;26455:384;;;26669:13;;26654:11;:28;26650:174;;26723:4;26707:8;:13;;;:20;;;;;;;;;;;;;;;;;;26776:13;:28;;;26750:8;:23;;;:54;;;;;;;;;;;;;;;;;;26650:174;26455:384;25814:1036;;;26886:7;26882:2;26867:27;;26876:4;26867:27;;;;;;;;;;;;26905:42;26926:4;26932:2;26936:7;26945:1;26905:20;:42::i;:::-;24929:2026;;24825:2130;;;:::o;16873:1109::-;16935:21;;:::i;:::-;16969:12;16984:7;16969:22;;17052:4;17033:15;:13;:15::i;:::-;:23;;:47;;;;;17067:13;;17060:4;:20;17033:47;17029:886;;;17101:31;17135:11;:17;17147:4;17135:17;;;;;;;;;;;17101:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17176:9;:16;;;17171:729;;17247:1;17221:28;;:9;:14;;;:28;;;17217:101;;17285:9;17278:16;;;;;;17217:101;17620:261;17627:4;17620:261;;;17660:6;;;;;;;;17705:11;:17;17717:4;17705:17;;;;;;;;;;;17693:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17779:1;17753:28;;:9;:14;;;:28;;;17749:109;;17821:9;17814:16;;;;;;17749:109;17620:261;;;17171:729;17082:833;17029:886;17943:31;;;;;;;;;;;;;;16873:1109;;;;:::o;5476:191::-;5550:16;5569:6;;;;;;;;;;;5550:25;;5595:8;5586:6;;:17;;;;;;;;;;;;;;;;;;5650:8;5619:40;;5640:8;5619:40;;;;;;;;;;;;5539:128;5476:191;:::o;5699:197::-;5759:4;5777:12;5844:7;5832:20;5824:28;;5887:1;5880:4;:8;5873:15;;;5699:197;;;:::o;30570:667::-;30733:4;30770:2;30754:36;;;30791:12;:10;:12::i;:::-;30805:4;30811:7;30820:5;30754:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30750:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31005:1;30988:6;:13;:18;30984:235;;;31034:40;;;;;;;;;;;;;;30984:235;31177:6;31171:13;31162:6;31158:2;31154:15;31147:38;30750:480;30883:45;;;30873:55;;;:6;:55;;;;30866:62;;;30570:667;;;;;;:::o;34488:108::-;34548:13;34577;34570:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34488:108;:::o;3091:533::-;3147:13;3187:1;3178:5;:10;3174:53;;;3205:10;;;;;;;;;;;;;;;;;;;;;3174:53;3237:12;3252:5;3237:20;;3268:14;3293:78;3308:1;3300:4;:9;3293:78;;3326:8;;;;;:::i;:::-;;;;3357:2;3349:10;;;;;:::i;:::-;;;3293:78;;;3381:19;3413:6;3403:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3381:39;;3431:154;3447:1;3438:5;:10;3431:154;;3475:1;3465:11;;;;;:::i;:::-;;;3542:2;3534:5;:10;;;;:::i;:::-;3521:2;:24;;;;:::i;:::-;3508:39;;3491:6;3498;3491:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3571:2;3562:11;;;;;:::i;:::-;;;3431:154;;;3609:6;3595:21;;;;;3091:533;;;;:::o;15780:137::-;15841:7;15876:12;:19;15889:5;15876:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;15868:41;;15861:48;;15780:137;;;:::o;1094:190::-;1219:4;1272;1243:25;1256:5;1263:4;1243:12;:25::i;:::-;:33;1236:40;;1094:190;;;;;:::o;22374:163::-;22497:32;22503:2;22507:8;22517:5;22524:4;22497:5;:32::i;:::-;22374:163;;;:::o;31885:159::-;;;;;:::o;32703:158::-;;;;;:::o;1645:675::-;1728:7;1748:20;1771:4;1748:27;;1791:9;1786:497;1810:5;:12;1806:1;:16;1786:497;;;1844:20;1867:5;1873:1;1867:8;;;;;;;;:::i;:::-;;;;;;;;1844:31;;1910:12;1894;:28;1890:382;;2037:42;2052:12;2066;2037:14;:42::i;:::-;2022:57;;1890:382;;;2214:42;2229:12;2243;2214:14;:42::i;:::-;2199:57;;1890:382;1829:454;1824:3;;;;;:::i;:::-;;;;1786:497;;;;2300:12;2293:19;;;1645:675;;;;:::o;22796:1775::-;22935:20;22958:13;;22935:36;;23000:1;22986:16;;:2;:16;;;22982:48;;;23011:19;;;;;;;;;;;;;;22982:48;23057:1;23045:8;:13;23041:44;;;23067:18;;;;;;;;;;;;;;23041:44;23098:61;23128:1;23132:2;23136:12;23150:8;23098:21;:61::i;:::-;23471:8;23436:12;:16;23449:2;23436:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23535:8;23495:12;:16;23508:2;23495:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23594:2;23561:11;:25;23573:12;23561:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;23661:15;23611:11;:25;23623:12;23611:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;23694:20;23717:12;23694:35;;23744:11;23773:8;23758:12;:23;23744:37;;23802:4;:23;;;;;23810:15;:2;:13;;;:15::i;:::-;23802:23;23798:641;;;23846:314;23902:12;23898:2;23877:38;;23894:1;23877:38;;;;;;;;;;;;23943:69;23982:1;23986:2;23990:14;;;;;;24006:5;23943:30;:69::i;:::-;23938:174;;24048:40;;;;;;;;;;;;;;23938:174;24155:3;24139:12;:19;;23846:314;;24241:12;24224:13;;:29;24220:43;;24255:8;;;24220:43;23798:641;;;24304:120;24360:14;;;;;;24356:2;24335:40;;24352:1;24335:40;;;;;;;;;;;;24419:3;24403:12;:19;;24304:120;;23798:641;24469:12;24453:13;:28;;;;23411:1082;;24503:60;24532:1;24536:2;24540:12;24554:8;24503:20;:60::i;:::-;22924:1647;22796:1775;;;;:::o;2328:224::-;2396:13;2459:1;2453:4;2446:15;2488:1;2482:4;2475:15;2529:4;2523;2513:21;2504:30;;2328: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:::-;15377:3;15398:67;15462:2;15457:3;15398:67;:::i;:::-;15391:74;;15474:93;15563:3;15474:93;:::i;:::-;15592:2;15587:3;15583:12;15576:19;;15235:366;;;:::o;15607:400::-;15767:3;15788:84;15870:1;15865:3;15788:84;:::i;:::-;15781:91;;15881:93;15970:3;15881:93;:::i;:::-;15999:1;15994:3;15990:11;15983:18;;15607:400;;;:::o;16013:366::-;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:::-;16899:3;16920:67;16984:2;16979:3;16920:67;:::i;:::-;16913:74;;16996:93;17085:3;16996:93;:::i;:::-;17114:2;17109:3;17105:12;17098:19;;16757:366;;;:::o;17129:398::-;17288:3;17309:83;17390:1;17385:3;17309:83;:::i;:::-;17302:90;;17401:93;17490:3;17401:93;:::i;:::-;17519:1;17514:3;17510:11;17503:18;;17129:398;;;:::o;17533:366::-;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:220::-;38794:34;38790:1;38782:6;38778:14;38771:58;38863:3;38858:2;38850:6;38846:15;38839:28;38654:220;:::o;38880:168::-;39020:20;39016:1;39008:6;39004:14;38997:44;38880:168;:::o;39054:180::-;39194:32;39190:1;39182:6;39178:14;39171:56;39054:180;:::o;39240:168::-;39380:20;39376:1;39368:6;39364:14;39357:44;39240:168;:::o;39414:172::-;39554:24;39550:1;39542:6;39538:14;39531:48;39414:172;:::o;39592:155::-;39732:7;39728:1;39720:6;39716:14;39709:31;39592:155;:::o;39753:182::-;39893:34;39889:1;39881:6;39877:14;39870:58;39753:182;:::o;39941:225::-;40081:34;40077:1;40069:6;40065:14;40058:58;40150:8;40145:2;40137:6;40133:15;40126:33;39941:225;:::o;40172:234::-;40312:34;40308:1;40300:6;40296:14;40289:58;40381:17;40376:2;40368:6;40364:15;40357:42;40172:234;:::o;40412:114::-;;:::o;40532:166::-;40672:18;40668:1;40660:6;40656:14;40649:42;40532:166;:::o;40704:172::-;40844:24;40840:1;40832:6;40828:14;40821:48;40704:172;:::o;40882:::-;41022:24;41018:1;41010:6;41006:14;40999:48;40882:172;:::o;41060:181::-;41200:33;41196:1;41188:6;41184:14;41177:57;41060:181;:::o;41247:151::-;41387:3;41383:1;41375:6;41371:14;41364:27;41247:151;:::o;41404:122::-;41477:24;41495:5;41477:24;:::i;:::-;41470:5;41467:35;41457:63;;41516:1;41513;41506:12;41457:63;41404:122;:::o;41532:116::-;41602:21;41617:5;41602:21;:::i;:::-;41595:5;41592:32;41582:60;;41638:1;41635;41628:12;41582:60;41532:116;:::o;41654:122::-;41727:24;41745:5;41727:24;:::i;:::-;41720:5;41717:35;41707:63;;41766:1;41763;41756:12;41707:63;41654:122;:::o;41782:120::-;41854:23;41871:5;41854:23;:::i;:::-;41847:5;41844:34;41834:62;;41892:1;41889;41882:12;41834:62;41782:120;:::o;41908:122::-;41981:24;41999:5;41981:24;:::i;:::-;41974:5;41971:35;41961:63;;42020:1;42017;42010:12;41961:63;41908:122;:::o

Swarm Source

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