ETH Price: $2,496.61 (-2.28%)

Token

Tensor AI (TAI)
 

Overview

Max Total Supply

100,000,000 TAI

Holders

66

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
doss.eth
Balance
500,000 TAI

Value
$0.00
0x47C7562761993a4A58d92d77d926C7697d25aDCE
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:
TAI

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-03-03
*/

// https://tensorAI.tech
// https://t.me/TensorAIProtocol
// https://x.com/TensorAI_

pragma solidity >=0.5.0;

interface IOFTReceiverV2 {
    /**
     * @dev Called by the OFT contract when tokens are received from source chain.
     * @param _srcChainId The chain id of the source chain.
     * @param _srcAddress The address of the OFT token contract on the source chain.
     * @param _nonce The nonce of the transaction on the source chain.
     * @param _from The address of the account who calls the sendAndCall() on the source chain.
     * @param _amount The amount of tokens to transfer.
     * @param _payload Additional data with no specified format.
     */
    function onOFTReceived(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes32 _from, uint _amount, bytes calldata _payload) external;
}

// 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: contracts/TensorAI/token/oft/v2/interfaces/ICommonOFT.sol



pragma solidity >=0.5.0;


/**
 * @dev Interface of the IOFT core standard
 */
interface ICommonOFT is IERC165 {

    struct LzCallParams {
        address payable refundAddress;
        address zroPaymentAddress;
        bytes adapterParams;
    }

    /**
     * @dev estimate send token `_tokenId` to (`_dstChainId`, `_toAddress`)
     * _dstChainId - L0 defined chain id to send tokens too
     * _toAddress - dynamic bytes array which contains the address to whom you are sending tokens to on the dstChain
     * _amount - amount of the tokens to transfer
     * _useZro - indicates to use zro to pay L0 fees
     * _adapterParam - flexible bytes array to indicate messaging adapter services in L0
     */
    function estimateSendFee(uint16 _dstChainId, bytes32 _toAddress, uint _amount, bool _useZro, bytes calldata _adapterParams) external view returns (uint nativeFee, uint zroFee);

    function estimateSendAndCallFee(uint16 _dstChainId, bytes32 _toAddress, uint _amount, bytes calldata _payload, uint64 _dstGasForCall, bool _useZro, bytes calldata _adapterParams) external view returns (uint nativeFee, uint zroFee);

    /**
     * @dev returns the circulating amount of tokens on current chain
     */
    function circulatingSupply() external view returns (uint);

    /**
     * @dev returns the address of the ERC20 token
     */
    function token() external view returns (address);
}

// File: contracts/TensorAI/token/oft/v2/interfaces/IOFTV2.sol



pragma solidity >=0.5.0;


/**
 * @dev Interface of the IOFT core standard
 */
interface IOFTV2 is ICommonOFT {

    /**
     * @dev send `_amount` amount of token to (`_dstChainId`, `_toAddress`) from `_from`
     * `_from` the owner of token
     * `_dstChainId` the destination chain identifier
     * `_toAddress` can be any size depending on the `dstChainId`.
     * `_amount` the quantity of tokens in wei
     * `_refundAddress` the address TensorAI refunds if too much message fee is sent
     * `_zroPaymentAddress` set to address(0x0) if not paying in ZRO (TensorAI Token)
     * `_adapterParams` is a flexible bytes array to indicate messaging adapter services
     */
    function sendFrom(address _from, uint16 _dstChainId, bytes32 _toAddress, uint _amount, LzCallParams calldata _callParams) external payable;

    function sendAndCall(address _from, uint16 _dstChainId, bytes32 _toAddress, uint _amount, bytes calldata _payload, uint64 _dstGasForCall, LzCallParams calldata _callParams) external payable;
}

// File: contracts/TensorAI/libraries/ExcessivelySafeCall.sol


pragma solidity >=0.7.6;

library ExcessivelySafeCall {
    uint constant LOW_28_MASK = 0x00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff;

    /// @notice Use when you _really_ really _really_ don't trust the called
    /// contract. This prevents the called contract from causing reversion of
    /// the caller in as many ways as we can.
    /// @dev The main difference between this and a solidity low-level call is
    /// that we limit the number of bytes that the callee can cause to be
    /// copied to caller memory. This prevents stupid things like malicious
    /// contracts returning 10,000,000 bytes causing a local OOG when copying
    /// to memory.
    /// @param _target The address to call
    /// @param _gas The amount of gas to forward to the remote contract
    /// @param _maxCopy The maximum number of bytes of returndata to copy
    /// to memory.
    /// @param _calldata The data to send to the remote contract
    /// @return success and returndata, as `.call()`. Returndata is capped to
    /// `_maxCopy` bytes.
    function excessivelySafeCall(
        address _target,
        uint _gas,
        uint16 _maxCopy,
        bytes memory _calldata
    ) internal returns (bool, bytes memory) {
        // set up for assembly call
        uint _toCopy;
        bool _success;
        bytes memory _returnData = new bytes(_maxCopy);
        // dispatch message to recipient
        // by assembly calling "handle" function
        // we call via assembly to avoid memcopying a very large returndata
        // returned by a malicious contract
        assembly {
            _success := call(
                _gas, // gas
                _target, // recipient
                0, // ether value
                add(_calldata, 0x20), // inloc
                mload(_calldata), // inlen
                0, // outloc
                0 // outlen
            )
            // limit our copy to 256 bytes
            _toCopy := returndatasize()
            if gt(_toCopy, _maxCopy) {
                _toCopy := _maxCopy
            }
            // Store the length of the copied bytes
            mstore(_returnData, _toCopy)
            // copy the bytes from returndata[0:_toCopy]
            returndatacopy(add(_returnData, 0x20), 0, _toCopy)
        }
        return (_success, _returnData);
    }

    /// @notice Use when you _really_ really _really_ don't trust the called
    /// contract. This prevents the called contract from causing reversion of
    /// the caller in as many ways as we can.
    /// @dev The main difference between this and a solidity low-level call is
    /// that we limit the number of bytes that the callee can cause to be
    /// copied to caller memory. This prevents stupid things like malicious
    /// contracts returning 10,000,000 bytes causing a local OOG when copying
    /// to memory.
    /// @param _target The address to call
    /// @param _gas The amount of gas to forward to the remote contract
    /// @param _maxCopy The maximum number of bytes of returndata to copy
    /// to memory.
    /// @param _calldata The data to send to the remote contract
    /// @return success and returndata, as `.call()`. Returndata is capped to
    /// `_maxCopy` bytes.
    function excessivelySafeStaticCall(
        address _target,
        uint _gas,
        uint16 _maxCopy,
        bytes memory _calldata
    ) internal view returns (bool, bytes memory) {
        // set up for assembly call
        uint _toCopy;
        bool _success;
        bytes memory _returnData = new bytes(_maxCopy);
        // dispatch message to recipient
        // by assembly calling "handle" function
        // we call via assembly to avoid memcopying a very large returndata
        // returned by a malicious contract
        assembly {
            _success := staticcall(
                _gas, // gas
                _target, // recipient
                add(_calldata, 0x20), // inloc
                mload(_calldata), // inlen
                0, // outloc
                0 // outlen
            )
            // limit our copy to 256 bytes
            _toCopy := returndatasize()
            if gt(_toCopy, _maxCopy) {
                _toCopy := _maxCopy
            }
            // Store the length of the copied bytes
            mstore(_returnData, _toCopy)
            // copy the bytes from returndata[0:_toCopy]
            returndatacopy(add(_returnData, 0x20), 0, _toCopy)
        }
        return (_success, _returnData);
    }

    /**
     * @notice Swaps function selectors in encoded contract calls
     * @dev Allows reuse of encoded calldata for functions with identical
     * argument types but different names. It simply swaps out the first 4 bytes
     * for the new selector. This function modifies memory in place, and should
     * only be used with caution.
     * @param _newSelector The new 4-byte selector
     * @param _buf The encoded contract args
     */
    function swapSelector(bytes4 _newSelector, bytes memory _buf) internal pure {
        require(_buf.length >= 4);
        uint _mask = LOW_28_MASK;
        assembly {
            // load the first word of
            let _word := mload(add(_buf, 0x20))
            // mask out the top 4 bytes
            // /x
            _word := and(_word, _mask)
            _word := or(_newSelector, _word)
            mstore(add(_buf, 0x20), _word)
        }
    }
}

// File: contracts/TensorAI/libraries/BytesLib.sol


/*
 * @title Solidity Bytes Arrays Utils
 * @author Gonçalo Sá <[email protected]>
 *
 * @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity.
 *      The library lets you concatenate, slice and type cast bytes arrays both in memory and storage.
 */
pragma solidity >=0.8.0 <0.9.0;

library BytesLib {
    function concat(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bytes memory) {
        bytes memory tempBytes;

        assembly {
            // Get a location of some free memory and store it in tempBytes as
            // Solidity does for memory variables.
            tempBytes := mload(0x40)

            // Store the length of the first bytes array at the beginning of
            // the memory for tempBytes.
            let length := mload(_preBytes)
            mstore(tempBytes, length)

            // Maintain a memory counter for the current write location in the
            // temp bytes array by adding the 32 bytes for the array length to
            // the starting location.
            let mc := add(tempBytes, 0x20)
            // Stop copying when the memory counter reaches the length of the
            // first bytes array.
            let end := add(mc, length)

            for {
                // Initialize a copy counter to the start of the _preBytes data,
                // 32 bytes into its memory.
                let cc := add(_preBytes, 0x20)
            } lt(mc, end) {
                // Increase both counters by 32 bytes each iteration.
                mc := add(mc, 0x20)
                cc := add(cc, 0x20)
            } {
                // Write the _preBytes data into the tempBytes memory 32 bytes
                // at a time.
                mstore(mc, mload(cc))
            }

            // Add the length of _postBytes to the current length of tempBytes
            // and store it as the new length in the first 32 bytes of the
            // tempBytes memory.
            length := mload(_postBytes)
            mstore(tempBytes, add(length, mload(tempBytes)))

            // Move the memory counter back from a multiple of 0x20 to the
            // actual end of the _preBytes data.
            mc := end
            // Stop copying when the memory counter reaches the new combined
            // length of the arrays.
            end := add(mc, length)

            for {
                let cc := add(_postBytes, 0x20)
            } lt(mc, end) {
                mc := add(mc, 0x20)
                cc := add(cc, 0x20)
            } {
                mstore(mc, mload(cc))
            }

            // Update the free-memory pointer by padding our last write location
            // to 32 bytes: add 31 bytes to the end of tempBytes to move to the
            // next 32 byte block, then round down to the nearest multiple of
            // 32. If the sum of the length of the two arrays is zero then add
            // one before rounding down to leave a blank 32 bytes (the length block with 0).
            mstore(
                0x40,
                and(
                    add(add(end, iszero(add(length, mload(_preBytes)))), 31),
                    not(31) // Round down to the nearest 32 bytes.
                )
            )
        }

        return tempBytes;
    }

    function concatStorage(bytes storage _preBytes, bytes memory _postBytes) internal {
        assembly {
            // Read the first 32 bytes of _preBytes storage, which is the length
            // of the array. (We don't need to use the offset into the slot
            // because arrays use the entire slot.)
            let fslot := sload(_preBytes.slot)
            // Arrays of 31 bytes or less have an even value in their slot,
            // while longer arrays have an odd value. The actual length is
            // the slot divided by two for odd values, and the lowest order
            // byte divided by two for even values.
            // If the slot is even, bitwise and the slot with 255 and divide by
            // two to get the length. If the slot is odd, bitwise and the slot
            // with -1 and divide by two.
             // the following is a preliminary code snippet
            //fn get_block_subsidy(_n: BlockNumberFor<T>) -> BalanceOf<T> {
            //let halving_interval: u32 = T::HalvingInterval::get();

             //let block_num_as_u32: u32 = TryInto::try_into(_n)
            //.ok()
           //.expect("block_num_as_u32 Err.");

           // let halvings: u32 = block_num_as_u32 / halving_interval;

           //  if halvings >= 64 {
           //   return (0 as u32).saturated_into::<BalanceOf<T>>();
            // }

           // let mut cost_in_u128: u128 = 4375000000000000000; // example placer for snippet
          //cost_in_u128 >>= halvings;

           // let block_subsidy: BalanceOf<T> = cost_in_u128.saturated_into::<BalanceOf<T>>();

          // block_subsidy
          // }
            let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)
            let mlength := mload(_postBytes)
            let newlength := add(slength, mlength)
            // slength can contain both the length and contents of the array
            // if length < 32 bytes so let's prepare for that
            // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage
            switch add(lt(slength, 32), lt(newlength, 32))
            case 2 {
                // Since the new array still fits in the slot, we just need to
                // update the contents of the slot.
                // uint256(bytes_storage) = uint256(bytes_storage) + uint256(bytes_memory) + new_length
                sstore(
                    _preBytes.slot,
                    // all the modifications to the slot are inside this
                    // next block
                    add(
                        // we can just add to the slot contents because the
                        // bytes we want to change are the LSBs
                        fslot,
                        add(
                            mul(
                                div(
                                    // load the bytes from memory
                                    mload(add(_postBytes, 0x20)),
                                    // zero all bytes to the right
                                    exp(0x100, sub(32, mlength))
                                ),
                                // and now shift left the number of bytes to
                                // leave space for the length in the slot
                                exp(0x100, sub(32, newlength))
                            ),
                            // increase length by the double of the memory
                            // bytes length
                            mul(mlength, 2)
                        )
                    )
                )
            }
            case 1 {
                // The stored value fits in the slot, but the combined value
                // will exceed it.
                // get the keccak hash to get the contents of the array
                mstore(0x0, _preBytes.slot)
                let sc := add(keccak256(0x0, 0x20), div(slength, 32))

                // save new length
                sstore(_preBytes.slot, add(mul(newlength, 2), 1))

                // The contents of the _postBytes array start 32 bytes into
                // the structure. Our first read should obtain the `submod`
                // bytes that can fit into the unused space in the last word
                // of the stored array. To get this, we read 32 bytes starting
                // from `submod`, so the data we read overlaps with the array
                // contents by `submod` bytes. Masking the lowest-order
                // `submod` bytes allows us to add that value directly to the
                // stored value.

                let submod := sub(32, slength)
                let mc := add(_postBytes, submod)
                let end := add(_postBytes, mlength)
                let mask := sub(exp(0x100, submod), 1)

                sstore(sc, add(and(fslot, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00), and(mload(mc), mask)))

                for {
                    mc := add(mc, 0x20)
                    sc := add(sc, 1)
                } lt(mc, end) {
                    sc := add(sc, 1)
                    mc := add(mc, 0x20)
                } {
                    sstore(sc, mload(mc))
                }

                mask := exp(0x100, sub(mc, end))

                sstore(sc, mul(div(mload(mc), mask), mask))
            }
            default {
                // get the keccak hash to get the contents of the array
                mstore(0x0, _preBytes.slot)
                // Start copying to the last used word of the stored array.
                let sc := add(keccak256(0x0, 0x20), div(slength, 32))

                // save new length
                sstore(_preBytes.slot, add(mul(newlength, 2), 1))

                // Copy over the first `submod` bytes of the new data as in
                // case 1 above.
                let slengthmod := mod(slength, 32)
                let mlengthmod := mod(mlength, 32)
                let submod := sub(32, slengthmod)
                let mc := add(_postBytes, submod)
                let end := add(_postBytes, mlength)
                let mask := sub(exp(0x100, submod), 1)

                sstore(sc, add(sload(sc), and(mload(mc), mask)))

                for {
                    sc := add(sc, 1)
                    mc := add(mc, 0x20)
                } lt(mc, end) {
                    sc := add(sc, 1)
                    mc := add(mc, 0x20)
                } {
                    sstore(sc, mload(mc))
                }

                mask := exp(0x100, sub(mc, end))

                sstore(sc, mul(div(mload(mc), mask), mask))
            }
        }
    }

    function slice(
        bytes memory _bytes,
        uint _start,
        uint _length
    ) internal pure returns (bytes memory) {
        require(_length + 31 >= _length, "slice_overflow");
        require(_bytes.length >= _start + _length, "slice_outOfBounds");

        bytes memory tempBytes;

        assembly {
            switch iszero(_length)
            case 0 {
                // Get a location of some free memory and store it in tempBytes as
                // Solidity does for memory variables.
                tempBytes := mload(0x40)

                // The first word of the slice result is potentially a partial
                // word read from the original array. To read it, we calculate
                // the length of that partial word and start copying that many
                // bytes into the array. The first word we copy will start with
                // data we don't care about, but the last `lengthmod` bytes will
                // land at the beginning of the contents of the new array. When
                // we're done copying, we overwrite the full first word with
                // the actual length of the slice.
                let lengthmod := and(_length, 31)

                // The multiplication in the next line is necessary
                // because when slicing multiples of 32 bytes (lengthmod == 0)
                // the following copy loop was copying the origin's length
                // and then ending prematurely not copying everything it should.
                let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))
                let end := add(mc, _length)

                for {
                    // The multiplication in the next line has the same exact purpose
                    // as the one above.
                    let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)
                } lt(mc, end) {
                    mc := add(mc, 0x20)
                    cc := add(cc, 0x20)
                } {
                    mstore(mc, mload(cc))
                }

                mstore(tempBytes, _length)

                //update free-memory pointer
                //allocating the array padded to 32 bytes like the compiler does now
                mstore(0x40, and(add(mc, 31), not(31)))
            }
            //if we want a zero-length slice let's just return a zero-length array
            default {
                tempBytes := mload(0x40)
                //zero out the 32 bytes slice we are about to return
                //we need to do it because Solidity does not garbage collect
                mstore(tempBytes, 0)

                mstore(0x40, add(tempBytes, 0x20))
            }
        }

        return tempBytes;
    }

    function toAddress(bytes memory _bytes, uint _start) internal pure returns (address) {
        require(_bytes.length >= _start + 20, "toAddress_outOfBounds");
        address tempAddress;

        assembly {
            tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)
        }

        return tempAddress;
    }

    function toUint8(bytes memory _bytes, uint _start) internal pure returns (uint8) {
        require(_bytes.length >= _start + 1, "toUint8_outOfBounds");
        uint8 tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0x1), _start))
        }

        return tempUint;
    }

    function toUint16(bytes memory _bytes, uint _start) internal pure returns (uint16) {
        require(_bytes.length >= _start + 2, "toUint16_outOfBounds");
        uint16 tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0x2), _start))
        }

        return tempUint;
    }

    function toUint32(bytes memory _bytes, uint _start) internal pure returns (uint32) {
        require(_bytes.length >= _start + 4, "toUint32_outOfBounds");
        uint32 tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0x4), _start))
        }

        return tempUint;
    }

    function toUint64(bytes memory _bytes, uint _start) internal pure returns (uint64) {
        require(_bytes.length >= _start + 8, "toUint64_outOfBounds");
        uint64 tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0x8), _start))
        }

        return tempUint;
    }

    function toUint96(bytes memory _bytes, uint _start) internal pure returns (uint96) {
        require(_bytes.length >= _start + 12, "toUint96_outOfBounds");
        uint96 tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0xc), _start))
        }

        return tempUint;
    }

    function toUint128(bytes memory _bytes, uint _start) internal pure returns (uint128) {
        require(_bytes.length >= _start + 16, "toUint128_outOfBounds");
        uint128 tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0x10), _start))
        }

        return tempUint;
    }

    function toUint256(bytes memory _bytes, uint _start) internal pure returns (uint) {
        require(_bytes.length >= _start + 32, "toUint256_outOfBounds");
        uint tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0x20), _start))
        }

        return tempUint;
    }

    function toBytes32(bytes memory _bytes, uint _start) internal pure returns (bytes32) {
        require(_bytes.length >= _start + 32, "toBytes32_outOfBounds");
        bytes32 tempBytes32;

        assembly {
            tempBytes32 := mload(add(add(_bytes, 0x20), _start))
        }

        return tempBytes32;
    }

    function equal(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bool) {
        bool success = true;

        assembly {
            let length := mload(_preBytes)

            // if lengths don't match the arrays are not equal
            switch eq(length, mload(_postBytes))
            case 1 {
                // cb is a circuit breaker in the for loop since there's
                //  no said feature for inline assembly loops
                // cb = 1 - don't breaker
                // cb = 0 - break
                let cb := 1

                let mc := add(_preBytes, 0x20)
                let end := add(mc, length)

                for {
                    let cc := add(_postBytes, 0x20)
                    // the next line is the loop condition:
                    // while(uint256(mc < end) + cb == 2)
                } eq(add(lt(mc, end), cb), 2) {
                    mc := add(mc, 0x20)
                    cc := add(cc, 0x20)
                } {
                    // if any of these checks fails then arrays are not equal
                    if iszero(eq(mload(mc), mload(cc))) {
                        // unsuccess:
                        success := 0
                        cb := 0
                    }
                }
            }
            default {
                // unsuccess:
                success := 0
            }
        }

        return success;
    }

    function equalStorage(bytes storage _preBytes, bytes memory _postBytes) internal view returns (bool) {
        bool success = true;

        assembly {
            // we know _preBytes_offset is 0
            let fslot := sload(_preBytes.slot)
            // Decode the length of the stored array like in concatStorage().
            let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)
            let mlength := mload(_postBytes)

            // if lengths don't match the arrays are not equal
            switch eq(slength, mlength)
            case 1 {
                // slength can contain both the length and contents of the array
                // if length < 32 bytes so let's prepare for that
                // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage
                if iszero(iszero(slength)) {
                    switch lt(slength, 32)
                    case 1 {
                        // blank the last byte which is the length
                        fslot := mul(div(fslot, 0x100), 0x100)

                        if iszero(eq(fslot, mload(add(_postBytes, 0x20)))) {
                            // unsuccess:
                            success := 0
                        }
                    }
                    default {
                        // cb is a circuit breaker in the for loop since there's
                        //  no said feature for inline assembly loops
                        // cb = 1 - don't breaker
                        // cb = 0 - break
                        let cb := 1

                        // get the keccak hash to get the contents of the array
                        mstore(0x0, _preBytes.slot)
                        let sc := keccak256(0x0, 0x20)

                        let mc := add(_postBytes, 0x20)
                        let end := add(mc, mlength)

                        // the next line is the loop condition:
                        // while(uint256(mc < end) + cb == 2)
                        for {

                        } eq(add(lt(mc, end), cb), 2) {
                            sc := add(sc, 1)
                            mc := add(mc, 0x20)
                        } {
                            if iszero(eq(sload(sc), mload(mc))) {
                                // unsuccess:
                                success := 0
                                cb := 0
                            }
                        }
                    }
                }
            }
            default {
                // unsuccess:
                success := 0
            }
        }

        return success;
    }
}

// File: contracts/TensorAI/lzApp/interfaces/ITensorAIUserApplicationConfig.sol



pragma solidity >=0.5.0;

interface ITensorAIUserApplicationConfig {
    // @notice set the configuration of the TensorAI messaging library of the specified version
    // @param _version - messaging library version
    // @param _chainId - the chainId for the pending config change
    // @param _configType - type of configuration. every messaging library has its own convention.
    // @param _config - configuration in the bytes. can encode arbitrary content.
    function setConfig(
        uint16 _version,
        uint16 _chainId,
        uint _configType,
        bytes calldata _config
    ) external;

    // @notice set the send() TensorAI messaging library version to _version
    // @param _version - new messaging library version
    function setSendVersion(uint16 _version) external;

    // @notice set the lzReceive() TensorAI messaging library version to _version
    // @param _version - new messaging library version
    function setReceiveVersion(uint16 _version) external;

    // @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload
    // @param _srcChainId - the chainId of the source chain
    // @param _srcAddress - the contract address of the source contract at the source chain
    function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external;
}

// File: contracts/TensorAI/lzApp/interfaces/ITensorAIEndpoint.sol



pragma solidity >=0.5.0;


interface ITensorAIEndpoint is ITensorAIUserApplicationConfig {
    // @notice send a TensorAI message to the specified address at a TensorAI endpoint.
    // @param _dstChainId - the destination chain identifier
    // @param _destination - the address on destination chain (in bytes). address length/format may vary by chains
    // @param _payload - a custom bytes payload to send to the destination contract
    // @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address
    // @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction
    // @param _adapterParams - parameters for custom functionality. e.g. receive airdropped native gas from the relayer on destination
    function send(
        uint16 _dstChainId,
        bytes calldata _destination,
        bytes calldata _payload,
        address payable _refundAddress,
        address _zroPaymentAddress,
        bytes calldata _adapterParams
    ) external payable;

    // @notice used by the messaging library to publish verified payload
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source contract (as bytes) at the source chain
    // @param _dstAddress - the address on destination chain
    // @param _nonce - the unbound message ordering nonce
    // @param _gasLimit - the gas limit for external contract execution
    // @param _payload - verified payload to send to the destination contract
    function receivePayload(
        uint16 _srcChainId,
        bytes calldata _srcAddress,
        address _dstAddress,
        uint64 _nonce,
        uint _gasLimit,
        bytes calldata _payload
    ) external;

    // @notice get the inboundNonce of a lzApp from a source chain which could be EVM or non-EVM chain
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source chain contract address
    function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint64);

    // @notice get the outboundNonce from this source chain which, consequently, is always an EVM
    // @param _srcAddress - the source chain contract address
    function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view returns (uint64);

    // @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery
    // @param _dstChainId - the destination chain identifier
    // @param _userApplication - the user app address on this EVM chain
    // @param _payload - the custom message to send over TensorAI
    // @param _payInZRO - if false, user app pays the protocol fee in native token
    // @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain
    function estimateFees(
        uint16 _dstChainId,
        address _userApplication,
        bytes calldata _payload,
        bool _payInZRO,
        bytes calldata _adapterParam
    ) external view returns (uint nativeFee, uint zroFee);

    // @notice get this Endpoint's immutable source identifier
    function getChainId() external view returns (uint16);

    // @notice the interface to retry failed message on this Endpoint destination
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source chain contract address
    // @param _payload - the payload to be retried
    function retryPayload(
        uint16 _srcChainId,
        bytes calldata _srcAddress,
        bytes calldata _payload
    ) external;

    // @notice query if any STORED payload (message blocking) at the endpoint.
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source chain contract address
    function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool);

    // @notice query if the _libraryAddress is valid for sending msgs.
    // @param _userApplication - the user app address on this EVM chain
    function getSendLibraryAddress(address _userApplication) external view returns (address);

    // @notice query if the _libraryAddress is valid for receiving msgs.
    // @param _userApplication - the user app address on this EVM chain
    function getReceiveLibraryAddress(address _userApplication) external view returns (address);

    // @notice query if the non-reentrancy guard for send() is on
    // @return true if the guard is on. false otherwise
    function isSendingPayload() external view returns (bool);

    // @notice query if the non-reentrancy guard for receive() is on
    // @return true if the guard is on. false otherwise
    function isReceivingPayload() external view returns (bool);

    // @notice get the configuration of the TensorAI messaging library of the specified version
    // @param _version - messaging library version
    // @param _chainId - the chainId for the pending config change
    // @param _userApplication - the contract address of the user application
    // @param _configType - type of configuration. every messaging library has its own convention.
    function getConfig(
        uint16 _version,
        uint16 _chainId,
        address _userApplication,
        uint _configType
    ) external view returns (bytes memory);

    // @notice get the send() TensorAI messaging library version
    // @param _userApplication - the contract address of the user application
    function getSendVersion(address _userApplication) external view returns (uint16);

    // @notice get the lzReceive() TensorAI messaging library version
    // @param _userApplication - the contract address of the user application
    function getReceiveVersion(address _userApplication) external view returns (uint16);
}

// File: contracts/TensorAI/lzApp/interfaces/ITensorAIReceiver.sol



pragma solidity >=0.5.0;

interface ITensorAIReceiver {
    // @notice TensorAI endpoint will invoke this function to deliver the message on the destination
    // @param _srcChainId - the source endpoint identifier
    // @param _srcAddress - the source sending contract address from the source chain
    // @param _nonce - the ordered message nonce
    // @param _payload - the signed payload is the UA bytes has encoded to be sent
    function lzReceive(
        uint16 _srcChainId,
        bytes calldata _srcAddress,
        uint64 _nonce,
        bytes calldata _payload
    ) external;
}

// 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.9.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. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling 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: contracts/TensorAI/lzApp/LzApp.sol



pragma solidity ^0.8.0;






/*
 * a generic LzReceiver implementation
 */
