BNB Price: $642.07 (+1.98%)
 

Overview

Max Total Supply

342,351,636.941216REAL

Holders

11,440 (0.00%)

Market

Price

$0.074 @ 0.000115 BNB (+5.27%)

Onchain Market Cap

-

Circulating Supply Market Cap

$236,770,452.00

Other Info

Token Contract (WITH 6 Decimals)

Filtered by Token Holder
Rapira: Exchange
Balance
1 REAL

Value
$0.07 ( ~0.000109022166424842 BNB) [0.0000%]
0xeB96Cd04eA3EF6d0B36b4b4c72351377185332bc
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

RealLink is a leading utility token in Social-Fi, widely used for tipping, payments, and rewarding creators and social engagement. Its ecosystem has surpassed 30 million users and continues to expand rapidly.

Market

Volume (24H):$5,485,807.00
Market Capitalization:$236,770,452.00
Circulating Supply:3,200,466,475.00 REAL
Market Data Source: Coinmarketcap


Update? Click here to update the token ICO / general information

Contract Source Code Verified (Exact Match)

Contract Name:
RealLink

Compiler Version
v0.8.22+commit.4fc1097e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at BscScan.com on 2025-09-02
*/

/**
 *Submitted for verification at BscScan.com on 2025-09-01
*/

// SPDX_License_Identifier: MIT

pragma solidity 0.8.22;

struct SetConfigParam {
    uint32 eid;
    uint32 configType;
    bytes config;
}

interface IMessageLibManager {
    struct Timeout {
        address lib;
        uint256 expiry;
    }

    event LibraryRegistered(address newLib);
    event DefaultSendLibrarySet(uint32 eid, address newLib);
    event DefaultReceiveLibrarySet(uint32 eid, address newLib);
    event DefaultReceiveLibraryTimeoutSet(uint32 eid, address oldLib, uint256 expiry);
    event SendLibrarySet(address sender, uint32 eid, address newLib);
    event ReceiveLibrarySet(address receiver, uint32 eid, address newLib);
    event ReceiveLibraryTimeoutSet(address receiver, uint32 eid, address oldLib, uint256 timeout);

    function registerLibrary(address _lib) external;

    function isRegisteredLibrary(address _lib) external view returns (bool);

    function getRegisteredLibraries() external view returns (address[] memory);

    function setDefaultSendLibrary(uint32 _eid, address _newLib) external;

    function defaultSendLibrary(uint32 _eid) external view returns (address);

    function setDefaultReceiveLibrary(uint32 _eid, address _newLib, uint256 _gracePeriod) external;

    function defaultReceiveLibrary(uint32 _eid) external view returns (address);

    function setDefaultReceiveLibraryTimeout(uint32 _eid, address _lib, uint256 _expiry) external;

    function defaultReceiveLibraryTimeout(uint32 _eid) external view returns (address lib, uint256 expiry);

    function isSupportedEid(uint32 _eid) external view returns (bool);

    function isValidReceiveLibrary(address _receiver, uint32 _eid, address _lib) external view returns (bool);

    /// ------------------- OApp interfaces -------------------
    function setSendLibrary(address _oapp, uint32 _eid, address _newLib) external;

    function getSendLibrary(address _sender, uint32 _eid) external view returns (address lib);

    function isDefaultSendLibrary(address _sender, uint32 _eid) external view returns (bool);

    function setReceiveLibrary(address _oapp, uint32 _eid, address _newLib, uint256 _gracePeriod) external;

    function getReceiveLibrary(address _receiver, uint32 _eid) external view returns (address lib, bool isDefault);

    function setReceiveLibraryTimeout(address _oapp, uint32 _eid, address _lib, uint256 _expiry) external;

    function receiveLibraryTimeout(address _receiver, uint32 _eid) external view returns (address lib, uint256 expiry);

    function setConfig(address _oapp, address _lib, SetConfigParam[] calldata _params) external;

    function getConfig(
        address _oapp,
        address _lib,
        uint32 _eid,
        uint32 _configType
    ) external view returns (bytes memory config);
}


// File @layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/[email protected]

// Original license: SPDX_License_Identifier: MIT

pragma solidity >=0.8.0;

interface IMessagingChannel {
    event InboundNonceSkipped(uint32 srcEid, bytes32 sender, address receiver, uint64 nonce);
    event PacketNilified(uint32 srcEid, bytes32 sender, address receiver, uint64 nonce, bytes32 payloadHash);
    event PacketBurnt(uint32 srcEid, bytes32 sender, address receiver, uint64 nonce, bytes32 payloadHash);

    function eid() external view returns (uint32);

    // this is an emergency function if a message cannot be verified for some reasons
    // required to provide _nextNonce to avoid race condition
    function skip(address _oapp, uint32 _srcEid, bytes32 _sender, uint64 _nonce) external;

    function nilify(address _oapp, uint32 _srcEid, bytes32 _sender, uint64 _nonce, bytes32 _payloadHash) external;

    function burn(address _oapp, uint32 _srcEid, bytes32 _sender, uint64 _nonce, bytes32 _payloadHash) external;

    function nextGuid(address _sender, uint32 _dstEid, bytes32 _receiver) external view returns (bytes32);

    function inboundNonce(address _receiver, uint32 _srcEid, bytes32 _sender) external view returns (uint64);

    function outboundNonce(address _sender, uint32 _dstEid, bytes32 _receiver) external view returns (uint64);

    function inboundPayloadHash(
        address _receiver,
        uint32 _srcEid,
        bytes32 _sender,
        uint64 _nonce
    ) external view returns (bytes32);

    function lazyInboundNonce(address _receiver, uint32 _srcEid, bytes32 _sender) external view returns (uint64);
}


// File @layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/[email protected]

// Original license: SPDX_License_Identifier: MIT

pragma solidity >=0.8.0;

interface IMessagingComposer {
    event ComposeSent(address from, address to, bytes32 guid, uint16 index, bytes message);
    event ComposeDelivered(address from, address to, bytes32 guid, uint16 index);
    event LzComposeAlert(
        address indexed from,
        address indexed to,
        address indexed executor,
        bytes32 guid,
        uint16 index,
        uint256 gas,
        uint256 value,
        bytes message,
        bytes extraData,
        bytes reason
    );

    function composeQueue(
        address _from,
        address _to,
        bytes32 _guid,
        uint16 _index
    ) external view returns (bytes32 messageHash);

    function sendCompose(address _to, bytes32 _guid, uint16 _index, bytes calldata _message) external;

    function lzCompose(
        address _from,
        address _to,
        bytes32 _guid,
        uint16 _index,
        bytes calldata _message,
        bytes calldata _extraData
    ) external payable;
}


// File @layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/[email protected]

// Original license: SPDX_License_Identifier: MIT

pragma solidity >=0.8.0;

interface IMessagingContext {
    function isSendingMessage() external view returns (bool);

    function getSendContext() external view returns (uint32 dstEid, address sender);
}


// File @layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/[email protected]

// Original license: SPDX_License_Identifier: MIT

pragma solidity >=0.8.0;




struct MessagingParams {
    uint32 dstEid;
    bytes32 receiver;
    bytes message;
    bytes options;
    bool payInLzToken;
}

struct MessagingReceipt {
    bytes32 guid;
    uint64 nonce;
    MessagingFee fee;
}

struct MessagingFee {
    uint256 nativeFee;
    uint256 lzTokenFee;
}

struct Origin {
    uint32 srcEid;
    bytes32 sender;
    uint64 nonce;
}

interface ILayerZeroEndpointV2 is IMessageLibManager, IMessagingComposer, IMessagingChannel, IMessagingContext {
    event PacketSent(bytes encodedPayload, bytes options, address sendLibrary);

    event PacketVerified(Origin origin, address receiver, bytes32 payloadHash);

    event PacketDelivered(Origin origin, address receiver);

    event LzReceiveAlert(
        address indexed receiver,
        address indexed executor,
        Origin origin,
        bytes32 guid,
        uint256 gas,
        uint256 value,
        bytes message,
        bytes extraData,
        bytes reason
    );

    event LzTokenSet(address token);

    event DelegateSet(address sender, address delegate);

    function quote(MessagingParams calldata _params, address _sender) external view returns (MessagingFee memory);

    function send(
        MessagingParams calldata _params,
        address _refundAddress
    ) external payable returns (MessagingReceipt memory);

    function verify(Origin calldata _origin, address _receiver, bytes32 _payloadHash) external;

    function verifiable(Origin calldata _origin, address _receiver) external view returns (bool);

    function initializable(Origin calldata _origin, address _receiver) external view returns (bool);

    function lzReceive(
        Origin calldata _origin,
        address _receiver,
        bytes32 _guid,
        bytes calldata _message,
        bytes calldata _extraData
    ) external payable;

    // oapp can burn messages partially by calling this function with its own business logic if messages are verified in order
    function clear(address _oapp, Origin calldata _origin, bytes32 _guid, bytes calldata _message) external;

    function setLzToken(address _lzToken) external;

    function lzToken() external view returns (address);

    function nativeToken() external view returns (address);

    function setDelegate(address _delegate) external;
}


// File @layerzerolabs/lz-evm-oapp-v2/contracts/oapp/interfaces/[email protected]

// Original license: SPDX_License_Identifier: MIT

pragma solidity ^0.8.20;

/**
 * @title IOAppCore
 */
interface IOAppCore {
    // Custom error messages
    error OnlyPeer(uint32 eid, bytes32 sender);
    error NoPeer(uint32 eid);
    error InvalidEndpointCall();
    error InvalidDelegate();

    // Event emitted when a peer (OApp) is set for a corresponding endpoint
    event PeerSet(uint32 eid, bytes32 peer);

    /**
     * @notice Retrieves the OApp version information.
     * @return senderVersion The version of the OAppSender.sol contract.
     * @return receiverVersion The version of the OAppReceiver.sol contract.
     */
    function oAppVersion() external view returns (uint64 senderVersion, uint64 receiverVersion);

    /**
     * @notice Retrieves the LayerZero endpoint associated with the OApp.
     * @return iEndpoint The LayerZero endpoint as an interface.
     */
    function endpoint() external view returns (ILayerZeroEndpointV2 iEndpoint);

    /**
     * @notice Retrieves the peer (OApp) associated with a corresponding endpoint.
     * @param _eid The endpoint ID.
     * @return peer The peer address (OApp instance) associated with the corresponding endpoint.
     */
    function peers(uint32 _eid) external view returns (bytes32 peer);

    /**
     * @notice Sets the peer address (OApp instance) for a corresponding endpoint.
     * @param _eid The endpoint ID.
     * @param _peer The address of the peer to be associated with the corresponding endpoint.
     */
    function setPeer(uint32 _eid, bytes32 _peer) external;

    /**
     * @notice Sets the delegate address for the OApp Core.
     * @param _delegate The address of the delegate to be set.
     */
    function setDelegate(address _delegate) external;
}


// File @layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/[email protected]

// Original license: SPDX_License_Identifier: MIT

pragma solidity >=0.8.0;

interface ILayerZeroReceiver {
    function allowInitializePath(Origin calldata _origin) external view returns (bool);

    function nextNonce(uint32 _eid, bytes32 _sender) external view returns (uint64);

    function lzReceive(
        Origin calldata _origin,
        bytes32 _guid,
        bytes calldata _message,
        address _executor,
        bytes calldata _extraData
    ) external payable;
}


// File @layerzerolabs/lz-evm-oapp-v2/contracts/oapp/interfaces/[email protected]

// Original license: SPDX_License_Identifier: MIT
pragma solidity ^0.8.20;

interface IOAppReceiver is ILayerZeroReceiver {
    /**
     * @notice Indicates whether an address is an approved composeMsg sender to the Endpoint.
     * @param _origin The origin information containing the source endpoint and sender address.
     *  - srcEid: The source chain endpoint ID.
     *  - sender: The sender address on the src chain.
     *  - nonce: The nonce of the message.
     * @param _message The lzReceive payload.
     * @param _sender The sender address.
     * @return isSender Is a valid sender.
     *
     * @dev Applications can optionally choose to implement a separate composeMsg sender that is NOT the bridging layer.
     * @dev The default sender IS the OAppReceiver implementer.
     */
    function isComposeMsgSender(
        Origin calldata _origin,
        bytes calldata _message,
        address _sender
    ) external view returns (bool isSender);
}


// File @layerzerolabs/lz-evm-oapp-v2/contracts/oapp/interfaces/[email protected]

// Original license: SPDX_License_Identifier: MIT

pragma solidity ^0.8.20;

/**
 * @dev Struct representing enforced option parameters.
 */
struct EnforcedOptionParam {
    uint32 eid; // Endpoint ID
    uint16 msgType; // Message Type
    bytes options; // Additional options
}

/**
 * @title IOAppOptionsType3
 * @dev Interface for the OApp with Type 3 Options, allowing the setting and combining of enforced options.
 */
interface IOAppOptionsType3 {
    // Custom error message for invalid options
    error InvalidOptions(bytes options);

    // Event emitted when enforced options are set
    event EnforcedOptionSet(EnforcedOptionParam[] _enforcedOptions);

    /**
     * @notice Sets enforced options for specific endpoint and message type combinations.
     * @param _enforcedOptions An array of EnforcedOptionParam structures specifying enforced options.
     */
    function setEnforcedOptions(EnforcedOptionParam[] calldata _enforcedOptions) external;

    /**
     * @notice Combines options for a given endpoint and message type.
     * @param _eid The endpoint ID.
     * @param _msgType The OApp message type.
     * @param _extraOptions Additional options passed by the caller.
     * @return options The combination of caller specified options AND enforced options.
     */
    function combineOptions(
        uint32 _eid,
        uint16 _msgType,
        bytes calldata _extraOptions
    ) external view returns (bytes memory options);
}


// File @openzeppelin/contracts/utils/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

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

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}


// File @openzeppelin/contracts/access/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;

/**
 * @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.
 *
 * The initial owner is set to the address provided by the deployer. 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;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @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 {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @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), "Invalid owner");
        require(newOwner != owner(), "Same owner");

        // Prevent transferring ownership to the contract itself
        require(newOwner != address(this), "Cannot transfer ownership to self");

        _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 @layerzerolabs/lz-evm-oapp-v2/contracts/oapp/libs/[email protected]

// Original license: SPDX_License_Identifier: MIT

pragma solidity ^0.8.20;


/**
 * @title OAppOptionsType3
 * @dev Abstract contract implementing the IOAppOptionsType3 interface with type 3 options.
 */
abstract contract OAppOptionsType3 is IOAppOptionsType3, Ownable {
    uint16 internal constant OPTION_TYPE_3 = 3;

    // @dev The "msgType" should be defined in the child contract.
    mapping(uint32 eid => mapping(uint16 msgType => bytes enforcedOption)) public enforcedOptions;



    /**
     * @dev Sets the enforced options for specific endpoint and message type combinations.
     * @param _enforcedOptions An array of EnforcedOptionParam structures specifying enforced options.
     *
     * @dev Provides a way for the OApp to enforce things like paying for PreCrime, AND/OR minimum dst lzReceive gas amounts etc.
     * @dev These enforced options can vary as the potential options/execution on the remote may differ as per the msgType.
     * eg. Amount of lzReceive() gas necessary to deliver a lzCompose() message adds overhead you dont want to pay
     * if you are only making a standard LayerZero message ie. lzReceive() WITHOUT sendCompose().
     */
    function _setEnforcedOptions(EnforcedOptionParam[] memory _enforcedOptions) internal virtual {
        for (uint256 i = 0; i < _enforcedOptions.length; i++) {
            // @dev Enforced options are only available for optionType 3, as type 1 and 2 dont support combining.
            _assertOptionsType3(_enforcedOptions[i].options);
            enforcedOptions[_enforcedOptions[i].eid][_enforcedOptions[i].msgType] = _enforcedOptions[i].options;
        }

        emit EnforcedOptionSet(_enforcedOptions);
    }

    /**
     * @notice Combines options for a given endpoint and message type.
     * @param _eid The endpoint ID.
     * @param _msgType The OAPP message type.
     * @param _extraOptions Additional options passed by the caller.
     * @return options The combination of caller specified options AND enforced options.
     *
     * @dev If there is an enforced lzReceive option:
     * - {gasLimit: 200k, msg.value: 1 ether} AND a caller supplies a lzReceive option: {gasLimit: 100k, msg.value: 0.5 ether}
     * - The resulting options will be {gasLimit: 300k, msg.value: 1.5 ether} when the message is executed on the remote lzReceive() function.
     * @dev This presence of duplicated options is handled off-chain in the verifier/executor.
     */
    function combineOptions(
        uint32 _eid,
        uint16 _msgType,
        bytes calldata _extraOptions
    ) public view virtual returns (bytes memory) {
        bytes memory enforced = enforcedOptions[_eid][_msgType];

        // No enforced options, pass whatever the caller supplied, even if it's empty or legacy type 1/2 options.
        if (enforced.length == 0) return _extraOptions;

        // No caller options, return enforced
        if (_extraOptions.length == 0) return enforced;

        // @dev If caller provided _extraOptions, must be type 3 as its the ONLY type that can be combined.
        if (_extraOptions.length >= 2) {
            _assertOptionsType3(_extraOptions);
            // @dev Remove the first 2 bytes containing the type from the _extraOptions and combine with enforced.
            return bytes.concat(enforced, _extraOptions[2:]);
        }

        // No valid set of options was found.
        revert InvalidOptions(_extraOptions);
    }

    /**
     * @dev Internal function to assert that options are of type 3.
     * @param _options The options to be checked.
     */
    function _assertOptionsType3(bytes memory _options) internal pure virtual {
        uint16 optionsType;
        assembly {
            optionsType := mload(add(_options, 2))
        }
        if (optionsType != OPTION_TYPE_3) revert InvalidOptions(_options);
    }
}


// File @layerzerolabs/lz-evm-oapp-v2/contracts/oapp/[email protected]

// Original license: SPDX_License_Identifier: MIT

pragma solidity ^0.8.20;


/**
 * @title OAppCore
 * @dev Abstract contract implementing the IOAppCore interface with basic OApp configurations.
 */
abstract contract OAppCore is IOAppCore, Ownable {
    // The LayerZero endpoint associated with the given OApp
    ILayerZeroEndpointV2 public immutable endpoint;

    // Mapping to store peers associated with corresponding endpoints
    mapping(uint32 eid => bytes32 peer) public peers;

    /**
     * @dev Constructor to initialize the OAppCore with the provided endpoint and delegate.
     * @param _endpoint The address of the LOCAL Layer Zero endpoint.
     * @param _delegate The delegate capable of making OApp configurations inside of the endpoint.
     *
     * @dev The delegate typically should be set as the owner of the contract.
     */
    constructor(address _endpoint, address _delegate) {
        endpoint = ILayerZeroEndpointV2(_endpoint);

        if (_delegate == address(0)) revert InvalidDelegate();
        endpoint.setDelegate(_delegate);
    }



    /**
     * @notice Sets the peer address (OApp instance) for a corresponding endpoint.
     * @param _eid The endpoint ID.
     * @param _peer The address of the peer to be associated with the corresponding endpoint.
     *
     * @dev Indicates that the peer is trusted to send LayerZero messages to this OApp.
     * @dev Set this to bytes32(0) to remove the peer address.
     * @dev Peer is a bytes32 to accommodate non-evm chains.
     */
    function _setPeer(uint32 _eid, bytes32 _peer) internal virtual {
        peers[_eid] = _peer;
        emit PeerSet(_eid, _peer);
    }

    /**
     * @notice Internal function to get the peer address associated with a specific endpoint; reverts if NOT set.
     * ie. the peer is set to bytes32(0).
     * @param _eid The endpoint ID.
     * @return peer The address of the peer associated with the specified endpoint.
     */
    function _getPeerOrRevert(uint32 _eid) internal view virtual returns (bytes32) {
        bytes32 peer = peers[_eid];
        if (peer == bytes32(0)) revert NoPeer(_eid);
        return peer;
    }


}


// File @layerzerolabs/lz-evm-oapp-v2/contracts/oapp/[email protected]

// Original license: SPDX_License_Identifier: MIT

pragma solidity ^0.8.20;


/**
 * @title OAppReceiver
 * @dev Abstract contract implementing the ILayerZeroReceiver interface and extending OAppCore for OApp receivers.
 */
abstract contract OAppReceiver is IOAppReceiver, OAppCore {
    // Custom error message for when the caller is not the registered endpoint/
    error OnlyEndpoint(address addr);

    // @dev The version of the OAppReceiver implementation.
    // @dev Version is bumped when changes are made to this contract.
    uint64 internal constant RECEIVER_VERSION = 2;

    /**
     * @notice Retrieves the OApp version information.
     * @return senderVersion The version of the OAppSender.sol contract.
     * @return receiverVersion The version of the OAppReceiver.sol contract.
     *
     * @dev Providing 0 as the default for OAppSender version. Indicates that the OAppSender is not implemented.
     * ie. this is a RECEIVE only OApp.
     * @dev If the OApp uses both OAppSender and OAppReceiver, then this needs to be override returning the correct versions.
     */
    function oAppVersion() public view virtual returns (uint64 senderVersion, uint64 receiverVersion) {
        return (0, RECEIVER_VERSION);
    }

    /**
     * @notice Indicates whether an address is an approved composeMsg sender to the Endpoint.
     * @dev _origin The origin information containing the source endpoint and sender address.
     *  - srcEid: The source chain endpoint ID.
     *  - sender: The sender address on the src chain.
     *  - nonce: The nonce of the message.
     * @dev _message The lzReceive payload.
     * @param _sender The sender address.
     * @return isSender Is a valid sender.
     *
     * @dev Applications can optionally choose to implement separate composeMsg senders that are NOT the bridging layer.
     * @dev The default sender IS the OAppReceiver implementer.
     */
    function isComposeMsgSender(
        Origin calldata /*_origin*/,
        bytes calldata /*_message*/,
        address _sender
    ) public view virtual returns (bool) {
        return _sender == address(this);
    }

    /**
     * @notice Checks if the path initialization is allowed based on the provided origin.
     * @param origin The origin information containing the source endpoint and sender address.
     * @return Whether the path has been initialized.
     *
     * @dev This indicates to the endpoint that the OApp has enabled msgs for this particular path to be received.
     * @dev This defaults to assuming if a peer has been set, its initialized.
     * Can be overridden by the OApp if there is other logic to determine this.
     */
    function allowInitializePath(Origin calldata origin) public view virtual returns (bool) {
        return peers[origin.srcEid] == origin.sender;
    }

    /**
     * @notice Retrieves the next nonce for a given source endpoint and sender address.
     * @dev _srcEid The source endpoint ID.
     * @dev _sender The sender address.
     * @return nonce The next nonce.
     *
     * @dev The path nonce starts from 1. If 0 is returned it means that there is NO nonce ordered enforcement.
     * @dev Is required by the off-chain executor to determine the OApp expects msg execution is ordered.
     * @dev This is also enforced by the OApp.
     * @dev By default this is NOT enabled. ie. nextNonce is hardcoded to return 0.
     */
    function nextNonce(uint32 /*_srcEid*/, bytes32 /*_sender*/) public view virtual returns (uint64 nonce) {
        return 0;
    }

    /**
     * @dev Entry point for receiving messages or packets from the endpoint.
     * @param _origin The origin information containing the source endpoint and sender address.
     *  - srcEid: The source chain endpoint ID.
     *  - sender: The sender address on the src chain.
     *  - nonce: The nonce of the message.
     * @param _guid The unique identifier for the received LayerZero message.
     * @param _message The payload of the received message.
     * @param _executor The address of the executor for the received message.
     * @param _extraData Additional arbitrary data provided by the corresponding executor.
     *
     * @dev Entry point for receiving msg/packet from the LayerZero endpoint.
     */
    function lzReceive(
        Origin calldata _origin,
        bytes32 _guid,
        bytes calldata _message,
        address _executor,
        bytes calldata _extraData
    ) public payable virtual {
        // Ensures that only the endpoint can attempt to lzReceive() messages to this OApp.
        if (address(endpoint) != msg.sender) revert OnlyEndpoint(msg.sender);

        // Ensure that the sender matches the expected peer for the source endpoint.
        if (_getPeerOrRevert(_origin.srcEid) != _origin.sender) revert OnlyPeer(_origin.srcEid, _origin.sender);

        // Call the internal OApp implementation of lzReceive.
        _lzReceive(_origin, _guid, _message, _executor, _extraData);
    }

    /**
     * @dev Internal function to implement lzReceive logic without needing to copy the basic parameter validation.
     */
    function _lzReceive(
        Origin calldata _origin,
        bytes32 _guid,
        bytes calldata _message,
        address _executor,
        bytes calldata _extraData
    ) internal virtual;
}


// File @openzeppelin/contracts/utils/introspection/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)

pragma solidity >=0.4.16;

/**
 * @dev Interface of the ERC-165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[ERC].
 *
 * 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[ERC 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/interfaces/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)

pragma solidity >=0.4.16;


// File @openzeppelin/contracts/token/ERC20/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)

pragma solidity >=0.4.16;

/**
 * @dev Interface of the ERC-20 standard as defined in the ERC.
 */
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 value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

    /**
     * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` 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 value) external returns (bool);
}


// File @openzeppelin/contracts/interfaces/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)

pragma solidity >=0.4.16;


// File @openzeppelin/contracts/interfaces/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)

pragma solidity >=0.6.2;


/**
 * @title IERC1363
 * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].
 *
 * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract
 * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.
 */
interface IERC1363 is IERC20, IERC165 {
    /*
     * Note: the ERC-165 identifier for this interface is 0xb0202a11.
     * 0xb0202a11 ===
     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^
     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^
     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^
     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^
     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^
     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))
     */

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`
     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.
     * @param to The address which you want to transfer to.
     * @param value The amount of tokens to be transferred.
     * @return A boolean value indicating whether the operation succeeded unless throwing.
     */
    function transferAndCall(address to, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`
     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.
     * @param to The address which you want to transfer to.
     * @param value The amount of tokens to be transferred.
     * @param data Additional data with no specified format, sent in call to `to`.
     * @return A boolean value indicating whether the operation succeeded unless throwing.
     */
    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism
     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.
     * @param from The address which you want to send tokens from.
     * @param to The address which you want to transfer to.
     * @param value The amount of tokens to be transferred.
     * @return A boolean value indicating whether the operation succeeded unless throwing.
     */
    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism
     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.
     * @param from The address which you want to send tokens from.
     * @param to The address which you want to transfer to.
     * @param value The amount of tokens to be transferred.
     * @param data Additional data with no specified format, sent in call to `to`.
     * @return A boolean value indicating whether the operation succeeded unless throwing.
     */
    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.
     * @param spender The address which will spend the funds.
     * @param value The amount of tokens to be spent.
     * @return A boolean value indicating whether the operation succeeded unless throwing.
     */
    function approveAndCall(address spender, uint256 value) external returns (bool);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.
     * @param spender The address which will spend the funds.
     * @param value The amount of tokens to be spent.
     * @param data Additional data with no specified format, sent in call to `spender`.
     * @return A boolean value indicating whether the operation succeeded unless throwing.
     */
    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);
}


// File @openzeppelin/contracts/token/ERC20/utils/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.20;


/**
 * @title SafeERC20
 * @dev Wrappers around ERC-20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    /**
     * @dev An operation with an ERC-20 token failed.
     */
    error SafeERC20FailedOperation(address token);

    /**
     * @dev Indicates a failed `decreaseAllowance` request.
     */
    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);

    /**
     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     */
    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));
    }

    /**
     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the
     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.
     */
    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));
    }

    /**
     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.
     */
    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {
        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));
    }

    /**
     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.
     */
    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {
        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));
    }

    /**
     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     *
     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client"
     * smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using
     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract
     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.
     */
    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 oldAllowance = token.allowance(address(this), spender);
        forceApprove(token, spender, oldAllowance + value);
    }

    /**
     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no
     * value, non-reverting calls are assumed to be successful.
     *
     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client"
     * smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using
     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract
     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.
     */
    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {
        unchecked {
            uint256 currentAllowance = token.allowance(address(this), spender);
            if (currentAllowance < requestedDecrease) {
                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);
            }
            forceApprove(token, spender, currentAllowance - requestedDecrease);
        }
    }

    /**
     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval
     * to be set to zero before setting it to a non-zero value, such as USDT.
     *
     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function
     * only sets the "standard" allowance. Any temporary allowance will remain active, in addition to the value being
     * set here.
     */
    function forceApprove(IERC20 token, address spender, uint256 value) internal {
        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));

        if (!_callOptionalReturnBool(token, approvalCall)) {
            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));
            _callOptionalReturn(token, approvalCall);
        }
    }

    /**
     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no
     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
     * targeting contracts.
     *
     * Reverts if the returned value is other than `true`.
     */
    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {
        if (to.code.length == 0) {
            safeTransfer(token, to, value);
        } else if (!token.transferAndCall(to, value, data)) {
            revert SafeERC20FailedOperation(address(token));
        }
    }

    /**
     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target
     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
     * targeting contracts.
     *
     * Reverts if the returned value is other than `true`.
     */
    function transferFromAndCallRelaxed(
        IERC1363 token,
        address from,
        address to,
        uint256 value,
        bytes memory data
    ) internal {
        if (to.code.length == 0) {
            safeTransferFrom(token, from, to, value);
        } else if (!token.transferFromAndCall(from, to, value, data)) {
            revert SafeERC20FailedOperation(address(token));
        }
    }

    /**
     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no
     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
     * targeting contracts.
     *
     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.
     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}
     * once without retrying, and relies on the returned value to be true.
     *
     * Reverts if the returned value is other than `true`.
     */
    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {
        if (to.code.length == 0) {
            forceApprove(token, to, value);
        } else if (!token.approveAndCall(to, value, data)) {
            revert SafeERC20FailedOperation(address(token));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     *
     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        uint256 returnSize;
        uint256 returnValue;
        assembly ("memory-safe") {
            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)
            // bubble errors
            if iszero(success) {
                let ptr := mload(0x40)
                returndatacopy(ptr, 0, returndatasize())
                revert(ptr, returndatasize())
            }
            returnSize := returndatasize()
            returnValue := mload(0)
        }

        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {
            revert SafeERC20FailedOperation(address(token));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     *
     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.
     */
    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
        bool success;
        uint256 returnSize;
        uint256 returnValue;
        assembly ("memory-safe") {
            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)
            returnSize := returndatasize()
            returnValue := mload(0)
        }
        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);
    }
}


// File @layerzerolabs/lz-evm-oapp-v2/contracts/oapp/[email protected]

// Original license: SPDX_License_Identifier: MIT

pragma solidity ^0.8.20;



/**
 * @title OAppSender
 * @dev Abstract contract implementing the OAppSender functionality for sending messages to a LayerZero endpoint.
 */
abstract contract OAppSender is OAppCore {
    using SafeERC20 for IERC20;

    // Custom error messages
    error NotEnoughNative(uint256 msgValue);
    error LzTokenUnavailable();

    // @dev The version of the OAppSender implementation.
    // @dev Version is bumped when changes are made to this contract.
    uint64 internal constant SENDER_VERSION = 1;

    /**
     * @notice Retrieves the OApp version information.
     * @return senderVersion The version of the OAppSender.sol contract.
     * @return receiverVersion The version of the OAppReceiver.sol contract.
     *
     * @dev Providing 0 as the default for OAppReceiver version. Indicates that the OAppReceiver is not implemented.
     * ie. this is a SEND only OApp.
     * @dev If the OApp uses both OAppSender and OAppReceiver, then this needs to be override returning the correct versions
     */
    function oAppVersion() public view virtual returns (uint64 senderVersion, uint64 receiverVersion) {
        return (SENDER_VERSION, 0);
    }

    /**
     * @dev Internal function to interact with the LayerZero EndpointV2.quote() for fee calculation.
     * @param _dstEid The destination endpoint ID.
     * @param _message The message payload.
     * @param _options Additional options for the message.
     * @param _payInLzToken Flag indicating whether to pay the fee in LZ tokens.
     * @return fee The calculated MessagingFee for the message.
     *      - nativeFee: The native fee for the message.
     *      - lzTokenFee: The LZ token fee for the message.
     */
    function _quote(
        uint32 _dstEid,
        bytes memory _message,
        bytes memory _options,
        bool _payInLzToken
    ) internal view virtual returns (MessagingFee memory fee) {
        return
            endpoint.quote(
                MessagingParams(_dstEid, _getPeerOrRevert(_dstEid), _message, _options, _payInLzToken),
                address(this)
            );
    }

    /**
     * @dev Internal function to interact with the LayerZero EndpointV2.send() for sending a message.
     * @param _dstEid The destination endpoint ID.
     * @param _message The message payload.
     * @param _options Additional options for the message.
     * @param _fee The calculated LayerZero fee for the message.
     *      - nativeFee: The native fee.
     *      - lzTokenFee: The lzToken fee.
     * @param _refundAddress The address to receive any excess fee values sent to the endpoint.
     * @return receipt The receipt for the sent message.
     *      - guid: The unique identifier for the sent message.
     *      - nonce: The nonce of the sent message.
     *      - fee: The LayerZero fee incurred for the message.
     */
    function _lzSend(
        uint32 _dstEid,
        bytes memory _message,
        bytes memory _options,
        MessagingFee memory _fee,
        address _refundAddress
    ) internal virtual returns (MessagingReceipt memory receipt) {
        // @dev Push corresponding fees to the endpoint, any excess is sent back to the _refundAddress from the endpoint.
        uint256 messageValue = _payNative(_fee.nativeFee);
        if (_fee.lzTokenFee > 0) _payLzToken(_fee.lzTokenFee);

        return
            // solhint-disable-next-line check-send-result
            endpoint.send{ value: messageValue }(
                MessagingParams(_dstEid, _getPeerOrRevert(_dstEid), _message, _options, _fee.lzTokenFee > 0),
                _refundAddress
            );
    }

    /**
     * @dev Internal function to pay the native fee associated with the message.
     * @param _nativeFee The native fee to be paid.
     * @return nativeFee The amount of native currency paid.
     *
     * @dev If the OApp needs to initiate MULTIPLE LayerZero messages in a single transaction,
     * this will need to be overridden because msg.value would contain multiple lzFees.
     * @dev Should be overridden in the event the LayerZero endpoint requires a different native currency.
     * @dev Some EVMs use an ERC20 as a method for paying transactions/gasFees.
     * @dev The endpoint is EITHER/OR, ie. it will NOT support both types of native payment at a time.
     */
    function _payNative(uint256 _nativeFee) internal virtual returns (uint256 nativeFee) {
        if (msg.value != _nativeFee) revert NotEnoughNative(msg.value);
        return _nativeFee;
    }

    /**
     * @dev Internal function to pay the LZ token fee associated with the message.
     * @param _lzTokenFee The LZ token fee to be paid.
     *
     * @dev If the caller is trying to pay in the specified lzToken, then the lzTokenFee is passed to the endpoint.
     * @dev Any excess sent, is passed back to the specified _refundAddress in the _lzSend().
     */
    function _payLzToken(uint256 _lzTokenFee) internal virtual {
        // @dev Cannot cache the token because it is not immutable in the endpoint.
        address lzToken = endpoint.lzToken();
        if (lzToken == address(0)) revert LzTokenUnavailable();

        // Pay LZ token fee by sending tokens to the endpoint.
        IERC20(lzToken).safeTransferFrom(msg.sender, address(endpoint), _lzTokenFee);
    }
}


