ETH Price: $2,939.80 (-6.10%)
Gas: 7 Gwei

Token

DiscoverTheMandoxPt2 (DTM2)
 

Overview

Max Total Supply

2,000 DTM2

Holders

154

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
8 DTM2
0x10c699c787422f2306f5baac75367b3b9662ac76
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:
DiscoverTheMandox

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-02-01
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.14;

/*
*  The Second half - Discover the MANDOX
*  One contract - Five Drops
*  www.twitter.com/officialmandox
*  www.mandoxglobal.com
*  www.mandoxmint.com
*  t.me/officialmandox
*/

// File: solidity-bits/contracts/Popcount.sol

/**
   _____       ___     ___ __           ____  _ __      
  / ___/____  / (_)___/ (_) /___  __   / __ )(_) /______
  \__ \/ __ \/ / / __  / / __/ / / /  / __  / / __/ ___/
 ___/ / /_/ / / / /_/ / / /_/ /_/ /  / /_/ / / /_(__  ) 
/____/\____/_/_/\__,_/_/\__/\__, /  /_____/_/\__/____/  
                           /____/                        

- npm: https://www.npmjs.com/package/solidity-bits
- github: https://github.com/estarriolvetch/solidity-bits

 */

//pragma solidity ^0.8.0;

library Popcount {
    uint256 private constant m1 = 0x5555555555555555555555555555555555555555555555555555555555555555;
    uint256 private constant m2 = 0x3333333333333333333333333333333333333333333333333333333333333333;
    uint256 private constant m4 = 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f;
    uint256 private constant h01 = 0x0101010101010101010101010101010101010101010101010101010101010101;

    function popcount256A(uint256 x) internal pure returns (uint256 count) {
        unchecked{
            for (count=0; x!=0; count++)
                x &= x - 1;
        }
    }

    function popcount256B(uint256 x) internal pure returns (uint256) {
        if (x == type(uint256).max) {
            return 256;
        }
        unchecked {
            x -= (x >> 1) & m1;             //put count of each 2 bits into those 2 bits
            x = (x & m2) + ((x >> 2) & m2); //put count of each 4 bits into those 4 bits 
            x = (x + (x >> 4)) & m4;        //put count of each 8 bits into those 8 bits 
            x = (x * h01) >> 248;  //returns left 8 bits of x + (x<<8) + (x<<16) + (x<<24) + ... 
        }
        return x;
    }
}
// File: solidity-bits/contracts/BitScan.sol


/**
   _____       ___     ___ __           ____  _ __      
  / ___/____  / (_)___/ (_) /___  __   / __ )(_) /______
  \__ \/ __ \/ / / __  / / __/ / / /  / __  / / __/ ___/
 ___/ / /_/ / / / /_/ / / /_/ /_/ /  / /_/ / / /_(__  ) 
/____/\____/_/_/\__,_/_/\__/\__, /  /_____/_/\__/____/  
                           /____/                        

- npm: https://www.npmjs.com/package/solidity-bits
- github: https://github.com/estarriolvetch/solidity-bits

 */

//pragma solidity ^0.8.0;


library BitScan {
    uint256 constant private DEBRUIJN_256 = 0x818283848586878898a8b8c8d8e8f929395969799a9b9d9e9faaeb6bedeeff;
    bytes constant private LOOKUP_TABLE_256 = hex"0001020903110a19042112290b311a3905412245134d2a550c5d32651b6d3a7506264262237d468514804e8d2b95569d0d495ea533a966b11c886eb93bc176c9071727374353637324837e9b47af86c7155181ad4fd18ed32c9096db57d59ee30e2e4a6a5f92a6be3498aae067ddb2eb1d5989b56fd7baf33ca0c2ee77e5caf7ff0810182028303840444c545c646c7425617c847f8c949c48a4a8b087b8c0c816365272829aaec650acd0d28fdad4e22d6991bd97dfdcea58b4d6f29fede4f6fe0f1f2f3f4b5b6b607b8b93a3a7b7bf357199c5abcfd9e168bcdee9b3f1ecf5fd1e3e5a7a8aa2b670c4ced8bbe8f0f4fc3d79a1c3cde7effb78cce6facbf9f8";

    /**
        @dev Isolate the least significant set bit.
     */ 
    function isolateLS1B256(uint256 bb) pure internal returns (uint256) {
        require(bb > 0);
        unchecked {
            return bb & (0 - bb);
        }
    } 

    /**
        @dev Isolate the most significant set bit.
     */ 
    function isolateMS1B256(uint256 bb) pure internal returns (uint256) {
        require(bb > 0);
        unchecked {
            bb |= bb >> 128;
            bb |= bb >> 64;
            bb |= bb >> 32;
            bb |= bb >> 16;
            bb |= bb >> 8;
            bb |= bb >> 4;
            bb |= bb >> 2;
            bb |= bb >> 1;
            
            return (bb >> 1) + 1;
        }
    } 

    /**
        @dev Find the index of the lest significant set bit. (trailing zero count)
     */ 
    function bitScanForward256(uint256 bb) pure internal returns (uint8) {
        unchecked {
            return uint8(LOOKUP_TABLE_256[(isolateLS1B256(bb) * DEBRUIJN_256) >> 248]);
        }   
    }

    /**
        @dev Find the index of the most significant set bit.
     */ 
    function bitScanReverse256(uint256 bb) pure internal returns (uint8) {
        unchecked {
            return 255 - uint8(LOOKUP_TABLE_256[((isolateMS1B256(bb) * DEBRUIJN_256) >> 248)]);
        }   
    }

    function log2(uint256 bb) pure internal returns (uint8) {
        unchecked {
            return uint8(LOOKUP_TABLE_256[(isolateMS1B256(bb) * DEBRUIJN_256) >> 248]);
        } 
    }
}

// File: solidity-bits/contracts/BitMaps.sol


/**
   _____       ___     ___ __           ____  _ __      
  / ___/____  / (_)___/ (_) /___  __   / __ )(_) /______
  \__ \/ __ \/ / / __  / / __/ / / /  / __  / / __/ ___/
 ___/ / /_/ / / / /_/ / / /_/ /_/ /  / /_/ / / /_(__  ) 
/____/\____/_/_/\__,_/_/\__/\__, /  /_____/_/\__/____/  
                           /____/                        

- npm: https://www.npmjs.com/package/solidity-bits
- github: https://github.com/estarriolvetch/solidity-bits

 */
//pragma solidity ^0.8.0;



/**
 * @dev This Library is a modified version of Openzeppelin's BitMaps library with extra features.
 *
 * 1. Functions of finding the index of the closest set bit from a given index are added.
 *    The indexing of each bucket is modifed to count from the MSB to the LSB instead of from the LSB to the MSB.
 *    The modification of indexing makes finding the closest previous set bit more efficient in gas usage.
 * 2. Setting and unsetting the bitmap consecutively.
 * 3. Accounting number of set bits within a given range.   
 *
*/

/**
 * @dev Library for managing uint256 to bool mapping in a compact and efficient way, providing the keys are sequential.
 * Largelly inspired by Uniswap's https://github.com/Uniswap/merkle-distributor/blob/master/contracts/MerkleDistributor.sol[merkle-distributor].
 */

library BitMaps {
    using BitScan for uint256;
    uint256 private constant MASK_INDEX_ZERO = (1 << 255);
    uint256 private constant MASK_FULL = type(uint256).max;

    struct BitMap {
        mapping(uint256 => uint256) _data;
    }

    /**
     * @dev Returns whether the bit at `index` is set.
     */
    function get(BitMap storage bitmap, uint256 index) internal view returns (bool) {
        uint256 bucket = index >> 8;
        uint256 mask = MASK_INDEX_ZERO >> (index & 0xff);
        return bitmap._data[bucket] & mask != 0;
    }

    /**
     * @dev Sets the bit at `index` to the boolean `value`.
     */
    function setTo(
        BitMap storage bitmap,
        uint256 index,
        bool value
    ) internal {
        if (value) {
            set(bitmap, index);
        } else {
            unset(bitmap, index);
        }
    }

    /**
     * @dev Sets the bit at `index`.
     */
    function set(BitMap storage bitmap, uint256 index) internal {
        uint256 bucket = index >> 8;
        uint256 mask = MASK_INDEX_ZERO >> (index & 0xff);
        bitmap._data[bucket] |= mask;
    }

    /**
     * @dev Unsets the bit at `index`.
     */
    function unset(BitMap storage bitmap, uint256 index) internal {
        uint256 bucket = index >> 8;
        uint256 mask = MASK_INDEX_ZERO >> (index & 0xff);
        bitmap._data[bucket] &= ~mask;
    }


    /**
     * @dev Consecutively sets `amount` of bits starting from the bit at `startIndex`.
     */    
    function setBatch(BitMap storage bitmap, uint256 startIndex, uint256 amount) internal {
        uint256 bucket = startIndex >> 8;

        uint256 bucketStartIndex = (startIndex & 0xff);

        unchecked {
            if(bucketStartIndex + amount < 256) {
                bitmap._data[bucket] |= MASK_FULL << (256 - amount) >> bucketStartIndex;
            } else {
                bitmap._data[bucket] |= MASK_FULL >> bucketStartIndex;
                amount -= (256 - bucketStartIndex);
                bucket++;

                while(amount > 256) {
                    bitmap._data[bucket] = MASK_FULL;
                    amount -= 256;
                    bucket++;
                }

                bitmap._data[bucket] |= MASK_FULL << (256 - amount);
            }
        }
    }


    /**
     * @dev Consecutively unsets `amount` of bits starting from the bit at `startIndex`.
     */    
    function unsetBatch(BitMap storage bitmap, uint256 startIndex, uint256 amount) internal {
        uint256 bucket = startIndex >> 8;

        uint256 bucketStartIndex = (startIndex & 0xff);

        unchecked {
            if(bucketStartIndex + amount < 256) {
                bitmap._data[bucket] &= ~(MASK_FULL << (256 - amount) >> bucketStartIndex);
            } else {
                bitmap._data[bucket] &= ~(MASK_FULL >> bucketStartIndex);
                amount -= (256 - bucketStartIndex);
                bucket++;

                while(amount > 256) {
                    bitmap._data[bucket] = 0;
                    amount -= 256;
                    bucket++;
                }

                bitmap._data[bucket] &= ~(MASK_FULL << (256 - amount));
            }
        }
    }

    /**
     * @dev Returns number of set bits within a range.
     */
    function popcountA(BitMap storage bitmap, uint256 startIndex, uint256 amount) internal view returns(uint256 count) {
        uint256 bucket = startIndex >> 8;

        uint256 bucketStartIndex = (startIndex & 0xff);

        unchecked {
            if(bucketStartIndex + amount < 256) {
                count +=  Popcount.popcount256A(
                    bitmap._data[bucket] & (MASK_FULL << (256 - amount) >> bucketStartIndex)
                );
            } else {
                count += Popcount.popcount256A(
                    bitmap._data[bucket] & (MASK_FULL >> bucketStartIndex)
                );
                amount -= (256 - bucketStartIndex);
                bucket++;

                while(amount > 256) {
                    count += Popcount.popcount256A(bitmap._data[bucket]);
                    amount -= 256;
                    bucket++;
                }
                count += Popcount.popcount256A(
                    bitmap._data[bucket] & (MASK_FULL << (256 - amount))
                );
            }
        }
    }

    /**
     * @dev Returns number of set bits within a range.
     */
    function popcountB(BitMap storage bitmap, uint256 startIndex, uint256 amount) internal view returns(uint256 count) {
        uint256 bucket = startIndex >> 8;

        uint256 bucketStartIndex = (startIndex & 0xff);

        unchecked {
            if(bucketStartIndex + amount < 256) {
                count +=  Popcount.popcount256B(
                    bitmap._data[bucket] & (MASK_FULL << (256 - amount) >> bucketStartIndex)
                );
            } else {
                count += Popcount.popcount256B(
                    bitmap._data[bucket] & (MASK_FULL >> bucketStartIndex)
                );
                amount -= (256 - bucketStartIndex);
                bucket++;

                while(amount > 256) {
                    count += Popcount.popcount256B(bitmap._data[bucket]);
                    amount -= 256;
                    bucket++;
                }
                count += Popcount.popcount256B(
                    bitmap._data[bucket] & (MASK_FULL << (256 - amount))
                );
            }
        }
    }


    /**
     * @dev Find the closest index of the set bit before `index`.
     */
    function scanForward(BitMap storage bitmap, uint256 index) internal view returns (uint256 setBitIndex) {
        uint256 bucket = index >> 8;

        // index within the bucket
        uint256 bucketIndex = (index & 0xff);

        // load a bitboard from the bitmap.
        uint256 bb = bitmap._data[bucket];

        // offset the bitboard to scan from `bucketIndex`.
        bb = bb >> (0xff ^ bucketIndex); // bb >> (255 - bucketIndex)
        
        if(bb > 0) {
            unchecked {
                setBitIndex = (bucket << 8) | (bucketIndex -  bb.bitScanForward256());    
            }
        } else {
            while(true) {
                require(bucket > 0, "BitMaps: The set bit before the index doesn't exist.");
                unchecked {
                    bucket--;
                }
                // No offset. Always scan from the least significiant bit now.
                bb = bitmap._data[bucket];
                
                if(bb > 0) {
                    unchecked {
                        setBitIndex = (bucket << 8) | (255 -  bb.bitScanForward256());
                        break;
                    }
                } 
            }
        }
    }

    function getBucket(BitMap storage bitmap, uint256 bucket) internal view returns (uint256) {
        return bitmap._data[bucket];
    }
}

// File: @openzeppelin/contracts/utils/StorageSlot.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol)

//pragma solidity ^0.8.0;

/**
 * @dev Library for reading and writing primitive types to specific storage slots.
 *
 * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
 * This library helps with reading and writing to such slots without the need for inline assembly.
 *
 * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.
 *
 * Example usage to set ERC1967 implementation slot:
 * ```
 * contract ERC1967 {
 *     bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
 *
 *     function _getImplementation() internal view returns (address) {
 *         return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
 *     }
 *
 *     function _setImplementation(address newImplementation) internal {
 *         require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");
 *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
 *     }
 * }
 * ```
 *
 * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._
 */
library StorageSlot {
    struct AddressSlot {
        address value;
    }

    struct BooleanSlot {
        bool value;
    }

    struct Bytes32Slot {
        bytes32 value;
    }

    struct Uint256Slot {
        uint256 value;
    }

    /**
     * @dev Returns an `AddressSlot` with member `value` located at `slot`.
     */
    function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `BooleanSlot` with member `value` located at `slot`.
     */
    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.
     */
    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `Uint256Slot` with member `value` located at `slot`.
     */
    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }
}

// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

//pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [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);
            }
        }
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

//pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
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);
    }
}

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

//pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

//pragma solidity ^0.8.0;


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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _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);
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

//pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

//pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

//pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)

//pragma solidity ^0.8.0;


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

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

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

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

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

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

    /**
     * @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 have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

    /**
     * @dev 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);
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

//pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

//pragma solidity ^0.8.0;


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

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

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

// File: docs.chain.link/EVAKeepersAutomationPsi.sol


/**
  ______ _____   _____ ______ ___  __ _  _  _ 
 |  ____|  __ \ / ____|____  |__ \/_ | || || |
 | |__  | |__) | |        / /   ) || | \| |/ |
 |  __| |  _  /| |       / /   / / | |\_   _/ 
 | |____| | \ \| |____  / /   / /_ | |  | |   
 |______|_|  \_\\_____|/_/   |____||_|  |_|   

 - github: https://github.com/estarriolvetch/ERC721Psi
 - npm: https://www.npmjs.com/package/erc721psi
                                          
 */

//pragma solidity ^0.8.0;





