ETH Price: $3,306.97 (+1.40%)
 

Overview

Max Total Supply

424 DC-NFT

Holders

67

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
32 DC-NFT
0x8898f87d0bed3f7e4e1211cca8d1b20d981c4055
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:
DirtyChis

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

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

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

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

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

pragma solidity ^0.8.0; 

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

    uint256 private _status;

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

        _;
        _status = _NOT_ENTERED;
    }
}

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
 
    function toString(uint256 value) internal pure returns (string memory) { 
        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }
 
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }
 
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}
 
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
 
    constructor() {
        _transferOwnership(_msgSender());
    }
 
    function owner() public view virtual returns (address) {
        return _owner;
    } 
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }
 
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }
 
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }
 
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
 
library Address { 
    function isContract(address account) internal view returns (bool) { 
        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    } 
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
 
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    } 
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }
 
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }
 
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    } 
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }
 
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }
 
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }
 
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }
 
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else { 
            if (returndata.length > 0) { 

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

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

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

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

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

        address from = prevOwnership.addr;

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  uint256 public PRICE = 0.05 ether; 
  string private _baseTokenURI;

  uint public status = 0; //0-pause 1-Whitelist 2-Public
 
  constructor() ERC721A("Dirty Chis","DC-NFT") {
  }

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

    _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 getPrice(uint256 _quantity) public view returns (uint256) {
       
        return _quantity*PRICE;
    }

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

    //    WhiteList CODE STARTS    //

    uint256 public whiteListPerWallet = 1;
    bytes32 public whitelistMerkleRoot;
    mapping(address => uint256) public whiteListClaimedBy;
    uint256 public TotalWLavailable = 777; // total number of nfts


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

    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");

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

        _safeMint(msg.sender, _howMany);
   }


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

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

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":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TotalWLavailable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sendTo","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"q","type":"uint256"}],"name":"changeMAX_PER_Transaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_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":"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":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":[{"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":"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":"uint256","name":"_whiteListPerWallet","type":"uint256"}],"name":"setWhiteListPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_whitelistMerkleRoot","type":"bytes32"}],"name":"setWhitelistMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"status","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whiteListClaimedBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whiteListPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600a805566b1a2bc2ec50000600b556000600d556001600e556103096011553480156200003057600080fd5b506040518060400160405280600a81526020017f44697274792043686973000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f44432d4e46540000000000000000000000000000000000000000000000000000815250620000bd620000b16200011560201b60201c565b6200011d60201b60201c565b8160039080519060200190620000d5929190620001ea565b508060049080519060200190620000ee929190620001ea565b50620000ff620001e160201b60201c565b60018190555050506001600981905550620002ff565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006001905090565b828054620001f8906200029a565b90600052602060002090601f0160209004810192826200021c576000855562000268565b82601f106200023757805160ff191683800117855562000268565b8280016001018555821562000268579182015b82811115620002675782518255916020019190600101906200024a565b5b5090506200027791906200027b565b5090565b5b80821115620002965760008160009055506001016200027c565b5090565b60006002820490506001821680620002b357607f821691505b60208210811415620002ca57620002c9620002d0565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6145d8806200030f6000396000f3fe60806040526004361061023b5760003560e01c80638d859f3e1161012e578063ac446002116100ab578063e5ec56a01161006f578063e5ec56a014610853578063e757223014610890578063e8006bb0146108cd578063e985e9c5146108f6578063f2fde38b146109335761023b565b8063ac44600214610770578063b88d4fde14610787578063bd32fb66146107b0578063c87b56dd146107d9578063dc33e681146108165761023b565b8063a0712d68116100f2578063a0712d68146106ae578063a22cb465146106ca578063a40ece7a146106f3578063a5cdae2d1461071c578063aa98e0c6146107455761023b565b80638d859f3e146105c55780638da5cb5b146105f0578063915a647f1461061b5780639231ab2a1461064657806395d89b41146106835761023b565b806342842e0e116101bc57806369ba1a751161018057806369ba1a75146104f457806370a082311461051d578063715018a61461055a578063852cbaee146105715780638ba4cc3c1461059c5761023b565b806342842e0e1461040f5780634e69d5601461043857806351d7ff931461046357806355f804b31461048e5780636352211e146104b75761023b565b806318160ddd1161020357806318160ddd1461032a5780631984b28614610355578063200d2ed21461039257806323b872dd146103bd5780633fd17366146103e65761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063095ea7b3146102e557806310157fc31461030e575b600080fd5b34801561024c57600080fd5b5061026760048036038101906102629190613511565b61095c565b6040516102749190613aca565b60405180910390f35b34801561028957600080fd5b50610292610a3e565b60405161029f9190613b00565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca91906135b4565b610ad0565b6040516102dc9190613a63565b60405180910390f35b3480156102f157600080fd5b5061030c60048036038101906103079190613448565b610b4c565b005b610328600480360381019061032391906135e1565b610c57565b005b34801561033657600080fd5b5061033f610e68565b60405161034c9190613cfd565b60405180910390f35b34801561036157600080fd5b5061037c600480360381019061037791906132c5565b610e7f565b6040516103899190613cfd565b60405180910390f35b34801561039e57600080fd5b506103a7610e97565b6040516103b49190613cfd565b60405180910390f35b3480156103c957600080fd5b506103e460048036038101906103df9190613332565b610e9d565b005b3480156103f257600080fd5b5061040d600480360381019061040891906135b4565b610ead565b005b34801561041b57600080fd5b5061043660048036038101906104319190613332565b610f33565b005b34801561044457600080fd5b5061044d610f53565b60405161045a9190613cfd565b60405180910390f35b34801561046f57600080fd5b50610478610f5d565b6040516104859190613cfd565b60405180910390f35b34801561049a57600080fd5b506104b560048036038101906104b0919061356b565b610f63565b005b3480156104c357600080fd5b506104de60048036038101906104d991906135b4565b610ff9565b6040516104eb9190613a63565b60405180910390f35b34801561050057600080fd5b5061051b600480360381019061051691906135b4565b61100f565b005b34801561052957600080fd5b50610544600480360381019061053f91906132c5565b611095565b6040516105519190613cfd565b60405180910390f35b34801561056657600080fd5b5061056f611165565b005b34801561057d57600080fd5b506105866111ed565b6040516105939190613cfd565b60405180910390f35b3480156105a857600080fd5b506105c360048036038101906105be9190613448565b6111f3565b005b3480156105d157600080fd5b506105da6112d4565b6040516105e79190613cfd565b60405180910390f35b3480156105fc57600080fd5b506106056112da565b6040516106129190613a63565b60405180910390f35b34801561062757600080fd5b50610630611303565b60405161063d9190613cfd565b60405180910390f35b34801561065257600080fd5b5061066d600480360381019061066891906135b4565b611309565b60405161067a9190613ce2565b60405180910390f35b34801561068f57600080fd5b50610698611321565b6040516106a59190613b00565b60405180910390f35b6106c860048036038101906106c391906135b4565b6113b3565b005b3480156106d657600080fd5b506106f160048036038101906106ec9190613408565b61155f565b005b3480156106ff57600080fd5b5061071a600480360381019061071591906135b4565b6116d7565b005b34801561072857600080fd5b50610743600480360381019061073e91906135b4565b61175d565b005b34801561075157600080fd5b5061075a6117e3565b6040516107679190613ae5565b60405180910390f35b34801561077c57600080fd5b506107856117e9565b005b34801561079357600080fd5b506107ae60048036038101906107a99190613385565b61196a565b005b3480156107bc57600080fd5b506107d760048036038101906107d291906134e4565b6119e6565b005b3480156107e557600080fd5b5061080060048036038101906107fb91906135b4565b611a6c565b60405161080d9190613b00565b60405180910390f35b34801561082257600080fd5b5061083d600480360381019061083891906132c5565b611b13565b60405161084a9190613cfd565b60405180910390f35b34801561085f57600080fd5b5061087a60048036038101906108759190613488565b611b25565b6040516108879190613aca565b60405180910390f35b34801561089c57600080fd5b506108b760048036038101906108b291906135b4565b611b62565b6040516108c49190613cfd565b60405180910390f35b3480156108d957600080fd5b506108f460048036038101906108ef91906135b4565b611b79565b005b34801561090257600080fd5b5061091d600480360381019061091891906132f2565b611bff565b60405161092a9190613aca565b60405180910390f35b34801561093f57600080fd5b5061095a600480360381019061095591906132c5565b611c93565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a2757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a375750610a3682611d8b565b5b9050919050565b606060038054610a4d90614002565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7990614002565b8015610ac65780601f10610a9b57610100808354040283529160200191610ac6565b820191906000526020600020905b815481529060010190602001808311610aa957829003601f168201915b5050505050905090565b6000610adb82611df5565b610b11576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b5782610ff9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bbf576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bde611e43565b73ffffffffffffffffffffffffffffffffffffffff1614158015610c105750610c0e81610c09611e43565b611bff565b155b15610c47576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c52838383611e4b565b505050565b6001600d5414610c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9390613b42565b60405180910390fd5b60115483610ca8610e68565b610cb29190613e19565b1115610cf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cea90613c02565b60405180910390fd5b610d3e828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505033611b25565b610d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7490613bc2565b60405180910390fd5b600e54601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610dce9190613e19565b92505081905550600e54601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5090613ca2565b60405180910390fd5b610e633384611efd565b505050565b6000610e72611f1b565b6002546001540303905090565b60106020528060005260406000206000915090505481565b600d5481565b610ea8838383611f24565b505050565b610eb5611e43565b73ffffffffffffffffffffffffffffffffffffffff16610ed36112da565b73ffffffffffffffffffffffffffffffffffffffff1614610f29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2090613be2565b60405180910390fd5b80600b8190555050565b610f4e8383836040518060200160405280600081525061196a565b505050565b6000600d54905090565b600a5481565b610f6b611e43565b73ffffffffffffffffffffffffffffffffffffffff16610f896112da565b73ffffffffffffffffffffffffffffffffffffffff1614610fdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd690613be2565b60405180910390fd5b80600c9080519060200190610ff5929190612f8d565b5050565b6000611004826123da565b600001519050919050565b611017611e43565b73ffffffffffffffffffffffffffffffffffffffff166110356112da565b73ffffffffffffffffffffffffffffffffffffffff161461108b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108290613be2565b60405180910390fd5b80600d8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110fd576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61116d611e43565b73ffffffffffffffffffffffffffffffffffffffff1661118b6112da565b73ffffffffffffffffffffffffffffffffffffffff16146111e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d890613be2565b60405180910390fd5b6111eb6000612669565b565b600e5481565b6111fb611e43565b73ffffffffffffffffffffffffffffffffffffffff166112196112da565b73ffffffffffffffffffffffffffffffffffffffff161461126f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126690613be2565b60405180910390fd5b6103098161127b610e68565b6112859190613e19565b11156112c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bd90613ba2565b60405180910390fd5b6112d08282611efd565b5050565b600b5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60115481565b611311613013565b61131a826123da565b9050919050565b60606004805461133090614002565b80601f016020809104026020016040519081016040528092919081815260200182805461135c90614002565b80156113a95780601f1061137e576101008083540402835291602001916113a9565b820191906000526020600020905b81548152906001019060200180831161138c57829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611421576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141890613b82565b60405180910390fd5b6002600d5414611466576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145d90613b62565b60405180910390fd5b61030981611472610e68565b61147c9190613e19565b11156114bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b490613ba2565b60405180910390fd5b600a54811115611502576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f990613c82565b60405180910390fd5b80600b546115109190613ea0565b341015611552576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154990613c62565b60405180910390fd5b61155c3382611efd565b50565b611567611e43565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115cc576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600860006115d9611e43565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611686611e43565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116cb9190613aca565b60405180910390a35050565b6116df611e43565b73ffffffffffffffffffffffffffffffffffffffff166116fd6112da565b73ffffffffffffffffffffffffffffffffffffffff1614611753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174a90613be2565b60405180910390fd5b80600a8190555050565b611765611e43565b73ffffffffffffffffffffffffffffffffffffffff166117836112da565b73ffffffffffffffffffffffffffffffffffffffff16146117d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d090613be2565b60405180910390fd5b80600e8190555050565b600f5481565b6117f1611e43565b73ffffffffffffffffffffffffffffffffffffffff1661180f6112da565b73ffffffffffffffffffffffffffffffffffffffff1614611865576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185c90613be2565b60405180910390fd5b600260095414156118ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a290613cc2565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff16476040516118d990613a4e565b60006040518083038185875af1925050503d8060008114611916576040519150601f19603f3d011682016040523d82523d6000602084013e61191b565b606091505b505090508061195f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195690613c42565b60405180910390fd5b506001600981905550565b611975848484611f24565b6119948373ffffffffffffffffffffffffffffffffffffffff1661272d565b80156119a957506119a784848484612740565b155b156119e0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6119ee611e43565b73ffffffffffffffffffffffffffffffffffffffff16611a0c6112da565b73ffffffffffffffffffffffffffffffffffffffff1614611a62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5990613be2565b60405180910390fd5b80600f8190555050565b6060611a7782611df5565b611ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aad90613c22565b60405180910390fd5b6000611ac06128a0565b90506000815111611ae05760405180602001604052806000815250611b0b565b80611aea84612932565b604051602001611afb929190613a14565b6040516020818303038152906040525b915050919050565b6000611b1e82612a93565b9050919050565b6000611b5a83600f5484604051602001611b3f91906139f9565b60405160208183030381529060405280519060200120612afd565b905092915050565b6000600b5482611b729190613ea0565b9050919050565b611b81611e43565b73ffffffffffffffffffffffffffffffffffffffff16611b9f6112da565b73ffffffffffffffffffffffffffffffffffffffff1614611bf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bec90613be2565b60405180910390fd5b8060118190555050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c9b611e43565b73ffffffffffffffffffffffffffffffffffffffff16611cb96112da565b73ffffffffffffffffffffffffffffffffffffffff1614611d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0690613be2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7690613b22565b60405180910390fd5b611d8881612669565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611e00611f1b565b11158015611e0f575060015482105b8015611e3c575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b611f17828260405180602001604052806000815250612b14565b5050565b60006001905090565b6000611f2f826123da565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611f9a576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611fbb611e43565b73ffffffffffffffffffffffffffffffffffffffff161480611fea5750611fe985611fe4611e43565b611bff565b5b8061202f5750611ff8611e43565b73ffffffffffffffffffffffffffffffffffffffff1661201784610ad0565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612068576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156120cf576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120dc8585856001612b26565b6120e860008487611e4b565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561236857600154821461236757878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123d38585856001612b2c565b5050505050565b6123e2613013565b6000829050806123f0611f1b565b111580156123ff575060015481105b15612632576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161263057600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612514578092505050612664565b5b60011561262f57818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461262a578092505050612664565b612515565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612766611e43565b8786866040518563ffffffff1660e01b81526004016127889493929190613a7e565b602060405180830381600087803b1580156127a257600080fd5b505af19250505080156127d357506040513d601f19601f820116820180604052508101906127d0919061353e565b60015b61284d573d8060008114612803576040519150601f19603f3d011682016040523d82523d6000602084013e612808565b606091505b50600081511415612845576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600c80546128af90614002565b80601f01602080910402602001604051908101604052809291908181526020018280546128db90614002565b80156129285780601f106128fd57610100808354040283529160200191612928565b820191906000526020600020905b81548152906001019060200180831161290b57829003601f168201915b5050505050905090565b6060600082141561297a576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a8e565b600082905060005b600082146129ac57808061299590614065565b915050600a826129a59190613e6f565b9150612982565b60008167ffffffffffffffff8111156129c8576129c76141bf565b5b6040519080825280601f01601f1916602001820160405280156129fa5781602001600182028036833780820191505090505b5090505b60008514612a8757600182612a139190613efa565b9150600a85612a2291906140d2565b6030612a2e9190613e19565b60f81b818381518110612a4457612a43614190565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a809190613e6f565b94506129fe565b8093505050505b919050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b600082612b0a8584612b32565b1490509392505050565b612b218383836001612ba7565b505050565b50505050565b50505050565b60008082905060005b8451811015612b9c576000858281518110612b5957612b58614190565b5b60200260200101519050808311612b7b57612b748382612f76565b9250612b88565b612b858184612f76565b92505b508080612b9490614065565b915050612b3b565b508091505092915050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612c15576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612c50576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c5d6000868387612b26565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612e275750612e268773ffffffffffffffffffffffffffffffffffffffff1661272d565b5b15612eed575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e9c6000888480600101955088612740565b612ed2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415612e2d578260015414612ee857600080fd5b612f59565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612eee575b816001819055505050612f6f6000868387612b2c565b5050505050565b600082600052816020526040600020905092915050565b828054612f9990614002565b90600052602060002090601f016020900481019282612fbb5760008555613002565b82601f10612fd457805160ff1916838001178555613002565b82800160010185558215613002579182015b82811115613001578251825591602001919060010190612fe6565b5b50905061300f9190613056565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561306f576000816000905550600101613057565b5090565b600061308661308184613d3d565b613d18565b905080838252602082019050828560208602820111156130a9576130a86141f8565b5b60005b858110156130d957816130bf8882613215565b8452602084019350602083019250506001810190506130ac565b5050509392505050565b60006130f66130f184613d69565b613d18565b905082815260208101848484011115613112576131116141fd565b5b61311d848285613fc0565b509392505050565b600061313861313384613d9a565b613d18565b905082815260208101848484011115613154576131536141fd565b5b61315f848285613fc0565b509392505050565b6000813590506131768161452f565b92915050565b60008083601f840112613192576131916141f3565b5b8235905067ffffffffffffffff8111156131af576131ae6141ee565b5b6020830191508360208202830111156131cb576131ca6141f8565b5b9250929050565b600082601f8301126131e7576131e66141f3565b5b81356131f7848260208601613073565b91505092915050565b60008135905061320f81614546565b92915050565b6000813590506132248161455d565b92915050565b60008135905061323981614574565b92915050565b60008151905061324e81614574565b92915050565b600082601f830112613269576132686141f3565b5b81356132798482602086016130e3565b91505092915050565b600082601f830112613297576132966141f3565b5b81356132a7848260208601613125565b91505092915050565b6000813590506132bf8161458b565b92915050565b6000602082840312156132db576132da614207565b5b60006132e984828501613167565b91505092915050565b6000806040838503121561330957613308614207565b5b600061331785828601613167565b925050602061332885828601613167565b9150509250929050565b60008060006060848603121561334b5761334a614207565b5b600061335986828701613167565b935050602061336a86828701613167565b925050604061337b868287016132b0565b9150509250925092565b6000806000806080858703121561339f5761339e614207565b5b60006133ad87828801613167565b94505060206133be87828801613167565b93505060406133cf878288016132b0565b925050606085013567ffffffffffffffff8111156133f0576133ef614202565b5b6133fc87828801613254565b91505092959194509250565b6000806040838503121561341f5761341e614207565b5b600061342d85828601613167565b925050602061343e85828601613200565b9150509250929050565b6000806040838503121561345f5761345e614207565b5b600061346d85828601613167565b925050602061347e858286016132b0565b9150509250929050565b6000806040838503121561349f5761349e614207565b5b600083013567ffffffffffffffff8111156134bd576134bc614202565b5b6134c9858286016131d2565b92505060206134da85828601613167565b9150509250929050565b6000602082840312156134fa576134f9614207565b5b600061350884828501613215565b91505092915050565b60006020828403121561352757613526614207565b5b60006135358482850161322a565b91505092915050565b60006020828403121561355457613553614207565b5b60006135628482850161323f565b91505092915050565b60006020828403121561358157613580614207565b5b600082013567ffffffffffffffff81111561359f5761359e614202565b5b6135ab84828501613282565b91505092915050565b6000602082840312156135ca576135c9614207565b5b60006135d8848285016132b0565b91505092915050565b6000806000604084860312156135fa576135f9614207565b5b6000613608868287016132b0565b935050602084013567ffffffffffffffff81111561362957613628614202565b5b6136358682870161317c565b92509250509250925092565b61364a81613f2e565b82525050565b61365981613f2e565b82525050565b61367061366b82613f2e565b6140ae565b82525050565b61367f81613f40565b82525050565b61368e81613f40565b82525050565b61369d81613f4c565b82525050565b60006136ae82613dcb565b6136b88185613de1565b93506136c8818560208601613fcf565b6136d18161420c565b840191505092915050565b60006136e782613dd6565b6136f18185613dfd565b9350613701818560208601613fcf565b61370a8161420c565b840191505092915050565b600061372082613dd6565b61372a8185613e0e565b935061373a818560208601613fcf565b80840191505092915050565b6000613753602683613dfd565b915061375e8261422a565b604082019050919050565b6000613776601383613dfd565b915061378182614279565b602082019050919050565b6000613799601283613dfd565b91506137a4826142a2565b602082019050919050565b60006137bc601e83613dfd565b91506137c7826142cb565b602082019050919050565b60006137df601283613dfd565b91506137ea826142f4565b602082019050919050565b6000613802601683613dfd565b915061380d8261431d565b602082019050919050565b6000613825600583613e0e565b915061383082614346565b600582019050919050565b6000613848602083613dfd565b91506138538261436f565b602082019050919050565b600061386b602683613dfd565b915061387682614398565b604082019050919050565b600061388e602f83613dfd565b9150613899826143e7565b604082019050919050565b60006138b1600083613df2565b91506138bc82614436565b600082019050919050565b60006138d4601083613dfd565b91506138df82614439565b602082019050919050565b60006138f7601683613dfd565b915061390282614462565b602082019050919050565b600061391a601683613dfd565b91506139258261448b565b602082019050919050565b600061393d601c83613dfd565b9150613948826144b4565b602082019050919050565b6000613960601f83613dfd565b915061396b826144dd565b602082019050919050565b6000613983600183613e0e565b915061398e82614506565b600182019050919050565b6060820160008201516139af6000850182613641565b5060208201516139c260208501826139ea565b5060408201516139d56040850182613676565b50505050565b6139e481613fa2565b82525050565b6139f381613fac565b82525050565b6000613a05828461365f565b60148201915081905092915050565b6000613a208285613715565b9150613a2b82613976565b9150613a378284613715565b9150613a4282613818565b91508190509392505050565b6000613a59826138a4565b9150819050919050565b6000602082019050613a786000830184613650565b92915050565b6000608082019050613a936000830187613650565b613aa06020830186613650565b613aad60408301856139db565b8181036060830152613abf81846136a3565b905095945050505050565b6000602082019050613adf6000830184613685565b92915050565b6000602082019050613afa6000830184613694565b92915050565b60006020820190508181036000830152613b1a81846136dc565b905092915050565b60006020820190508181036000830152613b3b81613746565b9050919050565b60006020820190508181036000830152613b5b81613769565b9050919050565b60006020820190508181036000830152613b7b8161378c565b9050919050565b60006020820190508181036000830152613b9b816137af565b9050919050565b60006020820190508181036000830152613bbb816137d2565b9050919050565b60006020820190508181036000830152613bdb816137f5565b9050919050565b60006020820190508181036000830152613bfb8161383b565b9050919050565b60006020820190508181036000830152613c1b8161385e565b9050919050565b60006020820190508181036000830152613c3b81613881565b9050919050565b60006020820190508181036000830152613c5b816138c7565b9050919050565b60006020820190508181036000830152613c7b816138ea565b9050919050565b60006020820190508181036000830152613c9b8161390d565b9050919050565b60006020820190508181036000830152613cbb81613930565b9050919050565b60006020820190508181036000830152613cdb81613953565b9050919050565b6000606082019050613cf76000830184613999565b92915050565b6000602082019050613d1260008301846139db565b92915050565b6000613d22613d33565b9050613d2e8282614034565b919050565b6000604051905090565b600067ffffffffffffffff821115613d5857613d576141bf565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613d8457613d836141bf565b5b613d8d8261420c565b9050602081019050919050565b600067ffffffffffffffff821115613db557613db46141bf565b5b613dbe8261420c565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613e2482613fa2565b9150613e2f83613fa2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613e6457613e63614103565b5b828201905092915050565b6000613e7a82613fa2565b9150613e8583613fa2565b925082613e9557613e94614132565b5b828204905092915050565b6000613eab82613fa2565b9150613eb683613fa2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613eef57613eee614103565b5b828202905092915050565b6000613f0582613fa2565b9150613f1083613fa2565b925082821015613f2357613f22614103565b5b828203905092915050565b6000613f3982613f82565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015613fed578082015181840152602081019050613fd2565b83811115613ffc576000848401525b50505050565b6000600282049050600182168061401a57607f821691505b6020821081141561402e5761402d614161565b5b50919050565b61403d8261420c565b810181811067ffffffffffffffff8211171561405c5761405b6141bf565b5b80604052505050565b600061407082613fa2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156140a3576140a2614103565b5b600182019050919050565b60006140b9826140c0565b9050919050565b60006140cb8261421d565b9050919050565b60006140dd82613fa2565b91506140e883613fa2565b9250826140f8576140f7614132565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f53616c65206973206e6f74206163746976652000000000000000000000000000600082015250565b7f53616c65206973206e6f74204163746976650000000000000000000000000000600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f596f7520617265206e6f7420696e2070726573616c6500000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5175616e74697479206d757374206265206c6573736572207468656e204d617860008201527f537570706c790000000000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b7f63616e206e6f74206d696e742074686973206d616e7900000000000000000000600082015250565b7f50757263686173652065786365656473206d617820616c6c6f77656400000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b61453881613f2e565b811461454357600080fd5b50565b61454f81613f40565b811461455a57600080fd5b50565b61456681613f4c565b811461457157600080fd5b50565b61457d81613f56565b811461458857600080fd5b50565b61459481613fa2565b811461459f57600080fd5b5056fea26469706673582212204086403eb65854cd3a21bb9870f52443f8a27d23e8ec2a7489d16adcc7c89a1c64736f6c63430008070033