// File @layerzerolabs/lz-evm-oapp-v2/contracts/oapp/[email protected]

// Original license: SPDX_License_Identifier: MIT

pragma solidity ^0.8.20;

// @dev Import the 'MessagingFee' and 'MessagingReceipt' so it's exposed to OApp implementers
// solhint-disable-next-line no-unused-import

// @dev Import the 'Origin' so it's exposed to OApp implementers
// solhint-disable-next-line no-unused-import


/**
 * @title OApp
 * @dev Abstract contract serving as the base for OApp implementation, combining OAppSender and OAppReceiver functionality.
 */
abstract contract OApp is OAppSender, OAppReceiver {
    /**
     * @dev Constructor to initialize the OApp with the provided endpoint and owner.
     * @param _endpoint The address of the LOCAL LayerZero endpoint.
     * @param _delegate The delegate capable of making OApp configurations inside of the endpoint.
     */
    constructor(address _endpoint, address _delegate) OAppCore(_endpoint, _delegate) {}

    /**
     * @notice Retrieves the OApp version information.
     * @return senderVersion The version of the OAppSender.sol implementation.
     * @return receiverVersion The version of the OAppReceiver.sol implementation.
     */
    function oAppVersion()
        public
        pure
        virtual
        override(OAppSender, OAppReceiver)
        returns (uint64 senderVersion, uint64 receiverVersion)
    {
        return (SENDER_VERSION, RECEIVER_VERSION);
    }
}


// File @layerzerolabs/lz-evm-oapp-v2/contracts/oft/interfaces/[email protected]

// Original license: SPDX_License_Identifier: MIT

pragma solidity ^0.8.20;

/**
 * @dev Struct representing token parameters for the OFT send() operation.
 */
struct SendParam {
    uint32 dstEid; // Destination endpoint ID.
    bytes32 to; // Recipient address.
    uint256 amountLD; // Amount to send in local decimals.
    uint256 minAmountLD; // Minimum amount to send in local decimals.
    bytes extraOptions; // Additional options supplied by the caller to be used in the LayerZero message.
    bytes composeMsg; // The composed message for the send() operation.
    bytes oftCmd; // The OFT command to be executed, unused in default OFT implementations.
}

/**
 * @dev Struct representing OFT limit information.
 * @dev These amounts can change dynamically and are up the the specific oft implementation.
 */
struct OFTLimit {
    uint256 minAmountLD; // Minimum amount in local decimals that can be sent to the recipient.
    uint256 maxAmountLD; // Maximum amount in local decimals that can be sent to the recipient.
}

/**
 * @dev Struct representing OFT receipt information.
 */
struct OFTReceipt {
    uint256 amountSentLD; // Amount of tokens ACTUALLY debited from the sender in local decimals.
    // @dev In non-default implementations, the amountReceivedLD COULD differ from this value.
    uint256 amountReceivedLD; // Amount of tokens to be received on the remote side.
}

/**
 * @dev Struct representing OFT fee details.
 * @dev Future proof mechanism to provide a standardized way to communicate fees to things like a UI.
 */
struct OFTFeeDetail {
    int256 feeAmountLD; // Amount of the fee in local decimals.
    string description; // Description of the fee.
}

/**
 * @title IOFT
 * @dev Interface for the OftChain (OFT) token.
 * @dev Does not inherit ERC20 to accommodate usage by OFTAdapter as well.
 * @dev This specific interface ID is '0x02e49c2c'.
 */
interface IOFT {
    // Custom error messages
    error InvalidLocalDecimals();
    error SlippageExceeded(uint256 amountLD, uint256 minAmountLD);

    // Events
    event OFTSent(
        bytes32 indexed guid, // GUID of the OFT message.
        uint32 dstEid, // Destination Endpoint ID.
        address indexed fromAddress, // Address of the sender on the src chain.
        uint256 amountSentLD, // Amount of tokens sent in local decimals.
        uint256 amountReceivedLD // Amount of tokens received in local decimals.
    );
    event OFTReceived(
        bytes32 indexed guid, // GUID of the OFT message.
        uint32 srcEid, // Source Endpoint ID.
        address indexed toAddress, // Address of the recipient on the dst chain.
        uint256 amountReceivedLD // Amount of tokens received in local decimals.
    );

    /**
     * @notice Retrieves interfaceID and the version of the OFT.
     * @return interfaceId The interface ID.
     * @return version The version.
     *
     * @dev interfaceId: This specific interface ID is '0x02e49c2c'.
     * @dev version: Indicates a cross-chain compatible msg encoding with other OFTs.
     * @dev If a new feature is added to the OFT cross-chain msg encoding, the version will be incremented.
     * ie. localOFT version(x,1) CAN send messages to remoteOFT version(x,1)
     */
    function oftVersion() external view returns (bytes4 interfaceId, uint64 version);

    /**
     * @notice Retrieves the address of the token associated with the OFT.
     * @return token The address of the ERC20 token implementation.
     */
    function token() external view returns (address);

    /**
     * @notice Indicates whether the OFT contract requires approval of the 'token()' to send.
     * @return requiresApproval Needs approval of the underlying token implementation.
     *
     * @dev Allows things like wallet implementers to determine integration requirements,
     * without understanding the underlying token implementation.
     */
    function approvalRequired() external view returns (bool);

    /**
     * @notice Retrieves the shared decimals of the OFT.
     * @return sharedDecimals The shared decimals of the OFT.
     */
    function sharedDecimals() external view returns (uint8);

    /**
     * @notice Provides a quote for OFT-related operations.
     * @param _sendParam The parameters for the send operation.
     * @return limit The OFT limit information.
     * @return oftFeeDetails The details of OFT fees.
     * @return receipt The OFT receipt information.
     */
    function quoteOFT(
        SendParam calldata _sendParam
    ) external view returns (OFTLimit memory, OFTFeeDetail[] memory oftFeeDetails, OFTReceipt memory);

    /**
     * @notice Provides a quote for the send() operation.
     * @param _sendParam The parameters for the send() operation.
     * @param _payInLzToken Flag indicating whether the caller is paying in the LZ token.
     * @return fee The calculated LayerZero messaging fee from the send() operation.
     *
     * @dev MessagingFee: LayerZero msg fee
     *  - nativeFee: The native fee.
     *  - lzTokenFee: The lzToken fee.
     */
    function quoteSend(SendParam calldata _sendParam, bool _payInLzToken) external view returns (MessagingFee memory);

    /**
     * @notice Executes the send() operation.
     * @param _sendParam The parameters for the send operation.
     * @param _fee The fee information supplied by the caller.
     *      - nativeFee: The native fee.
     *      - lzTokenFee: The lzToken fee.
     * @param _refundAddress The address to receive any excess funds from fees etc. on the src.
     * @return receipt The LayerZero messaging receipt from the send() operation.
     * @return oftReceipt The OFT receipt information.
     *
     * @dev MessagingReceipt: LayerZero msg receipt
     *  - guid: The unique identifier for the sent message.
     *  - nonce: The nonce of the sent message.
     *  - fee: The LayerZero fee incurred for the message.
     */
    function send(
        SendParam calldata _sendParam,
        MessagingFee calldata _fee,
        address _refundAddress
    ) external payable returns (MessagingReceipt memory, OFTReceipt memory);
}


// File @layerzerolabs/lz-evm-oapp-v2/contracts/oapp/interfaces/[email protected]

// Original license: SPDX_License_Identifier: MIT

pragma solidity ^0.8.20;

/**
 * @title IOAppMsgInspector
 * @dev Interface for the OApp Message Inspector, allowing examination of message and options contents.
 */
interface IOAppMsgInspector {
    // Custom error message for inspection failure
    error InspectionFailed(bytes message, bytes options);

    /**
     * @notice Allows the inspector to examine LayerZero message contents and optionally throw a revert if invalid.
     * @param _message The message payload to be inspected.
     * @param _options Additional options or parameters for inspection.
     * @return valid A boolean indicating whether the inspection passed (true) or failed (false).
     *
     * @dev Optionally done as a revert, OR use the boolean provided to handle the failure.
     */
    function inspect(bytes calldata _message, bytes calldata _options) external view returns (bool valid);
}


// File @layerzerolabs/lz-evm-oapp-v2/contracts/oft/libs/[email protected]

// Original license: SPDX_License_Identifier: MIT

pragma solidity ^0.8.20;

library OFTComposeMsgCodec {
    // Offset constants for decoding composed messages
    uint8 private constant NONCE_OFFSET = 8;
    uint8 private constant SRC_EID_OFFSET = 12;
    uint8 private constant AMOUNT_LD_OFFSET = 44;
    uint8 private constant COMPOSE_FROM_OFFSET = 76;

    /**
     * @dev Encodes a OFT composed message.
     * @param _nonce The nonce value.
     * @param _srcEid The source endpoint ID.
     * @param _amountLD The amount in local decimals.
     * @param _composeMsg The composed message.
     * @return _msg The encoded Composed message.
     */
    function encode(
        uint64 _nonce,
        uint32 _srcEid,
        uint256 _amountLD,
        bytes memory _composeMsg // 0x[composeFrom][composeMsg]
    ) internal pure returns (bytes memory _msg) {
        _msg = abi.encodePacked(_nonce, _srcEid, _amountLD, _composeMsg);
    }

    /**
     * @dev Retrieves the nonce from the composed message.
     * @param _msg The message.
     * @return The nonce value.
     */
    function nonce(bytes calldata _msg) internal pure returns (uint64) {
        return uint64(bytes8(_msg[:NONCE_OFFSET]));
    }

    /**
     * @dev Retrieves the source endpoint ID from the composed message.
     * @param _msg The message.
     * @return The source endpoint ID.
     */
    function srcEid(bytes calldata _msg) internal pure returns (uint32) {
        return uint32(bytes4(_msg[NONCE_OFFSET:SRC_EID_OFFSET]));
    }

    /**
     * @dev Retrieves the amount in local decimals from the composed message.
     * @param _msg The message.
     * @return The amount in local decimals.
     */
    function amountLD(bytes calldata _msg) internal pure returns (uint256) {
        return uint256(bytes32(_msg[SRC_EID_OFFSET:AMOUNT_LD_OFFSET]));
    }

    /**
     * @dev Retrieves the composeFrom value from the composed message.
     * @param _msg The message.
     * @return The composeFrom value.
     */
    function composeFrom(bytes calldata _msg) internal pure returns (bytes32) {
        return bytes32(_msg[AMOUNT_LD_OFFSET:COMPOSE_FROM_OFFSET]);
    }

    /**
     * @dev Retrieves the composed message.
     * @param _msg The message.
     * @return The composed message.
     */
    function composeMsg(bytes calldata _msg) internal pure returns (bytes memory) {
        return _msg[COMPOSE_FROM_OFFSET:];
    }

    /**
     * @dev Converts an address to bytes32.
     * @param _addr The address to convert.
     * @return The bytes32 representation of the address.
     */
    function addressToBytes32(address _addr) internal pure returns (bytes32) {
        return bytes32(uint256(uint160(_addr)));
    }

    /**
     * @dev Converts bytes32 to an address.
     * @param _b The bytes32 value to convert.
     * @return The address representation of bytes32.
     */
    function bytes32ToAddress(bytes32 _b) internal pure returns (address) {
        return address(uint160(uint256(_b)));
    }
}


// File @layerzerolabs/lz-evm-oapp-v2/contracts/oft/libs/[email protected]

// Original license: SPDX_License_Identifier: MIT

pragma solidity ^0.8.20;

library OFTMsgCodec {
    // Offset constants for encoding and decoding OFT messages
    uint8 private constant SEND_TO_OFFSET = 32;
    uint8 private constant SEND_AMOUNT_SD_OFFSET = 40;

    /**
     * @dev Encodes an OFT LayerZero message.
     * @param _sendTo The recipient address.
     * @param _amountShared The amount in shared decimals.
     * @param _composeMsg The composed message.
     * @return _msg The encoded message.
     * @return hasCompose A boolean indicating whether the message has a composed payload.
     */
    function encode(
        bytes32 _sendTo,
        uint64 _amountShared,
        bytes memory _composeMsg
    ) internal view returns (bytes memory _msg, bool hasCompose) {
        hasCompose = _composeMsg.length > 0;
        // @dev Remote chains will want to know the composed function caller ie. msg.sender on the src.
        _msg = hasCompose
            ? abi.encodePacked(_sendTo, _amountShared, addressToBytes32(msg.sender), _composeMsg)
            : abi.encodePacked(_sendTo, _amountShared);
    }

    /**
     * @dev Checks if the OFT message is composed.
     * @param _msg The OFT message.
     * @return A boolean indicating whether the message is composed.
     */
    function isComposed(bytes calldata _msg) internal pure returns (bool) {
        return _msg.length > SEND_AMOUNT_SD_OFFSET;
    }

    /**
     * @dev Retrieves the recipient address from the OFT message.
     * @param _msg The OFT message.
     * @return The recipient address.
     */
    function sendTo(bytes calldata _msg) internal pure returns (bytes32) {
        return bytes32(_msg[:SEND_TO_OFFSET]);
    }

    /**
     * @dev Retrieves the amount in shared decimals from the OFT message.
     * @param _msg The OFT message.
     * @return The amount in shared decimals.
     */
    function amountSD(bytes calldata _msg) internal pure returns (uint64) {
        return uint64(bytes8(_msg[SEND_TO_OFFSET:SEND_AMOUNT_SD_OFFSET]));
    }

    /**
     * @dev Retrieves the composed message from the OFT message.
     * @param _msg The OFT message.
     * @return The composed message.
     */
    function composeMsg(bytes calldata _msg) internal pure returns (bytes memory) {
        return _msg[SEND_AMOUNT_SD_OFFSET:];
    }

    /**
     * @dev Converts an address to bytes32.
     * @param _addr The address to convert.
     * @return The bytes32 representation of the address.
     */
    function addressToBytes32(address _addr) internal pure returns (bytes32) {
        return bytes32(uint256(uint160(_addr)));
    }

    /**
     * @dev Converts bytes32 to an address.
     * @param _b The bytes32 value to convert.
     * @return The address representation of bytes32.
     */
    function bytes32ToAddress(bytes32 _b) internal pure returns (address) {
        return address(uint160(uint256(_b)));
    }
}


// File @layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/[email protected]

// Original license: SPDX_License_Identifier: MIT

pragma solidity >=0.8.0;

enum MessageLibType {
    Send,
    Receive,
    SendAndReceive
}

interface IMessageLib is IERC165 {
    function setConfig(address _oapp, SetConfigParam[] calldata _config) external;

    function getConfig(uint32 _eid, address _oapp, uint32 _configType) external view returns (bytes memory config);

    function isSupportedEid(uint32 _eid) external view returns (bool);

    // message libs of same major version are compatible
    function version() external view returns (uint64 major, uint8 minor, uint8 endpointVersion);

    function messageLibType() external view returns (MessageLibType);
}


// File @layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/[email protected]

// Original license: SPDX_License_Identifier: MIT

pragma solidity >=0.8.0;


struct Packet {
    uint64 nonce;
    uint32 srcEid;
    address sender;
    uint32 dstEid;
    bytes32 receiver;
    bytes32 guid;
    bytes message;
}

interface ISendLib is IMessageLib {
    function send(
        Packet calldata _packet,
        bytes calldata _options,
        bool _payInLzToken
    ) external returns (MessagingFee memory, bytes memory encodedPacket);

    function quote(
        Packet calldata _packet,
        bytes calldata _options,
        bool _payInLzToken
    ) external view returns (MessagingFee memory);

    function setTreasury(address _treasury) external;

    function withdrawFee(address _to, uint256 _amount) external;

    function withdrawLzTokenFee(address _lzToken, address _to, uint256 _amount) external;
}


// File @layerzerolabs/lz-evm-protocol-v2/contracts/libs/[email protected]

// Original license: SPDX_License_Identifier: LZBL-1.2

pragma solidity ^0.8.20;

library AddressCast {
    error AddressCast_InvalidSizeForAddress();
    error AddressCast_InvalidAddress();

    function toBytes32(bytes calldata _addressBytes) internal pure returns (bytes32 result) {
        if (_addressBytes.length > 32) revert AddressCast_InvalidAddress();
        result = bytes32(_addressBytes);
        unchecked {
            uint256 offset = 32 - _addressBytes.length;
            result = result >> (offset * 8);
        }
    }

    function toBytes32(address _address) internal pure returns (bytes32 result) {
        result = bytes32(uint256(uint160(_address)));
    }

    function toBytes(bytes32 _addressBytes32, uint256 _size) internal pure returns (bytes memory result) {
        if (_size == 0 || _size > 32) revert AddressCast_InvalidSizeForAddress();
        result = new bytes(_size);
        unchecked {
            uint256 offset = 256 - _size * 8;
            assembly {
                mstore(add(result, 32), shl(offset, _addressBytes32))
            }
        }
    }

    function toAddress(bytes32 _addressBytes32) internal pure returns (address result) {
        result = address(uint160(uint256(_addressBytes32)));
    }

    function toAddress(bytes calldata _addressBytes) internal pure returns (address result) {
        if (_addressBytes.length != 20) revert AddressCast_InvalidAddress();
        result = address(bytes20(_addressBytes));
    }
}


// File @layerzerolabs/lz-evm-protocol-v2/contracts/messagelib/libs/[email protected]

// Original license: SPDX_License_Identifier: LZBL-1.2

pragma solidity ^0.8.20;


library PacketV1Codec {
    using AddressCast for address;
    using AddressCast for bytes32;

    uint8 internal constant PACKET_VERSION = 1;

    // header (version + nonce + path)
    // version
    uint256 private constant PACKET_VERSION_OFFSET = 0;
    //    nonce
    uint256 private constant NONCE_OFFSET = 1;
    //    path
    uint256 private constant SRC_EID_OFFSET = 9;
    uint256 private constant SENDER_OFFSET = 13;
    uint256 private constant DST_EID_OFFSET = 45;
    uint256 private constant RECEIVER_OFFSET = 49;
    // payload (guid + message)
    uint256 private constant GUID_OFFSET = 81; // keccak256(nonce + path)
    uint256 private constant MESSAGE_OFFSET = 113;

    function encode(Packet memory _packet) internal pure returns (bytes memory encodedPacket) {
        encodedPacket = abi.encodePacked(
            PACKET_VERSION,
            _packet.nonce,
            _packet.srcEid,
            _packet.sender.toBytes32(),
            _packet.dstEid,
            _packet.receiver,
            _packet.guid,
            _packet.message
        );
    }

    function encodePacketHeader(Packet memory _packet) internal pure returns (bytes memory) {
        return
            abi.encodePacked(
                PACKET_VERSION,
                _packet.nonce,
                _packet.srcEid,
                _packet.sender.toBytes32(),
                _packet.dstEid,
                _packet.receiver
            );
    }

    function encodePayload(Packet memory _packet) internal pure returns (bytes memory) {
        return abi.encodePacked(_packet.guid, _packet.message);
    }

    function header(bytes calldata _packet) internal pure returns (bytes calldata) {
        return _packet[0:GUID_OFFSET];
    }

    function version(bytes calldata _packet) internal pure returns (uint8) {
        return uint8(bytes1(_packet[PACKET_VERSION_OFFSET:NONCE_OFFSET]));
    }

    function nonce(bytes calldata _packet) internal pure returns (uint64) {
        return uint64(bytes8(_packet[NONCE_OFFSET:SRC_EID_OFFSET]));
    }

    function srcEid(bytes calldata _packet) internal pure returns (uint32) {
        return uint32(bytes4(_packet[SRC_EID_OFFSET:SENDER_OFFSET]));
    }

    function sender(bytes calldata _packet) internal pure returns (bytes32) {
        return bytes32(_packet[SENDER_OFFSET:DST_EID_OFFSET]);
    }

    function senderAddressB20(bytes calldata _packet) internal pure returns (address) {
        return sender(_packet).toAddress();
    }

    function dstEid(bytes calldata _packet) internal pure returns (uint32) {
        return uint32(bytes4(_packet[DST_EID_OFFSET:RECEIVER_OFFSET]));
    }

    function receiver(bytes calldata _packet) internal pure returns (bytes32) {
        return bytes32(_packet[RECEIVER_OFFSET:GUID_OFFSET]);
    }

    function receiverB20(bytes calldata _packet) internal pure returns (address) {
        return receiver(_packet).toAddress();
    }

    function guid(bytes calldata _packet) internal pure returns (bytes32) {
        return bytes32(_packet[GUID_OFFSET:MESSAGE_OFFSET]);
    }

    function message(bytes calldata _packet) internal pure returns (bytes calldata) {
        return bytes(_packet[MESSAGE_OFFSET:]);
    }

    function payload(bytes calldata _packet) internal pure returns (bytes calldata) {
        return bytes(_packet[GUID_OFFSET:]);
    }

    function payloadHash(bytes calldata _packet) internal pure returns (bytes32) {
        return keccak256(payload(_packet));
    }
}


// File @layerzerolabs/lz-evm-oapp-v2/contracts/precrime/libs/[email protected]

// Original license: SPDX_License_Identifier: MIT

pragma solidity ^0.8.20;


/**
 * @title InboundPacket
 * @dev Structure representing an inbound packet received by the contract.
 */
struct InboundPacket {
    Origin origin; // Origin information of the packet.
    uint32 dstEid; // Destination endpointId of the packet.
    address receiver; // Receiver address for the packet.
    bytes32 guid; // Unique identifier of the packet.
    uint256 value; // msg.value of the packet.
    address executor; // Executor address for the packet.
    bytes message; // Message payload of the packet.
    bytes extraData; // Additional arbitrary data for the packet.
}

/**
 * @title PacketDecoder
 * @dev Library for decoding LayerZero packets.
 */
library PacketDecoder {
    using PacketV1Codec for bytes;

    /**
     * @dev Decode an inbound packet from the given packet data.
     * @param _packet The packet data to decode.
     * @return packet An InboundPacket struct representing the decoded packet.
     */
    function decode(bytes calldata _packet) internal pure returns (InboundPacket memory packet) {
        packet.origin = Origin(_packet.srcEid(), _packet.sender(), _packet.nonce());
        packet.dstEid = _packet.dstEid();
        packet.receiver = _packet.receiverB20();
        packet.guid = _packet.guid();
        packet.message = _packet.message();
    }

    /**
     * @dev Decode multiple inbound packets from the given packet data and associated message values.
     * @param _packets An array of packet data to decode.
     * @param _packetMsgValues An array of associated message values for each packet.
     * @return packets An array of InboundPacket structs representing the decoded packets.
     */
    function decode(
        bytes[] calldata _packets,
        uint256[] memory _packetMsgValues
    ) internal pure returns (InboundPacket[] memory packets) {
        packets = new InboundPacket[](_packets.length);
        for (uint256 i = 0; i < _packets.length; i++) {
            bytes calldata packet = _packets[i];
            packets[i] = PacketDecoder.decode(packet);
            // @dev Allows the verifier to specify the msg.value that gets passed in lzReceive.
            packets[i].value = _packetMsgValues[i];
        }
    }
}


// File @layerzerolabs/lz-evm-oapp-v2/contracts/precrime/interfaces/[email protected]

// Original license: SPDX_License_Identifier: MIT

pragma solidity ^0.8.20;

// @dev Import the Origin so it's exposed to OAppPreCrimeSimulator implementers.
// solhint-disable-next-line no-unused-import

/**
 * @title IOAppPreCrimeSimulator Interface
 * @dev Interface for the preCrime simulation functionality in an OApp.
 */
interface IOAppPreCrimeSimulator {
    // @dev simulation result used in PreCrime implementation
    error SimulationResult(bytes result);
    error OnlySelf();

    /**
     * @dev Emitted when the preCrime contract address is set.
     * @param preCrimeAddress The address of the preCrime contract.
     */
    event PreCrimeSet(address preCrimeAddress);

    /**
     * @dev Retrieves the address of the preCrime contract implementation.
     * @return The address of the preCrime contract.
     */
    function preCrime() external view returns (address);

    /**
     * @dev Retrieves the address of the OApp contract.
     * @return The address of the OApp contract.
     */
    function oApp() external view returns (address);

    /**
     * @dev Sets the preCrime contract address.
     * @param _preCrime The address of the preCrime contract.
     */
    function setPreCrime(address _preCrime) external;

    /**
     * @dev Mocks receiving a packet, then reverts with a series of data to infer the state/result.
     * @param _packets An array of LayerZero InboundPacket objects representing received packets.
     */
    function lzReceiveAndRevert(InboundPacket[] calldata _packets) external payable;

    /**
     * @dev checks if the specified peer is considered 'trusted' by the OApp.
     * @param _eid The endpoint Id to check.
     * @param _peer The peer to check.
     * @return Whether the peer passed is considered 'trusted' by the OApp.
     */
    function isPeer(uint32 _eid, bytes32 _peer) external view returns (bool);
}


// File @layerzerolabs/lz-evm-oapp-v2/contracts/precrime/interfaces/[email protected]

// Original license: SPDX_License_Identifier: MIT

pragma solidity ^0.8.20;
struct PreCrimePeer {
    uint32 eid;
    bytes32 preCrime;
    bytes32 oApp;
}

// TODO not done yet
interface IPreCrime {
    error OnlyOffChain();

    // for simulate()
    error PacketOversize(uint256 max, uint256 actual);
    error PacketUnsorted();
    error SimulationFailed(bytes reason);

    // for preCrime()
    error SimulationResultNotFound(uint32 eid);
    error InvalidSimulationResult(uint32 eid, bytes reason);
    error CrimeFound(bytes crime);

    function getConfig(bytes[] calldata _packets, uint256[] calldata _packetMsgValues) external returns (bytes memory);

    function simulate(
        bytes[] calldata _packets,
        uint256[] calldata _packetMsgValues
    ) external payable returns (bytes memory);

    function buildSimulationResult() external view returns (bytes memory);

    function preCrime(
        bytes[] calldata _packets,
        uint256[] calldata _packetMsgValues,
        bytes[] calldata _simulations
    ) external;

    function version() external view returns (uint64 major, uint8 minor);
}


// File @layerzerolabs/lz-evm-oapp-v2/contracts/precrime/[email protected]

// Original license: SPDX_License_Identifier: MIT

pragma solidity ^0.8.20;



/**
 * @title OAppPreCrimeSimulator
 * @dev Abstract contract serving as the base for preCrime simulation functionality in an OApp.
 */
abstract contract OAppPreCrimeSimulator is IOAppPreCrimeSimulator, Ownable {
    // The address of the preCrime implementation.
    address public preCrime;

    /**
     * @dev Retrieves the address of the OApp contract.
     * @return The address of the OApp contract.
     *
     * @dev The simulator contract is the base contract for the OApp by default.
     * @dev If the simulator is a separate contract, override this function.
     */
    function oApp() external view virtual returns (address) {
        return address(this);
    }



    /**
     * @dev Interface for pre-crime simulations. Always reverts at the end with the simulation results.
     * @param _packets An array of InboundPacket objects representing received packets to be delivered.
     *
     * @dev WARNING: MUST revert at the end with the simulation results.
     * @dev Gives the preCrime implementation the ability to mock sending packets to the lzReceive function,
     * WITHOUT actually executing them.
     */
    function lzReceiveAndRevert(InboundPacket[] calldata _packets) public payable virtual {
        for (uint256 i = 0; i < _packets.length; i++) {
            InboundPacket calldata packet = _packets[i];

            // Ignore packets that are not from trusted peers.
            if (!isPeer(packet.origin.srcEid, packet.origin.sender)) continue;

            // @dev Because a verifier is calling this function, it doesnt have access to executor params:
            //  - address _executor
            //  - bytes calldata _extraData
            // preCrime will NOT work for OApps that rely on these two parameters inside of their _lzReceive().
            // They are instead stubbed to default values, address(0) and bytes("")
            // @dev Calling this.lzReceiveSimulate removes ability for assembly return 0 callstack exit,
            // which would cause the revert to be ignored.
            this.lzReceiveSimulate{ value: packet.value }(
                packet.origin,
                packet.guid,
                packet.message,
                packet.executor,
                packet.extraData
            );
        }

        // @dev Revert with the simulation results. msg.sender must implement IPreCrime.buildSimulationResult().
        revert SimulationResult(IPreCrime(msg.sender).buildSimulationResult());
    }

    /**
     * @dev Is effectively an internal function because msg.sender must be address(this).
     * Allows resetting the call stack for 'internal' calls.
     * @param _origin The origin information containing the source endpoint and sender address.
     *  - srcEid: The source chain endpoint ID.
     *  - sender: The sender address on the src chain.
     *  - nonce: The nonce of the message.
     * @param _guid The unique identifier of the packet.
     * @param _message The message payload of the packet.
     * @param _executor The executor address for the packet.
     * @param _extraData Additional data for the packet.
     */
    function lzReceiveSimulate(
        Origin calldata _origin,
        bytes32 _guid,
        bytes calldata _message,
        address _executor,
        bytes calldata _extraData
    ) external payable virtual {
        // @dev Ensure ONLY can be called 'internally'.
        if (msg.sender != address(this)) revert OnlySelf();
        _lzReceiveSimulate(_origin, _guid, _message, _executor, _extraData);
    }

    /**
     * @dev Internal function to handle the OAppPreCrimeSimulator simulated receive.
     * @param _origin The origin information.
     *  - srcEid: The source chain endpoint ID.
     *  - sender: The sender address from the src chain.
     *  - nonce: The nonce of the LayerZero message.
     * @param _guid The GUID of the LayerZero message.
     * @param _message The LayerZero message.
     * @param _executor The address of the off-chain executor.
     * @param _extraData Arbitrary data passed by the msg executor.
     *
     * @dev Enables the preCrime simulator to mock sending lzReceive() messages,
     * routes the msg down from the OAppPreCrimeSimulator, and back up to the OAppReceiver.
     */
    function _lzReceiveSimulate(
        Origin calldata _origin,
        bytes32 _guid,
        bytes calldata _message,
        address _executor,
        bytes calldata _extraData
    ) internal virtual;

    /**
     * @dev checks if the specified peer is considered 'trusted' by the OApp.
     * @param _eid The endpoint Id to check.
     * @param _peer The peer to check.
     * @return Whether the peer passed is considered 'trusted' by the OApp.
     */
    function isPeer(uint32 _eid, bytes32 _peer) public view virtual returns (bool);
}


// File @layerzerolabs/lz-evm-oapp-v2/contracts/oft/[email protected]

// Original license: SPDX_License_Identifier: MIT

pragma solidity ^0.8.20;





/**
 * @title OFTCore
 * @dev Abstract contract for the OftChain (OFT) token.
 */
