ETH Price: $3,433.12 (+7.55%)
Gas: 14 Gwei

Token

KRL Racers (Racers)
 

Overview

Max Total Supply

2,981 Racers

Holders

234

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 Racers
0x370cfbf70a0a1941e79ccb18a099dd284b9ab3ac
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:
KRLRacers

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-20
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.4;



/**
 * @dev Interface of ERC721A.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the
     * ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    // =============================================================
    //                            STRUCTS
    // =============================================================

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Stores the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
        uint24 extraData;
    }

    // =============================================================
    //                         TOKEN COUNTERS
    // =============================================================

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() external view returns (uint256);

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    // =============================================================
    //                            IERC721
    // =============================================================

    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable;

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

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

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

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

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

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

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

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

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

    // =============================================================
    //                           IERC2309
    // =============================================================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId`
     * (inclusive) is transferred from `from` to `to`, as defined in the
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
     *
     * See {_mintERC2309} for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

/**
 * @dev Interface of ERC721 token receiver.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364).
    struct TokenApprovalRef {
        address value;
    }

    // =============================================================
    //                           CONSTANTS
    // =============================================================

    // Mask of an entry in packed address data.
    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant _BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant _BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant _BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant _BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant _BITMASK_BURNED = 1 << 224;

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The bit position of `extraData` in packed ownership.
    uint256 private constant _BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;

    // The maximum `quantity` that can be minted with {_mintERC2309}.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309}
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    // The `Transfer` event signature is given by:
    // `keccak256(bytes("Transfer(address,address,uint256)"))`.
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    // =============================================================
    //                            STORAGE
    // =============================================================

    // The next token ID to be minted.
    uint256 private _currentIndex;

    // The number of tokens burned.
    uint256 private _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 {_packedOwnershipOf} implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

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

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

    // =============================================================
    //                          CONSTRUCTOR
    // =============================================================

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

    // =============================================================
    //                   TOKEN COUNTING OPERATIONS
    // =============================================================

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

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view virtual returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

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

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view virtual returns (uint256) {
        return _burnCounter;
    }

    // =============================================================
    //                    ADDRESS DATA OPERATIONS
    // =============================================================

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

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

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

    /**
     * Sets the auxiliary 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 virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes
        // of the XOR of all function selectors in the interface.
        // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
        // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`)
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

    /**
     * @dev Returns the token collection name.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    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, _toString(tokenId))) : '';
    }

    /**
     * @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, it can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    // =============================================================
    //                     OWNERSHIPS OPERATIONS
    // =============================================================

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    /**
     * @dev Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around over time.
     */
    function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal virtual {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & _BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an initialized ownership slot
                        // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                        // before an unintialized ownership slot
                        // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                        // Hence, `curr` will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed will be zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
        ownership.burned = packed & _BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }

    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`.
            result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

    // =============================================================
    //                      APPROVAL OPERATIONS
    // =============================================================

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

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

        _tokenApprovals[tokenId].value = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom}
     * for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

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

    /**
     * @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. See {_mint}.
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`.
     */
    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, _BITMASK_ADDRESS)
            // `msgSender == owner || msgSender == approvedAddress`.
            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`.
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    // =============================================================
    //                      TRANSFER OPERATIONS
    // =============================================================

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // 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 {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public payable virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @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 {}

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

    // =============================================================
    //                        MINT OPERATIONS
    // =============================================================

    /**
     * @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 for each mint.
     */
    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            // The duplicated `log4` removes an extra check and reduces stack juggling.
            // The assembly, together with the surrounding Solidity code, have been
            // delicately arranged to nudge the compiler into producing optimized opcodes.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )

                // The `iszero(eq(,))` check ensures that large values of `quantity`
                // that overflows uint256 will make the loop run out of gas.
                // The compiler will optimize the `iszero` away for performance.
                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

            _currentIndex = end;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

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

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

            _currentIndex = startTokenId + quantity;
        }
        _afterTokenTransfers(address(0), to, startTokenId, 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.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal virtual {
        _mint(to, quantity);

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal virtual {
        _safeMint(to, quantity, '');
    }

    // =============================================================
    //                        BURN OPERATIONS
    // =============================================================

    /**
     * @dev 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 {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        address from = address(uint160(prevOwnershipPacked));

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // 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 {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

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

    // =============================================================
    //                     EXTRA DATA OPERATIONS
    // =============================================================

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * 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 _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
    }

    // =============================================================
    //                       OTHER OPERATIONS
    // =============================================================

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a uint256 to its ASCII string decimal representation.
     */
    function _toString(uint256 value) internal pure virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), but
            // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
            // We will need 1 word for the trailing zeros padding, 1 word for the length,
            // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
            let m := add(mload(0x40), 0xa0)
            // Update the free memory pointer to allocate.
            mstore(0x40, m)
            // Assign the `str` to the end.
            str := sub(m, 0x20)
            // Zeroize the slot after the string.
            mstore(str, 0)

            // Cache the end of the memory to calculate the length later.
            let end := str

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }

            let length := sub(end, str)
            // Move the pointer 32 bytes leftwards to make room for the length.
            str := sub(str, 0x20)
            // Store the length.
            mstore(str, length)
        }
    }
}
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 Merklee 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)
        }
    }
}
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

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

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

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            /// @solidity memory-safe-assembly
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}
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);

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
contract KRLRacers is ERC721A,  Ownable {
    using SafeMath for uint256;
    using Counters for Counters.Counter;
    using ECDSA for bytes32;
    bytes32 public root;
    address private _signerAddress;
    address public saleModifier;
    string private baseURI_;
    mapping(bytes=>bool) public usedSigns;
    uint256 public immutable MAX_SUPPLY = 12000;
    uint256 public immutable HOLDERS_LIMIT = 7681;
    uint256 public immutable ALLOWLIST_LIMIT = 4000;
    uint256 public CURRENT_ALLOWLIST_CAP;
    uint256 public HOLDER_MINT_PRICE =0.03 ether;
    uint256 public MINT_PRICE=0.09 ether;
    uint256 private HOLDERS_MINTED;
    uint256 private ALLOWLIST_MINTED;
    uint256 public HOLDER_SALE_START_TIME=1663682400;
    uint256 public HOLDER_SALE_END_TIME=1664546400;
    uint256 public ALLOWLIST_SALE_START_TIME=1664028000;
    uint256 public ALLOWLIST_SALE_END_TIME=1666447200;
    uint256 public PUBLIC_SALE_START_TIME;
    uint256 public PUBLIC_SALE_END_TIME;   
    mapping(address=>uint256) private holderMinted;
    mapping(address=>uint256) private allowlistMinted;
    mapping(address=>uint256) private collabMinted;
    mapping(address=> bool) public holderFees;
    event HolderSaleTimeChanged(uint256 startTime, uint256 endTime);
    event AllowListSaleTimeChanged(uint256 startTime, uint256 endTime);
    event PublicSaleTimeChanged(uint256 startTime, uint256 endTime);


    constructor(address signerAddress_) ERC721A("KRL Racers", "Racers") {       
        _signerAddress = signerAddress_;
        setBaseURI("https://api-nft.kartracingleague.com/api/nft/");
    }

    function checkHolderWallet(address wallet) public view returns(uint256) {
        return holderMinted[wallet];
    }
    function checkAllowlistWallet(address wallet) public view returns(uint256) {
        return allowlistMinted[wallet];
    }
    function checkCollabWalletMinted(address wallet) public view returns(uint256) {
        return collabMinted[wallet];
    }

    function checkHolderMinted() public view returns(uint256){
        return HOLDERS_MINTED;
    }
    function checkAllowlistMinted() public view returns(uint256){
        return ALLOWLIST_MINTED;
    }


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

    modifier isModifier {
        require(msg.sender == owner() || msg.sender ==saleModifier, "You cant do it");
        _;
    }

    function availableForAllowlist() public view  returns(uint256){
        require(whenAllowlistSaleIsOn()==true,"whitelist sale not start yet" );
        if(block.timestamp>HOLDER_SALE_END_TIME){
        return CURRENT_ALLOWLIST_CAP.add(HOLDERS_LIMIT.sub(HOLDERS_MINTED));
        } else {
            return CURRENT_ALLOWLIST_CAP;
        }
    }

    function whenHolderSaleIsOn() public view  returns (bool) {
        if(block.timestamp > HOLDER_SALE_START_TIME && block.timestamp < HOLDER_SALE_END_TIME)
        {
            return true;
        }
        else {
            return false;
        }
    }
    function whenAllowlistSaleIsOn() public view  returns (bool) {
        if(block.timestamp > ALLOWLIST_SALE_START_TIME && block.timestamp < ALLOWLIST_SALE_END_TIME)
        {
            return true;
        }
        else {
             return false;
        }
        
    }
    function whenPublicaleIsOn() public view  returns (bool) {
        if(block.timestamp > PUBLIC_SALE_START_TIME && block.timestamp < PUBLIC_SALE_END_TIME)
        {
            return true;
        }
        else 
        {
            return false;
        }
        
    }    

    function setAllowlistCap(uint256 limit_) public isModifier {
        CURRENT_ALLOWLIST_CAP = limit_;
    }

    function changeHolderSaleTime(uint256 startTime, uint256 endTime) public isModifier {
        HOLDER_SALE_START_TIME = startTime;
        HOLDER_SALE_END_TIME = endTime;
        emit HolderSaleTimeChanged(startTime, endTime);
    }

    function startAllowlistPhase(uint256 startTime, uint256 endTime) public isModifier {
        ALLOWLIST_SALE_START_TIME = startTime;
        ALLOWLIST_SALE_END_TIME = endTime;
        emit AllowListSaleTimeChanged(startTime, endTime);
    }

    function changePublicSaleTime(uint256 startTime, uint256 endTime) public isModifier {
        PUBLIC_SALE_START_TIME = startTime;
        PUBLIC_SALE_END_TIME = endTime;
        emit PublicSaleTimeChanged(startTime, endTime);
    }

    function changeSignerwallet(address _signerWallet) public isModifier {
        _signerAddress = _signerWallet;
    }

    function setSaleModifier(address wallet) public isModifier {
        saleModifier = wallet;
    }

    function holderMintNew(uint256 quantity, bytes calldata signature) public payable  {
        require(whenHolderSaleIsOn()==true,"Holder sale is not ON");
        require(usedSigns[signature]==false,"signature already use");
        usedSigns[signature]=true;
        HOLDERS_MINTED+=quantity;
        holderMinted[msg.sender]+=quantity;
        require(checkHolderMinted()<=HOLDERS_LIMIT, "Mint would exceed limit");
        require(checkSign(signature,quantity)==_signerAddress, "Invalid Signature");
        if(holderFees[msg.sender]==false){
          require(msg.value == HOLDER_MINT_PRICE, "Send proper mint fees");
          holderFees[msg.sender] = true;
          payable(owner()).transfer(msg.value);  
        }
        require(totalSupply().add(quantity)<=MAX_SUPPLY, "Exceeding Max Limit");            
        _safeMint(msg.sender, quantity);
      
    }

    function allowListMint(uint256 quantity, bytes32[] calldata proof) public payable  {
       require(whenAllowlistSaleIsOn()==true,"whitelist sale not start yet" );
       require(isValid(proof, keccak256(abi.encodePacked(msg.sender))), "Not a part of Allowlist");
       require(msg.value == quantity * MINT_PRICE, "Send proper msg value");
       require(totalSupply().add(quantity)<=MAX_SUPPLY, "Exceeding Max Limit");
       ALLOWLIST_MINTED+=quantity;
       require(checkAllowlistMinted()<=availableForAllowlist(), "Will Exceed Allowlist Limit");
       allowlistMinted[msg.sender]+=quantity;
       payable(owner()).transfer(msg.value);
        _safeMint(msg.sender, quantity);
    }



    function publicMint(uint256 quantity) public payable  {
       require(whenPublicaleIsOn()==true,"public sale is not on");
       require(msg.value == quantity * MINT_PRICE, "Send proper msg value");
       require(totalSupply().add(quantity)<=MAX_SUPPLY, "Exceeding Max Limit");
       payable(owner()).transfer(msg.value);
        _safeMint(msg.sender, quantity);
     
    }

    function CollabMint(uint256 quantity, bytes calldata signature) public payable {
        require(usedSigns[signature]==false,"signature already use");
        usedSigns[signature]=true;
        collabMinted[msg.sender]+=quantity;
        require(checkCollabSign(signature,collabMinted[msg.sender])==_signerAddress, "Invalid Signature");
        require(msg.value == MINT_PRICE.mul(quantity), "Send proper mint fees");
        require(totalSupply().add(quantity)<=MAX_SUPPLY, "Exceeding Max Limit");            
        payable(owner()).transfer(msg.value);
       _safeMint(msg.sender, quantity);
    }



    function setBaseURI(string memory baseuri) public onlyOwner {
        baseURI_ = baseuri;
    }

    function checkSign(bytes calldata signature,uint256 quantity) private view returns (address) {
        return keccak256(
            abi.encodePacked(
               "\x19Ethereum Signed Message:\n32",
                keccak256(abi.encodePacked(totalSupply().add(quantity)))    
            )
        ).recover(signature);
    }

    function getsignInput(address wallet, uint256 amt) public pure returns(bytes32){
        return((keccak256(abi.encodePacked([keccak256(abi.encodePacked(wallet)), bytes32(amt)]))));
    }
    
    function checkCollabSign(bytes calldata signature, uint256 quantity) public view returns (address) {
        return keccak256(
            abi.encodePacked(
               "\x19Ethereum Signed Message:\n32",
                (getsignInput(msg.sender, quantity))  
            )
        ).recover(signature);
    }
    
    function isValid(bytes32[] memory proof, bytes32 leaf) public view returns (bool) {
        return MerkleProof.verify(proof, root, leaf);
    }

    function setRoot(bytes32 _root) public isModifier {
        root = _root;
    }
    function burn(uint256 tokenId) public {
        require(ownerOf(tokenId) == msg.sender,"you are not owner of token");
            _burn(tokenId);
    }

    function withdraw() public payable onlyOwner {
        payable(owner()).transfer(balanceOf(address(this)));
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"signerAddress_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTime","type":"uint256"}],"name":"AllowListSaleTimeChanged","type":"event"},{"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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTime","type":"uint256"}],"name":"HolderSaleTimeChanged","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":false,"internalType":"uint256","name":"startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTime","type":"uint256"}],"name":"PublicSaleTimeChanged","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":"ALLOWLIST_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ALLOWLIST_SALE_END_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ALLOWLIST_SALE_START_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CURRENT_ALLOWLIST_CAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"CollabMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"HOLDERS_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HOLDER_MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HOLDER_SALE_END_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HOLDER_SALE_START_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_SALE_END_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_SALE_START_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"allowListMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"availableForAllowlist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"}],"name":"changeHolderSaleTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"}],"name":"changePublicSaleTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signerWallet","type":"address"}],"name":"changeSignerwallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"checkAllowlistMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"checkAllowlistWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"checkCollabSign","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"checkCollabWalletMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkHolderMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"checkHolderWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"getsignInput","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"holderFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"holderMintNew","outputs":[],"stateMutability":"payable","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":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"bytes32","name":"leaf","type":"bytes32"}],"name":"isValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"root","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[],"name":"saleModifier","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"limit_","type":"uint256"}],"name":"setAllowlistCap","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":"bytes32","name":"_root","type":"bytes32"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setSaleModifier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"}],"name":"startAllowlistPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"usedSigns","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whenAllowlistSaleIsOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whenHolderSaleIsOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whenPublicaleIsOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60e0604052612ee0608090815250611e0160a090815250610fa060c090815250666a94d74f430000600f5567013fbe85edc90000601055636329c760601355636336f66060145563632f0d60601555636353f7606016553480156200006357600080fd5b50604051620060f8380380620060f8833981810160405281019062000089919062000456565b6040518060400160405280600a81526020017f4b524c20526163657273000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f526163657273000000000000000000000000000000000000000000000000000081525081600290805190602001906200010d9291906200038f565b508060039080519060200190620001269291906200038f565b5062000137620001d160201b60201c565b60008190555050506200015f62000153620001da60201b60201c565b620001e260201b60201c565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620001ca6040518060600160405280602d8152602001620060cb602d9139620002a860201b60201c565b50620005c3565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002b8620002d460201b60201c565b80600c9080519060200190620002d09291906200038f565b5050565b620002e4620001da60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200030a6200036560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000363576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200035a90620004af565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200039d9062000516565b90600052602060002090601f016020900481019282620003c157600085556200040d565b82601f10620003dc57805160ff19168380011785556200040d565b828001600101855582156200040d579182015b828111156200040c578251825591602001919060010190620003ef565b5b5090506200041c919062000420565b5090565b5b808211156200043b57600081600090555060010162000421565b5090565b6000815190506200045081620005a9565b92915050565b6000602082840312156200046f576200046e6200057b565b5b60006200047f848285016200043f565b91505092915050565b600062000497602083620004d1565b9150620004a48262000580565b602082019050919050565b60006020820190508181036000830152620004ca8162000488565b9050919050565b600082825260208201905092915050565b6000620004ef82620004f6565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600060028204905060018216806200052f57607f821691505b602082108114156200054657620005456200054c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b620005b481620004e2565b8114620005c057600080fd5b50565b60805160a05160c051615aae6200061d600039600061285b0152600081816117a901528181611d220152612962015260008181611548015281816119f101528181611a7c015281816126430152612dab0152615aae6000f3fe60806040526004361061038c5760003560e01c80638956c50a116101dc578063c87b56dd11610102578063dab5f340116100a0578063ebf0c7171161006f578063ebf0c71714610d1a578063ec8bda8e14610d45578063f2fde38b14610d61578063f448602c14610d8a5761038c565b8063dab5f34014610c60578063dcefac7f14610c89578063e5b6943d14610cb4578063e985e9c514610cdd5761038c565b8063d4dc8f28116100dc578063d4dc8f2814610ba2578063d5b3494114610bcd578063d908067c14610bf8578063da06d3c314610c235761038c565b8063c87b56dd14610b11578063c9b9519414610b4e578063ce32cf4414610b795761038c565b8063a04b84151161017a578063b5f645d311610149578063b5f645d314610a62578063b88d4fde14610a8d578063b8a20ed014610aa9578063c002d23d14610ae65761038c565b8063a04b8415146109c9578063a22cb465146109f2578063b3d319ce14610a1b578063b545857614610a375761038c565b80638c9ce8e5116101b65780638c9ce8e51461090b5780638da5cb5b1461093657806395d89b411461096157806396ce707d1461098c5761038c565b80638956c50a1461087a5780638c1d2082146108a55780638c2595fc146108e25761038c565b80633b3ac4f8116102c15780634db46b491161025f5780636352211e1161022e5780636352211e146107ac57806370a08231146107e9578063715018a61461082657806377c1f6a81461083d5761038c565b80634db46b491461070257806355f804b31461072d57806357a32bad1461075657806357bb5f52146107815761038c565b80633dd8dcf01161029b5780633dd8dcf01461066757806342842e0e1461069257806342966c68146106ae57806344e85c65146106d75761038c565b80633b3ac4f8146106095780633ccfd60b146106345780633db1fa961461063e5761038c565b806325f263871161032e5780632db11544116103085780632db11544146105695780632e630e771461058557806330a78724146105c257806332cb6b0c146105de5761038c565b806325f26387146104d65780632788c8d6146105135780632b4f3f2b1461053e5761038c565b8063095ea7b31161036a578063095ea7b31461043657806318160ddd1461045257806323b872dd1461047d57806323cfaa39146104995761038c565b806301ffc9a71461039157806306fdde03146103ce578063081812fc146103f9575b600080fd5b34801561039d57600080fd5b506103b860048036038101906103b3919061460e565b610db3565b6040516103c59190614e34565b60405180910390f35b3480156103da57600080fd5b506103e3610e45565b6040516103f09190614eaf565b60405180910390f35b34801561040557600080fd5b50610420600480360381019061041b919061475a565b610ed7565b60405161042d9190614dcd565b60405180910390f35b610450600480360381019061044b9190614545565b610f56565b005b34801561045e57600080fd5b5061046761109a565b6040516104749190615131565b60405180910390f35b6104976004803603810190610492919061442f565b6110b1565b005b3480156104a557600080fd5b506104c060048036038101906104bb91906146c8565b6113d6565b6040516104cd9190614e34565b60405180910390f35b3480156104e257600080fd5b506104fd60048036038101906104f891906143c2565b61140c565b60405161050a9190615131565b60405180910390f35b34801561051f57600080fd5b50610528611455565b6040516105359190614e34565b60405180910390f35b34801561054a57600080fd5b5061055361147f565b6040516105609190614e34565b60405180910390f35b610583600480360381019061057e919061475a565b6114a9565b005b34801561059157600080fd5b506105ac60048036038101906105a791906143c2565b61161d565b6040516105b99190614e34565b60405180910390f35b6105dc60048036038101906105d791906147e7565b61163d565b005b3480156105ea57600080fd5b506105f3611a7a565b6040516106009190615131565b60405180910390f35b34801561061557600080fd5b5061061e611a9e565b60405161062b9190615131565b60405180910390f35b61063c611aa4565b005b34801561064a57600080fd5b50610665600480360381019061066091906143c2565b611b04565b005b34801561067357600080fd5b5061067c611c15565b6040516106899190615131565b60405180910390f35b6106ac60048036038101906106a7919061442f565b611c1b565b005b3480156106ba57600080fd5b506106d560048036038101906106d0919061475a565b611c3b565b005b3480156106e357600080fd5b506106ec611cbd565b6040516106f99190615131565b60405180910390f35b34801561070e57600080fd5b50610717611d70565b6040516107249190614dcd565b60405180910390f35b34801561073957600080fd5b50610754600480360381019061074f9190614711565b611d96565b005b34801561076257600080fd5b5061076b611db8565b6040516107789190615131565b60405180910390f35b34801561078d57600080fd5b50610796611dbe565b6040516107a39190614e34565b60405180910390f35b3480156107b857600080fd5b506107d360048036038101906107ce919061475a565b611de8565b6040516107e09190614dcd565b60405180910390f35b3480156107f557600080fd5b50610810600480360381019061080b91906143c2565b611dfa565b60405161081d9190615131565b60405180910390f35b34801561083257600080fd5b5061083b611eb3565b005b34801561084957600080fd5b50610864600480360381019061085f9190614668565b611ec7565b6040516108719190614dcd565b60405180910390f35b34801561088657600080fd5b5061088f611f58565b60405161089c9190615131565b60405180910390f35b3480156108b157600080fd5b506108cc60048036038101906108c79190614545565b611f62565b6040516108d99190614e4f565b60405180910390f35b3480156108ee57600080fd5b50610909600480360381019061090491906143c2565b611fd0565b005b34801561091757600080fd5b506109206120e1565b60405161092d9190615131565b60405180910390f35b34801561094257600080fd5b5061094b6120e7565b6040516109589190614dcd565b60405180910390f35b34801561096d57600080fd5b50610976612111565b6040516109839190614eaf565b60405180910390f35b34801561099857600080fd5b506109b360048036038101906109ae91906143c2565b6121a3565b6040516109c09190615131565b60405180910390f35b3480156109d557600080fd5b506109f060048036038101906109eb9190614847565b6121ec565b005b3480156109fe57600080fd5b50610a196004803603810190610a149190614505565b612304565b005b610a356004803603810190610a3091906147e7565b61240f565b005b348015610a4357600080fd5b50610a4c61271a565b604051610a599190615131565b60405180910390f35b348015610a6e57600080fd5b50610a77612720565b604051610a849190615131565b60405180910390f35b610aa76004803603810190610aa29190614482565b61272a565b005b348015610ab557600080fd5b50610ad06004803603810190610acb9190614585565b61279d565b604051610add9190614e34565b60405180910390f35b348015610af257600080fd5b50610afb6127b4565b604051610b089190615131565b60405180910390f35b348015610b1d57600080fd5b50610b386004803603810190610b33919061475a565b6127ba565b604051610b459190614eaf565b60405180910390f35b348015610b5a57600080fd5b50610b63612859565b604051610b709190615131565b60405180910390f35b348015610b8557600080fd5b50610ba06004803603810190610b9b919061475a565b61287d565b005b348015610bae57600080fd5b50610bb7612954565b604051610bc49190615131565b60405180910390f35b348015610bd957600080fd5b50610be261295a565b604051610bef9190615131565b60405180910390f35b348015610c0457600080fd5b50610c0d612960565b604051610c1a9190615131565b60405180910390f35b348015610c2f57600080fd5b50610c4a6004803603810190610c4591906143c2565b612984565b604051610c579190615131565b60405180910390f35b348015610c6c57600080fd5b50610c876004803603810190610c8291906145e1565b6129cd565b005b348015610c9557600080fd5b50610c9e612aa4565b604051610cab9190615131565b60405180910390f35b348015610cc057600080fd5b50610cdb6004803603810190610cd69190614847565b612aaa565b005b348015610ce957600080fd5b50610d046004803603810190610cff91906143ef565b612bc2565b604051610d119190614e34565b60405180910390f35b348015610d2657600080fd5b50610d2f612c56565b604051610d3c9190614e4f565b60405180910390f35b610d5f6004803603810190610d5a9190614787565b612c5c565b005b348015610d6d57600080fd5b50610d886004803603810190610d8391906143c2565b612f42565b005b348015610d9657600080fd5b50610db16004803603810190610dac9190614847565b612fc6565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e0e57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e3e5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610e5490615454565b80601f0160208091040260200160405190810160405280929190818152602001828054610e8090615454565b8015610ecd5780601f10610ea257610100808354040283529160200191610ecd565b820191906000526020600020905b815481529060010190602001808311610eb057829003601f168201915b5050505050905090565b6000610ee2826130de565b610f18576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f6182611de8565b90508073ffffffffffffffffffffffffffffffffffffffff16610f8261313d565b73ffffffffffffffffffffffffffffffffffffffff1614610fe557610fae81610fa961313d565b612bc2565b610fe4576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006110a4613145565b6001546000540303905090565b60006110bc8261314e565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611123576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061112f8461321c565b91509150611145818761114061313d565b613243565b6111915761115a8661115561313d565b612bc2565b611190576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156111f8576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112058686866001613287565b801561121057600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506112de856112ba88888761328d565b7c0200000000000000000000000000000000000000000000000000000000176132b5565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415611366576000600185019050600060046000838152602001908152602001600020541415611364576000548114611363578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46113ce86868660016132e0565b505050505050565b600d818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900460ff1681565b6000601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600060135442118015611469575060145442105b15611477576001905061147c565b600090505b90565b600060155442118015611493575060165442105b156114a157600190506114a6565b600090505b90565b600115156114b5611dbe565b1515146114f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ee90614ff1565b60405180910390fd5b6010548161150591906152f9565b3414611546576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153d90614fb1565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006115818261157361109a565b6132e690919063ffffffff16565b11156115c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b990615011565b60405180910390fd5b6115ca6120e7565b73ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f1935050505015801561160f573d6000803e3d6000fd5b5061161a33826132fc565b50565b601c6020528060005260406000206000915054906101000a900460ff1681565b60011515611649611455565b15151461168b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168290614f31565b60405180910390fd5b60001515600d83836040516116a1929190614d4f565b908152602001604051809103902060009054906101000a900460ff161515146116ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f6906150b1565b60405180910390fd5b6001600d8383604051611713929190614d4f565b908152602001604051809103902060006101000a81548160ff021916908315150217905550826011600082825461174a91906152a3565b9250508190555082601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117a091906152a3565b925050819055507f00000000000000000000000000000000000000000000000000000000000000006117d0612720565b1115611811576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180890614f91565b60405180910390fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661185583838661331a565b73ffffffffffffffffffffffffffffffffffffffff16146118ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a290615071565b60405180910390fd5b60001515601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514156119ef57600f543414611948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193f90615111565b60405180910390fd5b6001601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506119a86120e7565b73ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156119ed573d6000803e3d6000fd5b505b7f0000000000000000000000000000000000000000000000000000000000000000611a2a84611a1c61109a565b6132e690919063ffffffff16565b1115611a6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6290615011565b60405180910390fd5b611a7533846132fc565b505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60155481565b611aac6133e1565b611ab46120e7565b73ffffffffffffffffffffffffffffffffffffffff166108fc611ad630611dfa565b9081150290604051600060405180830381858888f19350505050158015611b01573d6000803e3d6000fd5b50565b611b0c6120e7565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611b925750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611bd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc890614ef1565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60165481565b611c368383836040518060200160405280600081525061272a565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16611c5b82611de8565b73ffffffffffffffffffffffffffffffffffffffff1614611cb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca8906150d1565b60405180910390fd5b611cba8161345f565b50565b600060011515611ccb61147f565b151514611d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d04906150f1565b60405180910390fd5b601454421115611d6757611d60611d4f6011547f000000000000000000000000000000000000000000000000000000000000000061346d90919063ffffffff16565b600e546132e690919063ffffffff16565b9050611d6d565b600e5490505b90565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611d9e6133e1565b80600c9080519060200190611db4929190614077565b5050565b600e5481565b600060175442118015611dd2575060185442105b15611de05760019050611de5565b600090505b90565b6000611df38261314e565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e62576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611ebb6133e1565b611ec56000613483565b565b6000611f4f84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611f1b3385611f62565b604051602001611f2b9190614d8c565b6040516020818303038152906040528051906020012061354990919063ffffffff16565b90509392505050565b6000601254905090565b6000604051806040016040528084604051602001611f809190614d19565b6040516020818303038152906040528051906020012081526020018360001b815250604051602001611fb29190614d34565b60405160208183030381529060405280519060200120905092915050565b611fd86120e7565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061205e5750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61209d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209490614ef1565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60145481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461212090615454565b80601f016020809104026020016040519081016040528092919081815260200182805461214c90615454565b80156121995780601f1061216e57610100808354040283529160200191612199565b820191906000526020600020905b81548152906001019060200180831161217c57829003601f168201915b5050505050905090565b6000601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6121f46120e7565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061227a5750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6122b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b090614ef1565b60405180910390fd5b81601581905550806016819055507fda999b11e6cfa9a612d58a7d65d1ea29003c9bf56113d2def65dbed3c5e6948b82826040516122f892919061514c565b60405180910390a15050565b806007600061231161313d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166123be61313d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124039190614e34565b60405180910390a35050565b60001515600d8383604051612425929190614d4f565b908152602001604051809103902060009054906101000a900460ff16151514612483576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247a906150b1565b60405180910390fd5b6001600d8383604051612497929190614d4f565b908152602001604051809103902060006101000a81548160ff02191690831515021790555082601b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461250b91906152a3565b92505081905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166125958383601b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ec7565b73ffffffffffffffffffffffffffffffffffffffff16146125eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e290615071565b60405180910390fd5b6126008360105461357090919063ffffffff16565b3414612641576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263890615111565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000061267c8461266e61109a565b6132e690919063ffffffff16565b11156126bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b490615011565b60405180910390fd5b6126c56120e7565b73ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f1935050505015801561270a573d6000803e3d6000fd5b5061271533846132fc565b505050565b60135481565b6000601154905090565b6127358484846110b1565b60008373ffffffffffffffffffffffffffffffffffffffff163b146127975761276084848484613586565b612796576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60006127ac83600954846136e6565b905092915050565b60105481565b60606127c5826130de565b6127fb576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006128056136fd565b90506000815114156128265760405180602001604052806000815250612851565b806128308461378f565b604051602001612841929190614d68565b6040516020818303038152906040525b915050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6128856120e7565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061290b5750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61294a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294190614ef1565b60405180910390fd5b80600e8190555050565b600f5481565b60185481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6129d56120e7565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612a5b5750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9190614ef1565b60405180910390fd5b8060098190555050565b60175481565b612ab26120e7565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612b385750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612b77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6e90614ef1565b60405180910390fd5b81601781905550806018819055507f53bb3f0edf5961602b6c985f8d776a7241ad4458cb383fe8233e64154647d08d8282604051612bb692919061514c565b60405180910390a15050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60095481565b60011515612c6861147f565b151514612caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca1906150f1565b60405180910390fd5b612d1b828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505033604051602001612d009190614d19565b6040516020818303038152906040528051906020012061279d565b612d5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5190615031565b60405180910390fd5b60105483612d6891906152f9565b3414612da9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612da090614fb1565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000612de484612dd661109a565b6132e690919063ffffffff16565b1115612e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1c90615011565b60405180910390fd5b8260126000828254612e3791906152a3565b92505081905550612e46611cbd565b612e4e611f58565b1115612e8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e8690614f71565b60405180910390fd5b82601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ede91906152a3565b92505081905550612eed6120e7565b73ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015612f32573d6000803e3d6000fd5b50612f3d33846132fc565b505050565b612f4a6133e1565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612fba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb190614f51565b60405180910390fd5b612fc381613483565b50565b612fce6120e7565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806130545750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b613093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308a90614ef1565b60405180910390fd5b81601381905550806014819055507f8971f096c02bd03d56cc34d78717a488d9e6627c68998422ad503a7d575f758682826040516130d292919061514c565b60405180910390a15050565b6000816130e9613145565b111580156130f8575060005482105b8015613136575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b6000808290508061315d613145565b116131e5576000548110156131e45760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156131e2575b60008114156131d85760046000836001900393508381526020019081526020016000205490506131ad565b8092505050613217565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86132a48686846137e8565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600081836132f491906152a3565b905092915050565b6133168282604051806020016040528060008152506137f1565b5050565b60006133d884848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061337e8461337061109a565b6132e690919063ffffffff16565b60405160200161338e9190614db2565b604051602081830303815290604052805190602001206040516020016133b49190614d8c565b6040516020818303038152906040528051906020012061354990919063ffffffff16565b90509392505050565b6133e961388e565b73ffffffffffffffffffffffffffffffffffffffff166134076120e7565b73ffffffffffffffffffffffffffffffffffffffff161461345d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161345490615091565b60405180910390fd5b565b61346a816000613896565b50565b6000818361347b9190615353565b905092915050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008060006135588585613aea565b9150915061356581613b3c565b819250505092915050565b6000818361357e91906152f9565b905092915050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026135ac61313d565b8786866040518563ffffffff1660e01b81526004016135ce9493929190614de8565b602060405180830381600087803b1580156135e857600080fd5b505af192505050801561361957506040513d601f19601f82011682018060405250810190613616919061463b565b60015b613693573d8060008114613649576040519150601f19603f3d011682016040523d82523d6000602084013e61364e565b606091505b5060008151141561368b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6000826136f38584613d11565b1490509392505050565b6060600c805461370c90615454565b80601f016020809104026020016040519081016040528092919081815260200182805461373890615454565b80156137855780601f1061375a57610100808354040283529160200191613785565b820191906000526020600020905b81548152906001019060200180831161376857829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b6001156137d357600184039350600a81066030018453600a81049050806137ce576137d3565b6137a8565b50828103602084039350808452505050919050565b60009392505050565b6137fb8383613d86565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461388957600080549050600083820390505b61383b6000868380600101945086613586565b613871576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061382857816000541461388657600080fd5b50505b505050565b600033905090565b60006138a18361314e565b905060008190506000806138b48661321c565b91509150841561391d576138d081846138cb61313d565b613243565b61391c576138e5836138e061313d565b612bc2565b61391b576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b61392b836000886001613287565b801561393657600082555b600160806001901b03600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506139de8361399b8560008861328d565b7c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000017176132b5565b600460008881526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000085161415613a66576000600187019050600060046000838152602001908152602001600020541415613a64576000548114613a63578460046000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613ad08360008860016132e0565b600160008154809291906001019190505550505050505050565b600080604183511415613b2c5760008060006020860151925060408601519150606086015160001a9050613b2087828585613f43565b94509450505050613b35565b60006002915091505b9250929050565b60006004811115613b5057613b4f615567565b5b816004811115613b6357613b62615567565b5b1415613b6e57613d0e565b60016004811115613b8257613b81615567565b5b816004811115613b9557613b94615567565b5b1415613bd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bcd90614ed1565b60405180910390fd5b60026004811115613bea57613be9615567565b5b816004811115613bfd57613bfc615567565b5b1415613c3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c3590614f11565b60405180910390fd5b60036004811115613c5257613c51615567565b5b816004811115613c6557613c64615567565b5b1415613ca6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c9d90614fd1565b60405180910390fd5b600480811115613cb957613cb8615567565b5b816004811115613ccc57613ccb615567565b5b1415613d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d0490615051565b60405180910390fd5b5b50565b60008082905060005b8451811015613d7b576000858281518110613d3857613d376155c5565b5b60200260200101519050808311613d5a57613d538382614050565b9250613d67565b613d648184614050565b92505b508080613d73906154b7565b915050613d1a565b508091505092915050565b6000805490506000821415613dc7576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613dd46000848385613287565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550613e4b83613e3c600086600061328d565b613e4585614067565b176132b5565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114613eec57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613eb1565b506000821415613f28576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050613f3e60008483856132e0565b505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613f7e576000600391509150614047565b601b8560ff1614158015613f965750601c8560ff1614155b15613fa8576000600491509150614047565b600060018787878760405160008152602001604052604051613fcd9493929190614e6a565b6020604051602081039080840390855afa158015613fef573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561403e57600060019250925050614047565b80600092509250505b94509492505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b82805461408390615454565b90600052602060002090601f0160209004810192826140a557600085556140ec565b82601f106140be57805160ff19168380011785556140ec565b828001600101855582156140ec579182015b828111156140eb5782518255916020019190600101906140d0565b5b5090506140f991906140fd565b5090565b5b808211156141165760008160009055506001016140fe565b5090565b600061412d6141288461519a565b615175565b905080838252602082019050828560208602820111156141505761414f61562d565b5b60005b85811015614180578161416688826142bc565b845260208401935060208301925050600181019050614153565b5050509392505050565b600061419d614198846151c6565b615175565b9050828152602081018484840111156141b9576141b8615632565b5b6141c4848285615412565b509392505050565b60006141df6141da846151f7565b615175565b9050828152602081018484840111156141fb576141fa615632565b5b614206848285615412565b509392505050565b60008135905061421d81615a05565b92915050565b60008083601f84011261423957614238615628565b5b8235905067ffffffffffffffff81111561425657614255615623565b5b6020830191508360208202830111156142725761427161562d565b5b9250929050565b600082601f83011261428e5761428d615628565b5b813561429e84826020860161411a565b91505092915050565b6000813590506142b681615a1c565b92915050565b6000813590506142cb81615a33565b92915050565b6000813590506142e081615a4a565b92915050565b6000815190506142f581615a4a565b92915050565b60008083601f84011261431157614310615628565b5b8235905067ffffffffffffffff81111561432e5761432d615623565b5b60208301915083600182028301111561434a5761434961562d565b5b9250929050565b600082601f83011261436657614365615628565b5b813561437684826020860161418a565b91505092915050565b600082601f83011261439457614393615628565b5b81356143a48482602086016141cc565b91505092915050565b6000813590506143bc81615a61565b92915050565b6000602082840312156143d8576143d761563c565b5b60006143e68482850161420e565b91505092915050565b600080604083850312156144065761440561563c565b5b60006144148582860161420e565b92505060206144258582860161420e565b9150509250929050565b6000806000606084860312156144485761444761563c565b5b60006144568682870161420e565b93505060206144678682870161420e565b9250506040614478868287016143ad565b9150509250925092565b6000806000806080858703121561449c5761449b61563c565b5b60006144aa8782880161420e565b94505060206144bb8782880161420e565b93505060406144cc878288016143ad565b925050606085013567ffffffffffffffff8111156144ed576144ec615637565b5b6144f987828801614351565b91505092959194509250565b6000806040838503121561451c5761451b61563c565b5b600061452a8582860161420e565b925050602061453b858286016142a7565b9150509250929050565b6000806040838503121561455c5761455b61563c565b5b600061456a8582860161420e565b925050602061457b858286016143ad565b9150509250929050565b6000806040838503121561459c5761459b61563c565b5b600083013567ffffffffffffffff8111156145ba576145b9615637565b5b6145c685828601614279565b92505060206145d7858286016142bc565b9150509250929050565b6000602082840312156145f7576145f661563c565b5b6000614605848285016142bc565b91505092915050565b6000602082840312156146245761462361563c565b5b6000614632848285016142d1565b91505092915050565b6000602082840312156146515761465061563c565b5b600061465f848285016142e6565b91505092915050565b6000806000604084860312156146815761468061563c565b5b600084013567ffffffffffffffff81111561469f5761469e615637565b5b6146ab868287016142fb565b935093505060206146be868287016143ad565b9150509250925092565b6000602082840312156146de576146dd61563c565b5b600082013567ffffffffffffffff8111156146fc576146fb615637565b5b61470884828501614351565b91505092915050565b6000602082840312156147275761472661563c565b5b600082013567ffffffffffffffff81111561474557614744615637565b5b6147518482850161437f565b91505092915050565b6000602082840312156147705761476f61563c565b5b600061477e848285016143ad565b91505092915050565b6000806000604084860312156147a05761479f61563c565b5b60006147ae868287016143ad565b935050602084013567ffffffffffffffff8111156147cf576147ce615637565b5b6147db86828701614223565b92509250509250925092565b600080600060408486031215614800576147ff61563c565b5b600061480e868287016143ad565b935050602084013567ffffffffffffffff81111561482f5761482e615637565b5b61483b868287016142fb565b92509250509250925092565b6000806040838503121561485e5761485d61563c565b5b600061486c858286016143ad565b925050602061487d858286016143ad565b9150509250929050565b6000614893838361493a565b60208301905092915050565b6148a881615387565b82525050565b6148bf6148ba82615387565b615500565b82525050565b6148ce81615232565b6148d88184615260565b92506148e382615228565b8060005b838110156149145781516148fb8782614887565b965061490683615253565b9250506001810190506148e7565b505050505050565b61492581615399565b82525050565b614934816153a5565b82525050565b614943816153a5565b82525050565b61495a614955826153a5565b615512565b82525050565b600061496c838561527c565b9350614979838584615412565b82840190509392505050565b60006149908261523d565b61499a818561526b565b93506149aa818560208601615421565b6149b381615641565b840191505092915050565b60006149c982615248565b6149d38185615287565b93506149e3818560208601615421565b6149ec81615641565b840191505092915050565b6000614a0282615248565b614a0c8185615298565b9350614a1c818560208601615421565b80840191505092915050565b6000614a35601883615287565b9150614a408261565f565b602082019050919050565b6000614a58600e83615287565b9150614a6382615688565b602082019050919050565b6000614a7b601f83615287565b9150614a86826156b1565b602082019050919050565b6000614a9e601c83615298565b9150614aa9826156da565b601c82019050919050565b6000614ac1601583615287565b9150614acc82615703565b602082019050919050565b6000614ae4602683615287565b9150614aef8261572c565b604082019050919050565b6000614b07601b83615287565b9150614b128261577b565b602082019050919050565b6000614b2a601783615287565b9150614b35826157a4565b602082019050919050565b6000614b4d601583615287565b9150614b58826157cd565b602082019050919050565b6000614b70602283615287565b9150614b7b826157f6565b604082019050919050565b6000614b93601583615287565b9150614b9e82615845565b602082019050919050565b6000614bb6601383615287565b9150614bc18261586e565b602082019050919050565b6000614bd9601783615287565b9150614be482615897565b602082019050919050565b6000614bfc602283615287565b9150614c07826158c0565b604082019050919050565b6000614c1f601183615287565b9150614c2a8261590f565b602082019050919050565b6000614c42602083615287565b9150614c4d82615938565b602082019050919050565b6000614c65601583615287565b9150614c7082615961565b602082019050919050565b6000614c88601a83615287565b9150614c938261598a565b602082019050919050565b6000614cab601c83615287565b9150614cb6826159b3565b602082019050919050565b6000614cce601583615287565b9150614cd9826159dc565b602082019050919050565b614ced816153fb565b82525050565b614d04614cff826153fb565b61552e565b82525050565b614d1381615405565b82525050565b6000614d2582846148ae565b60148201915081905092915050565b6000614d4082846148c5565b60408201915081905092915050565b6000614d5c828486614960565b91508190509392505050565b6000614d7482856149f7565b9150614d8082846149f7565b91508190509392505050565b6000614d9782614a91565b9150614da38284614949565b60208201915081905092915050565b6000614dbe8284614cf3565b60208201915081905092915050565b6000602082019050614de2600083018461489f565b92915050565b6000608082019050614dfd600083018761489f565b614e0a602083018661489f565b614e176040830185614ce4565b8181036060830152614e298184614985565b905095945050505050565b6000602082019050614e49600083018461491c565b92915050565b6000602082019050614e64600083018461492b565b92915050565b6000608082019050614e7f600083018761492b565b614e8c6020830186614d0a565b614e99604083018561492b565b614ea6606083018461492b565b95945050505050565b60006020820190508181036000830152614ec981846149be565b905092915050565b60006020820190508181036000830152614eea81614a28565b9050919050565b60006020820190508181036000830152614f0a81614a4b565b9050919050565b60006020820190508181036000830152614f2a81614a6e565b9050919050565b60006020820190508181036000830152614f4a81614ab4565b9050919050565b60006020820190508181036000830152614f6a81614ad7565b9050919050565b60006020820190508181036000830152614f8a81614afa565b9050919050565b60006020820190508181036000830152614faa81614b1d565b9050919050565b60006020820190508181036000830152614fca81614b40565b9050919050565b60006020820190508181036000830152614fea81614b63565b9050919050565b6000602082019050818103600083015261500a81614b86565b9050919050565b6000602082019050818103600083015261502a81614ba9565b9050919050565b6000602082019050818103600083015261504a81614bcc565b9050919050565b6000602082019050818103600083015261506a81614bef565b9050919050565b6000602082019050818103600083015261508a81614c12565b9050919050565b600060208201905081810360008301526150aa81614c35565b9050919050565b600060208201905081810360008301526150ca81614c58565b9050919050565b600060208201905081810360008301526150ea81614c7b565b9050919050565b6000602082019050818103600083015261510a81614c9e565b9050919050565b6000602082019050818103600083015261512a81614cc1565b9050919050565b60006020820190506151466000830184614ce4565b92915050565b60006040820190506151616000830185614ce4565b61516e6020830184614ce4565b9392505050565b600061517f615190565b905061518b8282615486565b919050565b6000604051905090565b600067ffffffffffffffff8211156151b5576151b46155f4565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156151e1576151e06155f4565b5b6151ea82615641565b9050602081019050919050565b600067ffffffffffffffff821115615212576152116155f4565b5b61521b82615641565b9050602081019050919050565b6000819050919050565b600060029050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006152ae826153fb565b91506152b9836153fb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156152ee576152ed615538565b5b828201905092915050565b6000615304826153fb565b915061530f836153fb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561534857615347615538565b5b828202905092915050565b600061535e826153fb565b9150615369836153fb565b92508282101561537c5761537b615538565b5b828203905092915050565b6000615392826153db565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561543f578082015181840152602081019050615424565b8381111561544e576000848401525b50505050565b6000600282049050600182168061546c57607f821691505b602082108114156154805761547f615596565b5b50919050565b61548f82615641565b810181811067ffffffffffffffff821117156154ae576154ad6155f4565b5b80604052505050565b60006154c2826153fb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156154f5576154f4615538565b5b600182019050919050565b600061550b8261551c565b9050919050565b6000819050919050565b600061552782615652565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f596f752063616e7420646f206974000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f486f6c6465722073616c65206973206e6f74204f4e0000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f57696c6c2045786365656420416c6c6f776c697374204c696d69740000000000600082015250565b7f4d696e7420776f756c6420657863656564206c696d6974000000000000000000600082015250565b7f53656e642070726f706572206d73672076616c75650000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f7075626c69632073616c65206973206e6f74206f6e0000000000000000000000600082015250565b7f457863656564696e67204d6178204c696d697400000000000000000000000000600082015250565b7f4e6f7420612070617274206f6620416c6c6f776c697374000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964205369676e6174757265000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f7369676e617475726520616c7265616479207573650000000000000000000000600082015250565b7f796f7520617265206e6f74206f776e6572206f6620746f6b656e000000000000600082015250565b7f77686974656c6973742073616c65206e6f742073746172742079657400000000600082015250565b7f53656e642070726f706572206d696e7420666565730000000000000000000000600082015250565b615a0e81615387565b8114615a1957600080fd5b50565b615a2581615399565b8114615a3057600080fd5b50565b615a3c816153a5565b8114615a4757600080fd5b50565b615a53816153af565b8114615a5e57600080fd5b50565b615a6a816153fb565b8114615a7557600080fd5b5056fea26469706673582212208bab117b1c5595b5d93780844a0d33b3b5573203d071cfac33d321740a7da77164736f6c6343000807003368747470733a2f2f6170692d6e66742e6b617274726163696e676c65616775652e636f6d2f6170692f6e66742f0000000000000000000000000bc28ed5095394177724c5cfd171c1d94249f837

Deployed Bytecode

0x60806040526004361061038c5760003560e01c80638956c50a116101dc578063c87b56dd11610102578063dab5f340116100a0578063ebf0c7171161006f578063ebf0c71714610d1a578063ec8bda8e14610d45578063f2fde38b14610d61578063f448602c14610d8a5761038c565b8063dab5f34014610c60578063dcefac7f14610c89578063e5b6943d14610cb4578063e985e9c514610cdd5761038c565b8063d4dc8f28116100dc578063d4dc8f2814610ba2578063d5b3494114610bcd578063d908067c14610bf8578063da06d3c314610c235761038c565b8063c87b56dd14610b11578063c9b9519414610b4e578063ce32cf4414610b795761038c565b8063a04b84151161017a578063b5f645d311610149578063b5f645d314610a62578063b88d4fde14610a8d578063b8a20ed014610aa9578063c002d23d14610ae65761038c565b8063a04b8415146109c9578063a22cb465146109f2578063b3d319ce14610a1b578063b545857614610a375761038c565b80638c9ce8e5116101b65780638c9ce8e51461090b5780638da5cb5b1461093657806395d89b411461096157806396ce707d1461098c5761038c565b80638956c50a1461087a5780638c1d2082146108a55780638c2595fc146108e25761038c565b80633b3ac4f8116102c15780634db46b491161025f5780636352211e1161022e5780636352211e146107ac57806370a08231146107e9578063715018a61461082657806377c1f6a81461083d5761038c565b80634db46b491461070257806355f804b31461072d57806357a32bad1461075657806357bb5f52146107815761038c565b80633dd8dcf01161029b5780633dd8dcf01461066757806342842e0e1461069257806342966c68146106ae57806344e85c65146106d75761038c565b80633b3ac4f8146106095780633ccfd60b146106345780633db1fa961461063e5761038c565b806325f263871161032e5780632db11544116103085780632db11544146105695780632e630e771461058557806330a78724146105c257806332cb6b0c146105de5761038c565b806325f26387146104d65780632788c8d6146105135780632b4f3f2b1461053e5761038c565b8063095ea7b31161036a578063095ea7b31461043657806318160ddd1461045257806323b872dd1461047d57806323cfaa39146104995761038c565b806301ffc9a71461039157806306fdde03146103ce578063081812fc146103f9575b600080fd5b34801561039d57600080fd5b506103b860048036038101906103b3919061460e565b610db3565b6040516103c59190614e34565b60405180910390f35b3480156103da57600080fd5b506103e3610e45565b6040516103f09190614eaf565b60405180910390f35b34801561040557600080fd5b50610420600480360381019061041b919061475a565b610ed7565b60405161042d9190614dcd565b60405180910390f35b610450600480360381019061044b9190614545565b610f56565b005b34801561045e57600080fd5b5061046761109a565b6040516104749190615131565b60405180910390f35b6104976004803603810190610492919061442f565b6110b1565b005b3480156104a557600080fd5b506104c060048036038101906104bb91906146c8565b6113d6565b6040516104cd9190614e34565b60405180910390f35b3480156104e257600080fd5b506104fd60048036038101906104f891906143c2565b61140c565b60405161050a9190615131565b60405180910390f35b34801561051f57600080fd5b50610528611455565b6040516105359190614e34565b60405180910390f35b34801561054a57600080fd5b5061055361147f565b6040516105609190614e34565b60405180910390f35b610583600480360381019061057e919061475a565b6114a9565b005b34801561059157600080fd5b506105ac60048036038101906105a791906143c2565b61161d565b6040516105b99190614e34565b60405180910390f35b6105dc60048036038101906105d791906147e7565b61163d565b005b3480156105ea57600080fd5b506105f3611a7a565b6040516106009190615131565b60405180910390f35b34801561061557600080fd5b5061061e611a9e565b60405161062b9190615131565b60405180910390f35b61063c611aa4565b005b34801561064a57600080fd5b50610665600480360381019061066091906143c2565b611b04565b005b34801561067357600080fd5b5061067c611c15565b6040516106899190615131565b60405180910390f35b6106ac60048036038101906106a7919061442f565b611c1b565b005b3480156106ba57600080fd5b506106d560048036038101906106d0919061475a565b611c3b565b005b3480156106e357600080fd5b506106ec611cbd565b6040516106f99190615131565b60405180910390f35b34801561070e57600080fd5b50610717611d70565b6040516107249190614dcd565b60405180910390f35b34801561073957600080fd5b50610754600480360381019061074f9190614711565b611d96565b005b34801561076257600080fd5b5061076b611db8565b6040516107789190615131565b60405180910390f35b34801561078d57600080fd5b50610796611dbe565b6040516107a39190614e34565b60405180910390f35b3480156107b857600080fd5b506107d360048036038101906107ce919061475a565b611de8565b6040516107e09190614dcd565b60405180910390f35b3480156107f557600080fd5b50610810600480360381019061080b91906143c2565b611dfa565b60405161081d9190615131565b60405180910390f35b34801561083257600080fd5b5061083b611eb3565b005b34801561084957600080fd5b50610864600480360381019061085f9190614668565b611ec7565b6040516108719190614dcd565b60405180910390f35b34801561088657600080fd5b5061088f611f58565b60405161089c9190615131565b60405180910390f35b3480156108b157600080fd5b506108cc60048036038101906108c79190614545565b611f62565b6040516108d99190614e4f565b60405180910390f35b3480156108ee57600080fd5b50610909600480360381019061090491906143c2565b611fd0565b005b34801561091757600080fd5b506109206120e1565b60405161092d9190615131565b60405180910390f35b34801561094257600080fd5b5061094b6120e7565b6040516109589190614dcd565b60405180910390f35b34801561096d57600080fd5b50610976612111565b6040516109839190614eaf565b60405180910390f35b34801561099857600080fd5b506109b360048036038101906109ae91906143c2565b6121a3565b6040516109c09190615131565b60405180910390f35b3480156109d557600080fd5b506109f060048036038101906109eb9190614847565b6121ec565b005b3480156109fe57600080fd5b50610a196004803603810190610a149190614505565b612304565b005b610a356004803603810190610a3091906147e7565b61240f565b005b348015610a4357600080fd5b50610a4c61271a565b604051610a599190615131565b60405180910390f35b348015610a6e57600080fd5b50610a77612720565b604051610a849190615131565b60405180910390f35b610aa76004803603810190610aa29190614482565b61272a565b005b348015610ab557600080fd5b50610ad06004803603810190610acb9190614585565b61279d565b604051610add9190614e34565b60405180910390f35b348015610af257600080fd5b50610afb6127b4565b604051610b089190615131565b60405180910390f35b348015610b1d57600080fd5b50610b386004803603810190610b33919061475a565b6127ba565b604051610b459190614eaf565b60405180910390f35b348015610b5a57600080fd5b50610b63612859565b604051610b709190615131565b60405180910390f35b348015610b8557600080fd5b50610ba06004803603810190610b9b919061475a565b61287d565b005b348015610bae57600080fd5b50610bb7612954565b604051610bc49190615131565b60405180910390f35b348015610bd957600080fd5b50610be261295a565b604051610bef9190615131565b60405180910390f35b348015610c0457600080fd5b50610c0d612960565b604051610c1a9190615131565b60405180910390f35b348015610c2f57600080fd5b50610c4a6004803603810190610c4591906143c2565b612984565b604051610c579190615131565b60405180910390f35b348015610c6c57600080fd5b50610c876004803603810190610c8291906145e1565b6129cd565b005b348015610c9557600080fd5b50610c9e612aa4565b604051610cab9190615131565b60405180910390f35b348015610cc057600080fd5b50610cdb6004803603810190610cd69190614847565b612aaa565b005b348015610ce957600080fd5b50610d046004803603810190610cff91906143ef565b612bc2565b604051610d119190614e34565b60405180910390f35b348015610d2657600080fd5b50610d2f612c56565b604051610d3c9190614e4f565b60405180910390f35b610d5f6004803603810190610d5a9190614787565b612c5c565b005b348015610d6d57600080fd5b50610d886004803603810190610d8391906143c2565b612f42565b005b348015610d9657600080fd5b50610db16004803603810190610dac9190614847565b612fc6565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e0e57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e3e5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610e5490615454565b80601f0160208091040260200160405190810160405280929190818152602001828054610e8090615454565b8015610ecd5780601f10610ea257610100808354040283529160200191610ecd565b820191906000526020600020905b815481529060010190602001808311610eb057829003601f168201915b5050505050905090565b6000610ee2826130de565b610f18576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f6182611de8565b90508073ffffffffffffffffffffffffffffffffffffffff16610f8261313d565b73ffffffffffffffffffffffffffffffffffffffff1614610fe557610fae81610fa961313d565b612bc2565b610fe4576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006110a4613145565b6001546000540303905090565b60006110bc8261314e565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611123576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061112f8461321c565b91509150611145818761114061313d565b613243565b6111915761115a8661115561313d565b612bc2565b611190576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156111f8576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112058686866001613287565b801561121057600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506112de856112ba88888761328d565b7c0200000000000000000000000000000000000000000000000000000000176132b5565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415611366576000600185019050600060046000838152602001908152602001600020541415611364576000548114611363578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46113ce86868660016132e0565b505050505050565b600d818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900460ff1681565b6000601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600060135442118015611469575060145442105b15611477576001905061147c565b600090505b90565b600060155442118015611493575060165442105b156114a157600190506114a6565b600090505b90565b600115156114b5611dbe565b1515146114f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ee90614ff1565b60405180910390fd5b6010548161150591906152f9565b3414611546576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153d90614fb1565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000002ee06115818261157361109a565b6132e690919063ffffffff16565b11156115c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b990615011565b60405180910390fd5b6115ca6120e7565b73ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f1935050505015801561160f573d6000803e3d6000fd5b5061161a33826132fc565b50565b601c6020528060005260406000206000915054906101000a900460ff1681565b60011515611649611455565b15151461168b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168290614f31565b60405180910390fd5b60001515600d83836040516116a1929190614d4f565b908152602001604051809103902060009054906101000a900460ff161515146116ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f6906150b1565b60405180910390fd5b6001600d8383604051611713929190614d4f565b908152602001604051809103902060006101000a81548160ff021916908315150217905550826011600082825461174a91906152a3565b9250508190555082601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117a091906152a3565b925050819055507f0000000000000000000000000000000000000000000000000000000000001e016117d0612720565b1115611811576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180890614f91565b60405180910390fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661185583838661331a565b73ffffffffffffffffffffffffffffffffffffffff16146118ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a290615071565b60405180910390fd5b60001515601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514156119ef57600f543414611948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193f90615111565b60405180910390fd5b6001601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506119a86120e7565b73ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156119ed573d6000803e3d6000fd5b505b7f0000000000000000000000000000000000000000000000000000000000002ee0611a2a84611a1c61109a565b6132e690919063ffffffff16565b1115611a6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6290615011565b60405180910390fd5b611a7533846132fc565b505050565b7f0000000000000000000000000000000000000000000000000000000000002ee081565b60155481565b611aac6133e1565b611ab46120e7565b73ffffffffffffffffffffffffffffffffffffffff166108fc611ad630611dfa565b9081150290604051600060405180830381858888f19350505050158015611b01573d6000803e3d6000fd5b50565b611b0c6120e7565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611b925750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611bd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc890614ef1565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60165481565b611c368383836040518060200160405280600081525061272a565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16611c5b82611de8565b73ffffffffffffffffffffffffffffffffffffffff1614611cb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca8906150d1565b60405180910390fd5b611cba8161345f565b50565b600060011515611ccb61147f565b151514611d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d04906150f1565b60405180910390fd5b601454421115611d6757611d60611d4f6011547f0000000000000000000000000000000000000000000000000000000000001e0161346d90919063ffffffff16565b600e546132e690919063ffffffff16565b9050611d6d565b600e5490505b90565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611d9e6133e1565b80600c9080519060200190611db4929190614077565b5050565b600e5481565b600060175442118015611dd2575060185442105b15611de05760019050611de5565b600090505b90565b6000611df38261314e565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e62576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611ebb6133e1565b611ec56000613483565b565b6000611f4f84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611f1b3385611f62565b604051602001611f2b9190614d8c565b6040516020818303038152906040528051906020012061354990919063ffffffff16565b90509392505050565b6000601254905090565b6000604051806040016040528084604051602001611f809190614d19565b6040516020818303038152906040528051906020012081526020018360001b815250604051602001611fb29190614d34565b60405160208183030381529060405280519060200120905092915050565b611fd86120e7565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061205e5750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61209d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209490614ef1565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60145481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461212090615454565b80601f016020809104026020016040519081016040528092919081815260200182805461214c90615454565b80156121995780601f1061216e57610100808354040283529160200191612199565b820191906000526020600020905b81548152906001019060200180831161217c57829003601f168201915b5050505050905090565b6000601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6121f46120e7565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061227a5750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6122b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b090614ef1565b60405180910390fd5b81601581905550806016819055507fda999b11e6cfa9a612d58a7d65d1ea29003c9bf56113d2def65dbed3c5e6948b82826040516122f892919061514c565b60405180910390a15050565b806007600061231161313d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166123be61313d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124039190614e34565b60405180910390a35050565b60001515600d8383604051612425929190614d4f565b908152602001604051809103902060009054906101000a900460ff16151514612483576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247a906150b1565b60405180910390fd5b6001600d8383604051612497929190614d4f565b908152602001604051809103902060006101000a81548160ff02191690831515021790555082601b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461250b91906152a3565b92505081905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166125958383601b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ec7565b73ffffffffffffffffffffffffffffffffffffffff16146125eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e290615071565b60405180910390fd5b6126008360105461357090919063ffffffff16565b3414612641576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263890615111565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000002ee061267c8461266e61109a565b6132e690919063ffffffff16565b11156126bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b490615011565b60405180910390fd5b6126c56120e7565b73ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f1935050505015801561270a573d6000803e3d6000fd5b5061271533846132fc565b505050565b60135481565b6000601154905090565b6127358484846110b1565b60008373ffffffffffffffffffffffffffffffffffffffff163b146127975761276084848484613586565b612796576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60006127ac83600954846136e6565b905092915050565b60105481565b60606127c5826130de565b6127fb576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006128056136fd565b90506000815114156128265760405180602001604052806000815250612851565b806128308461378f565b604051602001612841929190614d68565b6040516020818303038152906040525b915050919050565b7f0000000000000000000000000000000000000000000000000000000000000fa081565b6128856120e7565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061290b5750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61294a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294190614ef1565b60405180910390fd5b80600e8190555050565b600f5481565b60185481565b7f0000000000000000000000000000000000000000000000000000000000001e0181565b6000601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6129d56120e7565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612a5b5750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9190614ef1565b60405180910390fd5b8060098190555050565b60175481565b612ab26120e7565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612b385750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612b77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6e90614ef1565b60405180910390fd5b81601781905550806018819055507f53bb3f0edf5961602b6c985f8d776a7241ad4458cb383fe8233e64154647d08d8282604051612bb692919061514c565b60405180910390a15050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60095481565b60011515612c6861147f565b151514612caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca1906150f1565b60405180910390fd5b612d1b828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505033604051602001612d009190614d19565b6040516020818303038152906040528051906020012061279d565b612d5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5190615031565b60405180910390fd5b60105483612d6891906152f9565b3414612da9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612da090614fb1565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000002ee0612de484612dd661109a565b6132e690919063ffffffff16565b1115612e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1c90615011565b60405180910390fd5b8260126000828254612e3791906152a3565b92505081905550612e46611cbd565b612e4e611f58565b1115612e8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e8690614f71565b60405180910390fd5b82601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ede91906152a3565b92505081905550612eed6120e7565b73ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015612f32573d6000803e3d6000fd5b50612f3d33846132fc565b505050565b612f4a6133e1565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612fba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb190614f51565b60405180910390fd5b612fc381613483565b50565b612fce6120e7565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806130545750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b613093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308a90614ef1565b60405180910390fd5b81601381905550806014819055507f8971f096c02bd03d56cc34d78717a488d9e6627c68998422ad503a7d575f758682826040516130d292919061514c565b60405180910390a15050565b6000816130e9613145565b111580156130f8575060005482105b8015613136575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b6000808290508061315d613145565b116131e5576000548110156131e45760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156131e2575b60008114156131d85760046000836001900393508381526020019081526020016000205490506131ad565b8092505050613217565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86132a48686846137e8565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600081836132f491906152a3565b905092915050565b6133168282604051806020016040528060008152506137f1565b5050565b60006133d884848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061337e8461337061109a565b6132e690919063ffffffff16565b60405160200161338e9190614db2565b604051602081830303815290604052805190602001206040516020016133b49190614d8c565b6040516020818303038152906040528051906020012061354990919063ffffffff16565b90509392505050565b6133e961388e565b73ffffffffffffffffffffffffffffffffffffffff166134076120e7565b73ffffffffffffffffffffffffffffffffffffffff161461345d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161345490615091565b60405180910390fd5b565b61346a816000613896565b50565b6000818361347b9190615353565b905092915050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008060006135588585613aea565b9150915061356581613b3c565b819250505092915050565b6000818361357e91906152f9565b905092915050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026135ac61313d565b8786866040518563ffffffff1660e01b81526004016135ce9493929190614de8565b602060405180830381600087803b1580156135e857600080fd5b505af192505050801561361957506040513d601f19601f82011682018060405250810190613616919061463b565b60015b613693573d8060008114613649576040519150601f19603f3d011682016040523d82523d6000602084013e61364e565b606091505b5060008151141561368b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6000826136f38584613d11565b1490509392505050565b6060600c805461370c90615454565b80601f016020809104026020016040519081016040528092919081815260200182805461373890615454565b80156137855780601f1061375a57610100808354040283529160200191613785565b820191906000526020600020905b81548152906001019060200180831161376857829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b6001156137d357600184039350600a81066030018453600a81049050806137ce576137d3565b6137a8565b50828103602084039350808452505050919050565b60009392505050565b6137fb8383613d86565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461388957600080549050600083820390505b61383b6000868380600101945086613586565b613871576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061382857816000541461388657600080fd5b50505b505050565b600033905090565b60006138a18361314e565b905060008190506000806138b48661321c565b91509150841561391d576138d081846138cb61313d565b613243565b61391c576138e5836138e061313d565b612bc2565b61391b576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b61392b836000886001613287565b801561393657600082555b600160806001901b03600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506139de8361399b8560008861328d565b7c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000017176132b5565b600460008881526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000085161415613a66576000600187019050600060046000838152602001908152602001600020541415613a64576000548114613a63578460046000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613ad08360008860016132e0565b600160008154809291906001019190505550505050505050565b600080604183511415613b2c5760008060006020860151925060408601519150606086015160001a9050613b2087828585613f43565b94509450505050613b35565b60006002915091505b9250929050565b60006004811115613b5057613b4f615567565b5b816004811115613b6357613b62615567565b5b1415613b6e57613d0e565b60016004811115613b8257613b81615567565b5b816004811115613b9557613b94615567565b5b1415613bd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bcd90614ed1565b60405180910390fd5b60026004811115613bea57613be9615567565b5b816004811115613bfd57613bfc615567565b5b1415613c3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c3590614f11565b60405180910390fd5b60036004811115613c5257613c51615567565b5b816004811115613c6557613c64615567565b5b1415613ca6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c9d90614fd1565b60405180910390fd5b600480811115613cb957613cb8615567565b5b816004811115613ccc57613ccb615567565b5b1415613d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d0490615051565b60405180910390fd5b5b50565b60008082905060005b8451811015613d7b576000858281518110613d3857613d376155c5565b5b60200260200101519050808311613d5a57613d538382614050565b9250613d67565b613d648184614050565b92505b508080613d73906154b7565b915050613d1a565b508091505092915050565b6000805490506000821415613dc7576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613dd46000848385613287565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550613e4b83613e3c600086600061328d565b613e4585614067565b176132b5565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114613eec57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613eb1565b506000821415613f28576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050613f3e60008483856132e0565b505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613f7e576000600391509150614047565b601b8560ff1614158015613f965750601c8560ff1614155b15613fa8576000600491509150614047565b600060018787878760405160008152602001604052604051613fcd9493929190614e6a565b6020604051602081039080840390855afa158015613fef573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561403e57600060019250925050614047565b80600092509250505b94509492505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b82805461408390615454565b90600052602060002090601f0160209004810192826140a557600085556140ec565b82601f106140be57805160ff19168380011785556140ec565b828001600101855582156140ec579182015b828111156140eb5782518255916020019190600101906140d0565b5b5090506140f991906140fd565b5090565b5b808211156141165760008160009055506001016140fe565b5090565b600061412d6141288461519a565b615175565b905080838252602082019050828560208602820111156141505761414f61562d565b5b60005b85811015614180578161416688826142bc565b845260208401935060208301925050600181019050614153565b5050509392505050565b600061419d614198846151c6565b615175565b9050828152602081018484840111156141b9576141b8615632565b5b6141c4848285615412565b509392505050565b60006141df6141da846151f7565b615175565b9050828152602081018484840111156141fb576141fa615632565b5b614206848285615412565b509392505050565b60008135905061421d81615a05565b92915050565b60008083601f84011261423957614238615628565b5b8235905067ffffffffffffffff81111561425657614255615623565b5b6020830191508360208202830111156142725761427161562d565b5b9250929050565b600082601f83011261428e5761428d615628565b5b813561429e84826020860161411a565b91505092915050565b6000813590506142b681615a1c565b92915050565b6000813590506142cb81615a33565b92915050565b6000813590506142e081615a4a565b92915050565b6000815190506142f581615a4a565b92915050565b60008083601f84011261431157614310615628565b5b8235905067ffffffffffffffff81111561432e5761432d615623565b5b60208301915083600182028301111561434a5761434961562d565b5b9250929050565b600082601f83011261436657614365615628565b5b813561437684826020860161418a565b91505092915050565b600082601f83011261439457614393615628565b5b81356143a48482602086016141cc565b91505092915050565b6000813590506143bc81615a61565b92915050565b6000602082840312156143d8576143d761563c565b5b60006143e68482850161420e565b91505092915050565b600080604083850312156144065761440561563c565b5b60006144148582860161420e565b92505060206144258582860161420e565b9150509250929050565b6000806000606084860312156144485761444761563c565b5b60006144568682870161420e565b93505060206144678682870161420e565b9250506040614478868287016143ad565b9150509250925092565b6000806000806080858703121561449c5761449b61563c565b5b60006144aa8782880161420e565b94505060206144bb8782880161420e565b93505060406144cc878288016143ad565b925050606085013567ffffffffffffffff8111156144ed576144ec615637565b5b6144f987828801614351565b91505092959194509250565b6000806040838503121561451c5761451b61563c565b5b600061452a8582860161420e565b925050602061453b858286016142a7565b9150509250929050565b6000806040838503121561455c5761455b61563c565b5b600061456a8582860161420e565b925050602061457b858286016143ad565b9150509250929050565b6000806040838503121561459c5761459b61563c565b5b600083013567ffffffffffffffff8111156145ba576145b9615637565b5b6145c685828601614279565b92505060206145d7858286016142bc565b9150509250929050565b6000602082840312156145f7576145f661563c565b5b6000614605848285016142bc565b91505092915050565b6000602082840312156146245761462361563c565b5b6000614632848285016142d1565b91505092915050565b6000602082840312156146515761465061563c565b5b600061465f848285016142e6565b91505092915050565b6000806000604084860312156146815761468061563c565b5b600084013567ffffffffffffffff81111561469f5761469e615637565b5b6146ab868287016142fb565b935093505060206146be868287016143ad565b9150509250925092565b6000602082840312156146de576146dd61563c565b5b600082013567ffffffffffffffff8111156146fc576146fb615637565b5b61470884828501614351565b91505092915050565b6000602082840312156147275761472661563c565b5b600082013567ffffffffffffffff81111561474557614744615637565b5b6147518482850161437f565b91505092915050565b6000602082840312156147705761476f61563c565b5b600061477e848285016143ad565b91505092915050565b6000806000604084860312156147a05761479f61563c565b5b60006147ae868287016143ad565b935050602084013567ffffffffffffffff8111156147cf576147ce615637565b5b6147db86828701614223565b92509250509250925092565b600080600060408486031215614800576147ff61563c565b5b600061480e868287016143ad565b935050602084013567ffffffffffffffff81111561482f5761482e615637565b5b61483b868287016142fb565b92509250509250925092565b6000806040838503121561485e5761485d61563c565b5b600061486c858286016143ad565b925050602061487d858286016143ad565b9150509250929050565b6000614893838361493a565b60208301905092915050565b6148a881615387565b82525050565b6148bf6148ba82615387565b615500565b82525050565b6148ce81615232565b6148d88184615260565b92506148e382615228565b8060005b838110156149145781516148fb8782614887565b965061490683615253565b9250506001810190506148e7565b505050505050565b61492581615399565b82525050565b614934816153a5565b82525050565b614943816153a5565b82525050565b61495a614955826153a5565b615512565b82525050565b600061496c838561527c565b9350614979838584615412565b82840190509392505050565b60006149908261523d565b61499a818561526b565b93506149aa818560208601615421565b6149b381615641565b840191505092915050565b60006149c982615248565b6149d38185615287565b93506149e3818560208601615421565b6149ec81615641565b840191505092915050565b6000614a0282615248565b614a0c8185615298565b9350614a1c818560208601615421565b80840191505092915050565b6000614a35601883615287565b9150614a408261565f565b602082019050919050565b6000614a58600e83615287565b9150614a6382615688565b602082019050919050565b6000614a7b601f83615287565b9150614a86826156b1565b602082019050919050565b6000614a9e601c83615298565b9150614aa9826156da565b601c82019050919050565b6000614ac1601583615287565b9150614acc82615703565b602082019050919050565b6000614ae4602683615287565b9150614aef8261572c565b604082019050919050565b6000614b07601b83615287565b9150614b128261577b565b602082019050919050565b6000614b2a601783615287565b9150614b35826157a4565b602082019050919050565b6000614b4d601583615287565b9150614b58826157cd565b602082019050919050565b6000614b70602283615287565b9150614b7b826157f6565b604082019050919050565b6000614b93601583615287565b9150614b9e82615845565b602082019050919050565b6000614bb6601383615287565b9150614bc18261586e565b602082019050919050565b6000614bd9601783615287565b9150614be482615897565b602082019050919050565b6000614bfc602283615287565b9150614c07826158c0565b604082019050919050565b6000614c1f601183615287565b9150614c2a8261590f565b602082019050919050565b6000614c42602083615287565b9150614c4d82615938565b602082019050919050565b6000614c65601583615287565b9150614c7082615961565b602082019050919050565b6000614c88601a83615287565b9150614c938261598a565b602082019050919050565b6000614cab601c83615287565b9150614cb6826159b3565b602082019050919050565b6000614cce601583615287565b9150614cd9826159dc565b602082019050919050565b614ced816153fb565b82525050565b614d04614cff826153fb565b61552e565b82525050565b614d1381615405565b82525050565b6000614d2582846148ae565b60148201915081905092915050565b6000614d4082846148c5565b60408201915081905092915050565b6000614d5c828486614960565b91508190509392505050565b6000614d7482856149f7565b9150614d8082846149f7565b91508190509392505050565b6000614d9782614a91565b9150614da38284614949565b60208201915081905092915050565b6000614dbe8284614cf3565b60208201915081905092915050565b6000602082019050614de2600083018461489f565b92915050565b6000608082019050614dfd600083018761489f565b614e0a602083018661489f565b614e176040830185614ce4565b8181036060830152614e298184614985565b905095945050505050565b6000602082019050614e49600083018461491c565b92915050565b6000602082019050614e64600083018461492b565b92915050565b6000608082019050614e7f600083018761492b565b614e8c6020830186614d0a565b614e99604083018561492b565b614ea6606083018461492b565b95945050505050565b60006020820190508181036000830152614ec981846149be565b905092915050565b60006020820190508181036000830152614eea81614a28565b9050919050565b60006020820190508181036000830152614f0a81614a4b565b9050919050565b60006020820190508181036000830152614f2a81614a6e565b9050919050565b60006020820190508181036000830152614f4a81614ab4565b9050919050565b60006020820190508181036000830152614f6a81614ad7565b9050919050565b60006020820190508181036000830152614f8a81614afa565b9050919050565b60006020820190508181036000830152614faa81614b1d565b9050919050565b60006020820190508181036000830152614fca81614b40565b9050919050565b60006020820190508181036000830152614fea81614b63565b9050919050565b6000602082019050818103600083015261500a81614b86565b9050919050565b6000602082019050818103600083015261502a81614ba9565b9050919050565b6000602082019050818103600083015261504a81614bcc565b9050919050565b6000602082019050818103600083015261506a81614bef565b9050919050565b6000602082019050818103600083015261508a81614c12565b9050919050565b600060208201905081810360008301526150aa81614c35565b9050919050565b600060208201905081810360008301526150ca81614c58565b9050919050565b600060208201905081810360008301526150ea81614c7b565b9050919050565b6000602082019050818103600083015261510a81614c9e565b9050919050565b6000602082019050818103600083015261512a81614cc1565b9050919050565b60006020820190506151466000830184614ce4565b92915050565b60006040820190506151616000830185614ce4565b61516e6020830184614ce4565b9392505050565b600061517f615190565b905061518b8282615486565b919050565b6000604051905090565b600067ffffffffffffffff8211156151b5576151b46155f4565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156151e1576151e06155f4565b5b6151ea82615641565b9050602081019050919050565b600067ffffffffffffffff821115615212576152116155f4565b5b61521b82615641565b9050602081019050919050565b6000819050919050565b600060029050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006152ae826153fb565b91506152b9836153fb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156152ee576152ed615538565b5b828201905092915050565b6000615304826153fb565b915061530f836153fb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561534857615347615538565b5b828202905092915050565b600061535e826153fb565b9150615369836153fb565b92508282101561537c5761537b615538565b5b828203905092915050565b6000615392826153db565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561543f578082015181840152602081019050615424565b8381111561544e576000848401525b50505050565b6000600282049050600182168061546c57607f821691505b602082108114156154805761547f615596565b5b50919050565b61548f82615641565b810181811067ffffffffffffffff821117156154ae576154ad6155f4565b5b80604052505050565b60006154c2826153fb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156154f5576154f4615538565b5b600182019050919050565b600061550b8261551c565b9050919050565b6000819050919050565b600061552782615652565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f596f752063616e7420646f206974000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f486f6c6465722073616c65206973206e6f74204f4e0000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f57696c6c2045786365656420416c6c6f776c697374204c696d69740000000000600082015250565b7f4d696e7420776f756c6420657863656564206c696d6974000000000000000000600082015250565b7f53656e642070726f706572206d73672076616c75650000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f7075626c69632073616c65206973206e6f74206f6e0000000000000000000000600082015250565b7f457863656564696e67204d6178204c696d697400000000000000000000000000600082015250565b7f4e6f7420612070617274206f6620416c6c6f776c697374000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964205369676e6174757265000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f7369676e617475726520616c7265616479207573650000000000000000000000600082015250565b7f796f7520617265206e6f74206f776e6572206f6620746f6b656e000000000000600082015250565b7f77686974656c6973742073616c65206e6f742073746172742079657400000000600082015250565b7f53656e642070726f706572206d696e7420666565730000000000000000000000600082015250565b615a0e81615387565b8114615a1957600080fd5b50565b615a2581615399565b8114615a3057600080fd5b50565b615a3c816153a5565b8114615a4757600080fd5b50565b615a53816153af565b8114615a5e57600080fd5b50565b615a6a816153fb565b8114615a7557600080fd5b5056fea26469706673582212208bab117b1c5595b5d93780844a0d33b3b5573203d071cfac33d321740a7da77164736f6c63430008070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000000bc28ed5095394177724c5cfd171c1d94249f837

-----Decoded View---------------
Arg [0] : signerAddress_ (address): 0x0bc28eD5095394177724C5CFd171C1D94249F837

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000bc28ed5095394177724c5cfd171c1d94249f837


Deployed Bytecode Sourcemap

82074:8908:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18215:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19117:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25608:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25041:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14868:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29247:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82353:37;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83831:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84922:264;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85192:284;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;88466:384;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83239:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86863:884;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82397:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82874:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90862:115;;;:::i;:::-;;86756:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82932:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32168:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;90700:154;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84562:352;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82289:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;89481:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82553:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85482:283;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20510:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16052:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72931:103;;;;;;;;;;;;;:::i;:::-;;90129:319;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84196:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;89929:188;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86630:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82821:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72283:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19293:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83707:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86136:243;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26166:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;88858:611;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82766:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84093:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32959:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;90460:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82647:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19503:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82499:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85777:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82596:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83032:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82447:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83961:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90613:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82988:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86387:235;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26557:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82226:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87755:699;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73189:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85893:235;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18215:639;18300:4;18639:10;18624:25;;:11;:25;;;;:102;;;;18716:10;18701:25;;:11;:25;;;;18624:102;:179;;;;18793:10;18778:25;;:11;:25;;;;18624:179;18604:199;;18215:639;;;:::o;19117:100::-;19171:13;19204:5;19197:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19117:100;:::o;25608:218::-;25684:7;25709:16;25717:7;25709;:16::i;:::-;25704:64;;25734:34;;;;;;;;;;;;;;25704:64;25788:15;:24;25804:7;25788:24;;;;;;;;;;;:30;;;;;;;;;;;;25781:37;;25608:218;;;:::o;25041:408::-;25130:13;25146:16;25154:7;25146;:16::i;:::-;25130:32;;25202:5;25179:28;;:19;:17;:19::i;:::-;:28;;;25175:175;;25227:44;25244:5;25251:19;:17;:19::i;:::-;25227:16;:44::i;:::-;25222:128;;25299:35;;;;;;;;;;;;;;25222:128;25175:175;25395:2;25362:15;:24;25378:7;25362:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;25433:7;25429:2;25413:28;;25422:5;25413:28;;;;;;;;;;;;25119:330;25041:408;;:::o;14868:323::-;14929:7;15157:15;:13;:15::i;:::-;15142:12;;15126:13;;:28;:46;15119:53;;14868:323;:::o;29247:2825::-;29389:27;29419;29438:7;29419:18;:27::i;:::-;29389:57;;29504:4;29463:45;;29479:19;29463:45;;;29459:86;;29517:28;;;;;;;;;;;;;;29459:86;29559:27;29588:23;29615:35;29642:7;29615:26;:35::i;:::-;29558:92;;;;29750:68;29775:15;29792:4;29798:19;:17;:19::i;:::-;29750:24;:68::i;:::-;29745:180;;29838:43;29855:4;29861:19;:17;:19::i;:::-;29838:16;:43::i;:::-;29833:92;;29890:35;;;;;;;;;;;;;;29833:92;29745:180;29956:1;29942:16;;:2;:16;;;29938:52;;;29967:23;;;;;;;;;;;;;;29938:52;30003:43;30025:4;30031:2;30035:7;30044:1;30003:21;:43::i;:::-;30139:15;30136:160;;;30279:1;30258:19;30251:30;30136:160;30676:18;:24;30695:4;30676:24;;;;;;;;;;;;;;;;30674:26;;;;;;;;;;;;30745:18;:22;30764:2;30745:22;;;;;;;;;;;;;;;;30743:24;;;;;;;;;;;31067:146;31104:2;31153:45;31168:4;31174:2;31178:19;31153:14;:45::i;:::-;11267:8;31125:73;31067:18;:146::i;:::-;31038:17;:26;31056:7;31038:26;;;;;;;;;;;:175;;;;31384:1;11267:8;31333:19;:47;:52;31329:627;;;31406:19;31438:1;31428:7;:11;31406:33;;31595:1;31561:17;:30;31579:11;31561:30;;;;;;;;;;;;:35;31557:384;;;31699:13;;31684:11;:28;31680:242;;31879:19;31846:17;:30;31864:11;31846:30;;;;;;;;;;;:52;;;;31680:242;31557:384;31387:569;31329:627;32003:7;31999:2;31984:27;;31993:4;31984:27;;;;;;;;;;;;32022:42;32043:4;32049:2;32053:7;32062:1;32022:20;:42::i;:::-;29378:2694;;;29247:2825;;;:::o;82353:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;83831:124::-;83897:7;83924:15;:23;83940:6;83924:23;;;;;;;;;;;;;;;;83917:30;;83831:124;;;:::o;84922:264::-;84974:4;85012:22;;84994:15;:40;:82;;;;;85056:20;;85038:15;:38;84994:82;84991:188;;;85109:4;85102:11;;;;84991:188;85162:5;85155:12;;84922:264;;:::o;85192:284::-;85247:4;85285:25;;85267:15;:43;:88;;;;;85332:23;;85314:15;:41;85267:88;85264:195;;;85388:4;85381:11;;;;85264:195;85442:5;85435:12;;85192:284;;:::o;88466:384::-;88559:4;88538:25;;:19;:17;:19::i;:::-;:25;;;88530:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;88630:10;;88619:8;:21;;;;:::i;:::-;88606:9;:34;88598:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;88713:10;88684:27;88702:8;88684:13;:11;:13::i;:::-;:17;;:27;;;;:::i;:::-;:39;;88676:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;88765:7;:5;:7::i;:::-;88757:25;;:36;88783:9;88757:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;88804:31;88814:10;88826:8;88804:9;:31::i;:::-;88466:384;:::o;83239:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;86863:884::-;86987:4;86965:26;;:20;:18;:20::i;:::-;:26;;;86957:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;87057:5;87035:27;;:9;87045;;87035:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:27;;;87027:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;87119:4;87098:9;87108;;87098:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;87150:8;87134:14;;:24;;;;;;;:::i;:::-;;;;;;;;87195:8;87169:12;:24;87182:10;87169:24;;;;;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;87243:13;87222:19;:17;:19::i;:::-;:34;;87214:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;87334:14;;;;;;;;;;;87303:45;;:29;87313:9;;87323:8;87303:9;:29::i;:::-;:45;;;87295:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;87408:5;87384:29;;:10;:22;87395:10;87384:22;;;;;;;;;;;;;;;;;;;;;;;;;:29;;;87381:215;;;87448:17;;87435:9;:30;87427:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;87529:4;87504:10;:22;87515:10;87504:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;87554:7;:5;:7::i;:::-;87546:25;;:36;87572:9;87546:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87381:215;87643:10;87614:27;87632:8;87614:13;:11;:13::i;:::-;:17;;:27;;;;:::i;:::-;:39;;87606:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;87700:31;87710:10;87722:8;87700:9;:31::i;:::-;86863:884;;;:::o;82397:43::-;;;:::o;82874:51::-;;;;:::o;90862:115::-;72169:13;:11;:13::i;:::-;90926:7:::1;:5;:7::i;:::-;90918:25;;:51;90944:24;90962:4;90944:9;:24::i;:::-;90918:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;90862:115::o:0;86756:99::-;84479:7;:5;:7::i;:::-;84465:21;;:10;:21;;;:50;;;;84503:12;;;;;;;;;;;84490:25;;:10;:25;;;84465:50;84457:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;86841:6:::1;86826:12;;:21;;;;;;;;;;;;;;;;;;86756:99:::0;:::o;82932:49::-;;;;:::o;32168:193::-;32314:39;32331:4;32337:2;32341:7;32314:39;;;;;;;;;;;;:16;:39::i;:::-;32168:193;;;:::o;90700:154::-;90777:10;90757:30;;:16;90765:7;90757;:16::i;:::-;:30;;;90749:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;90832:14;90838:7;90832:5;:14::i;:::-;90700:154;:::o;84562:352::-;84616:7;84668:4;84643:29;;:23;:21;:23::i;:::-;:29;;;84635:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;84735:20;;84719:15;:36;84716:191;;;84774:60;84800:33;84818:14;;84800:13;:17;;:33;;;;:::i;:::-;84774:21;;:25;;:60;;;;:::i;:::-;84767:67;;;;84716:191;84874:21;;84867:28;;84562:352;;:::o;82289:27::-;;;;;;;;;;;;;:::o;89481:97::-;72169:13;:11;:13::i;:::-;89563:7:::1;89552:8;:18;;;;;;;;;;;;:::i;:::-;;89481:97:::0;:::o;82553:36::-;;;;:::o;85482:283::-;85533:4;85571:22;;85553:15;:40;:82;;;;;85615:20;;85597:15;:38;85553:82;85550:198;;;85668:4;85661:11;;;;85550:198;85731:5;85724:12;;85482:283;;:::o;20510:152::-;20582:7;20625:27;20644:7;20625:18;:27::i;:::-;20602:52;;20510:152;;;:::o;16052:233::-;16124:7;16165:1;16148:19;;:5;:19;;;16144:60;;;16176:28;;;;;;;;;;;;;;16144:60;10211:13;16222:18;:25;16241:5;16222:25;;;;;;;;;;;;;;;;:55;16215:62;;16052:233;;;:::o;72931:103::-;72169:13;:11;:13::i;:::-;72996:30:::1;73023:1;72996:18;:30::i;:::-;72931:103::o:0;90129:319::-;90219:7;90246:194;90430:9;;90246:194;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;90358:34;90371:10;90383:8;90358:12;:34::i;:::-;90270:140;;;;;;;;:::i;:::-;;;;;;;;;;;;;90246:175;;;;;;:183;;:194;;;;:::i;:::-;90239:201;;90129:319;;;;;:::o;84196:102::-;84248:7;84274:16;;84267:23;;84196:102;:::o;89929:188::-;90000:7;90037:69;;;;;;;;90082:6;90065:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;90055:35;;;;;;90037:69;;;;90100:3;90092:12;;90037:69;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;90027:80;;;;;;90019:90;;89929:188;;;;:::o;86630:118::-;84479:7;:5;:7::i;:::-;84465:21;;:10;:21;;;:50;;;;84503:12;;;;;;;;;;;84490:25;;:10;:25;;;84465:50;84457:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;86727:13:::1;86710:14;;:30;;;;;;;;;;;;;;;;;;86630:118:::0;:::o;82821:46::-;;;;:::o;72283:87::-;72329:7;72356:6;;;;;;;;;;;72349:13;;72283:87;:::o;19293:104::-;19349:13;19382:7;19375:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19293:104;:::o;83707:118::-;83770:7;83797:12;:20;83810:6;83797:20;;;;;;;;;;;;;;;;83790:27;;83707:118;;;:::o;86136:243::-;84479:7;:5;:7::i;:::-;84465:21;;:10;:21;;;:50;;;;84503:12;;;;;;;;;;;84490:25;;:10;:25;;;84465:50;84457:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;86258:9:::1;86230:25;:37;;;;86304:7;86278:23;:33;;;;86327:44;86352:9;86363:7;86327:44;;;;;;;:::i;:::-;;;;;;;;86136:243:::0;;:::o;26166:234::-;26313:8;26261:18;:39;26280:19;:17;:19::i;:::-;26261:39;;;;;;;;;;;;;;;:49;26301:8;26261:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;26373:8;26337:55;;26352:19;:17;:19::i;:::-;26337:55;;;26383:8;26337:55;;;;;;:::i;:::-;;;;;;;;26166:234;;:::o;88858:611::-;88978:5;88956:27;;:9;88966;;88956:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:27;;;88948:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;89040:4;89019:9;89029;;89019:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;89081:8;89055:12;:24;89068:10;89055:24;;;;;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;89161:14;;;;;;;;;;;89108:67;;:51;89124:9;;89134:12;:24;89147:10;89134:24;;;;;;;;;;;;;;;;89108:15;:51::i;:::-;:67;;;89100:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;89229:24;89244:8;89229:10;;:14;;:24;;;;:::i;:::-;89216:9;:37;89208:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;89327:10;89298:27;89316:8;89298:13;:11;:13::i;:::-;:17;;:27;;;;:::i;:::-;:39;;89290:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;89392:7;:5;:7::i;:::-;89384:25;;:36;89410:9;89384:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;89430:31;89440:10;89452:8;89430:9;:31::i;:::-;88858:611;;;:::o;82766:48::-;;;;:::o;84093:97::-;84142:7;84168:14;;84161:21;;84093:97;:::o;32959:407::-;33134:31;33147:4;33153:2;33157:7;33134:12;:31::i;:::-;33198:1;33180:2;:14;;;:19;33176:183;;33219:56;33250:4;33256:2;33260:7;33269:5;33219:30;:56::i;:::-;33214:145;;33303:40;;;;;;;;;;;;;;33214:145;33176:183;32959:407;;;;:::o;90460:145::-;90536:4;90560:37;90579:5;90586:4;;90592;90560:18;:37::i;:::-;90553:44;;90460:145;;;;:::o;82647:36::-;;;;:::o;19503:318::-;19576:13;19607:16;19615:7;19607;:16::i;:::-;19602:59;;19632:29;;;;;;;;;;;;;;19602:59;19674:21;19698:10;:8;:10::i;:::-;19674:34;;19751:1;19732:7;19726:21;:26;;:87;;;;;;;;;;;;;;;;;19779:7;19788:18;19798:7;19788:9;:18::i;:::-;19762:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;19726:87;19719:94;;;19503:318;;;:::o;82499:47::-;;;:::o;85777:108::-;84479:7;:5;:7::i;:::-;84465:21;;:10;:21;;;:50;;;;84503:12;;;;;;;;;;;84490:25;;:10;:25;;;84465:50;84457:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;85871:6:::1;85847:21;:30;;;;85777:108:::0;:::o;82596:44::-;;;;:::o;83032:35::-;;;;:::o;82447:45::-;;;:::o;83961:124::-;84030:7;84057:12;:20;84070:6;84057:20;;;;;;;;;;;;;;;;84050:27;;83961:124;;;:::o;90613:81::-;84479:7;:5;:7::i;:::-;84465:21;;:10;:21;;;:50;;;;84503:12;;;;;;;;;;;84490:25;;:10;:25;;;84465:50;84457:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;90681:5:::1;90674:4;:12;;;;90613:81:::0;:::o;82988:37::-;;;;:::o;86387:235::-;84479:7;:5;:7::i;:::-;84465:21;;:10;:21;;;:50;;;;84503:12;;;;;;;;;;;84490:25;;:10;:25;;;84465:50;84457:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;86507:9:::1;86482:22;:34;;;;86550:7;86527:20;:30;;;;86573:41;86595:9;86606:7;86573:41;;;;;;;:::i;:::-;;;;;;;;86387:235:::0;;:::o;26557:164::-;26654:4;26678:18;:25;26697:5;26678:25;;;;;;;;;;;;;;;:35;26704:8;26678:35;;;;;;;;;;;;;;;;;;;;;;;;;26671:42;;26557:164;;;;:::o;82226:19::-;;;;:::o;87755:699::-;87881:4;87856:29;;:23;:21;:23::i;:::-;:29;;;87848:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;87936:55;87944:5;;87936:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87978:10;87961:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;87951:39;;;;;;87936:7;:55::i;:::-;87928:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;88061:10;;88050:8;:21;;;;:::i;:::-;88037:9;:34;88029:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;88144:10;88115:27;88133:8;88115:13;:11;:13::i;:::-;:17;;:27;;;;:::i;:::-;:39;;88107:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;88206:8;88188:16;;:26;;;;;;;:::i;:::-;;;;;;;;88256:23;:21;:23::i;:::-;88232:22;:20;:22::i;:::-;:47;;88224:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;88350:8;88321:15;:27;88337:10;88321:27;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;88376:7;:5;:7::i;:::-;88368:25;;:36;88394:9;88368:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;88415:31;88425:10;88437:8;88415:9;:31::i;:::-;87755:699;;;:::o;73189:201::-;72169:13;:11;:13::i;:::-;73298:1:::1;73278:22;;:8;:22;;;;73270:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;73354:28;73373:8;73354:18;:28::i;:::-;73189:201:::0;:::o;85893:235::-;84479:7;:5;:7::i;:::-;84465:21;;:10;:21;;;:50;;;;84503:12;;;;;;;;;;;84490:25;;:10;:25;;;84465:50;84457:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;86013:9:::1;85988:22;:34;;;;86056:7;86033:20;:30;;;;86079:41;86101:9;86112:7;86079:41;;;;;;;:::i;:::-;;;;;;;;85893:235:::0;;:::o;26979:282::-;27044:4;27100:7;27081:15;:13;:15::i;:::-;:26;;:66;;;;;27134:13;;27124:7;:23;27081:66;:153;;;;;27233:1;10987:8;27185:17;:26;27203:7;27185:26;;;;;;;;;;;;:44;:49;27081:153;27061:173;;26979:282;;;:::o;49287:105::-;49347:7;49374:10;49367:17;;49287:105;:::o;14384:92::-;14440:7;14467:1;14460:8;;14384:92;:::o;21665:1275::-;21732:7;21752:12;21767:7;21752:22;;21835:4;21816:15;:13;:15::i;:::-;:23;21812:1061;;21869:13;;21862:4;:20;21858:1015;;;21907:14;21924:17;:23;21942:4;21924:23;;;;;;;;;;;;21907:40;;22041:1;10987:8;22013:6;:24;:29;22009:845;;;22678:113;22695:1;22685:6;:11;22678:113;;;22738:17;:25;22756:6;;;;;;;22738:25;;;;;;;;;;;;22729:34;;22678:113;;;22824:6;22817:13;;;;;;22009:845;21884:989;21858:1015;21812:1061;22901:31;;;;;;;;;;;;;;21665:1275;;;;:::o;28142:485::-;28244:27;28273:23;28314:38;28355:15;:24;28371:7;28355:24;;;;;;;;;;;28314:65;;28532:18;28509:41;;28589:19;28583:26;28564:45;;28494:126;28142:485;;;:::o;27370:659::-;27519:11;27684:16;27677:5;27673:28;27664:37;;27844:16;27833:9;27829:32;27816:45;;27994:15;27983:9;27980:30;27972:5;27961:9;27958:20;27955:56;27945:66;;27370:659;;;;;:::o;34028:159::-;;;;;:::o;48596:311::-;48731:7;48751:16;11391:3;48777:19;:41;;48751:68;;11391:3;48845:31;48856:4;48862:2;48866:9;48845:10;:31::i;:::-;48837:40;;:62;;48830:69;;;48596:311;;;;;:::o;23488:450::-;23568:14;23736:16;23729:5;23725:28;23716:37;;23913:5;23899:11;23874:23;23870:41;23867:52;23860:5;23857:63;23847:73;;23488:450;;;;:::o;34852:158::-;;;;;:::o;55419:98::-;55477:7;55508:1;55504;:5;;;;:::i;:::-;55497:12;;55419:98;;;;:::o;43119:112::-;43196:27;43206:2;43210:8;43196:27;;;;;;;;;;;;:9;:27::i;:::-;43119:112;;:::o;89586:335::-;89670:7;89697:216;89903:9;;89697:216;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;89835:27;89853:8;89835:13;:11;:13::i;:::-;:17;;:27;;;;:::i;:::-;89818:45;;;;;;;;:::i;:::-;;;;;;;;;;;;;89808:56;;;;;;89721:162;;;;;;;;:::i;:::-;;;;;;;;;;;;;89697:197;;;;;;:205;;:216;;;;:::i;:::-;89690:223;;89586:335;;;;;:::o;72448:132::-;72523:12;:10;:12::i;:::-;72512:23;;:7;:5;:7::i;:::-;:23;;;72504:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72448:132::o;43498:89::-;43558:21;43564:7;43573:5;43558;:21::i;:::-;43498:89;:::o;55800:98::-;55858:7;55889:1;55885;:5;;;;:::i;:::-;55878:12;;55800:98;;;;:::o;73550:191::-;73624:16;73643:6;;;;;;;;;;;73624:25;;73669:8;73660:6;;:17;;;;;;;;;;;;;;;;;;73724:8;73693:40;;73714:8;73693:40;;;;;;;;;;;;73613:128;73550:191;:::o;66353:231::-;66431:7;66452:17;66471:18;66493:27;66504:4;66510:9;66493:10;:27::i;:::-;66451:69;;;;66531:18;66543:5;66531:11;:18::i;:::-;66567:9;66560:16;;;;66353:231;;;;:::o;56157:98::-;56215:7;56246:1;56242;:5;;;;:::i;:::-;56235:12;;56157:98;;;;:::o;35450:716::-;35613:4;35659:2;35634:45;;;35680:19;:17;:19::i;:::-;35701:4;35707:7;35716:5;35634:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35630:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35934:1;35917:6;:13;:18;35913:235;;;35963:40;;;;;;;;;;;;;;35913:235;36106:6;36100:13;36091:6;36087:2;36083:15;36076:38;35630:529;35803:54;;;35793:64;;;:6;:64;;;;35786:71;;;35450:716;;;;;;:::o;51605:190::-;51730:4;51783;51754:25;51767:5;51774:4;51754:12;:25::i;:::-;:33;51747:40;;51605:190;;;;;:::o;84308:110::-;84369:13;84402:8;84395:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84308:110;:::o;49494:1745::-;49559:17;49993:4;49986;49980:11;49976:22;50085:1;50079:4;50072:15;50160:4;50157:1;50153:12;50146:19;;50242:1;50237:3;50230:14;50346:3;50585:5;50567:428;50593:1;50567:428;;;50633:1;50628:3;50624:11;50617:18;;50804:2;50798:4;50794:13;50790:2;50786:22;50781:3;50773:36;50898:2;50892:4;50888:13;50880:21;;50965:4;50955:25;;50973:5;;50955:25;50567:428;;;50571:21;51034:3;51029;51025:13;51149:4;51144:3;51140:14;51133:21;;51214:6;51209:3;51202:19;49598:1634;;;49494:1745;;;:::o;48297:147::-;48434:6;48297:147;;;;;:::o;42346:689::-;42477:19;42483:2;42487:8;42477:5;:19::i;:::-;42556:1;42538:2;:14;;;:19;42534:483;;42578:11;42592:13;;42578:27;;42624:13;42646:8;42640:3;:14;42624:30;;42673:233;42704:62;42743:1;42747:2;42751:7;;;;;;42760:5;42704:30;:62::i;:::-;42699:167;;42802:40;;;;;;;;;;;;;;42699:167;42901:3;42893:5;:11;42673:233;;42988:3;42971:13;;:20;42967:34;;42993:8;;;42967:34;42559:458;;42534:483;42346:689;;;:::o;71501:98::-;71554:7;71581:10;71574:17;;71501:98;:::o;43816:3081::-;43896:27;43926;43945:7;43926:18;:27::i;:::-;43896:57;;43966:12;43997:19;43966:52;;44032:27;44061:23;44088:35;44115:7;44088:26;:35::i;:::-;44031:92;;;;44140:13;44136:316;;;44261:68;44286:15;44303:4;44309:19;:17;:19::i;:::-;44261:24;:68::i;:::-;44256:184;;44353:43;44370:4;44376:19;:17;:19::i;:::-;44353:16;:43::i;:::-;44348:92;;44405:35;;;;;;;;;;;;;;44348:92;44256:184;44136:316;44464:51;44486:4;44500:1;44504:7;44513:1;44464:21;:51::i;:::-;44608:15;44605:160;;;44748:1;44727:19;44720:30;44605:160;45426:1;10476:3;45396:1;:26;;45395:32;45367:18;:24;45386:4;45367:24;;;;;;;;;;;;;;;;:60;;;;;;;;;;;45694:176;45731:4;45802:53;45817:4;45831:1;45835:19;45802:14;:53::i;:::-;11267:8;10987;45755:43;45754:101;45694:18;:176::i;:::-;45665:17;:26;45683:7;45665:26;;;;;;;;;;;:205;;;;46041:1;11267:8;45990:19;:47;:52;45986:627;;;46063:19;46095:1;46085:7;:11;46063:33;;46252:1;46218:17;:30;46236:11;46218:30;;;;;;;;;;;;:35;46214:384;;;46356:13;;46341:11;:28;46337:242;;46536:19;46503:17;:30;46521:11;46503:30;;;;;;;;;;;:52;;;;46337:242;46214:384;46044:569;45986:627;46668:7;46664:1;46641:35;;46650:4;46641:35;;;;;;;;;;;;46687:50;46708:4;46722:1;46726:7;46735:1;46687:20;:50::i;:::-;46864:12;;:14;;;;;;;;;;;;;43885:3012;;;;43816:3081;;:::o;64804:747::-;64885:7;64894:12;64943:2;64923:9;:16;:22;64919:625;;;64962:9;64986;65010:7;65267:4;65256:9;65252:20;65246:27;65241:32;;65317:4;65306:9;65302:20;65296:27;65291:32;;65375:4;65364:9;65360:20;65354:27;65351:1;65346:36;65341:41;;65418:25;65429:4;65435:1;65438;65441;65418:10;:25::i;:::-;65411:32;;;;;;;;;64919:625;65492:1;65496:35;65476:56;;;;64804:747;;;;;;:::o;63075:643::-;63153:20;63144:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;63140:571;;;63190:7;;63140:571;63251:29;63242:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;63238:473;;;63297:34;;;;;;;;;;:::i;:::-;;;;;;;;63238:473;63362:35;63353:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;63349:362;;;63414:41;;;;;;;;;;:::i;:::-;;;;;;;;63349:362;63486:30;63477:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;63473:238;;;63533:44;;;;;;;;;;:::i;:::-;;;;;;;;63473:238;63608:30;63599:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;63595:116;;;63655:44;;;;;;;;;;:::i;:::-;;;;;;;;63595:116;63075:643;;:::o;52157:675::-;52240:7;52260:20;52283:4;52260:27;;52303:9;52298:497;52322:5;:12;52318:1;:16;52298:497;;;52356:20;52379:5;52385:1;52379:8;;;;;;;;:::i;:::-;;;;;;;;52356:31;;52422:12;52406;:28;52402:382;;52549:42;52564:12;52578;52549:14;:42::i;:::-;52534:57;;52402:382;;;52726:42;52741:12;52755;52726:14;:42::i;:::-;52711:57;;52402:382;52341:454;52336:3;;;;;:::i;:::-;;;;52298:497;;;;52812:12;52805:19;;;52157:675;;;;:::o;36628:2966::-;36701:20;36724:13;;36701:36;;36764:1;36752:8;:13;36748:44;;;36774:18;;;;;;;;;;;;;;36748:44;36805:61;36835:1;36839:2;36843:12;36857:8;36805:21;:61::i;:::-;37349:1;10349:2;37319:1;:26;;37318:32;37306:8;:45;37280:18;:22;37299:2;37280:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;37628:139;37665:2;37719:33;37742:1;37746:2;37750:1;37719:14;:33::i;:::-;37686:30;37707:8;37686:20;:30::i;:::-;:66;37628:18;:139::i;:::-;37594:17;:31;37612:12;37594:31;;;;;;;;;;;:173;;;;37784:16;37815:11;37844:8;37829:12;:23;37815:37;;38365:16;38361:2;38357:25;38345:37;;38737:12;38697:8;38656:1;38594:25;38535:1;38474;38447:335;39108:1;39094:12;39090:20;39048:346;39149:3;39140:7;39137:16;39048:346;;39367:7;39357:8;39354:1;39327:25;39324:1;39321;39316:59;39202:1;39193:7;39189:15;39178:26;;39048:346;;;39052:77;39439:1;39427:8;:13;39423:45;;;39449:19;;;;;;;;;;;;;;39423:45;39501:3;39485:13;:19;;;;37054:2462;;39526:60;39555:1;39559:2;39563:12;39577:8;39526:20;:60::i;:::-;36690:2904;36628:2966;;:::o;67805:1632::-;67936:7;67945:12;68870:66;68865:1;68857:10;;:79;68853:163;;;68969:1;68973:30;68953:51;;;;;;68853:163;69035:2;69030:1;:7;;;;:18;;;;;69046:2;69041:1;:7;;;;69030:18;69026:102;;;69081:1;69085:30;69065:51;;;;;;69026:102;69225:14;69242:24;69252:4;69258:1;69261;69264;69242:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69225:41;;69299:1;69281:20;;:6;:20;;;69277:103;;;69334:1;69338:29;69318:50;;;;;;;69277:103;69400:6;69408:20;69392:37;;;;;67805:1632;;;;;;;;:::o;52840:224::-;52908:13;52971:1;52965:4;52958:15;53000:1;52994:4;52987:15;53041:4;53035;53025:21;53016:30;;52840:224;;;;:::o;24040:324::-;24110:14;24343:1;24333:8;24330:15;24304:24;24300:46;24290:56;;24040:324;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::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:552::-;3359:8;3369:6;3419:3;3412:4;3404:6;3400:17;3396:27;3386:122;;3427:79;;:::i;:::-;3386:122;3540:6;3527:20;3517:30;;3570:18;3562:6;3559:30;3556:117;;;3592:79;;:::i;:::-;3556:117;3706:4;3698:6;3694:17;3682:29;;3760:3;3752:4;3744:6;3740:17;3730:8;3726:32;3723:41;3720:128;;;3767:79;;:::i;:::-;3720:128;3302:552;;;;;:::o;3873:338::-;3928:5;3977:3;3970:4;3962:6;3958:17;3954:27;3944:122;;3985:79;;:::i;:::-;3944:122;4102:6;4089:20;4127:78;4201:3;4193:6;4186:4;4178:6;4174:17;4127:78;:::i;:::-;4118:87;;3934:277;3873:338;;;;:::o;4231:340::-;4287:5;4336:3;4329:4;4321:6;4317:17;4313:27;4303:122;;4344:79;;:::i;:::-;4303:122;4461:6;4448:20;4486:79;4561:3;4553:6;4546:4;4538:6;4534:17;4486:79;:::i;:::-;4477:88;;4293:278;4231:340;;;;:::o;4577:139::-;4623:5;4661:6;4648:20;4639:29;;4677:33;4704:5;4677:33;:::i;:::-;4577:139;;;;:::o;4722:329::-;4781:6;4830:2;4818:9;4809:7;4805:23;4801:32;4798:119;;;4836:79;;:::i;:::-;4798:119;4956:1;4981:53;5026:7;5017:6;5006:9;5002:22;4981:53;:::i;:::-;4971:63;;4927:117;4722:329;;;;:::o;5057:474::-;5125:6;5133;5182:2;5170:9;5161:7;5157:23;5153:32;5150:119;;;5188:79;;:::i;:::-;5150:119;5308:1;5333:53;5378:7;5369:6;5358:9;5354:22;5333:53;:::i;:::-;5323:63;;5279:117;5435:2;5461:53;5506:7;5497:6;5486:9;5482:22;5461:53;:::i;:::-;5451:63;;5406:118;5057:474;;;;;:::o;5537:619::-;5614:6;5622;5630;5679:2;5667:9;5658:7;5654:23;5650:32;5647:119;;;5685:79;;:::i;:::-;5647:119;5805:1;5830:53;5875:7;5866:6;5855:9;5851:22;5830:53;:::i;:::-;5820:63;;5776:117;5932:2;5958:53;6003:7;5994:6;5983:9;5979:22;5958:53;:::i;:::-;5948:63;;5903:118;6060:2;6086:53;6131:7;6122:6;6111:9;6107:22;6086:53;:::i;:::-;6076:63;;6031:118;5537:619;;;;;:::o;6162:943::-;6257:6;6265;6273;6281;6330:3;6318:9;6309:7;6305:23;6301:33;6298:120;;;6337:79;;:::i;:::-;6298:120;6457:1;6482:53;6527:7;6518:6;6507:9;6503:22;6482:53;:::i;:::-;6472:63;;6428:117;6584:2;6610:53;6655:7;6646:6;6635:9;6631:22;6610:53;:::i;:::-;6600:63;;6555:118;6712:2;6738:53;6783:7;6774:6;6763:9;6759:22;6738:53;:::i;:::-;6728:63;;6683:118;6868:2;6857:9;6853:18;6840:32;6899:18;6891:6;6888:30;6885:117;;;6921:79;;:::i;:::-;6885:117;7026:62;7080:7;7071:6;7060:9;7056:22;7026:62;:::i;:::-;7016:72;;6811:287;6162:943;;;;;;;:::o;7111:468::-;7176:6;7184;7233:2;7221:9;7212:7;7208:23;7204:32;7201:119;;;7239:79;;:::i;:::-;7201:119;7359:1;7384:53;7429:7;7420:6;7409:9;7405:22;7384:53;:::i;:::-;7374:63;;7330:117;7486:2;7512:50;7554:7;7545:6;7534:9;7530:22;7512:50;:::i;:::-;7502:60;;7457:115;7111:468;;;;;:::o;7585:474::-;7653:6;7661;7710:2;7698:9;7689:7;7685:23;7681:32;7678:119;;;7716:79;;:::i;:::-;7678:119;7836:1;7861:53;7906:7;7897:6;7886:9;7882:22;7861:53;:::i;:::-;7851:63;;7807:117;7963:2;7989:53;8034:7;8025:6;8014:9;8010:22;7989:53;:::i;:::-;7979:63;;7934:118;7585:474;;;;;:::o;8065:684::-;8158:6;8166;8215:2;8203:9;8194:7;8190:23;8186:32;8183:119;;;8221:79;;:::i;:::-;8183:119;8369:1;8358:9;8354:17;8341:31;8399:18;8391:6;8388:30;8385:117;;;8421:79;;:::i;:::-;8385:117;8526:78;8596:7;8587:6;8576:9;8572:22;8526:78;:::i;:::-;8516:88;;8312:302;8653:2;8679:53;8724:7;8715:6;8704:9;8700:22;8679:53;:::i;:::-;8669:63;;8624:118;8065:684;;;;;:::o;8755:329::-;8814:6;8863:2;8851:9;8842:7;8838:23;8834:32;8831:119;;;8869:79;;:::i;:::-;8831:119;8989:1;9014:53;9059:7;9050:6;9039:9;9035:22;9014:53;:::i;:::-;9004:63;;8960:117;8755:329;;;;:::o;9090:327::-;9148:6;9197:2;9185:9;9176:7;9172:23;9168:32;9165:119;;;9203:79;;:::i;:::-;9165:119;9323:1;9348:52;9392:7;9383:6;9372:9;9368:22;9348:52;:::i;:::-;9338:62;;9294:116;9090:327;;;;:::o;9423:349::-;9492:6;9541:2;9529:9;9520:7;9516:23;9512:32;9509:119;;;9547:79;;:::i;:::-;9509:119;9667:1;9692:63;9747:7;9738:6;9727:9;9723:22;9692:63;:::i;:::-;9682:73;;9638:127;9423:349;;;;:::o;9778:672::-;9857:6;9865;9873;9922:2;9910:9;9901:7;9897:23;9893:32;9890:119;;;9928:79;;:::i;:::-;9890:119;10076:1;10065:9;10061:17;10048:31;10106:18;10098:6;10095:30;10092:117;;;10128:79;;:::i;:::-;10092:117;10241:64;10297:7;10288:6;10277:9;10273:22;10241:64;:::i;:::-;10223:82;;;;10019:296;10354:2;10380:53;10425:7;10416:6;10405:9;10401:22;10380:53;:::i;:::-;10370:63;;10325:118;9778:672;;;;;:::o;10456:507::-;10524:6;10573:2;10561:9;10552:7;10548:23;10544:32;10541:119;;;10579:79;;:::i;:::-;10541:119;10727:1;10716:9;10712:17;10699:31;10757:18;10749:6;10746:30;10743:117;;;10779:79;;:::i;:::-;10743:117;10884:62;10938:7;10929:6;10918:9;10914:22;10884:62;:::i;:::-;10874:72;;10670:286;10456:507;;;;:::o;10969:509::-;11038:6;11087:2;11075:9;11066:7;11062:23;11058:32;11055:119;;;11093:79;;:::i;:::-;11055:119;11241:1;11230:9;11226:17;11213:31;11271:18;11263:6;11260:30;11257:117;;;11293:79;;:::i;:::-;11257:117;11398:63;11453:7;11444:6;11433:9;11429:22;11398:63;:::i;:::-;11388:73;;11184:287;10969:509;;;;:::o;11484:329::-;11543:6;11592:2;11580:9;11571:7;11567:23;11563:32;11560:119;;;11598:79;;:::i;:::-;11560:119;11718:1;11743:53;11788:7;11779:6;11768:9;11764:22;11743:53;:::i;:::-;11733:63;;11689:117;11484:329;;;;:::o;11819:704::-;11914:6;11922;11930;11979:2;11967:9;11958:7;11954:23;11950:32;11947:119;;;11985:79;;:::i;:::-;11947:119;12105:1;12130:53;12175:7;12166:6;12155:9;12151:22;12130:53;:::i;:::-;12120:63;;12076:117;12260:2;12249:9;12245:18;12232:32;12291:18;12283:6;12280:30;12277:117;;;12313:79;;:::i;:::-;12277:117;12426:80;12498:7;12489:6;12478:9;12474:22;12426:80;:::i;:::-;12408:98;;;;12203:313;11819:704;;;;;:::o;12529:672::-;12608:6;12616;12624;12673:2;12661:9;12652:7;12648:23;12644:32;12641:119;;;12679:79;;:::i;:::-;12641:119;12799:1;12824:53;12869:7;12860:6;12849:9;12845:22;12824:53;:::i;:::-;12814:63;;12770:117;12954:2;12943:9;12939:18;12926:32;12985:18;12977:6;12974:30;12971:117;;;13007:79;;:::i;:::-;12971:117;13120:64;13176:7;13167:6;13156:9;13152:22;13120:64;:::i;:::-;13102:82;;;;12897:297;12529:672;;;;;:::o;13207:474::-;13275:6;13283;13332:2;13320:9;13311:7;13307:23;13303:32;13300:119;;;13338:79;;:::i;:::-;13300:119;13458:1;13483:53;13528:7;13519:6;13508:9;13504:22;13483:53;:::i;:::-;13473:63;;13429:117;13585:2;13611:53;13656:7;13647:6;13636:9;13632:22;13611:53;:::i;:::-;13601:63;;13556:118;13207:474;;;;;:::o;13687:195::-;13764:10;13785:54;13835:3;13827:6;13785:54;:::i;:::-;13871:4;13866:3;13862:14;13848:28;;13687:195;;;;:::o;13888:118::-;13975:24;13993:5;13975:24;:::i;:::-;13970:3;13963:37;13888:118;;:::o;14012:157::-;14117:45;14137:24;14155:5;14137:24;:::i;:::-;14117:45;:::i;:::-;14112:3;14105:58;14012:157;;:::o;14207:738::-;14361:52;14407:5;14361:52;:::i;:::-;14429:102;14524:6;14519:3;14429:102;:::i;:::-;14422:109;;14555:54;14603:5;14555:54;:::i;:::-;14632:7;14663:1;14648:290;14673:6;14670:1;14667:13;14648:290;;;14749:6;14743:13;14776:71;14843:3;14828:13;14776:71;:::i;:::-;14769:78;;14870:58;14921:6;14870:58;:::i;:::-;14860:68;;14708:230;14695:1;14692;14688:9;14683:14;;14648:290;;;14652:14;14337:608;;;14207:738;;:::o;14951:109::-;15032:21;15047:5;15032:21;:::i;:::-;15027:3;15020:34;14951:109;;:::o;15066:118::-;15153:24;15171:5;15153:24;:::i;:::-;15148:3;15141:37;15066:118;;:::o;15190:116::-;15275:24;15293:5;15275:24;:::i;:::-;15270:3;15263:37;15190:116;;:::o;15312:157::-;15417:45;15437:24;15455:5;15437:24;:::i;:::-;15417:45;:::i;:::-;15412:3;15405:58;15312:157;;:::o;15497:314::-;15611:3;15632:88;15713:6;15708:3;15632:88;:::i;:::-;15625:95;;15730:43;15766:6;15761:3;15754:5;15730:43;:::i;:::-;15798:6;15793:3;15789:16;15782:23;;15497:314;;;;;:::o;15817:360::-;15903:3;15931:38;15963:5;15931:38;:::i;:::-;15985:70;16048:6;16043:3;15985:70;:::i;:::-;15978:77;;16064:52;16109:6;16104:3;16097:4;16090:5;16086:16;16064:52;:::i;:::-;16141:29;16163:6;16141:29;:::i;:::-;16136:3;16132:39;16125:46;;15907:270;15817:360;;;;:::o;16183:364::-;16271:3;16299:39;16332:5;16299:39;:::i;:::-;16354:71;16418:6;16413:3;16354:71;:::i;:::-;16347:78;;16434:52;16479:6;16474:3;16467:4;16460:5;16456:16;16434:52;:::i;:::-;16511:29;16533:6;16511:29;:::i;:::-;16506:3;16502:39;16495:46;;16275:272;16183:364;;;;:::o;16553:377::-;16659:3;16687:39;16720:5;16687:39;:::i;:::-;16742:89;16824:6;16819:3;16742:89;:::i;:::-;16735:96;;16840:52;16885:6;16880:3;16873:4;16866:5;16862:16;16840:52;:::i;:::-;16917:6;16912:3;16908:16;16901:23;;16663:267;16553:377;;;;:::o;16936:366::-;17078:3;17099:67;17163:2;17158:3;17099:67;:::i;:::-;17092:74;;17175:93;17264:3;17175:93;:::i;:::-;17293:2;17288:3;17284:12;17277:19;;16936:366;;;:::o;17308:::-;17450:3;17471:67;17535:2;17530:3;17471:67;:::i;:::-;17464:74;;17547:93;17636:3;17547:93;:::i;:::-;17665:2;17660:3;17656:12;17649:19;;17308:366;;;:::o;17680:::-;17822:3;17843:67;17907:2;17902:3;17843:67;:::i;:::-;17836:74;;17919:93;18008:3;17919:93;:::i;:::-;18037:2;18032:3;18028:12;18021:19;;17680:366;;;:::o;18052:402::-;18212:3;18233:85;18315:2;18310:3;18233:85;:::i;:::-;18226:92;;18327:93;18416:3;18327:93;:::i;:::-;18445:2;18440:3;18436:12;18429:19;;18052:402;;;:::o;18460:366::-;18602:3;18623:67;18687:2;18682:3;18623:67;:::i;:::-;18616:74;;18699:93;18788:3;18699:93;:::i;:::-;18817:2;18812:3;18808:12;18801:19;;18460:366;;;:::o;18832:::-;18974:3;18995:67;19059:2;19054:3;18995:67;:::i;:::-;18988:74;;19071:93;19160:3;19071:93;:::i;:::-;19189:2;19184:3;19180:12;19173:19;;18832:366;;;:::o;19204:::-;19346:3;19367:67;19431:2;19426:3;19367:67;:::i;:::-;19360:74;;19443:93;19532:3;19443:93;:::i;:::-;19561:2;19556:3;19552:12;19545:19;;19204:366;;;:::o;19576:::-;19718:3;19739:67;19803:2;19798:3;19739:67;:::i;:::-;19732:74;;19815:93;19904:3;19815:93;:::i;:::-;19933:2;19928:3;19924:12;19917:19;;19576:366;;;:::o;19948:::-;20090:3;20111:67;20175:2;20170:3;20111:67;:::i;:::-;20104:74;;20187:93;20276:3;20187:93;:::i;:::-;20305:2;20300:3;20296:12;20289:19;;19948:366;;;:::o;20320:::-;20462:3;20483:67;20547:2;20542:3;20483:67;:::i;:::-;20476:74;;20559:93;20648:3;20559:93;:::i;:::-;20677:2;20672:3;20668:12;20661:19;;20320:366;;;:::o;20692:::-;20834:3;20855:67;20919:2;20914:3;20855:67;:::i;:::-;20848:74;;20931:93;21020:3;20931:93;:::i;:::-;21049:2;21044:3;21040:12;21033:19;;20692:366;;;:::o;21064:::-;21206:3;21227:67;21291:2;21286:3;21227:67;:::i;:::-;21220:74;;21303:93;21392:3;21303:93;:::i;:::-;21421:2;21416:3;21412:12;21405:19;;21064:366;;;:::o;21436:::-;21578:3;21599:67;21663:2;21658:3;21599:67;:::i;:::-;21592:74;;21675:93;21764:3;21675:93;:::i;:::-;21793:2;21788:3;21784:12;21777:19;;21436:366;;;:::o;21808:::-;21950:3;21971:67;22035:2;22030:3;21971:67;:::i;:::-;21964:74;;22047:93;22136:3;22047:93;:::i;:::-;22165:2;22160:3;22156:12;22149:19;;21808:366;;;:::o;22180:::-;22322:3;22343:67;22407:2;22402:3;22343:67;:::i;:::-;22336:74;;22419:93;22508:3;22419:93;:::i;:::-;22537:2;22532:3;22528:12;22521:19;;22180:366;;;:::o;22552:::-;22694:3;22715:67;22779:2;22774:3;22715:67;:::i;:::-;22708:74;;22791:93;22880:3;22791:93;:::i;:::-;22909:2;22904:3;22900:12;22893:19;;22552:366;;;:::o;22924:::-;23066:3;23087:67;23151:2;23146:3;23087:67;:::i;:::-;23080:74;;23163:93;23252:3;23163:93;:::i;:::-;23281:2;23276:3;23272:12;23265:19;;22924:366;;;:::o;23296:::-;23438:3;23459:67;23523:2;23518:3;23459:67;:::i;:::-;23452:74;;23535:93;23624:3;23535:93;:::i;:::-;23653:2;23648:3;23644:12;23637:19;;23296:366;;;:::o;23668:::-;23810:3;23831:67;23895:2;23890:3;23831:67;:::i;:::-;23824:74;;23907:93;23996:3;23907:93;:::i;:::-;24025:2;24020:3;24016:12;24009:19;;23668:366;;;:::o;24040:::-;24182:3;24203:67;24267:2;24262:3;24203:67;:::i;:::-;24196:74;;24279:93;24368:3;24279:93;:::i;:::-;24397:2;24392:3;24388:12;24381:19;;24040:366;;;:::o;24412:118::-;24499:24;24517:5;24499:24;:::i;:::-;24494:3;24487:37;24412:118;;:::o;24536:157::-;24641:45;24661:24;24679:5;24661:24;:::i;:::-;24641:45;:::i;:::-;24636:3;24629:58;24536:157;;:::o;24699:112::-;24782:22;24798:5;24782:22;:::i;:::-;24777:3;24770:35;24699:112;;:::o;24817:256::-;24929:3;24944:75;25015:3;25006:6;24944:75;:::i;:::-;25044:2;25039:3;25035:12;25028:19;;25064:3;25057:10;;24817:256;;;;:::o;25079:348::-;25237:3;25252:121;25369:3;25360:6;25252:121;:::i;:::-;25398:2;25393:3;25389:12;25382:19;;25418:3;25411:10;;25079:348;;;;:::o;25433:291::-;25573:3;25595:103;25694:3;25685:6;25677;25595:103;:::i;:::-;25588:110;;25715:3;25708:10;;25433:291;;;;;:::o;25730:435::-;25910:3;25932:95;26023:3;26014:6;25932:95;:::i;:::-;25925:102;;26044:95;26135:3;26126:6;26044:95;:::i;:::-;26037:102;;26156:3;26149:10;;25730:435;;;;;:::o;26171:522::-;26384:3;26406:148;26550:3;26406:148;:::i;:::-;26399:155;;26564:75;26635:3;26626:6;26564:75;:::i;:::-;26664:2;26659:3;26655:12;26648:19;;26684:3;26677:10;;26171:522;;;;:::o;26699:256::-;26811:3;26826:75;26897:3;26888:6;26826:75;:::i;:::-;26926:2;26921:3;26917:12;26910:19;;26946:3;26939:10;;26699:256;;;;:::o;26961:222::-;27054:4;27092:2;27081:9;27077:18;27069:26;;27105:71;27173:1;27162:9;27158:17;27149:6;27105:71;:::i;:::-;26961:222;;;;:::o;27189:640::-;27384:4;27422:3;27411:9;27407:19;27399:27;;27436:71;27504:1;27493:9;27489:17;27480:6;27436:71;:::i;:::-;27517:72;27585:2;27574:9;27570:18;27561:6;27517:72;:::i;:::-;27599;27667:2;27656:9;27652:18;27643:6;27599:72;:::i;:::-;27718:9;27712:4;27708:20;27703:2;27692:9;27688:18;27681:48;27746:76;27817:4;27808:6;27746:76;:::i;:::-;27738:84;;27189:640;;;;;;;:::o;27835:210::-;27922:4;27960:2;27949:9;27945:18;27937:26;;27973:65;28035:1;28024:9;28020:17;28011:6;27973:65;:::i;:::-;27835:210;;;;:::o;28051:222::-;28144:4;28182:2;28171:9;28167:18;28159:26;;28195:71;28263:1;28252:9;28248:17;28239:6;28195:71;:::i;:::-;28051:222;;;;:::o;28279:545::-;28452:4;28490:3;28479:9;28475:19;28467:27;;28504:71;28572:1;28561:9;28557:17;28548:6;28504:71;:::i;:::-;28585:68;28649:2;28638:9;28634:18;28625:6;28585:68;:::i;:::-;28663:72;28731:2;28720:9;28716:18;28707:6;28663:72;:::i;:::-;28745;28813:2;28802:9;28798:18;28789:6;28745:72;:::i;:::-;28279:545;;;;;;;:::o;28830:313::-;28943:4;28981:2;28970:9;28966:18;28958:26;;29030:9;29024:4;29020:20;29016:1;29005:9;29001:17;28994:47;29058:78;29131:4;29122:6;29058:78;:::i;:::-;29050:86;;28830:313;;;;:::o;29149:419::-;29315:4;29353:2;29342:9;29338:18;29330:26;;29402:9;29396:4;29392:20;29388:1;29377:9;29373:17;29366:47;29430:131;29556:4;29430:131;:::i;:::-;29422:139;;29149:419;;;:::o;29574:::-;29740:4;29778:2;29767:9;29763:18;29755:26;;29827:9;29821:4;29817:20;29813:1;29802:9;29798:17;29791:47;29855:131;29981:4;29855:131;:::i;:::-;29847:139;;29574:419;;;:::o;29999:::-;30165:4;30203:2;30192:9;30188:18;30180:26;;30252:9;30246:4;30242:20;30238:1;30227:9;30223:17;30216:47;30280:131;30406:4;30280:131;:::i;:::-;30272:139;;29999:419;;;:::o;30424:::-;30590:4;30628:2;30617:9;30613:18;30605:26;;30677:9;30671:4;30667:20;30663:1;30652:9;30648:17;30641:47;30705:131;30831:4;30705:131;:::i;:::-;30697:139;;30424:419;;;:::o;30849:::-;31015:4;31053:2;31042:9;31038:18;31030:26;;31102:9;31096:4;31092:20;31088:1;31077:9;31073:17;31066:47;31130:131;31256:4;31130:131;:::i;:::-;31122:139;;30849:419;;;:::o;31274:::-;31440:4;31478:2;31467:9;31463:18;31455:26;;31527:9;31521:4;31517:20;31513:1;31502:9;31498:17;31491:47;31555:131;31681:4;31555:131;:::i;:::-;31547:139;;31274:419;;;:::o;31699:::-;31865:4;31903:2;31892:9;31888:18;31880:26;;31952:9;31946:4;31942:20;31938:1;31927:9;31923:17;31916:47;31980:131;32106:4;31980:131;:::i;:::-;31972:139;;31699:419;;;:::o;32124:::-;32290:4;32328:2;32317:9;32313:18;32305:26;;32377:9;32371:4;32367:20;32363:1;32352:9;32348:17;32341:47;32405:131;32531:4;32405:131;:::i;:::-;32397:139;;32124:419;;;:::o;32549:::-;32715:4;32753:2;32742:9;32738:18;32730:26;;32802:9;32796:4;32792:20;32788:1;32777:9;32773:17;32766:47;32830:131;32956:4;32830:131;:::i;:::-;32822:139;;32549:419;;;:::o;32974:::-;33140:4;33178:2;33167:9;33163:18;33155:26;;33227:9;33221:4;33217:20;33213:1;33202:9;33198:17;33191:47;33255:131;33381:4;33255:131;:::i;:::-;33247:139;;32974:419;;;:::o;33399:::-;33565:4;33603:2;33592:9;33588:18;33580:26;;33652:9;33646:4;33642:20;33638:1;33627:9;33623:17;33616:47;33680:131;33806:4;33680:131;:::i;:::-;33672:139;;33399:419;;;:::o;33824:::-;33990:4;34028:2;34017:9;34013:18;34005:26;;34077:9;34071:4;34067:20;34063:1;34052:9;34048:17;34041:47;34105:131;34231:4;34105:131;:::i;:::-;34097:139;;33824:419;;;:::o;34249:::-;34415:4;34453:2;34442:9;34438:18;34430:26;;34502:9;34496:4;34492:20;34488:1;34477:9;34473:17;34466:47;34530:131;34656:4;34530:131;:::i;:::-;34522:139;;34249:419;;;:::o;34674:::-;34840:4;34878:2;34867:9;34863:18;34855:26;;34927:9;34921:4;34917:20;34913:1;34902:9;34898:17;34891:47;34955:131;35081:4;34955:131;:::i;:::-;34947:139;;34674:419;;;:::o;35099:::-;35265:4;35303:2;35292:9;35288:18;35280:26;;35352:9;35346:4;35342:20;35338:1;35327:9;35323:17;35316:47;35380:131;35506:4;35380:131;:::i;:::-;35372:139;;35099:419;;;:::o;35524:::-;35690:4;35728:2;35717:9;35713:18;35705:26;;35777:9;35771:4;35767:20;35763:1;35752:9;35748:17;35741:47;35805:131;35931:4;35805:131;:::i;:::-;35797:139;;35524:419;;;:::o;35949:::-;36115:4;36153:2;36142:9;36138:18;36130:26;;36202:9;36196:4;36192:20;36188:1;36177:9;36173:17;36166:47;36230:131;36356:4;36230:131;:::i;:::-;36222:139;;35949:419;;;:::o;36374:::-;36540:4;36578:2;36567:9;36563:18;36555:26;;36627:9;36621:4;36617:20;36613:1;36602:9;36598:17;36591:47;36655:131;36781:4;36655:131;:::i;:::-;36647:139;;36374:419;;;:::o;36799:::-;36965:4;37003:2;36992:9;36988:18;36980:26;;37052:9;37046:4;37042:20;37038:1;37027:9;37023:17;37016:47;37080:131;37206:4;37080:131;:::i;:::-;37072:139;;36799:419;;;:::o;37224:222::-;37317:4;37355:2;37344:9;37340:18;37332:26;;37368:71;37436:1;37425:9;37421:17;37412:6;37368:71;:::i;:::-;37224:222;;;;:::o;37452:332::-;37573:4;37611:2;37600:9;37596:18;37588:26;;37624:71;37692:1;37681:9;37677:17;37668:6;37624:71;:::i;:::-;37705:72;37773:2;37762:9;37758:18;37749:6;37705:72;:::i;:::-;37452:332;;;;;:::o;37790:129::-;37824:6;37851:20;;:::i;:::-;37841:30;;37880:33;37908:4;37900:6;37880:33;:::i;:::-;37790:129;;;:::o;37925:75::-;37958:6;37991:2;37985:9;37975:19;;37925:75;:::o;38006:311::-;38083:4;38173:18;38165:6;38162:30;38159:56;;;38195:18;;:::i;:::-;38159:56;38245:4;38237:6;38233:17;38225:25;;38305:4;38299;38295:15;38287:23;;38006:311;;;:::o;38323:307::-;38384:4;38474:18;38466:6;38463:30;38460:56;;;38496:18;;:::i;:::-;38460:56;38534:29;38556:6;38534:29;:::i;:::-;38526:37;;38618:4;38612;38608:15;38600:23;;38323:307;;;:::o;38636:308::-;38698:4;38788:18;38780:6;38777:30;38774:56;;;38810:18;;:::i;:::-;38774:56;38848:29;38870:6;38848:29;:::i;:::-;38840:37;;38932:4;38926;38922:15;38914:23;;38636:308;;;:::o;38950:98::-;39015:4;39038:3;39030:11;;38950:98;;;:::o;39054:104::-;39119:6;39147:4;39137:14;;39054:104;;;:::o;39164:98::-;39215:6;39249:5;39243:12;39233:22;;39164:98;;;:::o;39268:99::-;39320:6;39354:5;39348:12;39338:22;;39268:99;;;:::o;39373:111::-;39441:4;39473;39468:3;39464:14;39456:22;;39373:111;;;:::o;39490:161::-;39605:11;39642:3;39627:18;;39490:161;;;;:::o;39657:168::-;39740:11;39774:6;39769:3;39762:19;39814:4;39809:3;39805:14;39790:29;;39657:168;;;;:::o;39831:147::-;39932:11;39969:3;39954:18;;39831:147;;;;:::o;39984:169::-;40068:11;40102:6;40097:3;40090:19;40142:4;40137:3;40133:14;40118:29;;39984:169;;;;:::o;40159:148::-;40261:11;40298:3;40283:18;;40159:148;;;;:::o;40313:305::-;40353:3;40372:20;40390:1;40372:20;:::i;:::-;40367:25;;40406:20;40424:1;40406:20;:::i;:::-;40401:25;;40560:1;40492:66;40488:74;40485:1;40482:81;40479:107;;;40566:18;;:::i;:::-;40479:107;40610:1;40607;40603:9;40596:16;;40313:305;;;;:::o;40624:348::-;40664:7;40687:20;40705:1;40687:20;:::i;:::-;40682:25;;40721:20;40739:1;40721:20;:::i;:::-;40716:25;;40909:1;40841:66;40837:74;40834:1;40831:81;40826:1;40819:9;40812:17;40808:105;40805:131;;;40916:18;;:::i;:::-;40805:131;40964:1;40961;40957:9;40946:20;;40624:348;;;;:::o;40978:191::-;41018:4;41038:20;41056:1;41038:20;:::i;:::-;41033:25;;41072:20;41090:1;41072:20;:::i;:::-;41067:25;;41111:1;41108;41105:8;41102:34;;;41116:18;;:::i;:::-;41102:34;41161:1;41158;41154:9;41146:17;;40978:191;;;;:::o;41175:96::-;41212:7;41241:24;41259:5;41241:24;:::i;:::-;41230:35;;41175:96;;;:::o;41277:90::-;41311:7;41354:5;41347:13;41340:21;41329:32;;41277:90;;;:::o;41373:77::-;41410:7;41439:5;41428:16;;41373:77;;;:::o;41456:149::-;41492:7;41532:66;41525:5;41521:78;41510:89;;41456:149;;;:::o;41611:126::-;41648:7;41688:42;41681:5;41677:54;41666:65;;41611:126;;;:::o;41743:77::-;41780:7;41809:5;41798:16;;41743:77;;;:::o;41826:86::-;41861:7;41901:4;41894:5;41890:16;41879:27;;41826:86;;;:::o;41918:154::-;42002:6;41997:3;41992;41979:30;42064:1;42055:6;42050:3;42046:16;42039:27;41918:154;;;:::o;42078:307::-;42146:1;42156:113;42170:6;42167:1;42164:13;42156:113;;;42255:1;42250:3;42246:11;42240:18;42236:1;42231:3;42227:11;42220:39;42192:2;42189:1;42185:10;42180:15;;42156:113;;;42287:6;42284:1;42281:13;42278:101;;;42367:1;42358:6;42353:3;42349:16;42342:27;42278:101;42127:258;42078:307;;;:::o;42391:320::-;42435:6;42472:1;42466:4;42462:12;42452:22;;42519:1;42513:4;42509:12;42540:18;42530:81;;42596:4;42588:6;42584:17;42574:27;;42530:81;42658:2;42650:6;42647:14;42627:18;42624:38;42621:84;;;42677:18;;:::i;:::-;42621:84;42442:269;42391:320;;;:::o;42717:281::-;42800:27;42822:4;42800:27;:::i;:::-;42792:6;42788:40;42930:6;42918:10;42915:22;42894:18;42882:10;42879:34;42876:62;42873:88;;;42941:18;;:::i;:::-;42873:88;42981:10;42977:2;42970:22;42760:238;42717:281;;:::o;43004:233::-;43043:3;43066:24;43084:5;43066:24;:::i;:::-;43057:33;;43112:66;43105:5;43102:77;43099:103;;;43182:18;;:::i;:::-;43099:103;43229:1;43222:5;43218:13;43211:20;;43004:233;;;:::o;43243:100::-;43282:7;43311:26;43331:5;43311:26;:::i;:::-;43300:37;;43243:100;;;:::o;43349:79::-;43388:7;43417:5;43406:16;;43349:79;;;:::o;43434:94::-;43473:7;43502:20;43516:5;43502:20;:::i;:::-;43491:31;;43434:94;;;:::o;43534:79::-;43573:7;43602:5;43591:16;;43534:79;;;:::o;43619:180::-;43667:77;43664:1;43657:88;43764:4;43761:1;43754:15;43788:4;43785:1;43778:15;43805:180;43853:77;43850:1;43843:88;43950:4;43947:1;43940:15;43974:4;43971:1;43964:15;43991:180;44039:77;44036:1;44029:88;44136:4;44133:1;44126:15;44160:4;44157:1;44150:15;44177:180;44225:77;44222:1;44215:88;44322:4;44319:1;44312:15;44346:4;44343:1;44336:15;44363:180;44411:77;44408:1;44401:88;44508:4;44505:1;44498:15;44532:4;44529:1;44522:15;44549:117;44658:1;44655;44648:12;44672:117;44781:1;44778;44771:12;44795:117;44904:1;44901;44894:12;44918:117;45027:1;45024;45017:12;45041:117;45150:1;45147;45140:12;45164:117;45273:1;45270;45263:12;45287:102;45328:6;45379:2;45375:7;45370:2;45363:5;45359:14;45355:28;45345:38;;45287:102;;;:::o;45395:94::-;45428:8;45476:5;45472:2;45468:14;45447:35;;45395:94;;;:::o;45495:174::-;45635:26;45631:1;45623:6;45619:14;45612:50;45495:174;:::o;45675:164::-;45815:16;45811:1;45803:6;45799:14;45792:40;45675:164;:::o;45845:181::-;45985:33;45981:1;45973:6;45969:14;45962:57;45845:181;:::o;46032:214::-;46172:66;46168:1;46160:6;46156:14;46149:90;46032:214;:::o;46252:171::-;46392:23;46388:1;46380:6;46376:14;46369:47;46252:171;:::o;46429:225::-;46569:34;46565:1;46557:6;46553:14;46546:58;46638:8;46633:2;46625:6;46621:15;46614:33;46429:225;:::o;46660:177::-;46800:29;46796:1;46788:6;46784:14;46777:53;46660:177;:::o;46843:173::-;46983:25;46979:1;46971:6;46967:14;46960:49;46843:173;:::o;47022:171::-;47162:23;47158:1;47150:6;47146:14;47139:47;47022:171;:::o;47199:221::-;47339:34;47335:1;47327:6;47323:14;47316:58;47408:4;47403:2;47395:6;47391:15;47384:29;47199:221;:::o;47426:171::-;47566:23;47562:1;47554:6;47550:14;47543:47;47426:171;:::o;47603:169::-;47743:21;47739:1;47731:6;47727:14;47720:45;47603:169;:::o;47778:173::-;47918:25;47914:1;47906:6;47902:14;47895:49;47778:173;:::o;47957:221::-;48097:34;48093:1;48085:6;48081:14;48074:58;48166:4;48161:2;48153:6;48149:15;48142:29;47957:221;:::o;48184:167::-;48324:19;48320:1;48312:6;48308:14;48301:43;48184:167;:::o;48357:182::-;48497:34;48493:1;48485:6;48481:14;48474:58;48357:182;:::o;48545:171::-;48685:23;48681:1;48673:6;48669:14;48662:47;48545:171;:::o;48722:176::-;48862:28;48858:1;48850:6;48846:14;48839:52;48722:176;:::o;48904:178::-;49044:30;49040:1;49032:6;49028:14;49021:54;48904:178;:::o;49088:171::-;49228:23;49224:1;49216:6;49212:14;49205:47;49088:171;:::o;49265:122::-;49338:24;49356:5;49338:24;:::i;:::-;49331:5;49328:35;49318:63;;49377:1;49374;49367:12;49318:63;49265:122;:::o;49393:116::-;49463:21;49478:5;49463:21;:::i;:::-;49456:5;49453:32;49443:60;;49499:1;49496;49489:12;49443:60;49393:116;:::o;49515:122::-;49588:24;49606:5;49588:24;:::i;:::-;49581:5;49578:35;49568:63;;49627:1;49624;49617:12;49568:63;49515:122;:::o;49643:120::-;49715:23;49732:5;49715:23;:::i;:::-;49708:5;49705:34;49695:62;;49753:1;49750;49743:12;49695:62;49643:120;:::o;49769:122::-;49842:24;49860:5;49842:24;:::i;:::-;49835:5;49832:35;49822:63;;49881:1;49878;49871:12;49822:63;49769:122;:::o

Swarm Source

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