Deployed Bytecode

0x60806040526004361061023b5760003560e01c80638d859f3e1161012e578063ac446002116100ab578063e5ec56a01161006f578063e5ec56a014610853578063e757223014610890578063e8006bb0146108cd578063e985e9c5146108f6578063f2fde38b146109335761023b565b8063ac44600214610770578063b88d4fde14610787578063bd32fb66146107b0578063c87b56dd146107d9578063dc33e681146108165761023b565b8063a0712d68116100f2578063a0712d68146106ae578063a22cb465146106ca578063a40ece7a146106f3578063a5cdae2d1461071c578063aa98e0c6146107455761023b565b80638d859f3e146105c55780638da5cb5b146105f0578063915a647f1461061b5780639231ab2a1461064657806395d89b41146106835761023b565b806342842e0e116101bc57806369ba1a751161018057806369ba1a75146104f457806370a082311461051d578063715018a61461055a578063852cbaee146105715780638ba4cc3c1461059c5761023b565b806342842e0e1461040f5780634e69d5601461043857806351d7ff931461046357806355f804b31461048e5780636352211e146104b75761023b565b806318160ddd1161020357806318160ddd1461032a5780631984b28614610355578063200d2ed21461039257806323b872dd146103bd5780633fd17366146103e65761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063095ea7b3146102e557806310157fc31461030e575b600080fd5b34801561024c57600080fd5b5061026760048036038101906102629190613511565b61095c565b6040516102749190613aca565b60405180910390f35b34801561028957600080fd5b50610292610a3e565b60405161029f9190613b00565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca91906135b4565b610ad0565b6040516102dc9190613a63565b60405180910390f35b3480156102f157600080fd5b5061030c60048036038101906103079190613448565b610b4c565b005b610328600480360381019061032391906135e1565b610c57565b005b34801561033657600080fd5b5061033f610e68565b60405161034c9190613cfd565b60405180910390f35b34801561036157600080fd5b5061037c600480360381019061037791906132c5565b610e7f565b6040516103899190613cfd565b60405180910390f35b34801561039e57600080fd5b506103a7610e97565b6040516103b49190613cfd565b60405180910390f35b3480156103c957600080fd5b506103e460048036038101906103df9190613332565b610e9d565b005b3480156103f257600080fd5b5061040d600480360381019061040891906135b4565b610ead565b005b34801561041b57600080fd5b5061043660048036038101906104319190613332565b610f33565b005b34801561044457600080fd5b5061044d610f53565b60405161045a9190613cfd565b60405180910390f35b34801561046f57600080fd5b50610478610f5d565b6040516104859190613cfd565b60405180910390f35b34801561049a57600080fd5b506104b560048036038101906104b0919061356b565b610f63565b005b3480156104c357600080fd5b506104de60048036038101906104d991906135b4565b610ff9565b6040516104eb9190613a63565b60405180910390f35b34801561050057600080fd5b5061051b600480360381019061051691906135b4565b61100f565b005b34801561052957600080fd5b50610544600480360381019061053f91906132c5565b611095565b6040516105519190613cfd565b60405180910390f35b34801561056657600080fd5b5061056f611165565b005b34801561057d57600080fd5b506105866111ed565b6040516105939190613cfd565b60405180910390f35b3480156105a857600080fd5b506105c360048036038101906105be9190613448565b6111f3565b005b3480156105d157600080fd5b506105da6112d4565b6040516105e79190613cfd565b60405180910390f35b3480156105fc57600080fd5b506106056112da565b6040516106129190613a63565b60405180910390f35b34801561062757600080fd5b50610630611303565b60405161063d9190613cfd565b60405180910390f35b34801561065257600080fd5b5061066d600480360381019061066891906135b4565b611309565b60405161067a9190613ce2565b60405180910390f35b34801561068f57600080fd5b50610698611321565b6040516106a59190613b00565b60405180910390f35b6106c860048036038101906106c391906135b4565b6113b3565b005b3480156106d657600080fd5b506106f160048036038101906106ec9190613408565b61155f565b005b3480156106ff57600080fd5b5061071a600480360381019061071591906135b4565b6116d7565b005b34801561072857600080fd5b50610743600480360381019061073e91906135b4565b61175d565b005b34801561075157600080fd5b5061075a6117e3565b6040516107679190613ae5565b60405180910390f35b34801561077c57600080fd5b506107856117e9565b005b34801561079357600080fd5b506107ae60048036038101906107a99190613385565b61196a565b005b3480156107bc57600080fd5b506107d760048036038101906107d291906134e4565b6119e6565b005b3480156107e557600080fd5b5061080060048036038101906107fb91906135b4565b611a6c565b60405161080d9190613b00565b60405180910390f35b34801561082257600080fd5b5061083d600480360381019061083891906132c5565b611b13565b60405161084a9190613cfd565b60405180910390f35b34801561085f57600080fd5b5061087a60048036038101906108759190613488565b611b25565b6040516108879190613aca565b60405180910390f35b34801561089c57600080fd5b506108b760048036038101906108b291906135b4565b611b62565b6040516108c49190613cfd565b60405180910390f35b3480156108d957600080fd5b506108f460048036038101906108ef91906135b4565b611b79565b005b34801561090257600080fd5b5061091d600480360381019061091891906132f2565b611bff565b60405161092a9190613aca565b60405180910390f35b34801561093f57600080fd5b5061095a600480360381019061095591906132c5565b611c93565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a2757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a375750610a3682611d8b565b5b9050919050565b606060038054610a4d90614002565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7990614002565b8015610ac65780601f10610a9b57610100808354040283529160200191610ac6565b820191906000526020600020905b815481529060010190602001808311610aa957829003601f168201915b5050505050905090565b6000610adb82611df5565b610b11576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b5782610ff9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bbf576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bde611e43565b73ffffffffffffffffffffffffffffffffffffffff1614158015610c105750610c0e81610c09611e43565b611bff565b155b15610c47576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c52838383611e4b565b505050565b6001600d5414610c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9390613b42565b60405180910390fd5b60115483610ca8610e68565b610cb29190613e19565b1115610cf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cea90613c02565b60405180910390fd5b610d3e828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505033611b25565b610d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7490613bc2565b60405180910390fd5b600e54601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610dce9190613e19565b92505081905550600e54601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5090613ca2565b60405180910390fd5b610e633384611efd565b505050565b6000610e72611f1b565b6002546001540303905090565b60106020528060005260406000206000915090505481565b600d5481565b610ea8838383611f24565b505050565b610eb5611e43565b73ffffffffffffffffffffffffffffffffffffffff16610ed36112da565b73ffffffffffffffffffffffffffffffffffffffff1614610f29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2090613be2565b60405180910390fd5b80600b8190555050565b610f4e8383836040518060200160405280600081525061196a565b505050565b6000600d54905090565b600a5481565b610f6b611e43565b73ffffffffffffffffffffffffffffffffffffffff16610f896112da565b73ffffffffffffffffffffffffffffffffffffffff1614610fdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd690613be2565b60405180910390fd5b80600c9080519060200190610ff5929190612f8d565b5050565b6000611004826123da565b600001519050919050565b611017611e43565b73ffffffffffffffffffffffffffffffffffffffff166110356112da565b73ffffffffffffffffffffffffffffffffffffffff161461108b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108290613be2565b60405180910390fd5b80600d8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110fd576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61116d611e43565b73ffffffffffffffffffffffffffffffffffffffff1661118b6112da565b73ffffffffffffffffffffffffffffffffffffffff16146111e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d890613be2565b60405180910390fd5b6111eb6000612669565b565b600e5481565b6111fb611e43565b73ffffffffffffffffffffffffffffffffffffffff166112196112da565b73ffffffffffffffffffffffffffffffffffffffff161461126f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126690613be2565b60405180910390fd5b6103098161127b610e68565b6112859190613e19565b11156112c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bd90613ba2565b60405180910390fd5b6112d08282611efd565b5050565b600b5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60115481565b611311613013565b61131a826123da565b9050919050565b60606004805461133090614002565b80601f016020809104026020016040519081016040528092919081815260200182805461135c90614002565b80156113a95780601f1061137e576101008083540402835291602001916113a9565b820191906000526020600020905b81548152906001019060200180831161138c57829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611421576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141890613b82565b60405180910390fd5b6002600d5414611466576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145d90613b62565b60405180910390fd5b61030981611472610e68565b61147c9190613e19565b11156114bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b490613ba2565b60405180910390fd5b600a54811115611502576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f990613c82565b60405180910390fd5b80600b546115109190613ea0565b341015611552576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154990613c62565b60405180910390fd5b61155c3382611efd565b50565b611567611e43565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115cc576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600860006115d9611e43565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611686611e43565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116cb9190613aca565b60405180910390a35050565b6116df611e43565b73ffffffffffffffffffffffffffffffffffffffff166116fd6112da565b73ffffffffffffffffffffffffffffffffffffffff1614611753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174a90613be2565b60405180910390fd5b80600a8190555050565b611765611e43565b73ffffffffffffffffffffffffffffffffffffffff166117836112da565b73ffffffffffffffffffffffffffffffffffffffff16146117d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d090613be2565b60405180910390fd5b80600e8190555050565b600f5481565b6117f1611e43565b73ffffffffffffffffffffffffffffffffffffffff1661180f6112da565b73ffffffffffffffffffffffffffffffffffffffff1614611865576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185c90613be2565b60405180910390fd5b600260095414156118ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a290613cc2565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff16476040516118d990613a4e565b60006040518083038185875af1925050503d8060008114611916576040519150601f19603f3d011682016040523d82523d6000602084013e61191b565b606091505b505090508061195f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195690613c42565b60405180910390fd5b506001600981905550565b611975848484611f24565b6119948373ffffffffffffffffffffffffffffffffffffffff1661272d565b80156119a957506119a784848484612740565b155b156119e0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6119ee611e43565b73ffffffffffffffffffffffffffffffffffffffff16611a0c6112da565b73ffffffffffffffffffffffffffffffffffffffff1614611a62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5990613be2565b60405180910390fd5b80600f8190555050565b6060611a7782611df5565b611ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aad90613c22565b60405180910390fd5b6000611ac06128a0565b90506000815111611ae05760405180602001604052806000815250611b0b565b80611aea84612932565b604051602001611afb929190613a14565b6040516020818303038152906040525b915050919050565b6000611b1e82612a93565b9050919050565b6000611b5a83600f5484604051602001611b3f91906139f9565b60405160208183030381529060405280519060200120612afd565b905092915050565b6000600b5482611b729190613ea0565b9050919050565b611b81611e43565b73ffffffffffffffffffffffffffffffffffffffff16611b9f6112da565b73ffffffffffffffffffffffffffffffffffffffff1614611bf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bec90613be2565b60405180910390fd5b8060118190555050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c9b611e43565b73ffffffffffffffffffffffffffffffffffffffff16611cb96112da565b73ffffffffffffffffffffffffffffffffffffffff1614611d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0690613be2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7690613b22565b60405180910390fd5b611d8881612669565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611e00611f1b565b11158015611e0f575060015482105b8015611e3c575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b611f17828260405180602001604052806000815250612b14565b5050565b60006001905090565b6000611f2f826123da565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611f9a576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611fbb611e43565b73ffffffffffffffffffffffffffffffffffffffff161480611fea5750611fe985611fe4611e43565b611bff565b5b8061202f5750611ff8611e43565b73ffffffffffffffffffffffffffffffffffffffff1661201784610ad0565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612068576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156120cf576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120dc8585856001612b26565b6120e860008487611e4b565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561236857600154821461236757878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123d38585856001612b2c565b5050505050565b6123e2613013565b6000829050806123f0611f1b565b111580156123ff575060015481105b15612632576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161263057600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612514578092505050612664565b5b60011561262f57818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461262a578092505050612664565b612515565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612766611e43565b8786866040518563ffffffff1660e01b81526004016127889493929190613a7e565b602060405180830381600087803b1580156127a257600080fd5b505af19250505080156127d357506040513d601f19601f820116820180604052508101906127d0919061353e565b60015b61284d573d8060008114612803576040519150601f19603f3d011682016040523d82523d6000602084013e612808565b606091505b50600081511415612845576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600c80546128af90614002565b80601f01602080910402602001604051908101604052809291908181526020018280546128db90614002565b80156129285780601f106128fd57610100808354040283529160200191612928565b820191906000526020600020905b81548152906001019060200180831161290b57829003601f168201915b5050505050905090565b6060600082141561297a576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a8e565b600082905060005b600082146129ac57808061299590614065565b915050600a826129a59190613e6f565b9150612982565b60008167ffffffffffffffff8111156129c8576129c76141bf565b5b6040519080825280601f01601f1916602001820160405280156129fa5781602001600182028036833780820191505090505b5090505b60008514612a8757600182612a139190613efa565b9150600a85612a2291906140d2565b6030612a2e9190613e19565b60f81b818381518110612a4457612a43614190565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a809190613e6f565b94506129fe565b8093505050505b919050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b600082612b0a8584612b32565b1490509392505050565b612b218383836001612ba7565b505050565b50505050565b50505050565b60008082905060005b8451811015612b9c576000858281518110612b5957612b58614190565b5b60200260200101519050808311612b7b57612b748382612f76565b9250612b88565b612b858184612f76565b92505b508080612b9490614065565b915050612b3b565b508091505092915050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612c15576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612c50576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c5d6000868387612b26565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612e275750612e268773ffffffffffffffffffffffffffffffffffffffff1661272d565b5b15612eed575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e9c6000888480600101955088612740565b612ed2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415612e2d578260015414612ee857600080fd5b612f59565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612eee575b816001819055505050612f6f6000868387612b2c565b5050505050565b600082600052816020526040600020905092915050565b828054612f9990614002565b90600052602060002090601f016020900481019282612fbb5760008555613002565b82601f10612fd457805160ff1916838001178555613002565b82800160010185558215613002579182015b82811115613001578251825591602001919060010190612fe6565b5b50905061300f9190613056565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561306f576000816000905550600101613057565b5090565b600061308661308184613d3d565b613d18565b905080838252602082019050828560208602820111156130a9576130a86141f8565b5b60005b858110156130d957816130bf8882613215565b8452602084019350602083019250506001810190506130ac565b5050509392505050565b60006130f66130f184613d69565b613d18565b905082815260208101848484011115613112576131116141fd565b5b61311d848285613fc0565b509392505050565b600061313861313384613d9a565b613d18565b905082815260208101848484011115613154576131536141fd565b5b61315f848285613fc0565b509392505050565b6000813590506131768161452f565b92915050565b60008083601f840112613192576131916141f3565b5b8235905067ffffffffffffffff8111156131af576131ae6141ee565b5b6020830191508360208202830111156131cb576131ca6141f8565b5b9250929050565b600082601f8301126131e7576131e66141f3565b5b81356131f7848260208601613073565b91505092915050565b60008135905061320f81614546565b92915050565b6000813590506132248161455d565b92915050565b60008135905061323981614574565b92915050565b60008151905061324e81614574565b92915050565b600082601f830112613269576132686141f3565b5b81356132798482602086016130e3565b91505092915050565b600082601f830112613297576132966141f3565b5b81356132a7848260208601613125565b91505092915050565b6000813590506132bf8161458b565b92915050565b6000602082840312156132db576132da614207565b5b60006132e984828501613167565b91505092915050565b6000806040838503121561330957613308614207565b5b600061331785828601613167565b925050602061332885828601613167565b9150509250929050565b60008060006060848603121561334b5761334a614207565b5b600061335986828701613167565b935050602061336a86828701613167565b925050604061337b868287016132b0565b9150509250925092565b6000806000806080858703121561339f5761339e614207565b5b60006133ad87828801613167565b94505060206133be87828801613167565b93505060406133cf878288016132b0565b925050606085013567ffffffffffffffff8111156133f0576133ef614202565b5b6133fc87828801613254565b91505092959194509250565b6000806040838503121561341f5761341e614207565b5b600061342d85828601613167565b925050602061343e85828601613200565b9150509250929050565b6000806040838503121561345f5761345e614207565b5b600061346d85828601613167565b925050602061347e858286016132b0565b9150509250929050565b6000806040838503121561349f5761349e614207565b5b600083013567ffffffffffffffff8111156134bd576134bc614202565b5b6134c9858286016131d2565b92505060206134da85828601613167565b9150509250929050565b6000602082840312156134fa576134f9614207565b5b600061350884828501613215565b91505092915050565b60006020828403121561352757613526614207565b5b60006135358482850161322a565b91505092915050565b60006020828403121561355457613553614207565b5b60006135628482850161323f565b91505092915050565b60006020828403121561358157613580614207565b5b600082013567ffffffffffffffff81111561359f5761359e614202565b5b6135ab84828501613282565b91505092915050565b6000602082840312156135ca576135c9614207565b5b60006135d8848285016132b0565b91505092915050565b6000806000604084860312156135fa576135f9614207565b5b6000613608868287016132b0565b935050602084013567ffffffffffffffff81111561362957613628614202565b5b6136358682870161317c565b92509250509250925092565b61364a81613f2e565b82525050565b61365981613f2e565b82525050565b61367061366b82613f2e565b6140ae565b82525050565b61367f81613f40565b82525050565b61368e81613f40565b82525050565b61369d81613f4c565b82525050565b60006136ae82613dcb565b6136b88185613de1565b93506136c8818560208601613fcf565b6136d18161420c565b840191505092915050565b60006136e782613dd6565b6136f18185613dfd565b9350613701818560208601613fcf565b61370a8161420c565b840191505092915050565b600061372082613dd6565b61372a8185613e0e565b935061373a818560208601613fcf565b80840191505092915050565b6000613753602683613dfd565b915061375e8261422a565b604082019050919050565b6000613776601383613dfd565b915061378182614279565b602082019050919050565b6000613799601283613dfd565b91506137a4826142a2565b602082019050919050565b60006137bc601e83613dfd565b91506137c7826142cb565b602082019050919050565b60006137df601283613dfd565b91506137ea826142f4565b602082019050919050565b6000613802601683613dfd565b915061380d8261431d565b602082019050919050565b6000613825600583613e0e565b915061383082614346565b600582019050919050565b6000613848602083613dfd565b91506138538261436f565b602082019050919050565b600061386b602683613dfd565b915061387682614398565b604082019050919050565b600061388e602f83613dfd565b9150613899826143e7565b604082019050919050565b60006138b1600083613df2565b91506138bc82614436565b600082019050919050565b60006138d4601083613dfd565b91506138df82614439565b602082019050919050565b60006138f7601683613dfd565b915061390282614462565b602082019050919050565b600061391a601683613dfd565b91506139258261448b565b602082019050919050565b600061393d601c83613dfd565b9150613948826144b4565b602082019050919050565b6000613960601f83613dfd565b915061396b826144dd565b602082019050919050565b6000613983600183613e0e565b915061398e82614506565b600182019050919050565b6060820160008201516139af6000850182613641565b5060208201516139c260208501826139ea565b5060408201516139d56040850182613676565b50505050565b6139e481613fa2565b82525050565b6139f381613fac565b82525050565b6000613a05828461365f565b60148201915081905092915050565b6000613a208285613715565b9150613a2b82613976565b9150613a378284613715565b9150613a4282613818565b91508190509392505050565b6000613a59826138a4565b9150819050919050565b6000602082019050613a786000830184613650565b92915050565b6000608082019050613a936000830187613650565b613aa06020830186613650565b613aad60408301856139db565b8181036060830152613abf81846136a3565b905095945050505050565b6000602082019050613adf6000830184613685565b92915050565b6000602082019050613afa6000830184613694565b92915050565b60006020820190508181036000830152613b1a81846136dc565b905092915050565b60006020820190508181036000830152613b3b81613746565b9050919050565b60006020820190508181036000830152613b5b81613769565b9050919050565b60006020820190508181036000830152613b7b8161378c565b9050919050565b60006020820190508181036000830152613b9b816137af565b9050919050565b60006020820190508181036000830152613bbb816137d2565b9050919050565b60006020820190508181036000830152613bdb816137f5565b9050919050565b60006020820190508181036000830152613bfb8161383b565b9050919050565b60006020820190508181036000830152613c1b8161385e565b9050919050565b60006020820190508181036000830152613c3b81613881565b9050919050565b60006020820190508181036000830152613c5b816138c7565b9050919050565b60006020820190508181036000830152613c7b816138ea565b9050919050565b60006020820190508181036000830152613c9b8161390d565b9050919050565b60006020820190508181036000830152613cbb81613930565b9050919050565b60006020820190508181036000830152613cdb81613953565b9050919050565b6000606082019050613cf76000830184613999565b92915050565b6000602082019050613d1260008301846139db565b92915050565b6000613d22613d33565b9050613d2e8282614034565b919050565b6000604051905090565b600067ffffffffffffffff821115613d5857613d576141bf565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613d8457613d836141bf565b5b613d8d8261420c565b9050602081019050919050565b600067ffffffffffffffff821115613db557613db46141bf565b5b613dbe8261420c565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613e2482613fa2565b9150613e2f83613fa2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613e6457613e63614103565b5b828201905092915050565b6000613e7a82613fa2565b9150613e8583613fa2565b925082613e9557613e94614132565b5b828204905092915050565b6000613eab82613fa2565b9150613eb683613fa2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613eef57613eee614103565b5b828202905092915050565b6000613f0582613fa2565b9150613f1083613fa2565b925082821015613f2357613f22614103565b5b828203905092915050565b6000613f3982613f82565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015613fed578082015181840152602081019050613fd2565b83811115613ffc576000848401525b50505050565b6000600282049050600182168061401a57607f821691505b6020821081141561402e5761402d614161565b5b50919050565b61403d8261420c565b810181811067ffffffffffffffff8211171561405c5761405b6141bf565b5b80604052505050565b600061407082613fa2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156140a3576140a2614103565b5b600182019050919050565b60006140b9826140c0565b9050919050565b60006140cb8261421d565b9050919050565b60006140dd82613fa2565b91506140e883613fa2565b9250826140f8576140f7614132565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f53616c65206973206e6f74206163746976652000000000000000000000000000600082015250565b7f53616c65206973206e6f74204163746976650000000000000000000000000000600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f596f7520617265206e6f7420696e2070726573616c6500000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5175616e74697479206d757374206265206c6573736572207468656e204d617860008201527f537570706c790000000000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b7f63616e206e6f74206d696e742074686973206d616e7900000000000000000000600082015250565b7f50757263686173652065786365656473206d617820616c6c6f77656400000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b61453881613f2e565b811461454357600080fd5b50565b61454f81613f40565b811461455a57600080fd5b50565b61456681613f4c565b811461457157600080fd5b50565b61457d81613f56565b811461458857600080fd5b50565b61459481613fa2565b811461459f57600080fd5b5056fea26469706673582212204086403eb65854cd3a21bb9870f52443f8a27d23e8ec2a7489d16adcc7c89a1c64736f6c63430008070033