abstract contract OFTCore is IOFT, OApp, OAppPreCrimeSimulator, OAppOptionsType3 {
    using OFTMsgCodec for bytes;
    using OFTMsgCodec for bytes32;

    // @notice Provides a conversion rate when swapping between denominations of SD and LD
    //      - shareDecimals == SD == shared Decimals
    //      - localDecimals == LD == local decimals
    // @dev Considers that tokens have different decimal amounts on various chains.
    // @dev eg.
    //  For a token
    //      - locally with 4 decimals --> 1.2345 => uint(12345)
    //      - remotely with 2 decimals --> 1.23 => uint(123)
    //      - The conversion rate would be 10 ** (4 - 2) = 100
    //  @dev If you want to send 1.2345 -> (uint 12345), you CANNOT represent that value on the remote,
    //  you can only display 1.23 -> uint(123).
    //  @dev To preserve the dust that would otherwise be lost on that conversion,
    //  we need to unify a denomination that can be represented on ALL chains inside of the OFT mesh
    uint256 public immutable decimalConversionRate;

    // @notice Msg types that are used to identify the various OFT operations.
    // @dev This can be extended in child contracts for non-default oft operations
    // @dev These values are used in things like combineOptions() in OAppOptionsType3.sol.
    uint16 public constant SEND = 1;
    uint16 public constant SEND_AND_CALL = 2;

    // Address of an optional contract to inspect both 'message' and 'options'
    address public msgInspector;
    event MsgInspectorSet(address inspector);

    /**
     * @dev Constructor.
     * @param _localDecimals The decimals of the token on the local chain (this chain).
     * @param _endpoint The address of the LayerZero endpoint.
     * @param _delegate The delegate capable of making OApp configurations inside of the endpoint.
     */
    constructor(uint8 _localDecimals, address _endpoint, address _delegate) OApp(_endpoint, _delegate) {
        if (_localDecimals < sharedDecimals()) revert InvalidLocalDecimals();
        decimalConversionRate = 10 ** (_localDecimals - sharedDecimals());
    }

    /**
     * @notice Retrieves interfaceID and the version of the OFT.
     * @return interfaceId The interface ID.
     * @return version The version.
     *
     * @dev interfaceId: This specific interface ID is '0x02e49c2c'.
     * @dev version: Indicates a cross-chain compatible msg encoding with other OFTs.
     * @dev If a new feature is added to the OFT cross-chain msg encoding, the version will be incremented.
     * ie. localOFT version(x,1) CAN send messages to remoteOFT version(x,1)
     */
    function oftVersion() external pure virtual returns (bytes4 interfaceId, uint64 version) {
        return (type(IOFT).interfaceId, 1);
    }

    /**
     * @dev Retrieves the shared decimals of the OFT.
     * @return The shared decimals of the OFT.
     *
     * @dev Sets an implicit cap on the amount of tokens, over uint64.max() will need some sort of outbound cap / totalSupply cap
     * Lowest common decimal denominator between chains.
     * Defaults to 6 decimal places to provide up to 18,446,744,073,709.551615 units (max uint64).
     * For tokens exceeding this totalSupply(), they will need to override the sharedDecimals function with something smaller.
     * ie. 4 sharedDecimals would be 1,844,674,407,370,955.1615
     */
    function sharedDecimals() public view virtual returns (uint8) {
        return 6;
    }



    /**
     * @notice Provides a quote for OFT-related operations.
     * @param _sendParam The parameters for the send operation.
     * @return oftLimit The OFT limit information.
     * @return oftFeeDetails The details of OFT fees.
     * @return oftReceipt The OFT receipt information.
     */
    function quoteOFT(
        SendParam calldata _sendParam
    )
        external
        view
        virtual
        returns (OFTLimit memory oftLimit, OFTFeeDetail[] memory oftFeeDetails, OFTReceipt memory oftReceipt)
    {
        uint256 minAmountLD = 0; // Unused in the default implementation.
        uint256 maxAmountLD = type(uint64).max; // Unused in the default implementation.
        oftLimit = OFTLimit(minAmountLD, maxAmountLD);

        // Unused in the default implementation; reserved for future complex fee details.
        oftFeeDetails = new OFTFeeDetail[](0);

        // @dev This is the same as the send() operation, but without the actual send.
        // - amountSentLD is the amount in local decimals that would be sent from the sender.
        // - amountReceivedLD is the amount in local decimals that will be credited to the recipient on the remote OFT instance.
        // @dev The amountSentLD MIGHT not equal the amount the user actually receives. HOWEVER, the default does.
        (uint256 amountSentLD, uint256 amountReceivedLD) = _debitView(
            _sendParam.amountLD,
            _sendParam.minAmountLD,
            _sendParam.dstEid
        );
        oftReceipt = OFTReceipt(amountSentLD, amountReceivedLD);
    }

    /**
     * @notice Provides a quote for the send() operation.
     * @param _sendParam The parameters for the send() operation.
     * @param _payInLzToken Flag indicating whether the caller is paying in the LZ token.
     * @return msgFee The calculated LayerZero messaging fee from the send() operation.
     *
     * @dev MessagingFee: LayerZero msg fee
     *  - nativeFee: The native fee.
     *  - lzTokenFee: The lzToken fee.
     */
    function quoteSend(
        SendParam calldata _sendParam,
        bool _payInLzToken
    ) external view virtual returns (MessagingFee memory msgFee) {
        // @dev mock the amount to receive, this is the same operation used in the send().
        // The quote is as similar as possible to the actual send() operation.
        (, uint256 amountReceivedLD) = _debitView(_sendParam.amountLD, _sendParam.minAmountLD, _sendParam.dstEid);

        // @dev Builds the options and OFT message to quote in the endpoint.
        (bytes memory message, bytes memory options) = _buildMsgAndOptions(_sendParam, amountReceivedLD);

        // @dev Calculates the LayerZero fee for the send() operation.
        return _quote(_sendParam.dstEid, message, options, _payInLzToken);
    }

    /**
     * @dev Executes the send operation.
     * @param _sendParam The parameters for the send operation.
     * @param _fee The calculated fee for the send() operation.
     *      - nativeFee: The native fee.
     *      - lzTokenFee: The lzToken fee.
     * @param _refundAddress The address to receive any excess funds.
     * @return msgReceipt The receipt for the send operation.
     * @return oftReceipt The OFT receipt information.
     *
     * @dev MessagingReceipt: LayerZero msg receipt
     *  - guid: The unique identifier for the sent message.
     *  - nonce: The nonce of the sent message.
     *  - fee: The LayerZero fee incurred for the message.
     */
    function send(
        SendParam calldata _sendParam,
        MessagingFee calldata _fee,
        address _refundAddress
    ) external payable virtual returns (MessagingReceipt memory msgReceipt, OFTReceipt memory oftReceipt) {
        // @dev Applies the token transfers regarding this send() operation.
        // - amountSentLD is the amount in local decimals that was ACTUALLY sent/debited from the sender.
        // - amountReceivedLD is the amount in local decimals that will be received/credited to the recipient on the remote OFT instance.
        (uint256 amountSentLD, uint256 amountReceivedLD) = _debit(
            msg.sender,
            _sendParam.amountLD,
            _sendParam.minAmountLD,
            _sendParam.dstEid
        );

        // @dev Builds the options and OFT message to quote in the endpoint.
        (bytes memory message, bytes memory options) = _buildMsgAndOptions(_sendParam, amountReceivedLD);

        // @dev Sends the message to the LayerZero endpoint and returns the LayerZero msg receipt.
        msgReceipt = _lzSend(_sendParam.dstEid, message, options, _fee, _refundAddress);
        // @dev Formulate the OFT receipt.
        oftReceipt = OFTReceipt(amountSentLD, amountReceivedLD);

        emit OFTSent(msgReceipt.guid, _sendParam.dstEid, msg.sender, amountSentLD, amountReceivedLD);
    }

    /**
     * @dev Internal function to build the message and options.
     * @param _sendParam The parameters for the send() operation.
     * @param _amountLD The amount in local decimals.
     * @return message The encoded message.
     * @return options The encoded options.
     */
    function _buildMsgAndOptions(
        SendParam calldata _sendParam,
        uint256 _amountLD
    ) internal view virtual returns (bytes memory message, bytes memory options) {
        bool hasCompose;
        // @dev This generated message has the msg.sender encoded into the payload so the remote knows who the caller is.
        (message, hasCompose) = OFTMsgCodec.encode(
            _sendParam.to,
            _toSD(_amountLD),
            // @dev Must be include a non empty bytes if you want to compose, EVEN if you dont need it on the remote.
            // EVEN if you dont require an arbitrary payload to be sent... eg. '0x01'
            _sendParam.composeMsg
        );
        // @dev Change the msg type depending if its composed or not.
        uint16 msgType = hasCompose ? SEND_AND_CALL : SEND;
        // @dev Combine the callers _extraOptions with the enforced options via the OAppOptionsType3.
        options = combineOptions(_sendParam.dstEid, msgType, _sendParam.extraOptions);

        // @dev Optionally inspect the message and options depending if the OApp owner has set a msg inspector.
        // @dev If it fails inspection, needs to revert in the implementation. ie. does not rely on return boolean
        if (msgInspector != address(0)) IOAppMsgInspector(msgInspector).inspect(message, options);
    }

    /**
     * @dev Internal function to handle the receive on the LayerZero endpoint.
     * @param _origin The origin information.
     *  - srcEid: The source chain endpoint ID.
     *  - sender: The sender address from the src chain.
     *  - nonce: The nonce of the LayerZero message.
     * @param _guid The unique identifier for the received LayerZero message.
     * @param _message The encoded message.
     * @dev _executor The address of the executor.
     * @dev _extraData Additional data.
     */
    function _lzReceive(
        Origin calldata _origin,
        bytes32 _guid,
        bytes calldata _message,
        address /*_executor*/, // @dev unused in the default implementation.
        bytes calldata /*_extraData*/ // @dev unused in the default implementation.
    ) internal virtual override {
        // @dev The src sending chain doesnt know the address length on this chain (potentially non-evm)
        // Thus everything is bytes32() encoded in flight.
        address toAddress = _message.sendTo().bytes32ToAddress();
        // @dev Credit the amountLD to the recipient and return the ACTUAL amount the recipient received in local decimals
        uint256 amountReceivedLD = _credit(toAddress, _toLD(_message.amountSD()), _origin.srcEid);

        if (_message.isComposed()) {
            // @dev Proprietary composeMsg format for the OFT.
            bytes memory composeMsg = OFTComposeMsgCodec.encode(
                _origin.nonce,
                _origin.srcEid,
                amountReceivedLD,
                _message.composeMsg()
            );

            // @dev Stores the lzCompose payload that will be executed in a separate tx.
            // Standardizes functionality for executing arbitrary contract invocation on some non-evm chains.
            // @dev The off-chain executor will listen and process the msg based on the src-chain-callers compose options passed.
            // @dev The index is used when a OApp needs to compose multiple msgs on lzReceive.
            // For default OFT implementation there is only 1 compose msg per lzReceive, thus its always 0.
            endpoint.sendCompose(toAddress, _guid, 0 /* the index of the composed message*/, composeMsg);
        }

        emit OFTReceived(_guid, _origin.srcEid, toAddress, amountReceivedLD);
    }

    /**
     * @dev Internal function to handle the OAppPreCrimeSimulator simulated receive.
     * @param _origin The origin information.
     *  - srcEid: The source chain endpoint ID.
     *  - sender: The sender address from the src chain.
     *  - nonce: The nonce of the LayerZero message.
     * @param _guid The unique identifier for the received LayerZero message.
     * @param _message The LayerZero message.
     * @param _executor The address of the off-chain executor.
     * @param _extraData Arbitrary data passed by the msg executor.
     *
     * @dev Enables the preCrime simulator to mock sending lzReceive() messages,
     * routes the msg down from the OAppPreCrimeSimulator, and back up to the OAppReceiver.
     */
    function _lzReceiveSimulate(
        Origin calldata _origin,
        bytes32 _guid,
        bytes calldata _message,
        address _executor,
        bytes calldata _extraData
    ) internal virtual override {
        _lzReceive(_origin, _guid, _message, _executor, _extraData);
    }

    /**
     * @dev Check if the peer is considered 'trusted' by the OApp.
     * @param _eid The endpoint ID to check.
     * @param _peer The peer to check.
     * @return Whether the peer passed is considered 'trusted' by the OApp.
     *
     * @dev Enables OAppPreCrimeSimulator to check whether a potential Inbound Packet is from a trusted source.
     */
    function isPeer(uint32 _eid, bytes32 _peer) public view virtual override returns (bool) {
        return peers[_eid] == _peer;
    }

    /**
     * @dev Internal function to remove dust from the given local decimal amount.
     * @param _amountLD The amount in local decimals.
     * @return amountLD The amount after removing dust.
     *
     * @dev Prevents the loss of dust when moving amounts between chains with different decimals.
     * @dev eg. uint(123) with a conversion rate of 100 becomes uint(100).
     */
    function _removeDust(uint256 _amountLD) internal view virtual returns (uint256 amountLD) {
        return (_amountLD / decimalConversionRate) * decimalConversionRate;
    }

    /**
     * @dev Internal function to convert an amount from shared decimals into local decimals.
     * @param _amountSD The amount in shared decimals.
     * @return amountLD The amount in local decimals.
     */
    function _toLD(uint64 _amountSD) internal view virtual returns (uint256 amountLD) {
        return _amountSD * decimalConversionRate;
    }

    /**
     * @dev Internal function to convert an amount from local decimals into shared decimals.
     * @param _amountLD The amount in local decimals.
     * @return amountSD The amount in shared decimals.
     */
    function _toSD(uint256 _amountLD) internal view virtual returns (uint64 amountSD) {
        return uint64(_amountLD / decimalConversionRate);
    }

    /**
     * @dev Internal function to mock the amount mutation from a OFT debit() operation.
     * @param _amountLD The amount to send in local decimals.
     * @param _minAmountLD The minimum amount to send in local decimals.
     * @dev _dstEid The destination endpoint ID.
     * @return amountSentLD The amount sent, in local decimals.
     * @return amountReceivedLD The amount to be received on the remote chain, in local decimals.
     *
     * @dev This is where things like fees would be calculated and deducted from the amount to be received on the remote.
     */
    function _debitView(
        uint256 _amountLD,
        uint256 _minAmountLD,
        uint32 /*_dstEid*/
    ) internal view virtual returns (uint256 amountSentLD, uint256 amountReceivedLD) {
        // @dev Remove the dust so nothing is lost on the conversion between chains with different decimals for the token.
        amountSentLD = _removeDust(_amountLD);
        // @dev The amount to send is the same as amount received in the default implementation.
        amountReceivedLD = amountSentLD;

        // @dev Check for slippage.
        if (amountReceivedLD < _minAmountLD) {
            revert SlippageExceeded(amountReceivedLD, _minAmountLD);
        }
    }

    /**
     * @dev Internal function to perform a debit operation.
     * @param _from The address to debit.
     * @param _amountLD The amount to send in local decimals.
     * @param _minAmountLD The minimum amount to send in local decimals.
     * @param _dstEid The destination endpoint ID.
     * @return amountSentLD The amount sent in local decimals.
     * @return amountReceivedLD The amount received in local decimals on the remote.
     *
     * @dev Defined here but are intended to be overriden depending on the OFT implementation.
     * @dev Depending on OFT implementation the _amountLD could differ from the amountReceivedLD.
     */
    function _debit(
        address _from,
        uint256 _amountLD,
        uint256 _minAmountLD,
        uint32 _dstEid
    ) internal virtual returns (uint256 amountSentLD, uint256 amountReceivedLD);

    /**
     * @dev Internal function to perform a credit operation.
     * @param _to The address to credit.
     * @param _amountLD The amount to credit in local decimals.
     * @param _srcEid The source endpoint ID.
     * @return amountReceivedLD The amount ACTUALLY received in local decimals.
     *
     * @dev Defined here but are intended to be overriden depending on the OFT implementation.
     * @dev Depending on OFT implementation the _amountLD could differ from the amountReceivedLD.
     */
    function _credit(
        address _to,
        uint256 _amountLD,
        uint32 _srcEid
    ) internal virtual returns (uint256 amountReceivedLD);
}


// File @openzeppelin/contracts/interfaces/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/draft-IERC6093.sol)
pragma solidity >=0.8.4;

/**
 * @dev Standard ERC-20 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.
 */