abstract contract LzApp is Ownable, ITensorAIReceiver, ITensorAIUserApplicationConfig {
    using BytesLib for bytes;

    // ua can not send payload larger than this by default, but it can be changed by the ua owner
    uint public constant DEFAULT_PAYLOAD_SIZE_LIMIT = 10000;

    ITensorAIEndpoint public immutable lzEndpoint;
    mapping(uint16 => bytes) public trustedRemoteLookup;
    mapping(uint16 => mapping(uint16 => uint)) public minDstGasLookup;
    mapping(uint16 => uint) public payloadSizeLimitLookup;
    address public precrime;

    event SetPrecrime(address precrime);
    event SetTrustedRemote(uint16 _remoteChainId, bytes _path);
    event SetTrustedRemoteAddress(uint16 _remoteChainId, bytes _remoteAddress);
    event SetMinDstGas(uint16 _dstChainId, uint16 _type, uint _minDstGas);

    constructor(address _endpoint) {
        lzEndpoint = ITensorAIEndpoint(_endpoint);
    }

    function lzReceive(
        uint16 _srcChainId,
        bytes calldata _srcAddress,
        uint64 _nonce,
        bytes calldata _payload
    ) public virtual override {
        // lzReceive must be called by the endpoint for security
        require(_msgSender() == address(lzEndpoint), "LzApp: invalid endpoint caller");

        bytes memory trustedRemote = trustedRemoteLookup[_srcChainId];
        // if will still block the message pathway from (srcChainId, srcAddress). should not receive message from untrusted remote.
        require(
            _srcAddress.length == trustedRemote.length && trustedRemote.length > 0 && keccak256(_srcAddress) == keccak256(trustedRemote),
            "LzApp: invalid source sending contract"
        );

        _blockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload);
    }

    // abstract function - the default behaviour of TensorAI is blocking. See: NonblockingLzApp if you dont need to enforce ordered messaging
    function _blockingLzReceive(
        uint16 _srcChainId,
        bytes memory _srcAddress,
        uint64 _nonce,
        bytes memory _payload
    ) internal virtual;

    function _lzSend(
        uint16 _dstChainId,
        bytes memory _payload,
        address payable _refundAddress,
        address _zroPaymentAddress,
        bytes memory _adapterParams,
        uint _nativeFee
    ) internal virtual {
        bytes memory trustedRemote = trustedRemoteLookup[_dstChainId];
        require(trustedRemote.length != 0, "LzApp: destination chain is not a trusted source");
        _checkPayloadSize(_dstChainId, _payload.length);
        lzEndpoint.send{value: _nativeFee}(_dstChainId, trustedRemote, _payload, _refundAddress, _zroPaymentAddress, _adapterParams);
    }

    function _checkGasLimit(
        uint16 _dstChainId,
        uint16 _type,
        bytes memory _adapterParams,
        uint _extraGas
    ) internal view virtual {
        uint providedGasLimit = _getGasLimit(_adapterParams);
        uint minGasLimit = minDstGasLookup[_dstChainId][_type];
        require(minGasLimit > 0, "LzApp: minGasLimit not set");
        require(providedGasLimit >= minGasLimit + _extraGas, "LzApp: gas limit is too low");
    }

    function _getGasLimit(bytes memory _adapterParams) internal pure virtual returns (uint gasLimit) {
        require(_adapterParams.length >= 34, "LzApp: invalid adapterParams");
        assembly {
            gasLimit := mload(add(_adapterParams, 34))
        }
    }

    function _checkPayloadSize(uint16 _dstChainId, uint _payloadSize) internal view virtual {
        uint payloadSizeLimit = payloadSizeLimitLookup[_dstChainId];
        if (payloadSizeLimit == 0) {
            // use default if not set
            payloadSizeLimit = DEFAULT_PAYLOAD_SIZE_LIMIT;
        }
        require(_payloadSize <= payloadSizeLimit, "LzApp: payload size is too large");
    }

    //---------------------------UserApplication config----------------------------------------
    function getConfig(
        uint16 _version,
        uint16 _chainId,
        address,
        uint _configType
    ) external view returns (bytes memory) {
        return lzEndpoint.getConfig(_version, _chainId, address(this), _configType);
    }

    // generic config for TensorAI user Application
    function setConfig(
        uint16 _version,
        uint16 _chainId,
        uint _configType,
        bytes calldata _config
    ) external override onlyOwner {
        lzEndpoint.setConfig(_version, _chainId, _configType, _config);
    }

    function setSendVersion(uint16 _version) external override onlyOwner {
        lzEndpoint.setSendVersion(_version);
    }

    function setReceiveVersion(uint16 _version) external override onlyOwner {
        lzEndpoint.setReceiveVersion(_version);
    }

    function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external override onlyOwner {
        lzEndpoint.forceResumeReceive(_srcChainId, _srcAddress);
    }

    // _path = abi.encodePacked(remoteAddress, localAddress)
    // this function set the trusted path for the cross-chain communication
    function setTrustedRemote(uint16 _remoteChainId, bytes calldata _path) external onlyOwner {
        trustedRemoteLookup[_remoteChainId] = _path;
        emit SetTrustedRemote(_remoteChainId, _path);
    }

    function setTrustedRemoteAddress(uint16 _remoteChainId, bytes calldata _remoteAddress) external onlyOwner {
        trustedRemoteLookup[_remoteChainId] = abi.encodePacked(_remoteAddress, address(this));
        emit SetTrustedRemoteAddress(_remoteChainId, _remoteAddress);
    }

    function getTrustedRemoteAddress(uint16 _remoteChainId) external view returns (bytes memory) {
        bytes memory path = trustedRemoteLookup[_remoteChainId];
        require(path.length != 0, "LzApp: no trusted path record");
        return path.slice(0, path.length - 20); // the last 20 bytes should be address(this)
    }

    function setPrecrime(address _precrime) external onlyOwner {
        precrime = _precrime;
        emit SetPrecrime(_precrime);
    }

    function setMinDstGas(
        uint16 _dstChainId,
        uint16 _packetType,
        uint _minGas
    ) external onlyOwner {
        minDstGasLookup[_dstChainId][_packetType] = _minGas;
        emit SetMinDstGas(_dstChainId, _packetType, _minGas);
    }

    // if the size is 0, it means default size limit
    function setPayloadSizeLimit(uint16 _dstChainId, uint _size) external onlyOwner {
        payloadSizeLimitLookup[_dstChainId] = _size;
    }

    //--------------------------- VIEW FUNCTION ----------------------------------------
    function isTrustedRemote(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool) {
        bytes memory trustedSource = trustedRemoteLookup[_srcChainId];
        return keccak256(trustedSource) == keccak256(_srcAddress);
    }
}

// File: contracts/TensorAI/lzApp/NonblockingLzApp.sol



pragma solidity ^0.8.0;



/*
 * the default TensorAI messaging behaviour is blocking, i.e. any failed message will block the channel
 * this abstract class try-catch all fail messages and store locally for future retry. hence, non-blocking
 * NOTE: if the srcAddress is not configured properly, it will still block the message pathway from (srcChainId, srcAddress)
 */
abstract contract NonblockingLzApp is LzApp {
    using ExcessivelySafeCall for address;

    constructor(address _endpoint) LzApp(_endpoint) {}

    mapping(uint16 => mapping(bytes => mapping(uint64 => bytes32))) public failedMessages;

    event MessageFailed(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes _payload, bytes _reason);
    event RetryMessageSuccess(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes32 _payloadHash);

    // overriding the virtual function in LzReceiver
    function _blockingLzReceive(
        uint16 _srcChainId,
        bytes memory _srcAddress,
        uint64 _nonce,
        bytes memory _payload
    ) internal virtual override {
        (bool success, bytes memory reason) = address(this).excessivelySafeCall(
            gasleft(),
            150,
            abi.encodeWithSelector(this.nonblockingLzReceive.selector, _srcChainId, _srcAddress, _nonce, _payload)
        );
        if (!success) {
            _storeFailedMessage(_srcChainId, _srcAddress, _nonce, _payload, reason);
        }
    }

    function _storeFailedMessage(
        uint16 _srcChainId,
        bytes memory _srcAddress,
        uint64 _nonce,
        bytes memory _payload,
        bytes memory _reason
    ) internal virtual {
        failedMessages[_srcChainId][_srcAddress][_nonce] = keccak256(_payload);
        emit MessageFailed(_srcChainId, _srcAddress, _nonce, _payload, _reason);
    }

    function nonblockingLzReceive(
        uint16 _srcChainId,
        bytes calldata _srcAddress,
        uint64 _nonce,
        bytes calldata _payload
    ) public virtual {
        // only internal transaction
        require(_msgSender() == address(this), "NonblockingLzApp: caller must be LzApp");
        _nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload);
    }

    //@notice override this function
    function _nonblockingLzReceive(
        uint16 _srcChainId,
        bytes memory _srcAddress,
        uint64 _nonce,
        bytes memory _payload
    ) internal virtual;

    function retryMessage(
        uint16 _srcChainId,
        bytes calldata _srcAddress,
        uint64 _nonce,
        bytes calldata _payload
    ) public payable virtual {
        // assert there is message to retry
        bytes32 payloadHash = failedMessages[_srcChainId][_srcAddress][_nonce];
        require(payloadHash != bytes32(0), "NonblockingLzApp: no stored message");
        require(keccak256(_payload) == payloadHash, "NonblockingLzApp: invalid payload");
        // clear the stored message
        failedMessages[_srcChainId][_srcAddress][_nonce] = bytes32(0);
        // execute the message. revert if it fails again
        _nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload);
        emit RetryMessageSuccess(_srcChainId, _srcAddress, _nonce, payloadHash);
    }
}

// File: contracts/TensorAI/token/oft/v2/OFTCoreV2.sol



pragma solidity ^0.8.0;





abstract contract OFTCoreV2 is NonblockingLzApp {
    using BytesLib for bytes;
    using ExcessivelySafeCall for address;

    uint public constant NO_EXTRA_GAS = 0;

    // packet type
    uint8 public constant PT_SEND = 0;
    uint8 public constant PT_SEND_AND_CALL = 1;

    uint8 public immutable sharedDecimals;

    mapping(uint16 => mapping(bytes => mapping(uint64 => bool))) public creditedPackets;

    /**
     * @dev Emitted when `_amount` tokens are moved from the `_sender` to (`_dstChainId`, `_toAddress`)
     * `_nonce` is the outbound nonce
     */
    event SendToChain(uint16 indexed _dstChainId, address indexed _from, bytes32 indexed _toAddress, uint _amount);

    /**
     * @dev Emitted when `_amount` tokens are received from `_srcChainId` into the `_toAddress` on the local chain.
     * `_nonce` is the inbound nonce.
     */
    event ReceiveFromChain(uint16 indexed _srcChainId, address indexed _to, uint _amount);

    event CallOFTReceivedSuccess(uint16 indexed _srcChainId, bytes _srcAddress, uint64 _nonce, bytes32 _hash);

    event NonContractAddress(address _address);

    // _sharedDecimals should be the minimum decimals on all chains
    constructor(uint8 _sharedDecimals, address _lzEndpoint) NonblockingLzApp(_lzEndpoint) {
        sharedDecimals = _sharedDecimals;
    }

    /************************************************************************
     * public functions
     ************************************************************************/
    function callOnOFTReceived(
        uint16 _srcChainId,
        bytes calldata _srcAddress,
        uint64 _nonce,
        bytes32 _from,
        address _to,
        uint _amount,
        bytes calldata _payload,
        uint _gasForCall
    ) public virtual {
        require(_msgSender() == address(this), "OFTCore: caller must be OFTCore");

        // send
        _amount = _transferFrom(address(this), _to, _amount);
        emit ReceiveFromChain(_srcChainId, _to, _amount);

        // call
        IOFTReceiverV2(_to).onOFTReceived{gas: _gasForCall}(_srcChainId, _srcAddress, _nonce, _from, _amount, _payload);
    }

    /************************************************************************
     * internal functions
     ************************************************************************/
    function _estimateSendFee(
        uint16 _dstChainId,
        bytes32 _toAddress,
        uint _amount,
        bool _useZro,
        bytes memory _adapterParams
    ) internal view virtual returns (uint nativeFee, uint zroFee) {
        // mock the payload for sendFrom()
        bytes memory payload = _encodeSendPayload(_toAddress, _ld2sd(_amount));
        return lzEndpoint.estimateFees(_dstChainId, address(this), payload, _useZro, _adapterParams);
    }

    function _estimateSendAndCallFee(
        uint16 _dstChainId,
        bytes32 _toAddress,
        uint _amount,
        bytes memory _payload,
        uint64 _dstGasForCall,
        bool _useZro,
        bytes memory _adapterParams
    ) internal view virtual returns (uint nativeFee, uint zroFee) {
        // mock the payload for sendAndCall()
        bytes memory payload = _encodeSendAndCallPayload(msg.sender, _toAddress, _ld2sd(_amount), _payload, _dstGasForCall);
        return lzEndpoint.estimateFees(_dstChainId, address(this), payload, _useZro, _adapterParams);
    }

    function _nonblockingLzReceive(
        uint16 _srcChainId,
        bytes memory _srcAddress,
        uint64 _nonce,
        bytes memory _payload
    ) internal virtual override {
        uint8 packetType = _payload.toUint8(0);

        if (packetType == PT_SEND) {
            _sendAck(_srcChainId, _srcAddress, _nonce, _payload);
        } else if (packetType == PT_SEND_AND_CALL) {
            _sendAndCallAck(_srcChainId, _srcAddress, _nonce, _payload);
        } else {
            revert("OFTCore: unknown packet type");
        }
    }

    function _send(
        address _from,
        uint16 _dstChainId,
        bytes32 _toAddress,
        uint _amount,
        address payable _refundAddress,
        address _zroPaymentAddress,
        bytes memory _adapterParams
    ) internal virtual returns (uint amount) {
        _checkGasLimit(_dstChainId, PT_SEND, _adapterParams, NO_EXTRA_GAS);

        (amount, ) = _removeDust(_amount);
        amount = _debitFrom(_from, _dstChainId, _toAddress, amount); // amount returned should not have dust
        require(amount > 0, "OFTCore: amount too small");

        bytes memory lzPayload = _encodeSendPayload(_toAddress, _ld2sd(amount));
        _lzSend(_dstChainId, lzPayload, _refundAddress, _zroPaymentAddress, _adapterParams, msg.value);

        emit SendToChain(_dstChainId, _from, _toAddress, amount);
    }

    function _sendAck(
        uint16 _srcChainId,
        bytes memory,
        uint64,
        bytes memory _payload
    ) internal virtual {
        (address to, uint64 amountSD) = _decodeSendPayload(_payload);
        if (to == address(0)) {
            to = address(0xdead);
        }

        uint amount = _sd2ld(amountSD);
        amount = _creditTo(_srcChainId, to, amount);

        emit ReceiveFromChain(_srcChainId, to, amount);
    }

    function _sendAndCall(
        address _from,
        uint16 _dstChainId,
        bytes32 _toAddress,
        uint _amount,
        bytes memory _payload,
        uint64 _dstGasForCall,
        address payable _refundAddress,
        address _zroPaymentAddress,
        bytes memory _adapterParams
    ) internal virtual returns (uint amount) {
        _checkGasLimit(_dstChainId, PT_SEND_AND_CALL, _adapterParams, _dstGasForCall);

        (amount, ) = _removeDust(_amount);
        amount = _debitFrom(_from, _dstChainId, _toAddress, amount);
        require(amount > 0, "OFTCore: amount too small");

        // encode the msg.sender into the payload instead of _from
        bytes memory lzPayload = _encodeSendAndCallPayload(msg.sender, _toAddress, _ld2sd(amount), _payload, _dstGasForCall);
        _lzSend(_dstChainId, lzPayload, _refundAddress, _zroPaymentAddress, _adapterParams, msg.value);

        emit SendToChain(_dstChainId, _from, _toAddress, amount);
    }

    function _sendAndCallAck(
        uint16 _srcChainId,
        bytes memory _srcAddress,
        uint64 _nonce,
        bytes memory _payload
    ) internal virtual {
        (bytes32 from, address to, uint64 amountSD, bytes memory payloadForCall, uint64 gasForCall) = _decodeSendAndCallPayload(_payload);

        bool credited = creditedPackets[_srcChainId][_srcAddress][_nonce];
        uint amount = _sd2ld(amountSD);

        // credit to this contract first, and then transfer to receiver only if callOnOFTReceived() succeeds
        if (!credited) {
            amount = _creditTo(_srcChainId, address(this), amount);
            creditedPackets[_srcChainId][_srcAddress][_nonce] = true;
        }

        if (!_isContract(to)) {
            emit NonContractAddress(to);
            return;
        }

        // workaround for stack too deep
        uint16 srcChainId = _srcChainId;
        bytes memory srcAddress = _srcAddress;
        uint64 nonce = _nonce;
        bytes memory payload = _payload;
        bytes32 from_ = from;
        address to_ = to;
        uint amount_ = amount;
        bytes memory payloadForCall_ = payloadForCall;

        // no gas limit for the call if retry
        uint gas = credited ? gasleft() : gasForCall;
        (bool success, bytes memory reason) = address(this).excessivelySafeCall(
            gasleft(),
            150,
            abi.encodeWithSelector(this.callOnOFTReceived.selector, srcChainId, srcAddress, nonce, from_, to_, amount_, payloadForCall_, gas)
        );

        if (success) {
            bytes32 hash = keccak256(payload);
            emit CallOFTReceivedSuccess(srcChainId, srcAddress, nonce, hash);
        } else {
            // store the failed message into the nonblockingLzApp
            _storeFailedMessage(srcChainId, srcAddress, nonce, payload, reason);
        }
    }

    function _isContract(address _account) internal view returns (bool) {
        return _account.code.length > 0;
    }

    function _ld2sd(uint _amount) internal view virtual returns (uint64) {
        uint amountSD = _amount / _ld2sdRate();
        require(amountSD <= type(uint64).max, "OFTCore: amountSD overflow");
        return uint64(amountSD);
    }

    function _sd2ld(uint64 _amountSD) internal view virtual returns (uint) {
        return _amountSD * _ld2sdRate();
    }

    function _removeDust(uint _amount) internal view virtual returns (uint amountAfter, uint dust) {
        dust = _amount % _ld2sdRate();
        amountAfter = _amount - dust;
    }

    function _encodeSendPayload(bytes32 _toAddress, uint64 _amountSD) internal view virtual returns (bytes memory) {
        return abi.encodePacked(PT_SEND, _toAddress, _amountSD);
    }

    function _decodeSendPayload(bytes memory _payload) internal view virtual returns (address to, uint64 amountSD) {
        require(_payload.toUint8(0) == PT_SEND && _payload.length == 41, "OFTCore: invalid payload");

        to = _payload.toAddress(13); // drop the first 12 bytes of bytes32
        amountSD = _payload.toUint64(33);
    }

    function _encodeSendAndCallPayload(
        address _from,
        bytes32 _toAddress,
        uint64 _amountSD,
        bytes memory _payload,
        uint64 _dstGasForCall
    ) internal view virtual returns (bytes memory) {
        return abi.encodePacked(PT_SEND_AND_CALL, _toAddress, _amountSD, _addressToBytes32(_from), _dstGasForCall, _payload);
    }

    function _decodeSendAndCallPayload(bytes memory _payload)
        internal
        view
        virtual
        returns (
            bytes32 from,
            address to,
            uint64 amountSD,
            bytes memory payload,
            uint64 dstGasForCall
        )
    {
        require(_payload.toUint8(0) == PT_SEND_AND_CALL, "OFTCore: invalid payload");

        to = _payload.toAddress(13); // drop the first 12 bytes of bytes32
        amountSD = _payload.toUint64(33);
        from = _payload.toBytes32(41);
        dstGasForCall = _payload.toUint64(73);
        payload = _payload.slice(81, _payload.length - 81);
    }

    function _addressToBytes32(address _address) internal pure virtual returns (bytes32) {
        return bytes32(uint(uint160(_address)));
    }

    function _debitFrom(
        address _from,
        uint16 _dstChainId,
        bytes32 _toAddress,
        uint _amount
    ) internal virtual returns (uint);

    function _creditTo(
        uint16 _srcChainId,
        address _toAddress,
        uint _amount
    ) internal virtual returns (uint);

    function _transferFrom(
        address _from,
        address _to,
        uint _amount
    ) internal virtual returns (uint);

    function _ld2sdRate() internal view virtual returns (uint);
}

// File: contracts/TensorAI/token/oft/v2/BaseOFTV2.sol



pragma solidity ^0.8.0;




abstract contract BaseOFTV2 is OFTCoreV2, ERC165, IOFTV2 {
    constructor(uint8 _sharedDecimals, address _lzEndpoint) OFTCoreV2(_sharedDecimals, _lzEndpoint) {}

    /************************************************************************
     * public functions
     ************************************************************************/
    function sendFrom(
        address _from,
        uint16 _dstChainId,
        bytes32 _toAddress,
        uint _amount,
        LzCallParams calldata _callParams
    ) public payable virtual override {
        _send(_from, _dstChainId, _toAddress, _amount, _callParams.refundAddress, _callParams.zroPaymentAddress, _callParams.adapterParams);
    }

    function sendAndCall(
        address _from,
        uint16 _dstChainId,
        bytes32 _toAddress,
        uint _amount,
        bytes calldata _payload,
        uint64 _dstGasForCall,
        LzCallParams calldata _callParams
    ) public payable virtual override {
        _sendAndCall(
            _from,
            _dstChainId,
            _toAddress,
            _amount,
            _payload,
            _dstGasForCall,
            _callParams.refundAddress,
            _callParams.zroPaymentAddress,
            _callParams.adapterParams
        );
    }

    /************************************************************************
     * public view functions
     ************************************************************************/
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return interfaceId == type(IOFTV2).interfaceId || super.supportsInterface(interfaceId);
    }

    function estimateSendFee(
        uint16 _dstChainId,
        bytes32 _toAddress,
        uint _amount,
        bool _useZro,
        bytes calldata _adapterParams
    ) public view virtual override returns (uint nativeFee, uint zroFee) {
        return _estimateSendFee(_dstChainId, _toAddress, _amount, _useZro, _adapterParams);
    }

    function estimateSendAndCallFee(
        uint16 _dstChainId,
        bytes32 _toAddress,
        uint _amount,
        bytes calldata _payload,
        uint64 _dstGasForCall,
        bool _useZro,
        bytes calldata _adapterParams
    ) public view virtual override returns (uint nativeFee, uint zroFee) {
        return _estimateSendAndCallFee(_dstChainId, _toAddress, _amount, _payload, _dstGasForCall, _useZro, _adapterParams);
    }

    function circulatingSupply() public view virtual override returns (uint);

    function token() public view virtual override returns (address);
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 amount) external returns (bool);
}

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol


// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the default value returned by this function, unless
     * it's overridden.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(address from, address to, uint256 amount) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}
}

// File: contracts/TensorAI/token/oft/v2/OFTV2.sol



pragma solidity ^0.8.0;



contract OFTV2 is BaseOFTV2, ERC20 {
    uint internal immutable ld2sdRate;

    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _sharedDecimals,
        address _lzEndpoint
    ) ERC20(_name, _symbol) BaseOFTV2(_sharedDecimals, _lzEndpoint) {
        uint8 decimals = decimals();
        require(_sharedDecimals <= decimals, "OFT: sharedDecimals must be <= decimals");
        ld2sdRate = 10**(decimals - _sharedDecimals);
    }

    /************************************************************************
     * public functions
     ************************************************************************/
    function circulatingSupply() public view virtual override returns (uint) {
        return totalSupply();
    }

    function token() public view virtual override returns (address) {
        return address(this);
    }

    /************************************************************************
     * internal functions
     ************************************************************************/
    function _debitFrom(
        address _from,
        uint16,
        bytes32,
        uint _amount
    ) internal virtual override returns (uint) {
        address spender = _msgSender();
        if (_from != spender) _spendAllowance(_from, spender, _amount);
        _burn(_from, _amount);
        return _amount;
    }

    function _creditTo(
        uint16,
        address _toAddress,
        uint _amount
    ) internal virtual override returns (uint) {
        _mint(_toAddress, _amount);
        return _amount;
    }

    function _transferFrom(
        address _from,
        address _to,
        uint _amount
    ) internal virtual override returns (uint) {
        address spender = _msgSender();
        // if transfer from this contract, no need to check allowance
        if (_from != address(this) && _from != spender) _spendAllowance(_from, spender, _amount);
        _transfer(_from, _to, _amount);
        return _amount;
    }

    function _ld2sdRate() internal view virtual override returns (uint) {
        return ld2sdRate;
    }
}




pragma solidity ^0.8.19;

contract TAI is OFTV2 {
    IUniswapV2Router02 immutable uniswapV2Router;
    uint256 maxTxAmount;
    uint256 public buyTax = 20;
    uint256 public sellTax = 20;
    uint256 minAmountToSwapTaxes;
    uint256 maxWalletAmount;
    uint256 launchedAt;
    uint256 public buys;
    uint256 buysBeforeSells = 25;

    bool launchTax;
    bool taxesEnabled = true;
    bool limitsEnabled = true;
    bool inSwapAndLiq;
    bool public tradingAllowed;

    address public taxWallet;
    address public immutable uniswapV2Pair;

    mapping(address => bool) public _isExcludedFromFees;

    modifier lockTheSwap() {
        inSwapAndLiq = true;
        _;
        inSwapAndLiq = false;
    }

    constructor()
        OFTV2(
            "Tensor AI",
            "TAI",
            8,
            0x66A71Dcef29A0fFBDBE3c6a460a3B5BC225Cd675
        )
    {
        _mint(owner(), 100_000_000 * 10 ** 18);
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );
        address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;

        minAmountToSwapTaxes = (totalSupply() * 3) / 1000;
        maxWalletAmount = (totalSupply() * 2) / 100;
        maxTxAmount = totalSupply() / 100;

        _isExcludedFromFees[owner()] = true;
        _isExcludedFromFees[msg.sender] = true;
        _isExcludedFromFees[taxWallet] = true;
        _isExcludedFromFees[address(this)] = true;
        _isExcludedFromFees[address(_uniswapV2Pair)] = true;

        taxWallet = 0xf21a25C43B6404707a62dDFb0C64a80923396BF3;
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(amount > 0, "ERC20: transfer must be greater than 0");

        if (!tradingAllowed) {
            require(from == owner() || to == owner(), "Trading not active yet");
        }

        uint256 taxAmount;

        if (launchTax) {
            setTax(block.number);
        }

        if (from == uniswapV2Pair && !_isExcludedFromFees[to]) {
            require(
                balanceOf(to) + amount <= maxWalletAmount,
                "Max Wallet In Effect"
            );
            require(amount <= maxTxAmount, "Max Tx in effect");
            if (taxesEnabled) {
                taxAmount = (amount * buyTax) / 100;
            }

            buys++;
        }

        if (to == uniswapV2Pair && !_isExcludedFromFees[from]) {
            require(amount <= maxTxAmount, "Max Tx in effect");
            if (taxesEnabled) {
                taxAmount = (amount * sellTax) / 100;
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));

        bool overMinTokenBalance = contractTokenBalance >= minAmountToSwapTaxes;

        if (
            overMinTokenBalance &&
            !inSwapAndLiq &&
            from != uniswapV2Pair &&
            !_isExcludedFromFees[from] &&
            buys > buysBeforeSells
        ) {
            swapAndSend(minAmountToSwapTaxes);
        }

        if (taxAmount > 0) {
            uint256 userAmount = amount - taxAmount;
            super._transfer(from, address(this), taxAmount);
            super._transfer(from, to, userAmount);
        } else {
            super._transfer(from, to, amount);
        }
    }

    function swapAndSend(uint256 _contractTokenBalance) internal lockTheSwap {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        _approve(
            address(this),
            address(uniswapV2Router),
            _contractTokenBalance
        );

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            _contractTokenBalance,
            0, // accept any amount of ETH
            path,
            taxWallet,
            block.timestamp
        );
    }

    function setTax(uint256 _block) public {
        if (launchedAt == _block) {
            buyTax = 50;
            sellTax = 50;
        } else if (launchedAt + 1 >= _block) {
            buyTax = 35;
            sellTax = 35;
        } else if (launchedAt + 5 >= _block) {
            buyTax = 30;
            sellTax = 30;
        } else if (launchedAt + 11 >= _block) {
            buyTax = 25;
            sellTax = 25;
        } else if (launchedAt + 24 >= _block) {
            buyTax = 20;
            sellTax = 20;
        }
    }

    function changetaxWallet(address _newtaxWallet) external onlyOwner {
        taxWallet = _newtaxWallet;
    }

    function removeLaunchTax(
        uint256 _newBuyTaxPercent,
        uint256 _newSellTaxPercent
    ) external onlyOwner {
        require(
            _newBuyTaxPercent <= 10 && _newSellTaxPercent <= 10,
            "Cannot set taxes above 10"
        );
        buyTax = _newBuyTaxPercent;
        sellTax = _newSellTaxPercent;
        launchTax = false;
    }

    function excludeFromFees(
        address _address,
        bool _isExcluded
    ) external onlyOwner {
        _isExcludedFromFees[_address] = _isExcluded;
    }

    function updateMaxWalletAmount(
        uint256 newMaxWalletAmount
    ) external onlyOwner {
        maxWalletAmount = newMaxWalletAmount;
    }

    function updateMaxTxAmount(uint256 _newAmount) external onlyOwner {
        maxTxAmount = _newAmount;
    }

    function changeMinAmountToSwapTaxes(
        uint256 newMinAmount
    ) external onlyOwner {
        require(newMinAmount > 0, "Cannot set to zero");
        minAmountToSwapTaxes = newMinAmount;
    }

    function enableTaxes(bool _enable) external onlyOwner {
        taxesEnabled = _enable;
    }

    function activateTensor() external onlyOwner {
        require(!tradingAllowed, "Trading not paused");
        tradingAllowed = true;
        launchedAt = block.number;
        launchTax = true;
    }

    function toggleLimits(bool _limitsEnabed) external onlyOwner {
        limitsEnabled = _limitsEnabed;
    }

    function manualSwap(uint256 _amount) external onlyOwner {
        swapAndSend(_amount);
    }
}