// File: SafeMath.sol

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
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)
    {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        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)
    {
        // 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)
    {
        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)
    {
        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) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    /**
     * @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) {
        require(b <= a, "SafeMath: subtraction overflow");
        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) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @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. 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) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        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) {
        require(b > 0, "SafeMath: modulo by zero");
        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) {
        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.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * 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) {
        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) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

contract ERC721Psi is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;
    using BitMaps for BitMaps.BitMap;

    BitMaps.BitMap private _batchHead;

    string private _name;
    string private _symbol;

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

    mapping(uint256 => address) private _tokenApprovals;
    mapping(address => mapping(address => bool)) private _operatorApprovals;

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

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

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

        uint count;
        for( uint i; i < _minted; ++i ){
            if(_exists(i)){
                if( owner == ownerOf(i)){
                    ++count;
                }
            }
        }
        return count;
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        (address owner, ) = _ownerAndBatchHeadOf(tokenId);
        return owner;
    }

    function _ownerAndBatchHeadOf(uint256 tokenId) internal view returns (address owner, uint256 tokenIdBatchHead){
        require(_exists(tokenId), "ERC721Psi: owner query for nonexistent token");
        tokenIdBatchHead = _getBatchHead(tokenId);
        owner = _owners[tokenIdBatchHead];
    }

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

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

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

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

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


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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return tokenId < _minted;
    }

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

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

    
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal virtual {
        uint256 startTokenId = _minted;
        _mint(to, quantity);
        require(
            _checkOnERC721Received(address(0), to, startTokenId, quantity, _data),
            "ERC721Psi: transfer to non ERC721Receiver implementer"
        );
    }


    function _mint(
        address to,
        uint256 quantity
    ) internal virtual {
        uint256 tokenIdBatchHead = _minted;
        
        require(quantity > 0, "ERC721Psi: quantity must be greater 0");
        require(to != address(0), "ERC721Psi: mint to the zero address");
        
        _beforeTokenTransfers(address(0), to, tokenIdBatchHead, quantity);
        _minted += quantity;
        _owners[tokenIdBatchHead] = to;
        _batchHead.set(tokenIdBatchHead);
        _afterTokenTransfers(address(0), to, tokenIdBatchHead, quantity);
        
        // Emit events
        for(uint256 tokenId=tokenIdBatchHead;tokenId < tokenIdBatchHead + quantity; tokenId++){
            emit Transfer(address(0), to, tokenId);
        } 
    }


    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        (address owner, uint256 tokenIdBatchHead) = _ownerAndBatchHeadOf(tokenId);

        require(
            owner == from,
            "ERC721Psi: transfer of token that is not own"
        );
        require(to != address(0), "ERC721Psi: transfer to the zero address");

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        uint256 nextTokenId = tokenId + 1;

        if(!_batchHead.get(nextTokenId) &&  
            nextTokenId < _minted
        ) {
            _owners[nextTokenId] = from;
            _batchHead.set(nextTokenId);
        }

        _owners[tokenId] = to;
        if(tokenId != tokenIdBatchHead) {
            _batchHead.set(tokenId);
        }

        emit Transfer(from, to, tokenId);

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

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

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

    function _getBatchHead(uint256 tokenId) internal view returns (uint256 tokenIdBatchHead) {
        tokenIdBatchHead = _batchHead.scanForward(tokenId); 
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256 tokenId) {
        require(index < totalSupply(), "ERC721Psi: global index out of bounds");
        
        uint count;
        for(uint i; i < _minted; i++){
            if(_exists(i)){
                if(count == index) return i;
                else count++;
            }
        }
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256 tokenId) {
        uint count;
        for(uint i; i < _minted; i++){
            if(_exists(i) && owner == ownerOf(i)){
                if(count == index) return i;
                else count++;
            }
        }

        revert("ERC721Psi: owner index out of bounds");
    }


    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * 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`.
     */
    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.
     *
     * 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` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}


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

contract DiscoverTheMandox is ERC721Psi, Ownable {
    using SafeMath for uint256;
    using Strings for uint;

    /*
     * @dev Set Initial Parameters Before deployment
     * settings are still fully updateable after deployment
     */

    uint256 public maxSupply = 4500;
    uint256 public mintRate = 0.09 ether;
    // Mint Ending - Phase 1 total supply
    uint256 public phase1 = 1000;
    // Phase 2 total supply
    uint256 public phase2 = 2000;
    // Phase 3 total supply
    uint256 public phase3 = 3000;
    // Phase 4 total supply
    uint256 public phase4 = 4000;
    // Phase 5 total supply
    uint256 public phase5 = 4500;

    uint256 public activePhase = 1;


    /*
    * @Dev Booleans for sale states. 
    * salesIsActive must be true in any case to mint
    */
    bool public globalSaleIsActive = false;
    // Phase 1
    bool public saleIsActive = false;
    // Phase 2
    bool public saleIsActive2 = false;
    // Phase 3
    bool public saleIsActive3 = false;
    // Phase 4
    bool public saleIsActive4 = false;
    // Phase 5
    bool public saleIsActive5 = false;




    /*
     * @dev Set base URI, Make sure when dpeloying if you plan to Have an 
     * Unrevealed Sale or Period you Do not Deploy with your Revealed
     * base URI here or they will mint With your revealed Images Showing
     */
    string private baseURI;
    string private baseURI2;
    string private baseURI3;
    string private baseURI4;
    string private baseURI5;

    string public notRevealedUri;
    string public notRevealed2Uri;
    string public notRevealed3Uri;
    string public notRevealed4Uri;
    string public notRevealed5Uri;
    

    bool public revealed = false;
    bool public revealed2 = false;
    bool public revealed3 = false;
    bool public revealed4 = false;
    bool public revealed5 = false;
    


    
    /*
     * @dev Set Collection/Contract name and Token Ticker
     * below. Cannot be changed after
     * contract deployment.
     */
    constructor(string memory _baseUri, string memory _notRevealedUri) ERC721Psi("DiscoverTheMandoxPt2", "DTM2") {
        baseURI = _baseUri;
        notRevealedUri = _notRevealedUri;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */

    function tokenURI(uint256 tokenId) 
    public 
    view 
    virtual 
    override 
    returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();
        if (revealed == false && tokenId < 1000) {
            return notRevealedUri;
        } if (revealed == true && tokenId < 1000) { 
      
            return string(abi.encodePacked(baseURI, "/", tokenId.toString(), ""));
        } 

         if ( revealed2 == false && tokenId >= 1000 && tokenId < 2000) {
            return notRevealed2Uri;
        } if (revealed2 == true && tokenId >= 1000 && tokenId < 2000) {
            return string(abi.encodePacked(baseURI2,"/", tokenId.toString(), "")); 
        }

         if ( revealed3 == false && tokenId >= 2000 && tokenId < 3000) {
            return notRevealed3Uri;
        } if (revealed3 == true && tokenId >= 2000 && tokenId < 3000) {
            return string(abi.encodePacked(baseURI3,"/", tokenId.toString(), "")); 
        }

          if ( revealed4 == false && tokenId >= 3000 && tokenId < 4000) {
            return notRevealed4Uri;
        } if (revealed4 == true && tokenId >= 3000 && tokenId < 4000) {
            return string(abi.encodePacked(baseURI4,"/", tokenId.toString(), "")); 
        }

          if ( revealed5 == false && tokenId >= 4000 && tokenId < 4500) {
            return notRevealed5Uri;
        } if (revealed5 == true && tokenId >= 4000 && tokenId < 4500) {
            return string(abi.encodePacked(baseURI5,"/", tokenId.toString(), "")); 
        }

    }

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

    function RevealPhase2() public onlyOwner {
        revealed2 = true;
    }

    function RevealPhase3() public onlyOwner {
        revealed3 = true;
    }

    function RevealPhase4() public onlyOwner {
        revealed4 = true;
    }

    function RevealPhase5() public onlyOwner {
        revealed5 = true;
    }

    

    /*
    * set Not revealed URIs seperately for each phase
    */
    function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
        notRevealedUri = _notRevealedURI;
    }

    function setNotRevealedURI2(string memory _notRevealedURI2) public onlyOwner {
        notRevealed2Uri = _notRevealedURI2;
    }

    function setNotRevealedURI3(string memory _notRevealedURI3) public onlyOwner {
        notRevealed3Uri = _notRevealedURI3;
    }

    function setNotRevealedURI4(string memory _notRevealedURI4) public onlyOwner {
        notRevealed4Uri = _notRevealedURI4;
    }

    function setNotRevealedURI5(string memory _notRevealedURI5) public onlyOwner {
        notRevealed5Uri = _notRevealedURI5;
    }

    /*
     *@dev
     * Set publicsale price to mint per NFT
     */
    function setMintPrice(uint256 _price) external onlyOwner {
        mintRate = _price;
    }

    /*
    * @dev mint funtion with _to address. no cost mint
    *  by contract owner/deployer
    */
    function QwikMint(uint256 quantity, address _to) external onlyOwner {
        require(globalSaleIsActive, "Sales must be active to mint");
        require(totalSupply() + quantity <= maxSupply, "Not enough NFTs left to Mint");
        if (activePhase == 1){
            require(saleIsActive, "Phase 1 must be active to mint");
            require(totalSupply() + quantity <= phase1, "Not enough NFTs in this phase");
         _safeMint(_to, quantity);
        }

        if (activePhase == 2){
            require(saleIsActive2, "Phase 2 must be active to mint");
            require(totalSupply() + quantity <= phase2, "Not enough NFTs in this phase");
         _safeMint(_to, quantity);
        }

        if (activePhase == 3){
            require(saleIsActive3, "Phase 3 must be active to mint");
            require(totalSupply() + quantity <= phase3, "Not enough NFTs in this phase");
         _safeMint(_to, quantity);
        }

        if (activePhase == 4){
            require(saleIsActive4, "Phase 4 must be active to mint");
            require(totalSupply() + quantity <= phase4, "Not enough NFTs in this phase");
         _safeMint(_to, quantity);
        }

        if (activePhase == 5){
            require(saleIsActive5, "Phase 5 must be active to mint");
            require(totalSupply() + quantity <= phase5, "Not enough NFTs in this phase");
         _safeMint(_to, quantity);
        }
    }

    /*
    * @dev mint function and checks for saleState, phase and mint quantity
    */   
    function mint(uint256 quantity) external payable {
        require(globalSaleIsActive, "Sales must be active to mint");
        require(totalSupply() + quantity <= maxSupply, "Not enough NFTs left to Mint");
        require((mintRate * quantity) <= msg.value, "Not enough Eth");

        if (activePhase == 1){
            require(saleIsActive, "Phase 1 must be active to mint");
            require(totalSupply() + quantity <= phase1, "Not enough NFTs in this phase");
         _safeMint(msg.sender, quantity);
        }

        if (activePhase == 2){
            require(saleIsActive2, "Phase 2 must be active to mint");
            require(totalSupply() + quantity <= phase2, "Not enough NFTs in this phase");
         _safeMint(msg.sender, quantity);
        }

        if (activePhase == 3){
            require(saleIsActive3, "Phase 3 must be active to mint");
            require(totalSupply() + quantity <= phase3, "Not enough NFTs in this phase");
         _safeMint(msg.sender, quantity);
        }

        if (activePhase == 4){
            require(saleIsActive4, "Phase 4 must be active to mint");
            require(totalSupply() + quantity <= phase4, "Not enough NFTs in this phase");
         _safeMint(msg.sender, quantity);
        }

        if (activePhase == 5){
            require(saleIsActive5, "Phase 5 must be active to mint");
            require(totalSupply() + quantity <= phase5, "Not enough NFTs in this phase or Collection Finished");
         _safeMint(msg.sender, quantity);
        }

    }

    function NextPhase() external onlyOwner {
        if (activePhase == 1){
            activePhase = 2;
        } 
        else if (activePhase == 2){
            activePhase = 3;
        }
        else if (activePhase == 3){
            activePhase = 4;
        }
        else if (activePhase == 4){
            activePhase = 5;
        }
        else if (activePhase == 5){
            revert ("Final Phase Already Active");
        }

    }

    //set active phase number
    function setManualPhase(uint256 phase) external onlyOwner {
        activePhase = phase;
    }

    /*
     * @dev Set new Base URIs -Seperate for each drop, reamins single collection
     * useful for setting unrevealed uri to revealed Base URI
     * same as a reveal switch/state but not the extraness
     */
    function setBaseURI(string calldata newBaseURI) external onlyOwner {
        baseURI = newBaseURI;
    }

    function setBaseURI2(string calldata newBaseURI2) external onlyOwner {
        baseURI2 = newBaseURI2;
    }

    function setBaseURI3(string calldata newBaseURI3) external onlyOwner {
        baseURI3 = newBaseURI3;
    }

    function setBaseURI4(string calldata newBaseURI4) external onlyOwner {
        baseURI4 = newBaseURI4;
    }

    function setBaseURI5(string calldata newBaseURI5) external onlyOwner {
        baseURI5 = newBaseURI5;
    }

     /*
     * @dev internal baseUri function
     */
    function _baseURI() internal view override returns (string memory) {
        return baseURI;
    }

    // global sale active to enable contract mints globally
    function setGlobalSaleActive() public onlyOwner {
        globalSaleIsActive = !globalSaleIsActive;
    }

     /*
     * @dev Pause sale if active, make active if paused
     */
    function setSaleActivePhase1() public onlyOwner {
        saleIsActive = !saleIsActive;
    }

    function setSaleActivePhase2() public onlyOwner {
        saleIsActive2 = !saleIsActive2;
    }

    function setSaleActivePhase3() public onlyOwner {
        saleIsActive3 = !saleIsActive3;
    }

    function setSaleActivePhase4() public onlyOwner {
        saleIsActive4 = !saleIsActive4;
    }

    function setSaleActivePhase5() public onlyOwner {
        saleIsActive5 = !saleIsActive5;
    }

    /*
     * @dev Public Keepers or to Owner wallet Withdrawl function, Contract ETH balance
     * to owner wallet address.
     */
    function withdraw() external onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }
    
    /*
    * @dev Alternative withdrawl
    * mint funs to a specified address
    * 
    */
    function Withdraw(uint256 _amount, address payable _to)
        external
        onlyOwner
    {
        require(_amount > 0, "Withdraw must be greater than 0");
        require(_amount <= address(this).balance, "Amount too high");
        (bool success, ) = _to.call{value: _amount}("");
        require(success);
    }

        /**
     * Get the array of token for owner.
     */
    function tokensOfOwner(address _owner)
        external
        view
        returns (uint256[] memory)
    {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            for (uint256 index; index < tokenCount; index++) {
                result[index] = tokenOfOwnerByIndex(_owner, index);
            }
            return result;
        }
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_baseUri","type":"string"},{"internalType":"string","name":"_notRevealedUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"NextPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"QwikMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"RevealPhase1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"RevealPhase2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"RevealPhase3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"RevealPhase4","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"RevealPhase5","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address payable","name":"_to","type":"address"}],"name":"Withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"activePhase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globalSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealed2Uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealed3Uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealed4Uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealed5Uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","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":[],"name":"phase1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phase2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phase3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phase4","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phase5","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revealed2","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revealed3","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revealed4","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revealed5","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleIsActive2","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleIsActive3","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleIsActive4","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleIsActive5","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI2","type":"string"}],"name":"setBaseURI2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI3","type":"string"}],"name":"setBaseURI3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI4","type":"string"}],"name":"setBaseURI4","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI5","type":"string"}],"name":"setBaseURI5","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setGlobalSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"phase","type":"uint256"}],"name":"setManualPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI2","type":"string"}],"name":"setNotRevealedURI2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI3","type":"string"}],"name":"setNotRevealedURI3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI4","type":"string"}],"name":"setNotRevealedURI4","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI5","type":"string"}],"name":"setNotRevealedURI5","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setSaleActivePhase1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setSaleActivePhase2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setSaleActivePhase3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setSaleActivePhase4","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setSaleActivePhase5","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052611194600881905567013fbe85edc900006009556103e8600a556107d0600b55610bb8600c55610fa0600d55600e556001600f556010805465ffffffffffff19169055601b805464ffffffffff191690553480156200006257600080fd5b5060405162003bbe38038062003bbe833981016040819052620000859162000316565b604080518082018252601481527f446973636f7665725468654d616e646f78507432000000000000000000000000602080830191825283518085019094526004845263222a269960e11b908401528151919291620000e691600191620001a3565b508051620000fc906002906020840190620001a3565b50505062000119620001136200014d60201b60201c565b62000151565b81516200012e906011906020850190620001a3565b50805162000144906016906020840190620001a3565b505050620003bc565b3390565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001b19062000380565b90600052602060002090601f016020900481019282620001d5576000855562000220565b82601f10620001f057805160ff191683800117855562000220565b8280016001018555821562000220579182015b828111156200022057825182559160200191906001019062000203565b506200022e92915062000232565b5090565b5b808211156200022e576000815560010162000233565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200027157600080fd5b81516001600160401b03808211156200028e576200028e62000249565b604051601f8301601f19908116603f01168101908282118183101715620002b957620002b962000249565b81604052838152602092508683858801011115620002d657600080fd5b600091505b83821015620002fa5785820183015181830184015290820190620002db565b838211156200030c5760008385830101525b9695505050505050565b600080604083850312156200032a57600080fd5b82516001600160401b03808211156200034257600080fd5b62000350868387016200025f565b935060208501519150808211156200036757600080fd5b5062000376858286016200025f565b9150509250929050565b600181811c908216806200039557607f821691505b602082108103620003b657634e487b7160e01b600052602260045260246000fd5b50919050565b6137f280620003cc6000396000f3fe60806040526004361061041b5760003560e01c806367b6dad81161021e578063b890b05511610123578063e985e9c5116100ab578063f31d12471161007a578063f31d124714610bbc578063f4a0a52814610bdc578063f6e330f214610bfc578063fab651e414610c11578063fb21df5414610c2657600080fd5b8063e985e9c514610b14578063eb8d244414610b5d578063f2c4ce1e14610b7c578063f2fde38b14610b9c57600080fd5b8063ca37f8c1116100f2578063ca37f8c114610a91578063d4deb3b614610ab2578063d5abeb0114610ac8578063d76d1fc814610ade578063e7c5622914610afe57600080fd5b8063b890b05514610a25578063c3b0157b14610a45578063c87b56dd14610a5b578063ca0dcf1614610a7b57600080fd5b80638da5cb5b116101a6578063a0712d6811610175578063a0712d6814610992578063a22cb465146109a5578063a45801a2146109c5578063b29c736d146109e4578063b88d4fde14610a0557600080fd5b80638da5cb5b14610934578063910dd0f514610952578063942715951461096857806395d89b411461097d57600080fd5b806372b474f4116101ed57806372b474f4146108915780637af66391146108b25780638353ffca146108d25780638462151c146108f25780638d53b1df1461091f57600080fd5b806367b6dad8146108315780636be997381461084657806370a082311461085c578063715018a61461087c57600080fd5b80632f745c59116103245780634f6ccce7116102ac5780635ea996141161027b5780635ea99614146107a6578063607447bd146107c6578063613b7139146107db5780636352211e146107f057806364b95aa41461081057600080fd5b80634f6ccce714610737578063518302271461075757806352df2b451461077157806355f804b31461078657600080fd5b80633bf2a064116102f35780633bf2a064146106ad5780633ccfd60b146106cd57806342842e0e146106e257806348f921fa146107025780634d893f921461072257600080fd5b80632f745c59146106385780633034dfcb1461065857806331afd4c31461066d578063328d9e301461068d57600080fd5b80631348bcc1116103a757806323b872dd1161037657806323b872dd146105b957806324403f91146105d9578063271bec5e146105ee57806328e4f54c1461060e5780632f5dd25f1461062357600080fd5b80631348bcc11461055457806313625fa71461056e578063150646e51461058357806318160ddd146105a457600080fd5b8063081c8c44116103ee578063081c8c44146104c6578063095ea7b3146104db5780630e1b26c6146104fb57806310c23e541461051f578063110e09cc1461053f57600080fd5b806301ffc9a71461042057806304c46ed91461045557806306fdde031461046c578063081812fc1461048e575b600080fd5b34801561042c57600080fd5b5061044061043b366004612fd1565b610c46565b60405190151581526020015b60405180910390f35b34801561046157600080fd5b5061046a610cb3565b005b34801561047857600080fd5b50610481610ccf565b60405161044c919061304d565b34801561049a57600080fd5b506104ae6104a9366004613060565b610d61565b6040516001600160a01b03909116815260200161044c565b3480156104d257600080fd5b50610481610df3565b3480156104e757600080fd5b5061046a6104f636600461308e565b610e81565b34801561050757600080fd5b50610511600f5481565b60405190815260200161044c565b34801561052b57600080fd5b5061046a61053a366004613146565b610f98565b34801561054b57600080fd5b5061046a610fb7565b34801561056057600080fd5b506010546104409060ff1681565b34801561057a57600080fd5b5061046a610fe0565b34801561058f57600080fd5b50601b5461044090600160201b900460ff1681565b3480156105b057600080fd5b50600454610511565b3480156105c557600080fd5b5061046a6105d436600461318f565b61100b565b3480156105e557600080fd5b5061048161103c565b3480156105fa57600080fd5b5061046a6106093660046131d0565b611049565b34801561061a57600080fd5b5061046a61105d565b34801561062f57600080fd5b50610481611074565b34801561064457600080fd5b5061051161065336600461308e565b611081565b34801561066457600080fd5b5061046a61114b565b34801561067957600080fd5b5061046a610688366004613146565b611164565b34801561069957600080fd5b5061046a6106a8366004613060565b61117f565b3480156106b957600080fd5b5061046a6106c83660046131d0565b61118c565b3480156106d957600080fd5b5061046a6111a0565b3480156106ee57600080fd5b5061046a6106fd36600461318f565b6111e4565b34801561070e57600080fd5b5061046a61071d3660046131d0565b6111ff565b34801561072e57600080fd5b5061046a611213565b34801561074357600080fd5b50610511610752366004613060565b611230565b34801561076357600080fd5b50601b546104409060ff1681565b34801561077d57600080fd5b5061046a6112ea565b34801561079257600080fd5b5061046a6107a13660046131d0565b611311565b3480156107b257600080fd5b5061046a6107c13660046131d0565b611325565b3480156107d257600080fd5b5061046a611339565b3480156107e757600080fd5b50610481611363565b3480156107fc57600080fd5b506104ae61080b366004613060565b611370565b34801561081c57600080fd5b5060105461044090600160201b900460ff1681565b34801561083d57600080fd5b5061046a611384565b34801561085257600080fd5b50610511600d5481565b34801561086857600080fd5b50610511610877366004613242565b6113a9565b34801561088857600080fd5b5061046a611479565b34801561089d57600080fd5b50601054610440906301000000900460ff1681565b3480156108be57600080fd5b5061046a6108cd366004613146565b61148d565b3480156108de57600080fd5b5061046a6108ed36600461325f565b6114a8565b3480156108fe57600080fd5b5061091261090d366004613242565b6115a2565b60405161044c919061328f565b34801561092b57600080fd5b5061046a611660565b34801561094057600080fd5b506007546001600160a01b03166104ae565b34801561095e57600080fd5b50610511600e5481565b34801561097457600080fd5b5061046a61167e565b34801561098957600080fd5b5061048161171c565b61046a6109a0366004613060565b61172b565b3480156109b157600080fd5b5061046a6109c03660046132d3565b611ba4565b3480156109d157600080fd5b50601b5461044090610100900460ff1681565b3480156109f057600080fd5b50601b54610440906301000000900460ff1681565b348015610a1157600080fd5b5061046a610a20366004613306565b611c68565b348015610a3157600080fd5b50601b546104409062010000900460ff1681565b348015610a5157600080fd5b50610511600c5481565b348015610a6757600080fd5b50610481610a76366004613060565b611ca0565b348015610a8757600080fd5b5061051160095481565b348015610a9d57600080fd5b5060105461044090600160281b900460ff1681565b348015610abe57600080fd5b50610511600b5481565b348015610ad457600080fd5b5061051160085481565b348015610aea57600080fd5b5061046a610af936600461325f565b611fa4565b348015610b0a57600080fd5b50610511600a5481565b348015610b2057600080fd5b50610440610b2f366004613386565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b348015610b6957600080fd5b5060105461044090610100900460ff1681565b348015610b8857600080fd5b5061046a610b97366004613146565b61238a565b348015610ba857600080fd5b5061046a610bb7366004613242565b6123a5565b348015610bc857600080fd5b506010546104409062010000900460ff1681565b348015610be857600080fd5b5061046a610bf7366004613060565b61241b565b348015610c0857600080fd5b5061046a612428565b348015610c1d57600080fd5b50610481612443565b348015610c3257600080fd5b5061046a610c41366004613146565b612450565b60006001600160e01b031982166380ac58cd60e01b1480610c7757506001600160e01b03198216635b5e139f60e01b145b80610c9257506001600160e01b0319821663780e9d6360e01b145b80610cad57506301ffc9a760e01b6001600160e01b03198316145b92915050565b610cbb61246b565b6010805460ff19811660ff90911615179055565b606060018054610cde906133b4565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0a906133b4565b8015610d575780601f10610d2c57610100808354040283529160200191610d57565b820191906000526020600020905b815481529060010190602001808311610d3a57829003601f168201915b5050505050905090565b6000610d6e826004541190565b610dd75760405162461bcd60e51b815260206004820152602f60248201527f4552433732315073693a20617070726f76656420717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b60168054610e00906133b4565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2c906133b4565b8015610e795780601f10610e4e57610100808354040283529160200191610e79565b820191906000526020600020905b815481529060010190602001808311610e5c57829003601f168201915b505050505081565b6000610e8c82611370565b9050806001600160a01b0316836001600160a01b031603610efb5760405162461bcd60e51b8152602060048201526024808201527f4552433732315073693a20617070726f76616c20746f2063757272656e74206f6044820152633bb732b960e11b6064820152608401610dce565b336001600160a01b0382161480610f175750610f178133610b2f565b610f895760405162461bcd60e51b815260206004820152603b60248201527f4552433732315073693a20617070726f76652063616c6c6572206973206e6f7460448201527f206f776e6572206e6f7220617070726f76656420666f7220616c6c00000000006064820152608401610dce565b610f9383836124c5565b505050565b610fa061246b565b8051610fb390601a906020840190612eae565b5050565b610fbf61246b565b6010805463ff00000019811663010000009182900460ff1615909102179055565b610fe861246b565b6010805465ff0000000000198116600160281b9182900460ff1615909102179055565b6110153382612533565b6110315760405162461bcd60e51b8152600401610dce906133e8565b610f93838383612622565b60188054610e00906133b4565b61105161246b565b610f9360138383612f32565b61106561246b565b601b805460ff19166001179055565b60198054610e00906133b4565b60008060005b6004548110156110f65761109c816004541190565b80156110c157506110ac81611370565b6001600160a01b0316856001600160a01b0316145b156110e4578382036110d6579150610cad9050565b816110e081613452565b9250505b806110ee81613452565b915050611087565b5060405162461bcd60e51b8152602060048201526024808201527f4552433732315073693a206f776e657220696e646578206f7574206f6620626f604482015263756e647360e01b6064820152608401610dce565b61115361246b565b601b805461ff001916610100179055565b61116c61246b565b8051610fb3906017906020840190612eae565b61118761246b565b600f55565b61119461246b565b610f9360158383612f32565b6111a861246b565b6007546040516001600160a01b03909116904780156108fc02916000818181858888f193505050501580156111e1573d6000803e3d6000fd5b50565b610f9383838360405180602001604052806000815250611c68565b61120761246b565b610f9360128383612f32565b61121b61246b565b601b805463ff00000019166301000000179055565b600061123b60045490565b82106112975760405162461bcd60e51b815260206004820152602560248201527f4552433732315073693a20676c6f62616c20696e646578206f7574206f6620626044820152646f756e647360d81b6064820152608401610dce565b6000805b6004548110156112e3576112b0816004541190565b156112d1578382036112c3579392505050565b816112cd81613452565b9250505b806112db81613452565b91505061129b565b5050919050565b6112f261246b565b6010805462ff0000198116620100009182900460ff1615909102179055565b61131961246b565b610f9360118383612f32565b61132d61246b565b610f9360148383612f32565b61134161246b565b6010805464ff00000000198116600160201b9182900460ff1615909102179055565b60178054610e00906133b4565b60008061137c8361280e565b509392505050565b61138c61246b565b6010805461ff001981166101009182900460ff1615909102179055565b60006001600160a01b0382166114175760405162461bcd60e51b815260206004820152602d60248201527f4552433732315073693a2062616c616e636520717565727920666f722074686560448201526c207a65726f206164647265737360981b6064820152608401610dce565b6000805b60045481101561147257611430816004541190565b156114625761143e81611370565b6001600160a01b0316846001600160a01b0316036114625761145f82613452565b91505b61146b81613452565b905061141b565b5092915050565b61148161246b565b61148b60006128a7565b565b61149561246b565b8051610fb3906018906020840190612eae565b6114b061246b565b600082116115005760405162461bcd60e51b815260206004820152601f60248201527f5769746864726177206d7573742062652067726561746572207468616e2030006044820152606401610dce565b478211156115425760405162461bcd60e51b815260206004820152600f60248201526e082dadeeadce840e8dede40d0d2ced608b1b6044820152606401610dce565b6000816001600160a01b03168360405160006040518083038185875af1925050503d806000811461158f576040519150601f19603f3d011682016040523d82523d6000602084013e611594565b606091505b5050905080610f9357600080fd5b606060006115af836113a9565b9050806000036115cf57604080516000808252602082019092529061137c565b60008167ffffffffffffffff8111156115ea576115ea6130ba565b604051908082528060200260200182016040528015611613578160200160208202803683370190505b50905060005b8281101561137c5761162b8582611081565b82828151811061163d5761163d61346b565b60209081029190910101528061165281613452565b915050611619565b50919050565b61166861246b565b601b805464ff000000001916600160201b179055565b61168661246b565b600f54600103611697576002600f55565b600f546002036116a8576003600f55565b600f546003036116b9576004600f55565b600f546004036116ca576005600f55565b600f5460050361148b5760405162461bcd60e51b815260206004820152601a60248201527f46696e616c20506861736520416c7265616479204163746976650000000000006044820152606401610dce565b606060028054610cde906133b4565b60105460ff1661177d5760405162461bcd60e51b815260206004820152601c60248201527f53616c6573206d7573742062652061637469766520746f206d696e74000000006044820152606401610dce565b6008548161178a60045490565b6117949190613481565b11156117e25760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420656e6f756768204e465473206c65667420746f204d696e74000000006044820152606401610dce565b34816009546117f19190613499565b11156118305760405162461bcd60e51b815260206004820152600e60248201526d09cdee840cadcdeeaced0408ae8d60931b6044820152606401610dce565b600f546001036118d057601054610100900460ff166118915760405162461bcd60e51b815260206004820152601e60248201527f50686173652031206d7573742062652061637469766520746f206d696e7400006044820152606401610dce565b600a548161189e60045490565b6118a89190613481565b11156118c65760405162461bcd60e51b8152600401610dce906134b8565b6118d033826128f9565b600f546002036119715760105462010000900460ff166119325760405162461bcd60e51b815260206004820152601e60248201527f50686173652032206d7573742062652061637469766520746f206d696e7400006044820152606401610dce565b600b548161193f60045490565b6119499190613481565b11156119675760405162461bcd60e51b8152600401610dce906134b8565b61197133826128f9565b600f54600303611a13576010546301000000900460ff166119d45760405162461bcd60e51b815260206004820152601e60248201527f50686173652033206d7573742062652061637469766520746f206d696e7400006044820152606401610dce565b600c54816119e160045490565b6119eb9190613481565b1115611a095760405162461bcd60e51b8152600401610dce906134b8565b611a1333826128f9565b600f54600403611ab557601054600160201b900460ff16611a765760405162461bcd60e51b815260206004820152601e60248201527f50686173652034206d7573742062652061637469766520746f206d696e7400006044820152606401610dce565b600d5481611a8360045490565b611a8d9190613481565b1115611aab5760405162461bcd60e51b8152600401610dce906134b8565b611ab533826128f9565b600f546005036111e157601054600160281b900460ff16611b185760405162461bcd60e51b815260206004820152601e60248201527f50686173652035206d7573742062652061637469766520746f206d696e7400006044820152606401610dce565b600e5481611b2560045490565b611b2f9190613481565b1115611b9a5760405162461bcd60e51b815260206004820152603460248201527f4e6f7420656e6f756768204e46547320696e2074686973207068617365206f726044820152730810dbdb1b1958dd1a5bdb88119a5b9a5cda195960621b6064820152608401610dce565b6111e133826128f9565b336001600160a01b03831603611bfc5760405162461bcd60e51b815260206004820152601c60248201527f4552433732315073693a20617070726f766520746f2063616c6c6572000000006044820152606401610dce565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611c723383612533565b611c8e5760405162461bcd60e51b8152600401610dce906133e8565b611c9a84848484612913565b50505050565b6060611cad826004541190565b611cca57604051630a14c4b560e41b815260040160405180910390fd5b601b5460ff16158015611cde57506103e882105b15611d755760168054611cf0906133b4565b80601f0160208091040260200160405190810160405280929190818152602001828054611d1c906133b4565b8015611d695780601f10611d3e57610100808354040283529160200191611d69565b820191906000526020600020905b815481529060010190602001808311611d4c57829003601f168201915b50505050509050919050565b601b5460ff1615156001148015611d8d57506103e882105b15611dc4576011611d9d83612948565b604051602001611dae92919061350b565b6040516020818303038152906040529050919050565b601b54610100900460ff16158015611dde57506103e88210155b8015611deb57506107d082105b15611dfd5760178054611cf0906133b4565b601b5460ff6101009091041615156001148015611e1c57506103e88210155b8015611e2957506107d082105b15611e39576012611d9d83612948565b601b5462010000900460ff16158015611e5457506107d08210155b8015611e615750610bb882105b15611e735760188054611cf0906133b4565b601b5462010000900460ff1615156001148015611e9257506107d08210155b8015611e9f5750610bb882105b15611eaf576013611d9d83612948565b601b546301000000900460ff16158015611ecb5750610bb88210155b8015611ed85750610fa082105b15611eea5760198054611cf0906133b4565b601b546301000000900460ff1615156001148015611f0a5750610bb88210155b8015611f175750610fa082105b15611f27576014611d9d83612948565b601b54600160201b900460ff16158015611f435750610fa08210155b8015611f50575061119482105b15611f6257601a8054611cf0906133b4565b601b54600160201b900460ff1615156001148015611f825750610fa08210155b8015611f8f575061119482105b15611f9f576015611d9d83612948565b919050565b611fac61246b565b60105460ff16611ffe5760405162461bcd60e51b815260206004820152601c60248201527f53616c6573206d7573742062652061637469766520746f206d696e74000000006044820152606401610dce565b6008548261200b60045490565b6120159190613481565b11156120635760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420656e6f756768204e465473206c65667420746f204d696e74000000006044820152606401610dce565b600f5460010361210357601054610100900460ff166120c45760405162461bcd60e51b815260206004820152601e60248201527f50686173652031206d7573742062652061637469766520746f206d696e7400006044820152606401610dce565b600a54826120d160045490565b6120db9190613481565b11156120f95760405162461bcd60e51b8152600401610dce906134b8565b61210381836128f9565b600f546002036121a45760105462010000900460ff166121655760405162461bcd60e51b815260206004820152601e60248201527f50686173652032206d7573742062652061637469766520746f206d696e7400006044820152606401610dce565b600b548261217260045490565b61217c9190613481565b111561219a5760405162461bcd60e51b8152600401610dce906134b8565b6121a481836128f9565b600f54600303612246576010546301000000900460ff166122075760405162461bcd60e51b815260206004820152601e60248201527f50686173652033206d7573742062652061637469766520746f206d696e7400006044820152606401610dce565b600c548261221460045490565b61221e9190613481565b111561223c5760405162461bcd60e51b8152600401610dce906134b8565b61224681836128f9565b600f546004036122e857601054600160201b900460ff166122a95760405162461bcd60e51b815260206004820152601e60248201527f50686173652034206d7573742062652061637469766520746f206d696e7400006044820152606401610dce565b600d54826122b660045490565b6122c09190613481565b11156122de5760405162461bcd60e51b8152600401610dce906134b8565b6122e881836128f9565b600f54600503610fb357601054600160281b900460ff1661234b5760405162461bcd60e51b815260206004820152601e60248201527f50686173652035206d7573742062652061637469766520746f206d696e7400006044820152606401610dce565b600e548261235860045490565b6123629190613481565b11156123805760405162461bcd60e51b8152600401610dce906134b8565b610fb381836128f9565b61239261246b565b8051610fb3906016906020840190612eae565b6123ad61246b565b6001600160a01b0381166124125760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610dce565b6111e1816128a7565b61242361246b565b600955565b61243061246b565b601b805462ff0000191662010000179055565b601a8054610e00906133b4565b61245861246b565b8051610fb3906019906020840190612eae565b6007546001600160a01b0316331461148b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610dce565b600081815260056020526040902080546001600160a01b0319166001600160a01b03841690811790915581906124fa82611370565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612540826004541190565b6125a45760405162461bcd60e51b815260206004820152602f60248201527f4552433732315073693a206f70657261746f7220717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610dce565b60006125af83611370565b9050806001600160a01b0316846001600160a01b031614806125ea5750836001600160a01b03166125df84610d61565b6001600160a01b0316145b8061261a57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b60008061262e8361280e565b91509150846001600160a01b0316826001600160a01b0316146126a85760405162461bcd60e51b815260206004820152602c60248201527f4552433732315073693a207472616e73666572206f6620746f6b656e2074686160448201526b3a1034b9903737ba1037bbb760a11b6064820152608401610dce565b6001600160a01b03841661270e5760405162461bcd60e51b815260206004820152602760248201527f4552433732315073693a207472616e7366657220746f20746865207a65726f206044820152666164647265737360c81b6064820152608401610dce565b6127196000846124c5565b6000612726846001613481565b600881901c600090815260208190526040902054909150600160ff1b60ff83161c16158015612756575060045481105b1561278c57600081815260036020526040812080546001600160a01b0319166001600160a01b03891617905561278c9082612a49565b600084815260036020526040902080546001600160a01b0319166001600160a01b0387161790558184146127c5576127c5600085612a49565b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b60008061281c836004541190565b61287d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732315073693a206f776e657220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610dce565b61288683612a75565b6000818152600360205260409020546001600160a01b031694909350915050565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610fb3828260405180602001604052806000815250612a81565b61291e848484612622565b61292c848484600185612a98565b611c9a5760405162461bcd60e51b8152600401610dce906135b8565b60608160000361296f5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612999578061298381613452565b91506129929050600a83613623565b9150612973565b60008167ffffffffffffffff8111156129b4576129b46130ba565b6040519080825280601f01601f1916602001820160405280156129de576020820181803683370190505b5090505b841561261a576129f3600183613637565b9150612a00600a8661364e565b612a0b906030613481565b60f81b818381518110612a2057612a2061346b565b60200101906001600160f81b031916908160001a905350612a42600a86613623565b94506129e2565b600881901c600090815260209290925260409091208054600160ff1b60ff9093169290921c9091179055565b6000610cad8183612bcf565b600454612a8e8484612cc7565b61292c6000858386865b60006001600160a01b0385163b15612bc257506001835b612ab98486613481565b811015612bbc57604051630a85bd0160e11b81526001600160a01b0387169063150b7a0290612af29033908b9086908990600401613662565b6020604051808303816000875af1925050508015612b2d575060408051601f3d908101601f19168201909252612b2a9181019061369f565b60015b612b8a573d808015612b5b576040519150601f19603f3d011682016040523d82523d6000602084013e612b60565b606091505b508051600003612b825760405162461bcd60e51b8152600401610dce906135b8565b805181602001fd5b828015612ba757506001600160e01b03198116630a85bd0160e11b145b92505080612bb481613452565b915050612aaf565b50612bc6565b5060015b95945050505050565b600881901c60008181526020849052604081205490919060ff808516919082181c8015612c1157612bff81612e2c565b60ff168203600884901b179350612cbe565b60008311612c7e5760405162461bcd60e51b815260206004820152603460248201527f4269744d6170733a205468652073657420626974206265666f7265207468652060448201527334b73232bc103237b2b9b713ba1032bc34b9ba1760611b6064820152608401610dce565b506000199091016000818152602086905260409020549091908015612cb957612ca681612e2c565b60ff0360ff16600884901b179350612cbe565b612c11565b50505092915050565b60045481612d255760405162461bcd60e51b815260206004820152602560248201527f4552433732315073693a207175616e74697479206d7573742062652067726561604482015264074657220360dc1b6064820152608401610dce565b6001600160a01b038316612d875760405162461bcd60e51b815260206004820152602360248201527f4552433732315073693a206d696e7420746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610dce565b8160046000828254612d999190613481565b9091555050600081815260036020526040812080546001600160a01b0319166001600160a01b038616179055612dcf9082612a49565b805b612ddb8383613481565b811015611c9a5760405181906001600160a01b038616906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480612e2481613452565b915050612dd1565b600060405180610120016040528061010081526020016136bd610100913960f87e818283848586878898a8b8c8d8e8f929395969799a9b9d9e9faaeb6bedeeff612e7585612e96565b02901c81518110612e8857612e8861346b565b016020015160f81c92915050565b6000808211612ea457600080fd5b5060008190031690565b828054612eba906133b4565b90600052602060002090601f016020900481019282612edc5760008555612f22565b82601f10612ef557805160ff1916838001178555612f22565b82800160010185558215612f22579182015b82811115612f22578251825591602001919060010190612f07565b50612f2e929150612fa6565b5090565b828054612f3e906133b4565b90600052602060002090601f016020900481019282612f605760008555612f22565b82601f10612f795782800160ff19823516178555612f22565b82800160010185558215612f22579182015b82811115612f22578235825591602001919060010190612f8b565b5b80821115612f2e5760008155600101612fa7565b6001600160e01b0319811681146111e157600080fd5b600060208284031215612fe357600080fd5b8135612fee81612fbb565b9392505050565b60005b83811015613010578181015183820152602001612ff8565b83811115611c9a5750506000910152565b60008151808452613039816020860160208601612ff5565b601f01601f19169290920160200192915050565b602081526000612fee6020830184613021565b60006020828403121561307257600080fd5b5035919050565b6001600160a01b03811681146111e157600080fd5b600080604083850312156130a157600080fd5b82356130ac81613079565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156130eb576130eb6130ba565b604051601f8501601f19908116603f01168101908282118183101715613113576131136130ba565b8160405280935085815286868601111561312c57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561315857600080fd5b813567ffffffffffffffff81111561316f57600080fd5b8201601f8101841361318057600080fd5b61261a848235602084016130d0565b6000806000606084860312156131a457600080fd5b83356131af81613079565b925060208401356131bf81613079565b929592945050506040919091013590565b600080602083850312156131e357600080fd5b823567ffffffffffffffff808211156131fb57600080fd5b818501915085601f83011261320f57600080fd5b81358181111561321e57600080fd5b86602082850101111561323057600080fd5b60209290920196919550909350505050565b60006020828403121561325457600080fd5b8135612fee81613079565b6000806040838503121561327257600080fd5b82359150602083013561328481613079565b809150509250929050565b6020808252825182820181905260009190848201906040850190845b818110156132c7578351835292840192918401916001016132ab565b50909695505050505050565b600080604083850312156132e657600080fd5b82356132f181613079565b91506020830135801515811461328457600080fd5b6000806000806080858703121561331c57600080fd5b843561332781613079565b9350602085013561333781613079565b925060408501359150606085013567ffffffffffffffff81111561335a57600080fd5b8501601f8101871361336b57600080fd5b61337a878235602084016130d0565b91505092959194509250565b6000806040838503121561339957600080fd5b82356133a481613079565b9150602083013561328481613079565b600181811c908216806133c857607f821691505b60208210810361165a57634e487b7160e01b600052602260045260246000fd5b60208082526034908201527f4552433732315073693a207472616e736665722063616c6c6572206973206e6f6040820152731d081bdddb995c881b9bdc88185c1c1c9bdd995960621b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000600182016134645761346461343c565b5060010190565b634e487b7160e01b600052603260045260246000fd5b600082198211156134945761349461343c565b500190565b60008160001904831182151516156134b3576134b361343c565b500290565b6020808252601d908201527f4e6f7420656e6f756768204e46547320696e2074686973207068617365000000604082015260600190565b60008151613501818560208601612ff5565b9290920192915050565b600080845481600182811c91508083168061352757607f831692505b6020808410820361354657634e487b7160e01b86526022600452602486fd5b81801561355a576001811461356b57613598565b60ff19861689528489019650613598565b60008b81526020902060005b868110156135905781548b820152908501908301613577565b505084890196505b505050505050612bc66135b282602f60f81b815260010190565b856134ef565b60208082526035908201527f4552433732315073693a207472616e7366657220746f206e6f6e20455243373260408201527418a932b1b2b4bb32b91034b6b83632b6b2b73a32b960591b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b6000826136325761363261360d565b500490565b6000828210156136495761364961343c565b500390565b60008261365d5761365d61360d565b500690565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061369590830184613021565b9695505050505050565b6000602082840312156136b157600080fd5b8151612fee81612fbb56fe0001020903110a19042112290b311a3905412245134d2a550c5d32651b6d3a7506264262237d468514804e8d2b95569d0d495ea533a966b11c886eb93bc176c9071727374353637324837e9b47af86c7155181ad4fd18ed32c9096db57d59ee30e2e4a6a5f92a6be3498aae067ddb2eb1d5989b56fd7baf33ca0c2ee77e5caf7ff0810182028303840444c545c646c7425617c847f8c949c48a4a8b087b8c0c816365272829aaec650acd0d28fdad4e22d6991bd97dfdcea58b4d6f29fede4f6fe0f1f2f3f4b5b6b607b8b93a3a7b7bf357199c5abcfd9e168bcdee9b3f1ecf5fd1e3e5a7a8aa2b670c4ced8bbe8f0f4fc3d79a1c3cde7effb78cce6facbf9f8a2646970667358221220b8aacfa31d0dcce01c1b88c3cbdc253fc3570c39a14d971a9fd1c4f5287358c164736f6c634300080e0033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000011697066733a2f2f556e52657665616c65640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011697066733a2f2f556e52657665616c6564000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061041b5760003560e01c806367b6dad81161021e578063b890b05511610123578063e985e9c5116100ab578063f31d12471161007a578063f31d124714610bbc578063f4a0a52814610bdc578063f6e330f214610bfc578063fab651e414610c11578063fb21df5414610c2657600080fd5b8063e985e9c514610b14578063eb8d244414610b5d578063f2c4ce1e14610b7c578063f2fde38b14610b9c57600080fd5b8063ca37f8c1116100f2578063ca37f8c114610a91578063d4deb3b614610ab2578063d5abeb0114610ac8578063d76d1fc814610ade578063e7c5622914610afe57600080fd5b8063b890b05514610a25578063c3b0157b14610a45578063c87b56dd14610a5b578063ca0dcf1614610a7b57600080fd5b80638da5cb5b116101a6578063a0712d6811610175578063a0712d6814610992578063a22cb465146109a5578063a45801a2146109c5578063b29c736d146109e4578063b88d4fde14610a0557600080fd5b80638da5cb5b14610934578063910dd0f514610952578063942715951461096857806395d89b411461097d57600080fd5b806372b474f4116101ed57806372b474f4146108915780637af66391146108b25780638353ffca146108d25780638462151c146108f25780638d53b1df1461091f57600080fd5b806367b6dad8146108315780636be997381461084657806370a082311461085c578063715018a61461087c57600080fd5b80632f745c59116103245780634f6ccce7116102ac5780635ea996141161027b5780635ea99614146107a6578063607447bd146107c6578063613b7139146107db5780636352211e146107f057806364b95aa41461081057600080fd5b80634f6ccce714610737578063518302271461075757806352df2b451461077157806355f804b31461078657600080fd5b80633bf2a064116102f35780633bf2a064146106ad5780633ccfd60b146106cd57806342842e0e146106e257806348f921fa146107025780634d893f921461072257600080fd5b80632f745c59146106385780633034dfcb1461065857806331afd4c31461066d578063328d9e301461068d57600080fd5b80631348bcc1116103a757806323b872dd1161037657806323b872dd146105b957806324403f91146105d9578063271bec5e146105ee57806328e4f54c1461060e5780632f5dd25f1461062357600080fd5b80631348bcc11461055457806313625fa71461056e578063150646e51461058357806318160ddd146105a457600080fd5b8063081c8c44116103ee578063081c8c44146104c6578063095ea7b3146104db5780630e1b26c6146104fb57806310c23e541461051f578063110e09cc1461053f57600080fd5b806301ffc9a71461042057806304c46ed91461045557806306fdde031461046c578063081812fc1461048e575b600080fd5b34801561042c57600080fd5b5061044061043b366004612fd1565b610c46565b60405190151581526020015b60405180910390f35b34801561046157600080fd5b5061046a610cb3565b005b34801561047857600080fd5b50610481610ccf565b60405161044c919061304d565b34801561049a57600080fd5b506104ae6104a9366004613060565b610d61565b6040516001600160a01b03909116815260200161044c565b3480156104d257600080fd5b50610481610df3565b3480156104e757600080fd5b5061046a6104f636600461308e565b610e81565b34801561050757600080fd5b50610511600f5481565b60405190815260200161044c565b34801561052b57600080fd5b5061046a61053a366004613146565b610f98565b34801561054b57600080fd5b5061046a610fb7565b34801561056057600080fd5b506010546104409060ff1681565b34801561057a57600080fd5b5061046a610fe0565b34801561058f57600080fd5b50601b5461044090600160201b900460ff1681565b3480156105b057600080fd5b50600454610511565b3480156105c557600080fd5b5061046a6105d436600461318f565b61100b565b3480156105e557600080fd5b5061048161103c565b3480156105fa57600080fd5b5061046a6106093660046131d0565b611049565b34801561061a57600080fd5b5061046a61105d565b34801561062f57600080fd5b50610481611074565b34801561064457600080fd5b5061051161065336600461308e565b611081565b34801561066457600080fd5b5061046a61114b565b34801561067957600080fd5b5061046a610688366004613146565b611164565b34801561069957600080fd5b5061046a6106a8366004613060565b61117f565b3480156106b957600080fd5b5061046a6106c83660046131d0565b61118c565b3480156106d957600080fd5b5061046a6111a0565b3480156106ee57600080fd5b5061046a6106fd36600461318f565b6111e4565b34801561070e57600080fd5b5061046a61071d3660046131d0565b6111ff565b34801561072e57600080fd5b5061046a611213565b34801561074357600080fd5b50610511610752366004613060565b611230565b34801561076357600080fd5b50601b546104409060ff1681565b34801561077d57600080fd5b5061046a6112ea565b34801561079257600080fd5b5061046a6107a13660046131d0565b611311565b3480156107b257600080fd5b5061046a6107c13660046131d0565b611325565b3480156107d257600080fd5b5061046a611339565b3480156107e757600080fd5b50610481611363565b3480156107fc57600080fd5b506104ae61080b366004613060565b611370565b34801561081c57600080fd5b5060105461044090600160201b900460ff1681565b34801561083d57600080fd5b5061046a611384565b34801561085257600080fd5b50610511600d5481565b34801561086857600080fd5b50610511610877366004613242565b6113a9565b34801561088857600080fd5b5061046a611479565b34801561089d57600080fd5b50601054610440906301000000900460ff1681565b3480156108be57600080fd5b5061046a6108cd366004613146565b61148d565b3480156108de57600080fd5b5061046a6108ed36600461325f565b6114a8565b3480156108fe57600080fd5b5061091261090d366004613242565b6115a2565b60405161044c919061328f565b34801561092b57600080fd5b5061046a611660565b34801561094057600080fd5b506007546001600160a01b03166104ae565b34801561095e57600080fd5b50610511600e5481565b34801561097457600080fd5b5061046a61167e565b34801561098957600080fd5b5061048161171c565b61046a6109a0366004613060565b61172b565b3480156109b157600080fd5b5061046a6109c03660046132d3565b611ba4565b3480156109d157600080fd5b50601b5461044090610100900460ff1681565b3480156109f057600080fd5b50601b54610440906301000000900460ff1681565b348015610a1157600080fd5b5061046a610a20366004613306565b611c68565b348015610a3157600080fd5b50601b546104409062010000900460ff1681565b348015610a5157600080fd5b50610511600c5481565b348015610a6757600080fd5b50610481610a76366004613060565b611ca0565b348015610a8757600080fd5b5061051160095481565b348015610a9d57600080fd5b5060105461044090600160281b900460ff1681565b348015610abe57600080fd5b50610511600b5481565b348015610ad457600080fd5b5061051160085481565b348015610aea57600080fd5b5061046a610af936600461325f565b611fa4565b348015610b0a57600080fd5b50610511600a5481565b348015610b2057600080fd5b50610440610b2f366004613386565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b348015610b6957600080fd5b5060105461044090610100900460ff1681565b348015610b8857600080fd5b5061046a610b97366004613146565b61238a565b348015610ba857600080fd5b5061046a610bb7366004613242565b6123a5565b348015610bc857600080fd5b506010546104409062010000900460ff1681565b348015610be857600080fd5b5061046a610bf7366004613060565b61241b565b348015610c0857600080fd5b5061046a612428565b348015610c1d57600080fd5b50610481612443565b348015610c3257600080fd5b5061046a610c41366004613146565b612450565b60006001600160e01b031982166380ac58cd60e01b1480610c7757506001600160e01b03198216635b5e139f60e01b145b80610c9257506001600160e01b0319821663780e9d6360e01b145b80610cad57506301ffc9a760e01b6001600160e01b03198316145b92915050565b610cbb61246b565b6010805460ff19811660ff90911615179055565b606060018054610cde906133b4565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0a906133b4565b8015610d575780601f10610d2c57610100808354040283529160200191610d57565b820191906000526020600020905b815481529060010190602001808311610d3a57829003601f168201915b5050505050905090565b6000610d6e826004541190565b610dd75760405162461bcd60e51b815260206004820152602f60248201527f4552433732315073693a20617070726f76656420717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b60168054610e00906133b4565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2c906133b4565b8015610e795780601f10610e4e57610100808354040283529160200191610e79565b820191906000526020600020905b815481529060010190602001808311610e5c57829003601f168201915b505050505081565b6000610e8c82611370565b9050806001600160a01b0316836001600160a01b031603610efb5760405162461bcd60e51b8152602060048201526024808201527f4552433732315073693a20617070726f76616c20746f2063757272656e74206f6044820152633bb732b960e11b6064820152608401610dce565b336001600160a01b0382161480610f175750610f178133610b2f565b610f895760405162461bcd60e51b815260206004820152603b60248201527f4552433732315073693a20617070726f76652063616c6c6572206973206e6f7460448201527f206f776e6572206e6f7220617070726f76656420666f7220616c6c00000000006064820152608401610dce565b610f9383836124c5565b505050565b610fa061246b565b8051610fb390601a906020840190612eae565b5050565b610fbf61246b565b6010805463ff00000019811663010000009182900460ff1615909102179055565b610fe861246b565b6010805465ff0000000000198116600160281b9182900460ff1615909102179055565b6110153382612533565b6110315760405162461bcd60e51b8152600401610dce906133e8565b610f93838383612622565b60188054610e00906133b4565b61105161246b565b610f9360138383612f32565b61106561246b565b601b805460ff19166001179055565b60198054610e00906133b4565b60008060005b6004548110156110f65761109c816004541190565b80156110c157506110ac81611370565b6001600160a01b0316856001600160a01b0316145b156110e4578382036110d6579150610cad9050565b816110e081613452565b9250505b806110ee81613452565b915050611087565b5060405162461bcd60e51b8152602060048201526024808201527f4552433732315073693a206f776e657220696e646578206f7574206f6620626f604482015263756e647360e01b6064820152608401610dce565b61115361246b565b601b805461ff001916610100179055565b61116c61246b565b8051610fb3906017906020840190612eae565b61118761246b565b600f55565b61119461246b565b610f9360158383612f32565b6111a861246b565b6007546040516001600160a01b03909116904780156108fc02916000818181858888f193505050501580156111e1573d6000803e3d6000fd5b50565b610f9383838360405180602001604052806000815250611c68565b61120761246b565b610f9360128383612f32565b61121b61246b565b601b805463ff00000019166301000000179055565b600061123b60045490565b82106112975760405162461bcd60e51b815260206004820152602560248201527f4552433732315073693a20676c6f62616c20696e646578206f7574206f6620626044820152646f756e647360d81b6064820152608401610dce565b6000805b6004548110156112e3576112b0816004541190565b156112d1578382036112c3579392505050565b816112cd81613452565b9250505b806112db81613452565b91505061129b565b5050919050565b6112f261246b565b6010805462ff0000198116620100009182900460ff1615909102179055565b61131961246b565b610f9360118383612f32565b61132d61246b565b610f9360148383612f32565b61134161246b565b6010805464ff00000000198116600160201b9182900460ff1615909102179055565b60178054610e00906133b4565b60008061137c8361280e565b509392505050565b61138c61246b565b6010805461ff001981166101009182900460ff1615909102179055565b60006001600160a01b0382166114175760405162461bcd60e51b815260206004820152602d60248201527f4552433732315073693a2062616c616e636520717565727920666f722074686560448201526c207a65726f206164647265737360981b6064820152608401610dce565b6000805b60045481101561147257611430816004541190565b156114625761143e81611370565b6001600160a01b0316846001600160a01b0316036114625761145f82613452565b91505b61146b81613452565b905061141b565b5092915050565b61148161246b565b61148b60006128a7565b565b61149561246b565b8051610fb3906018906020840190612eae565b6114b061246b565b600082116115005760405162461bcd60e51b815260206004820152601f60248201527f5769746864726177206d7573742062652067726561746572207468616e2030006044820152606401610dce565b478211156115425760405162461bcd60e51b815260206004820152600f60248201526e082dadeeadce840e8dede40d0d2ced608b1b6044820152606401610dce565b6000816001600160a01b03168360405160006040518083038185875af1925050503d806000811461158f576040519150601f19603f3d011682016040523d82523d6000602084013e611594565b606091505b5050905080610f9357600080fd5b606060006115af836113a9565b9050806000036115cf57604080516000808252602082019092529061137c565b60008167ffffffffffffffff8111156115ea576115ea6130ba565b604051908082528060200260200182016040528015611613578160200160208202803683370190505b50905060005b8281101561137c5761162b8582611081565b82828151811061163d5761163d61346b565b60209081029190910101528061165281613452565b915050611619565b50919050565b61166861246b565b601b805464ff000000001916600160201b179055565b61168661246b565b600f54600103611697576002600f55565b600f546002036116a8576003600f55565b600f546003036116b9576004600f55565b600f546004036116ca576005600f55565b600f5460050361148b5760405162461bcd60e51b815260206004820152601a60248201527f46696e616c20506861736520416c7265616479204163746976650000000000006044820152606401610dce565b606060028054610cde906133b4565b60105460ff1661177d5760405162461bcd60e51b815260206004820152601c60248201527f53616c6573206d7573742062652061637469766520746f206d696e74000000006044820152606401610dce565b6008548161178a60045490565b6117949190613481565b11156117e25760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420656e6f756768204e465473206c65667420746f204d696e74000000006044820152606401610dce565b34816009546117f19190613499565b11156118305760405162461bcd60e51b815260206004820152600e60248201526d09cdee840cadcdeeaced0408ae8d60931b6044820152606401610dce565b600f546001036118d057601054610100900460ff166118915760405162461bcd60e51b815260206004820152601e60248201527f50686173652031206d7573742062652061637469766520746f206d696e7400006044820152606401610dce565b600a548161189e60045490565b6118a89190613481565b11156118c65760405162461bcd60e51b8152600401610dce906134b8565b6118d033826128f9565b600f546002036119715760105462010000900460ff166119325760405162461bcd60e51b815260206004820152601e60248201527f50686173652032206d7573742062652061637469766520746f206d696e7400006044820152606401610dce565b600b548161193f60045490565b6119499190613481565b11156119675760405162461bcd60e51b8152600401610dce906134b8565b61197133826128f9565b600f54600303611a13576010546301000000900460ff166119d45760405162461bcd60e51b815260206004820152601e60248201527f50686173652033206d7573742062652061637469766520746f206d696e7400006044820152606401610dce565b600c54816119e160045490565b6119eb9190613481565b1115611a095760405162461bcd60e51b8152600401610dce906134b8565b611a1333826128f9565b600f54600403611ab557601054600160201b900460ff16611a765760405162461bcd60e51b815260206004820152601e60248201527f50686173652034206d7573742062652061637469766520746f206d696e7400006044820152606401610dce565b600d5481611a8360045490565b611a8d9190613481565b1115611aab5760405162461bcd60e51b8152600401610dce906134b8565b611ab533826128f9565b600f546005036111e157601054600160281b900460ff16611b185760405162461bcd60e51b815260206004820152601e60248201527f50686173652035206d7573742062652061637469766520746f206d696e7400006044820152606401610dce565b600e5481611b2560045490565b611b2f9190613481565b1115611b9a5760405162461bcd60e51b815260206004820152603460248201527f4e6f7420656e6f756768204e46547320696e2074686973207068617365206f726044820152730810dbdb1b1958dd1a5bdb88119a5b9a5cda195960621b6064820152608401610dce565b6111e133826128f9565b336001600160a01b03831603611bfc5760405162461bcd60e51b815260206004820152601c60248201527f4552433732315073693a20617070726f766520746f2063616c6c6572000000006044820152606401610dce565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611c723383612533565b611c8e5760405162461bcd60e51b8152600401610dce906133e8565b611c9a84848484612913565b50505050565b6060611cad826004541190565b611cca57604051630a14c4b560e41b815260040160405180910390fd5b601b5460ff16158015611cde57506103e882105b15611d755760168054611cf0906133b4565b80601f0160208091040260200160405190810160405280929190818152602001828054611d1c906133b4565b8015611d695780601f10611d3e57610100808354040283529160200191611d69565b820191906000526020600020905b815481529060010190602001808311611d4c57829003601f168201915b50505050509050919050565b601b5460ff1615156001148015611d8d57506103e882105b15611dc4576011611d9d83612948565b604051602001611dae92919061350b565b6040516020818303038152906040529050919050565b601b54610100900460ff16158015611dde57506103e88210155b8015611deb57506107d082105b15611dfd5760178054611cf0906133b4565b601b5460ff6101009091041615156001148015611e1c57506103e88210155b8015611e2957506107d082105b15611e39576012611d9d83612948565b601b5462010000900460ff16158015611e5457506107d08210155b8015611e615750610bb882105b15611e735760188054611cf0906133b4565b601b5462010000900460ff1615156001148015611e9257506107d08210155b8015611e9f5750610bb882105b15611eaf576013611d9d83612948565b601b546301000000900460ff16158015611ecb5750610bb88210155b8015611ed85750610fa082105b15611eea5760198054611cf0906133b4565b601b546301000000900460ff1615156001148015611f0a5750610bb88210155b8015611f175750610fa082105b15611f27576014611d9d83612948565b601b54600160201b900460ff16158015611f435750610fa08210155b8015611f50575061119482105b15611f6257601a8054611cf0906133b4565b601b54600160201b900460ff1615156001148015611f825750610fa08210155b8015611f8f575061119482105b15611f9f576015611d9d83612948565b919050565b611fac61246b565b60105460ff16611ffe5760405162461bcd60e51b815260206004820152601c60248201527f53616c6573206d7573742062652061637469766520746f206d696e74000000006044820152606401610dce565b6008548261200b60045490565b6120159190613481565b11156120635760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420656e6f756768204e465473206c65667420746f204d696e74000000006044820152606401610dce565b600f5460010361210357601054610100900460ff166120c45760405162461bcd60e51b815260206004820152601e60248201527f50686173652031206d7573742062652061637469766520746f206d696e7400006044820152606401610dce565b600a54826120d160045490565b6120db9190613481565b11156120f95760405162461bcd60e51b8152600401610dce906134b8565b61210381836128f9565b600f546002036121a45760105462010000900460ff166121655760405162461bcd60e51b815260206004820152601e60248201527f50686173652032206d7573742062652061637469766520746f206d696e7400006044820152606401610dce565b600b548261217260045490565b61217c9190613481565b111561219a5760405162461bcd60e51b8152600401610dce906134b8565b6121a481836128f9565b600f54600303612246576010546301000000900460ff166122075760405162461bcd60e51b815260206004820152601e60248201527f50686173652033206d7573742062652061637469766520746f206d696e7400006044820152606401610dce565b600c548261221460045490565b61221e9190613481565b111561223c5760405162461bcd60e51b8152600401610dce906134b8565b61224681836128f9565b600f546004036122e857601054600160201b900460ff166122a95760405162461bcd60e51b815260206004820152601e60248201527f50686173652034206d7573742062652061637469766520746f206d696e7400006044820152606401610dce565b600d54826122b660045490565b6122c09190613481565b11156122de5760405162461bcd60e51b8152600401610dce906134b8565b6122e881836128f9565b600f54600503610fb357601054600160281b900460ff1661234b5760405162461bcd60e51b815260206004820152601e60248201527f50686173652035206d7573742062652061637469766520746f206d696e7400006044820152606401610dce565b600e548261235860045490565b6123629190613481565b11156123805760405162461bcd60e51b8152600401610dce906134b8565b610fb381836128f9565b61239261246b565b8051610fb3906016906020840190612eae565b6123ad61246b565b6001600160a01b0381166124125760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610dce565b6111e1816128a7565b61242361246b565b600955565b61243061246b565b601b805462ff0000191662010000179055565b601a8054610e00906133b4565b61245861246b565b8051610fb3906019906020840190612eae565b6007546001600160a01b0316331461148b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610dce565b600081815260056020526040902080546001600160a01b0319166001600160a01b03841690811790915581906124fa82611370565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612540826004541190565b6125a45760405162461bcd60e51b815260206004820152602f60248201527f4552433732315073693a206f70657261746f7220717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610dce565b60006125af83611370565b9050806001600160a01b0316846001600160a01b031614806125ea5750836001600160a01b03166125df84610d61565b6001600160a01b0316145b8061261a57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b60008061262e8361280e565b91509150846001600160a01b0316826001600160a01b0316146126a85760405162461bcd60e51b815260206004820152602c60248201527f4552433732315073693a207472616e73666572206f6620746f6b656e2074686160448201526b3a1034b9903737ba1037bbb760a11b6064820152608401610dce565b6001600160a01b03841661270e5760405162461bcd60e51b815260206004820152602760248201527f4552433732315073693a207472616e7366657220746f20746865207a65726f206044820152666164647265737360c81b6064820152608401610dce565b6127196000846124c5565b6000612726846001613481565b600881901c600090815260208190526040902054909150600160ff1b60ff83161c16158015612756575060045481105b1561278c57600081815260036020526040812080546001600160a01b0319166001600160a01b03891617905561278c9082612a49565b600084815260036020526040902080546001600160a01b0319166001600160a01b0387161790558184146127c5576127c5600085612a49565b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b60008061281c836004541190565b61287d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732315073693a206f776e657220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610dce565b61288683612a75565b6000818152600360205260409020546001600160a01b031694909350915050565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610fb3828260405180602001604052806000815250612a81565b61291e848484612622565b61292c848484600185612a98565b611c9a5760405162461bcd60e51b8152600401610dce906135b8565b60608160000361296f5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612999578061298381613452565b91506129929050600a83613623565b9150612973565b60008167ffffffffffffffff8111156129b4576129b46130ba565b6040519080825280601f01601f1916602001820160405280156129de576020820181803683370190505b5090505b841561261a576129f3600183613637565b9150612a00600a8661364e565b612a0b906030613481565b60f81b818381518110612a2057612a2061346b565b60200101906001600160f81b031916908160001a905350612a42600a86613623565b94506129e2565b600881901c600090815260209290925260409091208054600160ff1b60ff9093169290921c9091179055565b6000610cad8183612bcf565b600454612a8e8484612cc7565b61292c6000858386865b60006001600160a01b0385163b15612bc257506001835b612ab98486613481565b811015612bbc57604051630a85bd0160e11b81526001600160a01b0387169063150b7a0290612af29033908b9086908990600401613662565b6020604051808303816000875af1925050508015612b2d575060408051601f3d908101601f19168201909252612b2a9181019061369f565b60015b612b8a573d808015612b5b576040519150601f19603f3d011682016040523d82523d6000602084013e612b60565b606091505b508051600003612b825760405162461bcd60e51b8152600401610dce906135b8565b805181602001fd5b828015612ba757506001600160e01b03198116630a85bd0160e11b145b92505080612bb481613452565b915050612aaf565b50612bc6565b5060015b95945050505050565b600881901c60008181526020849052604081205490919060ff808516919082181c8015612c1157612bff81612e2c565b60ff168203600884901b179350612cbe565b60008311612c7e5760405162461bcd60e51b815260206004820152603460248201527f4269744d6170733a205468652073657420626974206265666f7265207468652060448201527334b73232bc103237b2b9b713ba1032bc34b9ba1760611b6064820152608401610dce565b506000199091016000818152602086905260409020549091908015612cb957612ca681612e2c565b60ff0360ff16600884901b179350612cbe565b612c11565b50505092915050565b60045481612d255760405162461bcd60e51b815260206004820152602560248201527f4552433732315073693a207175616e74697479206d7573742062652067726561604482015264074657220360dc1b6064820152608401610dce565b6001600160a01b038316612d875760405162461bcd60e51b815260206004820152602360248201527f4552433732315073693a206d696e7420746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610dce565b8160046000828254612d999190613481565b9091555050600081815260036020526040812080546001600160a01b0319166001600160a01b038616179055612dcf9082612a49565b805b612ddb8383613481565b811015611c9a5760405181906001600160a01b038616906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480612e2481613452565b915050612dd1565b600060405180610120016040528061010081526020016136bd610100913960f87e818283848586878898a8b8c8d8e8f929395969799a9b9d9e9faaeb6bedeeff612e7585612e96565b02901c81518110612e8857612e8861346b565b016020015160f81c92915050565b6000808211612ea457600080fd5b5060008190031690565b828054612eba906133b4565b90600052602060002090601f016020900481019282612edc5760008555612f22565b82601f10612ef557805160ff1916838001178555612f22565b82800160010185558215612f22579182015b82811115612f22578251825591602001919060010190612f07565b50612f2e929150612fa6565b5090565b828054612f3e906133b4565b90600052602060002090601f016020900481019282612f605760008555612f22565b82601f10612f795782800160ff19823516178555612f22565b82800160010185558215612f22579182015b82811115612f22578235825591602001919060010190612f8b565b5b80821115612f2e5760008155600101612fa7565b6001600160e01b0319811681146111e157600080fd5b600060208284031215612fe357600080fd5b8135612fee81612fbb565b9392505050565b60005b83811015613010578181015183820152602001612ff8565b83811115611c9a5750506000910152565b60008151808452613039816020860160208601612ff5565b601f01601f19169290920160200192915050565b602081526000612fee6020830184613021565b60006020828403121561307257600080fd5b5035919050565b6001600160a01b03811681146111e157600080fd5b600080604083850312156130a157600080fd5b82356130ac81613079565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156130eb576130eb6130ba565b604051601f8501601f19908116603f01168101908282118183101715613113576131136130ba565b8160405280935085815286868601111561312c57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561315857600080fd5b813567ffffffffffffffff81111561316f57600080fd5b8201601f8101841361318057600080fd5b61261a848235602084016130d0565b6000806000606084860312156131a457600080fd5b83356131af81613079565b925060208401356131bf81613079565b929592945050506040919091013590565b600080602083850312156131e357600080fd5b823567ffffffffffffffff808211156131fb57600080fd5b818501915085601f83011261320f57600080fd5b81358181111561321e57600080fd5b86602082850101111561323057600080fd5b60209290920196919550909350505050565b60006020828403121561325457600080fd5b8135612fee81613079565b6000806040838503121561327257600080fd5b82359150602083013561328481613079565b809150509250929050565b6020808252825182820181905260009190848201906040850190845b818110156132c7578351835292840192918401916001016132ab565b50909695505050505050565b600080604083850312156132e657600080fd5b82356132f181613079565b91506020830135801515811461328457600080fd5b6000806000806080858703121561331c57600080fd5b843561332781613079565b9350602085013561333781613079565b925060408501359150606085013567ffffffffffffffff81111561335a57600080fd5b8501601f8101871361336b57600080fd5b61337a878235602084016130d0565b91505092959194509250565b6000806040838503121561339957600080fd5b82356133a481613079565b9150602083013561328481613079565b600181811c908216806133c857607f821691505b60208210810361165a57634e487b7160e01b600052602260045260246000fd5b60208082526034908201527f4552433732315073693a207472616e736665722063616c6c6572206973206e6f6040820152731d081bdddb995c881b9bdc88185c1c1c9bdd995960621b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000600182016134645761346461343c565b5060010190565b634e487b7160e01b600052603260045260246000fd5b600082198211156134945761349461343c565b500190565b60008160001904831182151516156134b3576134b361343c565b500290565b6020808252601d908201527f4e6f7420656e6f756768204e46547320696e2074686973207068617365000000604082015260600190565b60008151613501818560208601612ff5565b9290920192915050565b600080845481600182811c91508083168061352757607f831692505b6020808410820361354657634e487b7160e01b86526022600452602486fd5b81801561355a576001811461356b57613598565b60ff19861689528489019650613598565b60008b81526020902060005b868110156135905781548b820152908501908301613577565b505084890196505b505050505050612bc66135b282602f60f81b815260010190565b856134ef565b60208082526035908201527f4552433732315073693a207472616e7366657220746f206e6f6e20455243373260408201527418a932b1b2b4bb32b91034b6b83632b6b2b73a32b960591b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b6000826136325761363261360d565b500490565b6000828210156136495761364961343c565b500390565b60008261365d5761365d61360d565b500690565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061369590830184613021565b9695505050505050565b6000602082840312156136b157600080fd5b8151612fee81612fbb56fe0001020903110a19042112290b311a3905412245134d2a550c5d32651b6d3a7506264262237d468514804e8d2b95569d0d495ea533a966b11c886eb93bc176c9071727374353637324837e9b47af86c7155181ad4fd18ed32c9096db57d59ee30e2e4a6a5f92a6be3498aae067ddb2eb1d5989b56fd7baf33ca0c2ee77e5caf7ff0810182028303840444c545c646c7425617c847f8c949c48a4a8b087b8c0c816365272829aaec650acd0d28fdad4e22d6991bd97dfdcea58b4d6f29fede4f6fe0f1f2f3f4b5b6b607b8b93a3a7b7bf357199c5abcfd9e168bcdee9b3f1ecf5fd1e3e5a7a8aa2b670c4ced8bbe8f0f4fc3d79a1c3cde7effb78cce6facbf9f8a2646970667358221220b8aacfa31d0dcce01c1b88c3cbdc253fc3570c39a14d971a9fd1c4f5287358c164736f6c634300080e0033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000011697066733a2f2f556e52657665616c65640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011697066733a2f2f556e52657665616c6564000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _baseUri (string): ipfs://UnRevealed
Arg [1] : _notRevealedUri (string): ipfs://UnRevealed

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000011
Arg [3] : 697066733a2f2f556e52657665616c6564000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000011
Arg [5] : 697066733a2f2f556e52657665616c6564000000000000000000000000000000


Deployed Bytecode Sourcemap

65235:12115:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49590:422;;;;;;;;;;-1:-1:-1;49590:422:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;49590:422:0;;;;;;;;75368:107;;;;;;;;;;;;;:::i;:::-;;51198:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;52753:311::-;;;;;;;;;;-1:-1:-1;52753:311:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1714:32:1;;;1696:51;;1684:2;1669:18;52753:311:0;1550:203:1;66777:28:0;;;;;;;;;;;;;:::i;52277:410::-;;;;;;;;;;-1:-1:-1;52277:410:0;;;;;:::i;:::-;;:::i;65906:30::-;;;;;;;;;;;;;;;;;;;2360:25:1;;;2348:2;2333:18;65906:30:0;2214:177:1;70193:130:0;;;;;;;;;;-1:-1:-1;70193:130:0;;;;;:::i;:::-;;:::i;75766:97::-;;;;;;;;;;;;;:::i;66056:38::-;;;;;;;;;;-1:-1:-1;66056:38:0;;;;;;;;75976:97;;;;;;;;;;;;;:::i;67107:29::-;;;;;;;;;;-1:-1:-1;67107:29:0;;;;-1:-1:-1;;;67107:29:0;;;;;;62345:103;;;;;;;;;;-1:-1:-1;62433:7:0;;62345:103;;53818:379;;;;;;;;;;-1:-1:-1;53818:379:0;;;;;:::i;:::-;;:::i;66848:29::-;;;;;;;;;;;;;:::i;74788:110::-;;;;;;;;;;-1:-1:-1;74788:110:0;;;;;:::i;:::-;;:::i;69147:75::-;;;;;;;;;;;;;:::i;66884:29::-;;;;;;;;;;;;;:::i;62994:397::-;;;;;;;;;;-1:-1:-1;62994:397:0;;;;;:::i;:::-;;:::i;69230:76::-;;;;;;;;;;;;;:::i;69779:130::-;;;;;;;;;;-1:-1:-1;69779:130:0;;;;;:::i;:::-;;:::i;74230:96::-;;;;;;;;;;-1:-1:-1;74230:96:0;;;;;:::i;:::-;;:::i;75024:110::-;;;;;;;;;;-1:-1:-1;75024:110:0;;;;;:::i;:::-;;:::i;76219:106::-;;;;;;;;;;;;;:::i;54268:185::-;;;;;;;;;;-1:-1:-1;54268:185:0;;;;;:::i;:::-;;:::i;74670:110::-;;;;;;;;;;-1:-1:-1;74670:110:0;;;;;:::i;:::-;;:::i;69398:76::-;;;;;;;;;;;;;:::i;62525:385::-;;;;;;;;;;-1:-1:-1;62525:385:0;;;;;:::i;:::-;;:::i;66964:28::-;;;;;;;;;;-1:-1:-1;66964:28:0;;;;;;;;75661:97;;;;;;;;;;;;;:::i;74556:106::-;;;;;;;;;;-1:-1:-1;74556:106:0;;;;;:::i;:::-;;:::i;74906:110::-;;;;;;;;;;-1:-1:-1;74906:110:0;;;;;:::i;:::-;;:::i;75871:97::-;;;;;;;;;;;;;:::i;66812:29::-;;;;;;;;;;;;;:::i;50603:222::-;;;;;;;;;;-1:-1:-1;50603:222:0;;;;;:::i;:::-;;:::i;66284:33::-;;;;;;;;;;-1:-1:-1;66284:33:0;;;;-1:-1:-1;;;66284:33:0;;;;;;75558:95;;;;;;;;;;;;;:::i;65805:28::-;;;;;;;;;;;;;;;;50076:465;;;;;;;;;;-1:-1:-1;50076:465:0;;;;;:::i;:::-;;:::i;29922:103::-;;;;;;;;;;;;;:::i;66228:33::-;;;;;;;;;;-1:-1:-1;66228:33:0;;;;;;;;;;;69917:130;;;;;;;;;;-1:-1:-1;69917:130:0;;;;;:::i;:::-;;:::i;76435:328::-;;;;;;;;;;-1:-1:-1;76435:328:0;;;;;:::i;:::-;;:::i;76835:510::-;;;;;;;;;;-1:-1:-1;76835:510:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;69482:76::-;;;;;;;;;;;;;:::i;29274:87::-;;;;;;;;;;-1:-1:-1;29347:6:0;;-1:-1:-1;;;;;29347:6:0;29274:87;;65869:28;;;;;;;;;;;;;;;;73733:458;;;;;;;;;;;;;:::i;51367:104::-;;;;;;;;;;;;;:::i;72163:1562::-;;;;;;:::i;:::-;;:::i;53136:330::-;;;;;;;;;;-1:-1:-1;53136:330:0;;;;;:::i;:::-;;:::i;66999:29::-;;;;;;;;;;-1:-1:-1;66999:29:0;;;;;;;;;;;67071;;;;;;;;;;-1:-1:-1;67071:29:0;;;;;;;;;;;54524:368;;;;;;;;;;-1:-1:-1;54524:368:0;;;;;:::i;:::-;;:::i;67035:29::-;;;;;;;;;;-1:-1:-1;67035:29:0;;;;;;;;;;;65741:28;;;;;;;;;;;;;;;;67565:1574;;;;;;;;;;-1:-1:-1;67565:1574:0;;;;;:::i;:::-;;:::i;65527:36::-;;;;;;;;;;;;;;;;66340:33;;;;;;;;;;-1:-1:-1;66340:33:0;;;;-1:-1:-1;;;66340:33:0;;;;;;65677:28;;;;;;;;;;;;;;;;65489:31;;;;;;;;;;;;;;;;70613:1447;;;;;;;;;;-1:-1:-1;70613:1447:0;;;;;:::i;:::-;;:::i;65613:28::-;;;;;;;;;;;;;;;;53537:214;;;;;;;;;;-1:-1:-1;53537:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;53708:25:0;;;53679:4;53708:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;53537:214;66117:32;;;;;;;;;;-1:-1:-1;66117:32:0;;;;;;;;;;;69645:126;;;;;;;;;;-1:-1:-1;69645:126:0;;;;;:::i;:::-;;:::i;30180:201::-;;;;;;;;;;-1:-1:-1;30180:201:0;;;;;:::i;:::-;;:::i;66172:33::-;;;;;;;;;;-1:-1:-1;66172:33:0;;;;;;;;;;;70405:93;;;;;;;;;;-1:-1:-1;70405:93:0;;;;;:::i;:::-;;:::i;69314:76::-;;;;;;;;;;;;;:::i;66920:29::-;;;;;;;;;;;;;:::i;70055:130::-;;;;;;;;;;-1:-1:-1;70055:130:0;;;;;:::i;:::-;;:::i;49590:422::-;49737:4;-1:-1:-1;;;;;;49779:40:0;;-1:-1:-1;;;49779:40:0;;:105;;-1:-1:-1;;;;;;;49836:48:0;;-1:-1:-1;;;49836:48:0;49779:105;:172;;;-1:-1:-1;;;;;;;49901:50:0;;-1:-1:-1;;;49901:50:0;49779:172;:225;;;-1:-1:-1;;;;;;;;;;33690:40:0;;;49968:36;49759:245;49590:422;-1:-1:-1;;49590:422:0:o;75368:107::-;29160:13;:11;:13::i;:::-;75449:18:::1;::::0;;-1:-1:-1;;75427:40:0;::::1;75449:18;::::0;;::::1;75448:19;75427:40;::::0;;75368:107::o;51198:100::-;51252:13;51285:5;51278:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51198:100;:::o;52753:311::-;52874:7;52921:16;52929:7;56485;;-1:-1:-1;56475:17:0;56386:114;52921:16;52899:113;;;;-1:-1:-1;;;52899:113:0;;8417:2:1;52899:113:0;;;8399:21:1;8456:2;8436:18;;;8429:30;8495:34;8475:18;;;8468:62;-1:-1:-1;;;8546:18:1;;;8539:45;8601:19;;52899:113:0;;;;;;;;;-1:-1:-1;53032:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;53032:24:0;;52753:311::o;66777:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52277:410::-;52358:13;52374:16;52382:7;52374;:16::i;:::-;52358:32;;52415:5;-1:-1:-1;;;;;52409:11:0;:2;-1:-1:-1;;;;;52409:11:0;;52401:60;;;;-1:-1:-1;;;52401:60:0;;8833:2:1;52401:60:0;;;8815:21:1;8872:2;8852:18;;;8845:30;8911:34;8891:18;;;8884:62;-1:-1:-1;;;8962:18:1;;;8955:34;9006:19;;52401:60:0;8631:400:1;52401:60:0;27903:10;-1:-1:-1;;;;;52496:21:0;;;;:62;;-1:-1:-1;52521:37:0;52538:5;27903:10;53537:214;:::i;52521:37::-;52474:171;;;;-1:-1:-1;;;52474:171:0;;9238:2:1;52474:171:0;;;9220:21:1;9277:2;9257:18;;;9250:30;9316:34;9296:18;;;9289:62;9387:29;9367:18;;;9360:57;9434:19;;52474:171:0;9036:423:1;52474:171:0;52658:21;52667:2;52671:7;52658:8;:21::i;:::-;52347:340;52277:410;;:::o;70193:130::-;29160:13;:11;:13::i;:::-;70281:34;;::::1;::::0;:15:::1;::::0;:34:::1;::::0;::::1;::::0;::::1;:::i;:::-;;70193:130:::0;:::o;75766:97::-;29160:13;:11;:13::i;:::-;75842::::1;::::0;;-1:-1:-1;;75825:30:0;::::1;75842:13:::0;;;;::::1;;;75841:14;75825:30:::0;;::::1;;::::0;;75766:97::o;75976:::-;29160:13;:11;:13::i;:::-;76052::::1;::::0;;-1:-1:-1;;76035:30:0;::::1;-1:-1:-1::0;;;76052:13:0;;;::::1;;;76051:14;76035:30:::0;;::::1;;::::0;;75976:97::o;53818:379::-;54027:41;27903:10;54060:7;54027:18;:41::i;:::-;54005:143;;;;-1:-1:-1;;;54005:143:0;;;;;;;:::i;:::-;54161:28;54171:4;54177:2;54181:7;54161:9;:28::i;66848:29::-;;;;;;;:::i;74788:110::-;29160:13;:11;:13::i;:::-;74868:22:::1;:8;74879:11:::0;;74868:22:::1;:::i;69147:75::-:0;29160:13;:11;:13::i;:::-;69199:8:::1;:15:::0;;-1:-1:-1;;69199:15:0::1;69210:4;69199:15;::::0;;69147:75::o;66884:29::-;;;;;;;:::i;62994:397::-;63091:15;63119:10;63144:6;63140:185;63156:7;;63152:1;:11;63140:185;;;63187:10;63195:1;56485:7;;-1:-1:-1;56475:17:0;56386:114;63187:10;:33;;;;;63210:10;63218:1;63210:7;:10::i;:::-;-1:-1:-1;;;;;63201:19:0;:5;-1:-1:-1;;;;;63201:19:0;;63187:33;63184:130;;;63252:5;63243;:14;63240:58;;63266:1;-1:-1:-1;63259:8:0;;-1:-1:-1;63259:8:0;63240:58;63291:7;;;;:::i;:::-;;;;63240:58;63165:3;;;;:::i;:::-;;;;63140:185;;;-1:-1:-1;63337:46:0;;-1:-1:-1;;;63337:46:0;;10359:2:1;63337:46:0;;;10341:21:1;10398:2;10378:18;;;10371:30;10437:34;10417:18;;;10410:62;-1:-1:-1;;;10488:18:1;;;10481:34;10532:19;;63337:46:0;10157:400:1;69230:76:0;29160:13;:11;:13::i;:::-;69282:9:::1;:16:::0;;-1:-1:-1;;69282:16:0::1;;;::::0;;69230:76::o;69779:130::-;29160:13;:11;:13::i;:::-;69867:34;;::::1;::::0;:15:::1;::::0;:34:::1;::::0;::::1;::::0;::::1;:::i;74230:96::-:0;29160:13;:11;:13::i;:::-;74299:11:::1;:19:::0;74230:96::o;75024:110::-;29160:13;:11;:13::i;:::-;75104:22:::1;:8;75115:11:::0;;75104:22:::1;:::i;76219:106::-:0;29160:13;:11;:13::i;:::-;29347:6;;76269:48:::1;::::0;-1:-1:-1;;;;;29347:6:0;;;;76295:21:::1;76269:48:::0;::::1;;;::::0;::::1;::::0;;;76295:21;29347:6;76269:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;76219:106::o:0;54268:185::-;54406:39;54423:4;54429:2;54433:7;54406:39;;;;;;;;;;;;:16;:39::i;74670:110::-;29160:13;:11;:13::i;:::-;74750:22:::1;:8;74761:11:::0;;74750:22:::1;:::i;69398:76::-:0;29160:13;:11;:13::i;:::-;69450:9:::1;:16:::0;;-1:-1:-1;;69450:16:0::1;::::0;::::1;::::0;;69398:76::o;62525:385::-;62600:15;62644:13;62433:7;;;62345:103;62644:13;62636:5;:21;62628:71;;;;-1:-1:-1;;;62628:71:0;;10764:2:1;62628:71:0;;;10746:21:1;10803:2;10783:18;;;10776:30;10842:34;10822:18;;;10815:62;-1:-1:-1;;;10893:18:1;;;10886:35;10938:19;;62628:71:0;10562:401:1;62628:71:0;62720:10;62745:6;62741:162;62757:7;;62753:1;:11;62741:162;;;62788:10;62796:1;56485:7;;-1:-1:-1;56475:17:0;56386:114;62788:10;62785:107;;;62830:5;62821;:14;62818:58;;62844:1;62525:385;-1:-1:-1;;;62525:385:0:o;62818:58::-;62869:7;;;;:::i;:::-;;;;62818:58;62766:3;;;;:::i;:::-;;;;62741:162;;;;62617:293;62525:385;;;:::o;75661:97::-;29160:13;:11;:13::i;:::-;75737::::1;::::0;;-1:-1:-1;;75720:30:0;::::1;75737:13:::0;;;;::::1;;;75736:14;75720:30:::0;;::::1;;::::0;;75661:97::o;74556:106::-;29160:13;:11;:13::i;:::-;74634:20:::1;:7;74644:10:::0;;74634:20:::1;:::i;74906:110::-:0;29160:13;:11;:13::i;:::-;74986:22:::1;:8;74997:11:::0;;74986:22:::1;:::i;75871:97::-:0;29160:13;:11;:13::i;:::-;75947::::1;::::0;;-1:-1:-1;;75930:30:0;::::1;-1:-1:-1::0;;;75947:13:0;;;::::1;;;75946:14;75930:30:::0;;::::1;;::::0;;75871:97::o;66812:29::-;;;;;;;:::i;50603:222::-;50720:7;50746:13;50765:29;50786:7;50765:20;:29::i;:::-;-1:-1:-1;50745:49:0;50603:222;-1:-1:-1;;;50603:222:0:o;75558:95::-;29160:13;:11;:13::i;:::-;75633:12:::1;::::0;;-1:-1:-1;;75617:28:0;::::1;75633:12;::::0;;;::::1;;;75632:13;75617:28:::0;;::::1;;::::0;;75558:95::o;50076:465::-;50198:4;-1:-1:-1;;;;;50229:19:0;;50221:77;;;;-1:-1:-1;;;50221:77:0;;11170:2:1;50221:77:0;;;11152:21:1;11209:2;11189:18;;;11182:30;11248:34;11228:18;;;11221:62;-1:-1:-1;;;11299:18:1;;;11292:43;11352:19;;50221:77:0;10968:409:1;50221:77:0;50311:10;50337:6;50332:179;50349:7;;50345:1;:11;50332:179;;;50381:10;50389:1;56485:7;;-1:-1:-1;56475:17:0;56386:114;50381:10;50378:122;;;50424:10;50432:1;50424:7;:10::i;:::-;-1:-1:-1;;;;;50415:19:0;:5;-1:-1:-1;;;;;50415:19:0;;50411:74;;50458:7;;;:::i;:::-;;;50411:74;50358:3;;;:::i;:::-;;;50332:179;;;-1:-1:-1;50528:5:0;50076:465;-1:-1:-1;;50076:465:0:o;29922:103::-;29160:13;:11;:13::i;:::-;29987:30:::1;30014:1;29987:18;:30::i;:::-;29922:103::o:0;69917:130::-;29160:13;:11;:13::i;:::-;70005:34;;::::1;::::0;:15:::1;::::0;:34:::1;::::0;::::1;::::0;::::1;:::i;76435:328::-:0;29160:13;:11;:13::i;:::-;76562:1:::1;76552:7;:11;76544:55;;;::::0;-1:-1:-1;;;76544:55:0;;11584:2:1;76544:55:0::1;::::0;::::1;11566:21:1::0;11623:2;11603:18;;;11596:30;11662:33;11642:18;;;11635:61;11713:18;;76544:55:0::1;11382:355:1::0;76544:55:0::1;76629:21;76618:7;:32;;76610:60;;;::::0;-1:-1:-1;;;76610:60:0;;11944:2:1;76610:60:0::1;::::0;::::1;11926:21:1::0;11983:2;11963:18;;;11956:30;-1:-1:-1;;;12002:18:1;;;11995:45;12057:18;;76610:60:0::1;11742:339:1::0;76610:60:0::1;76682:12;76700:3;-1:-1:-1::0;;;;;76700:8:0::1;76716:7;76700:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76681:47;;;76747:7;76739:16;;;::::0;::::1;76835:510:::0;76924:16;76958:18;76979:17;76989:6;76979:9;:17::i;:::-;76958:38;;77011:10;77025:1;77011:15;77007:331;;77050:16;;;77064:1;77050:16;;;;;;;;;;;;77007:331;77099:23;77139:10;77125:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;77125:25:0;;77099:51;;77170:13;77165:134;77193:10;77185:5;:18;77165:134;;;77249:34;77269:6;77277:5;77249:19;:34::i;:::-;77233:6;77240:5;77233:13;;;;;;;;:::i;:::-;;;;;;;;;;:50;77205:7;;;;:::i;:::-;;;;77165:134;;77007:331;76947:398;76835:510;;;:::o;69482:76::-;29160:13;:11;:13::i;:::-;69534:9:::1;:16:::0;;-1:-1:-1;;69534:16:0::1;-1:-1:-1::0;;;69534:16:0::1;::::0;;69482:76::o;73733:458::-;29160:13;:11;:13::i;:::-;73788:11:::1;;73803:1;73788:16:::0;73784:398:::1;;73834:1;73820:11;:15:::0;29922:103::o;73784:398::-:1;73867:11;;73882:1;73867:16:::0;73863:319:::1;;73913:1;73899:11;:15:::0;29922:103::o;73863:319::-:1;73945:11;;73960:1;73945:16:::0;73941:241:::1;;73991:1;73977:11;:15:::0;29922:103::o;73941:241::-:1;74023:11;;74038:1;74023:16:::0;74019:163:::1;;74069:1;74055:11;:15:::0;29922:103::o;74019:163::-:1;74101:11;;74116:1;74101:16:::0;74097:85:::1;;74133:37;::::0;-1:-1:-1;;;74133:37:0;;12630:2:1;74133:37:0::1;::::0;::::1;12612:21:1::0;12669:2;12649:18;;;12642:30;12708:28;12688:18;;;12681:56;12754:18;;74133:37:0::1;12428:350:1::0;51367:104:0;51423:13;51456:7;51449:14;;;;;:::i;72163:1562::-;72231:18;;;;72223:59;;;;-1:-1:-1;;;72223:59:0;;12985:2:1;72223:59:0;;;12967:21:1;13024:2;13004:18;;;12997:30;13063;13043:18;;;13036:58;13111:18;;72223:59:0;12783:352:1;72223:59:0;72329:9;;72317:8;72301:13;62433:7;;;62345:103;72301:13;:24;;;;:::i;:::-;:37;;72293:78;;;;-1:-1:-1;;;72293:78:0;;13475:2:1;72293:78:0;;;13457:21:1;13514:2;13494:18;;;13487:30;13553;13533:18;;;13526:58;13601:18;;72293:78:0;13273:352:1;72293:78:0;72415:9;72402:8;72391;;:19;;;;:::i;:::-;72390:34;;72382:61;;;;-1:-1:-1;;;72382:61:0;;14005:2:1;72382:61:0;;;13987:21:1;14044:2;14024:18;;;14017:30;-1:-1:-1;;;14063:18:1;;;14056:44;14117:18;;72382:61:0;13803:338:1;72382:61:0;72460:11;;72475:1;72460:16;72456:237;;72500:12;;;;;;;72492:55;;;;-1:-1:-1;;;72492:55:0;;14348:2:1;72492:55:0;;;14330:21:1;14387:2;14367:18;;;14360:30;14426:32;14406:18;;;14399:60;14476:18;;72492:55:0;14146:354:1;72492:55:0;72598:6;;72586:8;72570:13;62433:7;;;62345:103;72570:13;:24;;;;:::i;:::-;:34;;72562:76;;;;-1:-1:-1;;;72562:76:0;;;;;;;:::i;:::-;72650:31;72660:10;72672:8;72650:9;:31::i;:::-;72709:11;;72724:1;72709:16;72705:238;;72749:13;;;;;;;72741:56;;;;-1:-1:-1;;;72741:56:0;;15065:2:1;72741:56:0;;;15047:21:1;15104:2;15084:18;;;15077:30;15143:32;15123:18;;;15116:60;15193:18;;72741:56:0;14863:354:1;72741:56:0;72848:6;;72836:8;72820:13;62433:7;;;62345:103;72820:13;:24;;;;:::i;:::-;:34;;72812:76;;;;-1:-1:-1;;;72812:76:0;;;;;;;:::i;:::-;72900:31;72910:10;72922:8;72900:9;:31::i;:::-;72959:11;;72974:1;72959:16;72955:238;;72999:13;;;;;;;72991:56;;;;-1:-1:-1;;;72991:56:0;;15424:2:1;72991:56:0;;;15406:21:1;15463:2;15443:18;;;15436:30;15502:32;15482:18;;;15475:60;15552:18;;72991:56:0;15222:354:1;72991:56:0;73098:6;;73086:8;73070:13;62433:7;;;62345:103;73070:13;:24;;;;:::i;:::-;:34;;73062:76;;;;-1:-1:-1;;;73062:76:0;;;;;;;:::i;:::-;73150:31;73160:10;73172:8;73150:9;:31::i;:::-;73209:11;;73224:1;73209:16;73205:238;;73249:13;;-1:-1:-1;;;73249:13:0;;;;73241:56;;;;-1:-1:-1;;;73241:56:0;;15783:2:1;73241:56:0;;;15765:21:1;15822:2;15802:18;;;15795:30;15861:32;15841:18;;;15834:60;15911:18;;73241:56:0;15581:354:1;73241:56:0;73348:6;;73336:8;73320:13;62433:7;;;62345:103;73320:13;:24;;;;:::i;:::-;:34;;73312:76;;;;-1:-1:-1;;;73312:76:0;;;;;;;:::i;:::-;73400:31;73410:10;73422:8;73400:9;:31::i;:::-;73459:11;;73474:1;73459:16;73455:261;;73499:13;;-1:-1:-1;;;73499:13:0;;;;73491:56;;;;-1:-1:-1;;;73491:56:0;;16142:2:1;73491:56:0;;;16124:21:1;16181:2;16161:18;;;16154:30;16220:32;16200:18;;;16193:60;16270:18;;73491:56:0;15940:354:1;73491:56:0;73598:6;;73586:8;73570:13;62433:7;;;62345:103;73570:13;:24;;;;:::i;:::-;:34;;73562:99;;;;-1:-1:-1;;;73562:99:0;;16501:2:1;73562:99:0;;;16483:21:1;16540:2;16520:18;;;16513:30;16579:34;16559:18;;;16552:62;-1:-1:-1;;;16630:18:1;;;16623:50;16690:19;;73562:99:0;16299:416:1;73562:99:0;73673:31;73683:10;73695:8;73673:9;:31::i;53136:330::-;27903:10;-1:-1:-1;;;;;53271:24:0;;;53263:65;;;;-1:-1:-1;;;53263:65:0;;16922:2:1;53263:65:0;;;16904:21:1;16961:2;16941:18;;;16934:30;17000;16980:18;;;16973:58;17048:18;;53263:65:0;16720:352:1;53263:65:0;27903:10;53341:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;53341:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;53341:53:0;;;;;;;;;;53410:48;;540:41:1;;;53341:42:0;;27903:10;53410:48;;513:18:1;53410:48:0;;;;;;;53136:330;;:::o;54524:368::-;54713:41;27903:10;54746:7;54713:18;:41::i;:::-;54691:143;;;;-1:-1:-1;;;54691:143:0;;;;;;;:::i;:::-;54845:39;54859:4;54865:2;54869:7;54878:5;54845:13;:39::i;:::-;54524:368;;;;:::o;67565:1574::-;67668:13;67699:16;67707:7;56485;;-1:-1:-1;56475:17:0;56386:114;67699:16;67694:59;;67724:29;;-1:-1:-1;;;67724:29:0;;;;;;;;;;;67694:59;67768:8;;;;:17;;;:35;;;67799:4;67789:7;:14;67768:35;67764:89;;;67827:14;67820:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67565:1574;;;:::o;67764:89::-;67858:8;;;;:16;;:8;:16;:34;;;;;67888:4;67878:7;:14;67858:34;67854:145;;;67949:7;67963:18;:7;:16;:18::i;:::-;67932:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;67918:69;;67565:1574;;;:::o;67854:145::-;68018:9;;;;;;;:18;;;:37;;;68051:4;68040:7;:15;;68018:37;:55;;;;;68069:4;68059:7;:14;68018:55;68013:111;;;68097:15;68090:22;;;;;:::i;68013:111::-;68129:9;;;;;;;;:17;;:9;:17;:36;;;;;68161:4;68150:7;:15;;68129:36;:54;;;;;68179:4;68169:7;:14;68129:54;68125:157;;;68231:8;68245:18;:7;:16;:18::i;68125:157::-;68300:9;;;;;;;:18;;;:37;;;68333:4;68322:7;:15;;68300:37;:55;;;;;68351:4;68341:7;:14;68300:55;68295:111;;;68379:15;68372:22;;;;;:::i;68295:111::-;68411:9;;;;;;;:17;;68424:4;68411:17;:36;;;;;68443:4;68432:7;:15;;68411:36;:54;;;;;68461:4;68451:7;:14;68411:54;68407:157;;;68513:8;68527:18;:7;:16;:18::i;68407:157::-;68583:9;;;;;;;:18;;;:37;;;68616:4;68605:7;:15;;68583:37;:55;;;;;68634:4;68624:7;:14;68583:55;68578:111;;;68662:15;68655:22;;;;;:::i;68578:111::-;68694:9;;;;;;;:17;;68707:4;68694:17;:36;;;;;68726:4;68715:7;:15;;68694:36;:54;;;;;68744:4;68734:7;:14;68694:54;68690:157;;;68796:8;68810:18;:7;:16;:18::i;68690:157::-;68866:9;;-1:-1:-1;;;68866:9:0;;;;:18;;;:37;;;68899:4;68888:7;:15;;68866:37;:55;;;;;68917:4;68907:7;:14;68866:55;68861:111;;;68945:15;68938:22;;;;;:::i;68861:111::-;68977:9;;-1:-1:-1;;;68977:9:0;;;;:17;;68990:4;68977:17;:36;;;;;69009:4;68998:7;:15;;68977:36;:54;;;;;69027:4;69017:7;:14;68977:54;68973:157;;;69079:8;69093:18;:7;:16;:18::i;68973:157::-;67565:1574;;;:::o;70613:1447::-;29160:13;:11;:13::i;:::-;70700:18:::1;::::0;::::1;;70692:59;;;::::0;-1:-1:-1;;;70692:59:0;;12985:2:1;70692:59:0::1;::::0;::::1;12967:21:1::0;13024:2;13004:18;;;12997:30;13063;13043:18;;;13036:58;13111:18;;70692:59:0::1;12783:352:1::0;70692:59:0::1;70798:9;;70786:8;70770:13;62433:7:::0;;;62345:103;70770:13:::1;:24;;;;:::i;:::-;:37;;70762:78;;;::::0;-1:-1:-1;;;70762:78:0;;13475:2:1;70762:78:0::1;::::0;::::1;13457:21:1::0;13514:2;13494:18;;;13487:30;13553;13533:18;;;13526:58;13601:18;;70762:78:0::1;13273:352:1::0;70762:78:0::1;70855:11;;70870:1;70855:16:::0;70851:230:::1;;70895:12;::::0;::::1;::::0;::::1;;;70887:55;;;::::0;-1:-1:-1;;;70887:55:0;;14348:2:1;70887:55:0::1;::::0;::::1;14330:21:1::0;14387:2;14367:18;;;14360:30;14426:32;14406:18;;;14399:60;14476:18;;70887:55:0::1;14146:354:1::0;70887:55:0::1;70993:6;;70981:8;70965:13;62433:7:::0;;;62345:103;70965:13:::1;:24;;;;:::i;:::-;:34;;70957:76;;;;-1:-1:-1::0;;;70957:76:0::1;;;;;;;:::i;:::-;71045:24;71055:3;71060:8;71045:9;:24::i;:::-;71097:11;;71112:1;71097:16:::0;71093:231:::1;;71137:13;::::0;;;::::1;;;71129:56;;;::::0;-1:-1:-1;;;71129:56:0;;15065:2:1;71129:56:0::1;::::0;::::1;15047:21:1::0;15104:2;15084:18;;;15077:30;15143:32;15123:18;;;15116:60;15193:18;;71129:56:0::1;14863:354:1::0;71129:56:0::1;71236:6;;71224:8;71208:13;62433:7:::0;;;62345:103;71208:13:::1;:24;;;;:::i;:::-;:34;;71200:76;;;;-1:-1:-1::0;;;71200:76:0::1;;;;;;;:::i;:::-;71288:24;71298:3;71303:8;71288:9;:24::i;:::-;71340:11;;71355:1;71340:16:::0;71336:231:::1;;71380:13;::::0;;;::::1;;;71372:56;;;::::0;-1:-1:-1;;;71372:56:0;;15424:2:1;71372:56:0::1;::::0;::::1;15406:21:1::0;15463:2;15443:18;;;15436:30;15502:32;15482:18;;;15475:60;15552:18;;71372:56:0::1;15222:354:1::0;71372:56:0::1;71479:6;;71467:8;71451:13;62433:7:::0;;;62345:103;71451:13:::1;:24;;;;:::i;:::-;:34;;71443:76;;;;-1:-1:-1::0;;;71443:76:0::1;;;;;;;:::i;:::-;71531:24;71541:3;71546:8;71531:9;:24::i;:::-;71583:11;;71598:1;71583:16:::0;71579:231:::1;;71623:13;::::0;-1:-1:-1;;;71623:13:0;::::1;;;71615:56;;;::::0;-1:-1:-1;;;71615:56:0;;15783:2:1;71615:56:0::1;::::0;::::1;15765:21:1::0;15822:2;15802:18;;;15795:30;15861:32;15841:18;;;15834:60;15911:18;;71615:56:0::1;15581:354:1::0;71615:56:0::1;71722:6;;71710:8;71694:13;62433:7:::0;;;62345:103;71694:13:::1;:24;;;;:::i;:::-;:34;;71686:76;;;;-1:-1:-1::0;;;71686:76:0::1;;;;;;;:::i;:::-;71774:24;71784:3;71789:8;71774:9;:24::i;:::-;71826:11;;71841:1;71826:16:::0;71822:231:::1;;71866:13;::::0;-1:-1:-1;;;71866:13:0;::::1;;;71858:56;;;::::0;-1:-1:-1;;;71858:56:0;;16142:2:1;71858:56:0::1;::::0;::::1;16124:21:1::0;16181:2;16161:18;;;16154:30;16220:32;16200:18;;;16193:60;16270:18;;71858:56:0::1;15940:354:1::0;71858:56:0::1;71965:6;;71953:8;71937:13;62433:7:::0;;;62345:103;71937:13:::1;:24;;;;:::i;:::-;:34;;71929:76;;;;-1:-1:-1::0;;;71929:76:0::1;;;;;;;:::i;:::-;72017:24;72027:3;72032:8;72017:9;:24::i;69645:126::-:0;29160:13;:11;:13::i;:::-;69731:32;;::::1;::::0;:14:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;30180:201::-:0;29160:13;:11;:13::i;:::-;-1:-1:-1;;;;;30269:22:0;::::1;30261:73;;;::::0;-1:-1:-1;;;30261:73:0;;19126:2:1;30261:73:0::1;::::0;::::1;19108:21:1::0;19165:2;19145:18;;;19138:30;19204:34;19184:18;;;19177:62;-1:-1:-1;;;19255:18:1;;;19248:36;19301:19;;30261:73:0::1;18924:402:1::0;30261:73:0::1;30345:28;30364:8;30345:18;:28::i;70405:93::-:0;29160:13;:11;:13::i;:::-;70473:8:::1;:17:::0;70405:93::o;69314:76::-;29160:13;:11;:13::i;:::-;69366:9:::1;:16:::0;;-1:-1:-1;;69366:16:0::1;::::0;::::1;::::0;;69314:76::o;66920:29::-;;;;;;;:::i;70055:130::-;29160:13;:11;:13::i;:::-;70143:34;;::::1;::::0;:15:::1;::::0;:34:::1;::::0;::::1;::::0;::::1;:::i;29439:132::-:0;29347:6;;-1:-1:-1;;;;;29347:6:0;27903:10;29503:23;29495:68;;;;-1:-1:-1;;;29495:68:0;;19533:2:1;29495:68:0;;;19515:21:1;;;19552:18;;;19545:30;19611:34;19591:18;;;19584:62;19663:18;;29495:68:0;19331:356:1;60242:167:0;60317:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;60317:29:0;-1:-1:-1;;;;;60317:29:0;;;;;;;;:24;;60371:16;60317:24;60371:7;:16::i;:::-;-1:-1:-1;;;;;60362:39:0;;;;;;;;;;;60242:167;;:::o;56667:448::-;56796:4;56840:16;56848:7;56485;;-1:-1:-1;56475:17:0;56386:114;56840:16;56818:113;;;;-1:-1:-1;;;56818:113:0;;19894:2:1;56818:113:0;;;19876:21:1;19933:2;19913:18;;;19906:30;19972:34;19952:18;;;19945:62;-1:-1:-1;;;20023:18:1;;;20016:45;20078:19;;56818:113:0;19692:411:1;56818:113:0;56942:13;56958:16;56966:7;56958;:16::i;:::-;56942:32;;57004:5;-1:-1:-1;;;;;56993:16:0;:7;-1:-1:-1;;;;;56993:16:0;;:64;;;;57050:7;-1:-1:-1;;;;;57026:31:0;:20;57038:7;57026:11;:20::i;:::-;-1:-1:-1;;;;;57026:31:0;;56993:64;:113;;;-1:-1:-1;;;;;;53708:25:0;;;53679:4;53708:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;57074:32;56985:122;56667:448;-1:-1:-1;;;;56667:448:0:o;59104:1020::-;59229:13;59244:24;59272:29;59293:7;59272:20;:29::i;:::-;59228:73;;;;59345:4;-1:-1:-1;;;;;59336:13:0;:5;-1:-1:-1;;;;;59336:13:0;;59314:107;;;;-1:-1:-1;;;59314:107:0;;20310:2:1;59314:107:0;;;20292:21:1;20349:2;20329:18;;;20322:30;20388:34;20368:18;;;20361:62;-1:-1:-1;;;20439:18:1;;;20432:42;20491:19;;59314:107:0;20108:408:1;59314:107:0;-1:-1:-1;;;;;59440:16:0;;59432:68;;;;-1:-1:-1;;;59432:68:0;;20723:2:1;59432:68:0;;;20705:21:1;20762:2;20742:18;;;20735:30;20801:34;20781:18;;;20774:62;-1:-1:-1;;;20852:18:1;;;20845:37;20899:19;;59432:68:0;20521:403:1;59432:68:0;59621:29;59638:1;59642:7;59621:8;:29::i;:::-;59666:19;59688:11;:7;59698:1;59688:11;:::i;:::-;6638:1;6629:10;;;59716;6716:20;;;;;;;;;;;6629:10;;-1:-1:-1;;;;6693:4:0;6685:12;;6665:33;6716:27;:32;;;59715:68;;;59776:7;;59762:11;:21;59715:68;59712:179;;;59810:20;;;;:7;:20;;;;;:27;;-1:-1:-1;;;;;;59810:27:0;-1:-1:-1;;;;;59810:27:0;;;;;59852;;59810:20;59852:14;:27::i;:::-;59903:16;;;;:7;:16;;;;;:21;;-1:-1:-1;;;;;;59903:21:0;-1:-1:-1;;;;;59903:21:0;;;;;59938:27;;;59935:82;;59982:23;:10;59997:7;59982:14;:23::i;:::-;60053:7;60049:2;-1:-1:-1;;;;;60034:27:0;60043:4;-1:-1:-1;;;;;60034:27:0;;;;;;;;;;;59217:907;;;59104:1020;;;:::o;50833:298::-;50903:13;50918:24;50962:16;50970:7;56485;;-1:-1:-1;56475:17:0;56386:114;50962:16;50954:73;;;;-1:-1:-1;;;50954:73:0;;21131:2:1;50954:73:0;;;21113:21:1;21170:2;21150:18;;;21143:30;21209:34;21189:18;;;21182:62;-1:-1:-1;;;21260:18:1;;;21253:42;21312:19;;50954:73:0;20929:408:1;50954:73:0;51057:22;51071:7;51057:13;:22::i;:::-;51098:25;;;;:7;:25;;;;;;-1:-1:-1;;;;;51098:25:0;;51038:41;;-1:-1:-1;50833:298:0;-1:-1:-1;;50833:298:0:o;30541:191::-;30634:6;;;-1:-1:-1;;;;;30651:17:0;;;-1:-1:-1;;;;;;30651:17:0;;;;;;;30684:40;;30634:6;;;30651:17;30634:6;;30684:40;;30615:16;;30684:40;30604:128;30541:191;:::o;57478:112::-;57555:27;57565:2;57569:8;57555:27;;;;;;;;;;;;:9;:27::i;55774:357::-;55931:28;55941:4;55947:2;55951:7;55931:9;:28::i;:::-;55992:50;56015:4;56021:2;56025:7;56034:1;56036:5;55992:22;:50::i;:::-;55970:153;;;;-1:-1:-1;;;55970:153:0;;;;;;;:::i;25075:723::-;25131:13;25352:5;25361:1;25352:10;25348:53;;-1:-1:-1;;25379:10:0;;;;;;;;;;;;-1:-1:-1;;;25379:10:0;;;;;25075:723::o;25348:53::-;25426:5;25411:12;25467:78;25474:9;;25467:78;;25500:8;;;;:::i;:::-;;-1:-1:-1;25523:10:0;;-1:-1:-1;25531:2:0;25523:10;;:::i;:::-;;;25467:78;;;25555:19;25587:6;25577:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25577:17:0;;25555:39;;25605:154;25612:10;;25605:154;;25639:11;25649:1;25639:11;;:::i;:::-;;-1:-1:-1;25708:10:0;25716:2;25708:5;:10;:::i;:::-;25695:24;;:2;:24;:::i;:::-;25682:39;;25665:6;25672;25665:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;25665:56:0;;;;;;;;-1:-1:-1;25736:11:0;25745:2;25736:11;;:::i;:::-;;;25605:154;;7142:204;7239:1;7230:10;;;7213:14;7310:20;;;;;;;;;;;;:28;;-1:-1:-1;;;7294:4:0;7286:12;;;7266:33;;;;7310:28;;;;;7142:204::o;62110:159::-;62173:24;62229:31;62173:24;62252:7;62229:22;:31::i;57604:382::-;57758:7;;57776:19;57782:2;57786:8;57776:5;:19::i;:::-;57828:69;57859:1;57863:2;57867:12;57881:8;57891:5;61063:1039;61250:6;-1:-1:-1;;;;;61273:13:0;;17618:19;:23;61269:826;;-1:-1:-1;61309:4:0;61350:12;61328:689;61374:23;61389:8;61374:12;:23;:::i;:::-;61364:7;:33;61328:689;;;61432:72;;-1:-1:-1;;;61432:72:0;;-1:-1:-1;;;;;61432:36:0;;;;;:72;;27903:10;;61483:4;;61489:7;;61498:5;;61432:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61432:72:0;;;;;;;;-1:-1:-1;;61432:72:0;;;;;;;;;;;;:::i;:::-;;;61428:574;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61688:6;:13;61705:1;61688:18;61684:299;;61735:63;;-1:-1:-1;;;61735:63:0;;;;;;;:::i;61684:299::-;61925:6;61919:13;61910:6;61906:2;61902:15;61895:38;61428:574;61556:1;:56;;;;-1:-1:-1;;;;;;;61561:51:0;;-1:-1:-1;;;61561:51:0;61556:56;61552:60;;61505:127;61399:9;;;;:::i;:::-;;;;61328:689;;;;62031:8;;61269:826;-1:-1:-1;62079:4:0;61269:826;61063:1039;;;;;;;:::o;11913:1234::-;12053:1;12044:10;;;11995:19;12210:20;;;;;;;;;;;11995:19;;12044:10;12134:4;12126:12;;;;12315:18;;;12308:26;12387:6;;12384:756;;12485:22;:2;:20;:22::i;:::-;12470:37;;:11;:37;12464:1;12454:6;:11;;12453:55;12439:69;;12384:756;;;12608:1;12599:6;:10;12591:75;;;;-1:-1:-1;;;12591:75:0;;23229:2:1;12591:75:0;;;23211:21:1;23268:2;23248:18;;;23241:30;23307:34;23287:18;;;23280:62;-1:-1:-1;;;23358:18:1;;;23351:50;23418:19;;12591:75:0;23027:416:1;12591:75:0;-1:-1:-1;;;12718:8:0;;;12849:12;:20;;;;;;;;;;;12718:8;;-1:-1:-1;12909:6:0;;12906:207;;13015:22;:2;:20;:22::i;:::-;13008:3;:29;12991:47;;13002:1;12992:6;:11;;12991:47;12977:61;;13065:5;;12906:207;12560:569;;;12016:1131;;;11913:1234;;;;:::o;57996:769::-;58121:7;;58157:12;58149:62;;;;-1:-1:-1;;;58149:62:0;;23650:2:1;58149:62:0;;;23632:21:1;23689:2;23669:18;;;23662:30;23728:34;23708:18;;;23701:62;-1:-1:-1;;;23779:18:1;;;23772:35;23824:19;;58149:62:0;23448:401:1;58149:62:0;-1:-1:-1;;;;;58230:16:0;;58222:64;;;;-1:-1:-1;;;58222:64:0;;24056:2:1;58222:64:0;;;24038:21:1;24095:2;24075:18;;;24068:30;24134:34;24114:18;;;24107:62;-1:-1:-1;;;24185:18:1;;;24178:33;24228:19;;58222:64:0;23854:399:1;58222:64:0;58394:8;58383:7;;:19;;;;;;;:::i;:::-;;;;-1:-1:-1;;58413:25:0;;;;:7;:25;;;;;:30;;-1:-1:-1;;;;;;58413:30:0;-1:-1:-1;;;;;58413:30:0;;;;;58454:32;;58413:25;58454:14;:32::i;:::-;58626:16;58606:151;58653:27;58672:8;58653:16;:27;:::i;:::-;58643:7;:37;58606:151;;;58712:33;;58737:7;;-1:-1:-1;;;;;58712:33:0;;;58729:1;;58712:33;;58729:1;;58712:33;58682:9;;;;:::i;:::-;;;;58606:151;;4110:201;4172:5;4228:16;;;;;;;;;;;;;;;;;4284:3;2626:64;4246:18;4261:2;4246:14;:18::i;:::-;:33;4245:42;;4228:60;;;;;;;;:::i;:::-;;;;;;;;4110:201;-1:-1:-1;;4110:201:0:o;3337:169::-;3396:7;3429:1;3424:2;:6;3416:15;;;;;;-1:-1:-1;3480:1:0;:6;;;3474:13;;3337:169::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:269::-;908:3;946:5;940:12;973:6;968:3;961:19;989:63;1045:6;1038:4;1033:3;1029:14;1022:4;1015:5;1011:16;989:63;:::i;:::-;1106:2;1085:15;-1:-1:-1;;1081:29:1;1072:39;;;;1113:4;1068:50;;855:269;-1:-1:-1;;855:269:1:o;1129:231::-;1278:2;1267:9;1260:21;1241:4;1298:56;1350:2;1339:9;1335:18;1327:6;1298:56;:::i;1365:180::-;1424:6;1477:2;1465:9;1456:7;1452:23;1448:32;1445:52;;;1493:1;1490;1483:12;1445:52;-1:-1:-1;1516:23:1;;1365:180;-1:-1:-1;1365:180:1:o;1758:131::-;-1:-1:-1;;;;;1833:31:1;;1823:42;;1813:70;;1879:1;1876;1869:12;1894:315;1962:6;1970;2023:2;2011:9;2002:7;1998:23;1994:32;1991:52;;;2039:1;2036;2029:12;1991:52;2078:9;2065:23;2097:31;2122:5;2097:31;:::i;:::-;2147:5;2199:2;2184:18;;;;2171:32;;-1:-1:-1;;;1894:315:1:o;2396:127::-;2457:10;2452:3;2448:20;2445:1;2438:31;2488:4;2485:1;2478:15;2512:4;2509:1;2502:15;2528:632;2593:5;2623:18;2664:2;2656:6;2653:14;2650:40;;;2670:18;;:::i;:::-;2745:2;2739:9;2713:2;2799:15;;-1:-1:-1;;2795:24:1;;;2821:2;2791:33;2787:42;2775:55;;;2845:18;;;2865:22;;;2842:46;2839:72;;;2891:18;;:::i;:::-;2931:10;2927:2;2920:22;2960:6;2951:15;;2990:6;2982;2975:22;3030:3;3021:6;3016:3;3012:16;3009:25;3006:45;;;3047:1;3044;3037:12;3006:45;3097:6;3092:3;3085:4;3077:6;3073:17;3060:44;3152:1;3145:4;3136:6;3128;3124:19;3120:30;3113:41;;;;2528:632;;;;;:::o;3165:451::-;3234:6;3287:2;3275:9;3266:7;3262:23;3258:32;3255:52;;;3303:1;3300;3293:12;3255:52;3343:9;3330:23;3376:18;3368:6;3365:30;3362:50;;;3408:1;3405;3398:12;3362:50;3431:22;;3484:4;3476:13;;3472:27;-1:-1:-1;3462:55:1;;3513:1;3510;3503:12;3462:55;3536:74;3602:7;3597:2;3584:16;3579:2;3575;3571:11;3536:74;:::i;3621:456::-;3698:6;3706;3714;3767:2;3755:9;3746:7;3742:23;3738:32;3735:52;;;3783:1;3780;3773:12;3735:52;3822:9;3809:23;3841:31;3866:5;3841:31;:::i;:::-;3891:5;-1:-1:-1;3948:2:1;3933:18;;3920:32;3961:33;3920:32;3961:33;:::i;:::-;3621:456;;4013:7;;-1:-1:-1;;;4067:2:1;4052:18;;;;4039:32;;3621:456::o;4082:592::-;4153:6;4161;4214:2;4202:9;4193:7;4189:23;4185:32;4182:52;;;4230:1;4227;4220:12;4182:52;4270:9;4257:23;4299:18;4340:2;4332:6;4329:14;4326:34;;;4356:1;4353;4346:12;4326:34;4394:6;4383:9;4379:22;4369:32;;4439:7;4432:4;4428:2;4424:13;4420:27;4410:55;;4461:1;4458;4451:12;4410:55;4501:2;4488:16;4527:2;4519:6;4516:14;4513:34;;;4543:1;4540;4533:12;4513:34;4588:7;4583:2;4574:6;4570:2;4566:15;4562:24;4559:37;4556:57;;;4609:1;4606;4599:12;4556:57;4640:2;4632:11;;;;;4662:6;;-1:-1:-1;4082:592:1;;-1:-1:-1;;;;4082:592:1:o;4679:247::-;4738:6;4791:2;4779:9;4770:7;4766:23;4762:32;4759:52;;;4807:1;4804;4797:12;4759:52;4846:9;4833:23;4865:31;4890:5;4865:31;:::i;4931:323::-;5007:6;5015;5068:2;5056:9;5047:7;5043:23;5039:32;5036:52;;;5084:1;5081;5074:12;5036:52;5120:9;5107:23;5097:33;;5180:2;5169:9;5165:18;5152:32;5193:31;5218:5;5193:31;:::i;:::-;5243:5;5233:15;;;4931:323;;;;;:::o;5259:632::-;5430:2;5482:21;;;5552:13;;5455:18;;;5574:22;;;5401:4;;5430:2;5653:15;;;;5627:2;5612:18;;;5401:4;5696:169;5710:6;5707:1;5704:13;5696:169;;;5771:13;;5759:26;;5840:15;;;;5805:12;;;;5732:1;5725:9;5696:169;;;-1:-1:-1;5882:3:1;;5259:632;-1:-1:-1;;;;;;5259:632:1:o;5896:416::-;5961:6;5969;6022:2;6010:9;6001:7;5997:23;5993:32;5990:52;;;6038:1;6035;6028:12;5990:52;6077:9;6064:23;6096:31;6121:5;6096:31;:::i;:::-;6146:5;-1:-1:-1;6203:2:1;6188:18;;6175:32;6245:15;;6238:23;6226:36;;6216:64;;6276:1;6273;6266:12;6317:795;6412:6;6420;6428;6436;6489:3;6477:9;6468:7;6464:23;6460:33;6457:53;;;6506:1;6503;6496:12;6457:53;6545:9;6532:23;6564:31;6589:5;6564:31;:::i;:::-;6614:5;-1:-1:-1;6671:2:1;6656:18;;6643:32;6684:33;6643:32;6684:33;:::i;:::-;6736:7;-1:-1:-1;6790:2:1;6775:18;;6762:32;;-1:-1:-1;6845:2:1;6830:18;;6817:32;6872:18;6861:30;;6858:50;;;6904:1;6901;6894:12;6858:50;6927:22;;6980:4;6972:13;;6968:27;-1:-1:-1;6958:55:1;;7009:1;7006;6999:12;6958:55;7032:74;7098:7;7093:2;7080:16;7075:2;7071;7067:11;7032:74;:::i;:::-;7022:84;;;6317:795;;;;;;;:::o;7437:388::-;7505:6;7513;7566:2;7554:9;7545:7;7541:23;7537:32;7534:52;;;7582:1;7579;7572:12;7534:52;7621:9;7608:23;7640:31;7665:5;7640:31;:::i;:::-;7690:5;-1:-1:-1;7747:2:1;7732:18;;7719:32;7760:33;7719:32;7760:33;:::i;7830:380::-;7909:1;7905:12;;;;7952;;;7973:61;;8027:4;8019:6;8015:17;8005:27;;7973:61;8080:2;8072:6;8069:14;8049:18;8046:38;8043:161;;8126:10;8121:3;8117:20;8114:1;8107:31;8161:4;8158:1;8151:15;8189:4;8186:1;8179:15;9464:416;9666:2;9648:21;;;9705:2;9685:18;;;9678:30;9744:34;9739:2;9724:18;;9717:62;-1:-1:-1;;;9810:2:1;9795:18;;9788:50;9870:3;9855:19;;9464:416::o;9885:127::-;9946:10;9941:3;9937:20;9934:1;9927:31;9977:4;9974:1;9967:15;10001:4;9998:1;9991:15;10017:135;10056:3;10077:17;;;10074:43;;10097:18;;:::i;:::-;-1:-1:-1;10144:1:1;10133:13;;10017:135::o;12296:127::-;12357:10;12352:3;12348:20;12345:1;12338:31;12388:4;12385:1;12378:15;12412:4;12409:1;12402:15;13140:128;13180:3;13211:1;13207:6;13204:1;13201:13;13198:39;;;13217:18;;:::i;:::-;-1:-1:-1;13253:9:1;;13140:128::o;13630:168::-;13670:7;13736:1;13732;13728:6;13724:14;13721:1;13718:21;13713:1;13706:9;13699:17;13695:45;13692:71;;;13743:18;;:::i;:::-;-1:-1:-1;13783:9:1;;13630:168::o;14505:353::-;14707:2;14689:21;;;14746:2;14726:18;;;14719:30;14785:31;14780:2;14765:18;;14758:59;14849:2;14834:18;;14505:353::o;17322:185::-;17364:3;17402:5;17396:12;17417:52;17462:6;17457:3;17450:4;17443:5;17439:16;17417:52;:::i;:::-;17485:16;;;;;17322:185;-1:-1:-1;;17322:185:1:o;17512:1407::-;17890:3;17919:1;17952:6;17946:13;17982:3;18004:1;18032:9;18028:2;18024:18;18014:28;;18092:2;18081:9;18077:18;18114;18104:61;;18158:4;18150:6;18146:17;18136:27;;18104:61;18184:2;18232;18224:6;18221:14;18201:18;18198:38;18195:165;;-1:-1:-1;;;18259:33:1;;18315:4;18312:1;18305:15;18345:4;18266:3;18333:17;18195:165;18376:18;18403:104;;;;18521:1;18516:320;;;;18369:467;;18403:104;-1:-1:-1;;18436:24:1;;18424:37;;18481:16;;;;-1:-1:-1;18403:104:1;;18516:320;17150:1;17143:14;;;17187:4;17174:18;;18611:1;18625:165;18639:6;18636:1;18633:13;18625:165;;;18717:14;;18704:11;;;18697:35;18760:16;;;;18654:10;;18625:165;;;18629:3;;18819:6;18814:3;18810:16;18803:23;;18369:467;;;;;;;18852:61;18878:34;18908:3;-1:-1:-1;;;17268:16:1;;17309:1;17300:11;;17203:114;18878:34;18870:6;18852:61;:::i;21342:417::-;21544:2;21526:21;;;21583:2;21563:18;;;21556:30;21622:34;21617:2;21602:18;;21595:62;-1:-1:-1;;;21688:2:1;21673:18;;21666:51;21749:3;21734:19;;21342:417::o;21764:127::-;21825:10;21820:3;21816:20;21813:1;21806:31;21856:4;21853:1;21846:15;21880:4;21877:1;21870:15;21896:120;21936:1;21962;21952:35;;21967:18;;:::i;:::-;-1:-1:-1;22001:9:1;;21896:120::o;22021:125::-;22061:4;22089:1;22086;22083:8;22080:34;;;22094:18;;:::i;:::-;-1:-1:-1;22131:9:1;;22021:125::o;22151:112::-;22183:1;22209;22199:35;;22214:18;;:::i;:::-;-1:-1:-1;22248:9:1;;22151:112::o;22268:500::-;-1:-1:-1;;;;;22537:15:1;;;22519:34;;22589:15;;22584:2;22569:18;;22562:43;22636:2;22621:18;;22614:34;;;22684:3;22679:2;22664:18;;22657:31;;;22462:4;;22705:57;;22742:19;;22734:6;22705:57;:::i;:::-;22697:65;22268:500;-1:-1:-1;;;;;;22268:500:1:o;22773:249::-;22842:6;22895:2;22883:9;22874:7;22870:23;22866:32;22863:52;;;22911:1;22908;22901:12;22863:52;22943:9;22937:16;22962:30;22986:5;22962:30;:::i

Swarm Source

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