interface IERC20Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC20InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC20InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `spender's `allowance`. Used in transfers.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     * @param allowance Amount of tokens a `spender` is allowed to operate with.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC20InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC20InvalidSpender(address spender);
}

/**
 * @dev Standard ERC-721 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.
 */
interface IERC721Errors {
    /**
     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20.
     * Used in balance queries.
     * @param owner Address of the current owner of a token.
     */
    error ERC721InvalidOwner(address owner);

    /**
     * @dev Indicates a `tokenId` whose `owner` is the zero address.
     * @param tokenId Identifier number of a token.
     */
    error ERC721NonexistentToken(uint256 tokenId);

    /**
     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param tokenId Identifier number of a token.
     * @param owner Address of the current owner of a token.
     */
    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC721InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC721InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator's approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param tokenId Identifier number of a token.
     */
    error ERC721InsufficientApproval(address operator, uint256 tokenId);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC721InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC721InvalidOperator(address operator);
}

/**
 * @dev Standard ERC-1155 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.
 */
interface IERC1155Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     * @param tokenId Identifier number of a token.
     */
    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC1155InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC1155InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator's approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param owner Address of the current owner of a token.
     */
    error ERC1155MissingApprovalForAll(address operator, address owner);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC1155InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC1155InvalidOperator(address operator);

    /**
     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
     * Used in batch transfers.
     * @param idsLength Length of the array of token identifiers
     * @param valuesLength Length of the array of token amounts
     */
    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}


// File @openzeppelin/contracts/token/ERC20/extensions/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity >=0.6.2;

/**
 * @dev Interface for the optional metadata functions from the ERC-20 standard.
 */
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/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.20;




/**
 * @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}.
 *
 * 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 ERC-20
 * applications.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address account => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * Both 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 returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual 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 returns (uint8) {
        return 18;
    }

    /// @inheritdoc IERC20
    function totalSupply() public view virtual returns (uint256) {
        return _totalSupply;
    }

    /// @inheritdoc IERC20
    function balanceOf(address account) public view virtual 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 `value`.
     */
    function transfer(address to, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, value);
        return true;
    }

    /// @inheritdoc IERC20
    function allowance(address owner, address spender) public view virtual returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `value` 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 value) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, value);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Skips emitting an {Approval} event indicating an allowance update. This is not
     * required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].
     *
     * 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 `value`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `value`.
     */
    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, value);
        _transfer(from, to, value);
        return true;
    }

    /**
     * @dev Moves a `value` 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.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _transfer(address from, address to, uint256 value) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value);
    }

    /**
     * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
     * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
     * this function.
     *
     * Emits a {Transfer} event.
     */
    function _update(address from, address to, uint256 value) internal virtual {
        if (from == address(0)) {
            // Overflow check required: The rest of the code assumes that totalSupply never overflows
            _totalSupply += value;
        } else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < value) {
                revert ERC20InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                // Overflow not possible: value <= fromBalance <= totalSupply.
                _balances[from] = fromBalance - value;
            }
        }

        if (to == address(0)) {
            unchecked {
                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
                _totalSupply -= value;
            }
        } else {
            unchecked {
                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }

    /**
     * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
     * Relies on the `_update` mechanism
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _mint(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(address(0), account, value);
    }

    /**
     * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
     * Relies on the `_update` mechanism.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead
     */
    function _burn(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        _update(account, address(0), value);
    }

    /**
     * @dev Sets `value` 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.
     *
     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        _approve(owner, spender, value, true);
    }

    /**
     * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
     *
     * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
     * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
     * `Approval` event during `transferFrom` operations.
     *
     * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
     * true using the following override:
     *
     * ```solidity
     * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
     *     super._approve(owner, spender, value, true);
     * }
     * ```
     *
     * Requirements are the same as {_approve}.
     */
    function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
        if (owner == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[owner][spender] = value;
        if (emitEvent) {
            emit Approval(owner, spender, value);
        }
    }

    /**
     * @dev Updates `owner`'s allowance for `spender` based on spent `value`.
     *
     * Does not update the allowance value in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Does not emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance < type(uint256).max) {
            if (currentAllowance < value) {
                revert ERC20InsufficientAllowance(spender, currentAllowance, value);
            }
            unchecked {
                _approve(owner, spender, currentAllowance - value, false);
            }
        }
    }
}


// File @layerzerolabs/lz-evm-oapp-v2/contracts/oft/[email protected]

// Original license: SPDX_License_Identifier: MIT

pragma solidity ^0.8.20;


/**
 * @title OFT Contract
 * @dev OFT is an ERC-20 token that extends the functionality of the OFTCore contract.
 */
abstract contract OFT is OFTCore, ERC20 {
    /**
     * @dev Constructor for the OFT contract.
     * @param _name The name of the OFT.
     * @param _symbol The symbol of the OFT.
     * @param _lzEndpoint The LayerZero endpoint address.
     * @param _delegate The delegate capable of making OApp configurations inside of the endpoint.
     */
    constructor(
        string memory _name,
        string memory _symbol,
        address _lzEndpoint,
        address _delegate
    ) ERC20(_name, _symbol) OFTCore(decimals(), _lzEndpoint, _delegate) {}

    /**
     * @dev Retrieves the address of the underlying ERC20 implementation.
     * @return The address of the OFT token.
     *
     * @dev In the case of OFT, address(this) and erc20 are the same contract.
     */
    function token() public view returns (address) {
        return address(this);
    }

    /**
     * @notice Indicates whether the OFT contract requires approval of the 'token()' to send.
     * @return requiresApproval Needs approval of the underlying token implementation.
     *
     * @dev In the case of OFT where the contract IS the token, approval is NOT required.
     */
    function approvalRequired() external pure virtual returns (bool) {
        return false;
    }

    /**
     * @dev Burns tokens from the sender's specified balance.
     * @param _from The address to debit the tokens from.
     * @param _amountLD The amount of tokens to send in local decimals.
     * @param _minAmountLD The minimum amount to send in local decimals.
     * @param _dstEid The destination chain ID.
     * @return amountSentLD The amount sent in local decimals.
     * @return amountReceivedLD The amount received in local decimals on the remote.
     */
    function _debit(
        address _from,
        uint256 _amountLD,
        uint256 _minAmountLD,
        uint32 _dstEid
    ) internal virtual override returns (uint256 amountSentLD, uint256 amountReceivedLD) {
        (amountSentLD, amountReceivedLD) = _debitView(_amountLD, _minAmountLD, _dstEid);

        // @dev In NON-default OFT, amountSentLD could be 100, with a 10% fee, the amountReceivedLD amount is 90,
        // therefore amountSentLD CAN differ from amountReceivedLD.

        // @dev Default OFT burns on src.
        _burn(_from, amountSentLD);
    }

    /**
     * @dev Credits tokens to the specified address.
     * @param _to The address to credit the tokens to.
     * @param _amountLD The amount of tokens to credit in local decimals.
     * @dev _srcEid The source chain ID.
     * @return amountReceivedLD The amount of tokens ACTUALLY received in local decimals.
     */
    function _credit(
        address _to,
        uint256 _amountLD,
        uint32 /*_srcEid*/
    ) internal virtual override returns (uint256 amountReceivedLD) {
        if (_to == address(0x0)) _to = address(0xdead); // _mint(...) does not support address(0x0)
        // @dev Default OFT mints on dst.
        _mint(_to, _amountLD);
        // @dev In the case of NON-default OFT, the _amountLD MIGHT not be == amountReceivedLD.
        return _amountLD;
    }
}


// File contracts/ReentrancyGuard.sol

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)

pragma solidity ^0.8.20;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,
 * consider using {ReentrancyGuardTransient} instead.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant NOT_ENTERED = 1;
    uint256 private constant ENTERED = 2;

    uint256 private _status;

    /**
     * @dev Unauthorized reentrant call.
     */
    error ReentrancyGuardReentrantCall();

    constructor() {
        _status = NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be NOT_ENTERED
        if (_status == ENTERED) {
            revert ReentrancyGuardReentrantCall();
        }

        // Any calls to nonReentrant after this point will fail
        _status = ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = NOT_ENTERED;
    }

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == ENTERED;
    }
}


// File contracts/BscOFTAdapter.sol

// Original license: SPDX-License-Identifier: MIT
pragma solidity ^0.8.22;
contract RealLink is OFT, ReentrancyGuard {
    // Maximum total supply constant - 12 billion tokens (6 decimals)
    uint256 public constant MAX_TOTAL_SUPPLY = 12000000000 * 10**6; // 120,000,000,000 * 10^6

    // GUID replay protection - track processed cross-chain messages
    mapping(bytes32 => bool) public processedGuids;



    constructor(
        string memory _name,
        string memory _symbol,
        address _lzEndpoint,
        address _owner
    ) OFT(_name, _symbol, _lzEndpoint, _owner) Ownable(_owner) {
        require(_owner != address(0), "Invalid owner");
        require(_lzEndpoint != address(0), "Invalid endpoint");
    }

    function decimals() public pure override returns (uint8) {
        return 6;
    }



	// Fix: Add nonReentrant modifier
    function transfer(address to, uint256 amount) public override nonReentrant returns (bool) {
        require(to != address(0), "Invalid address");
        require(amount > 0, "Invalid amount");
        require(msg.sender != to, "Self-transfer not allowed");
        return super.transfer(to, amount);
    }

    function transferFrom(address from, address to, uint256 amount) public override nonReentrant returns (bool) {
        require(to != address(0), "Invalid address");
        require(amount > 0, "Invalid amount");
        require(from != to, "Self-transfer not allowed");
        return super.transferFrom(from, to, amount);
    }

    function transferOwnership(address newOwner) public override onlyOwner {
        require(newOwner != address(0), "Invalid owner");
        require(newOwner != owner(), "Same owner");

        // Prevent transferring ownership to the contract itself
        require(newOwner != address(this), "Cannot transfer ownership to self");

        _transferOwnership(newOwner);
    }

    // 统一权限控制 - 重写关键跨链配置函数,确保只有主合约的 owner 可以调用
    function setPeer(uint32 _eid, bytes32 _peer) public override onlyOwner {
        _setPeer(_eid, _peer);
    }

    function setDelegate(address _delegate) public override onlyOwner {
        endpoint.setDelegate(_delegate);
    }

    function setPreCrime(address _preCrime) public onlyOwner {
        preCrime = _preCrime;
        emit PreCrimeSet(_preCrime);
    }

    function setEnforcedOptions(EnforcedOptionParam[] calldata _enforcedOptions) public override onlyOwner {
        _setEnforcedOptions(_enforcedOptions);
    }

    function setMsgInspector(address _msgInspector) public onlyOwner {
        msgInspector = _msgInspector;
        emit MsgInspectorSet(_msgInspector);
    }

    /**
     * @dev Override _credit function to add maximum supply check
     * @param _to Recipient address
     * @param _amountLD Token amount in local decimals
     * @return amountReceivedLD Actual amount of tokens received
     */
    function _credit(
        address _to,
        uint256 _amountLD,
        uint32 /*_srcEid*/
    ) internal virtual override returns (uint256 amountReceivedLD) {
        // Check if minting would exceed maximum total supply
        require(totalSupply() + _amountLD <= MAX_TOTAL_SUPPLY, "Exceeds maximum total supply");

        // Maintain original logic unchanged
        if (_to == address(0x0)) _to = address(0xdead);
        _mint(_to, _amountLD);
        amountReceivedLD = _amountLD;

        return amountReceivedLD;
    }

    /**
     * @dev Override _lzReceive to add GUID replay protection
     * @param _origin The origin information
     * @param _guid The unique identifier for the received LayerZero message
     * @param _message The encoded message
     * @param _executor The address of the executor
     * @param _extraData Additional data
     */
    function _lzReceive(
        Origin calldata _origin,
        bytes32 _guid,
        bytes calldata _message,
        address _executor,
        bytes calldata _extraData
    ) internal virtual override {
        // GUID replay protection - prevent processing duplicate messages
        require(!processedGuids[_guid], "Message already processed");
        processedGuids[_guid] = true;

        // Call the parent implementation to maintain original logic
        super._lzReceive(_origin, _guid, _message, _executor, _extraData);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_lzEndpoint","type":"address"},{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"InvalidDelegate","type":"error"},{"inputs":[],"name":"InvalidEndpointCall","type":"error"},{"inputs":[],"name":"InvalidLocalDecimals","type":"error"},{"inputs":[{"internalType":"bytes","name":"options","type":"bytes"}],"name":"InvalidOptions","type":"error"},{"inputs":[],"name":"LzTokenUnavailable","type":"error"},{"inputs":[{"internalType":"uint32","name":"eid","type":"uint32"}],"name":"NoPeer","type":"error"},{"inputs":[{"internalType":"uint256","name":"msgValue","type":"uint256"}],"name":"NotEnoughNative","type":"error"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"OnlyEndpoint","type":"error"},{"inputs":[{"internalType":"uint32","name":"eid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"}],"name":"OnlyPeer","type":"error"},{"inputs":[],"name":"OnlySelf","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[{"internalType":"bytes","name":"result","type":"bytes"}],"name":"SimulationResult","type":"error"},{"inputs":[{"internalType":"uint256","name":"amountLD","type":"uint256"},{"internalType":"uint256","name":"minAmountLD","type":"uint256"}],"name":"SlippageExceeded","type":"error"},{"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":[{"components":[{"internalType":"uint32","name":"eid","type":"uint32"},{"internalType":"uint16","name":"msgType","type":"uint16"},{"internalType":"bytes","name":"options","type":"bytes"}],"indexed":false,"internalType":"struct EnforcedOptionParam[]","name":"_enforcedOptions","type":"tuple[]"}],"name":"EnforcedOptionSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"inspector","type":"address"}],"name":"MsgInspectorSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"guid","type":"bytes32"},{"indexed":false,"internalType":"uint32","name":"srcEid","type":"uint32"},{"indexed":true,"internalType":"address","name":"toAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountReceivedLD","type":"uint256"}],"name":"OFTReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"guid","type":"bytes32"},{"indexed":false,"internalType":"uint32","name":"dstEid","type":"uint32"},{"indexed":true,"internalType":"address","name":"fromAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountSentLD","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountReceivedLD","type":"uint256"}],"name":"OFTSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"eid","type":"uint32"},{"indexed":false,"internalType":"bytes32","name":"peer","type":"bytes32"}],"name":"PeerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"preCrimeAddress","type":"address"}],"name":"PreCrimeSet","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":"MAX_TOTAL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SEND","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SEND_AND_CALL","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"internalType":"struct Origin","name":"origin","type":"tuple"}],"name":"allowInitializePath","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[],"name":"approvalRequired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","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":[{"internalType":"uint32","name":"_eid","type":"uint32"},{"internalType":"uint16","name":"_msgType","type":"uint16"},{"internalType":"bytes","name":"_extraOptions","type":"bytes"}],"name":"combineOptions","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimalConversionRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"endpoint","outputs":[{"internalType":"contract ILayerZeroEndpointV2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"eid","type":"uint32"},{"internalType":"uint16","name":"msgType","type":"uint16"}],"name":"enforcedOptions","outputs":[{"internalType":"bytes","name":"enforcedOption","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"internalType":"struct Origin","name":"","type":"tuple"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"address","name":"_sender","type":"address"}],"name":"isComposeMsgSender","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_eid","type":"uint32"},{"internalType":"bytes32","name":"_peer","type":"bytes32"}],"name":"isPeer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"internalType":"struct Origin","name":"_origin","type":"tuple"},{"internalType":"bytes32","name":"_guid","type":"bytes32"},{"internalType":"bytes","name":"_message","type":"bytes"},{"internalType":"address","name":"_executor","type":"address"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"internalType":"struct Origin","name":"origin","type":"tuple"},{"internalType":"uint32","name":"dstEid","type":"uint32"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bytes32","name":"guid","type":"bytes32"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"address","name":"executor","type":"address"},{"internalType":"bytes","name":"message","type":"bytes"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"internalType":"struct InboundPacket[]","name":"_packets","type":"tuple[]"}],"name":"lzReceiveAndRevert","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"internalType":"struct Origin","name":"_origin","type":"tuple"},{"internalType":"bytes32","name":"_guid","type":"bytes32"},{"internalType":"bytes","name":"_message","type":"bytes"},{"internalType":"address","name":"_executor","type":"address"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"name":"lzReceiveSimulate","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"msgInspector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"nextNonce","outputs":[{"internalType":"uint64","name":"nonce","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oApp","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oAppVersion","outputs":[{"internalType":"uint64","name":"senderVersion","type":"uint64"},{"internalType":"uint64","name":"receiverVersion","type":"uint64"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"oftVersion","outputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"},{"internalType":"uint64","name":"version","type":"uint64"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"eid","type":"uint32"}],"name":"peers","outputs":[{"internalType":"bytes32","name":"peer","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preCrime","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"processedGuids","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"dstEid","type":"uint32"},{"internalType":"bytes32","name":"to","type":"bytes32"},{"internalType":"uint256","name":"amountLD","type":"uint256"},{"internalType":"uint256","name":"minAmountLD","type":"uint256"},{"internalType":"bytes","name":"extraOptions","type":"bytes"},{"internalType":"bytes","name":"composeMsg","type":"bytes"},{"internalType":"bytes","name":"oftCmd","type":"bytes"}],"internalType":"struct SendParam","name":"_sendParam","type":"tuple"}],"name":"quoteOFT","outputs":[{"components":[{"internalType":"uint256","name":"minAmountLD","type":"uint256"},{"internalType":"uint256","name":"maxAmountLD","type":"uint256"}],"internalType":"struct OFTLimit","name":"oftLimit","type":"tuple"},{"components":[{"internalType":"int256","name":"feeAmountLD","type":"int256"},{"internalType":"string","name":"description","type":"string"}],"internalType":"struct OFTFeeDetail[]","name":"oftFeeDetails","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"amountSentLD","type":"uint256"},{"internalType":"uint256","name":"amountReceivedLD","type":"uint256"}],"internalType":"struct OFTReceipt","name":"oftReceipt","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"dstEid","type":"uint32"},{"internalType":"bytes32","name":"to","type":"bytes32"},{"internalType":"uint256","name":"amountLD","type":"uint256"},{"internalType":"uint256","name":"minAmountLD","type":"uint256"},{"internalType":"bytes","name":"extraOptions","type":"bytes"},{"internalType":"bytes","name":"composeMsg","type":"bytes"},{"internalType":"bytes","name":"oftCmd","type":"bytes"}],"internalType":"struct SendParam","name":"_sendParam","type":"tuple"},{"internalType":"bool","name":"_payInLzToken","type":"bool"}],"name":"quoteSend","outputs":[{"components":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"lzTokenFee","type":"uint256"}],"internalType":"struct MessagingFee","name":"msgFee","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"dstEid","type":"uint32"},{"internalType":"bytes32","name":"to","type":"bytes32"},{"internalType":"uint256","name":"amountLD","type":"uint256"},{"internalType":"uint256","name":"minAmountLD","type":"uint256"},{"internalType":"bytes","name":"extraOptions","type":"bytes"},{"internalType":"bytes","name":"composeMsg","type":"bytes"},{"internalType":"bytes","name":"oftCmd","type":"bytes"}],"internalType":"struct SendParam","name":"_sendParam","type":"tuple"},{"components":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"lzTokenFee","type":"uint256"}],"internalType":"struct MessagingFee","name":"_fee","type":"tuple"},{"internalType":"address","name":"_refundAddress","type":"address"}],"name":"send","outputs":[{"components":[{"internalType":"bytes32","name":"guid","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"},{"components":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"lzTokenFee","type":"uint256"}],"internalType":"struct MessagingFee","name":"fee","type":"tuple"}],"internalType":"struct MessagingReceipt","name":"msgReceipt","type":"tuple"},{"components":[{"internalType":"uint256","name":"amountSentLD","type":"uint256"},{"internalType":"uint256","name":"amountReceivedLD","type":"uint256"}],"internalType":"struct OFTReceipt","name":"oftReceipt","type":"tuple"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_delegate","type":"address"}],"name":"setDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"eid","type":"uint32"},{"internalType":"uint16","name":"msgType","type":"uint16"},{"internalType":"bytes","name":"options","type":"bytes"}],"internalType":"struct EnforcedOptionParam[]","name":"_enforcedOptions","type":"tuple[]"}],"name":"setEnforcedOptions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_msgInspector","type":"address"}],"name":"setMsgInspector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_eid","type":"uint32"},{"internalType":"bytes32","name":"_peer","type":"bytes32"}],"name":"setPeer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_preCrime","type":"address"}],"name":"setPreCrime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sharedDecimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","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":[{"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"}]

60c060405234801562000010575f80fd5b50604051620066763803806200667683398181016040528101906200003691906200063c565b8383838383836200004c6200038560201b60201c565b8484818181818d5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000c6575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401620000bd9190620006fa565b60405180910390fd5b620000d7816200038d60201b60201c565b508173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000172576040517fb586360400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60805173ffffffffffffffffffffffffffffffffffffffff1663ca5eb5e1826040518263ffffffff1660e01b8152600401620001af9190620006fa565b5f604051808303815f87803b158015620001c7575f80fd5b505af1158015620001da573d5f803e3d5ffd5b5050505050505050620001f26200044e60201b60201c565b60ff168360ff16101562000232576040517f1e9714b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620002426200044e60201b60201c565b836200024f91906200074e565b600a6200025d9190620008e2565b60a08181525050505050816008908162000278919062000b60565b5080600990816200028a919062000b60565b505050505050506001600a819055505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036200030a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003019062000ca2565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200037b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003729062000d10565b60405180910390fd5b5050505062000d30565b5f6006905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f6006905090565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b620004b7826200046f565b810181811067ffffffffffffffff82111715620004d957620004d86200047f565b5b80604052505050565b5f620004ed62000456565b9050620004fb8282620004ac565b919050565b5f67ffffffffffffffff8211156200051d576200051c6200047f565b5b62000528826200046f565b9050602081019050919050565b5f5b838110156200055457808201518184015260208101905062000537565b5f8484015250505050565b5f620005756200056f8462000500565b620004e2565b9050828152602081018484840111156200059457620005936200046b565b5b620005a184828562000535565b509392505050565b5f82601f830112620005c057620005bf62000467565b5b8151620005d28482602086016200055f565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6200060682620005db565b9050919050565b6200061881620005fa565b811462000623575f80fd5b50565b5f8151905062000636816200060d565b92915050565b5f805f80608085870312156200065757620006566200045f565b5b5f85015167ffffffffffffffff81111562000677576200067662000463565b5b6200068587828801620005a9565b945050602085015167ffffffffffffffff811115620006a957620006a862000463565b5b620006b787828801620005a9565b9350506040620006ca8782880162000626565b9250506060620006dd8782880162000626565b91505092959194509250565b620006f481620005fa565b82525050565b5f6020820190506200070f5f830184620006e9565b92915050565b5f60ff82169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6200075a8262000715565b9150620007678362000715565b9250828203905060ff81111562000783576200078262000721565b5b92915050565b5f8160011c9050919050565b5f808291508390505b6001851115620007e657808604811115620007be57620007bd62000721565b5b6001851615620007ce5780820291505b8081029050620007de8562000789565b94506200079e565b94509492505050565b5f82620008005760019050620008d2565b816200080f575f9050620008d2565b8160018114620008285760028114620008335762000869565b6001915050620008d2565b60ff84111562000848576200084762000721565b5b8360020a91508482111562000862576200086162000721565b5b50620008d2565b5060208310610133831016604e8410600b8410161715620008a35782820a9050838111156200089d576200089c62000721565b5b620008d2565b620008b2848484600162000795565b92509050818404811115620008cc57620008cb62000721565b5b81810290505b9392505050565b5f819050919050565b5f620008ee82620008d9565b9150620008fb8362000715565b92506200092a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484620007ef565b905092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200098157607f821691505b6020821081036200099757620009966200093c565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620009fb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620009be565b62000a078683620009be565b95508019841693508086168417925050509392505050565b5f819050919050565b5f62000a4862000a4262000a3c84620008d9565b62000a1f565b620008d9565b9050919050565b5f819050919050565b62000a638362000a28565b62000a7b62000a728262000a4f565b848454620009ca565b825550505050565b5f90565b62000a9162000a83565b62000a9e81848462000a58565b505050565b5b8181101562000ac55762000ab95f8262000a87565b60018101905062000aa4565b5050565b601f82111562000b145762000ade816200099d565b62000ae984620009af565b8101602085101562000af9578190505b62000b1162000b0885620009af565b83018262000aa3565b50505b505050565b5f82821c905092915050565b5f62000b365f198460080262000b19565b1980831691505092915050565b5f62000b50838362000b25565b9150826002028217905092915050565b62000b6b8262000932565b67ffffffffffffffff81111562000b875762000b866200047f565b5b62000b93825462000969565b62000ba082828562000ac9565b5f60209050601f83116001811462000bd6575f841562000bc1578287015190505b62000bcd858262000b43565b86555062000c3c565b601f19841662000be6866200099d565b5f5b8281101562000c0f5784890151825560018201915060208501945060208101905062000be8565b8683101562000c2f578489015162000c2b601f89168262000b25565b8355505b6001600288020188555050505b505050505050565b5f82825260208201905092915050565b7f496e76616c6964206f776e6572000000000000000000000000000000000000005f82015250565b5f62000c8a600d8362000c44565b915062000c978262000c54565b602082019050919050565b5f6020820190508181035f83015262000cbb8162000c7c565b9050919050565b7f496e76616c696420656e64706f696e74000000000000000000000000000000005f82015250565b5f62000cf860108362000c44565b915062000d058262000cc2565b602082019050919050565b5f6020820190508181035f83015262000d298162000cea565b9050919050565b60805160a0516158d762000d9f5f395f818161123b0152818161279b015281816127bc01528181612b070152612e2101525f8181610c3b0152818161103c015281816118f70152818161214b015281816124ce0152818161288801528181612c750152612d6d01526158d75ff3fe608060405260043610610266575f3560e01c80637d25a05e11610143578063bb0b6a53116100b5578063d045a0dc11610079578063d045a0dc14610963578063d42438851461097f578063dd62ed3e146109a7578063f2fde38b146109e3578063fc0c546a14610a0b578063ff7bd03d14610a3557610266565b8063bb0b6a5314610876578063bc70b354146108b2578063bd815db0146108ee578063c7c7f5b31461090a578063ca5eb5e11461093b57610266565b8063963efcaa11610107578063963efcaa146107585780639f68b96414610782578063a9059cbb146107ac578063b40d18fb146107e8578063b731ea0a14610824578063b98bd0701461084e57610266565b80637d25a05e1461066257806382413eac1461069e578063857749b0146106da5780638da5cb5b1461070457806395d89b411461072e57610266565b8063313ce567116101dc5780635535d461116101a05780635535d461146105465780635a0dfe4d146105825780635e280f11146105be5780636fc1b31e146105e857806370a0823114610610578063715018a61461064c57610266565b8063313ce5671461046457806333039d3d1461048e5780633400288b146104b85780633b6f743b146104e057806352ae28791461051c57610266565b8063134d4f251161022e578063134d4f2514610354578063156a0d0f1461037e57806317442b70146103a957806318160ddd146103d45780631f5e1334146103fe57806323b872dd1461042857610266565b806306fdde031461026a578063095ea7b3146102945780630d35b415146102d0578063111ecdad1461030e57806313137d6514610338575b5f80fd5b348015610275575f80fd5b5061027e610a71565b60405161028b91906134a3565b60405180910390f35b34801561029f575f80fd5b506102ba60048036038101906102b59190613561565b610b01565b6040516102c791906135b9565b60405180910390f35b3480156102db575f80fd5b506102f660048036038101906102f191906135f4565b610b23565b604051610305939291906137f9565b60405180910390f35b348015610319575f80fd5b50610322610bfd565b60405161032f9190613844565b60405180910390f35b610352600480360381019061034d919061390f565b610c22565b005b34801561035f575f80fd5b50610368610d42565b60405161037591906139e2565b60405180910390f35b348015610389575f80fd5b50610392610d47565b6040516103a0929190613a57565b60405180910390f35b3480156103b4575f80fd5b506103bd610d74565b6040516103cb929190613a7e565b60405180910390f35b3480156103df575f80fd5b506103e8610d82565b6040516103f59190613ab4565b60405180910390f35b348015610409575f80fd5b50610412610d8b565b60405161041f91906139e2565b60405180910390f35b348015610433575f80fd5b5061044e60048036038101906104499190613acd565b610d90565b60405161045b91906135b9565b60405180910390f35b34801561046f575f80fd5b50610478610ed3565b6040516104859190613b38565b60405180910390f35b348015610499575f80fd5b506104a2610edb565b6040516104af9190613ab4565b60405180910390f35b3480156104c3575f80fd5b506104de60048036038101906104d99190613b8a565b610ee6565b005b3480156104eb575f80fd5b5061050660048036038101906105019190613bf2565b610efc565b6040516105139190613c79565b60405180910390f35b348015610527575f80fd5b50610530610f64565b60405161053d9190613844565b60405180910390f35b348015610551575f80fd5b5061056c60048036038101906105679190613cbc565b610f6b565b6040516105799190613d4c565b60405180910390f35b34801561058d575f80fd5b506105a860048036038101906105a39190613b8a565b611011565b6040516105b591906135b9565b60405180910390f35b3480156105c9575f80fd5b506105d261103a565b6040516105df9190613dc7565b60405180910390f35b3480156105f3575f80fd5b5061060e60048036038101906106099190613de0565b61105e565b005b34801561061b575f80fd5b5061063660048036038101906106319190613de0565b6110e0565b6040516106439190613ab4565b60405180910390f35b348015610657575f80fd5b50610660611126565b005b34801561066d575f80fd5b5061068860048036038101906106839190613b8a565b611139565b6040516106959190613e0b565b60405180910390f35b3480156106a9575f80fd5b506106c460048036038101906106bf9190613e24565b611140565b6040516106d191906135b9565b60405180910390f35b3480156106e5575f80fd5b506106ee61117a565b6040516106fb9190613b38565b60405180910390f35b34801561070f575f80fd5b50610718611182565b6040516107259190613844565b60405180910390f35b348015610739575f80fd5b506107426111a9565b60405161074f91906134a3565b60405180910390f35b348015610763575f80fd5b5061076c611239565b6040516107799190613ab4565b60405180910390f35b34801561078d575f80fd5b5061079661125d565b6040516107a391906135b9565b60405180910390f35b3480156107b7575f80fd5b506107d260048036038101906107cd9190613561565b611261565b6040516107df91906135b9565b60405180910390f35b3480156107f3575f80fd5b5061080e60048036038101906108099190613e95565b6113a2565b60405161081b91906135b9565b60405180910390f35b34801561082f575f80fd5b506108386113bf565b6040516108459190613844565b60405180910390f35b348015610859575f80fd5b50610874600480360381019061086f9190613f15565b6113e4565b005b348015610881575f80fd5b5061089c60048036038101906108979190613f60565b611405565b6040516108a99190613f9a565b60405180910390f35b3480156108bd575f80fd5b506108d860048036038101906108d39190613fb3565b61141a565b6040516108e59190613d4c565b60405180910390f35b61090860048036038101906109039190614079565b61161c565b005b610924600480360381019061091f91906140e2565b6117e8565b6040516109329291906141d9565b60405180910390f35b348015610946575f80fd5b50610961600480360381019061095c9190613de0565b6118ed565b005b61097d6004803603810190610978919061390f565b61197e565b005b34801561098a575f80fd5b506109a560048036038101906109a09190613de0565b6119fb565b005b3480156109b2575f80fd5b506109cd60048036038101906109c89190614200565b611a7d565b6040516109da9190613ab4565b60405180910390f35b3480156109ee575f80fd5b50610a096004803603810190610a049190613de0565b611aff565b005b348015610a16575f80fd5b50610a1f611c64565b604051610a2c9190613844565b60405180910390f35b348015610a40575f80fd5b50610a5b6004803603810190610a56919061423e565b611c6b565b604051610a6891906135b9565b60405180910390f35b606060088054610a8090614296565b80601f0160208091040260200160405190810160405280929190818152602001828054610aac90614296565b8015610af75780601f10610ace57610100808354040283529160200191610af7565b820191905f5260205f20905b815481529060010190602001808311610ada57829003601f168201915b5050505050905090565b5f80610b0b611ca8565b9050610b18818585611caf565b600191505092915050565b610b2b613386565b6060610b3561339e565b5f8067ffffffffffffffff8016905060405180604001604052808381526020018281525094505f67ffffffffffffffff811115610b7557610b746142c6565b5b604051908082528060200260200182016040528015610bae57816020015b610b9b6133b6565b815260200190600190039081610b935790505b5093505f80610bd7886040013589606001358a5f016020810190610bd29190613f60565b611cc1565b915091506040518060400160405280838152602001828152509450505050509193909250565b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610cb257336040517f91ac5e4f000000000000000000000000000000000000000000000000000000008152600401610ca99190613844565b60405180910390fd5b8660200135610cd1885f016020810190610ccc9190613f60565b611d20565b14610d2a57865f016020810190610ce89190613f60565b87602001356040517fc26bebcc000000000000000000000000000000000000000000000000000000008152600401610d21929190614302565b60405180910390fd5b610d3987878787878787611d91565b50505050505050565b600281565b5f807f02e49c2c000000000000000000000000000000000000000000000000000000006001915091509091565b5f8060016002915091509091565b5f600754905090565b600181565b5f610d99611e30565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfe90614373565b60405180910390fd5b5f8211610e49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e40906143db565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610eb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eae90614443565b60405180910390fd5b610ec2848484611e76565b9050610ecc611ea4565b9392505050565b5f6006905090565b662aa1efb94e000081565b610eee611eae565b610ef88282611f35565b5050565b610f046133cf565b5f610f2984604001358560600135865f016020810190610f249190613f60565b611cc1565b9150505f80610f388684611f94565b91509150610f59865f016020810190610f519190613f60565b838388612141565b935050505092915050565b5f30905090565b6003602052815f5260405f20602052805f5260405f205f91509150508054610f9290614296565b80601f0160208091040260200160405190810160405280929190818152602001828054610fbe90614296565b80156110095780601f10610fe057610100808354040283529160200191611009565b820191905f5260205f20905b815481529060010190602001808311610fec57829003601f168201915b505050505081565b5f8160015f8563ffffffff1663ffffffff1681526020019081526020015f205414905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b611066611eae565b8060045f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff0be4f1e87349231d80c36b33f9e8639658eeaf474014dee15a3e6a4d4414197816040516110d59190613844565b60405180910390a150565b5f60055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61112e611eae565b6111375f612222565b565b5f92915050565b5f3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050949350505050565b5f6006905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600980546111b890614296565b80601f01602080910402602001604051908101604052809291908181526020018280546111e490614296565b801561122f5780601f106112065761010080835404028352916020019161122f565b820191905f5260205f20905b81548152906001019060200180831161121257829003601f168201915b5050505050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f90565b5f61126a611e30565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036112d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cf90614373565b60405180910390fd5b5f821161131a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611311906143db565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1603611388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137f90614443565b60405180910390fd5b61139283836122e3565b905061139c611ea4565b92915050565b600b602052805f5260405f205f915054906101000a900460ff1681565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6113ec611eae565b6114018282906113fc9190614692565b612305565b5050565b6001602052805f5260405f205f915090505481565b60605f60035f8763ffffffff1663ffffffff1681526020019081526020015f205f8661ffff1661ffff1681526020019081526020015f20805461145c90614296565b80601f016020809104026020016040519081016040528092919081815260200182805461148890614296565b80156114d35780601f106114aa576101008083540402835291602001916114d3565b820191905f5260205f20905b8154815290600101906020018083116114b657829003601f168201915b505050505090505f81510361152e5783838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050915050611614565b5f84849050036115415780915050611614565b600284849050106115d55761159884848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505061241a565b80848460029080926115ac939291906146ae565b6040516020016115be93929190614746565b604051602081830303815290604052915050611614565b83836040517f9a6d49cd00000000000000000000000000000000000000000000000000000000815260040161160b929190614797565b60405180910390fd5b949350505050565b5f5b8282905081101561173b573683838381811061163d5761163c6147b9565b5b905060200281019061164f91906147f2565b9050611674815f015f0160208101906116689190613f60565b825f0160200135611011565b61167e575061172e565b3073ffffffffffffffffffffffffffffffffffffffff1663d045a0dc8260c00135835f018460a00135858061010001906116b8919061481a565b8760e00160208101906116cb9190613de0565b888061012001906116dc919061481a565b6040518963ffffffff1660e01b81526004016116fe979695949392919061494f565b5f604051808303818588803b158015611715575f80fd5b505af1158015611727573d5f803e3d5ffd5b5050505050505b808060010191505061161e565b503373ffffffffffffffffffffffffffffffffffffffff16638e9e70996040518163ffffffff1660e01b81526004015f60405180830381865afa158015611784573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906117ac9190614a20565b6040517f8351eea70000000000000000000000000000000000000000000000000000000081526004016117df9190613d4c565b60405180910390fd5b6117f06133e7565b6117f861339e565b5f8061181f33886040013589606001358a5f01602081019061181a9190613f60565b612473565b915091505f8061182f8984611f94565b91509150611861895f0160208101906118489190613f60565b83838b80360381019061185b9190614ab4565b8b61249b565b955060405180604001604052808581526020018481525094503373ffffffffffffffffffffffffffffffffffffffff16865f01517f85496b760a4b7f8d66384b9df21b381f5d1b1e79f229a47aaf4c232edc2fe59a8b5f0160208101906118c89190613f60565b87876040516118d993929190614adf565b60405180910390a350505050935093915050565b6118f5611eae565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ca5eb5e1826040518263ffffffff1660e01b815260040161194e9190613844565b5f604051808303815f87803b158015611965575f80fd5b505af1158015611977573d5f803e3d5ffd5b5050505050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119e3576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119f2878787878787876125b1565b50505050505050565b611a03611eae565b8060025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fd48d879cef83a1c0bdda516f27b13ddb1b3f8bbac1c9e1511bb2a659c242776081604051611a729190613844565b60405180910390a150565b5f60065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b611b07611eae565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6c90614b5e565b60405180910390fd5b611b7d611182565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be190614bc6565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4f90614c54565b60405180910390fd5b611c6181612222565b50565b5f30905090565b5f816020013560015f845f016020810190611c869190613f60565b63ffffffff1663ffffffff1681526020019081526020015f2054149050919050565b5f33905090565b611cbc83838360016125c9565b505050565b5f80611ccc85612798565b915081905083811015611d185780846040517f71c4efed000000000000000000000000000000000000000000000000000000008152600401611d0f929190614c72565b60405180910390fd5b935093915050565b5f8060015f8463ffffffff1663ffffffff1681526020019081526020015f205490505f801b8103611d8857826040517ff6ff4fb7000000000000000000000000000000000000000000000000000000008152600401611d7f9190614c99565b60405180910390fd5b80915050919050565b600b5f8781526020019081526020015f205f9054906101000a900460ff1615611def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de690614cfc565b60405180910390fd5b6001600b5f8881526020019081526020015f205f6101000a81548160ff021916908315150217905550611e27878787878787876127f7565b50505050505050565b6002600a5403611e6c576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600a81905550565b5f80611e80611ca8565b9050611e8d858285612981565b611e98858585612a14565b60019150509392505050565b6001600a81905550565b611eb6611ca8565b73ffffffffffffffffffffffffffffffffffffffff16611ed4611182565b73ffffffffffffffffffffffffffffffffffffffff1614611f3357611ef7611ca8565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401611f2a9190613844565b60405180910390fd5b565b8060015f8463ffffffff1663ffffffff1681526020019081526020015f20819055507f238399d427b947898edb290f5ff0f9109849b1c3ba196a42e35f00c50a54b98b8282604051611f88929190614302565b60405180910390a15050565b6060805f6120008560200135611fa986612b04565b878060a00190611fb9919061481a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050612b38565b80925081945050505f81612015576001612018565b60025b9050612045865f01602081019061202f9190613f60565b82888060800190612040919061481a565b61141a565b92505f73ffffffffffffffffffffffffffffffffffffffff1660045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121385760045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663043a78eb85856040518363ffffffff1660e01b81526004016120f7929190614d1a565b602060405180830381865afa158015612112573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121369190614d63565b505b50509250929050565b6121496133cf565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ddc28c586040518060a001604052808863ffffffff1681526020016121a589611d20565b8152602001878152602001868152602001851515815250306040518363ffffffff1660e01b81526004016121da929190614e5f565b6040805180830381865afa1580156121f4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122189190614eee565b9050949350505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f806122ed611ca8565b90506122fa818585612a14565b600191505092915050565b5f5b81518110156123df57612337828281518110612326576123256147b9565b5b60200260200101516040015161241a565b81818151811061234a576123496147b9565b5b60200260200101516040015160035f84848151811061236c5761236b6147b9565b5b60200260200101515f015163ffffffff1663ffffffff1681526020019081526020015f205f8484815181106123a4576123a36147b9565b5b60200260200101516020015161ffff1661ffff1681526020019081526020015f2090816123d191906150ad565b508080600101915050612307565b507fbe4864a8e820971c0247f5992e2da559595f7bf076a21cb5928d443d2a13b6748160405161240f9190615293565b60405180910390a150565b5f60028201519050600361ffff168161ffff161461246f57816040517f9a6d49cd0000000000000000000000000000000000000000000000000000000081526004016124669190613d4c565b60405180910390fd5b5050565b5f80612480858585611cc1565b80925081935050506124928683612ba6565b94509492505050565b6124a36133e7565b5f6124b0845f0151612c25565b90505f846020015111156124cc576124cb8460200151612c72565b5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632637a450826040518060a001604052808b63ffffffff1681526020016125298c611d20565b81526020018a81526020018981526020015f8960200151111515815250866040518463ffffffff1660e01b8152600401612564929190614e5f565b60806040518083038185885af1158015612580573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906125a5919061533c565b91505095945050505050565b6125c087878787878787611d91565b50505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612639575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016126309190613844565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036126a9575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016126a09190613844565b60405180910390fd5b8160065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015612792578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516127899190613ab4565b60405180910390a35b50505050565b5f7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000836127e691906153c1565b6127f091906153f1565b9050919050565b5f61280a6128058787612db8565b612de2565b90505f61283a8261282361281e8a8a612ded565b612e1e565b8b5f0160208101906128359190613f60565b612e5c565b90506128468787612f06565b15612914575f6128848a60400160208101906128629190615432565b8b5f0160208101906128749190613f60565b8461287f8c8c612f19565b612f7b565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637cb59012848b5f856040518563ffffffff1660e01b81526004016128e59493929190615496565b5f604051808303815f87803b1580156128fc575f80fd5b505af115801561290e573d5f803e3d5ffd5b50505050505b8173ffffffffffffffffffffffffffffffffffffffff16887fefed6d3500546b29533b128a29e3a94d70788727f0507505ac12eaf2e578fd9c8b5f01602081019061295f9190613f60565b8460405161296e9291906154e0565b60405180910390a3505050505050505050565b5f61298c8484611a7d565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811015612a0e57818110156129ff578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016129f693929190615507565b60405180910390fd5b612a0d84848484035f6125c9565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a84575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401612a7b9190613844565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612af4575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401612aeb9190613844565b60405180910390fd5b612aff838383612fad565b505050565b5f7f000000000000000000000000000000000000000000000000000000000000000082612b3191906153c1565b9050919050565b60605f80835111905080612b6d578484604051602001612b59929190615590565b604051602081830303815290604052612b9c565b8484612b78336131c9565b85604051602001612b8c94939291906155bb565b6040516020818303038152906040525b9150935093915050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612c16575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401612c0d9190613844565b60405180910390fd5b612c21825f83612fad565b5050565b5f813414612c6a57346040517f9f704120000000000000000000000000000000000000000000000000000000008152600401612c619190613ab4565b60405180910390fd5b819050919050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e4fe1d946040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cdc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d009190615618565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612d67576040517f5373352a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612db4337f0000000000000000000000000000000000000000000000000000000000000000848473ffffffffffffffffffffffffffffffffffffffff166131ea909392919063ffffffff16565b5050565b5f82825f90602060ff1692612dcf939291906146ae565b90612dda919061564d565b905092915050565b5f815f1c9050919050565b5f8282602060ff1690602860ff1692612e08939291906146ae565b90612e1391906156d6565b60c01c905092915050565b5f7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16612e5591906153f1565b9050919050565b5f662aa1efb94e000083612e6e610d82565b612e789190615734565b1115612eb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb0906157b1565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612ef25761dead93505b612efc848461326c565b8290509392505050565b5f602860ff168383905011905092915050565b60608282602860ff16908092612f31939291906146ae565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050905092915050565b606084848484604051602001612f949493929190615823565b6040516020818303038152906040529050949350505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612ffd578060075f828254612ff19190615734565b925050819055506130cd565b5f60055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015613087578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161307e93929190615507565b60405180910390fd5b81810360055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613114578060075f828254039250508190555061315f565b8060055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516131bc9190613ab4565b60405180910390a3505050565b5f8173ffffffffffffffffffffffffffffffffffffffff165f1b9050919050565b613266848573ffffffffffffffffffffffffffffffffffffffff166323b872dd86868660405160240161321f9392919061586c565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506132eb565b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036132dc575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016132d39190613844565b60405180910390fd5b6132e75f8383612fad565b5050565b5f8060205f8451602086015f885af18061330a576040513d5f823e3d81fd5b3d92505f519150505f821461332357600181141561333e565b5f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561338057836040517f5274afe70000000000000000000000000000000000000000000000000000000081526004016133779190613844565b60405180910390fd5b50505050565b60405180604001604052805f81526020015f81525090565b60405180604001604052805f81526020015f81525090565b60405180604001604052805f8152602001606081525090565b60405180604001604052805f81526020015f81525090565b60405180606001604052805f80191681526020015f67ffffffffffffffff1681526020016134136133cf565b81525090565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613450578082015181840152602081019050613435565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61347582613419565b61347f8185613423565b935061348f818560208601613433565b6134988161345b565b840191505092915050565b5f6020820190508181035f8301526134bb818461346b565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6134fd826134d4565b9050919050565b61350d816134f3565b8114613517575f80fd5b50565b5f8135905061352881613504565b92915050565b5f819050919050565b6135408161352e565b811461354a575f80fd5b50565b5f8135905061355b81613537565b92915050565b5f8060408385031215613577576135766134cc565b5b5f6135848582860161351a565b92505060206135958582860161354d565b9150509250929050565b5f8115159050919050565b6135b38161359f565b82525050565b5f6020820190506135cc5f8301846135aa565b92915050565b5f80fd5b5f60e082840312156135eb576135ea6135d2565b5b81905092915050565b5f60208284031215613609576136086134cc565b5b5f82013567ffffffffffffffff811115613626576136256134d0565b5b613632848285016135d6565b91505092915050565b6136448161352e565b82525050565b604082015f82015161365e5f85018261363b565b506020820151613671602085018261363b565b50505050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f819050919050565b6136b2816136a0565b82525050565b5f82825260208201905092915050565b5f6136d282613419565b6136dc81856136b8565b93506136ec818560208601613433565b6136f58161345b565b840191505092915050565b5f604083015f8301516137155f8601826136a9565b506020830151848203602086015261372d82826136c8565b9150508091505092915050565b5f6137458383613700565b905092915050565b5f602082019050919050565b5f61376382613677565b61376d8185613681565b93508360208202850161377f85613691565b805f5b858110156137ba578484038952815161379b858261373a565b94506137a68361374d565b925060208a01995050600181019050613782565b50829750879550505050505092915050565b604082015f8201516137e05f85018261363b565b5060208201516137f3602085018261363b565b50505050565b5f60a08201905061380c5f83018661364a565b818103604083015261381e8185613759565b905061382d60608301846137cc565b949350505050565b61383e816134f3565b82525050565b5f6020820190506138575f830184613835565b92915050565b5f60608284031215613872576138716135d2565b5b81905092915050565b5f819050919050565b61388d8161387b565b8114613897575f80fd5b50565b5f813590506138a881613884565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f8401126138cf576138ce6138ae565b5b8235905067ffffffffffffffff8111156138ec576138eb6138b2565b5b602083019150836001820283011115613908576139076138b6565b5b9250929050565b5f805f805f805f60e0888a03121561392a576139296134cc565b5b5f6139378a828b0161385d565b97505060606139488a828b0161389a565b965050608088013567ffffffffffffffff811115613969576139686134d0565b5b6139758a828b016138ba565b955095505060a06139888a828b0161351a565b93505060c088013567ffffffffffffffff8111156139a9576139a86134d0565b5b6139b58a828b016138ba565b925092505092959891949750929550565b5f61ffff82169050919050565b6139dc816139c6565b82525050565b5f6020820190506139f55f8301846139d3565b92915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613a2f816139fb565b82525050565b5f67ffffffffffffffff82169050919050565b613a5181613a35565b82525050565b5f604082019050613a6a5f830185613a26565b613a776020830184613a48565b9392505050565b5f604082019050613a915f830185613a48565b613a9e6020830184613a48565b9392505050565b613aae8161352e565b82525050565b5f602082019050613ac75f830184613aa5565b92915050565b5f805f60608486031215613ae457613ae36134cc565b5b5f613af18682870161351a565b9350506020613b028682870161351a565b9250506040613b138682870161354d565b9150509250925092565b5f60ff82169050919050565b613b3281613b1d565b82525050565b5f602082019050613b4b5f830184613b29565b92915050565b5f63ffffffff82169050919050565b613b6981613b51565b8114613b73575f80fd5b50565b5f81359050613b8481613b60565b92915050565b5f8060408385031215613ba057613b9f6134cc565b5b5f613bad85828601613b76565b9250506020613bbe8582860161389a565b9150509250929050565b613bd18161359f565b8114613bdb575f80fd5b50565b5f81359050613bec81613bc8565b92915050565b5f8060408385031215613c0857613c076134cc565b5b5f83013567ffffffffffffffff811115613c2557613c246134d0565b5b613c31858286016135d6565b9250506020613c4285828601613bde565b9150509250929050565b604082015f820151613c605f85018261363b565b506020820151613c73602085018261363b565b50505050565b5f604082019050613c8c5f830184613c4c565b92915050565b613c9b816139c6565b8114613ca5575f80fd5b50565b5f81359050613cb681613c92565b92915050565b5f8060408385031215613cd257613cd16134cc565b5b5f613cdf85828601613b76565b9250506020613cf085828601613ca8565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f613d1e82613cfa565b613d288185613d04565b9350613d38818560208601613433565b613d418161345b565b840191505092915050565b5f6020820190508181035f830152613d648184613d14565b905092915050565b5f819050919050565b5f613d8f613d8a613d85846134d4565b613d6c565b6134d4565b9050919050565b5f613da082613d75565b9050919050565b5f613db182613d96565b9050919050565b613dc181613da7565b82525050565b5f602082019050613dda5f830184613db8565b92915050565b5f60208284031215613df557613df46134cc565b5b5f613e028482850161351a565b91505092915050565b5f602082019050613e1e5f830184613a48565b92915050565b5f805f8060a08587031215613e3c57613e3b6134cc565b5b5f613e498782880161385d565b945050606085013567ffffffffffffffff811115613e6a57613e696134d0565b5b613e76878288016138ba565b93509350506080613e898782880161351a565b91505092959194509250565b5f60208284031215613eaa57613ea96134cc565b5b5f613eb78482850161389a565b91505092915050565b5f8083601f840112613ed557613ed46138ae565b5b8235905067ffffffffffffffff811115613ef257613ef16138b2565b5b602083019150836020820283011115613f0e57613f0d6138b6565b5b9250929050565b5f8060208385031215613f2b57613f2a6134cc565b5b5f83013567ffffffffffffffff811115613f4857613f476134d0565b5b613f5485828601613ec0565b92509250509250929050565b5f60208284031215613f7557613f746134cc565b5b5f613f8284828501613b76565b91505092915050565b613f948161387b565b82525050565b5f602082019050613fad5f830184613f8b565b92915050565b5f805f8060608587031215613fcb57613fca6134cc565b5b5f613fd887828801613b76565b9450506020613fe987828801613ca8565b935050604085013567ffffffffffffffff81111561400a576140096134d0565b5b614016878288016138ba565b925092505092959194509250565b5f8083601f840112614039576140386138ae565b5b8235905067ffffffffffffffff811115614056576140556138b2565b5b602083019150836020820283011115614072576140716138b6565b5b9250929050565b5f806020838503121561408f5761408e6134cc565b5b5f83013567ffffffffffffffff8111156140ac576140ab6134d0565b5b6140b885828601614024565b92509250509250929050565b5f604082840312156140d9576140d86135d2565b5b81905092915050565b5f805f608084860312156140f9576140f86134cc565b5b5f84013567ffffffffffffffff811115614116576141156134d0565b5b614122868287016135d6565b9350506020614133868287016140c4565b92505060606141448682870161351a565b9150509250925092565b6141578161387b565b82525050565b61416681613a35565b82525050565b604082015f8201516141805f85018261363b565b506020820151614193602085018261363b565b50505050565b608082015f8201516141ad5f85018261414e565b5060208201516141c0602085018261415d565b5060408201516141d3604085018261416c565b50505050565b5f60c0820190506141ec5f830185614199565b6141f960808301846137cc565b9392505050565b5f8060408385031215614216576142156134cc565b5b5f6142238582860161351a565b92505060206142348582860161351a565b9150509250929050565b5f60608284031215614253576142526134cc565b5b5f6142608482850161385d565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806142ad57607f821691505b6020821081036142c0576142bf614269565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6142fc81613b51565b82525050565b5f6040820190506143155f8301856142f3565b6143226020830184613f8b565b9392505050565b7f496e76616c6964206164647265737300000000000000000000000000000000005f82015250565b5f61435d600f83613423565b915061436882614329565b602082019050919050565b5f6020820190508181035f83015261438a81614351565b9050919050565b7f496e76616c696420616d6f756e740000000000000000000000000000000000005f82015250565b5f6143c5600e83613423565b91506143d082614391565b602082019050919050565b5f6020820190508181035f8301526143f2816143b9565b9050919050565b7f53656c662d7472616e73666572206e6f7420616c6c6f776564000000000000005f82015250565b5f61442d601983613423565b9150614438826143f9565b602082019050919050565b5f6020820190508181035f83015261445a81614421565b9050919050565b61446a8261345b565b810181811067ffffffffffffffff82111715614489576144886142c6565b5b80604052505050565b5f61449b6134c3565b90506144a78282614461565b919050565b5f67ffffffffffffffff8211156144c6576144c56142c6565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b5f67ffffffffffffffff8211156144fd576144fc6142c6565b5b6145068261345b565b9050602081019050919050565b828183375f83830152505050565b5f61453361452e846144e3565b614492565b90508281526020810184848401111561454f5761454e6144df565b5b61455a848285614513565b509392505050565b5f82601f830112614576576145756138ae565b5b8135614586848260208601614521565b91505092915050565b5f606082840312156145a4576145a36144d7565b5b6145ae6060614492565b90505f6145bd84828501613b76565b5f8301525060206145d084828501613ca8565b602083015250604082013567ffffffffffffffff8111156145f4576145f36144db565b5b61460084828501614562565b60408301525092915050565b5f61461e614619846144ac565b614492565b90508083825260208201905060208402830185811115614641576146406138b6565b5b835b8181101561468857803567ffffffffffffffff811115614666576146656138ae565b5b808601614673898261458f565b85526020850194505050602081019050614643565b5050509392505050565b5f61469e36848461460c565b905092915050565b5f80fd5b5f80fd5b5f80858511156146c1576146c06146a6565b5b838611156146d2576146d16146aa565b5b6001850283019150848603905094509492505050565b5f81905092915050565b5f6146fc82613cfa565b61470681856146e8565b9350614716818560208601613433565b80840191505092915050565b5f61472d83856146e8565b935061473a838584614513565b82840190509392505050565b5f61475182866146f2565b915061475e828486614722565b9150819050949350505050565b5f6147768385613d04565b9350614783838584614513565b61478c8361345b565b840190509392505050565b5f6020820190508181035f8301526147b081848661476b565b90509392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f80fd5b5f80fd5b5f80fd5b5f823560016101400383360303811261480e5761480d6147e6565b5b80830191505092915050565b5f8083356001602003843603038112614836576148356147e6565b5b80840192508235915067ffffffffffffffff821115614858576148576147ea565b5b602083019250600182023603831315614874576148736147ee565b5b509250929050565b5f61488a6020840184613b76565b905092915050565b61489b81613b51565b82525050565b5f6148af602084018461389a565b905092915050565b6148c081613a35565b81146148ca575f80fd5b50565b5f813590506148db816148b7565b92915050565b5f6148ef60208401846148cd565b905092915050565b606082016149075f83018361487c565b6149135f850182614892565b5061492160208301836148a1565b61492e602085018261414e565b5061493c60408301836148e1565b614949604085018261415d565b50505050565b5f60e0820190506149625f83018a6148f7565b61496f6060830189613f8b565b818103608083015261498281878961476b565b905061499160a0830186613835565b81810360c08301526149a481848661476b565b905098975050505050505050565b5f6149c46149bf846144e3565b614492565b9050828152602081018484840111156149e0576149df6144df565b5b6149eb848285613433565b509392505050565b5f82601f830112614a0757614a066138ae565b5b8151614a178482602086016149b2565b91505092915050565b5f60208284031215614a3557614a346134cc565b5b5f82015167ffffffffffffffff811115614a5257614a516134d0565b5b614a5e848285016149f3565b91505092915050565b5f60408284031215614a7c57614a7b6144d7565b5b614a866040614492565b90505f614a958482850161354d565b5f830152506020614aa88482850161354d565b60208301525092915050565b5f60408284031215614ac957614ac86134cc565b5b5f614ad684828501614a67565b91505092915050565b5f606082019050614af25f8301866142f3565b614aff6020830185613aa5565b614b0c6040830184613aa5565b949350505050565b7f496e76616c6964206f776e6572000000000000000000000000000000000000005f82015250565b5f614b48600d83613423565b9150614b5382614b14565b602082019050919050565b5f6020820190508181035f830152614b7581614b3c565b9050919050565b7f53616d65206f776e6572000000000000000000000000000000000000000000005f82015250565b5f614bb0600a83613423565b9150614bbb82614b7c565b602082019050919050565b5f6020820190508181035f830152614bdd81614ba4565b9050919050565b7f43616e6e6f74207472616e73666572206f776e65727368697020746f2073656c5f8201527f6600000000000000000000000000000000000000000000000000000000000000602082015250565b5f614c3e602183613423565b9150614c4982614be4565b604082019050919050565b5f6020820190508181035f830152614c6b81614c32565b9050919050565b5f604082019050614c855f830185613aa5565b614c926020830184613aa5565b9392505050565b5f602082019050614cac5f8301846142f3565b92915050565b7f4d65737361676520616c72656164792070726f636573736564000000000000005f82015250565b5f614ce6601983613423565b9150614cf182614cb2565b602082019050919050565b5f6020820190508181035f830152614d1381614cda565b9050919050565b5f6040820190508181035f830152614d328185613d14565b90508181036020830152614d468184613d14565b90509392505050565b5f81519050614d5d81613bc8565b92915050565b5f60208284031215614d7857614d776134cc565b5b5f614d8584828501614d4f565b91505092915050565b5f82825260208201905092915050565b5f614da882613cfa565b614db28185614d8e565b9350614dc2818560208601613433565b614dcb8161345b565b840191505092915050565b614ddf8161359f565b82525050565b5f60a083015f830151614dfa5f860182614892565b506020830151614e0d602086018261414e565b5060408301518482036040860152614e258282614d9e565b91505060608301518482036060860152614e3f8282614d9e565b9150506080830151614e546080860182614dd6565b508091505092915050565b5f6040820190508181035f830152614e778185614de5565b9050614e866020830184613835565b9392505050565b5f81519050614e9b81613537565b92915050565b5f60408284031215614eb657614eb56144d7565b5b614ec06040614492565b90505f614ecf84828501614e8d565b5f830152506020614ee284828501614e8d565b60208301525092915050565b5f60408284031215614f0357614f026134cc565b5b5f614f1084828501614ea1565b91505092915050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302614f757fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614f3a565b614f7f8683614f3a565b95508019841693508086168417925050509392505050565b5f614fb1614fac614fa78461352e565b613d6c565b61352e565b9050919050565b5f819050919050565b614fca83614f97565b614fde614fd682614fb8565b848454614f46565b825550505050565b5f90565b614ff2614fe6565b614ffd818484614fc1565b505050565b5b81811015615020576150155f82614fea565b600181019050615003565b5050565b601f8211156150655761503681614f19565b61503f84614f2b565b8101602085101561504e578190505b61506261505a85614f2b565b830182615002565b50505b505050565b5f82821c905092915050565b5f6150855f198460080261506a565b1980831691505092915050565b5f61509d8383615076565b9150826002028217905092915050565b6150b682613cfa565b67ffffffffffffffff8111156150cf576150ce6142c6565b5b6150d98254614296565b6150e4828285615024565b5f60209050601f831160018114615115575f8415615103578287015190505b61510d8582615092565b865550615174565b601f19841661512386614f19565b5f5b8281101561514a57848901518255600182019150602085019450602081019050615125565b868310156151675784890151615163601f891682615076565b8355505b6001600288020188555050505b505050505050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6151ae816139c6565b82525050565b5f606083015f8301516151c95f860182614892565b5060208301516151dc60208601826151a5565b50604083015184820360408601526151f48282614d9e565b9150508091505092915050565b5f61520c83836151b4565b905092915050565b5f602082019050919050565b5f61522a8261517c565b6152348185615186565b93508360208202850161524685615196565b805f5b8581101561528157848403895281516152628582615201565b945061526d83615214565b925060208a01995050600181019050615249565b50829750879550505050505092915050565b5f6020820190508181035f8301526152ab8184615220565b905092915050565b5f815190506152c181613884565b92915050565b5f815190506152d5816148b7565b92915050565b5f608082840312156152f0576152ef6144d7565b5b6152fa6060614492565b90505f615309848285016152b3565b5f83015250602061531c848285016152c7565b602083015250604061533084828501614ea1565b60408301525092915050565b5f60808284031215615351576153506134cc565b5b5f61535e848285016152db565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6153cb8261352e565b91506153d68361352e565b9250826153e6576153e5615367565b5b828204905092915050565b5f6153fb8261352e565b91506154068361352e565b92508282026154148161352e565b9150828204841483151761542b5761542a615394565b5b5092915050565b5f60208284031215615447576154466134cc565b5b5f615454848285016148cd565b91505092915050565b5f819050919050565b5f61548061547b6154768461545d565b613d6c565b6139c6565b9050919050565b61549081615466565b82525050565b5f6080820190506154a95f830187613835565b6154b66020830186613f8b565b6154c36040830185615487565b81810360608301526154d58184613d14565b905095945050505050565b5f6040820190506154f35f8301856142f3565b6155006020830184613aa5565b9392505050565b5f60608201905061551a5f830186613835565b6155276020830185613aa5565b6155346040830184613aa5565b949350505050565b5f819050919050565b6155566155518261387b565b61553c565b82525050565b5f8160c01b9050919050565b5f6155728261555c565b9050919050565b61558a61558582613a35565b615568565b82525050565b5f61559b8285615545565b6020820191506155ab8284615579565b6008820191508190509392505050565b5f6155c68287615545565b6020820191506155d68286615579565b6008820191506155e68285615545565b6020820191506155f682846146f2565b915081905095945050505050565b5f8151905061561281613504565b92915050565b5f6020828403121561562d5761562c6134cc565b5b5f61563a84828501615604565b91505092915050565b5f82905092915050565b5f6156588383615643565b82615663813561387b565b925060208210156156a35761569e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802614f3a565b831692505b505092915050565b5f7fffffffffffffffff00000000000000000000000000000000000000000000000082169050919050565b5f6156e18383615643565b826156ec81356156ab565b9250600882101561572c576157277fffffffffffffffff00000000000000000000000000000000000000000000000083600803600802614f3a565b831692505b505092915050565b5f61573e8261352e565b91506157498361352e565b925082820190508082111561576157615760615394565b5b92915050565b7f45786365656473206d6178696d756d20746f74616c20737570706c79000000005f82015250565b5f61579b601c83613423565b91506157a682615767565b602082019050919050565b5f6020820190508181035f8301526157c88161578f565b9050919050565b5f8160e01b9050919050565b5f6157e5826157cf565b9050919050565b6157fd6157f882613b51565b6157db565b82525050565b5f819050919050565b61581d6158188261352e565b615803565b82525050565b5f61582e8287615579565b60088201915061583e82866157ec565b60048201915061584e828561580c565b60208201915061585e82846146f2565b915081905095945050505050565b5f60608201905061587f5f830186613835565b61588c6020830185613835565b6158996040830184613aa5565b94935050505056fea264697066735822122004b56b0d267cc43e68d8f4ec22aebf50180637bc5229d2fbeb58872fd1c2a15264736f6c63430008160033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000001a44076050125825900e736c501f859c50fe728c000000000000000000000000258d4e26f190eec217bdcc3b32f586eeb03f119e00000000000000000000000000000000000000000000000000000000000000085265616c4c696e6b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045245414c00000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405260043610610266575f3560e01c80637d25a05e11610143578063bb0b6a53116100b5578063d045a0dc11610079578063d045a0dc14610963578063d42438851461097f578063dd62ed3e146109a7578063f2fde38b146109e3578063fc0c546a14610a0b578063ff7bd03d14610a3557610266565b8063bb0b6a5314610876578063bc70b354146108b2578063bd815db0146108ee578063c7c7f5b31461090a578063ca5eb5e11461093b57610266565b8063963efcaa11610107578063963efcaa146107585780639f68b96414610782578063a9059cbb146107ac578063b40d18fb146107e8578063b731ea0a14610824578063b98bd0701461084e57610266565b80637d25a05e1461066257806382413eac1461069e578063857749b0146106da5780638da5cb5b1461070457806395d89b411461072e57610266565b8063313ce567116101dc5780635535d461116101a05780635535d461146105465780635a0dfe4d146105825780635e280f11146105be5780636fc1b31e146105e857806370a0823114610610578063715018a61461064c57610266565b8063313ce5671461046457806333039d3d1461048e5780633400288b146104b85780633b6f743b146104e057806352ae28791461051c57610266565b8063134d4f251161022e578063134d4f2514610354578063156a0d0f1461037e57806317442b70146103a957806318160ddd146103d45780631f5e1334146103fe57806323b872dd1461042857610266565b806306fdde031461026a578063095ea7b3146102945780630d35b415146102d0578063111ecdad1461030e57806313137d6514610338575b5f80fd5b348015610275575f80fd5b5061027e610a71565b60405161028b91906134a3565b60405180910390f35b34801561029f575f80fd5b506102ba60048036038101906102b59190613561565b610b01565b6040516102c791906135b9565b60405180910390f35b3480156102db575f80fd5b506102f660048036038101906102f191906135f4565b610b23565b604051610305939291906137f9565b60405180910390f35b348015610319575f80fd5b50610322610bfd565b60405161032f9190613844565b60405180910390f35b610352600480360381019061034d919061390f565b610c22565b005b34801561035f575f80fd5b50610368610d42565b60405161037591906139e2565b60405180910390f35b348015610389575f80fd5b50610392610d47565b6040516103a0929190613a57565b60405180910390f35b3480156103b4575f80fd5b506103bd610d74565b6040516103cb929190613a7e565b60405180910390f35b3480156103df575f80fd5b506103e8610d82565b6040516103f59190613ab4565b60405180910390f35b348015610409575f80fd5b50610412610d8b565b60405161041f91906139e2565b60405180910390f35b348015610433575f80fd5b5061044e60048036038101906104499190613acd565b610d90565b60405161045b91906135b9565b60405180910390f35b34801561046f575f80fd5b50610478610ed3565b6040516104859190613b38565b60405180910390f35b348015610499575f80fd5b506104a2610edb565b6040516104af9190613ab4565b60405180910390f35b3480156104c3575f80fd5b506104de60048036038101906104d99190613b8a565b610ee6565b005b3480156104eb575f80fd5b5061050660048036038101906105019190613bf2565b610efc565b6040516105139190613c79565b60405180910390f35b348015610527575f80fd5b50610530610f64565b60405161053d9190613844565b60405180910390f35b348015610551575f80fd5b5061056c60048036038101906105679190613cbc565b610f6b565b6040516105799190613d4c565b60405180910390f35b34801561058d575f80fd5b506105a860048036038101906105a39190613b8a565b611011565b6040516105b591906135b9565b60405180910390f35b3480156105c9575f80fd5b506105d261103a565b6040516105df9190613dc7565b60405180910390f35b3480156105f3575f80fd5b5061060e60048036038101906106099190613de0565b61105e565b005b34801561061b575f80fd5b5061063660048036038101906106319190613de0565b6110e0565b6040516106439190613ab4565b60405180910390f35b348015610657575f80fd5b50610660611126565b005b34801561066d575f80fd5b5061068860048036038101906106839190613b8a565b611139565b6040516106959190613e0b565b60405180910390f35b3480156106a9575f80fd5b506106c460048036038101906106bf9190613e24565b611140565b6040516106d191906135b9565b60405180910390f35b3480156106e5575f80fd5b506106ee61117a565b6040516106fb9190613b38565b60405180910390f35b34801561070f575f80fd5b50610718611182565b6040516107259190613844565b60405180910390f35b348015610739575f80fd5b506107426111a9565b60405161074f91906134a3565b60405180910390f35b348015610763575f80fd5b5061076c611239565b6040516107799190613ab4565b60405180910390f35b34801561078d575f80fd5b5061079661125d565b6040516107a391906135b9565b60405180910390f35b3480156107b7575f80fd5b506107d260048036038101906107cd9190613561565b611261565b6040516107df91906135b9565b60405180910390f35b3480156107f3575f80fd5b5061080e60048036038101906108099190613e95565b6113a2565b60405161081b91906135b9565b60405180910390f35b34801561082f575f80fd5b506108386113bf565b6040516108459190613844565b60405180910390f35b348015610859575f80fd5b50610874600480360381019061086f9190613f15565b6113e4565b005b348015610881575f80fd5b5061089c60048036038101906108979190613f60565b611405565b6040516108a99190613f9a565b60405180910390f35b3480156108bd575f80fd5b506108d860048036038101906108d39190613fb3565b61141a565b6040516108e59190613d4c565b60405180910390f35b61090860048036038101906109039190614079565b61161c565b005b610924600480360381019061091f91906140e2565b6117e8565b6040516109329291906141d9565b60405180910390f35b348015610946575f80fd5b50610961600480360381019061095c9190613de0565b6118ed565b005b61097d6004803603810190610978919061390f565b61197e565b005b34801561098a575f80fd5b506109a560048036038101906109a09190613de0565b6119fb565b005b3480156109b2575f80fd5b506109cd60048036038101906109c89190614200565b611a7d565b6040516109da9190613ab4565b60405180910390f35b3480156109ee575f80fd5b50610a096004803603810190610a049190613de0565b611aff565b005b348015610a16575f80fd5b50610a1f611c64565b604051610a2c9190613844565b60405180910390f35b348015610a40575f80fd5b50610a5b6004803603810190610a56919061423e565b611c6b565b604051610a6891906135b9565b60405180910390f35b606060088054610a8090614296565b80601f0160208091040260200160405190810160405280929190818152602001828054610aac90614296565b8015610af75780601f10610ace57610100808354040283529160200191610af7565b820191905f5260205f20905b815481529060010190602001808311610ada57829003601f168201915b5050505050905090565b5f80610b0b611ca8565b9050610b18818585611caf565b600191505092915050565b610b2b613386565b6060610b3561339e565b5f8067ffffffffffffffff8016905060405180604001604052808381526020018281525094505f67ffffffffffffffff811115610b7557610b746142c6565b5b604051908082528060200260200182016040528015610bae57816020015b610b9b6133b6565b815260200190600190039081610b935790505b5093505f80610bd7886040013589606001358a5f016020810190610bd29190613f60565b611cc1565b915091506040518060400160405280838152602001828152509450505050509193909250565b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff167f0000000000000000000000001a44076050125825900e736c501f859c50fe728c73ffffffffffffffffffffffffffffffffffffffff1614610cb257336040517f91ac5e4f000000000000000000000000000000000000000000000000000000008152600401610ca99190613844565b60405180910390fd5b8660200135610cd1885f016020810190610ccc9190613f60565b611d20565b14610d2a57865f016020810190610ce89190613f60565b87602001356040517fc26bebcc000000000000000000000000000000000000000000000000000000008152600401610d21929190614302565b60405180910390fd5b610d3987878787878787611d91565b50505050505050565b600281565b5f807f02e49c2c000000000000000000000000000000000000000000000000000000006001915091509091565b5f8060016002915091509091565b5f600754905090565b600181565b5f610d99611e30565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfe90614373565b60405180910390fd5b5f8211610e49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e40906143db565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610eb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eae90614443565b60405180910390fd5b610ec2848484611e76565b9050610ecc611ea4565b9392505050565b5f6006905090565b662aa1efb94e000081565b610eee611eae565b610ef88282611f35565b5050565b610f046133cf565b5f610f2984604001358560600135865f016020810190610f249190613f60565b611cc1565b9150505f80610f388684611f94565b91509150610f59865f016020810190610f519190613f60565b838388612141565b935050505092915050565b5f30905090565b6003602052815f5260405f20602052805f5260405f205f91509150508054610f9290614296565b80601f0160208091040260200160405190810160405280929190818152602001828054610fbe90614296565b80156110095780601f10610fe057610100808354040283529160200191611009565b820191905f5260205f20905b815481529060010190602001808311610fec57829003601f168201915b505050505081565b5f8160015f8563ffffffff1663ffffffff1681526020019081526020015f205414905092915050565b7f0000000000000000000000001a44076050125825900e736c501f859c50fe728c81565b611066611eae565b8060045f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff0be4f1e87349231d80c36b33f9e8639658eeaf474014dee15a3e6a4d4414197816040516110d59190613844565b60405180910390a150565b5f60055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61112e611eae565b6111375f612222565b565b5f92915050565b5f3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050949350505050565b5f6006905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600980546111b890614296565b80601f01602080910402602001604051908101604052809291908181526020018280546111e490614296565b801561122f5780601f106112065761010080835404028352916020019161122f565b820191905f5260205f20905b81548152906001019060200180831161121257829003601f168201915b5050505050905090565b7f000000000000000000000000000000000000000000000000000000000000000181565b5f90565b5f61126a611e30565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036112d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cf90614373565b60405180910390fd5b5f821161131a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611311906143db565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1603611388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137f90614443565b60405180910390fd5b61139283836122e3565b905061139c611ea4565b92915050565b600b602052805f5260405f205f915054906101000a900460ff1681565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6113ec611eae565b6114018282906113fc9190614692565b612305565b5050565b6001602052805f5260405f205f915090505481565b60605f60035f8763ffffffff1663ffffffff1681526020019081526020015f205f8661ffff1661ffff1681526020019081526020015f20805461145c90614296565b80601f016020809104026020016040519081016040528092919081815260200182805461148890614296565b80156114d35780601f106114aa576101008083540402835291602001916114d3565b820191905f5260205f20905b8154815290600101906020018083116114b657829003601f168201915b505050505090505f81510361152e5783838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050915050611614565b5f84849050036115415780915050611614565b600284849050106115d55761159884848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505061241a565b80848460029080926115ac939291906146ae565b6040516020016115be93929190614746565b604051602081830303815290604052915050611614565b83836040517f9a6d49cd00000000000000000000000000000000000000000000000000000000815260040161160b929190614797565b60405180910390fd5b949350505050565b5f5b8282905081101561173b573683838381811061163d5761163c6147b9565b5b905060200281019061164f91906147f2565b9050611674815f015f0160208101906116689190613f60565b825f0160200135611011565b61167e575061172e565b3073ffffffffffffffffffffffffffffffffffffffff1663d045a0dc8260c00135835f018460a00135858061010001906116b8919061481a565b8760e00160208101906116cb9190613de0565b888061012001906116dc919061481a565b6040518963ffffffff1660e01b81526004016116fe979695949392919061494f565b5f604051808303818588803b158015611715575f80fd5b505af1158015611727573d5f803e3d5ffd5b5050505050505b808060010191505061161e565b503373ffffffffffffffffffffffffffffffffffffffff16638e9e70996040518163ffffffff1660e01b81526004015f60405180830381865afa158015611784573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906117ac9190614a20565b6040517f8351eea70000000000000000000000000000000000000000000000000000000081526004016117df9190613d4c565b60405180910390fd5b6117f06133e7565b6117f861339e565b5f8061181f33886040013589606001358a5f01602081019061181a9190613f60565b612473565b915091505f8061182f8984611f94565b91509150611861895f0160208101906118489190613f60565b83838b80360381019061185b9190614ab4565b8b61249b565b955060405180604001604052808581526020018481525094503373ffffffffffffffffffffffffffffffffffffffff16865f01517f85496b760a4b7f8d66384b9df21b381f5d1b1e79f229a47aaf4c232edc2fe59a8b5f0160208101906118c89190613f60565b87876040516118d993929190614adf565b60405180910390a350505050935093915050565b6118f5611eae565b7f0000000000000000000000001a44076050125825900e736c501f859c50fe728c73ffffffffffffffffffffffffffffffffffffffff1663ca5eb5e1826040518263ffffffff1660e01b815260040161194e9190613844565b5f604051808303815f87803b158015611965575f80fd5b505af1158015611977573d5f803e3d5ffd5b5050505050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119e3576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119f2878787878787876125b1565b50505050505050565b611a03611eae565b8060025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fd48d879cef83a1c0bdda516f27b13ddb1b3f8bbac1c9e1511bb2a659c242776081604051611a729190613844565b60405180910390a150565b5f60065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b611b07611eae565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6c90614b5e565b60405180910390fd5b611b7d611182565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be190614bc6565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4f90614c54565b60405180910390fd5b611c6181612222565b50565b5f30905090565b5f816020013560015f845f016020810190611c869190613f60565b63ffffffff1663ffffffff1681526020019081526020015f2054149050919050565b5f33905090565b611cbc83838360016125c9565b505050565b5f80611ccc85612798565b915081905083811015611d185780846040517f71c4efed000000000000000000000000000000000000000000000000000000008152600401611d0f929190614c72565b60405180910390fd5b935093915050565b5f8060015f8463ffffffff1663ffffffff1681526020019081526020015f205490505f801b8103611d8857826040517ff6ff4fb7000000000000000000000000000000000000000000000000000000008152600401611d7f9190614c99565b60405180910390fd5b80915050919050565b600b5f8781526020019081526020015f205f9054906101000a900460ff1615611def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de690614cfc565b60405180910390fd5b6001600b5f8881526020019081526020015f205f6101000a81548160ff021916908315150217905550611e27878787878787876127f7565b50505050505050565b6002600a5403611e6c576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600a81905550565b5f80611e80611ca8565b9050611e8d858285612981565b611e98858585612a14565b60019150509392505050565b6001600a81905550565b611eb6611ca8565b73ffffffffffffffffffffffffffffffffffffffff16611ed4611182565b73ffffffffffffffffffffffffffffffffffffffff1614611f3357611ef7611ca8565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401611f2a9190613844565b60405180910390fd5b565b8060015f8463ffffffff1663ffffffff1681526020019081526020015f20819055507f238399d427b947898edb290f5ff0f9109849b1c3ba196a42e35f00c50a54b98b8282604051611f88929190614302565b60405180910390a15050565b6060805f6120008560200135611fa986612b04565b878060a00190611fb9919061481a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050612b38565b80925081945050505f81612015576001612018565b60025b9050612045865f01602081019061202f9190613f60565b82888060800190612040919061481a565b61141a565b92505f73ffffffffffffffffffffffffffffffffffffffff1660045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121385760045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663043a78eb85856040518363ffffffff1660e01b81526004016120f7929190614d1a565b602060405180830381865afa158015612112573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121369190614d63565b505b50509250929050565b6121496133cf565b7f0000000000000000000000001a44076050125825900e736c501f859c50fe728c73ffffffffffffffffffffffffffffffffffffffff1663ddc28c586040518060a001604052808863ffffffff1681526020016121a589611d20565b8152602001878152602001868152602001851515815250306040518363ffffffff1660e01b81526004016121da929190614e5f565b6040805180830381865afa1580156121f4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122189190614eee565b9050949350505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f806122ed611ca8565b90506122fa818585612a14565b600191505092915050565b5f5b81518110156123df57612337828281518110612326576123256147b9565b5b60200260200101516040015161241a565b81818151811061234a576123496147b9565b5b60200260200101516040015160035f84848151811061236c5761236b6147b9565b5b60200260200101515f015163ffffffff1663ffffffff1681526020019081526020015f205f8484815181106123a4576123a36147b9565b5b60200260200101516020015161ffff1661ffff1681526020019081526020015f2090816123d191906150ad565b508080600101915050612307565b507fbe4864a8e820971c0247f5992e2da559595f7bf076a21cb5928d443d2a13b6748160405161240f9190615293565b60405180910390a150565b5f60028201519050600361ffff168161ffff161461246f57816040517f9a6d49cd0000000000000000000000000000000000000000000000000000000081526004016124669190613d4c565b60405180910390fd5b5050565b5f80612480858585611cc1565b80925081935050506124928683612ba6565b94509492505050565b6124a36133e7565b5f6124b0845f0151612c25565b90505f846020015111156124cc576124cb8460200151612c72565b5b7f0000000000000000000000001a44076050125825900e736c501f859c50fe728c73ffffffffffffffffffffffffffffffffffffffff16632637a450826040518060a001604052808b63ffffffff1681526020016125298c611d20565b81526020018a81526020018981526020015f8960200151111515815250866040518463ffffffff1660e01b8152600401612564929190614e5f565b60806040518083038185885af1158015612580573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906125a5919061533c565b91505095945050505050565b6125c087878787878787611d91565b50505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612639575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016126309190613844565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036126a9575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016126a09190613844565b60405180910390fd5b8160065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015612792578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516127899190613ab4565b60405180910390a35b50505050565b5f7f00000000000000000000000000000000000000000000000000000000000000017f0000000000000000000000000000000000000000000000000000000000000001836127e691906153c1565b6127f091906153f1565b9050919050565b5f61280a6128058787612db8565b612de2565b90505f61283a8261282361281e8a8a612ded565b612e1e565b8b5f0160208101906128359190613f60565b612e5c565b90506128468787612f06565b15612914575f6128848a60400160208101906128629190615432565b8b5f0160208101906128749190613f60565b8461287f8c8c612f19565b612f7b565b90507f0000000000000000000000001a44076050125825900e736c501f859c50fe728c73ffffffffffffffffffffffffffffffffffffffff16637cb59012848b5f856040518563ffffffff1660e01b81526004016128e59493929190615496565b5f604051808303815f87803b1580156128fc575f80fd5b505af115801561290e573d5f803e3d5ffd5b50505050505b8173ffffffffffffffffffffffffffffffffffffffff16887fefed6d3500546b29533b128a29e3a94d70788727f0507505ac12eaf2e578fd9c8b5f01602081019061295f9190613f60565b8460405161296e9291906154e0565b60405180910390a3505050505050505050565b5f61298c8484611a7d565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811015612a0e57818110156129ff578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016129f693929190615507565b60405180910390fd5b612a0d84848484035f6125c9565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a84575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401612a7b9190613844565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612af4575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401612aeb9190613844565b60405180910390fd5b612aff838383612fad565b505050565b5f7f000000000000000000000000000000000000000000000000000000000000000182612b3191906153c1565b9050919050565b60605f80835111905080612b6d578484604051602001612b59929190615590565b604051602081830303815290604052612b9c565b8484612b78336131c9565b85604051602001612b8c94939291906155bb565b6040516020818303038152906040525b9150935093915050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612c16575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401612c0d9190613844565b60405180910390fd5b612c21825f83612fad565b5050565b5f813414612c6a57346040517f9f704120000000000000000000000000000000000000000000000000000000008152600401612c619190613ab4565b60405180910390fd5b819050919050565b5f7f0000000000000000000000001a44076050125825900e736c501f859c50fe728c73ffffffffffffffffffffffffffffffffffffffff1663e4fe1d946040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cdc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d009190615618565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612d67576040517f5373352a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612db4337f0000000000000000000000001a44076050125825900e736c501f859c50fe728c848473ffffffffffffffffffffffffffffffffffffffff166131ea909392919063ffffffff16565b5050565b5f82825f90602060ff1692612dcf939291906146ae565b90612dda919061564d565b905092915050565b5f815f1c9050919050565b5f8282602060ff1690602860ff1692612e08939291906146ae565b90612e1391906156d6565b60c01c905092915050565b5f7f00000000000000000000000000000000000000000000000000000000000000018267ffffffffffffffff16612e5591906153f1565b9050919050565b5f662aa1efb94e000083612e6e610d82565b612e789190615734565b1115612eb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb0906157b1565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612ef25761dead93505b612efc848461326c565b8290509392505050565b5f602860ff168383905011905092915050565b60608282602860ff16908092612f31939291906146ae565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050905092915050565b606084848484604051602001612f949493929190615823565b6040516020818303038152906040529050949350505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612ffd578060075f828254612ff19190615734565b925050819055506130cd565b5f60055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015613087578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161307e93929190615507565b60405180910390fd5b81810360055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613114578060075f828254039250508190555061315f565b8060055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516131bc9190613ab4565b60405180910390a3505050565b5f8173ffffffffffffffffffffffffffffffffffffffff165f1b9050919050565b613266848573ffffffffffffffffffffffffffffffffffffffff166323b872dd86868660405160240161321f9392919061586c565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506132eb565b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036132dc575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016132d39190613844565b60405180910390fd5b6132e75f8383612fad565b5050565b5f8060205f8451602086015f885af18061330a576040513d5f823e3d81fd5b3d92505f519150505f821461332357600181141561333e565b5f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561338057836040517f5274afe70000000000000000000000000000000000000000000000000000000081526004016133779190613844565b60405180910390fd5b50505050565b60405180604001604052805f81526020015f81525090565b60405180604001604052805f81526020015f81525090565b60405180604001604052805f8152602001606081525090565b60405180604001604052805f81526020015f81525090565b60405180606001604052805f80191681526020015f67ffffffffffffffff1681526020016134136133cf565b81525090565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613450578082015181840152602081019050613435565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61347582613419565b61347f8185613423565b935061348f818560208601613433565b6134988161345b565b840191505092915050565b5f6020820190508181035f8301526134bb818461346b565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6134fd826134d4565b9050919050565b61350d816134f3565b8114613517575f80fd5b50565b5f8135905061352881613504565b92915050565b5f819050919050565b6135408161352e565b811461354a575f80fd5b50565b5f8135905061355b81613537565b92915050565b5f8060408385031215613577576135766134cc565b5b5f6135848582860161351a565b92505060206135958582860161354d565b9150509250929050565b5f8115159050919050565b6135b38161359f565b82525050565b5f6020820190506135cc5f8301846135aa565b92915050565b5f80fd5b5f60e082840312156135eb576135ea6135d2565b5b81905092915050565b5f60208284031215613609576136086134cc565b5b5f82013567ffffffffffffffff811115613626576136256134d0565b5b613632848285016135d6565b91505092915050565b6136448161352e565b82525050565b604082015f82015161365e5f85018261363b565b506020820151613671602085018261363b565b50505050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f819050919050565b6136b2816136a0565b82525050565b5f82825260208201905092915050565b5f6136d282613419565b6136dc81856136b8565b93506136ec818560208601613433565b6136f58161345b565b840191505092915050565b5f604083015f8301516137155f8601826136a9565b506020830151848203602086015261372d82826136c8565b9150508091505092915050565b5f6137458383613700565b905092915050565b5f602082019050919050565b5f61376382613677565b61376d8185613681565b93508360208202850161377f85613691565b805f5b858110156137ba578484038952815161379b858261373a565b94506137a68361374d565b925060208a01995050600181019050613782565b50829750879550505050505092915050565b604082015f8201516137e05f85018261363b565b5060208201516137f3602085018261363b565b50505050565b5f60a08201905061380c5f83018661364a565b818103604083015261381e8185613759565b905061382d60608301846137cc565b949350505050565b61383e816134f3565b82525050565b5f6020820190506138575f830184613835565b92915050565b5f60608284031215613872576138716135d2565b5b81905092915050565b5f819050919050565b61388d8161387b565b8114613897575f80fd5b50565b5f813590506138a881613884565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f8401126138cf576138ce6138ae565b5b8235905067ffffffffffffffff8111156138ec576138eb6138b2565b5b602083019150836001820283011115613908576139076138b6565b5b9250929050565b5f805f805f805f60e0888a03121561392a576139296134cc565b5b5f6139378a828b0161385d565b97505060606139488a828b0161389a565b965050608088013567ffffffffffffffff811115613969576139686134d0565b5b6139758a828b016138ba565b955095505060a06139888a828b0161351a565b93505060c088013567ffffffffffffffff8111156139a9576139a86134d0565b5b6139b58a828b016138ba565b925092505092959891949750929550565b5f61ffff82169050919050565b6139dc816139c6565b82525050565b5f6020820190506139f55f8301846139d3565b92915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613a2f816139fb565b82525050565b5f67ffffffffffffffff82169050919050565b613a5181613a35565b82525050565b5f604082019050613a6a5f830185613a26565b613a776020830184613a48565b9392505050565b5f604082019050613a915f830185613a48565b613a9e6020830184613a48565b9392505050565b613aae8161352e565b82525050565b5f602082019050613ac75f830184613aa5565b92915050565b5f805f60608486031215613ae457613ae36134cc565b5b5f613af18682870161351a565b9350506020613b028682870161351a565b9250506040613b138682870161354d565b9150509250925092565b5f60ff82169050919050565b613b3281613b1d565b82525050565b5f602082019050613b4b5f830184613b29565b92915050565b5f63ffffffff82169050919050565b613b6981613b51565b8114613b73575f80fd5b50565b5f81359050613b8481613b60565b92915050565b5f8060408385031215613ba057613b9f6134cc565b5b5f613bad85828601613b76565b9250506020613bbe8582860161389a565b9150509250929050565b613bd18161359f565b8114613bdb575f80fd5b50565b5f81359050613bec81613bc8565b92915050565b5f8060408385031215613c0857613c076134cc565b5b5f83013567ffffffffffffffff811115613c2557613c246134d0565b5b613c31858286016135d6565b9250506020613c4285828601613bde565b9150509250929050565b604082015f820151613c605f85018261363b565b506020820151613c73602085018261363b565b50505050565b5f604082019050613c8c5f830184613c4c565b92915050565b613c9b816139c6565b8114613ca5575f80fd5b50565b5f81359050613cb681613c92565b92915050565b5f8060408385031215613cd257613cd16134cc565b5b5f613cdf85828601613b76565b9250506020613cf085828601613ca8565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f613d1e82613cfa565b613d288185613d04565b9350613d38818560208601613433565b613d418161345b565b840191505092915050565b5f6020820190508181035f830152613d648184613d14565b905092915050565b5f819050919050565b5f613d8f613d8a613d85846134d4565b613d6c565b6134d4565b9050919050565b5f613da082613d75565b9050919050565b5f613db182613d96565b9050919050565b613dc181613da7565b82525050565b5f602082019050613dda5f830184613db8565b92915050565b5f60208284031215613df557613df46134cc565b5b5f613e028482850161351a565b91505092915050565b5f602082019050613e1e5f830184613a48565b92915050565b5f805f8060a08587031215613e3c57613e3b6134cc565b5b5f613e498782880161385d565b945050606085013567ffffffffffffffff811115613e6a57613e696134d0565b5b613e76878288016138ba565b93509350506080613e898782880161351a565b91505092959194509250565b5f60208284031215613eaa57613ea96134cc565b5b5f613eb78482850161389a565b91505092915050565b5f8083601f840112613ed557613ed46138ae565b5b8235905067ffffffffffffffff811115613ef257613ef16138b2565b5b602083019150836020820283011115613f0e57613f0d6138b6565b5b9250929050565b5f8060208385031215613f2b57613f2a6134cc565b5b5f83013567ffffffffffffffff811115613f4857613f476134d0565b5b613f5485828601613ec0565b92509250509250929050565b5f60208284031215613f7557613f746134cc565b5b5f613f8284828501613b76565b91505092915050565b613f948161387b565b82525050565b5f602082019050613fad5f830184613f8b565b92915050565b5f805f8060608587031215613fcb57613fca6134cc565b5b5f613fd887828801613b76565b9450506020613fe987828801613ca8565b935050604085013567ffffffffffffffff81111561400a576140096134d0565b5b614016878288016138ba565b925092505092959194509250565b5f8083601f840112614039576140386138ae565b5b8235905067ffffffffffffffff811115614056576140556138b2565b5b602083019150836020820283011115614072576140716138b6565b5b9250929050565b5f806020838503121561408f5761408e6134cc565b5b5f83013567ffffffffffffffff8111156140ac576140ab6134d0565b5b6140b885828601614024565b92509250509250929050565b5f604082840312156140d9576140d86135d2565b5b81905092915050565b5f805f608084860312156140f9576140f86134cc565b5b5f84013567ffffffffffffffff811115614116576141156134d0565b5b614122868287016135d6565b9350506020614133868287016140c4565b92505060606141448682870161351a565b9150509250925092565b6141578161387b565b82525050565b61416681613a35565b82525050565b604082015f8201516141805f85018261363b565b506020820151614193602085018261363b565b50505050565b608082015f8201516141ad5f85018261414e565b5060208201516141c0602085018261415d565b5060408201516141d3604085018261416c565b50505050565b5f60c0820190506141ec5f830185614199565b6141f960808301846137cc565b9392505050565b5f8060408385031215614216576142156134cc565b5b5f6142238582860161351a565b92505060206142348582860161351a565b9150509250929050565b5f60608284031215614253576142526134cc565b5b5f6142608482850161385d565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806142ad57607f821691505b6020821081036142c0576142bf614269565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6142fc81613b51565b82525050565b5f6040820190506143155f8301856142f3565b6143226020830184613f8b565b9392505050565b7f496e76616c6964206164647265737300000000000000000000000000000000005f82015250565b5f61435d600f83613423565b915061436882614329565b602082019050919050565b5f6020820190508181035f83015261438a81614351565b9050919050565b7f496e76616c696420616d6f756e740000000000000000000000000000000000005f82015250565b5f6143c5600e83613423565b91506143d082614391565b602082019050919050565b5f6020820190508181035f8301526143f2816143b9565b9050919050565b7f53656c662d7472616e73666572206e6f7420616c6c6f776564000000000000005f82015250565b5f61442d601983613423565b9150614438826143f9565b602082019050919050565b5f6020820190508181035f83015261445a81614421565b9050919050565b61446a8261345b565b810181811067ffffffffffffffff82111715614489576144886142c6565b5b80604052505050565b5f61449b6134c3565b90506144a78282614461565b919050565b5f67ffffffffffffffff8211156144c6576144c56142c6565b5b602082029050602081019050919050565b5f80fd5b5f80fd5b5f80fd5b5f67ffffffffffffffff8211156144fd576144fc6142c6565b5b6145068261345b565b9050602081019050919050565b828183375f83830152505050565b5f61453361452e846144e3565b614492565b90508281526020810184848401111561454f5761454e6144df565b5b61455a848285614513565b509392505050565b5f82601f830112614576576145756138ae565b5b8135614586848260208601614521565b91505092915050565b5f606082840312156145a4576145a36144d7565b5b6145ae6060614492565b90505f6145bd84828501613b76565b5f8301525060206145d084828501613ca8565b602083015250604082013567ffffffffffffffff8111156145f4576145f36144db565b5b61460084828501614562565b60408301525092915050565b5f61461e614619846144ac565b614492565b90508083825260208201905060208402830185811115614641576146406138b6565b5b835b8181101561468857803567ffffffffffffffff811115614666576146656138ae565b5b808601614673898261458f565b85526020850194505050602081019050614643565b5050509392505050565b5f61469e36848461460c565b905092915050565b5f80fd5b5f80fd5b5f80858511156146c1576146c06146a6565b5b838611156146d2576146d16146aa565b5b6001850283019150848603905094509492505050565b5f81905092915050565b5f6146fc82613cfa565b61470681856146e8565b9350614716818560208601613433565b80840191505092915050565b5f61472d83856146e8565b935061473a838584614513565b82840190509392505050565b5f61475182866146f2565b915061475e828486614722565b9150819050949350505050565b5f6147768385613d04565b9350614783838584614513565b61478c8361345b565b840190509392505050565b5f6020820190508181035f8301526147b081848661476b565b90509392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f80fd5b5f80fd5b5f80fd5b5f823560016101400383360303811261480e5761480d6147e6565b5b80830191505092915050565b5f8083356001602003843603038112614836576148356147e6565b5b80840192508235915067ffffffffffffffff821115614858576148576147ea565b5b602083019250600182023603831315614874576148736147ee565b5b509250929050565b5f61488a6020840184613b76565b905092915050565b61489b81613b51565b82525050565b5f6148af602084018461389a565b905092915050565b6148c081613a35565b81146148ca575f80fd5b50565b5f813590506148db816148b7565b92915050565b5f6148ef60208401846148cd565b905092915050565b606082016149075f83018361487c565b6149135f850182614892565b5061492160208301836148a1565b61492e602085018261414e565b5061493c60408301836148e1565b614949604085018261415d565b50505050565b5f60e0820190506149625f83018a6148f7565b61496f6060830189613f8b565b818103608083015261498281878961476b565b905061499160a0830186613835565b81810360c08301526149a481848661476b565b905098975050505050505050565b5f6149c46149bf846144e3565b614492565b9050828152602081018484840111156149e0576149df6144df565b5b6149eb848285613433565b509392505050565b5f82601f830112614a0757614a066138ae565b5b8151614a178482602086016149b2565b91505092915050565b5f60208284031215614a3557614a346134cc565b5b5f82015167ffffffffffffffff811115614a5257614a516134d0565b5b614a5e848285016149f3565b91505092915050565b5f60408284031215614a7c57614a7b6144d7565b5b614a866040614492565b90505f614a958482850161354d565b5f830152506020614aa88482850161354d565b60208301525092915050565b5f60408284031215614ac957614ac86134cc565b5b5f614ad684828501614a67565b91505092915050565b5f606082019050614af25f8301866142f3565b614aff6020830185613aa5565b614b0c6040830184613aa5565b949350505050565b7f496e76616c6964206f776e6572000000000000000000000000000000000000005f82015250565b5f614b48600d83613423565b9150614b5382614b14565b602082019050919050565b5f6020820190508181035f830152614b7581614b3c565b9050919050565b7f53616d65206f776e6572000000000000000000000000000000000000000000005f82015250565b5f614bb0600a83613423565b9150614bbb82614b7c565b602082019050919050565b5f6020820190508181035f830152614bdd81614ba4565b9050919050565b7f43616e6e6f74207472616e73666572206f776e65727368697020746f2073656c5f8201527f6600000000000000000000000000000000000000000000000000000000000000602082015250565b5f614c3e602183613423565b9150614c4982614be4565b604082019050919050565b5f6020820190508181035f830152614c6b81614c32565b9050919050565b5f604082019050614c855f830185613aa5565b614c926020830184613aa5565b9392505050565b5f602082019050614cac5f8301846142f3565b92915050565b7f4d65737361676520616c72656164792070726f636573736564000000000000005f82015250565b5f614ce6601983613423565b9150614cf182614cb2565b602082019050919050565b5f6020820190508181035f830152614d1381614cda565b9050919050565b5f6040820190508181035f830152614d328185613d14565b90508181036020830152614d468184613d14565b90509392505050565b5f81519050614d5d81613bc8565b92915050565b5f60208284031215614d7857614d776134cc565b5b5f614d8584828501614d4f565b91505092915050565b5f82825260208201905092915050565b5f614da882613cfa565b614db28185614d8e565b9350614dc2818560208601613433565b614dcb8161345b565b840191505092915050565b614ddf8161359f565b82525050565b5f60a083015f830151614dfa5f860182614892565b506020830151614e0d602086018261414e565b5060408301518482036040860152614e258282614d9e565b91505060608301518482036060860152614e3f8282614d9e565b9150506080830151614e546080860182614dd6565b508091505092915050565b5f6040820190508181035f830152614e778185614de5565b9050614e866020830184613835565b9392505050565b5f81519050614e9b81613537565b92915050565b5f60408284031215614eb657614eb56144d7565b5b614ec06040614492565b90505f614ecf84828501614e8d565b5f830152506020614ee284828501614e8d565b60208301525092915050565b5f60408284031215614f0357614f026134cc565b5b5f614f1084828501614ea1565b91505092915050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302614f757fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614f3a565b614f7f8683614f3a565b95508019841693508086168417925050509392505050565b5f614fb1614fac614fa78461352e565b613d6c565b61352e565b9050919050565b5f819050919050565b614fca83614f97565b614fde614fd682614fb8565b848454614f46565b825550505050565b5f90565b614ff2614fe6565b614ffd818484614fc1565b505050565b5b81811015615020576150155f82614fea565b600181019050615003565b5050565b601f8211156150655761503681614f19565b61503f84614f2b565b8101602085101561504e578190505b61506261505a85614f2b565b830182615002565b50505b505050565b5f82821c905092915050565b5f6150855f198460080261506a565b1980831691505092915050565b5f61509d8383615076565b9150826002028217905092915050565b6150b682613cfa565b67ffffffffffffffff8111156150cf576150ce6142c6565b5b6150d98254614296565b6150e4828285615024565b5f60209050601f831160018114615115575f8415615103578287015190505b61510d8582615092565b865550615174565b601f19841661512386614f19565b5f5b8281101561514a57848901518255600182019150602085019450602081019050615125565b868310156151675784890151615163601f891682615076565b8355505b6001600288020188555050505b505050505050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6151ae816139c6565b82525050565b5f606083015f8301516151c95f860182614892565b5060208301516151dc60208601826151a5565b50604083015184820360408601526151f48282614d9e565b9150508091505092915050565b5f61520c83836151b4565b905092915050565b5f602082019050919050565b5f61522a8261517c565b6152348185615186565b93508360208202850161524685615196565b805f5b8581101561528157848403895281516152628582615201565b945061526d83615214565b925060208a01995050600181019050615249565b50829750879550505050505092915050565b5f6020820190508181035f8301526152ab8184615220565b905092915050565b5f815190506152c181613884565b92915050565b5f815190506152d5816148b7565b92915050565b5f608082840312156152f0576152ef6144d7565b5b6152fa6060614492565b90505f615309848285016152b3565b5f83015250602061531c848285016152c7565b602083015250604061533084828501614ea1565b60408301525092915050565b5f60808284031215615351576153506134cc565b5b5f61535e848285016152db565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6153cb8261352e565b91506153d68361352e565b9250826153e6576153e5615367565b5b828204905092915050565b5f6153fb8261352e565b91506154068361352e565b92508282026154148161352e565b9150828204841483151761542b5761542a615394565b5b5092915050565b5f60208284031215615447576154466134cc565b5b5f615454848285016148cd565b91505092915050565b5f819050919050565b5f61548061547b6154768461545d565b613d6c565b6139c6565b9050919050565b61549081615466565b82525050565b5f6080820190506154a95f830187613835565b6154b66020830186613f8b565b6154c36040830185615487565b81810360608301526154d58184613d14565b905095945050505050565b5f6040820190506154f35f8301856142f3565b6155006020830184613aa5565b9392505050565b5f60608201905061551a5f830186613835565b6155276020830185613aa5565b6155346040830184613aa5565b949350505050565b5f819050919050565b6155566155518261387b565b61553c565b82525050565b5f8160c01b9050919050565b5f6155728261555c565b9050919050565b61558a61558582613a35565b615568565b82525050565b5f61559b8285615545565b6020820191506155ab8284615579565b6008820191508190509392505050565b5f6155c68287615545565b6020820191506155d68286615579565b6008820191506155e68285615545565b6020820191506155f682846146f2565b915081905095945050505050565b5f8151905061561281613504565b92915050565b5f6020828403121561562d5761562c6134cc565b5b5f61563a84828501615604565b91505092915050565b5f82905092915050565b5f6156588383615643565b82615663813561387b565b925060208210156156a35761569e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802614f3a565b831692505b505092915050565b5f7fffffffffffffffff00000000000000000000000000000000000000000000000082169050919050565b5f6156e18383615643565b826156ec81356156ab565b9250600882101561572c576157277fffffffffffffffff00000000000000000000000000000000000000000000000083600803600802614f3a565b831692505b505092915050565b5f61573e8261352e565b91506157498361352e565b925082820190508082111561576157615760615394565b5b92915050565b7f45786365656473206d6178696d756d20746f74616c20737570706c79000000005f82015250565b5f61579b601c83613423565b91506157a682615767565b602082019050919050565b5f6020820190508181035f8301526157c88161578f565b9050919050565b5f8160e01b9050919050565b5f6157e5826157cf565b9050919050565b6157fd6157f882613b51565b6157db565b82525050565b5f819050919050565b61581d6158188261352e565b615803565b82525050565b5f61582e8287615579565b60088201915061583e82866157ec565b60048201915061584e828561580c565b60208201915061585e82846146f2565b915081905095945050505050565b5f60608201905061587f5f830186613835565b61588c6020830185613835565b6158996040830184613aa5565b94935050505056fea264697066735822122004b56b0d267cc43e68d8f4ec22aebf50180637bc5229d2fbeb58872fd1c2a15264736f6c63430008160033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000001a44076050125825900e736c501f859c50fe728c000000000000000000000000258d4e26f190eec217bdcc3b32f586eeb03f119e00000000000000000000000000000000000000000000000000000000000000085265616c4c696e6b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045245414c00000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): RealLink
Arg [1] : _symbol (string): REAL
Arg [2] : _lzEndpoint (address): 0x1a44076050125825900e736c501f859c50fE728c
Arg [3] : _owner (address): 0x258d4e26F190eec217BdcC3B32F586Eeb03F119E

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000001a44076050125825900e736c501f859c50fe728c
Arg [3] : 000000000000000000000000258d4e26f190eec217bdcc3b32f586eeb03f119e
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [5] : 5265616c4c696e6b000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [7] : 5245414c00000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

132219:4374:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;115806:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;118016:190;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92201:1283;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;89863:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29136:723;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;89734:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91032:142;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;56228:243;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;116879:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;89696:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;133346:332;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;132896:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;132339:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;134182:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;93947:787;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83811:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18867:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;102264:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22794:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;134734:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;117014:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17372:103;;;;;;;;;;;;;:::i;:::-;;28258:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26732:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91793:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16697:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;116016:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;89385:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;126574:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;133028:310;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;132506:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83486:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;134567:159;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22920:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20961:1003;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84379:1358;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;95439:1364;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;134301:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;86399:419;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;134425:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;117555:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;133686:382;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;126180:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27507:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;115806:91;115851:13;115884:5;115877:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;115806:91;:::o;118016:190::-;118089:4;118106:13;118122:12;:10;:12::i;:::-;118106:28;;118145:31;118154:5;118161:7;118170:5;118145:8;:31::i;:::-;118194:4;118187:11;;;118016:190;;;;:::o;92201:1283::-;92333:24;;:::i;:::-;92359:35;92396:28;;:::i;:::-;92442:19;92517;92539:16;92517:38;;;;92618:34;;;;;;;;92627:11;92618:34;;;;92640:11;92618:34;;;92607:45;;92791:1;92772:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;92756:37;;93236:20;93258:24;93286:124;93311:10;:19;;;93345:10;:22;;;93382:10;:17;;;;;;;;;;:::i;:::-;93286:10;:124::i;:::-;93235:175;;;;93434:42;;;;;;;;93445:12;93434:42;;;;93459:16;93434:42;;;93421:55;;92431:1053;;;;92201:1283;;;;;:::o;89863:27::-;;;;;;;;;;;;;:::o;29136:723::-;29470:10;29449:31;;29457:8;29449:31;;;29445:68;;29502:10;29489:24;;;;;;;;;;;:::i;:::-;;;;;;;;29445:68;29652:7;:14;;;29616:32;29633:7;:14;;;;;;;;;;:::i;:::-;29616:16;:32::i;:::-;:50;29612:103;;29684:7;:14;;;;;;;;;;:::i;:::-;29700:7;:14;;;29675:40;;;;;;;;;;;;:::i;:::-;;;;;;;;29612:103;29792:59;29803:7;29812:5;29819:8;;29829:9;29840:10;;29792;:59::i;:::-;29136:723;;;;;;;:::o;89734:40::-;89773:1;89734:40;:::o;91032:142::-;91085:18;91105:14;91140:22;91164:1;91132:34;;;;91032:142;;:::o;56228:243::-;56360:20;56382:22;50105:1;25369;56422:41;;;;56228:243;;:::o;116879:99::-;116931:7;116958:12;;116951:19;;116879:99;:::o;89696:31::-;89726:1;89696:31;:::o;133346:332::-;133448:4;131186:21;:19;:21::i;:::-;133487:1:::1;133473:16;;:2;:16;;::::0;133465:44:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;133537:1;133528:6;:10;133520:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;133584:2;133576:10;;:4;:10;;::::0;133568:48:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;133634:36;133653:4;133659:2;133663:6;133634:18;:36::i;:::-;133627:43;;131230:20:::0;:18;:20::i;:::-;133346:332;;;;;:::o;132896:84::-;132946:5;132971:1;132964:8;;132896:84;:::o;132339:62::-;132382:19;132339:62;:::o;134182:111::-;16583:13;:11;:13::i;:::-;134264:21:::1;134273:4;134279:5;134264:8;:21::i;:::-;134182:111:::0;;:::o;93947:787::-;94073:26;;:::i;:::-;94287:24;94315:74;94326:10;:19;;;94347:10;:22;;;94371:10;:17;;;;;;;;;;:::i;:::-;94315:10;:74::i;:::-;94284:105;;;94481:20;94503;94527:49;94547:10;94559:16;94527:19;:49::i;:::-;94480:96;;;;94668:58;94675:10;:17;;;;;;;;;;:::i;:::-;94694:7;94703;94712:13;94668:6;:58::i;:::-;94661:65;;;;;93947:787;;;;:::o;83811:95::-;83858:7;83893:4;83878:20;;83811:95;:::o;18867:93::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;102264:134::-;102346:4;102385:5;102370;:11;102376:4;102370:11;;;;;;;;;;;;;;;;:20;102363:27;;102264:134;;;;:::o;22794:46::-;;;:::o;134734:158::-;16583:13;:11;:13::i;:::-;134825::::1;134810:12;;:28;;;;;;;;;;;;;;;;;;134854:30;134870:13;134854:30;;;;;;:::i;:::-;;;;;;;;134734:158:::0;:::o;117014:118::-;117079:7;117106:9;:18;117116:7;117106:18;;;;;;;;;;;;;;;;117099:25;;117014:118;;;:::o;17372:103::-;16583:13;:11;:13::i;:::-;17437:30:::1;17464:1;17437:18;:30::i;:::-;17372:103::o:0;28258:130::-;28347:12;28258:130;;;;:::o;26732:222::-;26898:4;26941;26922:24;;:7;:24;;;26915:31;;26732:222;;;;;;:::o;91793:89::-;91848:5;91873:1;91866:8;;91793:89;:::o;16697:87::-;16743:7;16770:6;;;;;;;;;;;16763:13;;16697:87;:::o;116016:95::-;116063:13;116096:7;116089:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;116016:95;:::o;89385:46::-;;;:::o;126574:96::-;126633:4;126574:96;:::o;133028:310::-;133112:4;131186:21;:19;:21::i;:::-;133151:1:::1;133137:16;;:2;:16;;::::0;133129:44:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;133201:1;133192:6;:10;133184:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;133254:2;133240:16;;:10;:16;;::::0;133232:54:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;133304:26;133319:2;133323:6;133304:14;:26::i;:::-;133297:33;;131230:20:::0;:18;:20::i;:::-;133028:310;;;;:::o;132506:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;83486:23::-;;;;;;;;;;;;;:::o;134567:159::-;16583:13;:11;:13::i;:::-;134681:37:::1;134701:16;;134681:37;;;;;:::i;:::-;:19;:37::i;:::-;134567:159:::0;;:::o;22920:48::-;;;;;;;;;;;;;;;;;:::o;20961:1003::-;21108:12;21133:21;21157:15;:21;21173:4;21157:21;;;;;;;;;;;;;;;:31;21179:8;21157:31;;;;;;;;;;;;;;;21133:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21339:1;21320:8;:15;:20;21316:46;;21349:13;;21342:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21316:46;21450:1;21426:13;;:20;;:25;21422:46;;21460:8;21453:15;;;;;21422:46;21618:1;21594:13;;:20;;:25;21590:271;;21636:34;21656:13;;21636:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:19;:34::i;:::-;21821:8;21831:13;;21845:1;21831:17;;;;;;;;;:::i;:::-;21808:41;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21801:48;;;;;21590:271;21942:13;;21927:29;;;;;;;;;;;;:::i;:::-;;;;;;;;20961:1003;;;;;;;:::o;84379:1358::-;84481:9;84476:1057;84500:8;;:15;;84496:1;:19;84476:1057;;;84537:29;84569:8;;84578:1;84569:11;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;84537:43;;84666:50;84673:6;:13;;:20;;;;;;;;;;:::i;:::-;84695:6;:13;;:20;;;84666:6;:50::i;:::-;84661:65;;84718:8;;;84661:65;85297:4;:22;;;85328:6;:12;;;85361:6;:13;;85393:6;:11;;;85423:6;:14;;;;;;;;:::i;:::-;85456:6;:15;;;;;;;;;;:::i;:::-;85490:6;:16;;;;;;;;:::i;:::-;85297:224;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84522:1011;84476:1057;84517:3;;;;;;;84476:1057;;;;85693:10;85683:43;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;85666:63;;;;;;;;;;;:::i;:::-;;;;;;;;95439:1364;95604:34;;:::i;:::-;95640:28;;:::i;:::-;96006:20;96028:24;96056:145;96077:10;96102;:19;;;96136:10;:22;;;96173:10;:17;;;;;;;;;;:::i;:::-;96056:6;:145::i;:::-;96005:196;;;;96293:20;96315;96339:49;96359:10;96371:16;96339:19;:49::i;:::-;96292:96;;;;96514:66;96522:10;:17;;;;;;;;;;:::i;:::-;96541:7;96550;96559:4;96514:66;;;;;;;;;;:::i;:::-;96565:14;96514:7;:66::i;:::-;96501:79;;96648:42;;;;;;;;96659:12;96648:42;;;;96673:16;96648:42;;;96635:55;;96752:10;96708:87;;96716:10;:15;;;96708:87;96733:10;:17;;;;;;;;;;:::i;:::-;96764:12;96778:16;96708:87;;;;;;;;:::i;:::-;;;;;;;;95670:1133;;;;95439:1364;;;;;;:::o;134301:116::-;16583:13;:11;:13::i;:::-;134378:8:::1;:20;;;134399:9;134378:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;134301:116:::0;:::o;86399:419::-;86708:4;86686:27;;:10;:27;;;86682:50;;86722:10;;;;;;;;;;;;;;86682:50;86743:67;86762:7;86771:5;86778:8;;86788:9;86799:10;;86743:18;:67::i;:::-;86399:419;;;;;;;:::o;134425:134::-;16583:13;:11;:13::i;:::-;134504:9:::1;134493:8;;:20;;;;;;;;;;;;;;;;;;134529:22;134541:9;134529:22;;;;;;:::i;:::-;;;;;;;;134425:134:::0;:::o;117555:142::-;117635:7;117662:11;:18;117674:5;117662:18;;;;;;;;;;;;;;;:27;117681:7;117662:27;;;;;;;;;;;;;;;;117655:34;;117555:142;;;;:::o;133686:382::-;16583:13;:11;:13::i;:::-;133796:1:::1;133776:22;;:8;:22;;::::0;133768:48:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;133847:7;:5;:7::i;:::-;133835:19;;:8;:19;;::::0;133827:42:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;133976:4;133956:25;;:8;:25;;::::0;133948:71:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;134032:28;134051:8;134032:18;:28::i;:::-;133686:382:::0;:::o;126180:86::-;126218:7;126253:4;126238:20;;126180:86;:::o;27507:151::-;27589:4;27637:6;:13;;;27613:5;:20;27619:6;:13;;;;;;;;;;:::i;:::-;27613:20;;;;;;;;;;;;;;;;:37;27606:44;;27507:151;;;:::o;14651:98::-;14704:7;14731:10;14724:17;;14651:98;:::o;122875:130::-;122960:37;122969:5;122976:7;122985:5;122992:4;122960:8;:37::i;:::-;122875:130;;;:::o;104325:682::-;104471:20;104493:24;104669:22;104681:9;104669:11;:22::i;:::-;104654:37;;104819:12;104800:31;;104904:12;104885:16;:31;104881:119;;;104957:16;104975:12;104940:48;;;;;;;;;;;;:::i;:::-;;;;;;;;104881:119;104325:682;;;;;;:::o;24478:200::-;24548:7;24568:12;24583:5;:11;24589:4;24583:11;;;;;;;;;;;;;;;;24568:26;;24625:1;24617:10;;24609:4;:18;24605:43;;24643:4;24636:12;;;;;;;;;;;:::i;:::-;;;;;;;;24605:43;24666:4;24659:11;;;24478:200;;;:::o;136040:550::-;136344:14;:21;136359:5;136344:21;;;;;;;;;;;;;;;;;;;;;136343:22;136335:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;136430:4;136406:14;:21;136421:5;136406:21;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;136517:65;136534:7;136543:5;136550:8;;136560:9;136571:10;;136517:16;:65::i;:::-;136040:550;;;;;;;:::o;131266:315::-;130564:1;131395:7;;:18;131391:88;;131437:30;;;;;;;;;;;;;;131391:88;130564:1;131556:7;:17;;;;131266:315::o;118816:249::-;118903:4;118920:15;118938:12;:10;:12::i;:::-;118920:30;;118961:37;118977:4;118983:7;118992:5;118961:15;:37::i;:::-;119009:26;119019:4;119025:2;119029:5;119009:9;:26::i;:::-;119053:4;119046:11;;;118816:249;;;;;:::o;131589:212::-;130521:1;131772:7;:21;;;;131589:212::o;16862:166::-;16933:12;:10;:12::i;:::-;16922:23;;:7;:5;:7::i;:::-;:23;;;16918:103;;16996:12;:10;:12::i;:::-;16969:40;;;;;;;;;;;:::i;:::-;;;;;;;;16918:103;16862:166::o;24035:137::-;24123:5;24109;:11;24115:4;24109:11;;;;;;;;;;;;;;;:19;;;;24144:20;24152:4;24158:5;24144:20;;;;;;;:::i;:::-;;;;;;;;24035:137;;:::o;97106:1355::-;97241:20;97263;97296:15;97469:330;97502:10;:13;;;97530:16;97536:9;97530:5;:16::i;:::-;97767:10;:21;;;;;;;;:::i;:::-;97469:330;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:18;:330::i;:::-;97445:354;;;;;;;;97881:14;97898:10;:33;;89726:1;97898:33;;;89773:1;97898:33;97881:50;;98055:67;98070:10;:17;;;;;;;;;;:::i;:::-;98089:7;98098:10;:23;;;;;;;;:::i;:::-;98055:14;:67::i;:::-;98045:77;;98392:1;98368:26;;:12;;;;;;;;;;;:26;;;98364:89;;98414:12;;;;;;;;;;;98396:39;;;98436:7;98445;98396:57;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;98364:89;97285:1176;;97106:1355;;;;;:::o;51325:402::-;51497:23;;:::i;:::-;51553:8;:14;;;51586:86;;;;;;;;51602:7;51586:86;;;;;;51611:25;51628:7;51611:16;:25::i;:::-;51586:86;;;;51638:8;51586:86;;;;51648:8;51586:86;;;;51658:13;51586:86;;;;;51699:4;51553:166;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51533:186;;51325:402;;;;;;:::o;18171:191::-;18245:16;18264:6;;;;;;;;;;;18245:25;;18290:8;18281:6;;:17;;;;;;;;;;;;;;;;;;18345:8;18314:40;;18335:8;18314:40;;;;;;;;;;;;18234:128;18171:191;:::o;117337:182::-;117406:4;117423:13;117439:12;:10;:12::i;:::-;117423:28;;117462:27;117472:5;117479:2;117483:5;117462:9;:27::i;:::-;117507:4;117500:11;;;117337:182;;;;:::o;19666:522::-;19775:9;19770:358;19794:16;:23;19790:1;:27;19770:358;;;19954:48;19974:16;19991:1;19974:19;;;;;;;;:::i;:::-;;;;;;;;:27;;;19954:19;:48::i;:::-;20089:16;20106:1;20089:19;;;;;;;;:::i;:::-;;;;;;;;:27;;;20017:15;:40;20033:16;20050:1;20033:19;;;;;;;;:::i;:::-;;;;;;;;:23;;;20017:40;;;;;;;;;;;;;;;:69;20058:16;20075:1;20058:19;;;;;;;;:::i;:::-;;;;;;;;:27;;;20017:69;;;;;;;;;;;;;;;:99;;;;;;:::i;:::-;;19819:3;;;;;;;19770:358;;;;20145:35;20163:16;20145:35;;;;;;:::i;:::-;;;;;;;;19666:522;:::o;22110:270::-;22195:18;22283:1;22273:8;22269:16;22263:23;22248:38;;18789:1;22311:28;;:11;:28;;;22307:65;;22363:8;22348:24;;;;;;;;;;;:::i;:::-;;;;;;;;22307:65;22184:196;22110:270;:::o;127164:580::-;127330:20;127352:24;127424:44;127435:9;127446:12;127460:7;127424:10;:44::i;:::-;127389:79;;;;;;;;127710:26;127716:5;127723:12;127710:5;:26::i;:::-;127164:580;;;;;;;:::o;52502:783::-;52709:31;;:::i;:::-;52876:20;52899:26;52910:4;:14;;;52899:10;:26::i;:::-;52876:49;;52958:1;52940:4;:15;;;:19;52936:53;;;52961:28;52973:4;:15;;;52961:11;:28::i;:::-;52936:53;53082:8;:13;;;53104:12;53137:92;;;;;;;;53153:7;53137:92;;;;;;53162:25;53179:7;53162:16;:25::i;:::-;53137:92;;;;53189:8;53137:92;;;;53199:8;53137:92;;;;53227:1;53209:4;:15;;;:19;53137:92;;;;;53248:14;53082:195;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53002:275;;;52502:783;;;;;;;:::o;101591:295::-;101819:59;101830:7;101839:5;101846:8;;101856:9;101867:10;;101819;:59::i;:::-;101591:295;;;;;;;:::o;123872:443::-;124002:1;123985:19;;:5;:19;;;123981:91;;124057:1;124028:32;;;;;;;;;;;:::i;:::-;;;;;;;;123981:91;124105:1;124086:21;;:7;:21;;;124082:92;;124159:1;124131:31;;;;;;;;;;;:::i;:::-;;;;;;;;124082:92;124214:5;124184:11;:18;124196:5;124184:18;;;;;;;;;;;;;;;:27;124203:7;124184:27;;;;;;;;;;;;;;;:35;;;;124234:9;124230:78;;;124281:7;124265:31;;124274:5;124265:31;;;124290:5;124265:31;;;;;;:::i;:::-;;;;;;;;124230:78;123872:443;;;;:::o;102802:174::-;102873:16;102947:21;102922;102910:9;:33;;;;:::i;:::-;102909:59;;;;:::i;:::-;102902:66;;102802:174;;;:::o;98992:1837::-;99478:17;99498:36;:17;:8;;:15;:17::i;:::-;:34;:36::i;:::-;99478:56;;99669:24;99696:62;99704:9;99715:26;99721:19;:8;;:17;:19::i;:::-;99715:5;:26::i;:::-;99743:7;:14;;;;;;;;;;:::i;:::-;99696:7;:62::i;:::-;99669:89;;99775:21;:8;;:19;:21::i;:::-;99771:970;;;99877:23;99903:180;99947:7;:13;;;;;;;;;;:::i;:::-;99979:7;:14;;;;;;;;;;:::i;:::-;100012:16;100047:21;:8;;:19;:21::i;:::-;99903:25;:180::i;:::-;99877:206;;100637:8;:20;;;100658:9;100669:5;100676:1;100718:10;100637:92;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;99798:943;99771:970;100793:9;100758:63;;100770:5;100758:63;100777:7;:14;;;;;;;;;;:::i;:::-;100804:16;100758:63;;;;;;;:::i;:::-;;;;;;;;99301:1528;;98992:1837;;;;;;;:::o;124607:486::-;124707:24;124734:25;124744:5;124751:7;124734:9;:25::i;:::-;124707:52;;124793:17;124774:16;:36;124770:316;;;124850:5;124831:16;:24;124827:132;;;124910:7;124919:16;124937:5;124883:60;;;;;;;;;;;;;:::i;:::-;;;;;;;;124827:132;125002:57;125011:5;125018:7;125046:5;125027:16;:24;125053:5;125002:8;:57::i;:::-;124770:316;124696:397;124607:486;;;:::o;119450:308::-;119550:1;119534:18;;:4;:18;;;119530:88;;119603:1;119576:30;;;;;;;;;;;:::i;:::-;;;;;;;;119530:88;119646:1;119632:16;;:2;:16;;;119628:88;;119701:1;119672:32;;;;;;;;;;;:::i;:::-;;;;;;;;119628:88;119726:24;119734:4;119740:2;119744:5;119726:7;:24::i;:::-;119450:308;;;:::o;103579:149::-;103644:15;103698:21;103686:9;:33;;;;:::i;:::-;103672:48;;103579:149;;;:::o;67784:516::-;67922:17;67941:15;68003:1;67982:11;:18;:22;67969:35;;68127:10;:165;;68269:7;68278:13;68252:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;68127:165;;;68170:7;68179:13;68194:28;68211:10;68194:16;:28::i;:::-;68224:11;68153:83;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;68127:165;68120:172;;67784:516;;;;;;:::o;122111:211::-;122201:1;122182:21;;:7;:21;;;122178:91;;122254:1;122227:30;;;;;;;;;;;:::i;:::-;;;;;;;;122178:91;122279:35;122287:7;122304:1;122308:5;122279:7;:35::i;:::-;122111:211;;:::o;53994:194::-;54060:17;54107:10;54094:9;:23;54090:62;;54142:9;54126:26;;;;;;;;;;;:::i;:::-;;;;;;;;54090:62;54170:10;54163:17;;53994:194;;;:::o;54574:417::-;54729:15;54747:8;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54729:36;;54799:1;54780:21;;:7;:21;;;54776:54;;54810:20;;;;;;;;;;;;;;54776:54;54907:76;54940:10;54960:8;54971:11;54914:7;54907:32;;;;:76;;;;;;:::i;:::-;54633:358;54574:417;:::o;68785:125::-;68845:7;68880:4;;:21;;67363:2;68880:21;;;;;;;;;:::i;:::-;68872:30;;;;;:::i;:::-;68865:37;;68785:125;;;;:::o;70028:::-;70089:7;70140:2;70132:11;;70109:36;;70028:125;;;:::o;69095:154::-;69157:6;69197:4;;67363:2;69197:42;;;67419:2;69197:42;;;;;;;;;:::i;:::-;69190:50;;;;;:::i;:::-;69183:58;;69176:65;;69095:154;;;;:::o;103207:141::-;103271:16;103319:21;103307:9;:33;;;;;;:::i;:::-;103300:40;;103207:141;;;:::o;135144:544::-;135282:24;132382:19;135406:9;135390:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:45;;135382:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;135546:3;135531:19;;:3;:19;;;135527:46;;135566:6;135552:21;;135527:46;135584:21;135590:3;135595:9;135584:5;:21::i;:::-;135635:9;135616:28;;135144:544;;;;;:::o;68485:131::-;68549:4;67419:2;68573:35;;:4;;:11;;:35;68566:42;;68485:131;;;;:::o;69416:132::-;69480:12;69512:4;;67419:2;69512:28;;;;;;;;;;;:::i;:::-;69505:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69416:132;;;;:::o;64637:291::-;64826:17;64880:6;64888:7;64897:9;64908:11;64863:57;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64856:64;;64637:291;;;;;;:::o;120082:1135::-;120188:1;120172:18;;:4;:18;;;120168:552;;120326:5;120310:12;;:21;;;;;;;:::i;:::-;;;;;;;;120168:552;;;120364:19;120386:9;:15;120396:4;120386:15;;;;;;;;;;;;;;;;120364:37;;120434:5;120420:11;:19;120416:117;;;120492:4;120498:11;120511:5;120467:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;120416:117;120688:5;120674:11;:19;120656:9;:15;120666:4;120656:15;;;;;;;;;;;;;;;:37;;;;120349:371;120168:552;120750:1;120736:16;;:2;:16;;;120732:435;;120918:5;120902:12;;:21;;;;;;;;;;;120732:435;;;121135:5;121118:9;:13;121128:2;121118:13;;;;;;;;;;;;;;;;:22;;;;;;;;;;;120732:435;121199:2;121184:25;;121193:4;121184:25;;;121203:5;121184:25;;;;;;:::i;:::-;;;;;;;;120082:1135;;;:::o;69723:131::-;69787:7;69838:5;69822:23;;69814:32;;69807:39;;69723:131;;;:::o;40794:190::-;40895:81;40915:5;40937;:18;;;40958:4;40964:2;40968:5;40922:53;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40895:19;:81::i;:::-;40794:190;;;;:::o;121570:213::-;121660:1;121641:21;;:7;:21;;;121637:93;;121715:1;121686:32;;;;;;;;;;;:::i;:::-;;;;;;;;121637:93;121740:35;121756:1;121760:7;121769:5;121740:7;:35::i;:::-;121570:213;;:::o;47678:738::-;47759:18;47788:19;47928:4;47925:1;47918:4;47912:11;47905:4;47899;47895:15;47892:1;47885:5;47878;47873:60;47987:7;47977:180;;48032:4;48026:11;48078:16;48075:1;48070:3;48055:40;48125:16;48120:3;48113:29;47977:180;48185:16;48171:30;;48236:1;48230:8;48215:23;;47843:406;48279:1;48265:10;:15;:68;;48332:1;48317:11;:16;;48265:68;;;48313:1;48291:5;48283:26;;;:31;48265:68;48261:148;;;48390:5;48357:40;;;;;;;;;;;:::i;:::-;;;;;;;;48261:148;47748:668;;47678:738;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1349:75::-;1382:6;1415:2;1409:9;1399:19;;1349:75;:::o;1430:117::-;1539:1;1536;1529:12;1553:117;1662:1;1659;1652:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:117::-;3555:1;3552;3545:12;3593:234;3668:5;3709:3;3700:6;3695:3;3691:16;3687:26;3684:113;;;3716:79;;:::i;:::-;3684:113;3815:6;3806:15;;3593:234;;;;:::o;3833:547::-;3921:6;3970:2;3958:9;3949:7;3945:23;3941:32;3938:119;;;3976:79;;:::i;:::-;3938:119;4124:1;4113:9;4109:17;4096:31;4154:18;4146:6;4143:30;4140:117;;;4176:79;;:::i;:::-;4140:117;4281:82;4355:7;4346:6;4335:9;4331:22;4281:82;:::i;:::-;4271:92;;4067:306;3833:547;;;;:::o;4386:108::-;4463:24;4481:5;4463:24;:::i;:::-;4458:3;4451:37;4386:108;;:::o;4542:523::-;4691:4;4686:3;4682:14;4785:4;4778:5;4774:16;4768:23;4804:63;4861:4;4856:3;4852:14;4838:12;4804:63;:::i;:::-;4706:171;4966:4;4959:5;4955:16;4949:23;4985:63;5042:4;5037:3;5033:14;5019:12;4985:63;:::i;:::-;4887:171;4660:405;4542:523;;:::o;5071:144::-;5168:6;5202:5;5196:12;5186:22;;5071:144;;;:::o;5221:214::-;5350:11;5384:6;5379:3;5372:19;5424:4;5419:3;5415:14;5400:29;;5221:214;;;;:::o;5441:162::-;5538:4;5561:3;5553:11;;5591:4;5586:3;5582:14;5574:22;;5441:162;;;:::o;5609:76::-;5645:7;5674:5;5663:16;;5609:76;;;:::o;5691:105::-;5766:23;5783:5;5766:23;:::i;:::-;5761:3;5754:36;5691:105;;:::o;5802:159::-;5876:11;5910:6;5905:3;5898:19;5950:4;5945:3;5941:14;5926:29;;5802:159;;;;:::o;5967:357::-;6045:3;6073:39;6106:5;6073:39;:::i;:::-;6128:61;6182:6;6177:3;6128:61;:::i;:::-;6121:68;;6198:65;6256:6;6251:3;6244:4;6237:5;6233:16;6198:65;:::i;:::-;6288:29;6310:6;6288:29;:::i;:::-;6283:3;6279:39;6272:46;;6049:275;5967:357;;;;:::o;6380:618::-;6499:3;6535:4;6530:3;6526:14;6629:4;6622:5;6618:16;6612:23;6648:61;6703:4;6698:3;6694:14;6680:12;6648:61;:::i;:::-;6550:169;6808:4;6801:5;6797:16;6791:23;6861:3;6855:4;6851:14;6844:4;6839:3;6835:14;6828:38;6887:73;6955:4;6941:12;6887:73;:::i;:::-;6879:81;;6729:242;6988:4;6981:11;;6504:494;6380:618;;;;:::o;7004:276::-;7133:10;7168:106;7270:3;7262:6;7168:106;:::i;:::-;7154:120;;7004:276;;;;:::o;7286:143::-;7386:4;7418;7413:3;7409:14;7401:22;;7286:143;;;:::o;7489:1151::-;7668:3;7697:84;7775:5;7697:84;:::i;:::-;7797:116;7906:6;7901:3;7797:116;:::i;:::-;7790:123;;7939:3;7984:4;7976:6;7972:17;7967:3;7963:27;8014:86;8094:5;8014:86;:::i;:::-;8123:7;8154:1;8139:456;8164:6;8161:1;8158:13;8139:456;;;8235:9;8229:4;8225:20;8220:3;8213:33;8286:6;8280:13;8314:124;8433:4;8418:13;8314:124;:::i;:::-;8306:132;;8461:90;8544:6;8461:90;:::i;:::-;8451:100;;8580:4;8575:3;8571:14;8564:21;;8199:396;8186:1;8183;8179:9;8174:14;;8139:456;;;8143:14;8611:4;8604:11;;8631:3;8624:10;;7673:967;;;;;7489:1151;;;;:::o;8692:533::-;8845:4;8840:3;8836:14;8940:4;8933:5;8929:16;8923:23;8959:63;9016:4;9011:3;9007:14;8993:12;8959:63;:::i;:::-;8860:172;9126:4;9119:5;9115:16;9109:23;9145:63;9202:4;9197:3;9193:14;9179:12;9145:63;:::i;:::-;9042:176;8814:411;8692:533;;:::o;9231:930::-;9598:4;9636:3;9625:9;9621:19;9613:27;;9650:123;9770:1;9759:9;9755:17;9746:6;9650:123;:::i;:::-;9820:9;9814:4;9810:20;9805:2;9794:9;9790:18;9783:48;9848:168;10011:4;10002:6;9848:168;:::i;:::-;9840:176;;10026:128;10150:2;10139:9;10135:18;10126:6;10026:128;:::i;:::-;9231:930;;;;;;:::o;10167:118::-;10254:24;10272:5;10254:24;:::i;:::-;10249:3;10242:37;10167:118;;:::o;10291:222::-;10384:4;10422:2;10411:9;10407:18;10399:26;;10435:71;10503:1;10492:9;10488:17;10479:6;10435:71;:::i;:::-;10291:222;;;;:::o;10540:229::-;10611:5;10652:2;10643:6;10638:3;10634:16;10630:25;10627:112;;;10658:79;;:::i;:::-;10627:112;10757:6;10748:15;;10540:229;;;;:::o;10775:77::-;10812:7;10841:5;10830:16;;10775:77;;;:::o;10858:122::-;10931:24;10949:5;10931:24;:::i;:::-;10924:5;10921:35;10911:63;;10970:1;10967;10960:12;10911:63;10858:122;:::o;10986:139::-;11032:5;11070:6;11057:20;11048:29;;11086:33;11113:5;11086:33;:::i;:::-;10986:139;;;;:::o;11131:117::-;11240:1;11237;11230:12;11254:117;11363:1;11360;11353:12;11377:117;11486:1;11483;11476:12;11513:552;11570:8;11580:6;11630:3;11623:4;11615:6;11611:17;11607:27;11597:122;;11638:79;;:::i;:::-;11597:122;11751:6;11738:20;11728:30;;11781:18;11773:6;11770:30;11767:117;;;11803:79;;:::i;:::-;11767:117;11917:4;11909:6;11905:17;11893:29;;11971:3;11963:4;11955:6;11951:17;11941:8;11937:32;11934:41;11931:128;;;11978:79;;:::i;:::-;11931:128;11513:552;;;;;:::o;12071:1359::-;12213:6;12221;12229;12237;12245;12253;12261;12310:3;12298:9;12289:7;12285:23;12281:33;12278:120;;;12317:79;;:::i;:::-;12278:120;12437:1;12462:78;12532:7;12523:6;12512:9;12508:22;12462:78;:::i;:::-;12452:88;;12408:142;12589:2;12615:53;12660:7;12651:6;12640:9;12636:22;12615:53;:::i;:::-;12605:63;;12560:118;12745:3;12734:9;12730:19;12717:33;12777:18;12769:6;12766:30;12763:117;;;12799:79;;:::i;:::-;12763:117;12912:64;12968:7;12959:6;12948:9;12944:22;12912:64;:::i;:::-;12894:82;;;;12688:298;13025:3;13052:53;13097:7;13088:6;13077:9;13073:22;13052:53;:::i;:::-;13042:63;;12996:119;13182:3;13171:9;13167:19;13154:33;13214:18;13206:6;13203:30;13200:117;;;13236:79;;:::i;:::-;13200:117;13349:64;13405:7;13396:6;13385:9;13381:22;13349:64;:::i;:::-;13331:82;;;;13125:298;12071:1359;;;;;;;;;;:::o;13436:89::-;13472:7;13512:6;13505:5;13501:18;13490:29;;13436:89;;;:::o;13531:115::-;13616:23;13633:5;13616:23;:::i;:::-;13611:3;13604:36;13531:115;;:::o;13652:218::-;13743:4;13781:2;13770:9;13766:18;13758:26;;13794:69;13860:1;13849:9;13845:17;13836:6;13794:69;:::i;:::-;13652:218;;;;:::o;13876:149::-;13912:7;13952:66;13945:5;13941:78;13930:89;;13876:149;;;:::o;14031:115::-;14116:23;14133:5;14116:23;:::i;:::-;14111:3;14104:36;14031:115;;:::o;14152:101::-;14188:7;14228:18;14221:5;14217:30;14206:41;;14152:101;;;:::o;14259:115::-;14344:23;14361:5;14344:23;:::i;:::-;14339:3;14332:36;14259:115;;:::o;14380:324::-;14497:4;14535:2;14524:9;14520:18;14512:26;;14548:69;14614:1;14603:9;14599:17;14590:6;14548:69;:::i;:::-;14627:70;14693:2;14682:9;14678:18;14669:6;14627:70;:::i;:::-;14380:324;;;;;:::o;14710:::-;14827:4;14865:2;14854:9;14850:18;14842:26;;14878:69;14944:1;14933:9;14929:17;14920:6;14878:69;:::i;:::-;14957:70;15023:2;15012:9;15008:18;14999:6;14957:70;:::i;:::-;14710:324;;;;;:::o;15040:118::-;15127:24;15145:5;15127:24;:::i;:::-;15122:3;15115:37;15040:118;;:::o;15164:222::-;15257:4;15295:2;15284:9;15280:18;15272:26;;15308:71;15376:1;15365:9;15361:17;15352:6;15308:71;:::i;:::-;15164:222;;;;:::o;15392:619::-;15469:6;15477;15485;15534:2;15522:9;15513:7;15509:23;15505:32;15502:119;;;15540:79;;:::i;:::-;15502:119;15660:1;15685:53;15730:7;15721:6;15710:9;15706:22;15685:53;:::i;:::-;15675:63;;15631:117;15787:2;15813:53;15858:7;15849:6;15838:9;15834:22;15813:53;:::i;:::-;15803:63;;15758:118;15915:2;15941:53;15986:7;15977:6;15966:9;15962:22;15941:53;:::i;:::-;15931:63;;15886:118;15392:619;;;;;:::o;16017:86::-;16052:7;16092:4;16085:5;16081:16;16070:27;;16017:86;;;:::o;16109:112::-;16192:22;16208:5;16192:22;:::i;:::-;16187:3;16180:35;16109:112;;:::o;16227:214::-;16316:4;16354:2;16343:9;16339:18;16331:26;;16367:67;16431:1;16420:9;16416:17;16407:6;16367:67;:::i;:::-;16227:214;;;;:::o;16447:93::-;16483:7;16523:10;16516:5;16512:22;16501:33;;16447:93;;;:::o;16546:120::-;16618:23;16635:5;16618:23;:::i;:::-;16611:5;16608:34;16598:62;;16656:1;16653;16646:12;16598:62;16546:120;:::o;16672:137::-;16717:5;16755:6;16742:20;16733:29;;16771:32;16797:5;16771:32;:::i;:::-;16672:137;;;;:::o;16815:472::-;16882:6;16890;16939:2;16927:9;16918:7;16914:23;16910:32;16907:119;;;16945:79;;:::i;:::-;16907:119;17065:1;17090:52;17134:7;17125:6;17114:9;17110:22;17090:52;:::i;:::-;17080:62;;17036:116;17191:2;17217:53;17262:7;17253:6;17242:9;17238:22;17217:53;:::i;:::-;17207:63;;17162:118;16815:472;;;;;:::o;17293:116::-;17363:21;17378:5;17363:21;:::i;:::-;17356:5;17353:32;17343:60;;17399:1;17396;17389:12;17343:60;17293:116;:::o;17415:133::-;17458:5;17496:6;17483:20;17474:29;;17512:30;17536:5;17512:30;:::i;:::-;17415:133;;;;:::o;17554:686::-;17648:6;17656;17705:2;17693:9;17684:7;17680:23;17676:32;17673:119;;;17711:79;;:::i;:::-;17673:119;17859:1;17848:9;17844:17;17831:31;17889:18;17881:6;17878:30;17875:117;;;17911:79;;:::i;:::-;17875:117;18016:82;18090:7;18081:6;18070:9;18066:22;18016:82;:::i;:::-;18006:92;;17802:306;18147:2;18173:50;18215:7;18206:6;18195:9;18191:22;18173:50;:::i;:::-;18163:60;;18118:115;17554:686;;;;;:::o;18296:526::-;18451:4;18446:3;18442:14;18543:4;18536:5;18532:16;18526:23;18562:63;18619:4;18614:3;18610:14;18596:12;18562:63;:::i;:::-;18466:169;18723:4;18716:5;18712:16;18706:23;18742:63;18799:4;18794:3;18790:14;18776:12;18742:63;:::i;:::-;18645:170;18420:402;18296:526;;:::o;18828:338::-;18979:4;19017:2;19006:9;19002:18;18994:26;;19030:129;19156:1;19145:9;19141:17;19132:6;19030:129;:::i;:::-;18828:338;;;;:::o;19172:120::-;19244:23;19261:5;19244:23;:::i;:::-;19237:5;19234:34;19224:62;;19282:1;19279;19272:12;19224:62;19172:120;:::o;19298:137::-;19343:5;19381:6;19368:20;19359:29;;19397:32;19423:5;19397:32;:::i;:::-;19298:137;;;;:::o;19441:470::-;19507:6;19515;19564:2;19552:9;19543:7;19539:23;19535:32;19532:119;;;19570:79;;:::i;:::-;19532:119;19690:1;19715:52;19759:7;19750:6;19739:9;19735:22;19715:52;:::i;:::-;19705:62;;19661:116;19816:2;19842:52;19886:7;19877:6;19866:9;19862:22;19842:52;:::i;:::-;19832:62;;19787:117;19441:470;;;;;:::o;19917:98::-;19968:6;20002:5;19996:12;19986:22;;19917:98;;;:::o;20021:168::-;20104:11;20138:6;20133:3;20126:19;20178:4;20173:3;20169:14;20154:29;;20021:168;;;;:::o;20195:373::-;20281:3;20309:38;20341:5;20309:38;:::i;:::-;20363:70;20426:6;20421:3;20363:70;:::i;:::-;20356:77;;20442:65;20500:6;20495:3;20488:4;20481:5;20477:16;20442:65;:::i;:::-;20532:29;20554:6;20532:29;:::i;:::-;20527:3;20523:39;20516:46;;20285:283;20195:373;;;;:::o;20574:309::-;20685:4;20723:2;20712:9;20708:18;20700:26;;20772:9;20766:4;20762:20;20758:1;20747:9;20743:17;20736:47;20800:76;20871:4;20862:6;20800:76;:::i;:::-;20792:84;;20574:309;;;;:::o;20889:60::-;20917:3;20938:5;20931:12;;20889:60;;;:::o;20955:142::-;21005:9;21038:53;21056:34;21065:24;21083:5;21065:24;:::i;:::-;21056:34;:::i;:::-;21038:53;:::i;:::-;21025:66;;20955:142;;;:::o;21103:126::-;21153:9;21186:37;21217:5;21186:37;:::i;:::-;21173:50;;21103:126;;;:::o;21235:154::-;21313:9;21346:37;21377:5;21346:37;:::i;:::-;21333:50;;21235:154;;;:::o;21395:187::-;21510:65;21569:5;21510:65;:::i;:::-;21505:3;21498:78;21395:187;;:::o;21588:278::-;21709:4;21747:2;21736:9;21732:18;21724:26;;21760:99;21856:1;21845:9;21841:17;21832:6;21760:99;:::i;:::-;21588:278;;;;:::o;21872:329::-;21931:6;21980:2;21968:9;21959:7;21955:23;21951:32;21948:119;;;21986:79;;:::i;:::-;21948:119;22106:1;22131:53;22176:7;22167:6;22156:9;22152:22;22131:53;:::i;:::-;22121:63;;22077:117;21872:329;;;;:::o;22207:218::-;22298:4;22336:2;22325:9;22321:18;22313:26;;22349:69;22415:1;22404:9;22400:17;22391:6;22349:69;:::i;:::-;22207:218;;;;:::o;22431:869::-;22544:6;22552;22560;22568;22617:3;22605:9;22596:7;22592:23;22588:33;22585:120;;;22624:79;;:::i;:::-;22585:120;22744:1;22769:78;22839:7;22830:6;22819:9;22815:22;22769:78;:::i;:::-;22759:88;;22715:142;22924:2;22913:9;22909:18;22896:32;22955:18;22947:6;22944:30;22941:117;;;22977:79;;:::i;:::-;22941:117;23090:64;23146:7;23137:6;23126:9;23122:22;23090:64;:::i;:::-;23072:82;;;;22867:297;23203:3;23230:53;23275:7;23266:6;23255:9;23251:22;23230:53;:::i;:::-;23220:63;;23174:119;22431:869;;;;;;;:::o;23306:329::-;23365:6;23414:2;23402:9;23393:7;23389:23;23385:32;23382:119;;;23420:79;;:::i;:::-;23382:119;23540:1;23565:53;23610:7;23601:6;23590:9;23586:22;23565:53;:::i;:::-;23555:63;;23511:117;23306:329;;;;:::o;23677:606::-;23788:8;23798:6;23848:3;23841:4;23833:6;23829:17;23825:27;23815:122;;23856:79;;:::i;:::-;23815:122;23969:6;23956:20;23946:30;;23999:18;23991:6;23988:30;23985:117;;;24021:79;;:::i;:::-;23985:117;24135:4;24127:6;24123:17;24111:29;;24189:3;24181:4;24173:6;24169:17;24159:8;24155:32;24152:41;24149:128;;;24196:79;;:::i;:::-;24149:128;23677:606;;;;;:::o;24289:635::-;24413:6;24421;24470:2;24458:9;24449:7;24445:23;24441:32;24438:119;;;24476:79;;:::i;:::-;24438:119;24624:1;24613:9;24609:17;24596:31;24654:18;24646:6;24643:30;24640:117;;;24676:79;;:::i;:::-;24640:117;24789:118;24899:7;24890:6;24879:9;24875:22;24789:118;:::i;:::-;24771:136;;;;24567:350;24289:635;;;;;:::o;24930:327::-;24988:6;25037:2;25025:9;25016:7;25012:23;25008:32;25005:119;;;25043:79;;:::i;:::-;25005:119;25163:1;25188:52;25232:7;25223:6;25212:9;25208:22;25188:52;:::i;:::-;25178:62;;25134:116;24930:327;;;;:::o;25263:118::-;25350:24;25368:5;25350:24;:::i;:::-;25345:3;25338:37;25263:118;;:::o;25387:222::-;25480:4;25518:2;25507:9;25503:18;25495:26;;25531:71;25599:1;25588:9;25584:17;25575:6;25531:71;:::i;:::-;25387:222;;;;:::o;25615:813::-;25701:6;25709;25717;25725;25774:2;25762:9;25753:7;25749:23;25745:32;25742:119;;;25780:79;;:::i;:::-;25742:119;25900:1;25925:52;25969:7;25960:6;25949:9;25945:22;25925:52;:::i;:::-;25915:62;;25871:116;26026:2;26052:52;26096:7;26087:6;26076:9;26072:22;26052:52;:::i;:::-;26042:62;;25997:117;26181:2;26170:9;26166:18;26153:32;26212:18;26204:6;26201:30;26198:117;;;26234:79;;:::i;:::-;26198:117;26347:64;26403:7;26394:6;26383:9;26379:22;26347:64;:::i;:::-;26329:82;;;;26124:297;25615:813;;;;;;;:::o;26464:601::-;26570:8;26580:6;26630:3;26623:4;26615:6;26611:17;26607:27;26597:122;;26638:79;;:::i;:::-;26597:122;26751:6;26738:20;26728:30;;26781:18;26773:6;26770:30;26767:117;;;26803:79;;:::i;:::-;26767:117;26917:4;26909:6;26905:17;26893:29;;26971:3;26963:4;26955:6;26951:17;26941:8;26937:32;26934:41;26931:128;;;26978:79;;:::i;:::-;26931:128;26464:601;;;;;:::o;27071:625::-;27190:6;27198;27247:2;27235:9;27226:7;27222:23;27218:32;27215:119;;;27253:79;;:::i;:::-;27215:119;27401:1;27390:9;27386:17;27373:31;27431:18;27423:6;27420:30;27417:117;;;27453:79;;:::i;:::-;27417:117;27566:113;27671:7;27662:6;27651:9;27647:22;27566:113;:::i;:::-;27548:131;;;;27344:345;27071:625;;;;;:::o;27729:235::-;27806:5;27847:2;27838:6;27833:3;27829:16;27825:25;27822:112;;;27853:79;;:::i;:::-;27822:112;27952:6;27943:15;;27729:235;;;;:::o;27970:900::-;28107:6;28115;28123;28172:3;28160:9;28151:7;28147:23;28143:33;28140:120;;;28179:79;;:::i;:::-;28140:120;28327:1;28316:9;28312:17;28299:31;28357:18;28349:6;28346:30;28343:117;;;28379:79;;:::i;:::-;28343:117;28484:82;28558:7;28549:6;28538:9;28534:22;28484:82;:::i;:::-;28474:92;;28270:306;28615:2;28641:84;28717:7;28708:6;28697:9;28693:22;28641:84;:::i;:::-;28631:94;;28586:149;28774:2;28800:53;28845:7;28836:6;28825:9;28821:22;28800:53;:::i;:::-;28790:63;;28745:118;27970:900;;;;;:::o;28876:108::-;28953:24;28971:5;28953:24;:::i;:::-;28948:3;28941:37;28876:108;;:::o;28990:105::-;29065:23;29082:5;29065:23;:::i;:::-;29060:3;29053:36;28990:105;;:::o;29151:516::-;29296:4;29291:3;29287:14;29388:4;29381:5;29377:16;29371:23;29407:63;29464:4;29459:3;29455:14;29441:12;29407:63;:::i;:::-;29311:169;29568:4;29561:5;29557:16;29551:23;29587:63;29644:4;29639:3;29635:14;29621:12;29587:63;:::i;:::-;29490:170;29265:402;29151:516;;:::o;29731:753::-;29894:4;29889:3;29885:14;29981:4;29974:5;29970:16;29964:23;30000:63;30057:4;30052:3;30048:14;30034:12;30000:63;:::i;:::-;29909:164;30156:4;30149:5;30145:16;30139:23;30175:61;30230:4;30225:3;30221:14;30207:12;30175:61;:::i;:::-;30083:163;30327:4;30320:5;30316:16;30310:23;30346:121;30461:4;30456:3;30452:14;30438:12;30346:121;:::i;:::-;30256:221;29863:621;29731:753;;:::o;30490:578::-;30733:4;30771:3;30760:9;30756:19;30748:27;;30785:137;30919:1;30908:9;30904:17;30895:6;30785:137;:::i;:::-;30932:129;31056:3;31045:9;31041:19;31032:6;30932:129;:::i;:::-;30490:578;;;;;:::o;31074:474::-;31142:6;31150;31199:2;31187:9;31178:7;31174:23;31170:32;31167:119;;;31205:79;;:::i;:::-;31167:119;31325:1;31350:53;31395:7;31386:6;31375:9;31371:22;31350:53;:::i;:::-;31340:63;;31296:117;31452:2;31478:53;31523:7;31514:6;31503:9;31499:22;31478:53;:::i;:::-;31468:63;;31423:118;31074:474;;;;;:::o;31554:379::-;31638:6;31687:2;31675:9;31666:7;31662:23;31658:32;31655:119;;;31693:79;;:::i;:::-;31655:119;31813:1;31838:78;31908:7;31899:6;31888:9;31884:22;31838:78;:::i;:::-;31828:88;;31784:142;31554:379;;;;:::o;31939:180::-;31987:77;31984:1;31977:88;32084:4;32081:1;32074:15;32108:4;32105:1;32098:15;32125:320;32169:6;32206:1;32200:4;32196:12;32186:22;;32253:1;32247:4;32243:12;32274:18;32264:81;;32330:4;32322:6;32318:17;32308:27;;32264:81;32392:2;32384:6;32381:14;32361:18;32358:38;32355:84;;32411:18;;:::i;:::-;32355:84;32176:269;32125:320;;;:::o;32451:180::-;32499:77;32496:1;32489:88;32596:4;32593:1;32586:15;32620:4;32617:1;32610:15;32637:115;32722:23;32739:5;32722:23;:::i;:::-;32717:3;32710:36;32637:115;;:::o;32758:328::-;32877:4;32915:2;32904:9;32900:18;32892:26;;32928:69;32994:1;32983:9;32979:17;32970:6;32928:69;:::i;:::-;33007:72;33075:2;33064:9;33060:18;33051:6;33007:72;:::i;:::-;32758:328;;;;;:::o;33092:165::-;33232:17;33228:1;33220:6;33216:14;33209:41;33092:165;:::o;33263:366::-;33405:3;33426:67;33490:2;33485:3;33426:67;:::i;:::-;33419:74;;33502:93;33591:3;33502:93;:::i;:::-;33620:2;33615:3;33611:12;33604:19;;33263:366;;;:::o;33635:419::-;33801:4;33839:2;33828:9;33824:18;33816:26;;33888:9;33882:4;33878:20;33874:1;33863:9;33859:17;33852:47;33916:131;34042:4;33916:131;:::i;:::-;33908:139;;33635:419;;;:::o;34060:164::-;34200:16;34196:1;34188:6;34184:14;34177:40;34060:164;:::o;34230:366::-;34372:3;34393:67;34457:2;34452:3;34393:67;:::i;:::-;34386:74;;34469:93;34558:3;34469:93;:::i;:::-;34587:2;34582:3;34578:12;34571:19;;34230:366;;;:::o;34602:419::-;34768:4;34806:2;34795:9;34791:18;34783:26;;34855:9;34849:4;34845:20;34841:1;34830:9;34826:17;34819:47;34883:131;35009:4;34883:131;:::i;:::-;34875:139;;34602:419;;;:::o;35027:175::-;35167:27;35163:1;35155:6;35151:14;35144:51;35027:175;:::o;35208:366::-;35350:3;35371:67;35435:2;35430:3;35371:67;:::i;:::-;35364:74;;35447:93;35536:3;35447:93;:::i;:::-;35565:2;35560:3;35556:12;35549:19;;35208:366;;;:::o;35580:419::-;35746:4;35784:2;35773:9;35769:18;35761:26;;35833:9;35827:4;35823:20;35819:1;35808:9;35804:17;35797:47;35861:131;35987:4;35861:131;:::i;:::-;35853:139;;35580:419;;;:::o;36005:281::-;36088:27;36110:4;36088:27;:::i;:::-;36080:6;36076:40;36218:6;36206:10;36203:22;36182:18;36170:10;36167:34;36164:62;36161:88;;;36229:18;;:::i;:::-;36161:88;36269:10;36265:2;36258:22;36048:238;36005:281;;:::o;36292:129::-;36326:6;36353:20;;:::i;:::-;36343:30;;36382:33;36410:4;36402:6;36382:33;:::i;:::-;36292:129;;;:::o;36427:347::-;36540:4;36630:18;36622:6;36619:30;36616:56;;;36652:18;;:::i;:::-;36616:56;36702:4;36694:6;36690:17;36682:25;;36762:4;36756;36752:15;36744:23;;36427:347;;;:::o;36780:117::-;36889:1;36886;36879:12;36903:117;37012:1;37009;37002:12;37026:117;37135:1;37132;37125:12;37149:307;37210:4;37300:18;37292:6;37289:30;37286:56;;;37322:18;;:::i;:::-;37286:56;37360:29;37382:6;37360:29;:::i;:::-;37352:37;;37444:4;37438;37434:15;37426:23;;37149:307;;;:::o;37462:146::-;37559:6;37554:3;37549;37536:30;37600:1;37591:6;37586:3;37582:16;37575:27;37462:146;;;:::o;37614:423::-;37691:5;37716:65;37732:48;37773:6;37732:48;:::i;:::-;37716:65;:::i;:::-;37707:74;;37804:6;37797:5;37790:21;37842:4;37835:5;37831:16;37880:3;37871:6;37866:3;37862:16;37859:25;37856:112;;;37887:79;;:::i;:::-;37856:112;37977:54;38024:6;38019:3;38014;37977:54;:::i;:::-;37697:340;37614:423;;;;;:::o;38056:338::-;38111:5;38160:3;38153:4;38145:6;38141:17;38137:27;38127:122;;38168:79;;:::i;:::-;38127:122;38285:6;38272:20;38310:78;38384:3;38376:6;38369:4;38361:6;38357:17;38310:78;:::i;:::-;38301:87;;38117:277;38056:338;;;;:::o;38434:918::-;38519:5;38563:4;38551:9;38546:3;38542:19;38538:30;38535:117;;;38571:79;;:::i;:::-;38535:117;38670:21;38686:4;38670:21;:::i;:::-;38661:30;;38749:1;38789:48;38833:3;38824:6;38813:9;38809:22;38789:48;:::i;:::-;38782:4;38775:5;38771:16;38764:74;38701:148;38911:2;38952:48;38996:3;38987:6;38976:9;38972:22;38952:48;:::i;:::-;38945:4;38938:5;38934:16;38927:74;38859:153;39102:2;39091:9;39087:18;39074:32;39133:18;39125:6;39122:30;39119:117;;;39155:79;;:::i;:::-;39119:117;39275:58;39329:3;39320:6;39309:9;39305:22;39275:58;:::i;:::-;39268:4;39261:5;39257:16;39250:84;39022:323;38434:918;;;;:::o;39394:1023::-;39526:5;39551:117;39567:100;39660:6;39567:100;:::i;:::-;39551:117;:::i;:::-;39542:126;;39688:5;39717:6;39710:5;39703:21;39751:4;39744:5;39740:16;39733:23;;39804:4;39796:6;39792:17;39784:6;39780:30;39833:3;39825:6;39822:15;39819:122;;;39852:79;;:::i;:::-;39819:122;39967:6;39950:461;39984:6;39979:3;39976:15;39950:461;;;40073:3;40060:17;40109:18;40096:11;40093:35;40090:122;;;40131:79;;:::i;:::-;40090:122;40255:11;40247:6;40243:24;40293:73;40362:3;40350:10;40293:73;:::i;:::-;40288:3;40281:86;40396:4;40391:3;40387:14;40380:21;;40026:385;;40010:4;40005:3;40001:14;39994:21;;39950:461;;;39954:21;39532:885;;39394:1023;;;;;:::o;40423:425::-;40613:9;40712:129;40826:14;40818:6;40811:5;40712:129;:::i;:::-;40690:151;;40423:425;;;;:::o;40854:117::-;40963:1;40960;40953:12;40977:117;41086:1;41083;41076:12;41100:469;41205:9;41216;41254:8;41242:10;41239:24;41236:111;;;41266:79;;:::i;:::-;41236:111;41372:6;41362:8;41359:20;41356:107;;;41382:79;;:::i;:::-;41356:107;41513:1;41501:10;41497:18;41489:6;41485:31;41472:44;;41552:10;41542:8;41538:25;41525:38;;41100:469;;;;;;;:::o;41575:147::-;41676:11;41713:3;41698:18;;41575:147;;;;:::o;41728:386::-;41832:3;41860:38;41892:5;41860:38;:::i;:::-;41914:88;41995:6;41990:3;41914:88;:::i;:::-;41907:95;;42011:65;42069:6;42064:3;42057:4;42050:5;42046:16;42011:65;:::i;:::-;42101:6;42096:3;42092:16;42085:23;;41836:278;41728:386;;;;:::o;42142:327::-;42256:3;42277:88;42358:6;42353:3;42277:88;:::i;:::-;42270:95;;42375:56;42424:6;42419:3;42412:5;42375:56;:::i;:::-;42456:6;42451:3;42447:16;42440:23;;42142:327;;;;;:::o;42475:453::-;42667:3;42689:93;42778:3;42769:6;42689:93;:::i;:::-;42682:100;;42799:103;42898:3;42889:6;42881;42799:103;:::i;:::-;42792:110;;42919:3;42912:10;;42475:453;;;;;;:::o;42956:314::-;43052:3;43073:70;43136:6;43131:3;43073:70;:::i;:::-;43066:77;;43153:56;43202:6;43197:3;43190:5;43153:56;:::i;:::-;43234:29;43256:6;43234:29;:::i;:::-;43229:3;43225:39;43218:46;;42956:314;;;;;:::o;43276:329::-;43397:4;43435:2;43424:9;43420:18;43412:26;;43484:9;43478:4;43474:20;43470:1;43459:9;43455:17;43448:47;43512:86;43593:4;43584:6;43576;43512:86;:::i;:::-;43504:94;;43276:329;;;;;:::o;43611:180::-;43659:77;43656:1;43649:88;43756:4;43753:1;43746:15;43780:4;43777:1;43770:15;43797:117;43906:1;43903;43896:12;43920:117;44029:1;44026;44019:12;44043:117;44152:1;44149;44142:12;44166:401;44265:4;44319:11;44306:25;44421:1;44413:6;44409:14;44398:8;44382:14;44378:29;44374:50;44354:18;44350:75;44340:170;;44429:79;;:::i;:::-;44340:170;44541:18;44531:8;44527:33;44519:41;;44270:297;44166:401;;;;:::o;44573:724::-;44650:4;44656:6;44712:11;44699:25;44812:1;44806:4;44802:12;44791:8;44775:14;44771:29;44767:48;44747:18;44743:73;44733:168;;44820:79;;:::i;:::-;44733:168;44932:18;44922:8;44918:33;44910:41;;44984:4;44971:18;44961:28;;45012:18;45004:6;45001:30;44998:117;;;45034:79;;:::i;:::-;44998:117;45142:2;45136:4;45132:13;45124:21;;45199:4;45191:6;45187:17;45171:14;45167:38;45161:4;45157:49;45154:136;;;45209:79;;:::i;:::-;45154:136;44663:634;44573:724;;;;;:::o;45303:120::-;45354:5;45379:38;45413:2;45408:3;45404:12;45399:3;45379:38;:::i;:::-;45370:47;;45303:120;;;;:::o;45429:105::-;45504:23;45521:5;45504:23;:::i;:::-;45499:3;45492:36;45429:105;;:::o;45540:122::-;45592:5;45617:39;45652:2;45647:3;45643:12;45638:3;45617:39;:::i;:::-;45608:48;;45540:122;;;;:::o;45668:120::-;45740:23;45757:5;45740:23;:::i;:::-;45733:5;45730:34;45720:62;;45778:1;45775;45768:12;45720:62;45668:120;:::o;45794:137::-;45839:5;45877:6;45864:20;45855:29;;45893:32;45919:5;45893:32;:::i;:::-;45794:137;;;;:::o;45937:120::-;45988:5;46013:38;46047:2;46042:3;46038:12;46033:3;46013:38;:::i;:::-;46004:47;;45937:120;;;;:::o;46101:759::-;46246:4;46241:3;46237:14;46318:49;46361:4;46354:5;46350:16;46343:5;46318:49;:::i;:::-;46380:61;46435:4;46430:3;46426:14;46412:12;46380:61;:::i;:::-;46261:190;46518:50;46562:4;46555:5;46551:16;46544:5;46518:50;:::i;:::-;46581:63;46638:4;46633:3;46629:14;46615:12;46581:63;:::i;:::-;46461:193;46720:49;46763:4;46756:5;46752:16;46745:5;46720:49;:::i;:::-;46782:61;46837:4;46832:3;46828:14;46814:12;46782:61;:::i;:::-;46664:189;46215:645;46101:759;;:::o;46866:976::-;47175:4;47213:3;47202:9;47198:19;47190:27;;47227:119;47343:1;47332:9;47328:17;47319:6;47227:119;:::i;:::-;47356:72;47424:2;47413:9;47409:18;47400:6;47356:72;:::i;:::-;47476:9;47470:4;47466:20;47460:3;47449:9;47445:19;47438:49;47504:86;47585:4;47576:6;47568;47504:86;:::i;:::-;47496:94;;47600:73;47668:3;47657:9;47653:19;47644:6;47600:73;:::i;:::-;47721:9;47715:4;47711:20;47705:3;47694:9;47690:19;47683:49;47749:86;47830:4;47821:6;47813;47749:86;:::i;:::-;47741:94;;46866:976;;;;;;;;;;:::o;47848:432::-;47936:5;47961:65;47977:48;48018:6;47977:48;:::i;:::-;47961:65;:::i;:::-;47952:74;;48049:6;48042:5;48035:21;48087:4;48080:5;48076:16;48125:3;48116:6;48111:3;48107:16;48104:25;48101:112;;;48132:79;;:::i;:::-;48101:112;48222:52;48267:6;48262:3;48257;48222:52;:::i;:::-;47942:338;47848:432;;;;;:::o;48299:353::-;48365:5;48414:3;48407:4;48399:6;48395:17;48391:27;48381:122;;48422:79;;:::i;:::-;48381:122;48532:6;48526:13;48557:89;48642:3;48634:6;48627:4;48619:6;48615:17;48557:89;:::i;:::-;48548:98;;48371:281;48299:353;;;;:::o;48658:522::-;48737:6;48786:2;48774:9;48765:7;48761:23;48757:32;48754:119;;;48792:79;;:::i;:::-;48754:119;48933:1;48922:9;48918:17;48912:24;48963:18;48955:6;48952:30;48949:117;;;48985:79;;:::i;:::-;48949:117;49090:73;49155:7;49146:6;49135:9;49131:22;49090:73;:::i;:::-;49080:83;;48883:290;48658:522;;;;:::o;49213:589::-;49291:5;49335:4;49323:9;49318:3;49314:19;49310:30;49307:117;;;49343:79;;:::i;:::-;49307:117;49442:21;49458:4;49442:21;:::i;:::-;49433:30;;49527:1;49567:49;49612:3;49603:6;49592:9;49588:22;49567:49;:::i;:::-;49560:4;49553:5;49549:16;49542:75;49473:155;49693:2;49734:49;49779:3;49770:6;49759:9;49755:22;49734:49;:::i;:::-;49727:4;49720:5;49716:16;49709:75;49638:157;49213:589;;;;:::o;49808:387::-;49896:6;49945:2;49933:9;49924:7;49920:23;49916:32;49913:119;;;49951:79;;:::i;:::-;49913:119;50071:1;50096:82;50170:7;50161:6;50150:9;50146:22;50096:82;:::i;:::-;50086:92;;50042:146;49808:387;;;;:::o;50201:438::-;50348:4;50386:2;50375:9;50371:18;50363:26;;50399:69;50465:1;50454:9;50450:17;50441:6;50399:69;:::i;:::-;50478:72;50546:2;50535:9;50531:18;50522:6;50478:72;:::i;:::-;50560;50628:2;50617:9;50613:18;50604:6;50560:72;:::i;:::-;50201:438;;;;;;:::o;50645:163::-;50785:15;50781:1;50773:6;50769:14;50762:39;50645:163;:::o;50814:366::-;50956:3;50977:67;51041:2;51036:3;50977:67;:::i;:::-;50970:74;;51053:93;51142:3;51053:93;:::i;:::-;51171:2;51166:3;51162:12;51155:19;;50814:366;;;:::o;51186:419::-;51352:4;51390:2;51379:9;51375:18;51367:26;;51439:9;51433:4;51429:20;51425:1;51414:9;51410:17;51403:47;51467:131;51593:4;51467:131;:::i;:::-;51459:139;;51186:419;;;:::o;51611:160::-;51751:12;51747:1;51739:6;51735:14;51728:36;51611:160;:::o;51777:366::-;51919:3;51940:67;52004:2;51999:3;51940:67;:::i;:::-;51933:74;;52016:93;52105:3;52016:93;:::i;:::-;52134:2;52129:3;52125:12;52118:19;;51777:366;;;:::o;52149:419::-;52315:4;52353:2;52342:9;52338:18;52330:26;;52402:9;52396:4;52392:20;52388:1;52377:9;52373:17;52366:47;52430:131;52556:4;52430:131;:::i;:::-;52422:139;;52149:419;;;:::o;52574:220::-;52714:34;52710:1;52702:6;52698:14;52691:58;52783:3;52778:2;52770:6;52766:15;52759:28;52574:220;:::o;52800:366::-;52942:3;52963:67;53027:2;53022:3;52963:67;:::i;:::-;52956:74;;53039:93;53128:3;53039:93;:::i;:::-;53157:2;53152:3;53148:12;53141:19;;52800:366;;;:::o;53172:419::-;53338:4;53376:2;53365:9;53361:18;53353:26;;53425:9;53419:4;53415:20;53411:1;53400:9;53396:17;53389:47;53453:131;53579:4;53453:131;:::i;:::-;53445:139;;53172:419;;;:::o;53597:332::-;53718:4;53756:2;53745:9;53741:18;53733:26;;53769:71;53837:1;53826:9;53822:17;53813:6;53769:71;:::i;:::-;53850:72;53918:2;53907:9;53903:18;53894:6;53850:72;:::i;:::-;53597:332;;;;;:::o;53935:218::-;54026:4;54064:2;54053:9;54049:18;54041:26;;54077:69;54143:1;54132:9;54128:17;54119:6;54077:69;:::i;:::-;53935:218;;;;:::o;54159:175::-;54299:27;54295:1;54287:6;54283:14;54276:51;54159:175;:::o;54340:366::-;54482:3;54503:67;54567:2;54562:3;54503:67;:::i;:::-;54496:74;;54579:93;54668:3;54579:93;:::i;:::-;54697:2;54692:3;54688:12;54681:19;;54340:366;;;:::o;54712:419::-;54878:4;54916:2;54905:9;54901:18;54893:26;;54965:9;54959:4;54955:20;54951:1;54940:9;54936:17;54929:47;54993:131;55119:4;54993:131;:::i;:::-;54985:139;;54712:419;;;:::o;55137:506::-;55294:4;55332:2;55321:9;55317:18;55309:26;;55381:9;55375:4;55371:20;55367:1;55356:9;55352:17;55345:47;55409:76;55480:4;55471:6;55409:76;:::i;:::-;55401:84;;55532:9;55526:4;55522:20;55517:2;55506:9;55502:18;55495:48;55560:76;55631:4;55622:6;55560:76;:::i;:::-;55552:84;;55137:506;;;;;:::o;55649:137::-;55703:5;55734:6;55728:13;55719:22;;55750:30;55774:5;55750:30;:::i;:::-;55649:137;;;;:::o;55792:345::-;55859:6;55908:2;55896:9;55887:7;55883:23;55879:32;55876:119;;;55914:79;;:::i;:::-;55876:119;56034:1;56059:61;56112:7;56103:6;56092:9;56088:22;56059:61;:::i;:::-;56049:71;;56005:125;55792:345;;;;:::o;56143:158::-;56216:11;56250:6;56245:3;56238:19;56290:4;56285:3;56281:14;56266:29;;56143:158;;;;:::o;56307:353::-;56383:3;56411:38;56443:5;56411:38;:::i;:::-;56465:60;56518:6;56513:3;56465:60;:::i;:::-;56458:67;;56534:65;56592:6;56587:3;56580:4;56573:5;56569:16;56534:65;:::i;:::-;56624:29;56646:6;56624:29;:::i;:::-;56619:3;56615:39;56608:46;;56387:273;56307:353;;;;:::o;56666:99::-;56737:21;56752:5;56737:21;:::i;:::-;56732:3;56725:34;56666:99;;:::o;56827:1221::-;56960:3;56996:4;56991:3;56987:14;57085:4;57078:5;57074:16;57068:23;57104:61;57159:4;57154:3;57150:14;57136:12;57104:61;:::i;:::-;57011:164;57261:4;57254:5;57250:16;57244:23;57280:63;57337:4;57332:3;57328:14;57314:12;57280:63;:::i;:::-;57185:168;57438:4;57431:5;57427:16;57421:23;57491:3;57485:4;57481:14;57474:4;57469:3;57465:14;57458:38;57517:71;57583:4;57569:12;57517:71;:::i;:::-;57509:79;;57363:236;57684:4;57677:5;57673:16;57667:23;57737:3;57731:4;57727:14;57720:4;57715:3;57711:14;57704:38;57763:71;57829:4;57815:12;57763:71;:::i;:::-;57755:79;;57609:236;57935:4;57928:5;57924:16;57918:23;57954:57;58005:4;58000:3;57996:14;57982:12;57954:57;:::i;:::-;57855:166;58038:4;58031:11;;56965:1083;56827:1221;;;;:::o;58054:511::-;58239:4;58277:2;58266:9;58262:18;58254:26;;58326:9;58320:4;58316:20;58312:1;58301:9;58297:17;58290:47;58354:122;58471:4;58462:6;58354:122;:::i;:::-;58346:130;;58486:72;58554:2;58543:9;58539:18;58530:6;58486:72;:::i;:::-;58054:511;;;;;:::o;58571:143::-;58628:5;58659:6;58653:13;58644:22;;58675:33;58702:5;58675:33;:::i;:::-;58571:143;;;;:::o;58747:622::-;58836:5;58880:4;58868:9;58863:3;58859:19;58855:30;58852:117;;;58888:79;;:::i;:::-;58852:117;58987:21;59003:4;58987:21;:::i;:::-;58978:30;;59072:1;59112:60;59168:3;59159:6;59148:9;59144:22;59112:60;:::i;:::-;59105:4;59098:5;59094:16;59087:86;59018:166;59249:2;59290:60;59346:3;59337:6;59326:9;59322:22;59290:60;:::i;:::-;59283:4;59276:5;59272:16;59265:86;59194:168;58747:622;;;;:::o;59375:409::-;59474:6;59523:2;59511:9;59502:7;59498:23;59494:32;59491:119;;;59529:79;;:::i;:::-;59491:119;59649:1;59674:93;59759:7;59750:6;59739:9;59735:22;59674:93;:::i;:::-;59664:103;;59620:157;59375:409;;;;:::o;59790:140::-;59838:4;59861:3;59853:11;;59884:3;59881:1;59874:14;59918:4;59915:1;59905:18;59897:26;;59790:140;;;:::o;59936:93::-;59973:6;60020:2;60015;60008:5;60004:14;60000:23;59990:33;;59936:93;;;:::o;60035:107::-;60079:8;60129:5;60123:4;60119:16;60098:37;;60035:107;;;;:::o;60148:393::-;60217:6;60267:1;60255:10;60251:18;60290:97;60320:66;60309:9;60290:97;:::i;:::-;60408:39;60438:8;60427:9;60408:39;:::i;:::-;60396:51;;60480:4;60476:9;60469:5;60465:21;60456:30;;60529:4;60519:8;60515:19;60508:5;60505:30;60495:40;;60224:317;;60148:393;;;;;:::o;60547:142::-;60597:9;60630:53;60648:34;60657:24;60675:5;60657:24;:::i;:::-;60648:34;:::i;:::-;60630:53;:::i;:::-;60617:66;;60547:142;;;:::o;60695:75::-;60738:3;60759:5;60752:12;;60695:75;;;:::o;60776:269::-;60886:39;60917:7;60886:39;:::i;:::-;60947:91;60996:41;61020:16;60996:41;:::i;:::-;60988:6;60981:4;60975:11;60947:91;:::i;:::-;60941:4;60934:105;60852:193;60776:269;;;:::o;61051:73::-;61096:3;61051:73;:::o;61130:189::-;61207:32;;:::i;:::-;61248:65;61306:6;61298;61292:4;61248:65;:::i;:::-;61183:136;61130:189;;:::o;61325:186::-;61385:120;61402:3;61395:5;61392:14;61385:120;;;61456:39;61493:1;61486:5;61456:39;:::i;:::-;61429:1;61422:5;61418:13;61409:22;;61385:120;;;61325:186;;:::o;61517:541::-;61617:2;61612:3;61609:11;61606:445;;;61651:37;61682:5;61651:37;:::i;:::-;61734:29;61752:10;61734:29;:::i;:::-;61724:8;61720:44;61917:2;61905:10;61902:18;61899:49;;;61938:8;61923:23;;61899:49;61961:80;62017:22;62035:3;62017:22;:::i;:::-;62007:8;62003:37;61990:11;61961:80;:::i;:::-;61621:430;;61606:445;61517:541;;;:::o;62064:117::-;62118:8;62168:5;62162:4;62158:16;62137:37;;62064:117;;;;:::o;62187:169::-;62231:6;62264:51;62312:1;62308:6;62300:5;62297:1;62293:13;62264:51;:::i;:::-;62260:56;62345:4;62339;62335:15;62325:25;;62238:118;62187:169;;;;:::o;62361:295::-;62437:4;62583:29;62608:3;62602:4;62583:29;:::i;:::-;62575:37;;62645:3;62642:1;62638:11;62632:4;62629:21;62621:29;;62361:295;;;;:::o;62661:1390::-;62776:36;62808:3;62776:36;:::i;:::-;62877:18;62869:6;62866:30;62863:56;;;62899:18;;:::i;:::-;62863:56;62943:38;62975:4;62969:11;62943:38;:::i;:::-;63028:66;63087:6;63079;63073:4;63028:66;:::i;:::-;63121:1;63145:4;63132:17;;63177:2;63169:6;63166:14;63194:1;63189:617;;;;63850:1;63867:6;63864:77;;;63916:9;63911:3;63907:19;63901:26;63892:35;;63864:77;63967:67;64027:6;64020:5;63967:67;:::i;:::-;63961:4;63954:81;63823:222;63159:886;;63189:617;63241:4;63237:9;63229:6;63225:22;63275:36;63306:4;63275:36;:::i;:::-;63333:1;63347:208;63361:7;63358:1;63355:14;63347:208;;;63440:9;63435:3;63431:19;63425:26;63417:6;63410:42;63491:1;63483:6;63479:14;63469:24;;63538:2;63527:9;63523:18;63510:31;;63384:4;63381:1;63377:12;63372:17;;63347:208;;;63583:6;63574:7;63571:19;63568:179;;;63641:9;63636:3;63632:19;63626:26;63684:48;63726:4;63718:6;63714:17;63703:9;63684:48;:::i;:::-;63676:6;63669:64;63591:156;63568:179;63793:1;63789;63781:6;63777:14;63773:22;63767:4;63760:36;63196:610;;;63159:886;;62751:1300;;;62661:1390;;:::o;64057:150::-;64160:6;64194:5;64188:12;64178:22;;64057:150;;;:::o;64213:220::-;64348:11;64382:6;64377:3;64370:19;64422:4;64417:3;64413:14;64398:29;;64213:220;;;;:::o;64439:168::-;64542:4;64565:3;64557:11;;64595:4;64590:3;64586:14;64578:22;;64439:168;;;:::o;64613:105::-;64688:23;64705:5;64688:23;:::i;:::-;64683:3;64676:36;64613:105;;:::o;64788:791::-;64919:3;64955:4;64950:3;64946:14;65041:4;65034:5;65030:16;65024:23;65060:61;65115:4;65110:3;65106:14;65092:12;65060:61;:::i;:::-;64970:161;65216:4;65209:5;65205:16;65199:23;65235:61;65290:4;65285:3;65281:14;65267:12;65235:61;:::i;:::-;65141:165;65391:4;65384:5;65380:16;65374:23;65444:3;65438:4;65434:14;65427:4;65422:3;65418:14;65411:38;65470:71;65536:4;65522:12;65470:71;:::i;:::-;65462:79;;65316:236;65569:4;65562:11;;64924:655;64788:791;;;;:::o;65585:300::-;65726:10;65761:118;65875:3;65867:6;65761:118;:::i;:::-;65747:132;;65585:300;;;;:::o;65891:149::-;65997:4;66029;66024:3;66020:14;66012:22;;65891:149;;;:::o;66114:1199::-;66305:3;66334:90;66418:5;66334:90;:::i;:::-;66440:122;66555:6;66550:3;66440:122;:::i;:::-;66433:129;;66588:3;66633:4;66625:6;66621:17;66616:3;66612:27;66663:92;66749:5;66663:92;:::i;:::-;66778:7;66809:1;66794:474;66819:6;66816:1;66813:13;66794:474;;;66890:9;66884:4;66880:20;66875:3;66868:33;66941:6;66935:13;66969:136;67100:4;67085:13;66969:136;:::i;:::-;66961:144;;67128:96;67217:6;67128:96;:::i;:::-;67118:106;;67253:4;67248:3;67244:14;67237:21;;66854:414;66841:1;66838;66834:9;66829:14;;66794:474;;;66798:14;67284:4;67277:11;;67304:3;67297:10;;66310:1003;;;;;66114:1199;;;;:::o;67319:517::-;67534:4;67572:2;67561:9;67557:18;67549:26;;67621:9;67615:4;67611:20;67607:1;67596:9;67592:17;67585:47;67649:180;67824:4;67815:6;67649:180;:::i;:::-;67641:188;;67319:517;;;;:::o;67842:143::-;67899:5;67930:6;67924:13;67915:22;;67946:33;67973:5;67946:33;:::i;:::-;67842:143;;;;:::o;67991:141::-;68047:5;68078:6;68072:13;68063:22;;68094:32;68120:5;68094:32;:::i;:::-;67991:141;;;;:::o;68169:815::-;68262:5;68306:4;68294:9;68289:3;68285:19;68281:30;68278:117;;;68314:79;;:::i;:::-;68278:117;68413:21;68429:4;68413:21;:::i;:::-;68404:30;;68493:1;68533:60;68589:3;68580:6;68569:9;68565:22;68533:60;:::i;:::-;68526:4;68519:5;68515:16;68508:86;68444:161;68665:2;68706:59;68761:3;68752:6;68741:9;68737:22;68706:59;:::i;:::-;68699:4;68692:5;68688:16;68681:85;68615:162;68835:2;68876:89;68961:3;68952:6;68941:9;68937:22;68876:89;:::i;:::-;68869:4;68862:5;68858:16;68851:115;68787:190;68169:815;;;;:::o;68990:418::-;69093:6;69142:3;69130:9;69121:7;69117:23;69113:33;69110:120;;;69149:79;;:::i;:::-;69110:120;69269:1;69294:97;69383:7;69374:6;69363:9;69359:22;69294:97;:::i;:::-;69284:107;;69240:161;68990:418;;;;:::o;69414:180::-;69462:77;69459:1;69452:88;69559:4;69556:1;69549:15;69583:4;69580:1;69573:15;69600:180;69648:77;69645:1;69638:88;69745:4;69742:1;69735:15;69769:4;69766:1;69759:15;69786:185;69826:1;69843:20;69861:1;69843:20;:::i;:::-;69838:25;;69877:20;69895:1;69877:20;:::i;:::-;69872:25;;69916:1;69906:35;;69921:18;;:::i;:::-;69906:35;69963:1;69960;69956:9;69951:14;;69786:185;;;;:::o;69977:410::-;70017:7;70040:20;70058:1;70040:20;:::i;:::-;70035:25;;70074:20;70092:1;70074:20;:::i;:::-;70069:25;;70129:1;70126;70122:9;70151:30;70169:11;70151:30;:::i;:::-;70140:41;;70330:1;70321:7;70317:15;70314:1;70311:22;70291:1;70284:9;70264:83;70241:139;;70360:18;;:::i;:::-;70241:139;70025:362;69977:410;;;;:::o;70393:327::-;70451:6;70500:2;70488:9;70479:7;70475:23;70471:32;70468:119;;;70506:79;;:::i;:::-;70468:119;70626:1;70651:52;70695:7;70686:6;70675:9;70671:22;70651:52;:::i;:::-;70641:62;;70597:116;70393:327;;;;:::o;70726:85::-;70771:7;70800:5;70789:16;;70726:85;;;:::o;70817:156::-;70874:9;70907:60;70924:42;70933:32;70959:5;70933:32;:::i;:::-;70924:42;:::i;:::-;70907:60;:::i;:::-;70894:73;;70817:156;;;:::o;70979:145::-;71073:44;71111:5;71073:44;:::i;:::-;71068:3;71061:57;70979:145;;:::o;71130:654::-;71332:4;71370:3;71359:9;71355:19;71347:27;;71384:71;71452:1;71441:9;71437:17;71428:6;71384:71;:::i;:::-;71465:72;71533:2;71522:9;71518:18;71509:6;71465:72;:::i;:::-;71547:79;71622:2;71611:9;71607:18;71598:6;71547:79;:::i;:::-;71673:9;71667:4;71663:20;71658:2;71647:9;71643:18;71636:48;71701:76;71772:4;71763:6;71701:76;:::i;:::-;71693:84;;71130:654;;;;;;;:::o;71790:328::-;71909:4;71947:2;71936:9;71932:18;71924:26;;71960:69;72026:1;72015:9;72011:17;72002:6;71960:69;:::i;:::-;72039:72;72107:2;72096:9;72092:18;72083:6;72039:72;:::i;:::-;71790:328;;;;;:::o;72124:442::-;72273:4;72311:2;72300:9;72296:18;72288:26;;72324:71;72392:1;72381:9;72377:17;72368:6;72324:71;:::i;:::-;72405:72;72473:2;72462:9;72458:18;72449:6;72405:72;:::i;:::-;72487;72555:2;72544:9;72540:18;72531:6;72487:72;:::i;:::-;72124:442;;;;;;:::o;72572:79::-;72611:7;72640:5;72629:16;;72572:79;;;:::o;72657:157::-;72762:45;72782:24;72800:5;72782:24;:::i;:::-;72762:45;:::i;:::-;72757:3;72750:58;72657:157;;:::o;72820:96::-;72854:8;72903:5;72898:3;72894:15;72873:36;;72820:96;;;:::o;72922:94::-;72960:7;72989:21;73004:5;72989:21;:::i;:::-;72978:32;;72922:94;;;:::o;73022:153::-;73125:43;73144:23;73161:5;73144:23;:::i;:::-;73125:43;:::i;:::-;73120:3;73113:56;73022:153;;:::o;73181:392::-;73319:3;73334:75;73405:3;73396:6;73334:75;:::i;:::-;73434:2;73429:3;73425:12;73418:19;;73447:73;73516:3;73507:6;73447:73;:::i;:::-;73545:1;73540:3;73536:11;73529:18;;73564:3;73557:10;;73181:392;;;;;:::o;73579:689::-;73791:3;73806:75;73877:3;73868:6;73806:75;:::i;:::-;73906:2;73901:3;73897:12;73890:19;;73919:73;73988:3;73979:6;73919:73;:::i;:::-;74017:1;74012:3;74008:11;74001:18;;74029:75;74100:3;74091:6;74029:75;:::i;:::-;74129:2;74124:3;74120:12;74113:19;;74149:93;74238:3;74229:6;74149:93;:::i;:::-;74142:100;;74259:3;74252:10;;73579:689;;;;;;;:::o;74274:143::-;74331:5;74362:6;74356:13;74347:22;;74378:33;74405:5;74378:33;:::i;:::-;74274:143;;;;:::o;74423:351::-;74493:6;74542:2;74530:9;74521:7;74517:23;74513:32;74510:119;;;74548:79;;:::i;:::-;74510:119;74668:1;74693:64;74749:7;74740:6;74729:9;74725:22;74693:64;:::i;:::-;74683:74;;74639:128;74423:351;;;;:::o;74780:96::-;74838:6;74866:3;74856:13;;74780:96;;;;:::o;74974:552::-;75065:5;75096:45;75137:3;75130:5;75096:45;:::i;:::-;75166:5;75190:41;75221:8;75208:22;75190:41;:::i;:::-;75181:50;;75255:2;75247:6;75244:14;75241:278;;;75326:169;75411:66;75381:6;75377:2;75373:15;75370:1;75366:23;75326:169;:::i;:::-;75303:5;75282:227;75273:236;;75241:278;75071:455;;74974:552;;;;:::o;75532:149::-;75568:7;75608:66;75601:5;75597:78;75586:89;;75532:149;;;:::o;75687:548::-;75777:5;75808:45;75849:3;75842:5;75808:45;:::i;:::-;75878:5;75902:40;75932:8;75919:22;75902:40;:::i;:::-;75893:49;;75966:1;75958:6;75955:13;75952:276;;;76036:168;76120:66;76090:6;76087:1;76083:14;76080:1;76076:22;76036:168;:::i;:::-;76013:5;75992:226;75983:235;;75952:276;75783:452;;75687:548;;;;:::o;76241:191::-;76281:3;76300:20;76318:1;76300:20;:::i;:::-;76295:25;;76334:20;76352:1;76334:20;:::i;:::-;76329:25;;76377:1;76374;76370:9;76363:16;;76398:3;76395:1;76392:10;76389:36;;;76405:18;;:::i;:::-;76389:36;76241:191;;;;:::o;76438:178::-;76578:30;76574:1;76566:6;76562:14;76555:54;76438:178;:::o;76622:366::-;76764:3;76785:67;76849:2;76844:3;76785:67;:::i;:::-;76778:74;;76861:93;76950:3;76861:93;:::i;:::-;76979:2;76974:3;76970:12;76963:19;;76622:366;;;:::o;76994:419::-;77160:4;77198:2;77187:9;77183:18;77175:26;;77247:9;77241:4;77237:20;77233:1;77222:9;77218:17;77211:47;77275:131;77401:4;77275:131;:::i;:::-;77267:139;;76994:419;;;:::o;77419:96::-;77453:8;77502:5;77497:3;77493:15;77472:36;;77419:96;;;:::o;77521:94::-;77559:7;77588:21;77603:5;77588:21;:::i;:::-;77577:32;;77521:94;;;:::o;77621:153::-;77724:43;77743:23;77760:5;77743:23;:::i;:::-;77724:43;:::i;:::-;77719:3;77712:56;77621:153;;:::o;77780:79::-;77819:7;77848:5;77837:16;;77780:79;;;:::o;77865:157::-;77970:45;77990:24;78008:5;77990:24;:::i;:::-;77970:45;:::i;:::-;77965:3;77958:58;77865:157;;:::o;78028:684::-;78238:3;78253:73;78322:3;78313:6;78253:73;:::i;:::-;78351:1;78346:3;78342:11;78335:18;;78363:73;78432:3;78423:6;78363:73;:::i;:::-;78461:1;78456:3;78452:11;78445:18;;78473:75;78544:3;78535:6;78473:75;:::i;:::-;78573:2;78568:3;78564:12;78557:19;;78593:93;78682:3;78673:6;78593:93;:::i;:::-;78586:100;;78703:3;78696:10;;78028:684;;;;;;;:::o;78718:442::-;78867:4;78905:2;78894:9;78890:18;78882:26;;78918:71;78986:1;78975:9;78971:17;78962:6;78918:71;:::i;:::-;78999:72;79067:2;79056:9;79052:18;79043:6;78999:72;:::i;:::-;79081;79149:2;79138:9;79134:18;79125:6;79081:72;:::i;:::-;78718:442;;;;;;:::o

Swarm Source

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