interface IUniswapV2Factory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint
    );

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    function getPair(
        address tokenA,
        address tokenB
    ) external view returns (address pair);

    function allPairs(uint) external view returns (address pair);

    function allPairsLength() external view returns (uint);

    function createPair(
        address tokenA,
        address tokenB
    ) external returns (address pair);

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint);

    function balanceOf(address owner) external view returns (uint);

    function allowance(
        address owner,
        address spender
    ) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);

    function transfer(address to, uint value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint value
    ) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint);

    function permit(
        address owner,
        address spender,
        uint value,
        uint deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(
        address indexed sender,
        uint amount0,
        uint amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);

    function price0CumulativeLast() external view returns (uint);

    function price1CumulativeLast() external view returns (uint);

    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);

    function burn(address to) external returns (uint amount0, uint amount1);

    function swap(
        uint amount0Out,
        uint amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

interface IUniswapV2Router01 {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);

    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    )
        external
        payable
        returns (uint amountToken, uint amountETH, uint liquidity);

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);

    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint amountA, uint amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint amountToken, uint amountETH);

    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapExactETHForTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable returns (uint[] memory amounts);

    function swapTokensForExactETH(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapExactTokensForETH(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapETHForExactTokens(
        uint amountOut,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable returns (uint[] memory amounts);

    function quote(
        uint amountA,
        uint reserveA,
        uint reserveB
    ) external pure returns (uint amountB);

    function getAmountOut(
        uint amountIn,
        uint reserveIn,
        uint reserveOut
    ) external pure returns (uint amountOut);

    function getAmountIn(
        uint amountOut,
        uint reserveIn,
        uint reserveOut
    ) external pure returns (uint amountIn);

    function getAmountsOut(
        uint amountIn,
        address[] calldata path
    ) external view returns (uint[] memory amounts);

    function getAmountsIn(
        uint amountOut,
        address[] calldata path
    ) external view returns (uint[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes32","name":"_hash","type":"bytes32"}],"name":"CallOFTReceivedSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"_payload","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"_reason","type":"bytes"}],"name":"MessageFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"}],"name":"NonContractAddress","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":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"ReceiveFromChain","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes32","name":"_payloadHash","type":"bytes32"}],"name":"RetryMessageSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"bytes32","name":"_toAddress","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"SendToChain","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"_type","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"_minDstGas","type":"uint256"}],"name":"SetMinDstGas","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"precrime","type":"address"}],"name":"SetPrecrime","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_path","type":"bytes"}],"name":"SetTrustedRemote","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_remoteAddress","type":"bytes"}],"name":"SetTrustedRemoteAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_PAYLOAD_SIZE_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NO_EXTRA_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PT_SEND","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PT_SEND_AND_CALL","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activateTensor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buys","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes32","name":"_from","type":"bytes32"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_payload","type":"bytes"},{"internalType":"uint256","name":"_gasForCall","type":"uint256"}],"name":"callOnOFTReceived","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMinAmount","type":"uint256"}],"name":"changeMinAmountToSwapTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newtaxWallet","type":"address"}],"name":"changetaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"circulatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"creditedPackets","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enable","type":"bool"}],"name":"enableTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes32","name":"_toAddress","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_payload","type":"bytes"},{"internalType":"uint64","name":"_dstGasForCall","type":"uint64"},{"internalType":"bool","name":"_useZro","type":"bool"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"estimateSendAndCallFee","outputs":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"zroFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes32","name":"_toAddress","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_useZro","type":"bool"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"estimateSendFee","outputs":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"zroFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_isExcluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"failedMessages","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"forceResumeReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"_configType","type":"uint256"}],"name":"getConfig","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_remoteChainId","type":"uint16"}],"name":"getTrustedRemoteAddress","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"isTrustedRemote","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lzEndpoint","outputs":[{"internalType":"contract ITensorAIEndpoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"manualSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"}],"name":"minDstGasLookup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"nonblockingLzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"payloadSizeLimitLookup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"precrime","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newBuyTaxPercent","type":"uint256"},{"internalType":"uint256","name":"_newSellTaxPercent","type":"uint256"}],"name":"removeLaunchTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"retryMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes32","name":"_toAddress","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_payload","type":"bytes"},{"internalType":"uint64","name":"_dstGasForCall","type":"uint64"},{"components":[{"internalType":"address payable","name":"refundAddress","type":"address"},{"internalType":"address","name":"zroPaymentAddress","type":"address"},{"internalType":"bytes","name":"adapterParams","type":"bytes"}],"internalType":"struct ICommonOFT.LzCallParams","name":"_callParams","type":"tuple"}],"name":"sendAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes32","name":"_toAddress","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"components":[{"internalType":"address payable","name":"refundAddress","type":"address"},{"internalType":"address","name":"zroPaymentAddress","type":"address"},{"internalType":"bytes","name":"adapterParams","type":"bytes"}],"internalType":"struct ICommonOFT.LzCallParams","name":"_callParams","type":"tuple"}],"name":"sendFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"_configType","type":"uint256"},{"internalType":"bytes","name":"_config","type":"bytes"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint16","name":"_packetType","type":"uint16"},{"internalType":"uint256","name":"_minGas","type":"uint256"}],"name":"setMinDstGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint256","name":"_size","type":"uint256"}],"name":"setPayloadSizeLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_precrime","type":"address"}],"name":"setPrecrime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setReceiveVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setSendVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_block","type":"uint256"}],"name":"setTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"internalType":"bytes","name":"_path","type":"bytes"}],"name":"setTrustedRemote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"internalType":"bytes","name":"_remoteAddress","type":"bytes"}],"name":"setTrustedRemoteAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sharedDecimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_limitsEnabed","type":"bool"}],"name":"toggleLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"trustedRemoteLookup","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newAmount","type":"uint256"}],"name":"updateMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxWalletAmount","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101206040526014600d819055600e8190556019601355805462ffff0019166201010017905534801562000031575f80fd5b506040518060400160405280600981526020016854656e736f7220414960b81b8152506040518060400160405280600381526020016254414960e81b81525060087366a71dcef29a0ffbdbe3c6a460a3b5bc225cd6758383838381818080620000a9620000a36200044e60201b60201c565b62000452565b6001600160a01b0316608052505060ff1660a05250600a9050620000ce838262000619565b50600b620000dd828262000619565b5050505f620000f1620004a160201b60201c565b90508060ff168360ff1611156200015f5760405162461bcd60e51b815260206004820152602760248201527f4f46543a20736861726564446563696d616c73206d757374206265203c3d20646044820152666563696d616c7360c81b60648201526084015b60405180910390fd5b6200016b8382620006f9565b6200017890600a62000814565b60c05250620001a3935062000191925050620004a69050565b6a52b7d2dcc80cd2e4000000620004b4565b5f737a250d5630b4cf539739df2c5dacb4c659f2488d90505f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001f9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200021f91906200082b565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200026b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200029191906200082b565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af1158015620002dc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200030291906200082b565b6001600160a01b0380841660e05281166101005290506103e86200032560095490565b6200033290600362000853565b6200033e91906200086d565b600f5560646200034d60095490565b6200035a90600262000853565b6200036691906200086d565b60105560646200037560095490565b6200038191906200086d565b600c55600160155f6200039b5f546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182015f908120805495151560ff19968716179055338152601590935281832080548516600190811790915560148054650100000000009004831685528385208054871683179055308552838520805487168317905595909116835291208054909216179055805478f21a25c43b6404707a62ddfb0c64a80923396bf30000000000600160281b600160c81b031990911617905550620008a3565b3390565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b601290565b5f546001600160a01b031690565b6001600160a01b0382166200050c5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000156565b8060095f8282546200051f91906200088d565b90915550506001600160a01b0382165f818152600760209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c90821680620005a557607f821691505b602082108103620005c457634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200057757805f5260205f20601f840160051c81016020851015620005f15750805b601f840160051c820191505b8181101562000612575f8155600101620005fd565b5050505050565b81516001600160401b038111156200063557620006356200057c565b6200064d8162000646845462000590565b84620005ca565b602080601f83116001811462000683575f84156200066b5750858301515b5f19600386901b1c1916600185901b178555620006dd565b5f85815260208120601f198616915b82811015620006b35788860151825594840194600190910190840162000692565b5085821015620006d157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b60ff8281168282160390811115620007155762000715620006e5565b92915050565b600181815b808511156200075b57815f19048211156200073f576200073f620006e5565b808516156200074d57918102915b93841c939080029062000720565b509250929050565b5f82620007735750600162000715565b816200078157505f62000715565b81600181146200079a5760028114620007a557620007c5565b600191505062000715565b60ff841115620007b957620007b9620006e5565b50506001821b62000715565b5060208310610133831016604e8410600b8410161715620007ea575081810a62000715565b620007f683836200071b565b805f19048211156200080c576200080c620006e5565b029392505050565b5f6200082460ff84168362000763565b9392505050565b5f602082840312156200083c575f80fd5b81516001600160a01b038116811462000824575f80fd5b8082028115828204841417620007155762000715620006e5565b5f826200088857634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115620007155762000715620006e5565b60805160a05160c05160e05161010051614da8620009515f395f81816106a4015281816123f80152818161254e015261265201525f8181612cd001528181612d870152612dc601525f818161316d015281816135b1015261388701525f61083801525f8181610a4101528181610c8001528181610f8f015281816110480152818161131001528181611a7e0152818161201c0152818161276901528181612bdc015261373f0152614da85ff3fe6080604052600436106103d3575f3560e01c80638cfd8f5c116101ff578063bccb468711610113578063df2a5b3b116100a8578063eaffd49a11610078578063eaffd49a14610bef578063eb8d72b714610c0e578063f2fde38b14610c2d578063f5ecbdbc14610c4c578063fc0c546a14610c6b575f80fd5b8063df2a5b3b14610b6f578063df47e37314610b8e578063e0bf7fd114610bad578063e6a20ae614610bdb575f80fd5b8063cbed8b9c116100e3578063cbed8b9c14610b09578063cc1776d314610b28578063d1deba1f14610b3d578063dd62ed3e14610b50575f80fd5b8063bccb468714610aa1578063c024666814610ab6578063c18bc19514610ad5578063c446183414610af4575f80fd5b8063a4c51df511610194578063b256f7b711610164578063b256f7b7146109fd578063b2b55b8814610a1c578063b353aaa714610a30578063b70143c914610a63578063baf3292d14610a82575f80fd5b8063a4c51df514610981578063a6c3d165146109a0578063a6fb5dfd146109bf578063a9059cbb146109de575f80fd5b806395d89b41116101cf57806395d89b41146108df5780639bdb9812146108f35780639f38369a14610943578063a457c2d714610962575f80fd5b80638cfd8f5c1461085a5780638da5cb5b146108905780639358928b146108ac578063950c8a74146108c0575f80fd5b80633d8b38f6116102f65780635b8c41e61161028b57806370a082311161025b57806370a08231146107ad578063715018a6146107e15780637533d788146107f557806376203b4814610814578063857749b014610827575f80fd5b80635b8c41e61461070f5780636256d1811461075c57806366ad5c8a1461077b578063695ef6bf1461079a575f80fd5b806349bd5a5e116102c657806349bd5a5e146106935780634c42899a146106c65780634f7041a5146106d957806353371be0146106ee575f80fd5b80633d8b38f6146106175780633f1f4fa41461063657806342d65a8d146106615780634477051514610680575f80fd5b806323b872dd1161036c578063313ce5671161033c578063313ce56714610584578063365260b4146105a557806339509351146105d95780633d5369f6146105f8575f80fd5b806323b872dd146104e75780632dc0562d146105065780632e5bb6ff146105465780633027574414610565575f80fd5b8063095ea7b3116103a7578063095ea7b31461046c5780630df374831461048b57806310ddb137146104aa57806318160ddd146104c9575f80fd5b80621d3567146103d757806301ffc9a7146103f857806306fdde031461042c57806307e0db171461044d575b5f80fd5b3480156103e2575f80fd5b506103f66103f1366004613dc6565b610c7d565b005b348015610403575f80fd5b50610417610412366004613e53565b610ea8565b60405190151581526020015b60405180910390f35b348015610437575f80fd5b50610440610ede565b6040516104239190613ec7565b348015610458575f80fd5b506103f6610467366004613ed9565b610f6e565b348015610477575f80fd5b50610417610486366004613f06565b610ff2565b348015610496575f80fd5b506103f66104a5366004613f30565b611009565b3480156104b5575f80fd5b506103f66104c4366004613ed9565b611027565b3480156104d4575f80fd5b506009545b604051908152602001610423565b3480156104f2575f80fd5b50610417610501366004613f4a565b61107f565b348015610511575f80fd5b5060145461052e906501000000000090046001600160a01b031681565b6040516001600160a01b039091168152602001610423565b348015610551575f80fd5b506103f6610560366004613f88565b6110a2565b348015610570575f80fd5b506103f661057f366004613fae565b611141565b34801561058f575f80fd5b5060125b60405160ff9091168152602001610423565b3480156105b0575f80fd5b506105c46105bf366004613fc7565b611163565b60408051928352602083019190915201610423565b3480156105e4575f80fd5b506104176105f3366004613f06565b6111b6565b348015610603575f80fd5b506103f6610612366004613f88565b6111d7565b348015610622575f80fd5b50610417610631366004614027565b611228565b348015610641575f80fd5b506104d9610650366004613ed9565b60036020525f908152604090205481565b34801561066c575f80fd5b506103f661067b366004614027565b6112f1565b34801561068b575f80fd5b506104d95f81565b34801561069e575f80fd5b5061052e7f000000000000000000000000000000000000000000000000000000000000000081565b3480156106d1575f80fd5b506105935f81565b3480156106e4575f80fd5b506104d9600d5481565b3480156106f9575f80fd5b5060145461041790640100000000900460ff1681565b34801561071a575f80fd5b506104d96107293660046140df565b600560209081525f9384526040808520845180860184018051928152908401958401959095209452929052825290205481565b348015610767575f80fd5b506103f6610776366004613f88565b611372565b348015610786575f80fd5b506103f6610795366004613dc6565b61137f565b6103f66107a836600461418e565b611459565b3480156107b8575f80fd5b506104d96107c73660046141fc565b6001600160a01b03165f9081526007602052604090205490565b3480156107ec575f80fd5b506103f66114c3565b348015610800575f80fd5b5061044061080f366004613ed9565b6114d6565b6103f6610822366004614217565b61156d565b348015610832575f80fd5b506105937f000000000000000000000000000000000000000000000000000000000000000081565b348015610865575f80fd5b506104d96108743660046142c2565b600260209081525f928352604080842090915290825290205481565b34801561089b575f80fd5b505f546001600160a01b031661052e565b3480156108b7575f80fd5b506104d961161a565b3480156108cb575f80fd5b5060045461052e906001600160a01b031681565b3480156108ea575f80fd5b50610440611629565b3480156108fe575f80fd5b5061041761090d3660046140df565b600660209081525f9384526040808520845180860184018051928152908401958401959095209452929052825290205460ff1681565b34801561094e575f80fd5b5061044061095d366004613ed9565b611638565b34801561096d575f80fd5b5061041761097c366004613f06565b611749565b34801561098c575f80fd5b506105c461099b3660046142f3565b6117c3565b3480156109ab575f80fd5b506103f66109ba366004614027565b61184f565b3480156109ca575f80fd5b506103f66109d93660046141fc565b6118d7565b3480156109e9575f80fd5b506104176109f8366004613f06565b61190f565b348015610a08575f80fd5b506103f6610a17366004613fae565b61191c565b348015610a27575f80fd5b506103f6611940565b348015610a3b575f80fd5b5061052e7f000000000000000000000000000000000000000000000000000000000000000081565b348015610a6e575f80fd5b506103f6610a7d366004613f88565b6119b3565b348015610a8d575f80fd5b506103f6610a9c3660046141fc565b6119c4565b348015610aac575f80fd5b506104d960125481565b348015610ac1575f80fd5b506103f6610ad03660046143a4565b611a20565b348015610ae0575f80fd5b506103f6610aef366004613f88565b611a52565b348015610aff575f80fd5b506104d961271081565b348015610b14575f80fd5b506103f6610b233660046143ce565b611a5f565b348015610b33575f80fd5b506104d9600e5481565b6103f6610b4b366004613dc6565b611ae4565b348015610b5b575f80fd5b506104d9610b6a366004614437565b611cf4565b348015610b7a575f80fd5b506103f6610b8936600461446e565b611d1e565b348015610b99575f80fd5b506103f6610ba83660046144a7565b611d87565b348015610bb8575f80fd5b50610417610bc73660046141fc565b60156020525f908152604090205460ff1681565b348015610be6575f80fd5b50610593600181565b348015610bfa575f80fd5b506103f6610c093660046144c7565b611e02565b348015610c19575f80fd5b506103f6610c28366004614027565b611f1c565b348015610c38575f80fd5b506103f6610c473660046141fc565b611f75565b348015610c57575f80fd5b50610440610c66366004614587565b611feb565b348015610c76575f80fd5b503061052e565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610cfa5760405162461bcd60e51b815260206004820152601e60248201527f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c6572000060448201526064015b60405180910390fd5b61ffff86165f9081526001602052604081208054610d17906145d1565b80601f0160208091040260200160405190810160405280929190818152602001828054610d43906145d1565b8015610d8e5780601f10610d6557610100808354040283529160200191610d8e565b820191905f5260205f20905b815481529060010190602001808311610d7157829003601f168201915b50505050509050805186869050148015610da857505f8151115b8015610dd0575080516020820120604051610dc69088908890614603565b6040518091039020145b610e2b5760405162461bcd60e51b815260206004820152602660248201527f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f6044820152651b9d1c9858dd60d21b6064820152608401610cf1565b610e9f8787878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050604080516020601f8a018190048102820181019092528881528a9350915088908890819084018382808284375f9201919091525061209892505050565b50505050505050565b5f6001600160e01b03198216631f7ecdf760e01b1480610ed857506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600a8054610eed906145d1565b80601f0160208091040260200160405190810160405280929190818152602001828054610f19906145d1565b8015610f645780601f10610f3b57610100808354040283529160200191610f64565b820191905f5260205f20905b815481529060010190602001808311610f4757829003601f168201915b5050505050905090565b610f76612110565b6040516307e0db1760e01b815261ffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906307e0db17906024015b5f604051808303815f87803b158015610fd9575f80fd5b505af1158015610feb573d5f803e3d5ffd5b5050505050565b5f33610fff818585612169565b5060019392505050565b611011612110565b61ffff9091165f90815260036020526040902055565b61102f612110565b6040516310ddb13760e01b815261ffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906310ddb13790602401610fc2565b5f3361108c85828561228c565b611097858585612304565b506001949350505050565b80601154036110b8576032600d819055600e5550565b8060115460016110c89190614626565b106110da576023600d819055600e5550565b8060115460056110ea9190614626565b106110fc57601e600d819055600e5550565b80601154600b61110c9190614626565b1061111e576019600d819055600e5550565b80601154601861112e9190614626565b1061113e576014600d819055600e555b50565b611149612110565b601480549115156101000261ff0019909216919091179055565b5f806111a78888888888888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061270492505050565b91509150965096945050505050565b5f33610fff8185856111c88383611cf4565b6111d29190614626565b612169565b6111df612110565b5f81116112235760405162461bcd60e51b815260206004820152601260248201527143616e6e6f742073657420746f207a65726f60701b6044820152606401610cf1565b600f55565b61ffff83165f9081526001602052604081208054829190611248906145d1565b80601f0160208091040260200160405190810160405280929190818152602001828054611274906145d1565b80156112bf5780601f10611296576101008083540402835291602001916112bf565b820191905f5260205f20905b8154815290600101906020018083116112a257829003601f168201915b5050505050905083836040516112d6929190614603565b60405180910390208180519060200120149150509392505050565b6112f9612110565b6040516342d65a8d60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906342d65a8d9061134990869086908690600401614661565b5f604051808303815f87803b158015611360575f80fd5b505af1158015610e9f573d5f803e3d5ffd5b61137a612110565b600c55565b3330146113dd5760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d7573742062656044820152650204c7a4170760d41b6064820152608401610cf1565b6114518686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050604080516020601f8901819004810282018101909252878152899350915087908790819084018382808284375f920191909152506127f392505050565b505050505050565b6114518585858561146d60208701876141fc565b61147d60408801602089016141fc565b61148a604089018961467e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061287892505050565b6114cb612110565b6114d45f61295d565b565b60016020525f9081526040902080546114ee906145d1565b80601f016020809104026020016040519081016040528092919081815260200182805461151a906145d1565b80156115655780601f1061153c57610100808354040283529160200191611565565b820191905f5260205f20905b81548152906001019060200180831161154857829003601f168201915b505050505081565b61160f8888888888888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508a92506115b991505060208901896141fc565b6115c960408a0160208b016141fc565b6115d660408b018b61467e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506129ac92505050565b505050505050505050565b5f61162460095490565b905090565b6060600b8054610eed906145d1565b61ffff81165f9081526001602052604081208054606092919061165a906145d1565b80601f0160208091040260200160405190810160405280929190818152602001828054611686906145d1565b80156116d15780601f106116a8576101008083540402835291602001916116d1565b820191905f5260205f20905b8154815290600101906020018083116116b457829003601f168201915b5050505050905080515f036117285760405162461bcd60e51b815260206004820152601d60248201527f4c7a4170703a206e6f20747275737465642070617468207265636f72640000006044820152606401610cf1565b6117425f6014835161173a91906146c0565b839190612aa5565b9392505050565b5f33816117568286611cf4565b9050838110156117b65760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610cf1565b6110978286868403612169565b5f8061183d8b8b8b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050604080516020601f8d018190048102820181019092528b81528e93508d9250908c908c90819084018382808284375f92019190915250612bb192505050565b91509150995099975050505050505050565b611857612110565b81813060405160200161186c939291906146d3565b60408051601f1981840301815291815261ffff85165f90815260016020522090611896908261473d565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce8383836040516118ca93929190614661565b60405180910390a1505050565b6118df612110565b601480546001600160a01b03909216650100000000000265010000000000600160c81b0319909216919091179055565b5f33610fff818585612304565b611924612110565b60148054911515620100000262ff000019909216919091179055565b611948612110565b601454640100000000900460ff16156119985760405162461bcd60e51b8152602060048201526012602482015271151c98591a5b99c81b9bdd081c185d5cd95960721b6044820152606401610cf1565b601480544360115564ff000000ff1916640100000001179055565b6119bb612110565b61113e81612c68565b6119cc612110565b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b9060200160405180910390a150565b611a28612110565b6001600160a01b03919091165f908152601560205260409020805460ff1916911515919091179055565b611a5a612110565b601055565b611a67612110565b6040516332fb62e760e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063cbed8b9c90611abb90889088908890889088906004016147f8565b5f604051808303815f87803b158015611ad2575f80fd5b505af115801561160f573d5f803e3d5ffd5b61ffff86165f908152600560205260408082209051611b069088908890614603565b90815260408051602092819003830190206001600160401b0387165f9081529252902054905080611b855760405162461bcd60e51b815260206004820152602360248201527f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360448201526261676560e81b6064820152608401610cf1565b808383604051611b96929190614603565b604051809103902014611bf55760405162461bcd60e51b815260206004820152602160248201527f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f616044820152601960fa1b6064820152608401610cf1565b61ffff87165f908152600560205260408082209051611c179089908990614603565b90815260408051602092819003830181206001600160401b0389165f90815290845282902093909355601f88018290048202830182019052868252611cac91899189908990819084018382808284375f9201919091525050604080516020601f8a018190048102820181019092528881528a9350915088908890819084018382808284375f920191909152506127f392505050565b7fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e58787878785604051611ce3959493929190614830565b60405180910390a150505050505050565b6001600160a01b039182165f90815260086020908152604080832093909416825291909152205490565b611d26612110565b61ffff8381165f8181526002602090815260408083209487168084529482529182902085905581519283528201929092529081018290527f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac0906060016118ca565b611d8f612110565b600a8211158015611da15750600a8111155b611ded5760405162461bcd60e51b815260206004820152601960248201527f43616e6e6f74207365742074617865732061626f7665203130000000000000006044820152606401610cf1565b600d91909155600e556014805460ff19169055565b333014611e515760405162461bcd60e51b815260206004820152601f60248201527f4f4654436f72653a2063616c6c6572206d757374206265204f4654436f7265006044820152606401610cf1565b611e5c308686612e4e565b9350846001600160a01b03168a61ffff167fbf551ec93859b170f9b2141bd9298bf3f64322c6f7beb2543a0cb669834118bf86604051611e9e91815260200190565b60405180910390a3604051633fe79aed60e11b81526001600160a01b03861690637fcf35da908390611ee2908e908e908e908e908e908d908d908d9060040161486a565b5f604051808303815f88803b158015611ef9575f80fd5b5087f1158015611f0b573d5f803e3d5ffd5b505050505050505050505050505050565b611f24612110565b61ffff83165f908152600160205260409020611f418284836148c4565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab8383836040516118ca93929190614661565b611f7d612110565b6001600160a01b038116611fe25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cf1565b61113e8161295d565b604051633d7b2f6f60e21b815261ffff808616600483015284166024820152306044820152606481018290526060907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f5ecbdbc906084015f60405180830381865afa158015612068573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261208f919081019061497d565b95945050505050565b5f806120fa5a60966366ad5c8a60e01b898989896040516024016120bf94939291906149e5565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915230929190612e9f565b9150915081611451576114518686868685612f23565b5f546001600160a01b031633146114d45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610cf1565b6001600160a01b0383166121cb5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610cf1565b6001600160a01b03821661222c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610cf1565b6001600160a01b038381165f8181526008602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b5f6122978484611cf4565b90505f1981146122fe57818110156122f15760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610cf1565b6122fe8484848403612169565b50505050565b5f81116123625760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e73666572206d75737420626520677265617465722060448201526507468616e20360d41b6064820152608401610cf1565b601454640100000000900460ff166123e0575f546001600160a01b038481169116148061239b57505f546001600160a01b038381169116145b6123e05760405162461bcd60e51b8152602060048201526016602482015275151c98591a5b99c81b9bdd081858dd1a5d99481e595d60521b6044820152606401610cf1565b6014545f9060ff16156123f6576123f6436110a2565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b031614801561244f57506001600160a01b0383165f9081526015602052604090205460ff16155b1561254c5760105482612476856001600160a01b03165f9081526007602052604090205490565b6124809190614626565b11156124c55760405162461bcd60e51b815260206004820152601460248201527313585e0815d85b1b195d08125b881159999958dd60621b6044820152606401610cf1565b600c5482111561250a5760405162461bcd60e51b815260206004820152601060248201526f13585e08151e081a5b881959999958dd60821b6044820152606401610cf1565b601454610100900460ff1615612537576064600d548361252a9190614a22565b6125349190614a4d565b90505b60128054905f61254683614a60565b91905055505b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03161480156125a557506001600160a01b0384165f9081526015602052604090205460ff16155b1561261c57600c548211156125ef5760405162461bcd60e51b815260206004820152601060248201526f13585e08151e081a5b881959999958dd60821b6044820152606401610cf1565b601454610100900460ff161561261c576064600e548361260f9190614a22565b6126199190614a4d565b90505b305f90815260076020526040902054600f548110801590819061264957506014546301000000900460ff16155b801561268757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031614155b80156126ab57506001600160a01b0386165f9081526015602052604090205460ff16155b80156126ba5750601354601254115b156126ca576126ca600f54612c68565b82156126f9575f6126db84866146c0565b90506126e8873086612fbd565b6126f3878783612fbd565b50611451565b611451868686612fbd565b5f805f61274f8761271488613166565b604080515f6020820152602181019390935260c09190911b6001600160c01b0319166041830152805160298184030181526049909201905290565b60405163040a7bb160e41b81529091506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906340a7bb10906127a6908b90309086908b908b90600401614a78565b6040805180830381865afa1580156127c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127e49190614acb565b92509250509550959350505050565b5f6127fe82826131eb565b905060ff81166128195761281485858585613246565b610feb565b5f1960ff82160161283057612814858585856132d4565b60405162461bcd60e51b815260206004820152601c60248201527f4f4654436f72653a20756e6b6e6f776e207061636b65742074797065000000006044820152606401610cf1565b5f612885878284816134d7565b61288e856135aa565b50905061289d888888846135e9565b90505f81116128ea5760405162461bcd60e51b815260206004820152601960248201527813d19510dbdc994e88185b5bdd5b9d081d1bdbc81cdb585b1b603a1b6044820152606401610cf1565b5f6128f88761271484613166565b905061290888828787873461361a565b86896001600160a01b03168961ffff167fd81fc9b8523134ed613870ed029d6170cbb73aa6a6bc311b9a642689fb9df59a8560405161294991815260200190565b60405180910390a450979650505050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6129c3896001846001600160401b0389166134d7565b6129cc876135aa565b5090506129db8a8a8a846135e9565b90505f8111612a285760405162461bcd60e51b815260206004820152601960248201527813d19510dbdc994e88185b5bdd5b9d081d1bdbc81cdb585b1b603a1b6044820152606401610cf1565b5f612a3e338a612a3785613166565b8a8a6137b7565b9050612a4e8a828787873461361a565b888b6001600160a01b03168b61ffff167fd81fc9b8523134ed613870ed029d6170cbb73aa6a6bc311b9a642689fb9df59a85604051612a8f91815260200190565b60405180910390a4509998505050505050505050565b606081612ab381601f614626565b1015612af25760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b6044820152606401610cf1565b612afc8284614626565b84511015612b405760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b6044820152606401610cf1565b606082158015612b5e5760405191505f825260208201604052612ba8565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015612b97578051835260209283019201612b7f565b5050858452601f01601f1916604052505b50949350505050565b5f805f612bc2338a612a378b613166565b60405163040a7bb160e41b81529091506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906340a7bb1090612c19908d90309086908b908b90600401614a78565b6040805180830381865afa158015612c33573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c579190614acb565b925092505097509795505050505050565b6014805463ff000000191663010000001790556040805160028082526060820183525f9260208301908036833701905050905030815f81518110612cae57612cae614aed565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d2a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d4e9190614b01565b81600181518110612d6157612d61614aed565b60200260200101906001600160a01b031690816001600160a01b031681525050612dac307f000000000000000000000000000000000000000000000000000000000000000084612169565b60145460405163791ac94760e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263791ac94792612e109287925f92889265010000000000909204909116904290600401614b1c565b5f604051808303815f87803b158015612e27575f80fd5b505af1158015612e39573d5f803e3d5ffd5b50506014805463ff0000001916905550505050565b5f33306001600160a01b03861614801590612e7b5750806001600160a01b0316856001600160a01b031614155b15612e8b57612e8b85828561228c565b612e96858585612304565b50909392505050565b5f60605f805f8661ffff166001600160401b03811115612ec157612ec1614075565b6040519080825280601f01601f191660200182016040528015612eeb576020820181803683370190505b5090505f808751602089015f8d8df191503d925086831115612f0b578692505b828152825f602083013e909890975095505050505050565b818051906020012060055f8761ffff1661ffff1681526020019081526020015f2085604051612f529190614b8d565b9081526040805191829003602090810183206001600160401b0388165f908152915220919091557fe183f33de2837795525b4792ca4cd60535bd77c53b7e7030060bfcf5734d6b0c90612fae9087908790879087908790614ba8565b60405180910390a15050505050565b6001600160a01b0383166130215760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610cf1565b6001600160a01b0382166130835760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610cf1565b6001600160a01b0383165f90815260076020526040902054818110156130fa5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610cf1565b6001600160a01b038085165f8181526007602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906131599086815260200190565b60405180910390a36122fe565b5f806131927f000000000000000000000000000000000000000000000000000000000000000084614a4d565b90506001600160401b03811115610ed85760405162461bcd60e51b815260206004820152601a60248201527f4f4654436f72653a20616d6f756e745344206f766572666c6f770000000000006044820152606401610cf1565b5f6131f7826001614626565b8351101561323d5760405162461bcd60e51b8152602060048201526013602482015272746f55696e74385f6f75744f66426f756e647360681b6044820152606401610cf1565b50016001015190565b5f80613251836137fd565b90925090506001600160a01b03821661326a5761dead91505b5f61327482613881565b90506132818784836138b5565b9050826001600160a01b03168761ffff167fbf551ec93859b170f9b2141bd9298bf3f64322c6f7beb2543a0cb669834118bf836040516132c391815260200190565b60405180910390a350505050505050565b5f805f805f6132e2866138c7565b945094509450945094505f60065f8b61ffff1661ffff1681526020019081526020015f20896040516133149190614b8d565b90815260408051602092819003830190206001600160401b038b165f908152925281205460ff16915061334685613881565b9050816133b2576133588b30836138b5565b61ffff8c165f9081526006602052604090819020905191925060019161337f908d90614b8d565b90815260408051602092819003830190206001600160401b038d165f90815292529020805460ff19169115159190911790555b6001600160a01b0386163b613409576040516001600160a01b03871681527f9aedf5fdba8716db3b6705ca00150643309995d4f818a249ed6dde6677e7792d9060200160405180910390a1505050505050506122fe565b8a8a8a8a8a8a868a5f8a613426578b6001600160401b0316613428565b5a5b90505f806134595a609663eaffd49a60e01b8e8e8e8d8d8d8d8d6040516024016120bf989796959493929190614bf9565b9150915081156134b2578751602089012060405161ffff8d16907fb8890edbfc1c74692f527444645f95489c3703cc2df42e4a366f5d06fa6cd884906134a4908e908e908690614c6c565b60405180910390a2506134bf565b6134bf8b8b8b8b85612f23565b50505050505050505050505050505050505050505050565b5f6134e18361397d565b61ffff8087165f90815260026020908152604080832093891683529290522054909150806135515760405162461bcd60e51b815260206004820152601a60248201527f4c7a4170703a206d696e4761734c696d6974206e6f74207365740000000000006044820152606401610cf1565b61355b8382614626565b8210156114515760405162461bcd60e51b815260206004820152601b60248201527f4c7a4170703a20676173206c696d697420697320746f6f206c6f7700000000006044820152606401610cf1565b5f806135d67f000000000000000000000000000000000000000000000000000000000000000084614c99565b90506135e281846146c0565b9150915091565b5f336001600160a01b03861681146136065761360686828561228c565b61361086846139d8565b5090949350505050565b61ffff86165f9081526001602052604081208054613637906145d1565b80601f0160208091040260200160405190810160405280929190818152602001828054613663906145d1565b80156136ae5780601f10613685576101008083540402835291602001916136ae565b820191905f5260205f20905b81548152906001019060200180831161369157829003601f168201915b5050505050905080515f0361371e5760405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201526f61207472757374656420736f7572636560801b6064820152608401610cf1565b613729878751613b0a565b60405162c5803160e81b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063c5803100908490613780908b9086908c908c908c908c90600401614cac565b5f604051808303818588803b158015613797575f80fd5b505af11580156137a9573d5f803e3d5ffd5b505050505050505050505050565b6060600185856001600160a01b03891685876040516020016137de96959493929190614d12565b604051602081830303815290604052905095945050505050565b505050565b5f808061380a84826131eb565b60ff1614801561381b575082516029145b6138625760405162461bcd60e51b815260206004820152601860248201527713d19510dbdc994e881a5b9d985b1a59081c185e5b1bd85960421b6044820152606401610cf1565b61386d83600d613b7a565b915061387a836021613bde565b9050915091565b5f610ed87f00000000000000000000000000000000000000000000000000000000000000006001600160401b038416614a22565b5f6138c08383613c3a565b5092915050565b5f808060608160016138d987836131eb565b60ff16146139245760405162461bcd60e51b815260206004820152601860248201527713d19510dbdc994e881a5b9d985b1a59081c185e5b1bd85960421b6044820152606401610cf1565b61392f86600d613b7a565b935061393c866021613bde565b9250613949866029613cf9565b9450613956866049613bde565b9050613972605180885161396a91906146c0565b889190612aa5565b915091939590929450565b5f6022825110156139d05760405162461bcd60e51b815260206004820152601c60248201527f4c7a4170703a20696e76616c69642061646170746572506172616d73000000006044820152606401610cf1565b506022015190565b6001600160a01b038216613a385760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610cf1565b6001600160a01b0382165f9081526007602052604090205481811015613aab5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610cf1565b6001600160a01b0383165f8181526007602090815260408083208686039055600980548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b61ffff82165f9081526003602052604081205490819003613b2a57506127105b808211156137f85760405162461bcd60e51b815260206004820181905260248201527f4c7a4170703a207061796c6f61642073697a6520697320746f6f206c617267656044820152606401610cf1565b5f613b86826014614626565b83511015613bce5760405162461bcd60e51b8152602060048201526015602482015274746f416464726573735f6f75744f66426f756e647360581b6044820152606401610cf1565b500160200151600160601b900490565b5f613bea826008614626565b83511015613c315760405162461bcd60e51b8152602060048201526014602482015273746f55696e7436345f6f75744f66426f756e647360601b6044820152606401610cf1565b50016008015190565b6001600160a01b038216613c905760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610cf1565b8060095f828254613ca19190614626565b90915550506001600160a01b0382165f818152600760209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b5f613d05826020614626565b83511015613d4d5760405162461bcd60e51b8152602060048201526015602482015274746f427974657333325f6f75744f66426f756e647360581b6044820152606401610cf1565b50016020015190565b803561ffff81168114613d67575f80fd5b919050565b5f8083601f840112613d7c575f80fd5b5081356001600160401b03811115613d92575f80fd5b602083019150836020828501011115613da9575f80fd5b9250929050565b80356001600160401b0381168114613d67575f80fd5b5f805f805f8060808789031215613ddb575f80fd5b613de487613d56565b955060208701356001600160401b0380821115613dff575f80fd5b613e0b8a838b01613d6c565b9097509550859150613e1f60408a01613db0565b94506060890135915080821115613e34575f80fd5b50613e4189828a01613d6c565b979a9699509497509295939492505050565b5f60208284031215613e63575f80fd5b81356001600160e01b031981168114611742575f80fd5b5f5b83811015613e94578181015183820152602001613e7c565b50505f910152565b5f8151808452613eb3816020860160208601613e7a565b601f01601f19169290920160200192915050565b602081525f6117426020830184613e9c565b5f60208284031215613ee9575f80fd5b61174282613d56565b6001600160a01b038116811461113e575f80fd5b5f8060408385031215613f17575f80fd5b8235613f2281613ef2565b946020939093013593505050565b5f8060408385031215613f41575f80fd5b613f2283613d56565b5f805f60608486031215613f5c575f80fd5b8335613f6781613ef2565b92506020840135613f7781613ef2565b929592945050506040919091013590565b5f60208284031215613f98575f80fd5b5035919050565b80358015158114613d67575f80fd5b5f60208284031215613fbe575f80fd5b61174282613f9f565b5f805f805f8060a08789031215613fdc575f80fd5b613fe587613d56565b9550602087013594506040870135935061400160608801613f9f565b925060808701356001600160401b0381111561401b575f80fd5b613e4189828a01613d6c565b5f805f60408486031215614039575f80fd5b61404284613d56565b925060208401356001600160401b0381111561405c575f80fd5b61406886828701613d6c565b9497909650939450505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b03811182821017156140b1576140b1614075565b604052919050565b5f6001600160401b038211156140d1576140d1614075565b50601f01601f191660200190565b5f805f606084860312156140f1575f80fd5b6140fa84613d56565b925060208401356001600160401b03811115614114575f80fd5b8401601f81018613614124575f80fd5b8035614137614132826140b9565b614089565b81815287602083850101111561414b575f80fd5b816020840160208301375f6020838301015280945050505061416f60408501613db0565b90509250925092565b5f60608284031215614188575f80fd5b50919050565b5f805f805f60a086880312156141a2575f80fd5b85356141ad81613ef2565b94506141bb60208701613d56565b9350604086013592506060860135915060808601356001600160401b038111156141e3575f80fd5b6141ef88828901614178565b9150509295509295909350565b5f6020828403121561420c575f80fd5b813561174281613ef2565b5f805f805f805f8060e0898b03121561422e575f80fd5b883561423981613ef2565b975061424760208a01613d56565b9650604089013595506060890135945060808901356001600160401b0380821115614270575f80fd5b61427c8c838d01613d6c565b909650945084915061429060a08c01613db0565b935060c08b01359150808211156142a5575f80fd5b506142b28b828c01614178565b9150509295985092959890939650565b5f80604083850312156142d3575f80fd5b6142dc83613d56565b91506142ea60208401613d56565b90509250929050565b5f805f805f805f805f60e08a8c03121561430b575f80fd5b6143148a613d56565b985060208a0135975060408a0135965060608a01356001600160401b038082111561433d575f80fd5b6143498d838e01613d6c565b909850965086915061435d60808d01613db0565b955061436b60a08d01613f9f565b945060c08c0135915080821115614380575f80fd5b5061438d8c828d01613d6c565b915080935050809150509295985092959850929598565b5f80604083850312156143b5575f80fd5b82356143c081613ef2565b91506142ea60208401613f9f565b5f805f805f608086880312156143e2575f80fd5b6143eb86613d56565b94506143f960208701613d56565b93506040860135925060608601356001600160401b0381111561441a575f80fd5b61442688828901613d6c565b969995985093965092949392505050565b5f8060408385031215614448575f80fd5b823561445381613ef2565b9150602083013561446381613ef2565b809150509250929050565b5f805f60608486031215614480575f80fd5b61448984613d56565b925061449760208501613d56565b9150604084013590509250925092565b5f80604083850312156144b8575f80fd5b50508035926020909101359150565b5f805f805f805f805f806101008b8d0312156144e1575f80fd5b6144ea8b613d56565b995060208b01356001600160401b0380821115614505575f80fd5b6145118e838f01613d6c565b909b50995089915061452560408e01613db0565b985060608d0135975060808d0135915061453e82613ef2565b90955060a08c0135945060c08c0135908082111561455a575f80fd5b506145678d828e01613d6c565b9150809450508092505060e08b013590509295989b9194979a5092959850565b5f805f806080858703121561459a575f80fd5b6145a385613d56565b93506145b160208601613d56565b925060408501356145c181613ef2565b9396929550929360600135925050565b600181811c908216806145e557607f821691505b60208210810361418857634e487b7160e01b5f52602260045260245ffd5b818382375f9101908152919050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610ed857610ed8614612565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b61ffff84168152604060208201525f61208f604083018486614639565b5f808335601e19843603018112614693575f80fd5b8301803591506001600160401b038211156146ac575f80fd5b602001915036819003821315613da9575f80fd5b81810381811115610ed857610ed8614612565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b601f8211156137f857805f5260205f20601f840160051c8101602085101561471e5750805b601f840160051c820191505b81811015610feb575f815560010161472a565b81516001600160401b0381111561475657614756614075565b61476a8161476484546145d1565b846146f9565b602080601f83116001811461479d575f84156147865750858301515b5f19600386901b1c1916600185901b178555611451565b5f85815260208120601f198616915b828110156147cb578886015182559484019460019091019084016147ac565b50858210156147e857878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f61ffff808816835280871660208401525084604083015260806060830152614825608083018486614639565b979650505050505050565b61ffff86168152608060208201525f61484d608083018688614639565b6001600160401b0394909416604083015250606001529392505050565b61ffff8916815260c060208201525f61488760c08301898b614639565b6001600160401b038816604084015286606084015285608084015282810360a08401526148b5818587614639565b9b9a5050505050505050505050565b6001600160401b038311156148db576148db614075565b6148ef836148e983546145d1565b836146f9565b5f601f841160018114614920575f85156149095750838201355b5f19600387901b1c1916600186901b178355610feb565b5f83815260208120601f198716915b8281101561494f578685013582556020948501946001909201910161492f565b508682101561496b575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b5f6020828403121561498d575f80fd5b81516001600160401b038111156149a2575f80fd5b8201601f810184136149b2575f80fd5b80516149c0614132826140b9565b8181528560208385010111156149d4575f80fd5b61208f826020830160208601613e7a565b61ffff85168152608060208201525f614a016080830186613e9c565b6001600160401b038516604084015282810360608401526148258185613e9c565b8082028115828204841417610ed857610ed8614612565b634e487b7160e01b5f52601260045260245ffd5b5f82614a5b57614a5b614a39565b500490565b5f60018201614a7157614a71614612565b5060010190565b61ffff861681526001600160a01b038516602082015260a0604082018190525f90614aa590830186613e9c565b84151560608401528281036080840152614abf8185613e9c565b98975050505050505050565b5f8060408385031215614adc575f80fd5b505080516020909101519092909150565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215614b11575f80fd5b815161174281613ef2565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b81811015614b6c5784516001600160a01b031683529383019391830191600101614b47565b50506001600160a01b03969096166060850152505050608001529392505050565b5f8251614b9e818460208701613e7a565b9190910192915050565b61ffff8616815260a060208201525f614bc460a0830187613e9c565b6001600160401b03861660408401528281036060840152614be58186613e9c565b90508281036080840152614abf8185613e9c565b5f61010061ffff8b168352806020840152614c168184018b613e9c565b6001600160401b038a166040850152606084018990526001600160a01b038816608085015260a0840187905283810360c08501529050614c568186613e9c565b9150508260e08301529998505050505050505050565b606081525f614c7e6060830186613e9c565b6001600160401b039490941660208301525060400152919050565b5f82614ca757614ca7614a39565b500690565b61ffff8716815260c060208201525f614cc860c0830188613e9c565b8281036040840152614cda8188613e9c565b6001600160a01b0387811660608601528616608085015283810360a08501529050614d058185613e9c565b9998505050505050505050565b60ff60f81b8760f81b1681528560018201525f6001600160401b0360c01b808760c01b166021840152856029840152808560c01b166049840152508251614d60816051850160208701613e7a565b9190910160510197965050505050505056fea264697066735822122096fd0f2cf9a5d2b7e91e5d46a4b40d687c2fce7cc5fd78a36d00bb1d5322762864736f6c63430008180033