Deployed Bytecode Sourcemap

32885:4252:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15140:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18253:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19756:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19319:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36295:550;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14389:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35804:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33307:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20621:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34980:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20862:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35275:73;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32978:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34310:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18061:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35196:72;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15509:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5171:103;;;;;;;;;;;;;:::i;:::-;;35719:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35481:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33233:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4948:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35864:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34639:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18422:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33543:387;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20032:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35084:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36856:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35763:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34793:181;;;;;;;;;;;;;:::i;:::-;;21118:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35936:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33937:367;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34528:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36086:199;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35358:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37003:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20390:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5283:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15140:305;15242:4;15294:25;15279:40;;;:11;:40;;;;:105;;;;15351:33;15336:48;;;:11;:48;;;;15279:105;:158;;;;15401:36;15425:11;15401:23;:36::i;:::-;15279:158;15259:178;;15140:305;;;:::o;18253:100::-;18307:13;18340:5;18333:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18253:100;:::o;19756:204::-;19824:7;19849:16;19857:7;19849;:16::i;:::-;19844:64;;19874:34;;;;;;;;;;;;;;19844:64;19928:15;:24;19944:7;19928:24;;;;;;;;;;;;;;;;;;;;;19921:31;;19756:204;;;:::o;19319:371::-;19392:13;19408:24;19424:7;19408:15;:24::i;:::-;19392:40;;19453:5;19447:11;;:2;:11;;;19443:48;;;19467:24;;;;;;;;;;;;;;19443:48;19524:5;19508:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;19534:37;19551:5;19558:12;:10;:12::i;:::-;19534:16;:37::i;:::-;19533:38;19508:63;19504:138;;;19595:35;;;;;;;;;;;;;;19504:138;19654:28;19663:2;19667:7;19676:5;19654:8;:28::i;:::-;19381:309;19319:371;;:::o;36295:550::-;36419:1;36409:6;;:11;36401:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;36488:16;;36478:8;36464:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:40;;36456:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;36565:31;36577:6;;36565:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36585:10;36565:11;:31::i;:::-;36557:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;36672:18;;36638;:30;36657:10;36638:30;;;;;;;;;;;;;;;;:52;;;;;;;:::i;:::-;;;;;;;;36743:18;;36709;:30;36728:10;36709:30;;;;;;;;;;;;;;;;:52;;36701:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;36807:31;36817:10;36829:8;36807:9;:31::i;:::-;36295:550;;;:::o;14389:303::-;14433:7;14658:15;:13;:15::i;:::-;14643:12;;14627:13;;:28;:46;14620:53;;14389:303;:::o;35804:53::-;;;;;;;;;;;;;;;;;:::o;33307:22::-;;;;:::o;20621:170::-;20755:28;20765:4;20771:2;20775:7;20755:9;:28::i;:::-;20621:170;;;:::o;34980:98::-;5093:12;:10;:12::i;:::-;5082:23;;:7;:5;:7::i;:::-;:23;;;5074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35063:9:::1;35055:5;:17;;;;34980:98:::0;:::o;20862:185::-;21000:39;21017:4;21023:2;21027:7;21000:39;;;;;;;;;;;;:16;:39::i;:::-;20862:185;;;:::o;35275:73::-;35315:4;35336:6;;35329:13;;35275:73;:::o;32978:39::-;;;;:::o;34310:98::-;5093:12;:10;:12::i;:::-;5082:23;;:7;:5;:7::i;:::-;:23;;;5074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34395:7:::1;34379:13;:23;;;;;;;;;;;;:::i;:::-;;34310:98:::0;:::o;18061:125::-;18125:7;18152:21;18165:7;18152:12;:21::i;:::-;:26;;;18145:33;;18061:125;;;:::o;35196:72::-;5093:12;:10;:12::i;:::-;5082:23;;:7;:5;:7::i;:::-;:23;;;5074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35261:1:::1;35252:6;:10;;;;35196:72:::0;:::o;15509:206::-;15573:7;15614:1;15597:19;;:5;:19;;;15593:60;;;15625:28;;;;;;;;;;;;;;15593:60;15679:12;:19;15692:5;15679:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;15671:36;;15664:43;;15509:206;;;:::o;5171:103::-;5093:12;:10;:12::i;:::-;5082:23;;:7;:5;:7::i;:::-;:23;;;5074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5236:30:::1;5263:1;5236:18;:30::i;:::-;5171:103::o:0;35719:37::-;;;;:::o;35481:189::-;5093:12;:10;:12::i;:::-;5082:23;;:7;:5;:7::i;:::-;:23;;;5074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33121:3:::1;35575:8;35559:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:48;;35551:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;35637:27;35647:6;35655:8;35637:9;:27::i;:::-;35481:189:::0;;:::o;33233:33::-;;;;:::o;4948:87::-;4994:7;5021:6;;;;;;;;;;;5014:13;;4948:87;:::o;35864:37::-;;;;:::o;34639:148::-;34720:21;;:::i;:::-;34760;34773:7;34760:12;:21::i;:::-;34753:28;;34639:148;;;:::o;18422:104::-;18478:13;18511:7;18504:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18422:104;:::o;33543:387::-;33477:10;33464:23;;:9;:23;;;33456:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;33630:1:::1;33620:6;;:11;33612:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;33121:3;33686:8;33670:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:48;;33662:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;33768:19;;33756:8;:31;;33748:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33849:8;33841:5;;:16;;;;:::i;:::-;33828:9;:29;;33820:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;33893:31;33903:10;33915:8;33893:9;:31::i;:::-;33543:387:::0;:::o;20032:287::-;20143:12;:10;:12::i;:::-;20131:24;;:8;:24;;;20127:54;;;20164:17;;;;;;;;;;;;;;20127:54;20239:8;20194:18;:32;20213:12;:10;:12::i;:::-;20194:32;;;;;;;;;;;;;;;:42;20227:8;20194:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;20292:8;20263:48;;20278:12;:10;:12::i;:::-;20263:48;;;20302:8;20263:48;;;;;;:::i;:::-;;;;;;;;20032:287;;:::o;35084:106::-;5093:12;:10;:12::i;:::-;5082:23;;:7;:5;:7::i;:::-;:23;;;5074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35183:1:::1;35161:19;:23;;;;35084:106:::0;:::o;36856:138::-;5093:12;:10;:12::i;:::-;5082:23;;:7;:5;:7::i;:::-;:23;;;5074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36967:19:::1;36946:18;:40;;;;36856:138:::0;:::o;35763:34::-;;;;:::o;34793:181::-;5093:12;:10;:12::i;:::-;5082:23;;:7;:5;:7::i;:::-;:23;;;5074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2730:1:::1;2876:7;;:19;;2868:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;2730:1;2937:7;:18;;;;34858:12:::2;34876:10;:15;;34899:21;34876:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34857:68;;;34940:7;34932:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;34850:124;2686:1:::1;2980:7;:22;;;;34793:181::o:0;21118:369::-;21285:28;21295:4;21301:2;21305:7;21285:9;:28::i;:::-;21328:15;:2;:13;;;:15::i;:::-;:76;;;;;21348:56;21379:4;21385:2;21389:7;21398:5;21348:30;:56::i;:::-;21347:57;21328:76;21324:156;;;21428:40;;;;;;;;;;;;;;21324:156;21118:369;;;;:::o;35936:142::-;5093:12;:10;:12::i;:::-;5082:23;;:7;:5;:7::i;:::-;:23;;;5074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36050:20:::1;36028:19;:42;;;;35936:142:::0;:::o;33937:367::-;34010:13;34040:16;34048:7;34040;:16::i;:::-;34032:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;34120:21;34144:10;:8;:10::i;:::-;34120:34;;34209:1;34191:7;34185:21;:25;:113;;;;;;;;;;;;;;;;;34250:7;34264:18;:7;:16;:18::i;:::-;34233:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;34185:113;34165:133;;;33937:367;;;:::o;34528:107::-;34586:7;34609:20;34623:5;34609:13;:20::i;:::-;34602:27;;34528:107;;;:::o;36086:199::-;36169:4;36193:84;36212:6;36220:19;;36268:6;36251:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;36241:35;;;;;;36193:18;:84::i;:::-;36186:91;;36086:199;;;;:::o;35358:117::-;35416:7;35462:5;;35452:9;:15;;;;:::i;:::-;35445:22;;35358:117;;;:::o;37003:131::-;5093:12;:10;:12::i;:::-;5082:23;;:7;:5;:7::i;:::-;:23;;;5074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37106:20:::1;37087:16;:39;;;;37003:131:::0;:::o;20390:164::-;20487:4;20511:18;:25;20530:5;20511:25;;;;;;;;;;;;;;;:35;20537:8;20511:35;;;;;;;;;;;;;;;;;;;;;;;;;20504:42;;20390:164;;;;:::o;5283:201::-;5093:12;:10;:12::i;:::-;5082:23;;:7;:5;:7::i;:::-;:23;;;5074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5392:1:::1;5372:22;;:8;:22;;;;5364:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5448:28;5467:8;5448:18;:28::i;:::-;5283:201:::0;:::o;9601:157::-;9686:4;9725:25;9710:40;;;:11;:40;;;;9703:47;;9601:157;;;:::o;21742:174::-;21799:4;21842:7;21823:15;:13;:15::i;:::-;:26;;:53;;;;;21863:13;;21853:7;:23;21823:53;:85;;;;;21881:11;:20;21893:7;21881:20;;;;;;;;;;;:27;;;;;;;;;;;;21880:28;21823:85;21816:92;;21742:174;;;:::o;4491:98::-;4544:7;4571:10;4564:17;;4491:98;:::o;29899:196::-;30041:2;30014:15;:24;30030:7;30014:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30079:7;30075:2;30059:28;;30068:5;30059:28;;;;;;;;;;;;29899:196;;;:::o;21924:104::-;21993:27;22003:2;22007:8;21993:27;;;;;;;;;;;;:9;:27::i;:::-;21924:104;;:::o;14163:92::-;14219:7;14246:1;14239:8;;14163:92;:::o;24842:2130::-;24957:35;24995:21;25008:7;24995:12;:21::i;:::-;24957:59;;25055:4;25033:26;;:13;:18;;;:26;;;25029:67;;25068:28;;;;;;;;;;;;;;25029:67;25109:22;25151:4;25135:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;25172:36;25189:4;25195:12;:10;:12::i;:::-;25172:16;:36::i;:::-;25135:73;:126;;;;25249:12;:10;:12::i;:::-;25225:36;;:20;25237:7;25225:11;:20::i;:::-;:36;;;25135:126;25109:153;;25280:17;25275:66;;25306:35;;;;;;;;;;;;;;25275:66;25370:1;25356:16;;:2;:16;;;25352:52;;;25381:23;;;;;;;;;;;;;;25352:52;25417:43;25439:4;25445:2;25449:7;25458:1;25417:21;:43::i;:::-;25525:35;25542:1;25546:7;25555:4;25525:8;:35::i;:::-;25886:1;25856:12;:18;25869:4;25856:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25930:1;25902:12;:16;25915:2;25902:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25948:31;25982:11;:20;25994:7;25982:20;;;;;;;;;;;25948:54;;26033:2;26017:8;:13;;;:18;;;;;;;;;;;;;;;;;;26083:15;26050:8;:23;;;:49;;;;;;;;;;;;;;;;;;26351:19;26383:1;26373:7;:11;26351:33;;26399:31;26433:11;:24;26445:11;26433:24;;;;;;;;;;;26399:58;;26501:1;26476:27;;:8;:13;;;;;;;;;;;;:27;;;26472:384;;;26686:13;;26671:11;:28;26667:174;;26740:4;26724:8;:13;;;:20;;;;;;;;;;;;;;;;;;26793:13;:28;;;26767:8;:23;;;:54;;;;;;;;;;;;;;;;;;26667:174;26472:384;25831:1036;;;26903:7;26899:2;26884:27;;26893:4;26884:27;;;;;;;;;;;;26922:42;26943:4;26949:2;26953:7;26962:1;26922:20;:42::i;:::-;24946:2026;;24842:2130;;;:::o;16890:1109::-;16952:21;;:::i;:::-;16986:12;17001:7;16986:22;;17069:4;17050:15;:13;:15::i;:::-;:23;;:47;;;;;17084:13;;17077:4;:20;17050:47;17046:886;;;17118:31;17152:11;:17;17164:4;17152:17;;;;;;;;;;;17118:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17193:9;:16;;;17188:729;;17264:1;17238:28;;:9;:14;;;:28;;;17234:101;;17302:9;17295:16;;;;;;17234:101;17637:261;17644:4;17637:261;;;17677:6;;;;;;;;17722:11;:17;17734:4;17722:17;;;;;;;;;;;17710:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17796:1;17770:28;;:9;:14;;;:28;;;17766:109;;17838:9;17831:16;;;;;;17766:109;17637:261;;;17188:729;17099:833;17046:886;17960:31;;;;;;;;;;;;;;16890:1109;;;;:::o;5493:191::-;5567:16;5586:6;;;;;;;;;;;5567:25;;5612:8;5603:6;;:17;;;;;;;;;;;;;;;;;;5667:8;5636:40;;5657:8;5636:40;;;;;;;;;;;;5556:128;5493:191;:::o;5716:197::-;5776:4;5794:12;5861:7;5849:20;5841:28;;5904:1;5897:4;:8;5890:15;;;5716:197;;;:::o;30587:667::-;30750:4;30787:2;30771:36;;;30808:12;:10;:12::i;:::-;30822:4;30828:7;30837:5;30771:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30767:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31022:1;31005:6;:13;:18;31001:235;;;31051:40;;;;;;;;;;;;;;31001:235;31194:6;31188:13;31179:6;31175:2;31171:15;31164:38;30767:480;30900:45;;;30890:55;;;:6;:55;;;;30883:62;;;30587:667;;;;;;:::o;34414:108::-;34474:13;34503;34496:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34414:108;:::o;3108:533::-;3164:13;3204:1;3195:5;:10;3191:53;;;3222:10;;;;;;;;;;;;;;;;;;;;;3191:53;3254:12;3269:5;3254:20;;3285:14;3310:78;3325:1;3317:4;:9;3310:78;;3343:8;;;;;:::i;:::-;;;;3374:2;3366:10;;;;;:::i;:::-;;;3310:78;;;3398:19;3430:6;3420:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3398:39;;3448:154;3464:1;3455:5;:10;3448:154;;3492:1;3482:11;;;;;:::i;:::-;;;3559:2;3551:5;:10;;;;:::i;:::-;3538:2;:24;;;;:::i;:::-;3525:39;;3508:6;3515;3508:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3588:2;3579:11;;;;;:::i;:::-;;;3448:154;;;3626:6;3612:21;;;;;3108:533;;;;:::o;15797:137::-;15858:7;15893:12;:19;15906:5;15893:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;15885:41;;15878:48;;15797:137;;;:::o;1111:190::-;1236:4;1289;1260:25;1273:5;1280:4;1260:12;:25::i;:::-;:33;1253:40;;1111:190;;;;;:::o;22391:163::-;22514:32;22520:2;22524:8;22534:5;22541:4;22514:5;:32::i;:::-;22391:163;;;:::o;31902:159::-;;;;;:::o;32720:158::-;;;;;:::o;1662:675::-;1745:7;1765:20;1788:4;1765:27;;1808:9;1803:497;1827:5;:12;1823:1;:16;1803:497;;;1861:20;1884:5;1890:1;1884:8;;;;;;;;:::i;:::-;;;;;;;;1861:31;;1927:12;1911;:28;1907:382;;2054:42;2069:12;2083;2054:14;:42::i;:::-;2039:57;;1907:382;;;2231:42;2246:12;2260;2231:14;:42::i;:::-;2216:57;;1907:382;1846:454;1841:3;;;;;:::i;:::-;;;;1803:497;;;;2317:12;2310:19;;;1662:675;;;;:::o;22813:1775::-;22952:20;22975:13;;22952:36;;23017:1;23003:16;;:2;:16;;;22999:48;;;23028:19;;;;;;;;;;;;;;22999:48;23074:1;23062:8;:13;23058:44;;;23084:18;;;;;;;;;;;;;;23058:44;23115:61;23145:1;23149:2;23153:12;23167:8;23115:21;:61::i;:::-;23488:8;23453:12;:16;23466:2;23453:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23552:8;23512:12;:16;23525:2;23512:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23611:2;23578:11;:25;23590:12;23578:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;23678:15;23628:11;:25;23640:12;23628:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;23711:20;23734:12;23711:35;;23761:11;23790:8;23775:12;:23;23761:37;;23819:4;:23;;;;;23827:15;:2;:13;;;:15::i;:::-;23819:23;23815:641;;;23863:314;23919:12;23915:2;23894:38;;23911:1;23894:38;;;;;;;;;;;;23960:69;23999:1;24003:2;24007:14;;;;;;24023:5;23960:30;:69::i;:::-;23955:174;;24065:40;;;;;;;;;;;;;;23955:174;24172:3;24156:12;:19;;23863:314;;24258:12;24241:13;;:29;24237:43;;24272:8;;;24237:43;23815:641;;;24321:120;24377:14;;;;;;24373:2;24352:40;;24369:1;24352:40;;;;;;;;;;;;24436:3;24420:12;:19;;24321:120;;23815:641;24486:12;24470:13;:28;;;;23428:1082;;24520:60;24549:1;24553:2;24557:12;24571:8;24520:20;:60::i;:::-;22941:1647;22813:1775;;;;:::o;2345:224::-;2413:13;2476:1;2470:4;2463:15;2505:1;2499:4;2492:15;2546:4;2540;2530:21;2521:30;;2345:224;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:568::-;1821:8;1831:6;1881:3;1874:4;1866:6;1862:17;1858:27;1848:122;;1889:79;;:::i;:::-;1848:122;2002:6;1989:20;1979:30;;2032:18;2024:6;2021:30;2018:117;;;2054:79;;:::i;:::-;2018:117;2168:4;2160:6;2156:17;2144:29;;2222:3;2214:4;2206:6;2202:17;2192:8;2188:32;2185:41;2182:128;;;2229:79;;:::i;:::-;2182:128;1748:568;;;;;:::o;2339:370::-;2410:5;2459:3;2452:4;2444:6;2440:17;2436:27;2426:122;;2467:79;;:::i;:::-;2426:122;2584:6;2571:20;2609:94;2699:3;2691:6;2684:4;2676:6;2672:17;2609:94;:::i;:::-;2600:103;;2416:293;2339:370;;;;:::o;2715:133::-;2758:5;2796:6;2783:20;2774:29;;2812:30;2836:5;2812:30;:::i;:::-;2715:133;;;;:::o;2854:139::-;2900:5;2938:6;2925:20;2916:29;;2954:33;2981:5;2954:33;:::i;:::-;2854:139;;;;:::o;2999:137::-;3044:5;3082:6;3069:20;3060:29;;3098:32;3124:5;3098:32;:::i;:::-;2999:137;;;;:::o;3142:141::-;3198:5;3229:6;3223:13;3214:22;;3245:32;3271:5;3245:32;:::i;:::-;3142:141;;;;:::o;3302:338::-;3357:5;3406:3;3399:4;3391:6;3387:17;3383:27;3373:122;;3414:79;;:::i;:::-;3373:122;3531:6;3518:20;3556:78;3630:3;3622:6;3615:4;3607:6;3603:17;3556:78;:::i;:::-;3547:87;;3363:277;3302:338;;;;:::o;3660:340::-;3716:5;3765:3;3758:4;3750:6;3746:17;3742:27;3732:122;;3773:79;;:::i;:::-;3732:122;3890:6;3877:20;3915:79;3990:3;3982:6;3975:4;3967:6;3963:17;3915:79;:::i;:::-;3906:88;;3722:278;3660:340;;;;:::o;4006:139::-;4052:5;4090:6;4077:20;4068:29;;4106:33;4133:5;4106:33;:::i;:::-;4006:139;;;;:::o;4151:329::-;4210:6;4259:2;4247:9;4238:7;4234:23;4230:32;4227:119;;;4265:79;;:::i;:::-;4227:119;4385:1;4410:53;4455:7;4446:6;4435:9;4431:22;4410:53;:::i;:::-;4400:63;;4356:117;4151:329;;;;:::o;4486:474::-;4554:6;4562;4611:2;4599:9;4590:7;4586:23;4582:32;4579:119;;;4617:79;;:::i;:::-;4579:119;4737:1;4762:53;4807:7;4798:6;4787:9;4783:22;4762:53;:::i;:::-;4752:63;;4708:117;4864:2;4890:53;4935:7;4926:6;4915:9;4911:22;4890:53;:::i;:::-;4880:63;;4835:118;4486:474;;;;;:::o;4966:619::-;5043:6;5051;5059;5108:2;5096:9;5087:7;5083:23;5079:32;5076:119;;;5114:79;;:::i;:::-;5076:119;5234:1;5259:53;5304:7;5295:6;5284:9;5280:22;5259:53;:::i;:::-;5249:63;;5205:117;5361:2;5387:53;5432:7;5423:6;5412:9;5408:22;5387:53;:::i;:::-;5377:63;;5332:118;5489:2;5515:53;5560:7;5551:6;5540:9;5536:22;5515:53;:::i;:::-;5505:63;;5460:118;4966:619;;;;;:::o;5591:943::-;5686:6;5694;5702;5710;5759:3;5747:9;5738:7;5734:23;5730:33;5727:120;;;5766:79;;:::i;:::-;5727:120;5886:1;5911:53;5956:7;5947:6;5936:9;5932:22;5911:53;:::i;:::-;5901:63;;5857:117;6013:2;6039:53;6084:7;6075:6;6064:9;6060:22;6039:53;:::i;:::-;6029:63;;5984:118;6141:2;6167:53;6212:7;6203:6;6192:9;6188:22;6167:53;:::i;:::-;6157:63;;6112:118;6297:2;6286:9;6282:18;6269:32;6328:18;6320:6;6317:30;6314:117;;;6350:79;;:::i;:::-;6314:117;6455:62;6509:7;6500:6;6489:9;6485:22;6455:62;:::i;:::-;6445:72;;6240:287;5591:943;;;;;;;:::o;6540:468::-;6605:6;6613;6662:2;6650:9;6641:7;6637:23;6633:32;6630:119;;;6668:79;;:::i;:::-;6630:119;6788:1;6813:53;6858:7;6849:6;6838:9;6834:22;6813:53;:::i;:::-;6803:63;;6759:117;6915:2;6941:50;6983:7;6974:6;6963:9;6959:22;6941:50;:::i;:::-;6931:60;;6886:115;6540:468;;;;;:::o;7014:474::-;7082:6;7090;7139:2;7127:9;7118:7;7114:23;7110:32;7107:119;;;7145:79;;:::i;:::-;7107:119;7265:1;7290:53;7335:7;7326:6;7315:9;7311:22;7290:53;:::i;:::-;7280:63;;7236:117;7392:2;7418:53;7463:7;7454:6;7443:9;7439:22;7418:53;:::i;:::-;7408:63;;7363:118;7014:474;;;;;:::o;7494:684::-;7587:6;7595;7644:2;7632:9;7623:7;7619:23;7615:32;7612:119;;;7650:79;;:::i;:::-;7612:119;7798:1;7787:9;7783:17;7770:31;7828:18;7820:6;7817:30;7814:117;;;7850:79;;:::i;:::-;7814:117;7955:78;8025:7;8016:6;8005:9;8001:22;7955:78;:::i;:::-;7945:88;;7741:302;8082:2;8108:53;8153:7;8144:6;8133:9;8129:22;8108:53;:::i;:::-;8098:63;;8053:118;7494:684;;;;;:::o;8184:329::-;8243:6;8292:2;8280:9;8271:7;8267:23;8263:32;8260:119;;;8298:79;;:::i;:::-;8260:119;8418:1;8443:53;8488:7;8479:6;8468:9;8464:22;8443:53;:::i;:::-;8433:63;;8389:117;8184:329;;;;:::o;8519:327::-;8577:6;8626:2;8614:9;8605:7;8601:23;8597:32;8594:119;;;8632:79;;:::i;:::-;8594:119;8752:1;8777:52;8821:7;8812:6;8801:9;8797:22;8777:52;:::i;:::-;8767:62;;8723:116;8519:327;;;;:::o;8852:349::-;8921:6;8970:2;8958:9;8949:7;8945:23;8941:32;8938:119;;;8976:79;;:::i;:::-;8938:119;9096:1;9121:63;9176:7;9167:6;9156:9;9152:22;9121:63;:::i;:::-;9111:73;;9067:127;8852:349;;;;:::o;9207:509::-;9276:6;9325:2;9313:9;9304:7;9300:23;9296:32;9293:119;;;9331:79;;:::i;:::-;9293:119;9479:1;9468:9;9464:17;9451:31;9509:18;9501:6;9498:30;9495:117;;;9531:79;;:::i;:::-;9495:117;9636:63;9691:7;9682:6;9671:9;9667:22;9636:63;:::i;:::-;9626:73;;9422:287;9207:509;;;;:::o;9722:329::-;9781:6;9830:2;9818:9;9809:7;9805:23;9801:32;9798:119;;;9836:79;;:::i;:::-;9798:119;9956:1;9981:53;10026:7;10017:6;10006:9;10002:22;9981:53;:::i;:::-;9971:63;;9927:117;9722:329;;;;:::o;10057:704::-;10152:6;10160;10168;10217:2;10205:9;10196:7;10192:23;10188:32;10185:119;;;10223:79;;:::i;:::-;10185:119;10343:1;10368:53;10413:7;10404:6;10393:9;10389:22;10368:53;:::i;:::-;10358:63;;10314:117;10498:2;10487:9;10483:18;10470:32;10529:18;10521:6;10518:30;10515:117;;;10551:79;;:::i;:::-;10515:117;10664:80;10736:7;10727:6;10716:9;10712:22;10664:80;:::i;:::-;10646:98;;;;10441:313;10057:704;;;;;:::o;10767:108::-;10844:24;10862:5;10844:24;:::i;:::-;10839:3;10832:37;10767:108;;:::o;10881:118::-;10968:24;10986:5;10968:24;:::i;:::-;10963:3;10956:37;10881:118;;:::o;11005:157::-;11110:45;11130:24;11148:5;11130:24;:::i;:::-;11110:45;:::i;:::-;11105:3;11098:58;11005:157;;:::o;11168:99::-;11239:21;11254:5;11239:21;:::i;:::-;11234:3;11227:34;11168:99;;:::o;11273:109::-;11354:21;11369:5;11354:21;:::i;:::-;11349:3;11342:34;11273:109;;:::o;11388:118::-;11475:24;11493:5;11475:24;:::i;:::-;11470:3;11463:37;11388:118;;:::o;11512:360::-;11598:3;11626:38;11658:5;11626:38;:::i;:::-;11680:70;11743:6;11738:3;11680:70;:::i;:::-;11673:77;;11759:52;11804:6;11799:3;11792:4;11785:5;11781:16;11759:52;:::i;:::-;11836:29;11858:6;11836:29;:::i;:::-;11831:3;11827:39;11820:46;;11602:270;11512:360;;;;:::o;11878:364::-;11966:3;11994:39;12027:5;11994:39;:::i;:::-;12049:71;12113:6;12108:3;12049:71;:::i;:::-;12042:78;;12129:52;12174:6;12169:3;12162:4;12155:5;12151:16;12129:52;:::i;:::-;12206:29;12228:6;12206:29;:::i;:::-;12201:3;12197:39;12190:46;;11970:272;11878:364;;;;:::o;12248:377::-;12354:3;12382:39;12415:5;12382:39;:::i;:::-;12437:89;12519:6;12514:3;12437:89;:::i;:::-;12430:96;;12535:52;12580:6;12575:3;12568:4;12561:5;12557:16;12535:52;:::i;:::-;12612:6;12607:3;12603:16;12596:23;;12358:267;12248:377;;;;:::o;12631:366::-;12773:3;12794:67;12858:2;12853:3;12794:67;:::i;:::-;12787:74;;12870:93;12959:3;12870:93;:::i;:::-;12988:2;12983:3;12979:12;12972:19;;12631:366;;;:::o;13003:::-;13145:3;13166:67;13230:2;13225:3;13166:67;:::i;:::-;13159:74;;13242:93;13331:3;13242:93;:::i;:::-;13360:2;13355:3;13351:12;13344:19;;13003:366;;;:::o;13375:::-;13517:3;13538:67;13602:2;13597:3;13538:67;:::i;:::-;13531:74;;13614:93;13703:3;13614:93;:::i;:::-;13732:2;13727:3;13723:12;13716:19;;13375:366;;;:::o;13747:::-;13889:3;13910:67;13974:2;13969:3;13910:67;:::i;:::-;13903:74;;13986:93;14075:3;13986:93;:::i;:::-;14104:2;14099:3;14095:12;14088:19;;13747:366;;;:::o;14119:::-;14261:3;14282:67;14346:2;14341:3;14282:67;:::i;:::-;14275:74;;14358:93;14447:3;14358:93;:::i;:::-;14476:2;14471:3;14467:12;14460:19;;14119:366;;;:::o;14491:::-;14633:3;14654:67;14718:2;14713:3;14654:67;:::i;:::-;14647:74;;14730:93;14819:3;14730:93;:::i;:::-;14848:2;14843:3;14839:12;14832:19;;14491:366;;;:::o;14863:400::-;15023:3;15044:84;15126:1;15121:3;15044:84;:::i;:::-;15037:91;;15137:93;15226:3;15137:93;:::i;:::-;15255:1;15250:3;15246:11;15239:18;;14863:400;;;:::o;15269:366::-;15411:3;15432:67;15496:2;15491:3;15432:67;:::i;:::-;15425:74;;15508:93;15597:3;15508:93;:::i;:::-;15626:2;15621:3;15617:12;15610:19;;15269:366;;;:::o;15641:::-;15783:3;15804:67;15868:2;15863:3;15804:67;:::i;:::-;15797:74;;15880:93;15969:3;15880:93;:::i;:::-;15998:2;15993:3;15989:12;15982:19;;15641:366;;;:::o;16013:::-;16155:3;16176:67;16240:2;16235:3;16176:67;:::i;:::-;16169:74;;16252:93;16341:3;16252:93;:::i;:::-;16370:2;16365:3;16361:12;16354:19;;16013:366;;;:::o;16385:398::-;16544:3;16565:83;16646:1;16641:3;16565:83;:::i;:::-;16558:90;;16657:93;16746:3;16657:93;:::i;:::-;16775:1;16770:3;16766:11;16759:18;;16385:398;;;:::o;16789:366::-;16931:3;16952:67;17016:2;17011:3;16952:67;:::i;:::-;16945:74;;17028:93;17117:3;17028:93;:::i;:::-;17146:2;17141:3;17137:12;17130:19;;16789:366;;;:::o;17161:::-;17303:3;17324:67;17388:2;17383:3;17324:67;:::i;:::-;17317:74;;17400:93;17489:3;17400:93;:::i;:::-;17518:2;17513:3;17509:12;17502:19;;17161:366;;;:::o;17533:::-;17675:3;17696:67;17760:2;17755:3;17696:67;:::i;:::-;17689:74;;17772:93;17861:3;17772:93;:::i;:::-;17890:2;17885:3;17881:12;17874:19;;17533:366;;;:::o;17905:::-;18047:3;18068:67;18132:2;18127:3;18068:67;:::i;:::-;18061:74;;18144:93;18233:3;18144:93;:::i;:::-;18262:2;18257:3;18253:12;18246:19;;17905:366;;;:::o;18277:::-;18419:3;18440:67;18504:2;18499:3;18440:67;:::i;:::-;18433:74;;18516:93;18605:3;18516:93;:::i;:::-;18634:2;18629:3;18625:12;18618:19;;18277:366;;;:::o;18649:400::-;18809:3;18830:84;18912:1;18907:3;18830:84;:::i;:::-;18823:91;;18923:93;19012:3;18923:93;:::i;:::-;19041:1;19036:3;19032:11;19025:18;;18649:400;;;:::o;19125:697::-;19284:4;19279:3;19275:14;19371:4;19364:5;19360:16;19354:23;19390:63;19447:4;19442:3;19438:14;19424:12;19390:63;:::i;:::-;19299:164;19555:4;19548:5;19544:16;19538:23;19574:61;19629:4;19624:3;19620:14;19606:12;19574:61;:::i;:::-;19473:172;19729:4;19722:5;19718:16;19712:23;19748:57;19799:4;19794:3;19790:14;19776:12;19748:57;:::i;:::-;19655:160;19253:569;19125:697;;:::o;19828:118::-;19915:24;19933:5;19915:24;:::i;:::-;19910:3;19903:37;19828:118;;:::o;19952:105::-;20027:23;20044:5;20027:23;:::i;:::-;20022:3;20015:36;19952:105;;:::o;20063:256::-;20175:3;20190:75;20261:3;20252:6;20190:75;:::i;:::-;20290:2;20285:3;20281:12;20274:19;;20310:3;20303:10;;20063:256;;;;:::o;20325:967::-;20707:3;20729:95;20820:3;20811:6;20729:95;:::i;:::-;20722:102;;20841:148;20985:3;20841:148;:::i;:::-;20834:155;;21006:95;21097:3;21088:6;21006:95;:::i;:::-;20999:102;;21118:148;21262:3;21118:148;:::i;:::-;21111:155;;21283:3;21276:10;;20325:967;;;;;:::o;21298:379::-;21482:3;21504:147;21647:3;21504:147;:::i;:::-;21497:154;;21668:3;21661:10;;21298:379;;;:::o;21683:222::-;21776:4;21814:2;21803:9;21799:18;21791:26;;21827:71;21895:1;21884:9;21880:17;21871:6;21827:71;:::i;:::-;21683:222;;;;:::o;21911:640::-;22106:4;22144:3;22133:9;22129:19;22121:27;;22158:71;22226:1;22215:9;22211:17;22202:6;22158:71;:::i;:::-;22239:72;22307:2;22296:9;22292:18;22283:6;22239:72;:::i;:::-;22321;22389:2;22378:9;22374:18;22365:6;22321:72;:::i;:::-;22440:9;22434:4;22430:20;22425:2;22414:9;22410:18;22403:48;22468:76;22539:4;22530:6;22468:76;:::i;:::-;22460:84;;21911:640;;;;;;;:::o;22557:210::-;22644:4;22682:2;22671:9;22667:18;22659:26;;22695:65;22757:1;22746:9;22742:17;22733:6;22695:65;:::i;:::-;22557:210;;;;:::o;22773:222::-;22866:4;22904:2;22893:9;22889:18;22881:26;;22917:71;22985:1;22974:9;22970:17;22961:6;22917:71;:::i;:::-;22773:222;;;;:::o;23001:313::-;23114:4;23152:2;23141:9;23137:18;23129:26;;23201:9;23195:4;23191:20;23187:1;23176:9;23172:17;23165:47;23229:78;23302:4;23293:6;23229:78;:::i;:::-;23221:86;;23001:313;;;;:::o;23320:419::-;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:131;23727:4;23601:131;:::i;:::-;23593:139;;23320:419;;;:::o;23745:::-;23911:4;23949:2;23938:9;23934:18;23926:26;;23998:9;23992:4;23988:20;23984:1;23973:9;23969:17;23962:47;24026:131;24152:4;24026:131;:::i;:::-;24018:139;;23745:419;;;:::o;24170:::-;24336:4;24374:2;24363:9;24359:18;24351:26;;24423:9;24417:4;24413:20;24409:1;24398:9;24394:17;24387:47;24451:131;24577:4;24451:131;:::i;:::-;24443:139;;24170:419;;;:::o;24595:::-;24761:4;24799:2;24788:9;24784:18;24776:26;;24848:9;24842:4;24838:20;24834:1;24823:9;24819:17;24812:47;24876:131;25002:4;24876:131;:::i;:::-;24868:139;;24595:419;;;:::o;25020:::-;25186:4;25224:2;25213:9;25209:18;25201:26;;25273:9;25267:4;25263:20;25259:1;25248:9;25244:17;25237:47;25301:131;25427:4;25301:131;:::i;:::-;25293:139;;25020:419;;;:::o;25445:::-;25611:4;25649:2;25638:9;25634:18;25626:26;;25698:9;25692:4;25688:20;25684:1;25673:9;25669:17;25662:47;25726:131;25852:4;25726:131;:::i;:::-;25718:139;;25445:419;;;:::o;25870:::-;26036:4;26074:2;26063:9;26059:18;26051:26;;26123:9;26117:4;26113:20;26109:1;26098:9;26094:17;26087:47;26151:131;26277:4;26151:131;:::i;:::-;26143:139;;25870:419;;;:::o;26295:::-;26461:4;26499:2;26488:9;26484:18;26476:26;;26548:9;26542:4;26538:20;26534:1;26523:9;26519:17;26512:47;26576:131;26702:4;26576:131;:::i;:::-;26568:139;;26295:419;;;:::o;26720:::-;26886:4;26924:2;26913:9;26909:18;26901:26;;26973:9;26967:4;26963:20;26959:1;26948:9;26944:17;26937:47;27001:131;27127:4;27001:131;:::i;:::-;26993:139;;26720:419;;;:::o;27145:::-;27311:4;27349:2;27338:9;27334:18;27326:26;;27398:9;27392:4;27388:20;27384:1;27373:9;27369:17;27362:47;27426:131;27552:4;27426:131;:::i;:::-;27418:139;;27145:419;;;:::o;27570:::-;27736:4;27774:2;27763:9;27759:18;27751:26;;27823:9;27817:4;27813:20;27809:1;27798:9;27794:17;27787:47;27851:131;27977:4;27851:131;:::i;:::-;27843:139;;27570:419;;;:::o;27995:::-;28161:4;28199:2;28188:9;28184:18;28176:26;;28248:9;28242:4;28238:20;28234:1;28223:9;28219:17;28212:47;28276:131;28402:4;28276:131;:::i;:::-;28268:139;;27995:419;;;:::o;28420:::-;28586:4;28624:2;28613:9;28609:18;28601:26;;28673:9;28667:4;28663:20;28659:1;28648:9;28644:17;28637:47;28701:131;28827:4;28701:131;:::i;:::-;28693:139;;28420:419;;;:::o;28845:::-;29011:4;29049:2;29038:9;29034:18;29026:26;;29098:9;29092:4;29088:20;29084:1;29073:9;29069:17;29062:47;29126:131;29252:4;29126:131;:::i;:::-;29118:139;;28845:419;;;:::o;29270:346::-;29425:4;29463:2;29452:9;29448:18;29440:26;;29476:133;29606:1;29595:9;29591:17;29582:6;29476:133;:::i;:::-;29270:346;;;;:::o;29622:222::-;29715:4;29753:2;29742:9;29738:18;29730:26;;29766:71;29834:1;29823:9;29819:17;29810:6;29766:71;:::i;:::-;29622:222;;;;:::o;29850:129::-;29884:6;29911:20;;:::i;:::-;29901:30;;29940:33;29968:4;29960:6;29940:33;:::i;:::-;29850:129;;;:::o;29985:75::-;30018:6;30051:2;30045:9;30035:19;;29985:75;:::o;30066:311::-;30143:4;30233:18;30225:6;30222:30;30219:56;;;30255:18;;:::i;:::-;30219:56;30305:4;30297:6;30293:17;30285:25;;30365:4;30359;30355:15;30347:23;;30066:311;;;:::o;30383:307::-;30444:4;30534:18;30526:6;30523:30;30520:56;;;30556:18;;:::i;:::-;30520:56;30594:29;30616:6;30594:29;:::i;:::-;30586:37;;30678:4;30672;30668:15;30660:23;;30383:307;;;:::o;30696:308::-;30758:4;30848:18;30840:6;30837:30;30834:56;;;30870:18;;:::i;:::-;30834:56;30908:29;30930:6;30908:29;:::i;:::-;30900:37;;30992:4;30986;30982:15;30974:23;;30696:308;;;:::o;31010:98::-;31061:6;31095:5;31089:12;31079:22;;31010:98;;;:::o;31114:99::-;31166:6;31200:5;31194:12;31184:22;;31114:99;;;:::o;31219:168::-;31302:11;31336:6;31331:3;31324:19;31376:4;31371:3;31367:14;31352:29;;31219:168;;;;:::o;31393:147::-;31494:11;31531:3;31516:18;;31393:147;;;;:::o;31546:169::-;31630:11;31664:6;31659:3;31652:19;31704:4;31699:3;31695:14;31680:29;;31546:169;;;;:::o;31721:148::-;31823:11;31860:3;31845:18;;31721:148;;;;:::o;31875:305::-;31915:3;31934:20;31952:1;31934:20;:::i;:::-;31929:25;;31968:20;31986:1;31968:20;:::i;:::-;31963:25;;32122:1;32054:66;32050:74;32047:1;32044:81;32041:107;;;32128:18;;:::i;:::-;32041:107;32172:1;32169;32165:9;32158:16;;31875:305;;;;:::o;32186:185::-;32226:1;32243:20;32261:1;32243:20;:::i;:::-;32238:25;;32277:20;32295:1;32277:20;:::i;:::-;32272:25;;32316:1;32306:35;;32321:18;;:::i;:::-;32306:35;32363:1;32360;32356:9;32351:14;;32186:185;;;;:::o;32377:348::-;32417:7;32440:20;32458:1;32440:20;:::i;:::-;32435:25;;32474:20;32492:1;32474:20;:::i;:::-;32469:25;;32662:1;32594:66;32590:74;32587:1;32584:81;32579:1;32572:9;32565:17;32561:105;32558:131;;;32669:18;;:::i;:::-;32558:131;32717:1;32714;32710:9;32699:20;;32377:348;;;;:::o;32731:191::-;32771:4;32791:20;32809:1;32791:20;:::i;:::-;32786:25;;32825:20;32843:1;32825:20;:::i;:::-;32820:25;;32864:1;32861;32858:8;32855:34;;;32869:18;;:::i;:::-;32855:34;32914:1;32911;32907:9;32899:17;;32731:191;;;;:::o;32928:96::-;32965:7;32994:24;33012:5;32994:24;:::i;:::-;32983:35;;32928:96;;;:::o;33030:90::-;33064:7;33107:5;33100:13;33093:21;33082:32;;33030:90;;;:::o;33126:77::-;33163:7;33192:5;33181:16;;33126:77;;;:::o;33209:149::-;33245:7;33285:66;33278:5;33274:78;33263:89;;33209:149;;;:::o;33364:126::-;33401:7;33441:42;33434:5;33430:54;33419:65;;33364:126;;;:::o;33496:77::-;33533:7;33562:5;33551:16;;33496:77;;;:::o;33579:101::-;33615:7;33655:18;33648:5;33644:30;33633:41;;33579:101;;;:::o;33686:154::-;33770:6;33765:3;33760;33747:30;33832:1;33823:6;33818:3;33814:16;33807:27;33686:154;;;:::o;33846:307::-;33914:1;33924:113;33938:6;33935:1;33932:13;33924:113;;;34023:1;34018:3;34014:11;34008:18;34004:1;33999:3;33995:11;33988:39;33960:2;33957:1;33953:10;33948:15;;33924:113;;;34055:6;34052:1;34049:13;34046:101;;;34135:1;34126:6;34121:3;34117:16;34110:27;34046:101;33895:258;33846:307;;;:::o;34159:320::-;34203:6;34240:1;34234:4;34230:12;34220:22;;34287:1;34281:4;34277:12;34308:18;34298:81;;34364:4;34356:6;34352:17;34342:27;;34298:81;34426:2;34418:6;34415:14;34395:18;34392:38;34389:84;;;34445:18;;:::i;:::-;34389:84;34210:269;34159:320;;;:::o;34485:281::-;34568:27;34590:4;34568:27;:::i;:::-;34560:6;34556:40;34698:6;34686:10;34683:22;34662:18;34650:10;34647:34;34644:62;34641:88;;;34709:18;;:::i;:::-;34641:88;34749:10;34745:2;34738:22;34528:238;34485:281;;:::o;34772:233::-;34811:3;34834:24;34852:5;34834:24;:::i;:::-;34825:33;;34880:66;34873:5;34870:77;34867:103;;;34950:18;;:::i;:::-;34867:103;34997:1;34990:5;34986:13;34979:20;;34772:233;;;:::o;35011:100::-;35050:7;35079:26;35099:5;35079:26;:::i;:::-;35068:37;;35011:100;;;:::o;35117:94::-;35156:7;35185:20;35199:5;35185:20;:::i;:::-;35174:31;;35117:94;;;:::o;35217:176::-;35249:1;35266:20;35284:1;35266:20;:::i;:::-;35261:25;;35300:20;35318:1;35300:20;:::i;:::-;35295:25;;35339:1;35329:35;;35344:18;;:::i;:::-;35329:35;35385:1;35382;35378:9;35373:14;;35217:176;;;;:::o;35399:180::-;35447:77;35444:1;35437:88;35544:4;35541:1;35534:15;35568:4;35565:1;35558:15;35585:180;35633:77;35630:1;35623:88;35730:4;35727:1;35720:15;35754:4;35751:1;35744:15;35771:180;35819:77;35816:1;35809:88;35916:4;35913:1;35906:15;35940:4;35937:1;35930:15;35957:180;36005:77;36002:1;35995:88;36102:4;36099:1;36092:15;36126:4;36123:1;36116:15;36143:180;36191:77;36188:1;36181:88;36288:4;36285:1;36278:15;36312:4;36309:1;36302:15;36329:117;36438:1;36435;36428:12;36452:117;36561:1;36558;36551:12;36575:117;36684:1;36681;36674:12;36698:117;36807:1;36804;36797:12;36821:117;36930:1;36927;36920:12;36944:117;37053:1;37050;37043:12;37067:102;37108:6;37159:2;37155:7;37150:2;37143:5;37139:14;37135:28;37125:38;;37067:102;;;:::o;37175:94::-;37208:8;37256:5;37252:2;37248:14;37227:35;;37175:94;;;:::o;37275:225::-;37415:34;37411:1;37403:6;37399:14;37392:58;37484:8;37479:2;37471:6;37467:15;37460:33;37275:225;:::o;37506:169::-;37646:21;37642:1;37634:6;37630:14;37623:45;37506:169;:::o;37681:168::-;37821:20;37817:1;37809:6;37805:14;37798:44;37681:168;:::o;37855:180::-;37995:32;37991:1;37983:6;37979:14;37972:56;37855:180;:::o;38041:168::-;38181:20;38177:1;38169:6;38165:14;38158:44;38041:168;:::o;38215:172::-;38355:24;38351:1;38343:6;38339:14;38332:48;38215:172;:::o;38393:155::-;38533:7;38529:1;38521:6;38517:14;38510:31;38393:155;:::o;38554:182::-;38694:34;38690:1;38682:6;38678:14;38671:58;38554:182;:::o;38742:225::-;38882:34;38878:1;38870:6;38866:14;38859:58;38951:8;38946:2;38938:6;38934:15;38927:33;38742:225;:::o;38973:234::-;39113:34;39109:1;39101:6;39097:14;39090:58;39182:17;39177:2;39169:6;39165:15;39158:42;38973:234;:::o;39213:114::-;;:::o;39333:166::-;39473:18;39469:1;39461:6;39457:14;39450:42;39333:166;:::o;39505:172::-;39645:24;39641:1;39633:6;39629:14;39622:48;39505:172;:::o;39683:::-;39823:24;39819:1;39811:6;39807:14;39800:48;39683:172;:::o;39861:178::-;40001:30;39997:1;39989:6;39985:14;39978:54;39861:178;:::o;40045:181::-;40185:33;40181:1;40173:6;40169:14;40162:57;40045:181;:::o;40232:151::-;40372:3;40368:1;40360:6;40356:14;40349:27;40232:151;:::o;40389:122::-;40462:24;40480:5;40462:24;:::i;:::-;40455:5;40452:35;40442:63;;40501:1;40498;40491:12;40442:63;40389:122;:::o;40517:116::-;40587:21;40602:5;40587:21;:::i;:::-;40580:5;40577:32;40567:60;;40623:1;40620;40613:12;40567:60;40517:116;:::o;40639:122::-;40712:24;40730:5;40712:24;:::i;:::-;40705:5;40702:35;40692:63;;40751:1;40748;40741:12;40692:63;40639:122;:::o;40767:120::-;40839:23;40856:5;40839:23;:::i;:::-;40832:5;40829:34;40819:62;;40877:1;40874;40867:12;40819:62;40767:120;:::o;40893:122::-;40966:24;40984:5;40966:24;:::i;:::-;40959:5;40956:35;40946:63;;41005:1;41002;40995:12;40946:63;40893:122;:::o

Swarm Source

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