Deployed Bytecode

0x6080604052600436106103d3575f3560e01c80638cfd8f5c116101ff578063bccb468711610113578063df2a5b3b116100a8578063eaffd49a11610078578063eaffd49a14610bef578063eb8d72b714610c0e578063f2fde38b14610c2d578063f5ecbdbc14610c4c578063fc0c546a14610c6b575f80fd5b8063df2a5b3b14610b6f578063df47e37314610b8e578063e0bf7fd114610bad578063e6a20ae614610bdb575f80fd5b8063cbed8b9c116100e3578063cbed8b9c14610b09578063cc1776d314610b28578063d1deba1f14610b3d578063dd62ed3e14610b50575f80fd5b8063bccb468714610aa1578063c024666814610ab6578063c18bc19514610ad5578063c446183414610af4575f80fd5b8063a4c51df511610194578063b256f7b711610164578063b256f7b7146109fd578063b2b55b8814610a1c578063b353aaa714610a30578063b70143c914610a63578063baf3292d14610a82575f80fd5b8063a4c51df514610981578063a6c3d165146109a0578063a6fb5dfd146109bf578063a9059cbb146109de575f80fd5b806395d89b41116101cf57806395d89b41146108df5780639bdb9812146108f35780639f38369a14610943578063a457c2d714610962575f80fd5b80638cfd8f5c1461085a5780638da5cb5b146108905780639358928b146108ac578063950c8a74146108c0575f80fd5b80633d8b38f6116102f65780635b8c41e61161028b57806370a082311161025b57806370a08231146107ad578063715018a6146107e15780637533d788146107f557806376203b4814610814578063857749b014610827575f80fd5b80635b8c41e61461070f5780636256d1811461075c57806366ad5c8a1461077b578063695ef6bf1461079a575f80fd5b806349bd5a5e116102c657806349bd5a5e146106935780634c42899a146106c65780634f7041a5146106d957806353371be0146106ee575f80fd5b80633d8b38f6146106175780633f1f4fa41461063657806342d65a8d146106615780634477051514610680575f80fd5b806323b872dd1161036c578063313ce5671161033c578063313ce56714610584578063365260b4146105a557806339509351146105d95780633d5369f6146105f8575f80fd5b806323b872dd146104e75780632dc0562d146105065780632e5bb6ff146105465780633027574414610565575f80fd5b8063095ea7b3116103a7578063095ea7b31461046c5780630df374831461048b57806310ddb137146104aa57806318160ddd146104c9575f80fd5b80621d3567146103d757806301ffc9a7146103f857806306fdde031461042c57806307e0db171461044d575b5f80fd5b3480156103e2575f80fd5b506103f66103f1366004613dc6565b610c7d565b005b348015610403575f80fd5b50610417610412366004613e53565b610ea8565b60405190151581526020015b60405180910390f35b348015610437575f80fd5b50610440610ede565b6040516104239190613ec7565b348015610458575f80fd5b506103f6610467366004613ed9565b610f6e565b348015610477575f80fd5b50610417610486366004613f06565b610ff2565b348015610496575f80fd5b506103f66104a5366004613f30565b611009565b3480156104b5575f80fd5b506103f66104c4366004613ed9565b611027565b3480156104d4575f80fd5b506009545b604051908152602001610423565b3480156104f2575f80fd5b50610417610501366004613f4a565b61107f565b348015610511575f80fd5b5060145461052e906501000000000090046001600160a01b031681565b6040516001600160a01b039091168152602001610423565b348015610551575f80fd5b506103f6610560366004613f88565b6110a2565b348015610570575f80fd5b506103f661057f366004613fae565b611141565b34801561058f575f80fd5b5060125b60405160ff9091168152602001610423565b3480156105b0575f80fd5b506105c46105bf366004613fc7565b611163565b60408051928352602083019190915201610423565b3480156105e4575f80fd5b506104176105f3366004613f06565b6111b6565b348015610603575f80fd5b506103f6610612366004613f88565b6111d7565b348015610622575f80fd5b50610417610631366004614027565b611228565b348015610641575f80fd5b506104d9610650366004613ed9565b60036020525f908152604090205481565b34801561066c575f80fd5b506103f661067b366004614027565b6112f1565b34801561068b575f80fd5b506104d95f81565b34801561069e575f80fd5b5061052e7f0000000000000000000000000771ca0b911ec9d1e10743ea0fa04398e387e2ba81565b3480156106d1575f80fd5b506105935f81565b3480156106e4575f80fd5b506104d9600d5481565b3480156106f9575f80fd5b5060145461041790640100000000900460ff1681565b34801561071a575f80fd5b506104d96107293660046140df565b600560209081525f9384526040808520845180860184018051928152908401958401959095209452929052825290205481565b348015610767575f80fd5b506103f6610776366004613f88565b611372565b348015610786575f80fd5b506103f6610795366004613dc6565b61137f565b6103f66107a836600461418e565b611459565b3480156107b8575f80fd5b506104d96107c73660046141fc565b6001600160a01b03165f9081526007602052604090205490565b3480156107ec575f80fd5b506103f66114c3565b348015610800575f80fd5b5061044061080f366004613ed9565b6114d6565b6103f6610822366004614217565b61156d565b348015610832575f80fd5b506105937f000000000000000000000000000000000000000000000000000000000000000881565b348015610865575f80fd5b506104d96108743660046142c2565b600260209081525f928352604080842090915290825290205481565b34801561089b575f80fd5b505f546001600160a01b031661052e565b3480156108b7575f80fd5b506104d961161a565b3480156108cb575f80fd5b5060045461052e906001600160a01b031681565b3480156108ea575f80fd5b50610440611629565b3480156108fe575f80fd5b5061041761090d3660046140df565b600660209081525f9384526040808520845180860184018051928152908401958401959095209452929052825290205460ff1681565b34801561094e575f80fd5b5061044061095d366004613ed9565b611638565b34801561096d575f80fd5b5061041761097c366004613f06565b611749565b34801561098c575f80fd5b506105c461099b3660046142f3565b6117c3565b3480156109ab575f80fd5b506103f66109ba366004614027565b61184f565b3480156109ca575f80fd5b506103f66109d93660046141fc565b6118d7565b3480156109e9575f80fd5b506104176109f8366004613f06565b61190f565b348015610a08575f80fd5b506103f6610a17366004613fae565b61191c565b348015610a27575f80fd5b506103f6611940565b348015610a3b575f80fd5b5061052e7f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67581565b348015610a6e575f80fd5b506103f6610a7d366004613f88565b6119b3565b348015610a8d575f80fd5b506103f6610a9c3660046141fc565b6119c4565b348015610aac575f80fd5b506104d960125481565b348015610ac1575f80fd5b506103f6610ad03660046143a4565b611a20565b348015610ae0575f80fd5b506103f6610aef366004613f88565b611a52565b348015610aff575f80fd5b506104d961271081565b348015610b14575f80fd5b506103f6610b233660046143ce565b611a5f565b348015610b33575f80fd5b506104d9600e5481565b6103f6610b4b366004613dc6565b611ae4565b348015610b5b575f80fd5b506104d9610b6a366004614437565b611cf4565b348015610b7a575f80fd5b506103f6610b8936600461446e565b611d1e565b348015610b99575f80fd5b506103f6610ba83660046144a7565b611d87565b348015610bb8575f80fd5b50610417610bc73660046141fc565b60156020525f908152604090205460ff1681565b348015610be6575f80fd5b50610593600181565b348015610bfa575f80fd5b506103f6610c093660046144c7565b611e02565b348015610c19575f80fd5b506103f6610c28366004614027565b611f1c565b348015610c38575f80fd5b506103f6610c473660046141fc565b611f75565b348015610c57575f80fd5b50610440610c66366004614587565b611feb565b348015610c76575f80fd5b503061052e565b337f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6756001600160a01b031614610cfa5760405162461bcd60e51b815260206004820152601e60248201527f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c6572000060448201526064015b60405180910390fd5b61ffff86165f9081526001602052604081208054610d17906145d1565b80601f0160208091040260200160405190810160405280929190818152602001828054610d43906145d1565b8015610d8e5780601f10610d6557610100808354040283529160200191610d8e565b820191905f5260205f20905b815481529060010190602001808311610d7157829003601f168201915b50505050509050805186869050148015610da857505f8151115b8015610dd0575080516020820120604051610dc69088908890614603565b6040518091039020145b610e2b5760405162461bcd60e51b815260206004820152602660248201527f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f6044820152651b9d1c9858dd60d21b6064820152608401610cf1565b610e9f8787878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050604080516020601f8a018190048102820181019092528881528a9350915088908890819084018382808284375f9201919091525061209892505050565b50505050505050565b5f6001600160e01b03198216631f7ecdf760e01b1480610ed857506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600a8054610eed906145d1565b80601f0160208091040260200160405190810160405280929190818152602001828054610f19906145d1565b8015610f645780601f10610f3b57610100808354040283529160200191610f64565b820191905f5260205f20905b815481529060010190602001808311610f4757829003601f168201915b5050505050905090565b610f76612110565b6040516307e0db1760e01b815261ffff821660048201527f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6756001600160a01b0316906307e0db17906024015b5f604051808303815f87803b158015610fd9575f80fd5b505af1158015610feb573d5f803e3d5ffd5b5050505050565b5f33610fff818585612169565b5060019392505050565b611011612110565b61ffff9091165f90815260036020526040902055565b61102f612110565b6040516310ddb13760e01b815261ffff821660048201527f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6756001600160a01b0316906310ddb13790602401610fc2565b5f3361108c85828561228c565b611097858585612304565b506001949350505050565b80601154036110b8576032600d819055600e5550565b8060115460016110c89190614626565b106110da576023600d819055600e5550565b8060115460056110ea9190614626565b106110fc57601e600d819055600e5550565b80601154600b61110c9190614626565b1061111e576019600d819055600e5550565b80601154601861112e9190614626565b1061113e576014600d819055600e555b50565b611149612110565b601480549115156101000261ff0019909216919091179055565b5f806111a78888888888888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061270492505050565b91509150965096945050505050565b5f33610fff8185856111c88383611cf4565b6111d29190614626565b612169565b6111df612110565b5f81116112235760405162461bcd60e51b815260206004820152601260248201527143616e6e6f742073657420746f207a65726f60701b6044820152606401610cf1565b600f55565b61ffff83165f9081526001602052604081208054829190611248906145d1565b80601f0160208091040260200160405190810160405280929190818152602001828054611274906145d1565b80156112bf5780601f10611296576101008083540402835291602001916112bf565b820191905f5260205f20905b8154815290600101906020018083116112a257829003601f168201915b5050505050905083836040516112d6929190614603565b60405180910390208180519060200120149150509392505050565b6112f9612110565b6040516342d65a8d60e01b81526001600160a01b037f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67516906342d65a8d9061134990869086908690600401614661565b5f604051808303815f87803b158015611360575f80fd5b505af1158015610e9f573d5f803e3d5ffd5b61137a612110565b600c55565b3330146113dd5760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d7573742062656044820152650204c7a4170760d41b6064820152608401610cf1565b6114518686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050604080516020601f8901819004810282018101909252878152899350915087908790819084018382808284375f920191909152506127f392505050565b505050505050565b6114518585858561146d60208701876141fc565b61147d60408801602089016141fc565b61148a604089018961467e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061287892505050565b6114cb612110565b6114d45f61295d565b565b60016020525f9081526040902080546114ee906145d1565b80601f016020809104026020016040519081016040528092919081815260200182805461151a906145d1565b80156115655780601f1061153c57610100808354040283529160200191611565565b820191905f5260205f20905b81548152906001019060200180831161154857829003601f168201915b505050505081565b61160f8888888888888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508a92506115b991505060208901896141fc565b6115c960408a0160208b016141fc565b6115d660408b018b61467e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506129ac92505050565b505050505050505050565b5f61162460095490565b905090565b6060600b8054610eed906145d1565b61ffff81165f9081526001602052604081208054606092919061165a906145d1565b80601f0160208091040260200160405190810160405280929190818152602001828054611686906145d1565b80156116d15780601f106116a8576101008083540402835291602001916116d1565b820191905f5260205f20905b8154815290600101906020018083116116b457829003601f168201915b5050505050905080515f036117285760405162461bcd60e51b815260206004820152601d60248201527f4c7a4170703a206e6f20747275737465642070617468207265636f72640000006044820152606401610cf1565b6117425f6014835161173a91906146c0565b839190612aa5565b9392505050565b5f33816117568286611cf4565b9050838110156117b65760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610cf1565b6110978286868403612169565b5f8061183d8b8b8b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050604080516020601f8d018190048102820181019092528b81528e93508d9250908c908c90819084018382808284375f92019190915250612bb192505050565b91509150995099975050505050505050565b611857612110565b81813060405160200161186c939291906146d3565b60408051601f1981840301815291815261ffff85165f90815260016020522090611896908261473d565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce8383836040516118ca93929190614661565b60405180910390a1505050565b6118df612110565b601480546001600160a01b03909216650100000000000265010000000000600160c81b0319909216919091179055565b5f33610fff818585612304565b611924612110565b60148054911515620100000262ff000019909216919091179055565b611948612110565b601454640100000000900460ff16156119985760405162461bcd60e51b8152602060048201526012602482015271151c98591a5b99c81b9bdd081c185d5cd95960721b6044820152606401610cf1565b601480544360115564ff000000ff1916640100000001179055565b6119bb612110565b61113e81612c68565b6119cc612110565b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b9060200160405180910390a150565b611a28612110565b6001600160a01b03919091165f908152601560205260409020805460ff1916911515919091179055565b611a5a612110565b601055565b611a67612110565b6040516332fb62e760e21b81526001600160a01b037f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675169063cbed8b9c90611abb90889088908890889088906004016147f8565b5f604051808303815f87803b158015611ad2575f80fd5b505af115801561160f573d5f803e3d5ffd5b61ffff86165f908152600560205260408082209051611b069088908890614603565b90815260408051602092819003830190206001600160401b0387165f9081529252902054905080611b855760405162461bcd60e51b815260206004820152602360248201527f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360448201526261676560e81b6064820152608401610cf1565b808383604051611b96929190614603565b604051809103902014611bf55760405162461bcd60e51b815260206004820152602160248201527f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f616044820152601960fa1b6064820152608401610cf1565b61ffff87165f908152600560205260408082209051611c179089908990614603565b90815260408051602092819003830181206001600160401b0389165f90815290845282902093909355601f88018290048202830182019052868252611cac91899189908990819084018382808284375f9201919091525050604080516020601f8a018190048102820181019092528881528a9350915088908890819084018382808284375f920191909152506127f392505050565b7fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e58787878785604051611ce3959493929190614830565b60405180910390a150505050505050565b6001600160a01b039182165f90815260086020908152604080832093909416825291909152205490565b611d26612110565b61ffff8381165f8181526002602090815260408083209487168084529482529182902085905581519283528201929092529081018290527f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac0906060016118ca565b611d8f612110565b600a8211158015611da15750600a8111155b611ded5760405162461bcd60e51b815260206004820152601960248201527f43616e6e6f74207365742074617865732061626f7665203130000000000000006044820152606401610cf1565b600d91909155600e556014805460ff19169055565b333014611e515760405162461bcd60e51b815260206004820152601f60248201527f4f4654436f72653a2063616c6c6572206d757374206265204f4654436f7265006044820152606401610cf1565b611e5c308686612e4e565b9350846001600160a01b03168a61ffff167fbf551ec93859b170f9b2141bd9298bf3f64322c6f7beb2543a0cb669834118bf86604051611e9e91815260200190565b60405180910390a3604051633fe79aed60e11b81526001600160a01b03861690637fcf35da908390611ee2908e908e908e908e908e908d908d908d9060040161486a565b5f604051808303815f88803b158015611ef9575f80fd5b5087f1158015611f0b573d5f803e3d5ffd5b505050505050505050505050505050565b611f24612110565b61ffff83165f908152600160205260409020611f418284836148c4565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab8383836040516118ca93929190614661565b611f7d612110565b6001600160a01b038116611fe25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cf1565b61113e8161295d565b604051633d7b2f6f60e21b815261ffff808616600483015284166024820152306044820152606481018290526060907f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6756001600160a01b03169063f5ecbdbc906084015f60405180830381865afa158015612068573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261208f919081019061497d565b95945050505050565b5f806120fa5a60966366ad5c8a60e01b898989896040516024016120bf94939291906149e5565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915230929190612e9f565b9150915081611451576114518686868685612f23565b5f546001600160a01b031633146114d45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610cf1565b6001600160a01b0383166121cb5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610cf1565b6001600160a01b03821661222c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610cf1565b6001600160a01b038381165f8181526008602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b5f6122978484611cf4565b90505f1981146122fe57818110156122f15760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610cf1565b6122fe8484848403612169565b50505050565b5f81116123625760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e73666572206d75737420626520677265617465722060448201526507468616e20360d41b6064820152608401610cf1565b601454640100000000900460ff166123e0575f546001600160a01b038481169116148061239b57505f546001600160a01b038381169116145b6123e05760405162461bcd60e51b8152602060048201526016602482015275151c98591a5b99c81b9bdd081858dd1a5d99481e595d60521b6044820152606401610cf1565b6014545f9060ff16156123f6576123f6436110a2565b7f0000000000000000000000000771ca0b911ec9d1e10743ea0fa04398e387e2ba6001600160a01b0316846001600160a01b031614801561244f57506001600160a01b0383165f9081526015602052604090205460ff16155b1561254c5760105482612476856001600160a01b03165f9081526007602052604090205490565b6124809190614626565b11156124c55760405162461bcd60e51b815260206004820152601460248201527313585e0815d85b1b195d08125b881159999958dd60621b6044820152606401610cf1565b600c5482111561250a5760405162461bcd60e51b815260206004820152601060248201526f13585e08151e081a5b881959999958dd60821b6044820152606401610cf1565b601454610100900460ff1615612537576064600d548361252a9190614a22565b6125349190614a4d565b90505b60128054905f61254683614a60565b91905055505b7f0000000000000000000000000771ca0b911ec9d1e10743ea0fa04398e387e2ba6001600160a01b0316836001600160a01b03161480156125a557506001600160a01b0384165f9081526015602052604090205460ff16155b1561261c57600c548211156125ef5760405162461bcd60e51b815260206004820152601060248201526f13585e08151e081a5b881959999958dd60821b6044820152606401610cf1565b601454610100900460ff161561261c576064600e548361260f9190614a22565b6126199190614a4d565b90505b305f90815260076020526040902054600f548110801590819061264957506014546301000000900460ff16155b801561268757507f0000000000000000000000000771ca0b911ec9d1e10743ea0fa04398e387e2ba6001600160a01b0316866001600160a01b031614155b80156126ab57506001600160a01b0386165f9081526015602052604090205460ff16155b80156126ba5750601354601254115b156126ca576126ca600f54612c68565b82156126f9575f6126db84866146c0565b90506126e8873086612fbd565b6126f3878783612fbd565b50611451565b611451868686612fbd565b5f805f61274f8761271488613166565b604080515f6020820152602181019390935260c09190911b6001600160c01b0319166041830152805160298184030181526049909201905290565b60405163040a7bb160e41b81529091506001600160a01b037f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67516906340a7bb10906127a6908b90309086908b908b90600401614a78565b6040805180830381865afa1580156127c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127e49190614acb565b92509250509550959350505050565b5f6127fe82826131eb565b905060ff81166128195761281485858585613246565b610feb565b5f1960ff82160161283057612814858585856132d4565b60405162461bcd60e51b815260206004820152601c60248201527f4f4654436f72653a20756e6b6e6f776e207061636b65742074797065000000006044820152606401610cf1565b5f612885878284816134d7565b61288e856135aa565b50905061289d888888846135e9565b90505f81116128ea5760405162461bcd60e51b815260206004820152601960248201527813d19510dbdc994e88185b5bdd5b9d081d1bdbc81cdb585b1b603a1b6044820152606401610cf1565b5f6128f88761271484613166565b905061290888828787873461361a565b86896001600160a01b03168961ffff167fd81fc9b8523134ed613870ed029d6170cbb73aa6a6bc311b9a642689fb9df59a8560405161294991815260200190565b60405180910390a450979650505050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6129c3896001846001600160401b0389166134d7565b6129cc876135aa565b5090506129db8a8a8a846135e9565b90505f8111612a285760405162461bcd60e51b815260206004820152601960248201527813d19510dbdc994e88185b5bdd5b9d081d1bdbc81cdb585b1b603a1b6044820152606401610cf1565b5f612a3e338a612a3785613166565b8a8a6137b7565b9050612a4e8a828787873461361a565b888b6001600160a01b03168b61ffff167fd81fc9b8523134ed613870ed029d6170cbb73aa6a6bc311b9a642689fb9df59a85604051612a8f91815260200190565b60405180910390a4509998505050505050505050565b606081612ab381601f614626565b1015612af25760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b6044820152606401610cf1565b612afc8284614626565b84511015612b405760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b6044820152606401610cf1565b606082158015612b5e5760405191505f825260208201604052612ba8565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015612b97578051835260209283019201612b7f565b5050858452601f01601f1916604052505b50949350505050565b5f805f612bc2338a612a378b613166565b60405163040a7bb160e41b81529091506001600160a01b037f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67516906340a7bb1090612c19908d90309086908b908b90600401614a78565b6040805180830381865afa158015612c33573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c579190614acb565b925092505097509795505050505050565b6014805463ff000000191663010000001790556040805160028082526060820183525f9260208301908036833701905050905030815f81518110612cae57612cae614aed565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d2a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d4e9190614b01565b81600181518110612d6157612d61614aed565b60200260200101906001600160a01b031690816001600160a01b031681525050612dac307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84612169565b60145460405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81169263791ac94792612e109287925f92889265010000000000909204909116904290600401614b1c565b5f604051808303815f87803b158015612e27575f80fd5b505af1158015612e39573d5f803e3d5ffd5b50506014805463ff0000001916905550505050565b5f33306001600160a01b03861614801590612e7b5750806001600160a01b0316856001600160a01b031614155b15612e8b57612e8b85828561228c565b612e96858585612304565b50909392505050565b5f60605f805f8661ffff166001600160401b03811115612ec157612ec1614075565b6040519080825280601f01601f191660200182016040528015612eeb576020820181803683370190505b5090505f808751602089015f8d8df191503d925086831115612f0b578692505b828152825f602083013e909890975095505050505050565b818051906020012060055f8761ffff1661ffff1681526020019081526020015f2085604051612f529190614b8d565b9081526040805191829003602090810183206001600160401b0388165f908152915220919091557fe183f33de2837795525b4792ca4cd60535bd77c53b7e7030060bfcf5734d6b0c90612fae9087908790879087908790614ba8565b60405180910390a15050505050565b6001600160a01b0383166130215760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610cf1565b6001600160a01b0382166130835760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610cf1565b6001600160a01b0383165f90815260076020526040902054818110156130fa5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610cf1565b6001600160a01b038085165f8181526007602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906131599086815260200190565b60405180910390a36122fe565b5f806131927f00000000000000000000000000000000000000000000000000000002540be40084614a4d565b90506001600160401b03811115610ed85760405162461bcd60e51b815260206004820152601a60248201527f4f4654436f72653a20616d6f756e745344206f766572666c6f770000000000006044820152606401610cf1565b5f6131f7826001614626565b8351101561323d5760405162461bcd60e51b8152602060048201526013602482015272746f55696e74385f6f75744f66426f756e647360681b6044820152606401610cf1565b50016001015190565b5f80613251836137fd565b90925090506001600160a01b03821661326a5761dead91505b5f61327482613881565b90506132818784836138b5565b9050826001600160a01b03168761ffff167fbf551ec93859b170f9b2141bd9298bf3f64322c6f7beb2543a0cb669834118bf836040516132c391815260200190565b60405180910390a350505050505050565b5f805f805f6132e2866138c7565b945094509450945094505f60065f8b61ffff1661ffff1681526020019081526020015f20896040516133149190614b8d565b90815260408051602092819003830190206001600160401b038b165f908152925281205460ff16915061334685613881565b9050816133b2576133588b30836138b5565b61ffff8c165f9081526006602052604090819020905191925060019161337f908d90614b8d565b90815260408051602092819003830190206001600160401b038d165f90815292529020805460ff19169115159190911790555b6001600160a01b0386163b613409576040516001600160a01b03871681527f9aedf5fdba8716db3b6705ca00150643309995d4f818a249ed6dde6677e7792d9060200160405180910390a1505050505050506122fe565b8a8a8a8a8a8a868a5f8a613426578b6001600160401b0316613428565b5a5b90505f806134595a609663eaffd49a60e01b8e8e8e8d8d8d8d8d6040516024016120bf989796959493929190614bf9565b9150915081156134b2578751602089012060405161ffff8d16907fb8890edbfc1c74692f527444645f95489c3703cc2df42e4a366f5d06fa6cd884906134a4908e908e908690614c6c565b60405180910390a2506134bf565b6134bf8b8b8b8b85612f23565b50505050505050505050505050505050505050505050565b5f6134e18361397d565b61ffff8087165f90815260026020908152604080832093891683529290522054909150806135515760405162461bcd60e51b815260206004820152601a60248201527f4c7a4170703a206d696e4761734c696d6974206e6f74207365740000000000006044820152606401610cf1565b61355b8382614626565b8210156114515760405162461bcd60e51b815260206004820152601b60248201527f4c7a4170703a20676173206c696d697420697320746f6f206c6f7700000000006044820152606401610cf1565b5f806135d67f00000000000000000000000000000000000000000000000000000002540be40084614c99565b90506135e281846146c0565b9150915091565b5f336001600160a01b03861681146136065761360686828561228c565b61361086846139d8565b5090949350505050565b61ffff86165f9081526001602052604081208054613637906145d1565b80601f0160208091040260200160405190810160405280929190818152602001828054613663906145d1565b80156136ae5780601f10613685576101008083540402835291602001916136ae565b820191905f5260205f20905b81548152906001019060200180831161369157829003601f168201915b5050505050905080515f0361371e5760405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201526f61207472757374656420736f7572636560801b6064820152608401610cf1565b613729878751613b0a565b60405162c5803160e81b81526001600160a01b037f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675169063c5803100908490613780908b9086908c908c908c908c90600401614cac565b5f604051808303818588803b158015613797575f80fd5b505af11580156137a9573d5f803e3d5ffd5b505050505050505050505050565b6060600185856001600160a01b03891685876040516020016137de96959493929190614d12565b604051602081830303815290604052905095945050505050565b505050565b5f808061380a84826131eb565b60ff1614801561381b575082516029145b6138625760405162461bcd60e51b815260206004820152601860248201527713d19510dbdc994e881a5b9d985b1a59081c185e5b1bd85960421b6044820152606401610cf1565b61386d83600d613b7a565b915061387a836021613bde565b9050915091565b5f610ed87f00000000000000000000000000000000000000000000000000000002540be4006001600160401b038416614a22565b5f6138c08383613c3a565b5092915050565b5f808060608160016138d987836131eb565b60ff16146139245760405162461bcd60e51b815260206004820152601860248201527713d19510dbdc994e881a5b9d985b1a59081c185e5b1bd85960421b6044820152606401610cf1565b61392f86600d613b7a565b935061393c866021613bde565b9250613949866029613cf9565b9450613956866049613bde565b9050613972605180885161396a91906146c0565b889190612aa5565b915091939590929450565b5f6022825110156139d05760405162461bcd60e51b815260206004820152601c60248201527f4c7a4170703a20696e76616c69642061646170746572506172616d73000000006044820152606401610cf1565b506022015190565b6001600160a01b038216613a385760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610cf1565b6001600160a01b0382165f9081526007602052604090205481811015613aab5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610cf1565b6001600160a01b0383165f8181526007602090815260408083208686039055600980548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b61ffff82165f9081526003602052604081205490819003613b2a57506127105b808211156137f85760405162461bcd60e51b815260206004820181905260248201527f4c7a4170703a207061796c6f61642073697a6520697320746f6f206c617267656044820152606401610cf1565b5f613b86826014614626565b83511015613bce5760405162461bcd60e51b8152602060048201526015602482015274746f416464726573735f6f75744f66426f756e647360581b6044820152606401610cf1565b500160200151600160601b900490565b5f613bea826008614626565b83511015613c315760405162461bcd60e51b8152602060048201526014602482015273746f55696e7436345f6f75744f66426f756e647360601b6044820152606401610cf1565b50016008015190565b6001600160a01b038216613c905760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610cf1565b8060095f828254613ca19190614626565b90915550506001600160a01b0382165f818152600760209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b5f613d05826020614626565b83511015613d4d5760405162461bcd60e51b8152602060048201526015602482015274746f427974657333325f6f75744f66426f756e647360581b6044820152606401610cf1565b50016020015190565b803561ffff81168114613d67575f80fd5b919050565b5f8083601f840112613d7c575f80fd5b5081356001600160401b03811115613d92575f80fd5b602083019150836020828501011115613da9575f80fd5b9250929050565b80356001600160401b0381168114613d67575f80fd5b5f805f805f8060808789031215613ddb575f80fd5b613de487613d56565b955060208701356001600160401b0380821115613dff575f80fd5b613e0b8a838b01613d6c565b9097509550859150613e1f60408a01613db0565b94506060890135915080821115613e34575f80fd5b50613e4189828a01613d6c565b979a9699509497509295939492505050565b5f60208284031215613e63575f80fd5b81356001600160e01b031981168114611742575f80fd5b5f5b83811015613e94578181015183820152602001613e7c565b50505f910152565b5f8151808452613eb3816020860160208601613e7a565b601f01601f19169290920160200192915050565b602081525f6117426020830184613e9c565b5f60208284031215613ee9575f80fd5b61174282613d56565b6001600160a01b038116811461113e575f80fd5b5f8060408385031215613f17575f80fd5b8235613f2281613ef2565b946020939093013593505050565b5f8060408385031215613f41575f80fd5b613f2283613d56565b5f805f60608486031215613f5c575f80fd5b8335613f6781613ef2565b92506020840135613f7781613ef2565b929592945050506040919091013590565b5f60208284031215613f98575f80fd5b5035919050565b80358015158114613d67575f80fd5b5f60208284031215613fbe575f80fd5b61174282613f9f565b5f805f805f8060a08789031215613fdc575f80fd5b613fe587613d56565b9550602087013594506040870135935061400160608801613f9f565b925060808701356001600160401b0381111561401b575f80fd5b613e4189828a01613d6c565b5f805f60408486031215614039575f80fd5b61404284613d56565b925060208401356001600160401b0381111561405c575f80fd5b61406886828701613d6c565b9497909650939450505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b03811182821017156140b1576140b1614075565b604052919050565b5f6001600160401b038211156140d1576140d1614075565b50601f01601f191660200190565b5f805f606084860312156140f1575f80fd5b6140fa84613d56565b925060208401356001600160401b03811115614114575f80fd5b8401601f81018613614124575f80fd5b8035614137614132826140b9565b614089565b81815287602083850101111561414b575f80fd5b816020840160208301375f6020838301015280945050505061416f60408501613db0565b90509250925092565b5f60608284031215614188575f80fd5b50919050565b5f805f805f60a086880312156141a2575f80fd5b85356141ad81613ef2565b94506141bb60208701613d56565b9350604086013592506060860135915060808601356001600160401b038111156141e3575f80fd5b6141ef88828901614178565b9150509295509295909350565b5f6020828403121561420c575f80fd5b813561174281613ef2565b5f805f805f805f8060e0898b03121561422e575f80fd5b883561423981613ef2565b975061424760208a01613d56565b9650604089013595506060890135945060808901356001600160401b0380821115614270575f80fd5b61427c8c838d01613d6c565b909650945084915061429060a08c01613db0565b935060c08b01359150808211156142a5575f80fd5b506142b28b828c01614178565b9150509295985092959890939650565b5f80604083850312156142d3575f80fd5b6142dc83613d56565b91506142ea60208401613d56565b90509250929050565b5f805f805f805f805f60e08a8c03121561430b575f80fd5b6143148a613d56565b985060208a0135975060408a0135965060608a01356001600160401b038082111561433d575f80fd5b6143498d838e01613d6c565b909850965086915061435d60808d01613db0565b955061436b60a08d01613f9f565b945060c08c0135915080821115614380575f80fd5b5061438d8c828d01613d6c565b915080935050809150509295985092959850929598565b5f80604083850312156143b5575f80fd5b82356143c081613ef2565b91506142ea60208401613f9f565b5f805f805f608086880312156143e2575f80fd5b6143eb86613d56565b94506143f960208701613d56565b93506040860135925060608601356001600160401b0381111561441a575f80fd5b61442688828901613d6c565b969995985093965092949392505050565b5f8060408385031215614448575f80fd5b823561445381613ef2565b9150602083013561446381613ef2565b809150509250929050565b5f805f60608486031215614480575f80fd5b61448984613d56565b925061449760208501613d56565b9150604084013590509250925092565b5f80604083850312156144b8575f80fd5b50508035926020909101359150565b5f805f805f805f805f806101008b8d0312156144e1575f80fd5b6144ea8b613d56565b995060208b01356001600160401b0380821115614505575f80fd5b6145118e838f01613d6c565b909b50995089915061452560408e01613db0565b985060608d0135975060808d0135915061453e82613ef2565b90955060a08c0135945060c08c0135908082111561455a575f80fd5b506145678d828e01613d6c565b9150809450508092505060e08b013590509295989b9194979a5092959850565b5f805f806080858703121561459a575f80fd5b6145a385613d56565b93506145b160208601613d56565b925060408501356145c181613ef2565b9396929550929360600135925050565b600181811c908216806145e557607f821691505b60208210810361418857634e487b7160e01b5f52602260045260245ffd5b818382375f9101908152919050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610ed857610ed8614612565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b61ffff84168152604060208201525f61208f604083018486614639565b5f808335601e19843603018112614693575f80fd5b8301803591506001600160401b038211156146ac575f80fd5b602001915036819003821315613da9575f80fd5b81810381811115610ed857610ed8614612565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b601f8211156137f857805f5260205f20601f840160051c8101602085101561471e5750805b601f840160051c820191505b81811015610feb575f815560010161472a565b81516001600160401b0381111561475657614756614075565b61476a8161476484546145d1565b846146f9565b602080601f83116001811461479d575f84156147865750858301515b5f19600386901b1c1916600185901b178555611451565b5f85815260208120601f198616915b828110156147cb578886015182559484019460019091019084016147ac565b50858210156147e857878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f61ffff808816835280871660208401525084604083015260806060830152614825608083018486614639565b979650505050505050565b61ffff86168152608060208201525f61484d608083018688614639565b6001600160401b0394909416604083015250606001529392505050565b61ffff8916815260c060208201525f61488760c08301898b614639565b6001600160401b038816604084015286606084015285608084015282810360a08401526148b5818587614639565b9b9a5050505050505050505050565b6001600160401b038311156148db576148db614075565b6148ef836148e983546145d1565b836146f9565b5f601f841160018114614920575f85156149095750838201355b5f19600387901b1c1916600186901b178355610feb565b5f83815260208120601f198716915b8281101561494f578685013582556020948501946001909201910161492f565b508682101561496b575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b5f6020828403121561498d575f80fd5b81516001600160401b038111156149a2575f80fd5b8201601f810184136149b2575f80fd5b80516149c0614132826140b9565b8181528560208385010111156149d4575f80fd5b61208f826020830160208601613e7a565b61ffff85168152608060208201525f614a016080830186613e9c565b6001600160401b038516604084015282810360608401526148258185613e9c565b8082028115828204841417610ed857610ed8614612565b634e487b7160e01b5f52601260045260245ffd5b5f82614a5b57614a5b614a39565b500490565b5f60018201614a7157614a71614612565b5060010190565b61ffff861681526001600160a01b038516602082015260a0604082018190525f90614aa590830186613e9c565b84151560608401528281036080840152614abf8185613e9c565b98975050505050505050565b5f8060408385031215614adc575f80fd5b505080516020909101519092909150565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215614b11575f80fd5b815161174281613ef2565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b81811015614b6c5784516001600160a01b031683529383019391830191600101614b47565b50506001600160a01b03969096166060850152505050608001529392505050565b5f8251614b9e818460208701613e7a565b9190910192915050565b61ffff8616815260a060208201525f614bc460a0830187613e9c565b6001600160401b03861660408401528281036060840152614be58186613e9c565b90508281036080840152614abf8185613e9c565b5f61010061ffff8b168352806020840152614c168184018b613e9c565b6001600160401b038a166040850152606084018990526001600160a01b038816608085015260a0840187905283810360c08501529050614c568186613e9c565b9150508260e08301529998505050505050505050565b606081525f614c7e6060830186613e9c565b6001600160401b039490941660208301525060400152919050565b5f82614ca757614ca7614a39565b500690565b61ffff8716815260c060208201525f614cc860c0830188613e9c565b8281036040840152614cda8188613e9c565b6001600160a01b0387811660608601528616608085015283810360a08501529050614d058185613e9c565b9998505050505050505050565b60ff60f81b8760f81b1681528560018201525f6001600160401b0360c01b808760c01b166021840152856029840152808560c01b166049840152508251614d60816051850160208701613e7a565b9190910160510197965050505050505056fea264697066735822122096fd0f2cf9a5d2b7e91e5d46a4b40d687c2fce7cc5fd78a36d00bb1d5322762864736f6c63430008180033

Deployed Bytecode Sourcemap

86663:6525:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44189:842;;;;;;;;;;-1:-1:-1;44189:842:0;;;;;:::i;:::-;;:::i;:::-;;66453:213;;;;;;;;;;-1:-1:-1;66453:213:0;;;;;:::i;:::-;;:::i;:::-;;;2029:14:1;;2022:22;2004:41;;1992:2;1977:18;66453:213:0;;;;;;;;73364:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;47811:123::-;;;;;;;;;;-1:-1:-1;47811:123:0;;;;;:::i;:::-;;:::i;75724:201::-;;;;;;;;;;-1:-1:-1;75724:201:0;;;;;:::i;:::-;;:::i;49714:142::-;;;;;;;;;;-1:-1:-1;49714:142:0;;;;;:::i;:::-;;:::i;47942:129::-;;;;;;;;;;-1:-1:-1;47942:129:0;;;;;:::i;:::-;;:::i;74493:108::-;;;;;;;;;;-1:-1:-1;74581:12:0;;74493:108;;;3860:25:1;;;3848:2;3833:18;74493:108:0;3714:177:1;76505:261:0;;;;;;;;;;-1:-1:-1;76505:261:0;;;;;:::i;:::-;;:::i;87132:24::-;;;;;;;;;;-1:-1:-1;87132:24:0;;;;;;;-1:-1:-1;;;;;87132:24:0;;;;;;-1:-1:-1;;;;;4521:32:1;;;4503:51;;4491:2;4476:18;87132:24:0;4357:203:1;90933:554:0;;;;;;;;;;-1:-1:-1;90933:554:0;;;;;:::i;:::-;;:::i;92657:95::-;;;;;;;;;;-1:-1:-1;92657:95:0;;;;;:::i;:::-;;:::i;74335:93::-;;;;;;;;;;-1:-1:-1;74418:2:0;74335:93;;;5272:4:1;5260:17;;;5242:36;;5230:2;5215:18;74335:93:0;5100:184:1;66674:344:0;;;;;;;;;;-1:-1:-1;66674:344:0;;;;;:::i;:::-;;:::i;:::-;;;;6155:25:1;;;6211:2;6196:18;;6189:34;;;;6128:18;66674:344:0;5981:248:1;77175:238:0;;;;;;;;;;-1:-1:-1;77175:238:0;;;;;:::i;:::-;;:::i;92444:205::-;;;;;;;;;;-1:-1:-1;92444:205:0;;;;;:::i;:::-;;:::i;49954:250::-;;;;;;;;;;-1:-1:-1;49954:250:0;;;;;:::i;:::-;;:::i;43732:53::-;;;;;;;;;;-1:-1:-1;43732:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;48079:178;;;;;;;;;;-1:-1:-1;48079:178:0;;;;;:::i;:::-;;:::i;53794:37::-;;;;;;;;;;;;53830:1;53794:37;;87163:38;;;;;;;;;;;;;;;53860:33;;;;;;;;;;;;53892:1;53860:33;;86769:26;;;;;;;;;;;;;;;;87097;;;;;;;;;;-1:-1:-1;87097:26:0;;;;;;;;;;;50807:85;;;;;;;;;;-1:-1:-1;50807:85:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;92327:109;;;;;;;;;;-1:-1:-1;92327:109:0;;;;;:::i;:::-;;:::i;52130:389::-;;;;;;;;;;-1:-1:-1;52130:389:0;;;;;:::i;:::-;;:::i;65306:356::-;;;;;;:::i;:::-;;:::i;74664:127::-;;;;;;;;;;-1:-1:-1;74664:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;74765:18:0;74738:7;74765:18;;;:9;:18;;;;;;;74664:127;42307:103;;;;;;;;;;;;;:::i;43602:51::-;;;;;;;;;;-1:-1:-1;43602:51:0;;;;;:::i;:::-;;:::i;65670:586::-;;;;;;:::i;:::-;;:::i;53951:37::-;;;;;;;;;;;;;;;43660:65;;;;;;;;;;-1:-1:-1;43660:65:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;41666:87;;;;;;;;;;-1:-1:-1;41712:7:0;41739:6;-1:-1:-1;;;;;41739:6:0;41666:87;;85118:112;;;;;;;;;;;;;:::i;43792:23::-;;;;;;;;;;-1:-1:-1;43792:23:0;;;;-1:-1:-1;;;;;43792:23:0;;;73583:104;;;;;;;;;;;;;:::i;53997:83::-;;;;;;;;;;-1:-1:-1;53997:83:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48908:330;;;;;;;;;;-1:-1:-1;48908:330:0;;;;;:::i;:::-;;:::i;77916:436::-;;;;;;;;;;-1:-1:-1;77916:436:0;;;;;:::i;:::-;;:::i;67026:450::-;;;;;;;;;;-1:-1:-1;67026:450:0;;;;;:::i;:::-;;:::i;48619:281::-;;;;;;;;;;-1:-1:-1;48619:281:0;;;;;:::i;:::-;;:::i;91495:111::-;;;;;;;;;;-1:-1:-1;91495:111:0;;;;;:::i;:::-;;:::i;74997:193::-;;;;;;;;;;-1:-1:-1;74997:193:0;;;;;:::i;:::-;;:::i;92973:109::-;;;;;;;;;;-1:-1:-1;92973:109:0;;;;;:::i;:::-;;:::i;92760:205::-;;;;;;;;;;;;;:::i;43550:45::-;;;;;;;;;;;;;;;93090:95;;;;;;;;;;-1:-1:-1;93090:95:0;;;;;:::i;:::-;;:::i;49246:136::-;;;;;;;;;;-1:-1:-1;49246:136:0;;;;;:::i;:::-;;:::i;86926:19::-;;;;;;;;;;;;;;;;91995:167;;;;;;;;;;-1:-1:-1;91995:167:0;;;;;:::i;:::-;;:::i;92170:149::-;;;;;;;;;;-1:-1:-1;92170:149:0;;;;;:::i;:::-;;:::i;43486:55::-;;;;;;;;;;;;43536:5;43486:55;;47556:247;;;;;;;;;;-1:-1:-1;47556:247:0;;;;;:::i;:::-;;:::i;86802:27::-;;;;;;;;;;;;;;;;52748:810;;;;;;:::i;:::-;;:::i;75253:151::-;;;;;;;;;;-1:-1:-1;75253:151:0;;;;;:::i;:::-;;:::i;49390:262::-;;;;;;;;;;-1:-1:-1;49390:262:0;;;;;:::i;:::-;;:::i;91614:373::-;;;;;;;;;;-1:-1:-1;91614:373:0;;;;;:::i;:::-;;:::i;87210:51::-;;;;;;;;;;-1:-1:-1;87210:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;53900:42;;;;;;;;;;;;53941:1;53900:42;;55201:643;;;;;;;;;;-1:-1:-1;55201:643:0;;;;;:::i;:::-;;:::i;48404:207::-;;;;;;;;;;-1:-1:-1;48404:207:0;;;;;:::i;:::-;;:::i;42565:201::-;;;;;;;;;;-1:-1:-1;42565:201:0;;;;;:::i;:::-;;:::i;47241:254::-;;;;;;;;;;-1:-1:-1;47241:254:0;;;;;:::i;:::-;;:::i;85238:103::-;;;;;;;;;;-1:-1:-1;85328:4:0;85238:103;;44189:842;40297:10;44472;-1:-1:-1;;;;;44448:35:0;;44440:78;;;;-1:-1:-1;;;44440:78:0;;16142:2:1;44440:78:0;;;16124:21:1;16181:2;16161:18;;;16154:30;16220:32;16200:18;;;16193:60;16270:18;;44440:78:0;;;;;;;;;44560:32;;;44531:26;44560:32;;;:19;:32;;;;;44531:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44780:13;:20;44758:11;;:18;;:42;:70;;;;;44827:1;44804:13;:20;:24;44758:70;:124;;;;-1:-1:-1;44858:24:0;;;;;;44832:22;;;;44842:11;;;;44832:22;:::i;:::-;;;;;;;;:50;44758:124;44736:212;;;;-1:-1:-1;;;44736:212:0;;17162:2:1;44736:212:0;;;17144:21:1;17201:2;17181:18;;;17174:30;17240:34;17220:18;;;17213:62;-1:-1:-1;;;17291:18:1;;;17284:36;17337:19;;44736:212:0;16960:402:1;44736:212:0;44961:62;44980:11;44993;;44961:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44961:62:0;;;;;;;;;;;;;;;;;;;;;;45006:6;;-1:-1:-1;44961:62:0;-1:-1:-1;45014:8:0;;;;;;44961:62;;45014:8;;;;44961:62;;;;;;;;;-1:-1:-1;44961:18:0;;-1:-1:-1;;;44961:62:0:i;:::-;44363:668;44189:842;;;;;;:::o;66453:213::-;66555:4;-1:-1:-1;;;;;;66579:39:0;;-1:-1:-1;;;66579:39:0;;:79;;-1:-1:-1;;;;;;;;;;2738:40:0;;;66622:36;66572:86;66453:213;-1:-1:-1;;66453:213:0:o;73364:100::-;73418:13;73451:5;73444:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73364:100;:::o;47811:123::-;41552:13;:11;:13::i;:::-;47891:35:::1;::::0;-1:-1:-1;;;47891:35:0;;17541:6:1;17529:19;;47891:35:0::1;::::0;::::1;17511:38:1::0;47891:10:0::1;-1:-1:-1::0;;;;;47891:25:0::1;::::0;::::1;::::0;17484:18:1;;47891:35:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;47811:123:::0;:::o;75724:201::-;75807:4;40297:10;75863:32;40297:10;75879:7;75888:6;75863:8;:32::i;:::-;-1:-1:-1;75913:4:0;;75724:201;-1:-1:-1;;;75724:201:0:o;49714:142::-;41552:13;:11;:13::i;:::-;49805:35:::1;::::0;;::::1;;::::0;;;:22:::1;:35;::::0;;;;:43;49714:142::o;47942:129::-;41552:13;:11;:13::i;:::-;48025:38:::1;::::0;-1:-1:-1;;;48025:38:0;;17541:6:1;17529:19;;48025:38:0::1;::::0;::::1;17511::1::0;48025:10:0::1;-1:-1:-1::0;;;;;48025:28:0::1;::::0;::::1;::::0;17484:18:1;;48025:38:0::1;17367:188:1::0;76505:261:0;76602:4;40297:10;76660:38;76676:4;40297:10;76691:6;76660:15;:38::i;:::-;76709:27;76719:4;76725:2;76729:6;76709:9;:27::i;:::-;-1:-1:-1;76754:4:0;;76505:261;-1:-1:-1;;;;76505:261:0:o;90933:554::-;91001:6;90987:10;;:20;90983:497;;91033:2;91024:6;:11;;;91050:7;:12;90933:554;:::o;90983:497::-;91102:6;91084:10;;91097:1;91084:14;;;;:::i;:::-;:24;91080:400;;91134:2;91125:6;:11;;;91151:7;:12;90933:554;:::o;91080:400::-;91203:6;91185:10;;91198:1;91185:14;;;;:::i;:::-;:24;91181:299;;91235:2;91226:6;:11;;;91252:7;:12;90933:554;:::o;91181:299::-;91305:6;91286:10;;91299:2;91286:15;;;;:::i;:::-;:25;91282:198;;91337:2;91328:6;:11;;;91354:7;:12;90933:554;:::o;91282:198::-;91407:6;91388:10;;91401:2;91388:15;;;;:::i;:::-;:25;91384:96;;91439:2;91430:6;:11;;;91456:7;:12;91384:96;90933:554;:::o;92657:95::-;41552:13;:11;:13::i;:::-;92722:12:::1;:22:::0;;;::::1;;;;-1:-1:-1::0;;92722:22:0;;::::1;::::0;;;::::1;::::0;;92657:95::o;66674:344::-;66888:14;66904:11;66935:75;66952:11;66965:10;66977:7;66986;66995:14;;66935:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66935:16:0;;-1:-1:-1;;;66935:75:0:i;:::-;66928:82;;;;66674:344;;;;;;;;;:::o;77175:238::-;77263:4;40297:10;77319:64;40297:10;77335:7;77372:10;77344:25;40297:10;77335:7;77344:9;:25::i;:::-;:38;;;;:::i;:::-;77319:8;:64::i;92444:205::-;41552:13;:11;:13::i;:::-;92571:1:::1;92556:12;:16;92548:47;;;::::0;-1:-1:-1;;;92548:47:0;;18024:2:1;92548:47:0::1;::::0;::::1;18006:21:1::0;18063:2;18043:18;;;18036:30;-1:-1:-1;;;18082:18:1;;;18075:48;18140:18;;92548:47:0::1;17822:342:1::0;92548:47:0::1;92606:20;:35:::0;92444:205::o;49954:250::-;50096:32;;;50050:4;50096:32;;;:19;:32;;;;;50067:61;;50050:4;;50096:32;50067:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50184:11;;50174:22;;;;;;;:::i;:::-;;;;;;;;50156:13;50146:24;;;;;;:50;50139:57;;;49954:250;;;;;:::o;48079:178::-;41552:13;:11;:13::i;:::-;48194:55:::1;::::0;-1:-1:-1;;;48194:55:0;;-1:-1:-1;;;;;48194:10:0::1;:29;::::0;::::1;::::0;:55:::1;::::0;48224:11;;48237;;;;48194:55:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;92327:109:::0;41552:13;:11;:13::i;:::-;92404:11:::1;:24:::0;92327:109::o;52130:389::-;40297:10;52387:4;52363:29;52355:80;;;;-1:-1:-1;;;52355:80:0;;18973:2:1;52355:80:0;;;18955:21:1;19012:2;18992:18;;;18985:30;19051:34;19031:18;;;19024:62;-1:-1:-1;;;19102:18:1;;;19095:36;19148:19;;52355:80:0;18771:402:1;52355:80:0;52446:65;52468:11;52481;;52446:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52446:65:0;;;;;;;;;;;;;;;;;;;;;;52494:6;;-1:-1:-1;52446:65:0;-1:-1:-1;52502:8:0;;;;;;52446:65;;52502:8;;;;52446:65;;;;;;;;;-1:-1:-1;52446:21:0;;-1:-1:-1;;;52446:65:0:i;:::-;52130:389;;;;;;:::o;65306:356::-;65523:131;65529:5;65536:11;65549:10;65561:7;65570:25;;;;:11;:25;:::i;:::-;65597:29;;;;;;;;:::i;:::-;65628:25;;;;:11;:25;:::i;:::-;65523:131;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65523:5:0;;-1:-1:-1;;;65523:131:0:i;42307:103::-;41552:13;:11;:13::i;:::-;42372:30:::1;42399:1;42372:18;:30::i;:::-;42307:103::o:0;43602:51::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;65670:586::-;65956:292;65983:5;66003:11;66029:10;66054:7;66076:8;;65956:292;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66099:14:0;;-1:-1:-1;66128:25:0;;-1:-1:-1;;66128:25:0;;;:11;:25;:::i;:::-;66168:29;;;;;;;;:::i;:::-;66212:25;;;;:11;:25;:::i;:::-;65956:292;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65956:12:0;;-1:-1:-1;;;65956:292:0:i;:::-;;65670:586;;;;;;;;:::o;85118:112::-;85185:4;85209:13;74581:12;;;74493:108;85209:13;85202:20;;85118:112;:::o;73583:104::-;73639:13;73672:7;73665:14;;;;;:::i;48908:330::-;49032:35;;;49012:17;49032:35;;;:19;:35;;;;;49012:55;;48987:12;;49012:17;49032:35;49012:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49086:4;:11;49101:1;49086:16;49078:58;;;;-1:-1:-1;;;49078:58:0;;20166:2:1;49078:58:0;;;20148:21:1;20205:2;20185:18;;;20178:30;20244:31;20224:18;;;20217:59;20293:18;;49078:58:0;19964:353:1;49078:58:0;49154:31;49165:1;49182:2;49168:4;:11;:16;;;;:::i;:::-;49154:4;;:31;:10;:31::i;:::-;49147:38;48908:330;-1:-1:-1;;;48908:330:0:o;77916:436::-;78009:4;40297:10;78009:4;78092:25;40297:10;78109:7;78092:9;:25::i;:::-;78065:52;;78156:15;78136:16;:35;;78128:85;;;;-1:-1:-1;;;78128:85:0;;20657:2:1;78128:85:0;;;20639:21:1;20696:2;20676:18;;;20669:30;20735:34;20715:18;;;20708:62;-1:-1:-1;;;20786:18:1;;;20779:35;20831:19;;78128:85:0;20455:401:1;78128:85:0;78249:60;78258:5;78265:7;78293:15;78274:16;:34;78249:8;:60::i;67026:450::-;67313:14;67329:11;67360:108;67384:11;67397:10;67409:7;67418:8;;67360:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;67360:108:0;;;;;;;;;;;;;;;;;;;;;;67428:14;;-1:-1:-1;67444:7:0;;-1:-1:-1;67360:108:0;67453:14;;;;;;67360:108;;67453:14;;;;67360:108;;;;;;;;;-1:-1:-1;67360:23:0;;-1:-1:-1;;;67360:108:0:i;:::-;67353:115;;;;67026:450;;;;;;;;;;;;:::o;48619:281::-;41552:13;:11;:13::i;:::-;48791:14:::1;;48815:4;48774:47;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;48774:47:0;;::::1;::::0;;;;;;48736:35:::1;::::0;::::1;;::::0;;;:19:::1;48774:47;48736:35:::0;;;:85:::1;::::0;:35;:85:::1;:::i;:::-;;48837:55;48861:14;48877;;48837:55;;;;;;;;:::i;:::-;;;;;;;;48619:281:::0;;;:::o;91495:111::-;41552:13;:11;:13::i;:::-;91573:9:::1;:25:::0;;-1:-1:-1;;;;;91573:25:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;91573:25:0;;::::1;::::0;;;::::1;::::0;;91495:111::o;74997:193::-;75076:4;40297:10;75132:28;40297:10;75149:2;75153:6;75132:9;:28::i;92973:109::-;41552:13;:11;:13::i;:::-;93045::::1;:29:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;93045:29:0;;::::1;::::0;;;::::1;::::0;;92973:109::o;92760:205::-;41552:13;:11;:13::i;:::-;92825:14:::1;::::0;;;::::1;;;92824:15;92816:46;;;::::0;-1:-1:-1;;;92816:46:0;;23592:2:1;92816:46:0::1;::::0;::::1;23574:21:1::0;23631:2;23611:18;;;23604:30;-1:-1:-1;;;23650:18:1;;;23643:48;23708:18;;92816:46:0::1;23390:342:1::0;92816:46:0::1;92873:14;:21:::0;;92918:12:::1;92905:10;:25:::0;-1:-1:-1;;92941:16:0;;;;;92760:205::o;93090:95::-;41552:13;:11;:13::i;:::-;93157:20:::1;93169:7;93157:11;:20::i;49246:136::-:0;41552:13;:11;:13::i;:::-;49316:8:::1;:20:::0;;-1:-1:-1;;;;;;49316:20:0::1;-1:-1:-1::0;;;;;49316:20:0;::::1;::::0;;::::1;::::0;;;49352:22:::1;::::0;4503:51:1;;;49352:22:0::1;::::0;4491:2:1;4476:18;49352:22:0::1;;;;;;;49246:136:::0;:::o;91995:167::-;41552:13;:11;:13::i;:::-;-1:-1:-1;;;;;92111:29:0;;;::::1;;::::0;;;:19:::1;:29;::::0;;;;:43;;-1:-1:-1;;92111:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;91995:167::o;92170:149::-;41552:13;:11;:13::i;:::-;92275:15:::1;:36:::0;92170:149::o;47556:247::-;41552:13;:11;:13::i;:::-;47733:62:::1;::::0;-1:-1:-1;;;47733:62:0;;-1:-1:-1;;;;;47733:10:0::1;:20;::::0;::::1;::::0;:62:::1;::::0;47754:8;;47764;;47774:11;;47787:7;;;;47733:62:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;52748:810:::0;53002:27;;;52980:19;53002:27;;;:14;:27;;;;;;:40;;;;53030:11;;;;53002:40;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53002:48:0;;;;;;;;;;;;-1:-1:-1;53002:48:0;53061:73;;;;-1:-1:-1;;;53061:73:0;;24442:2:1;53061:73:0;;;24424:21:1;24481:2;24461:18;;;24454:30;24520:34;24500:18;;;24493:62;-1:-1:-1;;;24571:18:1;;;24564:33;24614:19;;53061:73:0;24240:399:1;53061:73:0;53176:11;53163:8;;53153:19;;;;;;;:::i;:::-;;;;;;;;:34;53145:80;;;;-1:-1:-1;;;53145:80:0;;24846:2:1;53145:80:0;;;24828:21:1;24885:2;24865:18;;;24858:30;24924:34;24904:18;;;24897:62;-1:-1:-1;;;24975:18:1;;;24968:31;25016:19;;53145:80:0;24644:397:1;53145:80:0;53273:27;;;53332:1;53273:27;;;:14;:27;;;;;;:40;;;;53301:11;;;;53273:40;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53273:48:0;;;;;;;;;;;;:61;;;;53403:65;;;;;;;;;;;;;;;;;;;53425:11;;53438;;53403:65;;;;;;53438:11;53403:65;;53438:11;53403:65;;;;;;;;;-1:-1:-1;;53403:65:0;;;;;;;;;;;;;;;;;;;;;;53451:6;;-1:-1:-1;53403:65:0;-1:-1:-1;53459:8:0;;;;;;53403:65;;53459:8;;;;53403:65;;;;;;;;;-1:-1:-1;53403:21:0;;-1:-1:-1;;;53403:65:0:i;:::-;53484:66;53504:11;53517;;53530:6;53538:11;53484:66;;;;;;;;;;:::i;:::-;;;;;;;;52924:634;52748:810;;;;;;:::o;75253:151::-;-1:-1:-1;;;;;75369:18:0;;;75342:7;75369:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;75253:151::o;49390:262::-;41552:13;:11;:13::i;:::-;49530:28:::1;::::0;;::::1;;::::0;;;:15:::1;:28;::::0;;;;;;;:41;;::::1;::::0;;;;;;;;;;:51;;;49597:47;;25767:34:1;;;25817:18;;25810:43;;;;25869:18;;;25862:34;;;49597:47:0::1;::::0;25730:2:1;25715:18;49597:47:0::1;25544:358:1::0;91614:373:0;41552:13;:11;:13::i;:::-;91792:2:::1;91771:17;:23;;:51;;;;;91820:2;91798:18;:24;;91771:51;91749:126;;;::::0;-1:-1:-1;;;91749:126:0;;26109:2:1;91749:126:0::1;::::0;::::1;26091:21:1::0;26148:2;26128:18;;;26121:30;26187:27;26167:18;;;26160:55;26232:18;;91749:126:0::1;25907:349:1::0;91749:126:0::1;91886:6;:26:::0;;;;91923:7:::1;:28:::0;91962:9:::1;:17:::0;;-1:-1:-1;;91962:17:0::1;::::0;;91614:373::o;55201:643::-;40297:10;55513:4;55489:29;55481:73;;;;-1:-1:-1;;;55481:73:0;;26463:2:1;55481:73:0;;;26445:21:1;26502:2;26482:18;;;26475:30;26541:33;26521:18;;;26514:61;26592:18;;55481:73:0;26261:355:1;55481:73:0;55594:42;55616:4;55623:3;55628:7;55594:13;:42::i;:::-;55584:52;;55682:3;-1:-1:-1;;;;;55652:43:0;55669:11;55652:43;;;55687:7;55652:43;;;;3860:25:1;;3848:2;3833:18;;3714:177;55652:43:0;;;;;;;;55725:111;;-1:-1:-1;;;55725:111:0;;-1:-1:-1;;;;;55725:33:0;;;;;55764:11;;55725:111;;55777:11;;55790;;;;55803:6;;55811:5;;55818:7;;55827:8;;;;55725:111;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55201:643;;;;;;;;;;:::o;48404:207::-;41552:13;:11;:13::i;:::-;48505:35:::1;::::0;::::1;;::::0;;;:19:::1;:35;::::0;;;;:43:::1;48543:5:::0;;48505:35;:43:::1;:::i;:::-;;48564:39;48581:14;48597:5;;48564:39;;;;;;;;:::i;42565:201::-:0;41552:13;:11;:13::i;:::-;-1:-1:-1;;;;;42654:22:0;::::1;42646:73;;;::::0;-1:-1:-1;;;42646:73:0;;28780:2:1;42646:73:0::1;::::0;::::1;28762:21:1::0;28819:2;28799:18;;;28792:30;28858:34;28838:18;;;28831:62;-1:-1:-1;;;28909:18:1;;;28902:36;28955:19;;42646:73:0::1;28578:402:1::0;42646:73:0::1;42730:28;42749:8;42730:18;:28::i;47241:254::-:0;47419:68;;-1:-1:-1;;;47419:68:0;;29222:6:1;29255:15;;;47419:68:0;;;29237:34:1;29307:15;;29287:18;;;29280:43;47468:4:0;29339:18:1;;;29332:60;29408:18;;;29401:34;;;47387:12:0;;47419:10;-1:-1:-1;;;;;47419:20:0;;;;29184:19:1;;47419:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;47419:68:0;;;;;;;;;;;;:::i;:::-;47412:75;47241:254;-1:-1:-1;;;;;47241:254:0:o;51176:563::-;51369:12;51383:19;51406:203;51454:9;51478:3;51519:34;;;51555:11;51568;51581:6;51589:8;51496:102;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;51496:102:0;;;;;;;;;;;;;;-1:-1:-1;;;;;51496:102:0;-1:-1:-1;;;;;;51496:102:0;;;;;;;;;;51414:4;;51406:203;;:33;:203::i;:::-;51368:241;;;;51625:7;51620:112;;51649:71;51669:11;51682;51695:6;51703:8;51713:6;51649:19;:71::i;41831:132::-;41712:7;41739:6;-1:-1:-1;;;;;41739:6:0;40297:10;41895:23;41887:68;;;;-1:-1:-1;;;41887:68:0;;30862:2:1;41887:68:0;;;30844:21:1;;;30881:18;;;30874:30;30940:34;30920:18;;;30913:62;30992:18;;41887:68:0;30660:356:1;81909:346:0;-1:-1:-1;;;;;82011:19:0;;82003:68;;;;-1:-1:-1;;;82003:68:0;;31223:2:1;82003:68:0;;;31205:21:1;31262:2;31242:18;;;31235:30;31301:34;31281:18;;;31274:62;-1:-1:-1;;;31352:18:1;;;31345:34;31396:19;;82003:68:0;31021:400:1;82003:68:0;-1:-1:-1;;;;;82090:21:0;;82082:68;;;;-1:-1:-1;;;82082:68:0;;31628:2:1;82082:68:0;;;31610:21:1;31667:2;31647:18;;;31640:30;31706:34;31686:18;;;31679:62;-1:-1:-1;;;31757:18:1;;;31750:32;31799:19;;82082:68:0;31426:398:1;82082:68:0;-1:-1:-1;;;;;82163:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;82215:32;;3860:25:1;;;82215:32:0;;3833:18:1;82215:32:0;;;;;;;81909:346;;;:::o;82546:419::-;82647:24;82674:25;82684:5;82691:7;82674:9;:25::i;:::-;82647:52;;-1:-1:-1;;82714:16:0;:37;82710:248;;82796:6;82776:16;:26;;82768:68;;;;-1:-1:-1;;;82768:68:0;;32031:2:1;82768:68:0;;;32013:21:1;32070:2;32050:18;;;32043:30;32109:31;32089:18;;;32082:59;32158:18;;82768:68:0;31829:353:1;82768:68:0;82880:51;82889:5;82896:7;82924:6;82905:16;:25;82880:8;:51::i;:::-;82636:329;82546:419;;;:::o;88466:1778::-;88607:1;88598:6;:10;88590:61;;;;-1:-1:-1;;;88590:61:0;;32389:2:1;88590:61:0;;;32371:21:1;32428:2;32408:18;;;32401:30;32467:34;32447:18;;;32440:62;-1:-1:-1;;;32518:18:1;;;32511:36;32564:19;;88590:61:0;32187:402:1;88590:61:0;88669:14;;;;;;;88664:115;;41712:7;41739:6;-1:-1:-1;;;;;88708:15:0;;;41739:6;;88708:15;;:32;;-1:-1:-1;41712:7:0;41739:6;-1:-1:-1;;;;;88727:13:0;;;41739:6;;88727:13;88708:32;88700:67;;;;-1:-1:-1;;;88700:67:0;;32796:2:1;88700:67:0;;;32778:21:1;32835:2;32815:18;;;32808:30;-1:-1:-1;;;32854:18:1;;;32847:52;32916:18;;88700:67:0;32594:346:1;88700:67:0;88825:9;;88791:17;;88825:9;;88821:62;;;88851:20;88858:12;88851:6;:20::i;:::-;88907:13;-1:-1:-1;;;;;88899:21:0;:4;-1:-1:-1;;;;;88899:21:0;;:49;;;;-1:-1:-1;;;;;;88925:23:0;;;;;;:19;:23;;;;;;;;88924:24;88899:49;88895:395;;;89017:15;;89007:6;88991:13;89001:2;-1:-1:-1;;;;;74765:18:0;74738:7;74765:18;;;:9;:18;;;;;;;74664:127;88991:13;:22;;;;:::i;:::-;:41;;88965:123;;;;-1:-1:-1;;;88965:123:0;;33147:2:1;88965:123:0;;;33129:21:1;33186:2;33166:18;;;33159:30;-1:-1:-1;;;33205:18:1;;;33198:50;33265:18;;88965:123:0;32945:344:1;88965:123:0;89121:11;;89111:6;:21;;89103:50;;;;-1:-1:-1;;;89103:50:0;;33496:2:1;89103:50:0;;;33478:21:1;33535:2;33515:18;;;33508:30;-1:-1:-1;;;33554:18:1;;;33547:46;33610:18;;89103:50:0;33294:340:1;89103:50:0;89172:12;;;;;;;89168:88;;;89237:3;89227:6;;89218;:15;;;;:::i;:::-;89217:23;;;;:::i;:::-;89205:35;;89168:88;89272:4;:6;;;:4;:6;;;:::i;:::-;;;;;;88895:395;89312:13;-1:-1:-1;;;;;89306:19:0;:2;-1:-1:-1;;;;;89306:19:0;;:49;;;;-1:-1:-1;;;;;;89330:25:0;;;;;;:19;:25;;;;;;;;89329:26;89306:49;89302:235;;;89390:11;;89380:6;:21;;89372:50;;;;-1:-1:-1;;;89372:50:0;;33496:2:1;89372:50:0;;;33478:21:1;33535:2;33515:18;;;33508:30;-1:-1:-1;;;33554:18:1;;;33547:46;33610:18;;89372:50:0;33294:340:1;89372:50:0;89441:12;;;;;;;89437:89;;;89507:3;89496:7;;89487:6;:16;;;;:::i;:::-;89486:24;;;;:::i;:::-;89474:36;;89437:89;89598:4;89549:28;74765:18;;;:9;:18;;;;;;89668:20;;89644:44;;;;;;;89719:49;;-1:-1:-1;89756:12:0;;;;;;;89755:13;89719:49;:87;;;;;89793:13;-1:-1:-1;;;;;89785:21:0;:4;-1:-1:-1;;;;;89785:21:0;;;89719:87;:130;;;;-1:-1:-1;;;;;;89824:25:0;;;;;;:19;:25;;;;;;;;89823:26;89719:130;:169;;;;;89873:15;;89866:4;;:22;89719:169;89701:259;;;89915:33;89927:20;;89915:11;:33::i;:::-;89976:13;;89972:265;;90006:18;90027;90036:9;90027:6;:18;:::i;:::-;90006:39;;90060:47;90076:4;90090;90097:9;90060:15;:47::i;:::-;90122:37;90138:4;90144:2;90148:10;90122:15;:37::i;:::-;89991:180;89972:265;;;90192:33;90208:4;90214:2;90218:6;90192:15;:33::i;56038:471::-;56244:14;56260:11;56328:20;56351:47;56370:10;56382:15;56389:7;56382:6;:15::i;:::-;62727:48;;;53892:1;62727:48;;;40646:49:1;40711:11;;;40704:27;;;;40787:3;40765:16;;;;-1:-1:-1;;;;;;40761:51:1;40747:12;;;40740:73;62727:48:0;;;;;;;;;40829:12:1;;;;62727:48:0;;;62598:185;56351:47;56416:85;;-1:-1:-1;;;56416:85:0;;56328:70;;-1:-1:-1;;;;;;56416:10:0;:23;;;;:85;;56440:11;;56461:4;;56328:70;;56477:7;;56486:14;;56416:85;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56409:92;;;;;56038:471;;;;;;;;:::o;57115:558::-;57310:16;57329:19;:8;57310:16;57329;:19::i;:::-;57310:38;-1:-1:-1;57365:21:0;;;57361:305;;57403:52;57412:11;57425;57438:6;57446:8;57403;:52::i;:::-;57361:305;;;-1:-1:-1;;57477:30:0;;;;57473:193;;57524:59;57540:11;57553;57566:6;57574:8;57524:15;:59::i;57473:193::-;57616:38;;-1:-1:-1;;;57616:38:0;;35308:2:1;57616:38:0;;;35290:21:1;35347:2;35327:18;;;35320:30;35386;35366:18;;;35359:58;35434:18;;57616:38:0;35106:352:1;57681:840:0;57950:11;57974:66;57989:11;57950;58011:14;57950:11;57974:14;:66::i;:::-;58066:20;58078:7;58066:11;:20::i;:::-;-1:-1:-1;58053:33:0;-1:-1:-1;58106:50:0;58117:5;58124:11;58137:10;58053:33;58106:10;:50::i;:::-;58097:59;;58224:1;58215:6;:10;58207:48;;;;-1:-1:-1;;;58207:48:0;;35665:2:1;58207:48:0;;;35647:21:1;35704:2;35684:18;;;35677:30;-1:-1:-1;;;35723:18:1;;;35716:55;35788:18;;58207:48:0;35463:349:1;58207:48:0;58268:22;58293:46;58312:10;58324:14;58331:6;58324;:14::i;58293:46::-;58268:71;;58350:94;58358:11;58371:9;58382:14;58398:18;58418:14;58434:9;58350:7;:94::i;:::-;58494:10;58487:5;-1:-1:-1;;;;;58462:51:0;58474:11;58462:51;;;58506:6;58462:51;;;;3860:25:1;;3848:2;3833:18;;3714:177;58462:51:0;;;;;;;;57963:558;57681:840;;;;;;;;;:::o;42926:191::-;43000:16;43019:6;;-1:-1:-1;;;;;43036:17:0;;;-1:-1:-1;;;;;;43036:17:0;;;;;;43069:40;;43019:6;;;;;;;43069:40;;43000:16;43069:40;42989:128;42926:191;:::o;58994:995::-;59334:11;59358:77;59373:11;53941:1;59404:14;-1:-1:-1;;;;;59358:77:0;;:14;:77::i;:::-;59461:20;59473:7;59461:11;:20::i;:::-;-1:-1:-1;59448:33:0;-1:-1:-1;59501:50:0;59512:5;59519:11;59532:10;59448:33;59501:10;:50::i;:::-;59492:59;;59579:1;59570:6;:10;59562:48;;;;-1:-1:-1;;;59562:48:0;;35665:2:1;59562:48:0;;;35647:21:1;35704:2;35684:18;;;35677:30;-1:-1:-1;;;35723:18:1;;;35716:55;35788:18;;59562:48:0;35463:349:1;59562:48:0;59691:22;59716:91;59742:10;59754;59766:14;59773:6;59766;:14::i;:::-;59782:8;59792:14;59716:25;:91::i;:::-;59691:116;;59818:94;59826:11;59839:9;59850:14;59866:18;59886:14;59902:9;59818:7;:94::i;:::-;59962:10;59955:5;-1:-1:-1;;;;;59930:51:0;59942:11;59930:51;;;59974:6;59930:51;;;;3860:25:1;;3848:2;3833:18;;3714:177;59930:51:0;;;;;;;;59347:642;58994:995;;;;;;;;;;;:::o;21351:2833::-;21471:12;21520:7;21504:12;21520:7;21514:2;21504:12;:::i;:::-;:23;;21496:50;;;;-1:-1:-1;;;21496:50:0;;36019:2:1;21496:50:0;;;36001:21:1;36058:2;36038:18;;;36031:30;-1:-1:-1;;;36077:18:1;;;36070:44;36131:18;;21496:50:0;35817:338:1;21496:50:0;21582:16;21591:7;21582:6;:16;:::i;:::-;21565:6;:13;:33;;21557:63;;;;-1:-1:-1;;;21557:63:0;;36362:2:1;21557:63:0;;;36344:21:1;36401:2;36381:18;;;36374:30;-1:-1:-1;;;36420:18:1;;;36413:47;36477:18;;21557:63:0;36160:341:1;21557:63:0;21633:22;21699:15;;21728:2005;;;;23877:4;23871:11;23858:24;;24066:1;24055:9;24048:20;24116:4;24105:9;24101:20;24095:4;24088:34;21692:2445;;21728:2005;21913:4;21907:11;21894:24;;22582:2;22573:7;22569:16;22970:9;22963:17;22957:4;22953:28;22941:9;22930;22926:25;22922:60;23019:7;23015:2;23011:16;23276:6;23262:9;23255:17;23249:4;23245:28;23233:9;23225:6;23221:22;23217:57;23213:70;23047:434;23310:3;23306:2;23303:11;23047:434;;;23452:9;;23441:21;;23352:4;23344:13;;;;23385;23047:434;;;-1:-1:-1;;23501:26:0;;;23713:2;23696:11;-1:-1:-1;;23692:25:0;23686:4;23679:39;-1:-1:-1;21692:2445:0;-1:-1:-1;24167:9:0;21351:2833;-1:-1:-1;;;;21351:2833:0:o;56517:590::-;56794:14;56810:11;56881:20;56904:92;56930:10;56942;56954:15;56961:7;56954:6;:15::i;56904:92::-;57014:85;;-1:-1:-1;;;57014:85:0;;56881:115;;-1:-1:-1;;;;;;57014:10:0;:23;;;;:85;;57038:11;;57059:4;;56881:115;;57075:7;;57084:14;;57014:85;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57007:92;;;;;56517:590;;;;;;;;;;:::o;90252:673::-;87304:12;:19;;-1:-1:-1;;87304:19:0;;;;;90420:16:::1;::::0;;90434:1:::1;90420:16:::0;;;;;::::1;::::0;;-1:-1:-1;;90420:16:0::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;90420:16:0::1;90396:40;;90465:4;90447;90452:1;90447:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1::0;;;;;90447:23:0::1;;;-1:-1:-1::0;;;;;90447:23:0::1;;;::::0;::::1;90491:15;-1:-1:-1::0;;;;;90491:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;90481:4;90486:1;90481:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1::0;;;;;90481:32:0::1;;;-1:-1:-1::0;;;;;90481:32:0::1;;;::::0;::::1;90526:122;90557:4;90585:15;90616:21;90526:8;:122::i;:::-;90867:9;::::0;90687:230:::1;::::0;-1:-1:-1;;;90687:230:0;;-1:-1:-1;;;;;90687:15:0::1;:66:::0;::::1;::::0;::::1;::::0;:230:::1;::::0;90768:21;;90804:1:::1;::::0;90848:4;;90867:9;;;::::1;::::0;;::::1;::::0;90891:15:::1;::::0;90687:230:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;87346:12:0;:20;;-1:-1:-1;;87346:20:0;;;-1:-1:-1;;;;90252:673:0:o;86086:425::-;86220:4;40297:10;86370:4;-1:-1:-1;;;;;86353:22:0;;;;;;:42;;;86388:7;-1:-1:-1;;;;;86379:16:0;:5;-1:-1:-1;;;;;86379:16:0;;;86353:42;86349:88;;;86397:40;86413:5;86420:7;86429;86397:15;:40::i;:::-;86448:30;86458:5;86465:3;86470:7;86448:9;:30::i;:::-;-1:-1:-1;86496:7:0;;86086:425;-1:-1:-1;;;86086:425:0:o;6576:1309::-;6735:4;6741:12;6803;6826:13;6850:24;6887:8;6877:19;;-1:-1:-1;;;;;6877:19:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6877:19:0;;6850:46;;7406:1;7376;7338:9;7332:16;7299:4;7288:9;7284:20;7249:1;7210:7;7180:4;7157:275;7145:287;;7501:16;7490:27;;7546:8;7537:7;7534:21;7531:78;;;7586:8;7575:19;;7531:78;7696:7;7683:11;7676:28;7818:7;7815:1;7808:4;7795:11;7791:22;7776:50;7855:8;;;;-1:-1:-1;6576:1309:0;-1:-1:-1;;;;;;6576:1309:0:o;51747:375::-;52023:8;52013:19;;;;;;51962:14;:27;51977:11;51962:27;;;;;;;;;;;;;;;51990:11;51962:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51962:48:0;;;;;;;;;:70;;;;52048:66;;;;52062:11;;52075;;52003:6;;52096:8;;52106:7;;52048:66;:::i;:::-;;;;;;;;51747:375;;;;;:::o;78822:806::-;-1:-1:-1;;;;;78919:18:0;;78911:68;;;;-1:-1:-1;;;78911:68:0;;39097:2:1;78911:68:0;;;39079:21:1;39136:2;39116:18;;;39109:30;39175:34;39155:18;;;39148:62;-1:-1:-1;;;39226:18:1;;;39219:35;39271:19;;78911:68:0;38895:401:1;78911:68:0;-1:-1:-1;;;;;78998:16:0;;78990:64;;;;-1:-1:-1;;;78990:64:0;;39503:2:1;78990:64:0;;;39485:21:1;39542:2;39522:18;;;39515:30;39581:34;39561:18;;;39554:62;-1:-1:-1;;;39632:18:1;;;39625:33;39675:19;;78990:64:0;39301:399:1;78990:64:0;-1:-1:-1;;;;;79140:15:0;;79118:19;79140:15;;;:9;:15;;;;;;79174:21;;;;79166:72;;;;-1:-1:-1;;;79166:72:0;;39907:2:1;79166:72:0;;;39889:21:1;39946:2;39926:18;;;39919:30;39985:34;39965:18;;;39958:62;-1:-1:-1;;;40036:18:1;;;40029:36;40082:19;;79166:72:0;39705:402:1;79166:72:0;-1:-1:-1;;;;;79274:15:0;;;;;;;:9;:15;;;;;;79292:20;;;79274:38;;79492:13;;;;;;;;;;:23;;;;;;79544:26;;;;;;79306:6;3860:25:1;;3848:2;3833:18;;3714:177;79544:26:0;;;;;;;;79583:37;83565:91;62033:238;62094:6;;62129:22;86605:9;62129:7;:22;:::i;:::-;62113:38;-1:-1:-1;;;;;;62170:28:0;;;62162:67;;;;-1:-1:-1;;;62162:67:0;;40314:2:1;62162:67:0;;;40296:21:1;40353:2;40333:18;;;40326:30;40392:28;40372:18;;;40365:56;40438:18;;62162:67:0;40112:350:1;24560:307:0;24634:5;24677:10;:6;24686:1;24677:10;:::i;:::-;24660:6;:13;:27;;24652:59;;;;-1:-1:-1;;;24652:59:0;;41054:2:1;24652:59:0;;;41036:21:1;41093:2;41073:18;;;41066:30;-1:-1:-1;;;41112:18:1;;;41105:49;41171:18;;24652:59:0;40852:343:1;24652:59:0;-1:-1:-1;24791:29:0;24807:3;24791:29;24785:36;;24560:307::o;58529:457::-;58684:10;58696:15;58715:28;58734:8;58715:18;:28::i;:::-;58683:60;;-1:-1:-1;58683:60:0;-1:-1:-1;;;;;;58758:16:0;;58754:69;;58804:6;58791:20;;58754:69;58835:11;58849:16;58856:8;58849:6;:16::i;:::-;58835:30;;58885:34;58895:11;58908:2;58912:6;58885:9;:34::i;:::-;58876:43;;58967:2;-1:-1:-1;;;;;58937:41:0;58954:11;58937:41;;;58971:6;58937:41;;;;3860:25:1;;3848:2;3833:18;;3714:177;58937:41:0;;;;;;;;58672:314;;;58529:457;;;;:::o;59997:1902::-;60178:12;60192:10;60204:15;60221:27;60250:17;60271:35;60297:8;60271:25;:35::i;:::-;60177:129;;;;;;;;;;60319:13;60335:15;:28;60351:11;60335:28;;;;;;;;;;;;;;;60364:11;60335:41;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;60335:49:0;;;;;;;;;;;;;;-1:-1:-1;60409:16:0;60416:8;60409:6;:16::i;:::-;60395:30;;60553:8;60548:167;;60587:45;60597:11;60618:4;60625:6;60587:9;:45::i;:::-;60647:28;;;;;;;:15;:28;;;;;;;:41;;60578:54;;-1:-1:-1;60699:4:0;;60647:41;;60676:11;;60647:41;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;60647:49:0;;;;;;;;;;:56;;-1:-1:-1;;60647:56:0;;;;;;;;;;60548:167;-1:-1:-1;;;;;61993:20:0;;;60727:97;;60769:22;;-1:-1:-1;;;;;4521:32:1;;4503:51;;60769:22:0;;4491:2:1;4476:18;60769:22:0;;;;;;;60806:7;;;;;;;;;60727:97;60898:11;60946;60983:6;61023:8;61058:4;61087:2;61115:6;61163:14;60878:17;61248:8;:33;;61271:10;-1:-1:-1;;;;;61248:33:0;;;;61259:9;61248:33;61237:44;;61293:12;61307:19;61330:230;61378:9;61402:3;61443:31;;;61476:10;61488;61500:5;61507;61514:3;61519:7;61528:15;61545:3;61420:129;;;;;;;;;;;;;;;:::i;61330:230::-;61292:268;;;;61577:7;61573:319;;;61616:18;;;;;;61654:59;;;;;;;;;;61689:10;;61701:5;;61616:18;;61654:59;:::i;:::-;;;;;;;;61586:139;61573:319;;;61813:67;61833:10;61845;61857:5;61864:7;61873:6;61813:19;:67::i;:::-;60166:1733;;;;;;;;;;;;;;;;;;59997:1902;;;;:::o;45984:463::-;46163:21;46187:28;46200:14;46187:12;:28::i;:::-;46245;;;;46226:16;46245:28;;;:15;:28;;;;;;;;:35;;;;;;;;;;46163:52;;-1:-1:-1;46299:15:0;46291:54;;;;-1:-1:-1;;;46291:54:0;;42686:2:1;46291:54:0;;;42668:21:1;42725:2;42705:18;;;42698:30;42764:28;42744:18;;;42737:56;42810:18;;46291:54:0;42484:350:1;46291:54:0;46384:23;46398:9;46384:11;:23;:::i;:::-;46364:16;:43;;46356:83;;;;-1:-1:-1;;;46356:83:0;;43041:2:1;46356:83:0;;;43023:21:1;43080:2;43060:18;;;43053:30;43119:29;43099:18;;;43092:57;43166:18;;46356:83:0;42839:351:1;62408:182:0;62474:16;;62521:22;86605:9;62521:7;:22;:::i;:::-;62514:29;-1:-1:-1;62568:14:0;62514:29;62568:7;:14;:::i;:::-;62554:28;;62408:182;;;:::o;85535:329::-;85679:4;40297:10;-1:-1:-1;;;;;85741:16:0;;;;85737:62;;85759:40;85775:5;85782:7;85791;85759:15;:40::i;:::-;85810:21;85816:5;85823:7;85810:5;:21::i;:::-;-1:-1:-1;85849:7:0;;85535:329;-1:-1:-1;;;;85535:329:0:o;45362:614::-;45646:32;;;45617:26;45646:32;;;:19;:32;;;;;45617:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45697:13;:20;45721:1;45697:25;45689:86;;;;-1:-1:-1;;;45689:86:0;;43514:2:1;45689:86:0;;;43496:21:1;43553:2;43533:18;;;43526:30;43592:34;43572:18;;;43565:62;-1:-1:-1;;;43643:18:1;;;43636:46;43699:19;;45689:86:0;43312:412:1;45689:86:0;45786:47;45804:11;45817:8;:15;45786:17;:47::i;:::-;45844:124;;-1:-1:-1;;;45844:124:0;;-1:-1:-1;;;;;45844:10:0;:15;;;;45867:10;;45844:124;;45879:11;;45892:13;;45907:8;;45917:14;;45933:18;;45953:14;;45844:124;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45606:370;45362:614;;;;;;:::o;63142:366::-;63359:12;53941:1;63426:10;63438:9;-1:-1:-1;;;;;64293:23:0;;63475:14;63491:8;63391:109;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63384:116;;63142:366;;;;;;;:::o;83565:91::-;;;;:::o;62791:343::-;62873:10;;;62921:19;:8;62873:10;62921:16;:19::i;:::-;:30;;;:55;;;;;62955:8;:15;62974:2;62955:21;62921:55;62913:92;;;;-1:-1:-1;;;62913:92:0;;45508:2:1;62913:92:0;;;45490:21:1;45547:2;45527:18;;;45520:30;-1:-1:-1;;;45566:18:1;;;45559:54;45630:18;;62913:92:0;45306:348:1;62913:92:0;63023:22;:8;63042:2;63023:18;:22::i;:::-;63018:27;-1:-1:-1;63105:21:0;:8;63123:2;63105:17;:21::i;:::-;63094:32;;62791:343;;;:::o;62279:121::-;62344:4;62368:24;86605:9;-1:-1:-1;;;;;62368:24:0;;;:::i;85872:206::-;86002:4;86019:26;86025:10;86037:7;86019:5;:26::i;:::-;-1:-1:-1;86063:7:0;85872:206;-1:-1:-1;;85872:206:0:o;63516:658::-;63655:12;;;63737:20;63655:12;53941:1;63828:19;:8;63655:12;63828:16;:19::i;:::-;:39;;;63820:76;;;;-1:-1:-1;;;63820:76:0;;45508:2:1;63820:76:0;;;45490:21:1;45547:2;45527:18;;;45520:30;-1:-1:-1;;;45566:18:1;;;45559:54;45630:18;;63820:76:0;45306:348:1;63820:76:0;63914:22;:8;63933:2;63914:18;:22::i;:::-;63909:27;-1:-1:-1;63996:21:0;:8;64014:2;63996:17;:21::i;:::-;63985:32;-1:-1:-1;64035:22:0;:8;64054:2;64035:18;:22::i;:::-;64028:29;-1:-1:-1;64084:21:0;:8;64102:2;64084:17;:21::i;:::-;64068:37;;64126:40;64141:2;64163;64145:8;:15;:20;;;;:::i;:::-;64126:8;;:40;:14;:40::i;:::-;64116:50;;63516:658;;;;;;;:::o;46455:271::-;46537:13;46596:2;46571:14;:21;:27;;46563:68;;;;-1:-1:-1;;;46563:68:0;;45861:2:1;46563:68:0;;;45843:21:1;45900:2;45880:18;;;45873:30;45939;45919:18;;;45912:58;45987:18;;46563:68:0;45659:352:1;46563:68:0;-1:-1:-1;46704:2:0;46684:23;46678:30;;46455:271::o;80796:675::-;-1:-1:-1;;;;;80880:21:0;;80872:67;;;;-1:-1:-1;;;80872:67:0;;46218:2:1;80872:67:0;;;46200:21:1;46257:2;46237:18;;;46230:30;46296:34;46276:18;;;46269:62;-1:-1:-1;;;46347:18:1;;;46340:31;46388:19;;80872:67:0;46016:397:1;80872:67:0;-1:-1:-1;;;;;81039:18:0;;81014:22;81039:18;;;:9;:18;;;;;;81076:24;;;;81068:71;;;;-1:-1:-1;;;81068:71:0;;46620:2:1;81068:71:0;;;46602:21:1;46659:2;46639:18;;;46632:30;46698:34;46678:18;;;46671:62;-1:-1:-1;;;46749:18:1;;;46742:32;46791:19;;81068:71:0;46418:398:1;81068:71:0;-1:-1:-1;;;;;81175:18:0;;;;;;:9;:18;;;;;;;;81196:23;;;81175:44;;81314:12;:22;;;;;;;81365:37;3860:25:1;;;81175:18:0;;;81365:37;;3833:18:1;81365:37:0;;;;;;;83565:91;;;:::o;46734:402::-;46857:35;;;46833:21;46857:35;;;:22;:35;;;;;;;46907:21;;;46903:138;;-1:-1:-1;43536:5:0;46903:138;47075:16;47059:12;:32;;47051:77;;;;-1:-1:-1;;;47051:77:0;;47023:2:1;47051:77:0;;;47005:21:1;;;47042:18;;;47035:30;47101:34;47081:18;;;47074:62;47153:18;;47051:77:0;46821:356:1;24192:360:0;24268:7;24313:11;:6;24322:2;24313:11;:::i;:::-;24296:6;:13;:28;;24288:62;;;;-1:-1:-1;;;24288:62:0;;47384:2:1;24288:62:0;;;47366:21:1;47423:2;47403:18;;;47396:30;-1:-1:-1;;;47442:18:1;;;47435:51;47503:18;;24288:62:0;47182:345:1;24288:62:0;-1:-1:-1;24442:30:0;24458:4;24442:30;24436:37;-1:-1:-1;;;24432:71:0;;;24192:360::o;25513:311::-;25588:6;25632:10;:6;25641:1;25632:10;:::i;:::-;25615:6;:13;:27;;25607:60;;;;-1:-1:-1;;;25607:60:0;;47734:2:1;25607:60:0;;;47716:21:1;47773:2;47753:18;;;47746:30;-1:-1:-1;;;47792:18:1;;;47785:50;47852:18;;25607:60:0;47532:344:1;25607:60:0;-1:-1:-1;25748:29:0;25764:3;25748:29;25742:36;;25513:311::o;79915:548::-;-1:-1:-1;;;;;79999:21:0;;79991:65;;;;-1:-1:-1;;;79991:65:0;;48083:2:1;79991:65:0;;;48065:21:1;48122:2;48102:18;;;48095:30;48161:33;48141:18;;;48134:61;48212:18;;79991:65:0;47881:355:1;79991:65:0;80147:6;80131:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;80302:18:0;;;;;;:9;:18;;;;;;;;:28;;;;;;80357:37;3860:25:1;;;80357:37:0;;3833:18:1;80357:37:0;;;;;;;79915:548;;:::o;26796:326::-;26872:7;26917:11;:6;26926:2;26917:11;:::i;:::-;26900:6;:13;:28;;26892:62;;;;-1:-1:-1;;;26892:62:0;;48443:2:1;26892:62:0;;;48425:21:1;48482:2;48462:18;;;48455:30;-1:-1:-1;;;48501:18:1;;;48494:51;48562:18;;26892:62:0;48241:345:1;26892:62:0;-1:-1:-1;27042:30:0;27058:4;27042:30;27036:37;;26796:326::o;14:159:1:-;81:20;;141:6;130:18;;120:29;;110:57;;163:1;160;153:12;110:57;14:159;;;:::o;178:347::-;229:8;239:6;293:3;286:4;278:6;274:17;270:27;260:55;;311:1;308;301:12;260:55;-1:-1:-1;334:20:1;;-1:-1:-1;;;;;366:30:1;;363:50;;;409:1;406;399:12;363:50;446:4;438:6;434:17;422:29;;498:3;491:4;482:6;474;470:19;466:30;463:39;460:59;;;515:1;512;505:12;460:59;178:347;;;;;:::o;530:171::-;597:20;;-1:-1:-1;;;;;646:30:1;;636:41;;626:69;;691:1;688;681:12;706:862;812:6;820;828;836;844;852;905:3;893:9;884:7;880:23;876:33;873:53;;;922:1;919;912:12;873:53;945:28;963:9;945:28;:::i;:::-;935:38;;1024:2;1013:9;1009:18;996:32;-1:-1:-1;;;;;1088:2:1;1080:6;1077:14;1074:34;;;1104:1;1101;1094:12;1074:34;1143:58;1193:7;1184:6;1173:9;1169:22;1143:58;:::i;:::-;1220:8;;-1:-1:-1;1117:84:1;-1:-1:-1;1117:84:1;;-1:-1:-1;1274:37:1;1307:2;1292:18;;1274:37;:::i;:::-;1264:47;;1364:2;1353:9;1349:18;1336:32;1320:48;;1393:2;1383:8;1380:16;1377:36;;;1409:1;1406;1399:12;1377:36;;1448:60;1500:7;1489:8;1478:9;1474:24;1448:60;:::i;:::-;706:862;;;;-1:-1:-1;706:862:1;;-1:-1:-1;706:862:1;;1527:8;;706:862;-1:-1:-1;;;706:862:1:o;1573:286::-;1631:6;1684:2;1672:9;1663:7;1659:23;1655:32;1652:52;;;1700:1;1697;1690:12;1652:52;1726:23;;-1:-1:-1;;;;;;1778:32:1;;1768:43;;1758:71;;1825:1;1822;1815:12;2056:250;2141:1;2151:113;2165:6;2162:1;2159:13;2151:113;;;2241:11;;;2235:18;2222:11;;;2215:39;2187:2;2180:10;2151:113;;;-1:-1:-1;;2298:1:1;2280:16;;2273:27;2056:250::o;2311:271::-;2353:3;2391:5;2385:12;2418:6;2413:3;2406:19;2434:76;2503:6;2496:4;2491:3;2487:14;2480:4;2473:5;2469:16;2434:76;:::i;:::-;2564:2;2543:15;-1:-1:-1;;2539:29:1;2530:39;;;;2571:4;2526:50;;2311:271;-1:-1:-1;;2311:271:1:o;2587:220::-;2736:2;2725:9;2718:21;2699:4;2756:45;2797:2;2786:9;2782:18;2774:6;2756:45;:::i;2812:184::-;2870:6;2923:2;2911:9;2902:7;2898:23;2894:32;2891:52;;;2939:1;2936;2929:12;2891:52;2962:28;2980:9;2962:28;:::i;3001:131::-;-1:-1:-1;;;;;3076:31:1;;3066:42;;3056:70;;3122:1;3119;3112:12;3137:315;3205:6;3213;3266:2;3254:9;3245:7;3241:23;3237:32;3234:52;;;3282:1;3279;3272:12;3234:52;3321:9;3308:23;3340:31;3365:5;3340:31;:::i;:::-;3390:5;3442:2;3427:18;;;;3414:32;;-1:-1:-1;;;3137:315:1:o;3457:252::-;3524:6;3532;3585:2;3573:9;3564:7;3560:23;3556:32;3553:52;;;3601:1;3598;3591:12;3553:52;3624:28;3642:9;3624:28;:::i;3896:456::-;3973:6;3981;3989;4042:2;4030:9;4021:7;4017:23;4013:32;4010:52;;;4058:1;4055;4048:12;4010:52;4097:9;4084:23;4116:31;4141:5;4116:31;:::i;:::-;4166:5;-1:-1:-1;4223:2:1;4208:18;;4195:32;4236:33;4195:32;4236:33;:::i;:::-;3896:456;;4288:7;;-1:-1:-1;;;4342:2:1;4327:18;;;;4314:32;;3896:456::o;4565:180::-;4624:6;4677:2;4665:9;4656:7;4652:23;4648:32;4645:52;;;4693:1;4690;4683:12;4645:52;-1:-1:-1;4716:23:1;;4565:180;-1:-1:-1;4565:180:1:o;4750:160::-;4815:20;;4871:13;;4864:21;4854:32;;4844:60;;4900:1;4897;4890:12;4915:180;4971:6;5024:2;5012:9;5003:7;4999:23;4995:32;4992:52;;;5040:1;5037;5030:12;4992:52;5063:26;5079:9;5063:26;:::i;5289:687::-;5391:6;5399;5407;5415;5423;5431;5484:3;5472:9;5463:7;5459:23;5455:33;5452:53;;;5501:1;5498;5491:12;5452:53;5524:28;5542:9;5524:28;:::i;:::-;5514:38;;5599:2;5588:9;5584:18;5571:32;5561:42;;5650:2;5639:9;5635:18;5622:32;5612:42;;5673:35;5704:2;5693:9;5689:18;5673:35;:::i;:::-;5663:45;;5759:3;5748:9;5744:19;5731:33;-1:-1:-1;;;;;5779:6:1;5776:30;5773:50;;;5819:1;5816;5809:12;5773:50;5858:58;5908:7;5899:6;5888:9;5884:22;5858:58;:::i;6234:481::-;6312:6;6320;6328;6381:2;6369:9;6360:7;6356:23;6352:32;6349:52;;;6397:1;6394;6387:12;6349:52;6420:28;6438:9;6420:28;:::i;:::-;6410:38;;6499:2;6488:9;6484:18;6471:32;-1:-1:-1;;;;;6518:6:1;6515:30;6512:50;;;6558:1;6555;6548:12;6512:50;6597:58;6647:7;6638:6;6627:9;6623:22;6597:58;:::i;:::-;6234:481;;6674:8;;-1:-1:-1;6571:84:1;;-1:-1:-1;;;;6234:481:1:o;6720:127::-;6781:10;6776:3;6772:20;6769:1;6762:31;6812:4;6809:1;6802:15;6836:4;6833:1;6826:15;6852:275;6923:2;6917:9;6988:2;6969:13;;-1:-1:-1;;6965:27:1;6953:40;;-1:-1:-1;;;;;7008:34:1;;7044:22;;;7005:62;7002:88;;;7070:18;;:::i;:::-;7106:2;7099:22;6852:275;;-1:-1:-1;6852:275:1:o;7132:186::-;7180:4;-1:-1:-1;;;;;7205:6:1;7202:30;7199:56;;;7235:18;;:::i;:::-;-1:-1:-1;7301:2:1;7280:15;-1:-1:-1;;7276:29:1;7307:4;7272:40;;7132:186::o;7323:815::-;7407:6;7415;7423;7476:2;7464:9;7455:7;7451:23;7447:32;7444:52;;;7492:1;7489;7482:12;7444:52;7515:28;7533:9;7515:28;:::i;:::-;7505:38;;7594:2;7583:9;7579:18;7566:32;-1:-1:-1;;;;;7613:6:1;7610:30;7607:50;;;7653:1;7650;7643:12;7607:50;7676:22;;7729:4;7721:13;;7717:27;-1:-1:-1;7707:55:1;;7758:1;7755;7748:12;7707:55;7794:2;7781:16;7819:48;7835:31;7863:2;7835:31;:::i;:::-;7819:48;:::i;:::-;7890:2;7883:5;7876:17;7930:7;7925:2;7920;7916;7912:11;7908:20;7905:33;7902:53;;;7951:1;7948;7941:12;7902:53;8006:2;8001;7997;7993:11;7988:2;7981:5;7977:14;7964:45;8050:1;8045:2;8040;8033:5;8029:14;8025:23;8018:34;8071:5;8061:15;;;;;8095:37;8128:2;8117:9;8113:18;8095:37;:::i;:::-;8085:47;;7323:815;;;;;:::o;8325:160::-;8390:5;8435:2;8426:6;8421:3;8417:16;8413:25;8410:45;;;8451:1;8448;8441:12;8410:45;-1:-1:-1;8473:6:1;8325:160;-1:-1:-1;8325:160:1:o;8490:709::-;8614:6;8622;8630;8638;8646;8699:3;8687:9;8678:7;8674:23;8670:33;8667:53;;;8716:1;8713;8706:12;8667:53;8755:9;8742:23;8774:31;8799:5;8774:31;:::i;:::-;8824:5;-1:-1:-1;8848:37:1;8881:2;8866:18;;8848:37;:::i;:::-;8838:47;;8932:2;8921:9;8917:18;8904:32;8894:42;;8983:2;8972:9;8968:18;8955:32;8945:42;;9038:3;9027:9;9023:19;9010:33;-1:-1:-1;;;;;9058:6:1;9055:30;9052:50;;;9098:1;9095;9088:12;9052:50;9121:72;9185:7;9176:6;9165:9;9161:22;9121:72;:::i;:::-;9111:82;;;8490:709;;;;;;;;:::o;9204:247::-;9263:6;9316:2;9304:9;9295:7;9291:23;9287:32;9284:52;;;9332:1;9329;9322:12;9284:52;9371:9;9358:23;9390:31;9415:5;9390:31;:::i;9679:1091::-;9831:6;9839;9847;9855;9863;9871;9879;9887;9940:3;9928:9;9919:7;9915:23;9911:33;9908:53;;;9957:1;9954;9947:12;9908:53;9996:9;9983:23;10015:31;10040:5;10015:31;:::i;:::-;10065:5;-1:-1:-1;10089:37:1;10122:2;10107:18;;10089:37;:::i;:::-;10079:47;;10173:2;10162:9;10158:18;10145:32;10135:42;;10224:2;10213:9;10209:18;10196:32;10186:42;;10279:3;10268:9;10264:19;10251:33;-1:-1:-1;;;;;10344:2:1;10336:6;10333:14;10330:34;;;10360:1;10357;10350:12;10330:34;10399:58;10449:7;10440:6;10429:9;10425:22;10399:58;:::i;:::-;10476:8;;-1:-1:-1;10373:84:1;-1:-1:-1;10373:84:1;;-1:-1:-1;10530:38:1;10563:3;10548:19;;10530:38;:::i;:::-;10520:48;;10621:3;10610:9;10606:19;10593:33;10577:49;;10651:2;10641:8;10638:16;10635:36;;;10667:1;10664;10657:12;10635:36;;10690:74;10756:7;10745:8;10734:9;10730:24;10690:74;:::i;:::-;10680:84;;;9679:1091;;;;;;;;;;;:::o;10775:256::-;10841:6;10849;10902:2;10890:9;10881:7;10877:23;10873:32;10870:52;;;10918:1;10915;10908:12;10870:52;10941:28;10959:9;10941:28;:::i;:::-;10931:38;;10988:37;11021:2;11010:9;11006:18;10988:37;:::i;:::-;10978:47;;10775:256;;;;;:::o;11036:1069::-;11166:6;11174;11182;11190;11198;11206;11214;11222;11230;11283:3;11271:9;11262:7;11258:23;11254:33;11251:53;;;11300:1;11297;11290:12;11251:53;11323:28;11341:9;11323:28;:::i;:::-;11313:38;;11398:2;11387:9;11383:18;11370:32;11360:42;;11449:2;11438:9;11434:18;11421:32;11411:42;;11504:2;11493:9;11489:18;11476:32;-1:-1:-1;;;;;11568:2:1;11560:6;11557:14;11554:34;;;11584:1;11581;11574:12;11554:34;11623:58;11673:7;11664:6;11653:9;11649:22;11623:58;:::i;:::-;11700:8;;-1:-1:-1;11597:84:1;-1:-1:-1;11597:84:1;;-1:-1:-1;11754:38:1;11787:3;11772:19;;11754:38;:::i;:::-;11744:48;;11811:36;11842:3;11831:9;11827:19;11811:36;:::i;:::-;11801:46;;11900:3;11889:9;11885:19;11872:33;11856:49;;11930:2;11920:8;11917:16;11914:36;;;11946:1;11943;11936:12;11914:36;;11985:60;12037:7;12026:8;12015:9;12011:24;11985:60;:::i;:::-;11959:86;;12064:8;12054:18;;;12091:8;12081:18;;;11036:1069;;;;;;;;;;;:::o;12343:315::-;12408:6;12416;12469:2;12457:9;12448:7;12444:23;12440:32;12437:52;;;12485:1;12482;12475:12;12437:52;12524:9;12511:23;12543:31;12568:5;12543:31;:::i;:::-;12593:5;-1:-1:-1;12617:35:1;12648:2;12633:18;;12617:35;:::i;12663:622::-;12758:6;12766;12774;12782;12790;12843:3;12831:9;12822:7;12818:23;12814:33;12811:53;;;12860:1;12857;12850:12;12811:53;12883:28;12901:9;12883:28;:::i;:::-;12873:38;;12930:37;12963:2;12952:9;12948:18;12930:37;:::i;:::-;12920:47;;13014:2;13003:9;12999:18;12986:32;12976:42;;13069:2;13058:9;13054:18;13041:32;-1:-1:-1;;;;;13088:6:1;13085:30;13082:50;;;13128:1;13125;13118:12;13082:50;13167:58;13217:7;13208:6;13197:9;13193:22;13167:58;:::i;:::-;12663:622;;;;-1:-1:-1;12663:622:1;;-1:-1:-1;13244:8:1;;13141:84;12663:622;-1:-1:-1;;;12663:622:1:o;13290:388::-;13358:6;13366;13419:2;13407:9;13398:7;13394:23;13390:32;13387:52;;;13435:1;13432;13425:12;13387:52;13474:9;13461:23;13493:31;13518:5;13493:31;:::i;:::-;13543:5;-1:-1:-1;13600:2:1;13585:18;;13572:32;13613:33;13572:32;13613:33;:::i;:::-;13665:7;13655:17;;;13290:388;;;;;:::o;13683:324::-;13758:6;13766;13774;13827:2;13815:9;13806:7;13802:23;13798:32;13795:52;;;13843:1;13840;13833:12;13795:52;13866:28;13884:9;13866:28;:::i;:::-;13856:38;;13913:37;13946:2;13935:9;13931:18;13913:37;:::i;:::-;13903:47;;13997:2;13986:9;13982:18;13969:32;13959:42;;13683:324;;;;;:::o;14012:248::-;14080:6;14088;14141:2;14129:9;14120:7;14116:23;14112:32;14109:52;;;14157:1;14154;14147:12;14109:52;-1:-1:-1;;14180:23:1;;;14250:2;14235:18;;;14222:32;;-1:-1:-1;14012:248:1:o;14265:1205::-;14407:6;14415;14423;14431;14439;14447;14455;14463;14471;14479;14532:3;14520:9;14511:7;14507:23;14503:33;14500:53;;;14549:1;14546;14539:12;14500:53;14572:28;14590:9;14572:28;:::i;:::-;14562:38;;14651:2;14640:9;14636:18;14623:32;-1:-1:-1;;;;;14715:2:1;14707:6;14704:14;14701:34;;;14731:1;14728;14721:12;14701:34;14770:58;14820:7;14811:6;14800:9;14796:22;14770:58;:::i;:::-;14847:8;;-1:-1:-1;14744:84:1;-1:-1:-1;14744:84:1;;-1:-1:-1;14901:37:1;14934:2;14919:18;;14901:37;:::i;:::-;14891:47;;14985:2;14974:9;14970:18;14957:32;14947:42;;15039:3;15028:9;15024:19;15011:33;14998:46;;15053:31;15078:5;15053:31;:::i;:::-;15103:5;;-1:-1:-1;15155:3:1;15140:19;;15127:33;;-1:-1:-1;15213:3:1;15198:19;;15185:33;;15230:16;;;15227:36;;;15259:1;15256;15249:12;15227:36;;15298:60;15350:7;15339:8;15328:9;15324:24;15298:60;:::i;:::-;15272:86;;15377:8;15367:18;;;15404:8;15394:18;;;15459:3;15448:9;15444:19;15431:33;15421:43;;14265:1205;;;;;;;;;;;;;:::o;15475:460::-;15559:6;15567;15575;15583;15636:3;15624:9;15615:7;15611:23;15607:33;15604:53;;;15653:1;15650;15643:12;15604:53;15676:28;15694:9;15676:28;:::i;:::-;15666:38;;15723:37;15756:2;15745:9;15741:18;15723:37;:::i;:::-;15713:47;;15810:2;15799:9;15795:18;15782:32;15823:31;15848:5;15823:31;:::i;:::-;15475:460;;;;-1:-1:-1;15873:5:1;;15925:2;15910:18;15897:32;;-1:-1:-1;;15475:460:1:o;16299:380::-;16378:1;16374:12;;;;16421;;;16442:61;;16496:4;16488:6;16484:17;16474:27;;16442:61;16549:2;16541:6;16538:14;16518:18;16515:38;16512:161;;16595:10;16590:3;16586:20;16583:1;16576:31;16630:4;16627:1;16620:15;16658:4;16655:1;16648:15;16684:271;16867:6;16859;16854:3;16841:33;16823:3;16893:16;;16918:13;;;16893:16;16684:271;-1:-1:-1;16684:271:1:o;17560:127::-;17621:10;17616:3;17612:20;17609:1;17602:31;17652:4;17649:1;17642:15;17676:4;17673:1;17666:15;17692:125;17757:9;;;17778:10;;;17775:36;;;17791:18;;:::i;18169:266::-;18257:6;18252:3;18245:19;18309:6;18302:5;18295:4;18290:3;18286:14;18273:43;-1:-1:-1;18361:1:1;18336:16;;;18354:4;18332:27;;;18325:38;;;;18417:2;18396:15;;;-1:-1:-1;;18392:29:1;18383:39;;;18379:50;;18169:266::o;18440:326::-;18635:6;18627;18623:19;18612:9;18605:38;18679:2;18674;18663:9;18659:18;18652:30;18586:4;18699:61;18756:2;18745:9;18741:18;18733:6;18725;18699:61;:::i;19438:521::-;19515:4;19521:6;19581:11;19568:25;19675:2;19671:7;19660:8;19644:14;19640:29;19636:43;19616:18;19612:68;19602:96;;19694:1;19691;19684:12;19602:96;19721:33;;19773:20;;;-1:-1:-1;;;;;;19805:30:1;;19802:50;;;19848:1;19845;19838:12;19802:50;19881:4;19869:17;;-1:-1:-1;19912:14:1;19908:27;;;19898:38;;19895:58;;;19949:1;19946;19939:12;20322:128;20389:9;;;20410:11;;;20407:37;;;20424:18;;:::i;20861:360::-;21072:6;21064;21059:3;21046:33;21142:2;21138:15;;;;-1:-1:-1;;21134:53:1;21098:16;;21123:65;;;21212:2;21204:11;;20861:360;-1:-1:-1;20861:360:1:o;21351:517::-;21452:2;21447:3;21444:11;21441:421;;;21488:5;21485:1;21478:16;21532:4;21529:1;21519:18;21602:2;21590:10;21586:19;21583:1;21579:27;21573:4;21569:38;21638:4;21626:10;21623:20;21620:47;;;-1:-1:-1;21661:4:1;21620:47;21716:2;21711:3;21707:12;21704:1;21700:20;21694:4;21690:31;21680:41;;21771:81;21789:2;21782:5;21779:13;21771:81;;;21848:1;21834:16;;21815:1;21804:13;21771:81;;22044:1341;22168:3;22162:10;-1:-1:-1;;;;;22187:6:1;22184:30;22181:56;;;22217:18;;:::i;:::-;22246:96;22335:6;22295:38;22327:4;22321:11;22295:38;:::i;:::-;22289:4;22246:96;:::i;:::-;22397:4;;22454:2;22443:14;;22471:1;22466:662;;;;23172:1;23189:6;23186:89;;;-1:-1:-1;23241:19:1;;;23235:26;23186:89;-1:-1:-1;;22001:1:1;21997:11;;;21993:24;21989:29;21979:40;22025:1;22021:11;;;21976:57;23288:81;;22436:943;;22466:662;21298:1;21291:14;;;21335:4;21322:18;;-1:-1:-1;;22502:20:1;;;22619:236;22633:7;22630:1;22627:14;22619:236;;;22722:19;;;22716:26;22701:42;;22814:27;;;;22782:1;22770:14;;;;22649:19;;22619:236;;;22623:3;22883:6;22874:7;22871:19;22868:201;;;22944:19;;;22938:26;-1:-1:-1;;23027:1:1;23023:14;;;23039:3;23019:24;23015:37;23011:42;22996:58;22981:74;;22868:201;-1:-1:-1;;;;;23115:1:1;23099:14;;;23095:22;23082:36;;-1:-1:-1;22044:1341:1:o;23737:498::-;23937:4;23966:6;24011:2;24003:6;23999:15;23988:9;23981:34;24063:2;24055:6;24051:15;24046:2;24035:9;24031:18;24024:43;;24103:6;24098:2;24087:9;24083:18;24076:34;24146:3;24141:2;24130:9;24126:18;24119:31;24167:62;24224:3;24213:9;24209:19;24201:6;24193;24167:62;:::i;:::-;24159:70;23737:498;-1:-1:-1;;;;;;;23737:498:1:o;25046:493::-;25295:6;25287;25283:19;25272:9;25265:38;25339:3;25334:2;25323:9;25319:18;25312:31;25246:4;25360:62;25417:3;25406:9;25402:19;25394:6;25386;25360:62;:::i;:::-;-1:-1:-1;;;;;25458:31:1;;;;25453:2;25438:18;;25431:59;-1:-1:-1;25521:2:1;25506:18;25499:34;25352:70;25046:493;-1:-1:-1;;;25046:493:1:o;26621:753::-;26954:6;26946;26942:19;26931:9;26924:38;26998:3;26993:2;26982:9;26978:18;26971:31;26905:4;27025:62;27082:3;27071:9;27067:19;27059:6;27051;27025:62;:::i;:::-;-1:-1:-1;;;;;27127:6:1;27123:31;27118:2;27107:9;27103:18;27096:59;27191:6;27186:2;27175:9;27171:18;27164:34;27235:6;27229:3;27218:9;27214:19;27207:35;27291:9;27283:6;27279:22;27273:3;27262:9;27258:19;27251:51;27319:49;27361:6;27353;27345;27319:49;:::i;:::-;27311:57;26621:753;-1:-1:-1;;;;;;;;;;;26621:753:1:o;27379:1194::-;-1:-1:-1;;;;;27496:3:1;27493:27;27490:53;;;27523:18;;:::i;:::-;27552:93;27641:3;27601:38;27633:4;27627:11;27601:38;:::i;:::-;27595:4;27552:93;:::i;:::-;27671:1;27696:2;27691:3;27688:11;27713:1;27708:607;;;;28359:1;28376:3;28373:93;;;-1:-1:-1;28432:19:1;;;28419:33;28373:93;-1:-1:-1;;22001:1:1;21997:11;;;21993:24;21989:29;21979:40;22025:1;22021:11;;;21976:57;28479:78;;27681:886;;27708:607;21298:1;21291:14;;;21335:4;21322:18;;-1:-1:-1;;27744:17:1;;;27858:229;27872:7;27869:1;27866:14;27858:229;;;27961:19;;;27948:33;27933:49;;28068:4;28053:20;;;;28021:1;28009:14;;;;27888:12;27858:229;;;27862:3;28115;28106:7;28103:16;28100:159;;;28239:1;28235:6;28229:3;28223;28220:1;28216:11;28212:21;28208:34;28204:39;28191:9;28186:3;28182:19;28169:33;28165:79;28157:6;28150:95;28100:159;;;28302:1;28296:3;28293:1;28289:11;28285:19;28279:4;28272:33;27681:886;;27379:1194;;;:::o;29446:647::-;29525:6;29578:2;29566:9;29557:7;29553:23;29549:32;29546:52;;;29594:1;29591;29584:12;29546:52;29627:9;29621:16;-1:-1:-1;;;;;29652:6:1;29649:30;29646:50;;;29692:1;29689;29682:12;29646:50;29715:22;;29768:4;29760:13;;29756:27;-1:-1:-1;29746:55:1;;29797:1;29794;29787:12;29746:55;29826:2;29820:9;29851:48;29867:31;29895:2;29867:31;:::i;29851:48::-;29922:2;29915:5;29908:17;29962:7;29957:2;29952;29948;29944:11;29940:20;29937:33;29934:53;;;29983:1;29980;29973:12;29934:53;29996:67;30060:2;30055;30048:5;30044:14;30039:2;30035;30031:11;29996:67;:::i;30098:557::-;30355:6;30347;30343:19;30332:9;30325:38;30399:3;30394:2;30383:9;30379:18;30372:31;30306:4;30426:46;30467:3;30456:9;30452:19;30444:6;30426:46;:::i;:::-;-1:-1:-1;;;;;30512:6:1;30508:31;30503:2;30492:9;30488:18;30481:59;30588:9;30580:6;30576:22;30571:2;30560:9;30556:18;30549:50;30616:33;30642:6;30634;30616:33;:::i;33639:168::-;33712:9;;;33743;;33760:15;;;33754:22;;33740:37;33730:71;;33781:18;;:::i;33812:127::-;33873:10;33868:3;33864:20;33861:1;33854:31;33904:4;33901:1;33894:15;33928:4;33925:1;33918:15;33944:120;33984:1;34010;34000:35;;34015:18;;:::i;:::-;-1:-1:-1;34049:9:1;;33944:120::o;34069:135::-;34108:3;34129:17;;;34126:43;;34149:18;;:::i;:::-;-1:-1:-1;34196:1:1;34185:13;;34069:135::o;34209:642::-;34490:6;34478:19;;34460:38;;-1:-1:-1;;;;;34534:32:1;;34529:2;34514:18;;34507:60;34554:3;34598:2;34583:18;;34576:31;;;-1:-1:-1;;34630:46:1;;34656:19;;34648:6;34630:46;:::i;:::-;34726:6;34719:14;34712:22;34707:2;34696:9;34692:18;34685:50;34784:9;34776:6;34772:22;34766:3;34755:9;34751:19;34744:51;34812:33;34838:6;34830;34812:33;:::i;:::-;34804:41;34209:642;-1:-1:-1;;;;;;;;34209:642:1:o;34856:245::-;34935:6;34943;34996:2;34984:9;34975:7;34971:23;34967:32;34964:52;;;35012:1;35009;35002:12;34964:52;-1:-1:-1;;35035:16:1;;35091:2;35076:18;;;35070:25;35035:16;;35070:25;;-1:-1:-1;34856:245:1:o;36506:127::-;36567:10;36562:3;36558:20;36555:1;36548:31;36598:4;36595:1;36588:15;36622:4;36619:1;36612:15;36638:251;36708:6;36761:2;36749:9;36740:7;36736:23;36732:32;36729:52;;;36777:1;36774;36767:12;36729:52;36809:9;36803:16;36828:31;36853:5;36828:31;:::i;36894:980::-;37156:4;37204:3;37193:9;37189:19;37235:6;37224:9;37217:25;37261:2;37299:6;37294:2;37283:9;37279:18;37272:34;37342:3;37337:2;37326:9;37322:18;37315:31;37366:6;37401;37395:13;37432:6;37424;37417:22;37470:3;37459:9;37455:19;37448:26;;37509:2;37501:6;37497:15;37483:29;;37530:1;37540:195;37554:6;37551:1;37548:13;37540:195;;;37619:13;;-1:-1:-1;;;;;37615:39:1;37603:52;;37710:15;;;;37675:12;;;;37651:1;37569:9;37540:195;;;-1:-1:-1;;;;;;;37791:32:1;;;;37786:2;37771:18;;37764:60;-1:-1:-1;;;37855:3:1;37840:19;37833:35;37752:3;36894:980;-1:-1:-1;;;36894:980:1:o;37879:287::-;38008:3;38046:6;38040:13;38062:66;38121:6;38116:3;38109:4;38101:6;38097:17;38062:66;:::i;:::-;38144:16;;;;;37879:287;-1:-1:-1;;37879:287:1:o;38171:719::-;38474:6;38466;38462:19;38451:9;38444:38;38518:3;38513:2;38502:9;38498:18;38491:31;38425:4;38545:46;38586:3;38575:9;38571:19;38563:6;38545:46;:::i;:::-;-1:-1:-1;;;;;38631:6:1;38627:31;38622:2;38611:9;38607:18;38600:59;38707:9;38699:6;38695:22;38690:2;38679:9;38675:18;38668:50;38741:33;38767:6;38759;38741:33;:::i;:::-;38727:47;;38823:9;38815:6;38811:22;38805:3;38794:9;38790:19;38783:51;38851:33;38877:6;38869;38851:33;:::i;41200:891::-;41520:4;41549:3;41591:6;41583;41579:19;41568:9;41561:38;41635:2;41630;41619:9;41615:18;41608:30;41661:45;41702:2;41691:9;41687:18;41679:6;41661:45;:::i;:::-;-1:-1:-1;;;;;41742:31:1;;41737:2;41722:18;;41715:59;41805:2;41790:18;;41783:34;;;-1:-1:-1;;;;;41854:32:1;;41848:3;41833:19;;41826:61;41874:3;41903:19;;41896:35;;;41968:22;;;41962:3;41947:19;;41940:51;41647:59;-1:-1:-1;42008:33:1;41647:59;42026:6;42008:33;:::i;:::-;42000:41;;;42078:6;42072:3;42061:9;42057:19;42050:35;41200:891;;;;;;;;;;;:::o;42096:383::-;42297:2;42286:9;42279:21;42260:4;42317:45;42358:2;42347:9;42343:18;42335:6;42317:45;:::i;:::-;-1:-1:-1;;;;;42398:31:1;;;;42393:2;42378:18;;42371:59;-1:-1:-1;42461:2:1;42446:18;42439:34;42309:53;42096:383;-1:-1:-1;42096:383:1:o;43195:112::-;43227:1;43253;43243:35;;43258:18;;:::i;:::-;-1:-1:-1;43292:9:1;;43195:112::o;43729:840::-;44078:6;44070;44066:19;44055:9;44048:38;44122:3;44117:2;44106:9;44102:18;44095:31;44029:4;44149:46;44190:3;44179:9;44175:19;44167:6;44149:46;:::i;:::-;44243:9;44235:6;44231:22;44226:2;44215:9;44211:18;44204:50;44277:33;44303:6;44295;44277:33;:::i;:::-;-1:-1:-1;;;;;44384:15:1;;;44379:2;44364:18;;44357:43;44437:15;;44431:3;44416:19;;44409:44;44490:22;;;44337:3;44469:19;;44462:51;44263:47;-1:-1:-1;44530:33:1;44263:47;44548:6;44530:33;:::i;:::-;44522:41;43729:840;-1:-1:-1;;;;;;;;;43729:840:1:o;44574:727::-;44896:3;44891;44887:13;44878:6;44873:3;44869:16;44865:36;44860:3;44853:49;44931:6;44927:1;44922:3;44918:11;44911:27;44835:3;-1:-1:-1;;;;;44961:3:1;44957:28;45037:2;45028:6;45023:3;45019:16;45015:25;45010:2;45005:3;45001:12;44994:47;45071:6;45066:2;45061:3;45057:12;45050:28;45130:2;45121:6;45116:3;45112:16;45108:25;45103:2;45098:3;45094:12;45087:47;;45163:6;45157:13;45179:75;45247:6;45242:2;45237:3;45233:12;45226:4;45218:6;45214:17;45179:75;:::i;:::-;45274:16;;;;45292:2;45270:25;;44574:727;-1:-1:-1;;;;;;;44574:727:1:o

Swarm Source

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