Mumbai Testnet

Contract

0x2874bF23870dd3666929cCa2858cAB42e473D9D2

Overview

MATIC Balance

Polygon PoS Chain LogoPolygon PoS Chain LogoPolygon PoS Chain Logo0 MATIC

Multichain Info

N/A
Transaction Hash
Method
Block
From
To
Value
Confirm Pending ...384783562023-07-31 6:16:00241 days ago1690784160IN
0x2874bF23...2e473D9D2
0.82960921 MATIC0.00046621.50000001
Add Liquidity384673552023-07-30 23:16:56241 days ago1690759016IN
0x2874bF23...2e473D9D2
0.55189891 MATIC0.000590521.957072
Confirm Pending ...384672002023-07-30 23:10:51241 days ago1690758651IN
0x2874bF23...2e473D9D2
0.82960921 MATIC0.000491851.50000001
Add Liquidity384665122023-07-30 22:40:54241 days ago1690756854IN
0x2874bF23...2e473D9D2
0.55189891 MATIC0.00045261.50000001
Confirm Pending ...384664872023-07-30 22:39:31241 days ago1690756771IN
0x2874bF23...2e473D9D2
0.82960921 MATIC0.00046621.50000001
Swap384662032023-07-30 22:27:31241 days ago1690756051IN
0x2874bF23...2e473D9D2
0.59916286 MATIC0.000405531.50000001
Confirm Pending ...384659502023-07-30 22:16:31241 days ago1690755391IN
0x2874bF23...2e473D9D2
0.82960921 MATIC0.00046621.50000001
Confirm Pending ...384659372023-07-30 22:16:05241 days ago1690755365IN
0x2874bF23...2e473D9D2
0.82960921 MATIC0.000499071.50000001
Add Liquidity384657162023-07-30 22:06:32241 days ago1690754792IN
0x2874bF23...2e473D9D2
0.55189891 MATIC0.000452591.50000001
Confirm Pending ...384656822023-07-30 22:05:12241 days ago1690754712IN
0x2874bF23...2e473D9D2
0.82960921 MATIC0.000715652.18250002
Add Liquidity384648122023-07-30 21:30:27242 days ago1690752627IN
0x2874bF23...2e473D9D2
0.55189891 MATIC0.00045261.50000001
Confirm Pending ...384647622023-07-30 21:28:23242 days ago1690752503IN
0x2874bF23...2e473D9D2
0.82960921 MATIC0.000491851.50000001
Add Liquidity384639592023-07-30 20:57:10242 days ago1690750630IN
0x2874bF23...2e473D9D2
0.55189891 MATIC0.000505311.74600001
Swap384634882023-07-30 20:40:30242 days ago1690749630IN
0x2874bF23...2e473D9D2
0.59916286 MATIC0.000516471.87693777
Add Liquidity384634172023-07-30 20:37:58242 days ago1690749478IN
0x2874bF23...2e473D9D2
0.55189891 MATIC0.00045261.50000001
Confirm Pending ...384633652023-07-30 20:36:08242 days ago1690749368IN
0x2874bF23...2e473D9D2
0.82960921 MATIC0.000527581.6975
Confirm Pending ...384633462023-07-30 20:35:28242 days ago1690749328IN
0x2874bF23...2e473D9D2
0.82960921 MATIC0.00046621.50000001
Add Liquidity384592712023-07-30 18:11:08242 days ago1690740668IN
0x2874bF23...2e473D9D2
0.55189891 MATIC0.000609182.1049
Add Liquidity384551492023-07-30 15:24:27242 days ago1690730667IN
0x2874bF23...2e473D9D2
0.55189891 MATIC0.000459771.50000001
Confirm Pending ...384548272023-07-30 15:10:38242 days ago1690729838IN
0x2874bF23...2e473D9D2
0.82960921 MATIC0.00046621.50000001
Revoke Pending T...384543942023-07-30 14:50:41242 days ago1690728641IN
0x2874bF23...2e473D9D2
0.50674797 MATIC0.000368681.50000001
Confirm Pending ...384531032023-07-30 13:50:47242 days ago1690725047IN
0x2874bF23...2e473D9D2
0.82960921 MATIC0.00046621.50000001
Swap384523222023-07-30 13:14:15242 days ago1690722855IN
0x2874bF23...2e473D9D2
0.59916286 MATIC0.000412731.50000001
Confirm Pending ...384515892023-07-30 12:41:50242 days ago1690720910IN
0x2874bF23...2e473D9D2
0.82960921 MATIC0.00062162.00000001
Swap384509162023-07-30 12:17:01242 days ago1690719421IN
0x2874bF23...2e473D9D2
0.59916286 MATIC0.000412751.50000001
View all transactions

Latest 25 internal transactions (View All)

Parent Txn Hash Block From To Value
384783562023-07-31 6:16:00241 days ago1690784160
0x2874bF23...2e473D9D2
0.82960921 MATIC
384673552023-07-30 23:16:56241 days ago1690759016
0x2874bF23...2e473D9D2
0.55189891 MATIC
384672002023-07-30 23:10:51241 days ago1690758651
0x2874bF23...2e473D9D2
0.82960921 MATIC
384665122023-07-30 22:40:54241 days ago1690756854
0x2874bF23...2e473D9D2
0.55189891 MATIC
384664872023-07-30 22:39:31241 days ago1690756771
0x2874bF23...2e473D9D2
0.82960921 MATIC
384662032023-07-30 22:27:31241 days ago1690756051
0x2874bF23...2e473D9D2
0.59916286 MATIC
384659502023-07-30 22:16:31241 days ago1690755391
0x2874bF23...2e473D9D2
0.82960921 MATIC
384659372023-07-30 22:16:05241 days ago1690755365
0x2874bF23...2e473D9D2
0.82960921 MATIC
384657162023-07-30 22:06:32241 days ago1690754792
0x2874bF23...2e473D9D2
0.55189891 MATIC
384656822023-07-30 22:05:12241 days ago1690754712
0x2874bF23...2e473D9D2
0.82960921 MATIC
384648122023-07-30 21:30:27242 days ago1690752627
0x2874bF23...2e473D9D2
0.55189891 MATIC
384647622023-07-30 21:28:23242 days ago1690752503
0x2874bF23...2e473D9D2
0.82960921 MATIC
384639592023-07-30 20:57:10242 days ago1690750630
0x2874bF23...2e473D9D2
0.55189891 MATIC
384634882023-07-30 20:40:30242 days ago1690749630
0x2874bF23...2e473D9D2
0.59916286 MATIC
384634172023-07-30 20:37:58242 days ago1690749478
0x2874bF23...2e473D9D2
0.55189891 MATIC
384633652023-07-30 20:36:08242 days ago1690749368
0x2874bF23...2e473D9D2
0.82960921 MATIC
384633462023-07-30 20:35:28242 days ago1690749328
0x2874bF23...2e473D9D2
0.82960921 MATIC
384592712023-07-30 18:11:08242 days ago1690740668
0x2874bF23...2e473D9D2
0.55189891 MATIC
384551492023-07-30 15:24:27242 days ago1690730667
0x2874bF23...2e473D9D2
0.55189891 MATIC
384548272023-07-30 15:10:38242 days ago1690729838
0x2874bF23...2e473D9D2
0.82960921 MATIC
384543942023-07-30 14:50:41242 days ago1690728641
0x2874bF23...2e473D9D2
0.50674797 MATIC
384531032023-07-30 13:50:47242 days ago1690725047
0x2874bF23...2e473D9D2
0.82960921 MATIC
384523222023-07-30 13:14:15242 days ago1690722855
0x2874bF23...2e473D9D2
0.59916286 MATIC
384515892023-07-30 12:41:50242 days ago1690720910
0x2874bF23...2e473D9D2
0.82960921 MATIC
384509162023-07-30 12:17:01242 days ago1690719421
0x2874bF23...2e473D9D2
0.59916286 MATIC
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Altitude

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at mumbai.polygonscan.com on 2023-05-22
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.18;
pragma abicoder v2;

/******************************************/
/*      ReentrancyGuard starts here       */
/******************************************/

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;

    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
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

/******************************************/
/*           IERC20 starts here           */
/******************************************/

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

/******************************************/
/*        IERC20Permit starts here        */
/******************************************/

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

/******************************************/
/*           Address starts here          */
/******************************************/

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

/******************************************/
/*          SafeERC20 starts here         */
/******************************************/

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 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 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
    }

    /**
     * @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).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

/******************************************/
/*           Context starts here          */
/******************************************/

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

/*
 * @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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

/******************************************/
/*           Ownable starts here          */
/******************************************/

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

abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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

/***************************************************/
/*   ILayerZeroUserApplicationConfig starts here   */
/***************************************************/

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

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

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

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

/******************************************/
/*     ILayerZeroEndpoint starts here     */
/******************************************/

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/******************************************/
/*     ILayerZeroReceiver starts here     */
/******************************************/

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

/******************************************/
/*        IAltitudeFee starts here        */
/******************************************/

interface IAltitudeFee {
    // @notice query the rebalance fee based on local liquidity.
    // @param idealBalance - the balance where local and remote liquidity pools are at equilibrium.
    // @param preBalance - balance of local liquidity pool before removal of liquidity.
    // @param amount - liquidity to be withdrawn from local liquidity pool.
    function getRebalanceFee(uint256 idealBalance, uint256 preBalance, uint256 amount) external view returns (uint256);

    // @notice query the parameters used to calculate the rebalance fee.
    function getFeeParameters() external view returns (uint256, uint256, uint256, uint256, uint256);
}

/******************************************/
/*          ILpToken starts here          */
/******************************************/

interface ILpToken {
    // @notice mint new LP tokens.
    // @param _to - address to mint new LP tokens to.
    // @param _amount - amount of LP tokens to mint.
    function mint(address _to, uint256 _amount) external;

    // @notice burn existing LP tokens.
    // @param _from - address to burn existing LP tokens from.
    // @param _amount - amount of LP tokens to burn.
    function burn(address _from, uint256 _amount) external;
}

/******************************************/
/*          IFactory starts here          */
/******************************************/

interface IFactory {
    // @notice deploy a LP token contract for a new chain path.
    // @param _name - name of the LP token.
    // @param _symbol - symbol of the LP token.
    function newLpToken(string memory _name, string memory _symbol) external returns (address);
}

/******************************************/
/*          ALTITUDE starts here          */
/******************************************/

contract Altitude is Ownable, ILayerZeroReceiver, ILayerZeroUserApplicationConfig, ReentrancyGuard {
    using SafeERC20 for IERC20;

    // CONSTANTS  
    bytes4 private constant SELECTOR = bytes4(keccak256(bytes("transfer(address,uint256)")));
    uint8 internal constant TYPE_SWAP = 1;
    uint8 internal constant TYPE_SWAP_CONFIRM = 2;
    uint8 internal constant TYPE_SWAP_REVOKE = 3;
    uint8 internal constant TYPE_ADD_LIQUIDITY = 4;
    uint8 internal constant TYPE_REMOVE_LIQUIDITY_LOCAL = 5;
    uint8 internal constant TYPE_REMOVE_LIQUIDITY_REMOTE = 6;
    uint8 internal constant TYPE_REMOVE_LIQUIDITY_REMOTE_CONFIRM = 7;
    uint8 internal constant TYPE_REMOVE_LIQUIDITY_REMOTE_REVOKE = 8;


    // STRUCTS
    struct ChainPath {
        bool ready;
        address srcToken;
        uint16 dstChainId;
        address dstToken;
        uint256 remoteLiquidity;
        uint256 localLiquidity;
        uint256 rewardPoolSize;
        address lpToken;
        bool stopSwap;
    }

    struct PendingTx {
        uint8 txType;
        //ChainPath cp;
        uint16 dstChainId;
        address dstToken;
        uint256 amount;
        bytes from;
    }

    ILayerZeroEndpoint public layerZeroEndpoint;
    IAltitudeFee public altitudeFee;
    IFactory public altitudeFactory;
    ChainPath[] public chainPaths;
    address public feeTo;
    mapping(uint16 => mapping(address => uint256)) public chainPathIndexLookup; // lookup for chainPath by chainId => token => index
    mapping(uint16 => mapping(uint8 => uint256)) public gasLookup;              // lookup for gas fee by chainId => function => gas
    mapping(uint16 => bytes) public trustedRemoteLookup;
    mapping(address => PendingTx[]) public pendingTransactions;

    // EVENTS
    event Swap(uint16 _dstChainId, address _dstToken, uint256 _amount, bytes _to);
    event Remote_Swap(uint16 _srcChainId, address _srcToken, uint256 _amount, address _to);
    event Swap_Confirm(uint16 _dstChainId, address _dstToken, uint256 _amount, address _to, uint256 _rebalanceReward, uint256 _rebalanceFee, uint256 _protocolFee);
    event Swap_Revoke(uint16 _dstChainId, address _dstToken, uint256 _amount, address _to);
    event Callback_Swap_Confirm(uint16 _srcChainId, address _srcToken, uint256 _amount, address _to, uint256 _rebalanceFee, uint256 _protocolFee);
    event Callback_Swap_Revoke(uint16 _srcChainId, address _srcToken, uint256 _amount, address _to);
    event AddLiquidity(uint16 _dstChainId, address _dstToken, uint256 _amount);
    event Remote_AddLiquidity(uint16 _srcChainId, address _srcToken, uint256 _amount);
    event RemoveLiquidityLocal(uint16 _dstChainId, address _dstToken, uint256 _amount);
    event Remote_RemoveLiquidityLocal(uint16 _srcChainId, address _srcToken, uint256 _amount);
    event RemoveLiquidityRemote(uint16 _dstChainId, address _dstToken, uint256 _amount, address _to);
    event Remote_RemoveLiquidityRemote(uint16 _srcChainId, address _srcToken, uint256 _amount, address _to);
    event RemoveLiquidityRemote_Confirm(uint16 _dstChainId, address _dstToken, uint256 _amount, address _to);
    event RemoveLiquidityRemote_Revoke(uint16 _dstChainId, address _dstToken, uint256 _amount, address _to);
    event Callback_RemoveLiquidityRemote_Confirm(uint16 _srcChainId, address _srcToken, uint256 _amount, address _to);
    event Callback_RemoveLiquidityRemote_Revoke(uint16 _srcChainId, address _srcToken, uint256 _amount, address _to);

    constructor(address _endpoint, address _altitudeFee, address _altitudeFactory) {
        layerZeroEndpoint = ILayerZeroEndpoint(_endpoint);
        altitudeFee = IAltitudeFee(_altitudeFee);
        altitudeFactory = IFactory(_altitudeFactory);
    }

/******************************************/
/*           ADMIN starts here            */
/******************************************/

    /**
     * @dev Add a new chain and token pair for swapping.
     * @param _srcToken Token on the local chain.
     * @param _dstChainId Destination chain ID.
     * @param _dstToken Token on the destination chain.
     * @param _name Name of the associated LP token.
     * @param _symbol Symbol of the associated LP token.
     */
    function addChainPath(address _srcToken, uint16 _dstChainId, address _dstToken, string memory _name, string memory _symbol) external onlyOwner {
        for (uint256 i = 0; i < chainPaths.length; ++i) {
            ChainPath memory cp = chainPaths[i];
            bool exists = cp.dstChainId == _dstChainId && cp.dstToken == _dstToken;
            require(!exists, "Altitude: cant createChainPath of existing _dstChainId and _dstToken");
        }
        chainPathIndexLookup[_dstChainId][_dstToken] = chainPaths.length;
        address lpToken = altitudeFactory.newLpToken(_name, _symbol);
        chainPaths.push(ChainPath(false, _srcToken, _dstChainId, _dstToken, 0, 0, 0, lpToken, false));
    }

    /**
     * @dev Enable swapping for a chain and token pair.
     * @param _dstChainId Destination chain ID.
     * @param _dstToken Token on the destination chain.
     */
    function activateChainPath(uint16 _dstChainId, address _dstToken) external onlyOwner {
        ChainPath storage cp = getAndCheckCP(_dstChainId, _dstToken);
        require(cp.ready == false, "Altitude: chainPath is already active");
        // this func will only be called once
        cp.ready = true;
    }

    /**
     * @dev Set the Alititude contract for a destination chain.
     * @param _dstChainId Destination chain ID.
     * @param _dstAltitudeAddress Address of the Altitude contract at the destination chain.
     */
    function setTrustedRemoteLookup(uint16 _dstChainId, bytes calldata _dstAltitudeAddress) external onlyOwner {
        trustedRemoteLookup[_dstChainId] = abi.encodePacked(_dstAltitudeAddress, address(this));
    }

    /**
     * @dev Set the gas limit for a function type at a destination chain.
     * @param _dstChainId Destination chain ID.
     * @param _functionType Target function (SWAP, ADD, REMOVE, REDEEM).
     * @param _gasAmount Gas limit used by the target function.
     */
    function setGasAmount(uint16 _dstChainId, uint8 _functionType, uint256 _gasAmount) external onlyOwner {
        require(_functionType >= 1 && _functionType <= 8, "Altitude: invalid _functionType");
        gasLookup[_dstChainId][_functionType] = _gasAmount;
    }

    /**
     * @dev Deposit into chain path's reward pool.
     * @param _dstChainId Destination chain ID.
     * @param _dstToken Token on the destination chain.
     * @param _amount Amount of reward tokens to deposit.
     */
    function depositRewardPool(uint16 _dstChainId, address _dstToken, uint256 _amount) external onlyOwner {
        ChainPath storage cp = getAndCheckCP(_dstChainId, _dstToken);
        IERC20(cp.srcToken).transferFrom(msg.sender, address(this), _amount);
        cp.rewardPoolSize += _amount;
    }

    /**
     * @dev Withdraw from chain path's reward pool.
     * @param _dstChainId Destination chain ID.
     * @param _dstToken Token on the destination chain.
     * @param _amount Amount of reward tokens to withdraw.
     */
    function withdrawRewardPool(uint16 _dstChainId, address _dstToken, uint256 _amount, address _to) external onlyOwner {
        ChainPath storage cp = getAndCheckCP(_dstChainId, _dstToken);  
        require(cp.rewardPoolSize >= _amount, "Altitude: not enough funds in reward pool.");
        IERC20(cp.srcToken).transferFrom(address(this), _to, _amount);
        cp.rewardPoolSize -= _amount;
    }

    /**
     * @dev Set the protocol fee receiving address.
     */
    function setFeeTo(address _feeTo) external onlyOwner {
        require(_feeTo != address(0), "Altitude: recipient can't be zero address.");
        feeTo = _feeTo;
    }

    /**
     * @dev Set the address of the fee calculation contract.
     */
    function setFeeContract(address _newFeeContract) external onlyOwner {
        altitudeFee = IAltitudeFee(_newFeeContract);
    }

    /**
     * @dev Disable swaps for a specific chain path.
     */
    function emergencyStopSwap(uint16 _dstChainId, address _dstToken, bool _enable) external onlyOwner {
        ChainPath storage cp = getAndCheckCP(_dstChainId, _dstToken);
        cp.stopSwap = _enable;
    }

/******************************************/
/*           LOCAL starts here            */
/******************************************/

    /**
     * @dev Swap local tokens for tokens on another chain.
     * @param _dstChainId ID of destination chain.
     * @param _dstToken Address of token on the destination chain (in).
     * @param _amount Amount of tokens to swap.
     * @param _addressOnDst Address of recipient on the destination chain.
     */
    function swap(uint16 _dstChainId, address _dstToken, uint256 _amount, uint256 _nativeForDst, bytes memory _addressOnDst) external nonReentrant payable {
        // (1) LOCAL:                                                              (Tokens IN)                     
        // (2) REMOTE CONFIRM:      remoteLiquidity ++      localLiquidity --      (Tokens OUT)     
        //     LOCAL CONFIRM:       remoteLiquidity --      localLiquidity ++
        //     REMOTE REVOKE:           
        //     LOCAL REVOKE:                                                       (Tokens OUT)  
        address dstNativeAddr;
        {
            bytes memory dstNativeAddrBytes = _addressOnDst;
            assembly {
                dstNativeAddr := mload(add(dstNativeAddrBytes, 20))
            }
        }
        ChainPath storage cp = getAndCheckCP(_dstChainId, _dstToken);
        require(dstNativeAddr != address(0x0), "Altitude: swap to zero address.");
        require(cp.remoteLiquidity >= _amount, "Altitude: not enough liquidity");
        require(cp.stopSwap == false, "Altitude: swaps disabled.");
        // Deposit tokens without increasing local liquidity to prevent loss of funds in unconfirmed swap.
        IERC20(cp.srcToken).safeTransferFrom(msg.sender, address(this), _amount);

        bytes memory payload = abi.encode(TYPE_SWAP, abi.encodePacked(cp.srcToken), _amount, _addressOnDst, abi.encodePacked(msg.sender));
        executeLayerZero(TYPE_SWAP, cp, payload, _nativeForDst , _addressOnDst);

        emit Swap(_dstChainId, _dstToken, _amount, _addressOnDst);
    }

    /**
     * @dev Add liquidity for swaps.
     * @param _dstChainId ID of destination chain.
     * @param _dstToken Address of token on the destination chain.
     * @param _amount Amount of tokens to add as liquidity.
     */
    function addLiquidity(uint16 _dstChainId, address _dstToken, uint256 _amount) external nonReentrant payable {
        //     LOCAL:               localLiquidity ++      (Tokens IN / LP Tokens OUT)               
        //     REMOTE:              remoteLiquidity ++        
        ChainPath storage cp = getAndCheckCP(_dstChainId, _dstToken);
        require(cp.ready == true, "Altitude: chainPath is not active");

        IERC20(cp.srcToken).safeTransferFrom(msg.sender, address(this), _amount);
        ILpToken(cp.lpToken).mint(msg.sender, _amount);
        cp.localLiquidity += _amount;

        bytes memory payload = abi.encode(TYPE_ADD_LIQUIDITY, abi.encodePacked(cp.srcToken), _amount);
        executeLayerZero(TYPE_ADD_LIQUIDITY, cp, payload, 0 , "");

        emit AddLiquidity(_dstChainId, _dstToken, _amount);
    }

    /**
     * @dev Remove local liquidity for swaps.
     * @param _dstChainId ID of destination chain.
     * @param _dstToken Address of token on the destination chain.
     * @param _amount Amount of tokens to remove from liquidity.
     */
    function removeLiquidityLocal(uint16 _dstChainId, address _dstToken, uint256 _amount) external nonReentrant payable {
        //     LOCAL:               localLiquidity --      (Tokens OUT / LP Tokens BURN)               
        //     REMOTE:              remoteLiquidity --  
        ChainPath storage cp = getAndCheckCP(_dstChainId, _dstToken);
        require(cp.localLiquidity >= _amount, "Altitude: not enough liquidity");

        ILpToken(cp.lpToken).burn(msg.sender, _amount);
        cp.localLiquidity -= _amount;
        IERC20(cp.srcToken).safeTransfer(msg.sender, _amount);

        bytes memory payload = abi.encode(TYPE_REMOVE_LIQUIDITY_LOCAL, abi.encodePacked(cp.srcToken), _amount);
        executeLayerZero(TYPE_REMOVE_LIQUIDITY_LOCAL, cp, payload, 0 , "");

        emit RemoveLiquidityLocal(_dstChainId, _dstToken, _amount);
    }

    /**
     * @dev Remove remote liquidity for swaps.
     * @param _dstChainId ID of destination chain.
     * @param _dstToken Address of token on the destination chain (in).
     * @param _amount Amount of tokens to remove from liquidity.
     */
    function removeLiquidityRemote(uint16 _dstChainId, address _dstToken, uint256 _amount, uint256 _nativeForDst, bytes memory _addressOnDst) external nonReentrant payable {
        // (1) LOCAL:                                                              (LP Tokens IN)                     
        // (2) REMOTE CONFIRM:                              localLiquidity --      (Tokens OUT)     
        //     LOCAL CONFIRM:       remoteLiquidity --      
        //     REMOTE REVOKE:                                                      (LP Tokens OUT)
        //     LOCAL REVOKE:                                                       (LP Tokens BURN) 
        address dstNativeAddr;
        {
            bytes memory dstNativeAddrBytes = _addressOnDst;
            assembly {
                dstNativeAddr := mload(add(dstNativeAddrBytes, 20))
            }
        }
        ChainPath storage cp = getAndCheckCP(_dstChainId, _dstToken);
        require(dstNativeAddr != address(0x0), "Altitude: withdrawal to zero address.");
        require(cp.localLiquidity < _amount, "Altitude: sufficient local liquidity");
        require(cp.remoteLiquidity >= _amount, "Altitude: not enough liquidity");
        require(IERC20(cp.lpToken).balanceOf(msg.sender) >= _amount, "Altitude: not enough LP tokens");
        // Burn LP Tokens only after confirmation to prevent loss of funds in unconfirmed withdrawal.
        IERC20(cp.lpToken).safeTransferFrom(msg.sender, address(this), _amount);
        
        bytes memory payload = abi.encode(TYPE_REMOVE_LIQUIDITY_REMOTE, abi.encodePacked(cp.srcToken), _amount, _addressOnDst, abi.encodePacked(msg.sender));
        executeLayerZero(TYPE_REMOVE_LIQUIDITY_REMOTE, cp, payload, _nativeForDst, _addressOnDst);
        
        emit RemoveLiquidityRemote(_dstChainId, _dstToken, _amount, msg.sender);
    }

    /**
     * @dev Confirm swap or withdrawal.
     * @param _Id Id of pending swap or withdrawal.
     */
    function confirmPendingTransaction(uint256 _Id) external nonReentrant payable {
        PendingTx storage pt = pendingTransactions[msg.sender][_Id];
        ChainPath storage cp = getAndCheckCP(pt.dstChainId, pt.dstToken);

        // SWAP REMOTE CONFIRM
        if (pt.txType == TYPE_SWAP) {
            require(cp.localLiquidity >= pt.amount, "Altitude: not enough liquidity");
            // rebalance fee applies when swap moves local liquidity away from liquidity equilibrium. Deposit into local reward pool.
            (uint256 rebalanceFee, uint256 protocolFee) = getFees(cp.dstChainId, cp.dstToken, pt.amount);
            uint256 swapAmount = pt.amount - (rebalanceFee + protocolFee);
            // rebalance reward applies when swap moves local liquidity to liquidity equilibrium. Disburse from local reward pool.
            uint256 rebalanceReward = getRebalanceReward(cp.dstChainId, cp.dstToken, pt.amount);
            cp.rewardPoolSize -= rebalanceReward;
            cp.localLiquidity -= swapAmount;
            cp.remoteLiquidity += swapAmount;
            IERC20(cp.srcToken).safeTransfer(msg.sender, swapAmount + rebalanceReward);
            bytes memory payload = abi.encode(TYPE_SWAP_CONFIRM, abi.encodePacked(cp.srcToken), pt.amount, rebalanceFee, protocolFee, abi.encodePacked(msg.sender));
            executeLayerZero(TYPE_SWAP_CONFIRM, cp, payload, 0 , "");

            emit Swap_Confirm(cp.dstChainId, cp.dstToken, swapAmount, msg.sender, rebalanceReward, rebalanceFee, protocolFee);
        // REMOVE LIQUIDITY REMOTE CONFIRM
        } else if (pt.txType == TYPE_REMOVE_LIQUIDITY_REMOTE) {
            require(cp.localLiquidity >= pt.amount, "Altitude: not enough liquidity");
            cp.localLiquidity -= pt.amount;
            IERC20(cp.srcToken).safeTransfer(msg.sender, pt.amount);
            bytes memory payload = abi.encode(TYPE_REMOVE_LIQUIDITY_REMOTE_CONFIRM, abi.encodePacked(cp.srcToken), pt.amount, abi.encodePacked(msg.sender));
            executeLayerZero(TYPE_REMOVE_LIQUIDITY_REMOTE_CONFIRM, cp, payload, 0 , "");

            emit RemoveLiquidityRemote_Confirm(cp.dstChainId, cp.dstToken, pt.amount, msg.sender);
        }
        uint256 arrayLength = pendingTransactions[msg.sender].length;
        pendingTransactions[msg.sender][_Id] = pendingTransactions[msg.sender][arrayLength -1];
        pendingTransactions[msg.sender].pop();
    }

    /**
     * @dev Revoke swap or withdrawal.
     * @param _Id Id of pending swap or withdrawal.
     */
    function revokePendingTransaction(uint256 _Id) external nonReentrant payable {
        PendingTx storage pt = pendingTransactions[msg.sender][_Id];
        ChainPath storage cp = getAndCheckCP(pt.dstChainId, pt.dstToken);

        // SWAP REMOTE REVOKE
        if (pt.txType == TYPE_SWAP) {
            bytes memory payload = abi.encode(TYPE_SWAP_REVOKE, abi.encodePacked(cp.srcToken), pt.amount, pt.from);
            executeLayerZero(TYPE_SWAP_REVOKE, cp, payload, 0 , "");

            emit Swap_Revoke(cp.dstChainId, cp.dstToken, pt.amount, msg.sender);
        // REMOVE LIQUIDITY REMOTE REVOKE
        } else if (pt.txType == TYPE_REMOVE_LIQUIDITY_REMOTE) {
            bytes memory payload = abi.encode(TYPE_REMOVE_LIQUIDITY_REMOTE_REVOKE, abi.encodePacked(cp.srcToken), pt.amount, pt.from);
            executeLayerZero(TYPE_REMOVE_LIQUIDITY_REMOTE_REVOKE, cp, payload, 0, "");

            emit RemoveLiquidityRemote_Revoke(cp.dstChainId, cp.dstToken, pt.amount, msg.sender);
        }
        uint256 arrayLength = pendingTransactions[msg.sender].length;
        pendingTransactions[msg.sender][_Id] = pendingTransactions[msg.sender][arrayLength -1];
        pendingTransactions[msg.sender].pop();
    }

    /**
     * @dev Route messages containing a target to LayerZero.
     */
    function executeLayerZero(uint8 functionType, ChainPath storage cp, bytes memory payload, uint256 nativeForDst, bytes memory addressOnDst) internal {
        bytes memory adapterParams = getAndCheckGasFee(functionType, cp.dstChainId, payload, nativeForDst, addressOnDst);
        layerZeroEndpoint.send{value: msg.value}(cp.dstChainId, trustedRemoteLookup[cp.dstChainId], payload, payable(msg.sender), address(this), adapterParams);
    }

/******************************************/
/*           REMOTE starts here           */
/******************************************/

    function lzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 /*_nonce*/, bytes memory _payload) external override {
        require(msg.sender == address(layerZeroEndpoint));
        require(
            _srcAddress.length == trustedRemoteLookup[_srcChainId].length && keccak256(_srcAddress) == keccak256(trustedRemoteLookup[_srcChainId]),
            "Altitude: Invalid source sender address. owner should call setTrustedSource() to enable source contract"
        );
        
        uint8 functionType;
        assembly {
            functionType := mload(add(_payload, 32))
        }

        // SWAP (DESTINATION)   
        if (functionType == TYPE_SWAP) {
            (, bytes memory token, uint256 amount, bytes memory to, bytes memory from) = abi.decode(_payload, (uint8, bytes, uint256, bytes, bytes));
            address toAddress;
            address srcTokenAddress;
            assembly {
                toAddress := mload(add(to, 20))
                srcTokenAddress := mload(add(token, 20))
            }
            pendingTransactions[toAddress].push(PendingTx(TYPE_SWAP, _srcChainId, srcTokenAddress, amount, from));

            emit Remote_Swap(_srcChainId, srcTokenAddress, amount, toAddress);

        // SWAP CONFIRM (CALLBACK)
        } else if (functionType == TYPE_SWAP_CONFIRM) {
            (, bytes memory token, uint256 amount, uint256 rebalanceFee, uint256 protocolFee, bytes memory to) = abi.decode(_payload, (uint8, bytes, uint256, uint256, uint256, bytes));
            address toAddress;
            address srcTokenAddress;
            assembly {
                toAddress := mload(add(to, 20))
                srcTokenAddress := mload(add(token, 20))
            }
            ChainPath storage cp = getAndCheckCP(_srcChainId, srcTokenAddress);
            uint256 swapAmount = amount - (rebalanceFee + protocolFee);
            cp.localLiquidity += swapAmount;
            cp.remoteLiquidity -= swapAmount;
            cp.rewardPoolSize += rebalanceFee;
            IERC20(cp.srcToken).safeTransfer(feeTo, protocolFee);

            emit Callback_Swap_Confirm(_srcChainId, srcTokenAddress, swapAmount, toAddress, rebalanceFee, protocolFee);
        
        // SWAP REVOKE (CALLBACK)  
        } else if (functionType == TYPE_SWAP_REVOKE) {
            (, bytes memory token, uint256 amount, bytes memory to) = abi.decode(_payload, (uint8, bytes, uint256, bytes));
            address toAddress;
            address srcTokenAddress;
            assembly {
                toAddress := mload(add(to, 20))
                srcTokenAddress := mload(add(token, 20))
            }
            ChainPath storage cp = getAndCheckCP(_srcChainId, srcTokenAddress);
            IERC20(cp.srcToken).safeTransfer(toAddress, amount);

            emit Callback_Swap_Revoke(_srcChainId, srcTokenAddress, amount, toAddress);

        // ADD LIQUIDITY (DESTINATION)      
        } else if (functionType == TYPE_ADD_LIQUIDITY) {
            (, bytes memory token, uint256 amount) = abi.decode(_payload, (uint8, bytes, uint256));
            address srcTokenAddress;
            assembly {
                srcTokenAddress := mload(add(token, 20))
            }
            ChainPath storage cp = getAndCheckCP(_srcChainId, srcTokenAddress);
            cp.remoteLiquidity += amount;

            emit Remote_AddLiquidity(_srcChainId, srcTokenAddress, amount);

        // REMOVE LIQUIDITY LOCAL (DESTINATION)     
        } else if (functionType == TYPE_REMOVE_LIQUIDITY_LOCAL) {
            (, bytes memory token, uint256 amount) = abi.decode(_payload, (uint8, bytes, uint256));
            address srcTokenAddress;
            assembly {
                srcTokenAddress := mload(add(token, 20))
            }
            ChainPath storage cp = getAndCheckCP(_srcChainId, srcTokenAddress);
            cp.remoteLiquidity -= amount;

            emit Remote_RemoveLiquidityLocal(_srcChainId, srcTokenAddress, amount);

        // REMOVE LIQUIDITY REMOTE (DESTINATION) 
        } else if (functionType == TYPE_REMOVE_LIQUIDITY_REMOTE) {
            (, bytes memory token, uint256 amount, bytes memory to, bytes memory from) = abi.decode(_payload, (uint8, bytes, uint256, bytes, bytes));
            address toAddress;
            address srcTokenAddress;
            assembly {
                toAddress := mload(add(to, 20))
                srcTokenAddress := mload(add(token, 20))
            }
            pendingTransactions[toAddress].push(PendingTx(TYPE_REMOVE_LIQUIDITY_REMOTE, _srcChainId, srcTokenAddress, amount, from));

            emit Remote_RemoveLiquidityRemote(_srcChainId, srcTokenAddress, amount, toAddress);

        // REMOVE LIQUIDITY REMOTE CONFIRM (CALLBACK)
        } else if (functionType == TYPE_SWAP_CONFIRM) {
            (, bytes memory token, uint256 amount, bytes memory to) = abi.decode(_payload, (uint8, bytes, uint256, bytes));
            address toAddress;
            address srcTokenAddress;
            assembly {
                toAddress := mload(add(to, 20))
                srcTokenAddress := mload(add(token, 20))
            }
            ChainPath storage cp = getAndCheckCP(_srcChainId, srcTokenAddress);
            cp.remoteLiquidity -= amount;
            ILpToken(cp.lpToken).burn(address(this), amount);

            emit Callback_RemoveLiquidityRemote_Confirm(_srcChainId, srcTokenAddress, amount, toAddress);
        
        // REMOVE LIQUIDITY REMOTE REVOKE (CALLBACK)      
        } else if (functionType == TYPE_SWAP_REVOKE) {
            (, bytes memory token, uint256 amount, bytes memory to) = abi.decode(_payload, (uint8, bytes, uint256, bytes));
            address toAddress;
            address srcTokenAddress;
            assembly {
                toAddress := mload(add(to, 20))
                srcTokenAddress := mload(add(token, 20))
            }
            ChainPath storage cp = getAndCheckCP(_srcChainId, srcTokenAddress);
            IERC20(cp.lpToken).transfer(toAddress, amount);

            emit Callback_RemoveLiquidityRemote_Revoke(_srcChainId, srcTokenAddress, amount, toAddress);
        }

    }

/******************************************/
/*             FEE starts here            */
/******************************************/

    function getFees(uint16 _dstChainId, address _dstToken, uint256 _amount) public view returns (uint256 rebalanceFee, uint256 protocolFee) {
        ChainPath memory cp = getAndCheckCP(_dstChainId, _dstToken);
        uint256 idealBalance = (cp.localLiquidity + cp.remoteLiquidity) / 2;
        rebalanceFee = altitudeFee.getRebalanceFee(idealBalance, cp.localLiquidity, _amount);
        (uint256 P,,,,) = altitudeFee.getFeeParameters();
        protocolFee = _amount * P / 1e18;
    }

    function getRebalanceReward(uint16 _dstChainId, address _dstToken, uint256 _amount) public view returns (uint256 rebalanceReward) {
        ChainPath memory cp = getAndCheckCP(_dstChainId, _dstToken);
        uint256 idealBalance = (cp.localLiquidity + cp.remoteLiquidity) / 2;
        if (cp.remoteLiquidity < idealBalance) {
            uint256 remoteLiquidityDeficit = idealBalance - cp.remoteLiquidity;
            rebalanceReward = cp.rewardPoolSize * _amount / remoteLiquidityDeficit;
            if (rebalanceReward > cp.rewardPoolSize) {
                rebalanceReward = cp.rewardPoolSize;
            }
        } 
    }

/******************************************/
/*            VIEW starts here            */
/******************************************/

    function getAndCheckCP(uint16 _dstChainId, address _dstToken) internal view returns (ChainPath storage) {
        require(chainPaths.length > 0, "Altitude: no chainpaths exist");
        ChainPath storage cp = chainPaths[chainPathIndexLookup[_dstChainId][_dstToken]];
        require(cp.dstChainId == _dstChainId && cp.dstToken == _dstToken, "Altitude: local chainPath does not exist");
        return cp;
    }

    function getChainPath(uint16 _dstChainId, address _dstToken) external view returns (ChainPath memory) {
        ChainPath memory cp = chainPaths[chainPathIndexLookup[_dstChainId][_dstToken]];
        require(cp.dstChainId == _dstChainId && cp.dstToken == _dstToken, "Altitude: local chainPath does not exist");
        return cp;
    }

    function getAndCheckGasFee(uint8 _type, uint16 _dstChainId, bytes memory _payload, uint256 _nativeForDst, bytes memory _addressOnDst) internal view returns (bytes memory adapterParams) {
        adapterParams = txParamBuilder(_type, _dstChainId, _nativeForDst, _addressOnDst);
        // get the fees we need to pay to LayerZero for message delivery
        (uint256 nativeFee, ) = layerZeroEndpoint.estimateFees(_dstChainId, address(this), _payload, false, adapterParams);
        require(msg.value >= nativeFee, "Altitude: insufficient msg.value to pay to LayerZero for message delivery.");
    }

    function quoteLayerZeroFee(uint8 _type, uint16 _dstChainId, address _dstToken, bytes memory _from, uint256 _nativeForDst, bytes memory _addressOnDst) external view returns (uint256) {
        ChainPath memory cp = getAndCheckCP(_dstChainId, _dstToken);
        bytes memory payload;
        if(_type == 1 || _type == 6) {
        payload = abi.encode(TYPE_SWAP, abi.encodePacked(cp.srcToken), 0, _addressOnDst, _from);
        } else if (_type == 2) {
        payload = abi.encode(TYPE_SWAP_CONFIRM, abi.encodePacked(cp.srcToken), 0, 0, 0, _addressOnDst);
        } else if (_type == 3 || _type == 7 || _type == 8) {
        payload = abi.encode(TYPE_SWAP_CONFIRM, abi.encodePacked(cp.srcToken), 0, _addressOnDst);
        } else if (_type == 4 || _type == 5) {
        payload = abi.encode(TYPE_ADD_LIQUIDITY, abi.encodePacked(cp.srcToken), 0);
        }
        bytes memory adapterParams = txParamBuilder(_type, _dstChainId, _nativeForDst, _addressOnDst);
        // get the fees we need to pay to LayerZero for message delivery
        (uint256 nativeFee, ) = layerZeroEndpoint.estimateFees(_dstChainId, address(this), payload, false, adapterParams);
        return (nativeFee);
    }

    function txParamBuilder(uint8 _type, uint16 _dstChainId, uint256 _nativeForDst, bytes memory _addressOnDst) internal view returns (bytes memory) {
        bytes memory adapterParams;
        uint256 gasForDestinationLzReceive = gasLookup[_dstChainId][_type];
        if (_nativeForDst > 0) {
            adapterParams = txParamBuilderType2(gasForDestinationLzReceive, _nativeForDst, _addressOnDst);
        } else {
            adapterParams = txParamBuilderType1(gasForDestinationLzReceive);
        }
        return adapterParams;
    }

    function txParamBuilderType1(uint256 _gasAmount) internal pure returns (bytes memory) {
        uint16 txType = 1;
        return abi.encodePacked(txType, _gasAmount);
    }

    function txParamBuilderType2(uint256 _gasAmount, uint256 _dstNativeAmount, bytes memory _addressOnDst) internal pure returns (bytes memory) {
        uint16 txType = 2;
        return abi.encodePacked(txType, _gasAmount, _dstNativeAmount, _addressOnDst);
    }

    function viewPendingTx(address _user) public view returns (PendingTx[] memory) {
        return (pendingTransactions[_user]);
    }

/******************************************/
/*           CONFIG starts here           */
/******************************************/

    function setConfig(uint16 _version, uint16 _chainId, uint256 _configType, bytes calldata _config) external override onlyOwner {
        layerZeroEndpoint.setConfig(_version, _chainId, _configType, _config);
    }

    function setSendVersion(uint16 version) external override onlyOwner {
        layerZeroEndpoint.setSendVersion(version);
    }

    function setReceiveVersion(uint16 version) external override onlyOwner {
        layerZeroEndpoint.setReceiveVersion(version);
    }

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

    fallback() external payable {}
    receive() external payable {}
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_endpoint","type":"address"},{"internalType":"address","name":"_altitudeFee","type":"address"},{"internalType":"address","name":"_altitudeFactory","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":false,"internalType":"address","name":"_dstToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"AddLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"address","name":"_srcToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"_to","type":"address"}],"name":"Callback_RemoveLiquidityRemote_Confirm","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"address","name":"_srcToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"_to","type":"address"}],"name":"Callback_RemoveLiquidityRemote_Revoke","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"address","name":"_srcToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_rebalanceFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_protocolFee","type":"uint256"}],"name":"Callback_Swap_Confirm","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"address","name":"_srcToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"_to","type":"address"}],"name":"Callback_Swap_Revoke","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":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"address","name":"_srcToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Remote_AddLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"address","name":"_srcToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Remote_RemoveLiquidityLocal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"address","name":"_srcToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"_to","type":"address"}],"name":"Remote_RemoveLiquidityRemote","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"address","name":"_srcToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"_to","type":"address"}],"name":"Remote_Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":false,"internalType":"address","name":"_dstToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"RemoveLiquidityLocal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":false,"internalType":"address","name":"_dstToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"_to","type":"address"}],"name":"RemoveLiquidityRemote","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":false,"internalType":"address","name":"_dstToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"_to","type":"address"}],"name":"RemoveLiquidityRemote_Confirm","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":false,"internalType":"address","name":"_dstToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"_to","type":"address"}],"name":"RemoveLiquidityRemote_Revoke","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":false,"internalType":"address","name":"_dstToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"_to","type":"bytes"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":false,"internalType":"address","name":"_dstToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_rebalanceReward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_rebalanceFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_protocolFee","type":"uint256"}],"name":"Swap_Confirm","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":false,"internalType":"address","name":"_dstToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"_to","type":"address"}],"name":"Swap_Revoke","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"address","name":"_dstToken","type":"address"}],"name":"activateChainPath","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_srcToken","type":"address"},{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"address","name":"_dstToken","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"name":"addChainPath","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"address","name":"_dstToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"addLiquidity","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"altitudeFactory","outputs":[{"internalType":"contract IFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"altitudeFee","outputs":[{"internalType":"contract IAltitudeFee","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"address","name":"","type":"address"}],"name":"chainPathIndexLookup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"chainPaths","outputs":[{"internalType":"bool","name":"ready","type":"bool"},{"internalType":"address","name":"srcToken","type":"address"},{"internalType":"uint16","name":"dstChainId","type":"uint16"},{"internalType":"address","name":"dstToken","type":"address"},{"internalType":"uint256","name":"remoteLiquidity","type":"uint256"},{"internalType":"uint256","name":"localLiquidity","type":"uint256"},{"internalType":"uint256","name":"rewardPoolSize","type":"uint256"},{"internalType":"address","name":"lpToken","type":"address"},{"internalType":"bool","name":"stopSwap","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_Id","type":"uint256"}],"name":"confirmPendingTransaction","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"address","name":"_dstToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"depositRewardPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"address","name":"_dstToken","type":"address"},{"internalType":"bool","name":"_enable","type":"bool"}],"name":"emergencyStopSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeTo","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"forceResumeReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint8","name":"","type":"uint8"}],"name":"gasLookup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"address","name":"_dstToken","type":"address"}],"name":"getChainPath","outputs":[{"components":[{"internalType":"bool","name":"ready","type":"bool"},{"internalType":"address","name":"srcToken","type":"address"},{"internalType":"uint16","name":"dstChainId","type":"uint16"},{"internalType":"address","name":"dstToken","type":"address"},{"internalType":"uint256","name":"remoteLiquidity","type":"uint256"},{"internalType":"uint256","name":"localLiquidity","type":"uint256"},{"internalType":"uint256","name":"rewardPoolSize","type":"uint256"},{"internalType":"address","name":"lpToken","type":"address"},{"internalType":"bool","name":"stopSwap","type":"bool"}],"internalType":"struct Altitude.ChainPath","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"address","name":"_dstToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"getFees","outputs":[{"internalType":"uint256","name":"rebalanceFee","type":"uint256"},{"internalType":"uint256","name":"protocolFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"address","name":"_dstToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"getRebalanceReward","outputs":[{"internalType":"uint256","name":"rebalanceReward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"layerZeroEndpoint","outputs":[{"internalType":"contract ILayerZeroEndpoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"pendingTransactions","outputs":[{"internalType":"uint8","name":"txType","type":"uint8"},{"internalType":"uint16","name":"dstChainId","type":"uint16"},{"internalType":"address","name":"dstToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"from","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_type","type":"uint8"},{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"address","name":"_dstToken","type":"address"},{"internalType":"bytes","name":"_from","type":"bytes"},{"internalType":"uint256","name":"_nativeForDst","type":"uint256"},{"internalType":"bytes","name":"_addressOnDst","type":"bytes"}],"name":"quoteLayerZeroFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"address","name":"_dstToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"removeLiquidityLocal","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"address","name":"_dstToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_nativeForDst","type":"uint256"},{"internalType":"bytes","name":"_addressOnDst","type":"bytes"}],"name":"removeLiquidityRemote","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_Id","type":"uint256"}],"name":"revokePendingTransaction","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"_configType","type":"uint256"},{"internalType":"bytes","name":"_config","type":"bytes"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newFeeContract","type":"address"}],"name":"setFeeContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeTo","type":"address"}],"name":"setFeeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint8","name":"_functionType","type":"uint8"},{"internalType":"uint256","name":"_gasAmount","type":"uint256"}],"name":"setGasAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"version","type":"uint16"}],"name":"setReceiveVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"version","type":"uint16"}],"name":"setSendVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes","name":"_dstAltitudeAddress","type":"bytes"}],"name":"setTrustedRemoteLookup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"address","name":"_dstToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_nativeForDst","type":"uint256"},{"internalType":"bytes","name":"_addressOnDst","type":"bytes"}],"name":"swap","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"trustedRemoteLookup","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"viewPendingTx","outputs":[{"components":[{"internalType":"uint8","name":"txType","type":"uint8"},{"internalType":"uint16","name":"dstChainId","type":"uint16"},{"internalType":"address","name":"dstToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"from","type":"bytes"}],"internalType":"struct Altitude.PendingTx[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"address","name":"_dstToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"withdrawRewardPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b506040516200533e3803806200533e8339810160408190526200003491620000d9565b600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060018055600280546001600160a01b039485166001600160a01b03199182161790915560038054938516938216939093179092556004805491909316911617905562000123565b80516001600160a01b0381168114620000d457600080fd5b919050565b600080600060608486031215620000ef57600080fd5b620000fa84620000bc565b92506200010a60208501620000bc565b91506200011a60408501620000bc565b90509250925092565b61520b80620001336000396000f3fe6080604052600436106102055760003560e01c8063715018a611610117578063a3bfa0fb116100a5578063d43f8de71161006c578063d43f8de7146106b5578063e5f7b59d146106c8578063f2fde38b146106f5578063f46901ed14610715578063fc8691081461073557005b8063a3bfa0fb146105fd578063a7a175eb1461061d578063c04fb4c11461063d578063cbed8b9c14610675578063ce7db9f21461069557005b80638797e3af116100e95780638797e3af146105125780638da5cb5b146105325780639eb6c0ce146105505780639facef2b14610563578063a138ed6b1461058357005b8063715018a614610490578063715e8e6e146104a55780637533d788146104d25780637e432c2c146104ff57005b8063236284bd1161019457806342d65a8d1161016657806342d65a8d146103f057806342dbe168146104105780635f12a5ac14610430578063619f36d6146104505780636531a8b21461047057005b8063236284bd1461036c5780632f159fb51461038c57806337f81db21461039f578063389880bc146103bf57005b806307e0db17116101d857806307e0db17146102d15780630e26f30d146102f157806310ddb137146103045780631d27da7e146103245780631ef24f3f1461035957005b80621d35671461020e578063017e7e581461022e578063024220541461026b57806307968db1146102b157005b3661020c57005b005b34801561021a57600080fd5b5061020c610229366004613eba565b610755565b34801561023a57600080fd5b5060065461024e906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561027757600080fd5b506102a3610286366004613f56565b600860209081526000928352604080842090915290825290205481565b604051908152602001610262565b3480156102bd57600080fd5b5060025461024e906001600160a01b031681565b3480156102dd57600080fd5b5061020c6102ec366004613f8d565b6110ca565b61020c6102ff366004613fc4565b611152565b34801561031057600080fd5b5061020c61031f366004613f8d565b6112e6565b34801561033057600080fd5b5061034461033f366004613fc4565b611344565b60408051928352602083019190915201610262565b61020c610367366004614003565b61152c565b34801561037857600080fd5b5060045461024e906001600160a01b031681565b61020c61039a366004614003565b61170a565b3480156103ab57600080fd5b506102a36103ba366004613fc4565b61199f565b3480156103cb57600080fd5b506103df6103da366004614076565b611ab4565b6040516102629594939291906140f2565b3480156103fc57600080fd5b5061020c61040b366004614174565b611b9e565b34801561041c57600080fd5b5061020c61042b3660046141c6565b611c33565b34801561043c57600080fd5b5061020c61044b366004614174565b611c7f565b34801561045c57600080fd5b5061020c61046b3660046141f1565b611cef565b34801561047c57600080fd5b5061020c61048b36600461423a565b611d48565b34801561049c57600080fd5b5061020c611e8a565b3480156104b157600080fd5b506104c56104c036600461428b565b611efe565b60405161026291906142b7565b3480156104de57600080fd5b506104f26104ed366004613f8d565b61206b565b6040516102629190614351565b61020c61050d366004614364565b612105565b34801561051e57600080fd5b506102a361052d36600461437d565b6124a4565b34801561053e57600080fd5b506000546001600160a01b031661024e565b61020c61055e366004614364565b612757565b34801561056f57600080fd5b5061020c61057e36600461428b565b612b6c565b34801561058f57600080fd5b506105a361059e366004614364565b612c14565b604080519915158a526001600160a01b0398891660208b015261ffff909716968901969096529386166060880152608087019290925260a086015260c08501529190911660e0830152151561010082015261012001610262565b34801561060957600080fd5b5061020c61061836600461441e565b612c8a565b34801561062957600080fd5b5060035461024e906001600160a01b031681565b34801561064957600080fd5b506102a361065836600461428b565b600760209081526000928352604080842090915290825290205481565b34801561068157600080fd5b5061020c6106903660046144aa565b613077565b3480156106a157600080fd5b5061020c6106b0366004613fc4565b613112565b61020c6106c3366004613fc4565b6131e8565b3480156106d457600080fd5b506106e86106e33660046141c6565b6133a2565b6040516102629190614518565b34801561070157600080fd5b5061020c6107103660046141c6565b6134e9565b34801561072157600080fd5b5061020c6107303660046141c6565b6135d3565b34801561074157600080fd5b5061020c6107503660046145bd565b613688565b6002546001600160a01b0316331461076c57600080fd5b61ffff84166000908152600960205260409020805461078a906145eb565b905083511480156107c9575061ffff84166000908152600960205260409081902090516107b79190614625565b60405180910390208380519060200120145b6108765760405162461bcd60e51b815260206004820152606760248201527f416c7469747564653a20496e76616c696420736f757263652073656e6465722060448201527f616464726573732e206f776e65722073686f756c642063616c6c20736574547260648201527f7573746564536f75726365282920746f20656e61626c6520736f7572636520636084820152661bdb9d1c9858dd60ca1b60a482015260c4015b60405180910390fd5b602081015160001960ff821601610a1c57600080600080858060200190518101906108a191906146e0565b9450945094509450506000806014840151915060148601519050600a6000836001600160a01b03166001600160a01b031681526020019081526020016000206040518060a00160405280600160ff1681526020018d61ffff168152602001836001600160a01b0316815260200187815260200185815250908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816001015560808201518160020190816109d191906147c6565b5050507ffeda7eda137aad0c114534c9940fe3e7defd619dbf3d3349dc4a5f4930dec1618b828785604051610a099493929190614885565b60405180910390a15050505050506110c3565b60011960ff821601610b7857600080600080600086806020019051810190610a4491906148b2565b60148082015190860151959b509399509197509550935091506000610a698d8361373b565b90506000610a77868861494d565b610a819089614960565b905080826003016000828254610a97919061494d565b9250508190555080826002016000828254610ab29190614960565b9250508190555086826004016000828254610acd919061494d565b90915550506006548254610af3916001600160a01b036101009092048216911688613825565b7f4ec93ac81c33ff1c5d3d5476cf8eb5c9adfe0bba8966b9bda2fe2deeee1eb0d98e8483878b8b604051610b629695949392919061ffff9690961686526001600160a01b039485166020870152604086019390935292166060840152608083019190915260a082015260c00190565b60405180910390a15050505050505050506110c3565b60021960ff821601610c1057600080600084806020019051810190610b9d9190614973565b60148082015190840151939750919550935091506000610bbd8b8361373b565b8054909150610bdb9061010090046001600160a01b03168487613825565b7f15297d989e05a7bd30a49540d43af4d211f85ead0374834954035f4c6cb89b498b838786604051610a099493929190614885565b60031960ff821601610cab5760008083806020019051810190610c3391906149e7565b6014820151919450925090506000610c4b898361373b565b905082816002016000828254610c61919061494d565b90915550506040517f7705b3824f364923f8b736799a01f145312fb0bdb41db7907e83e756a12ff0d990610c9a908b9085908790614a40565b60405180910390a1505050506110c3565b60041960ff821601610d355760008083806020019051810190610cce91906149e7565b6014820151919450925090506000610ce6898361373b565b905082816002016000828254610cfc9190614960565b90915550506040517f6a09fa7f5b17fb0269df2d4254a1e779ea60ca16b23202ef5d8c10663a89253090610c9a908b9085908790614a40565b60051960ff821601610ec35760008060008085806020019051810190610d5b91906146e0565b9450945094509450506000806014840151915060148601519050600a6000836001600160a01b03166001600160a01b031681526020019081526020016000206040518060a00160405280600660ff1681526020018d61ffff168152602001836001600160a01b0316815260200187815260200185815250908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a8154816001600160a01b0302191690836001600160a01b03160217905550606082015181600101556080820151816002019081610e8b91906147c6565b5050507f625e414eb59af4cd7008514584def3eb126bd7dfa3c4fbd57a777094b25f189e8b828785604051610a099493929190614885565b60011960ff821601610fbe57600080600084806020019051810190610ee89190614973565b60148082015190840151939750919550935091506000610f088b8361373b565b905084816002016000828254610f1e9190614960565b90915550506005810154604051632770a7eb60e21b8152306004820152602481018790526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b158015610f7157600080fd5b505af1158015610f85573d6000803e3d6000fd5b505050507f78a69f71ee39abd80fbf72dc912c223a1dbb804954f147efad2b82d934ee162c8b838786604051610a099493929190614885565b60021960ff8216016110c357600080600084806020019051810190610fe39190614973565b601480820151908401519397509195509350915060006110038b8361373b565b600581015460405163a9059cbb60e01b81526001600160a01b0386811660048301526024820189905292935091169063a9059cbb906044016020604051808303816000875af115801561105a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107e9190614a65565b507f0202af0014658b1e2d1ab8d03a895efb7ec37da094878cecdf10e4e608d91e4c8b8387866040516110b49493929190614885565b60405180910390a15050505050505b5050505050565b6000546001600160a01b031633146110f45760405162461bcd60e51b815260040161086d90614a82565b6002546040516307e0db1760e01b815261ffff831660048201526001600160a01b03909116906307e0db17906024015b600060405180830381600087803b15801561113e57600080fd5b505af11580156110c3573d6000803e3d6000fd5b61115a613888565b6000611166848461373b565b9050818160030154101561118c5760405162461bcd60e51b815260040161086d90614ab7565b6005810154604051632770a7eb60e21b8152336004820152602481018490526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b1580156111da57600080fd5b505af11580156111ee573d6000803e3d6000fd5b50505050818160030160008282546112069190614960565b909155505080546112269061010090046001600160a01b03163384613825565b805460405160009160059161124c9161010090046001600160a01b031690602001614aee565b60408051601f198184030181529082905261126c92918690602001614b0b565b604051602081830303815290604052905061129b600583836000604051806020016040528060008152506138e1565b7fb048ed97e912f8cd58c0fa38e3251ed8bb09ff18d5888ad21a6f84096c5273378585856040516112ce93929190614a40565b60405180910390a150506112e160018055565b505050565b6000546001600160a01b031633146113105760405162461bcd60e51b815260040161086d90614a82565b6002546040516310ddb13760e01b815261ffff831660048201526001600160a01b03909116906310ddb13790602401611124565b6000806000611353868661373b565b6040805161012081018252825460ff808216151583526101008083046001600160a01b039081166020860152600160a81b90930461ffff169484019490945260018501548216606084015260028086015460808501819052600387015460a08601819052600488015460c087015260059097015493841660e0860152600160a01b9093049091161515938301939093529093506000926113f3919061494d565b6113fd9190614b37565b60035460a0840151604051634bcc856560e01b8152600481018490526024810191909152604481018890529192506001600160a01b031690634bcc856590606401602060405180830381865afa15801561145b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147f9190614b59565b93506000600360009054906101000a90046001600160a01b03166001600160a01b0316634722b4a56040518163ffffffff1660e01b815260040160a060405180830381865afa1580156114d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114fa9190614b72565b505050509050670de0b6b3a764000081876115159190614bb2565b61151f9190614b37565b9350505050935093915050565b611534613888565b60148101516000611545878761373b565b90506001600160a01b03821661159d5760405162461bcd60e51b815260206004820152601f60248201527f416c7469747564653a207377617020746f207a65726f20616464726573732e00604482015260640161086d565b84816002015410156115c15760405162461bcd60e51b815260040161086d90614ab7565b6005810154600160a01b900460ff161561161d5760405162461bcd60e51b815260206004820152601960248201527f416c7469747564653a2073776170732064697361626c65642e00000000000000604482015260640161086d565b80546116399061010090046001600160a01b0316333088613992565b805460405160009160019161165f9161010090046001600160a01b031690602001614aee565b6040516020818303038152906040528786336040516020016116819190614aee565b60408051601f19818403018152908290526116a29594939291602001614bc9565b60405160208183030381529060405290506116c16001838388886138e1565b7fcb8ff592f9ad638556bf9cd980dbbfb25a4c4871a9bb03279bb324ec7f18e75b888888876040516116f69493929190614c1d565b60405180910390a15050506110c360018055565b611712613888565b60148101516000611723878761373b565b90506001600160a01b0382166117895760405162461bcd60e51b815260206004820152602560248201527f416c7469747564653a207769746864726177616c20746f207a65726f206164646044820152643932b9b99760d91b606482015260840161086d565b848160030154106117e85760405162461bcd60e51b8152602060048201526024808201527f416c7469747564653a2073756666696369656e74206c6f63616c206c697175696044820152636469747960e01b606482015260840161086d565b848160020154101561180c5760405162461bcd60e51b815260040161086d90614ab7565b60058101546040516370a0823160e01b815233600482015286916001600160a01b0316906370a0823190602401602060405180830381865afa158015611856573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187a9190614b59565b10156118c85760405162461bcd60e51b815260206004820152601e60248201527f416c7469747564653a206e6f7420656e6f756768204c5020746f6b656e730000604482015260640161086d565b60058101546118e2906001600160a01b0316333088613992565b80546040516000916006916119089161010090046001600160a01b031690602001614aee565b60405160208183030381529060405287863360405160200161192a9190614aee565b60408051601f198184030181529082905261194b9594939291602001614bc9565b604051602081830303815290604052905061196a6006838388886138e1565b7fec113fca99a607dc1ec5035d2709619c47df9f7a4b8c5994319cd0fb9c6b3559888888336040516116f69493929190614885565b6000806119ac858561373b565b6040805161012081018252825460ff808216151583526101008083046001600160a01b039081166020860152600160a81b90930461ffff169484019490945260018501548216606084015260028086015460808501819052600387015460a08601819052600488015460c087015260059097015493841660e0860152600160a01b909304909116151593830193909352909350600092611a4c919061494d565b611a569190614b37565b90508082608001511015611aab576000826080015182611a769190614960565b905080858460c00151611a899190614bb2565b611a939190614b37565b93508260c00151841115611aa9578260c0015193505b505b50509392505050565b600a6020528160005260406000208181548110611ad057600080fd5b600091825260209091206003909102018054600182015460028301805460ff84169650610100840461ffff16955063010000009093046001600160a01b0316939192611b1b906145eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611b47906145eb565b8015611b945780601f10611b6957610100808354040283529160200191611b94565b820191906000526020600020905b815481529060010190602001808311611b7757829003601f168201915b5050505050905085565b6000546001600160a01b03163314611bc85760405162461bcd60e51b815260040161086d90614a82565b6002546040516342d65a8d60e01b81526001600160a01b03909116906342d65a8d90611bfc90869086908690600401614c81565b600060405180830381600087803b158015611c1657600080fd5b505af1158015611c2a573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b03163314611c5d5760405162461bcd60e51b815260040161086d90614a82565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611ca95760405162461bcd60e51b815260040161086d90614a82565b818130604051602001611cbe93929190614ca8565b60408051601f1981840301815291815261ffff8516600090815260096020522090611ce990826147c6565b50505050565b6000546001600160a01b03163314611d195760405162461bcd60e51b815260040161086d90614a82565b6000611d25848461373b565b6005018054921515600160a01b0260ff60a01b1990931692909217909155505050565b6000546001600160a01b03163314611d725760405162461bcd60e51b815260040161086d90614a82565b6000611d7e858561373b565b90508281600401541015611de75760405162461bcd60e51b815260206004820152602a60248201527f416c7469747564653a206e6f7420656e6f7567682066756e647320696e2072656044820152693bb0b932103837b7b61760b11b606482015260840161086d565b80546040516323b872dd60e01b81523060048201526001600160a01b03848116602483015260448201869052610100909204909116906323b872dd906064016020604051808303816000875af1158015611e45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e699190614a65565b5082816004016000828254611e7e9190614960565b90915550505050505050565b6000546001600160a01b03163314611eb45760405162461bcd60e51b815260040161086d90614a82565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b604080516101208101825260008082526020808301829052828401829052606083018290526080830182905260a0830182905260c0830182905260e08301829052610100830182905261ffff86168252600781528382206001600160a01b0386168352905291822054600580549293929091908110611f7f57611f7f614cce565b600091825260209182902060408051610120810182526006909302909101805460ff808216151585526001600160a01b0361010080840482169787019790975261ffff600160a81b909304831694860185905260018401548116606087015260028401546080870152600384015460a0870152600484015460c087015260059093015492831660e0860152600160a01b9092049091161515938301939093529092509085161480156120465750826001600160a01b031681606001516001600160a01b0316145b6120625760405162461bcd60e51b815260040161086d90614ce4565b90505b92915050565b60096020526000908152604090208054612084906145eb565b80601f01602080910402602001604051908101604052809291908181526020018280546120b0906145eb565b80156120fd5780601f106120d2576101008083540402835291602001916120fd565b820191906000526020600020905b8154815290600101906020018083116120e057829003601f168201915b505050505081565b61210d613888565b336000908152600a6020526040812080548390811061212e5761212e614cce565b60009182526020822060039091020180549092506121669061ffff610100820416906001600160a01b0363010000009091041661373b565b825490915060ff166000190161225657805460405160009160039161219c9161010090046001600160a01b031690602001614aee565b60408051601f198184030181529082905260018601546121c493926002880190602001614da9565b60405160208183030381529060405290506121f3600383836000604051806020016040528060008152506138e1565b8154600180840154908501546040517f7174c8967828cbed2f4b2522ef60cfa36335be020fb48f61f5934adcf8b4ce809361224893600160a81b90910461ffff16926001600160a01b03909116913390614885565b60405180910390a15061233f565b815460ff166005190161233f5780546040516000916008916122899161010090046001600160a01b031690602001614aee565b60408051601f198184030181529082905260018601546122b193926002880190602001614da9565b60405160208183030381529060405290506122e0600883836000604051806020016040528060008152506138e1565b8154600180840154908501546040517fc5fc5361f0a29148280e13304c1c3932bf30bd6d50e46547d41d5e428fb4f06b9361233593600160a81b90910461ffff16926001600160a01b03909116913390614885565b60405180910390a1505b336000908152600a6020526040902080549061235c600183614960565b8154811061236c5761236c614cce565b9060005260206000209060030201600a6000336001600160a01b03166001600160a01b0316815260200190815260200160002085815481106123b0576123b0614cce565b600091825260209091208254600390920201805460ff19811660ff9093169283178255835461ffff61010091829004160262ffffff199091169092179190911780825582546001600160a01b0363010000009182900416026301000000600160b81b03199091161781556001808301549082015560028082019061243690840182614ddd565b5050336000908152600a6020526040902080549091508061245957612459614eaf565b60008281526020812060036000199093019283020180546001600160b81b031916815560018101829055906124916002830182613d92565b505090555050506124a160018055565b50565b6000806124b1878761373b565b6040805161012081018252825460ff808216151583526101008083046001600160a01b039081166020860152600160a81b90930461ffff1694840194909452600180860154831660608086019190915260028701546080860152600387015460a0860152600487015460c086015260059096015492831660e0850152600160a01b9092048116151593830193909352909350908a16148061255557508860ff166006145b156125ac57600182602001516040516020016125719190614aee565b60408051601f1981840301815290829052612596929160009088908b90602001614ec5565b60405160208183030381529060405290506126bb565b8860ff166002036125f557600282602001516040516020016125ce9190614aee565b60408051601f19818403018152908290526125969291600090819081908a90602001614efc565b8860ff166003148061260a57508860ff166007145b8061261857508860ff166008145b1561265757600282602001516040516020016126349190614aee565b60408051601f198184030181529082905261259692916000908890602001614f52565b8860ff166004148061266c57508860ff166005145b156126bb57600482602001516040516020016126889190614aee565b60408051601f19818403018152908290526126a99291600090602001614f89565b60405160208183030381529060405290505b60006126c98a8a88886139ca565b60025460405163040a7bb160e41b81529192506000916001600160a01b03909116906340a7bb1090612707908d903090889087908990600401614fb8565b6040805180830381865afa158015612723573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127479190615000565b509b9a5050505050505050505050565b61275f613888565b336000908152600a6020526040812080548390811061278057612780614cce565b60009182526020822060039091020180549092506127b89061ffff610100820416906001600160a01b0363010000009091041661373b565b825490915060ff1660001901612a09578160010154816003015410156127f05760405162461bcd60e51b815260040161086d90614ab7565b805460018083015490840154600092839261282392600160a81b90920461ffff16916001600160a01b0390911690611344565b90925090506000612834828461494d565b85600101546128439190614960565b84546001808701549088015492935060009261287492600160a81b900461ffff16916001600160a01b03169061199f565b90508085600401600082825461288a9190614960565b92505081905550818560030160008282546128a59190614960565b92505081905550818560020160008282546128c0919061494d565b909155506128eb9050336128d4838561494d565b875461010090046001600160a01b03169190613825565b84546040516000916002916129119161010090046001600160a01b031690602001614aee565b60405160208183030381529060405288600101548787336040516020016129389190614aee565b60408051601f198184030181529082905261295a969594939291602001615024565b6040516020818303038152906040529050612989600287836000604051806020016040528060008152506138e1565b8554600187015460408051600160a81b90930461ffff1683526001600160a01b03909116602083015281018490523360608201526080810183905260a0810186905260c081018590527fb76e1253ca2b5a7dabb38df18c83579ffdee45ae2898e934321dbdb838d454fe9060e00160405180910390a1505050505061233f565b815460ff166005190161233f57816001015481600301541015612a3e5760405162461bcd60e51b815260040161086d90614ab7565b8160010154816003016000828254612a569190614960565b909155505060018201548154612a7d916101009091046001600160a01b0316903390613825565b8054604051600091600791612aa39161010090046001600160a01b031690602001614aee565b604051602081830303815290604052846001015433604051602001612ac89190614aee565b60408051601f1981840301815290829052612ae894939291602001615064565b6040516020818303038152906040529050612b17600783836000604051806020016040528060008152506138e1565b8154600180840154908501546040517f07d3caa0e08fba164878823c79fbbe40fd0dcf5f2ab7d03ab3d4709d8b87324c9361233593600160a81b90910461ffff16926001600160a01b03909116913390614885565b6000546001600160a01b03163314612b965760405162461bcd60e51b815260040161086d90614a82565b6000612ba2838361373b565b805490915060ff1615612c055760405162461bcd60e51b815260206004820152602560248201527f416c7469747564653a20636861696e5061746820697320616c72656164792061604482015264637469766560d81b606482015260840161086d565b805460ff191660011790555050565b60058181548110612c2457600080fd5b600091825260209091206006909102018054600182015460028301546003840154600485015460059095015460ff808616975061010086046001600160a01b0390811697600160a81b90970461ffff1696958116959290811691600160a01b9091041689565b6000546001600160a01b03163314612cb45760405162461bcd60e51b815260040161086d90614a82565b60005b600554811015612e3257600060058281548110612cd657612cd6614cce565b6000918252602080832060408051610120810182526006909402909101805460ff808216151586526001600160a01b0361010080840482169688019690965261ffff600160a81b909304831694870185905260018401548116606088015260028401546080880152600384015460a0880152600484015460c088015260059093015492831660e0870152600160a01b9092049091161515928401929092529193508816148015612d9b5750856001600160a01b031682606001516001600160a01b0316145b90508015612e1f5760405162461bcd60e51b8152602060048201526044602482018190527f416c7469747564653a2063616e7420637265617465436861696e50617468206f908201527f66206578697374696e67205f647374436861696e496420616e64205f6473745460648201526337b5b2b760e11b608482015260a40161086d565b505080612e2b90615098565b9050612cb7565b5060055461ffff851660009081526007602090815260408083206001600160a01b038089168552925280832093909355600480549351635e867ae360e01b8152929390911691635e867ae391612e8c9187918791016150b1565b6020604051808303816000875af1158015612eab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ecf91906150d6565b90506005604051806101200160405280600015158152602001886001600160a01b031681526020018761ffff168152602001866001600160a01b03168152602001600081526020016000815260200160008152602001836001600160a01b0316815260200160001515815250908060018154018082558091505060019003906000526020600020906006020160009091909190915060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160000160156101000a81548161ffff021916908361ffff16021790555060608201518160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506080820151816002015560a0820151816003015560c0820151816004015560e08201518160050160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506101008201518160050160146101000a81548160ff0219169083151502179055505050505050505050565b6000546001600160a01b031633146130a15760405162461bcd60e51b815260040161086d90614a82565b6002546040516332fb62e760e21b81526001600160a01b039091169063cbed8b9c906130d990889088908890889088906004016150f3565b600060405180830381600087803b1580156130f357600080fd5b505af1158015613107573d6000803e3d6000fd5b505050505050505050565b6000546001600160a01b0316331461313c5760405162461bcd60e51b815260040161086d90614a82565b6000613148848461373b565b80546040516323b872dd60e01b81523360048201523060248201526044810185905291925061010090046001600160a01b0316906323b872dd906064016020604051808303816000875af11580156131a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131c89190614a65565b50818160040160008282546131dd919061494d565b909155505050505050565b6131f0613888565b60006131fc848461373b565b805490915060ff16151560011461325f5760405162461bcd60e51b815260206004820152602160248201527f416c7469747564653a20636861696e50617468206973206e6f742061637469766044820152606560f81b606482015260840161086d565b805461327b9061010090046001600160a01b0316333085613992565b60058101546040516340c10f1960e01b8152336004820152602481018490526001600160a01b03909116906340c10f1990604401600060405180830381600087803b1580156132c957600080fd5b505af11580156132dd573d6000803e3d6000fd5b50505050818160030160008282546132f5919061494d565b909155505080546040516000916004916133209161010090046001600160a01b031690602001614aee565b60408051601f198184030181529082905261334092918690602001614b0b565b604051602081830303815290604052905061336f600483836000604051806020016040528060008152506138e1565b7f2e8d5f9395b4e4b2cbe364c1b86e90bdbd7fcbbeca7559ae43cc2a05f208dbb28585856040516112ce93929190614a40565b6001600160a01b0381166000908152600a60209081526040808320805482518185028101850190935280835260609492939192909184015b828210156134de5760008481526020908190206040805160a08101825260038602909201805460ff81168452610100810461ffff169484019490945263010000009093046001600160a01b0316908201526001820154606082015260028201805491929160808401919061344d906145eb565b80601f0160208091040260200160405190810160405280929190818152602001828054613479906145eb565b80156134c65780601f1061349b576101008083540402835291602001916134c6565b820191906000526020600020905b8154815290600101906020018083116134a957829003601f168201915b505050505081525050815260200190600101906133da565b505050509050919050565b6000546001600160a01b031633146135135760405162461bcd60e51b815260040161086d90614a82565b6001600160a01b0381166135785760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161086d565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146135fd5760405162461bcd60e51b815260040161086d90614a82565b6001600160a01b0381166136665760405162461bcd60e51b815260206004820152602a60248201527f416c7469747564653a20726563697069656e742063616e2774206265207a6572604482015269379030b2323932b9b99760b11b606482015260840161086d565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146136b25760405162461bcd60e51b815260040161086d90614a82565b60018260ff16101580156136ca575060088260ff1611155b6137165760405162461bcd60e51b815260206004820152601f60248201527f416c7469747564653a20696e76616c6964205f66756e6374696f6e5479706500604482015260640161086d565b61ffff909216600090815260086020908152604080832060ff90941683529290522055565b60055460009061378d5760405162461bcd60e51b815260206004820152601d60248201527f416c7469747564653a206e6f20636861696e7061746873206578697374000000604482015260640161086d565b61ffff831660009081526007602090815260408083206001600160a01b03861684529091528120546005805490919081106137ca576137ca614cce565b60009182526020909120600690910201805490915061ffff858116600160a81b90920416148015612046575060018101546001600160a01b038481169116146120625760405162461bcd60e51b815260040161086d90614ce4565b6040516001600160a01b0383166024820152604481018290526112e190849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613a45565b6002600154036138da5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161086d565b6002600155565b83546000906138ff908790600160a81b900461ffff16868686613b17565b6002548654600160a81b900461ffff1660008181526009602052604090819020905162c5803160e81b81529394506001600160a01b039092169263c5803100923492613958929091908a90339030908a90600401615121565b6000604051808303818588803b15801561397157600080fd5b505af1158015613985573d6000803e3d6000fd5b5050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611ce99085906323b872dd60e01b90608401613851565b61ffff8316600090815260086020908152604080832060ff8816845290915290205460609081908415613a0957613a02818686613c39565b9150613a39565b613a368160408051600160f01b602082015260228082019390935281518082039093018352604201905290565b91505b5090505b949350505050565b6000613a9a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613c6f9092919063ffffffff16565b8051909150156112e15780806020019051810190613ab89190614a65565b6112e15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161086d565b6060613b25868685856139ca565b60025460405163040a7bb160e41b81529192506000916001600160a01b03909116906340a7bb1090613b6390899030908a9087908990600401614fb8565b6040805180830381865afa158015613b7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ba39190615000565b50905080341015613c2f5760405162461bcd60e51b815260206004820152604a60248201527f416c7469747564653a20696e73756666696369656e74206d73672e76616c756560448201527f20746f2070617920746f204c617965725a65726f20666f72206d657373616765606482015269103232b634bb32b93c9760b11b608482015260a40161086d565b5095945050505050565b604051606090600290613c5690829087908790879060200161517b565b6040516020818303038152906040529150509392505050565b6060613a3d848460008585600080866001600160a01b03168587604051613c9691906151b9565b60006040518083038185875af1925050503d8060008114613cd3576040519150601f19603f3d011682016040523d82523d6000602084013e613cd8565b606091505b5091509150613ce987838387613cf4565b979650505050505050565b60608315613d63578251600003613d5c576001600160a01b0385163b613d5c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161086d565b5081613a3d565b613a3d8383815115613d785781518083602001fd5b8060405162461bcd60e51b815260040161086d9190614351565b508054613d9e906145eb565b6000825580601f10613dae575050565b601f0160209004906000526020600020908101906124a191905b80821115613ddc5760008155600101613dc8565b5090565b803561ffff81168114613df257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613e3557613e35613df7565b604052919050565b60006001600160401b03821115613e5657613e56613df7565b50601f01601f191660200190565b600082601f830112613e7557600080fd5b8135613e88613e8382613e3d565b613e0d565b818152846020838601011115613e9d57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215613ed057600080fd5b613ed985613de0565b935060208501356001600160401b0380821115613ef557600080fd5b613f0188838901613e64565b9450604087013591508082168214613f1857600080fd5b90925060608601359080821115613f2e57600080fd5b50613f3b87828801613e64565b91505092959194509250565b60ff811681146124a157600080fd5b60008060408385031215613f6957600080fd5b613f7283613de0565b91506020830135613f8281613f47565b809150509250929050565b600060208284031215613f9f57600080fd5b613fa882613de0565b9392505050565b6001600160a01b03811681146124a157600080fd5b600080600060608486031215613fd957600080fd5b613fe284613de0565b92506020840135613ff281613faf565b929592945050506040919091013590565b600080600080600060a0868803121561401b57600080fd5b61402486613de0565b9450602086013561403481613faf565b9350604086013592506060860135915060808601356001600160401b0381111561405d57600080fd5b61406988828901613e64565b9150509295509295909350565b6000806040838503121561408957600080fd5b823561409481613faf565b946020939093013593505050565b60005b838110156140bd5781810151838201526020016140a5565b50506000910152565b600081518084526140de8160208601602086016140a2565b601f01601f19169290920160200192915050565b60ff8616815261ffff8516602082015260018060a01b038416604082015282606082015260a060808201526000613ce960a08301846140c6565b60008083601f84011261413e57600080fd5b5081356001600160401b0381111561415557600080fd5b60208301915083602082850101111561416d57600080fd5b9250929050565b60008060006040848603121561418957600080fd5b61419284613de0565b925060208401356001600160401b038111156141ad57600080fd5b6141b98682870161412c565b9497909650939450505050565b6000602082840312156141d857600080fd5b813561206281613faf565b80151581146124a157600080fd5b60008060006060848603121561420657600080fd5b61420f84613de0565b9250602084013561421f81613faf565b9150604084013561422f816141e3565b809150509250925092565b6000806000806080858703121561425057600080fd5b61425985613de0565b9350602085013561426981613faf565b925060408501359150606085013561428081613faf565b939692955090935050565b6000806040838503121561429e57600080fd5b6142a783613de0565b91506020830135613f8281613faf565b8151151581526020808301516001600160a01b0316908201526040808301516101208301916142eb9084018261ffff169052565b50606083015161430660608401826001600160a01b03169052565b506080830151608083015260a083015160a083015260c083015160c083015260e083015161433f60e08401826001600160a01b03169052565b50610100928301511515919092015290565b602081526000613fa860208301846140c6565b60006020828403121561437657600080fd5b5035919050565b60008060008060008060c0878903121561439657600080fd5b86356143a181613f47565b95506143af60208801613de0565b945060408701356143bf81613faf565b935060608701356001600160401b03808211156143db57600080fd5b6143e78a838b01613e64565b94506080890135935060a089013591508082111561440457600080fd5b5061441189828a01613e64565b9150509295509295509295565b600080600080600060a0868803121561443657600080fd5b853561444181613faf565b945061444f60208701613de0565b9350604086013561445f81613faf565b925060608601356001600160401b038082111561447b57600080fd5b61448789838a01613e64565b9350608088013591508082111561449d57600080fd5b5061406988828901613e64565b6000806000806000608086880312156144c257600080fd5b6144cb86613de0565b94506144d960208701613de0565b93506040860135925060608601356001600160401b038111156144fb57600080fd5b6145078882890161412c565b969995985093965092949392505050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b838110156145af57888303603f190185528151805160ff1684528781015161ffff1688850152868101516001600160a01b0316878501526060808201519085015260809081015160a09185018290529061459b818601836140c6565b96890196945050509086019060010161453f565b509098975050505050505050565b6000806000606084860312156145d257600080fd5b6145db84613de0565b92506020840135613ff281613f47565b600181811c908216806145ff57607f821691505b60208210810361461f57634e487b7160e01b600052602260045260246000fd5b50919050565b6000808354614633816145eb565b6001828116801561464b57600181146146605761468f565b60ff198416875282151583028701945061468f565b8760005260208060002060005b858110156146865781548a82015290840190820161466d565b50505082870194505b50929695505050505050565b600082601f8301126146ac57600080fd5b81516146ba613e8382613e3d565b8181528460208386010111156146cf57600080fd5b613a3d8260208301602087016140a2565b600080600080600060a086880312156146f857600080fd5b855161470381613f47565b60208701519095506001600160401b038082111561472057600080fd5b61472c89838a0161469b565b955060408801519450606088015191508082111561474957600080fd5b61475589838a0161469b565b9350608088015191508082111561476b57600080fd5b506140698882890161469b565b601f8211156112e157600081815260208120601f850160051c8101602086101561479f5750805b601f850160051c820191505b818110156147be578281556001016147ab565b505050505050565b81516001600160401b038111156147df576147df613df7565b6147f3816147ed84546145eb565b84614778565b602080601f83116001811461482857600084156148105750858301515b600019600386901b1c1916600185901b1785556147be565b600085815260208120601f198616915b8281101561485757888601518255948401946001909101908401614838565b50858210156148755787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff9490941684526001600160a01b039283166020850152604084019190915216606082015260800190565b60008060008060008060c087890312156148cb57600080fd5b86516148d681613f47565b60208801519096506001600160401b03808211156148f357600080fd5b6148ff8a838b0161469b565b965060408901519550606089015194506080890151935060a089015191508082111561492a57600080fd5b5061441189828a0161469b565b634e487b7160e01b600052601160045260246000fd5b8082018082111561206557612065614937565b8181038181111561206557612065614937565b6000806000806080858703121561498957600080fd5b845161499481613f47565b60208601519094506001600160401b03808211156149b157600080fd5b6149bd8883890161469b565b94506040870151935060608701519150808211156149da57600080fd5b50613f3b8782880161469b565b6000806000606084860312156149fc57600080fd5b8351614a0781613f47565b60208501519093506001600160401b03811115614a2357600080fd5b614a2f8682870161469b565b925050604084015190509250925092565b61ffff9390931683526001600160a01b03919091166020830152604082015260600190565b600060208284031215614a7757600080fd5b8151612062816141e3565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601e908201527f416c7469747564653a206e6f7420656e6f756768206c69717569646974790000604082015260600190565b60609190911b6bffffffffffffffffffffffff1916815260140190565b60ff84168152606060208201526000614b2760608301856140c6565b9050826040830152949350505050565b600082614b5457634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215614b6b57600080fd5b5051919050565b600080600080600060a08688031215614b8a57600080fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b808202811582820484141761206557612065614937565b60ff8616815260a060208201526000614be560a08301876140c6565b8560408401528281036060840152614bfd81866140c6565b90508281036080840152614c1181856140c6565b98975050505050505050565b61ffff8516815260018060a01b0384166020820152826040820152608060608201526000614c4e60808301846140c6565b9695505050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b61ffff84168152604060208201526000614c9f604083018486614c58565b95945050505050565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b634e487b7160e01b600052603260045260246000fd5b60208082526028908201527f416c7469747564653a206c6f63616c20636861696e5061746820646f6573206e6040820152671bdd08195e1a5cdd60c21b606082015260800190565b60008154614d39816145eb565b808552602060018381168015614d565760018114614d7057614d9e565b60ff1985168884015283151560051b880183019550614d9e565b866000528260002060005b85811015614d965781548a8201860152908301908401614d7b565b890184019650505b505050505092915050565b60ff85168152608060208201526000614dc560808301866140c6565b8460408401528281036060840152613ce98185614d2c565b818103614de8575050565b614df282546145eb565b6001600160401b03811115614e0957614e09613df7565b614e17816147ed84546145eb565b6000601f821160018114614e4b5760008315614e335750848201545b600019600385901b1c1916600184901b1784556110c3565b600085815260209020601f19841690600086815260209020845b83811015614e855782860154825560019586019590910190602001614e65565b50858310156148755793015460001960f8600387901b161c19169092555050600190811b01905550565b634e487b7160e01b600052603160045260246000fd5b60ff8616815260a060208201526000614ee160a08301876140c6565b60ff861660408401528281036060840152614bfd81866140c6565b60ff8716815260c060208201526000614f1860c08301886140c6565b60ff8716604084015260ff8616606084015260ff8516608084015282810360a0840152614f4581856140c6565b9998505050505050505050565b60ff85168152608060208201526000614f6e60808301866140c6565b60ff851660408401528281036060840152613ce981856140c6565b60ff84168152606060208201526000614fa560608301856140c6565b905060ff83166040830152949350505050565b61ffff861681526001600160a01b038516602082015260a060408201819052600090614fe6908301866140c6565b84151560608401528281036080840152614c1181856140c6565b6000806040838503121561501357600080fd5b505080516020909101519092909150565b60ff8716815260c06020820152600061504060c08301886140c6565b86604084015285606084015284608084015282810360a0840152614f4581856140c6565b60ff8516815260806020820152600061508060808301866140c6565b8460408401528281036060840152613ce981856140c6565b6000600182016150aa576150aa614937565b5060010190565b6040815260006150c460408301856140c6565b8281036020840152614c9f81856140c6565b6000602082840312156150e857600080fd5b815161206281613faf565b600061ffff808816835280871660208401525084604083015260806060830152613ce9608083018486614c58565b61ffff8716815260c06020820152600061513e60c0830188614d2c565b828103604084015261515081886140c6565b6001600160a01b0387811660608601528616608085015283810360a08501529050614f4581856140c6565b61ffff60f01b8560f01b168152836002820152826022820152600082516151a98160428501602087016140a2565b9190910160420195945050505050565b600082516151cb8184602087016140a2565b919091019291505056fea2646970667358221220909c46167e483059649bce247af82d5705c63310d48aba9c741c702e3a474e7064736f6c63430008120033000000000000000000000000f69186dfba60ddb133e91e9a4b5673624293d8f80000000000000000000000008eeb0e9c984cf380856f5e23dc3379d81af77807000000000000000000000000f6d5a6352b7ebfe49048d29cfc3ea47c2a19af3a

Deployed Bytecode

0x6080604052600436106102055760003560e01c8063715018a611610117578063a3bfa0fb116100a5578063d43f8de71161006c578063d43f8de7146106b5578063e5f7b59d146106c8578063f2fde38b146106f5578063f46901ed14610715578063fc8691081461073557005b8063a3bfa0fb146105fd578063a7a175eb1461061d578063c04fb4c11461063d578063cbed8b9c14610675578063ce7db9f21461069557005b80638797e3af116100e95780638797e3af146105125780638da5cb5b146105325780639eb6c0ce146105505780639facef2b14610563578063a138ed6b1461058357005b8063715018a614610490578063715e8e6e146104a55780637533d788146104d25780637e432c2c146104ff57005b8063236284bd1161019457806342d65a8d1161016657806342d65a8d146103f057806342dbe168146104105780635f12a5ac14610430578063619f36d6146104505780636531a8b21461047057005b8063236284bd1461036c5780632f159fb51461038c57806337f81db21461039f578063389880bc146103bf57005b806307e0db17116101d857806307e0db17146102d15780630e26f30d146102f157806310ddb137146103045780631d27da7e146103245780631ef24f3f1461035957005b80621d35671461020e578063017e7e581461022e578063024220541461026b57806307968db1146102b157005b3661020c57005b005b34801561021a57600080fd5b5061020c610229366004613eba565b610755565b34801561023a57600080fd5b5060065461024e906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561027757600080fd5b506102a3610286366004613f56565b600860209081526000928352604080842090915290825290205481565b604051908152602001610262565b3480156102bd57600080fd5b5060025461024e906001600160a01b031681565b3480156102dd57600080fd5b5061020c6102ec366004613f8d565b6110ca565b61020c6102ff366004613fc4565b611152565b34801561031057600080fd5b5061020c61031f366004613f8d565b6112e6565b34801561033057600080fd5b5061034461033f366004613fc4565b611344565b60408051928352602083019190915201610262565b61020c610367366004614003565b61152c565b34801561037857600080fd5b5060045461024e906001600160a01b031681565b61020c61039a366004614003565b61170a565b3480156103ab57600080fd5b506102a36103ba366004613fc4565b61199f565b3480156103cb57600080fd5b506103df6103da366004614076565b611ab4565b6040516102629594939291906140f2565b3480156103fc57600080fd5b5061020c61040b366004614174565b611b9e565b34801561041c57600080fd5b5061020c61042b3660046141c6565b611c33565b34801561043c57600080fd5b5061020c61044b366004614174565b611c7f565b34801561045c57600080fd5b5061020c61046b3660046141f1565b611cef565b34801561047c57600080fd5b5061020c61048b36600461423a565b611d48565b34801561049c57600080fd5b5061020c611e8a565b3480156104b157600080fd5b506104c56104c036600461428b565b611efe565b60405161026291906142b7565b3480156104de57600080fd5b506104f26104ed366004613f8d565b61206b565b6040516102629190614351565b61020c61050d366004614364565b612105565b34801561051e57600080fd5b506102a361052d36600461437d565b6124a4565b34801561053e57600080fd5b506000546001600160a01b031661024e565b61020c61055e366004614364565b612757565b34801561056f57600080fd5b5061020c61057e36600461428b565b612b6c565b34801561058f57600080fd5b506105a361059e366004614364565b612c14565b604080519915158a526001600160a01b0398891660208b015261ffff909716968901969096529386166060880152608087019290925260a086015260c08501529190911660e0830152151561010082015261012001610262565b34801561060957600080fd5b5061020c61061836600461441e565b612c8a565b34801561062957600080fd5b5060035461024e906001600160a01b031681565b34801561064957600080fd5b506102a361065836600461428b565b600760209081526000928352604080842090915290825290205481565b34801561068157600080fd5b5061020c6106903660046144aa565b613077565b3480156106a157600080fd5b5061020c6106b0366004613fc4565b613112565b61020c6106c3366004613fc4565b6131e8565b3480156106d457600080fd5b506106e86106e33660046141c6565b6133a2565b6040516102629190614518565b34801561070157600080fd5b5061020c6107103660046141c6565b6134e9565b34801561072157600080fd5b5061020c6107303660046141c6565b6135d3565b34801561074157600080fd5b5061020c6107503660046145bd565b613688565b6002546001600160a01b0316331461076c57600080fd5b61ffff84166000908152600960205260409020805461078a906145eb565b905083511480156107c9575061ffff84166000908152600960205260409081902090516107b79190614625565b60405180910390208380519060200120145b6108765760405162461bcd60e51b815260206004820152606760248201527f416c7469747564653a20496e76616c696420736f757263652073656e6465722060448201527f616464726573732e206f776e65722073686f756c642063616c6c20736574547260648201527f7573746564536f75726365282920746f20656e61626c6520736f7572636520636084820152661bdb9d1c9858dd60ca1b60a482015260c4015b60405180910390fd5b602081015160001960ff821601610a1c57600080600080858060200190518101906108a191906146e0565b9450945094509450506000806014840151915060148601519050600a6000836001600160a01b03166001600160a01b031681526020019081526020016000206040518060a00160405280600160ff1681526020018d61ffff168152602001836001600160a01b0316815260200187815260200185815250908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816001015560808201518160020190816109d191906147c6565b5050507ffeda7eda137aad0c114534c9940fe3e7defd619dbf3d3349dc4a5f4930dec1618b828785604051610a099493929190614885565b60405180910390a15050505050506110c3565b60011960ff821601610b7857600080600080600086806020019051810190610a4491906148b2565b60148082015190860151959b509399509197509550935091506000610a698d8361373b565b90506000610a77868861494d565b610a819089614960565b905080826003016000828254610a97919061494d565b9250508190555080826002016000828254610ab29190614960565b9250508190555086826004016000828254610acd919061494d565b90915550506006548254610af3916001600160a01b036101009092048216911688613825565b7f4ec93ac81c33ff1c5d3d5476cf8eb5c9adfe0bba8966b9bda2fe2deeee1eb0d98e8483878b8b604051610b629695949392919061ffff9690961686526001600160a01b039485166020870152604086019390935292166060840152608083019190915260a082015260c00190565b60405180910390a15050505050505050506110c3565b60021960ff821601610c1057600080600084806020019051810190610b9d9190614973565b60148082015190840151939750919550935091506000610bbd8b8361373b565b8054909150610bdb9061010090046001600160a01b03168487613825565b7f15297d989e05a7bd30a49540d43af4d211f85ead0374834954035f4c6cb89b498b838786604051610a099493929190614885565b60031960ff821601610cab5760008083806020019051810190610c3391906149e7565b6014820151919450925090506000610c4b898361373b565b905082816002016000828254610c61919061494d565b90915550506040517f7705b3824f364923f8b736799a01f145312fb0bdb41db7907e83e756a12ff0d990610c9a908b9085908790614a40565b60405180910390a1505050506110c3565b60041960ff821601610d355760008083806020019051810190610cce91906149e7565b6014820151919450925090506000610ce6898361373b565b905082816002016000828254610cfc9190614960565b90915550506040517f6a09fa7f5b17fb0269df2d4254a1e779ea60ca16b23202ef5d8c10663a89253090610c9a908b9085908790614a40565b60051960ff821601610ec35760008060008085806020019051810190610d5b91906146e0565b9450945094509450506000806014840151915060148601519050600a6000836001600160a01b03166001600160a01b031681526020019081526020016000206040518060a00160405280600660ff1681526020018d61ffff168152602001836001600160a01b0316815260200187815260200185815250908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a8154816001600160a01b0302191690836001600160a01b03160217905550606082015181600101556080820151816002019081610e8b91906147c6565b5050507f625e414eb59af4cd7008514584def3eb126bd7dfa3c4fbd57a777094b25f189e8b828785604051610a099493929190614885565b60011960ff821601610fbe57600080600084806020019051810190610ee89190614973565b60148082015190840151939750919550935091506000610f088b8361373b565b905084816002016000828254610f1e9190614960565b90915550506005810154604051632770a7eb60e21b8152306004820152602481018790526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b158015610f7157600080fd5b505af1158015610f85573d6000803e3d6000fd5b505050507f78a69f71ee39abd80fbf72dc912c223a1dbb804954f147efad2b82d934ee162c8b838786604051610a099493929190614885565b60021960ff8216016110c357600080600084806020019051810190610fe39190614973565b601480820151908401519397509195509350915060006110038b8361373b565b600581015460405163a9059cbb60e01b81526001600160a01b0386811660048301526024820189905292935091169063a9059cbb906044016020604051808303816000875af115801561105a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107e9190614a65565b507f0202af0014658b1e2d1ab8d03a895efb7ec37da094878cecdf10e4e608d91e4c8b8387866040516110b49493929190614885565b60405180910390a15050505050505b5050505050565b6000546001600160a01b031633146110f45760405162461bcd60e51b815260040161086d90614a82565b6002546040516307e0db1760e01b815261ffff831660048201526001600160a01b03909116906307e0db17906024015b600060405180830381600087803b15801561113e57600080fd5b505af11580156110c3573d6000803e3d6000fd5b61115a613888565b6000611166848461373b565b9050818160030154101561118c5760405162461bcd60e51b815260040161086d90614ab7565b6005810154604051632770a7eb60e21b8152336004820152602481018490526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b1580156111da57600080fd5b505af11580156111ee573d6000803e3d6000fd5b50505050818160030160008282546112069190614960565b909155505080546112269061010090046001600160a01b03163384613825565b805460405160009160059161124c9161010090046001600160a01b031690602001614aee565b60408051601f198184030181529082905261126c92918690602001614b0b565b604051602081830303815290604052905061129b600583836000604051806020016040528060008152506138e1565b7fb048ed97e912f8cd58c0fa38e3251ed8bb09ff18d5888ad21a6f84096c5273378585856040516112ce93929190614a40565b60405180910390a150506112e160018055565b505050565b6000546001600160a01b031633146113105760405162461bcd60e51b815260040161086d90614a82565b6002546040516310ddb13760e01b815261ffff831660048201526001600160a01b03909116906310ddb13790602401611124565b6000806000611353868661373b565b6040805161012081018252825460ff808216151583526101008083046001600160a01b039081166020860152600160a81b90930461ffff169484019490945260018501548216606084015260028086015460808501819052600387015460a08601819052600488015460c087015260059097015493841660e0860152600160a01b9093049091161515938301939093529093506000926113f3919061494d565b6113fd9190614b37565b60035460a0840151604051634bcc856560e01b8152600481018490526024810191909152604481018890529192506001600160a01b031690634bcc856590606401602060405180830381865afa15801561145b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147f9190614b59565b93506000600360009054906101000a90046001600160a01b03166001600160a01b0316634722b4a56040518163ffffffff1660e01b815260040160a060405180830381865afa1580156114d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114fa9190614b72565b505050509050670de0b6b3a764000081876115159190614bb2565b61151f9190614b37565b9350505050935093915050565b611534613888565b60148101516000611545878761373b565b90506001600160a01b03821661159d5760405162461bcd60e51b815260206004820152601f60248201527f416c7469747564653a207377617020746f207a65726f20616464726573732e00604482015260640161086d565b84816002015410156115c15760405162461bcd60e51b815260040161086d90614ab7565b6005810154600160a01b900460ff161561161d5760405162461bcd60e51b815260206004820152601960248201527f416c7469747564653a2073776170732064697361626c65642e00000000000000604482015260640161086d565b80546116399061010090046001600160a01b0316333088613992565b805460405160009160019161165f9161010090046001600160a01b031690602001614aee565b6040516020818303038152906040528786336040516020016116819190614aee565b60408051601f19818403018152908290526116a29594939291602001614bc9565b60405160208183030381529060405290506116c16001838388886138e1565b7fcb8ff592f9ad638556bf9cd980dbbfb25a4c4871a9bb03279bb324ec7f18e75b888888876040516116f69493929190614c1d565b60405180910390a15050506110c360018055565b611712613888565b60148101516000611723878761373b565b90506001600160a01b0382166117895760405162461bcd60e51b815260206004820152602560248201527f416c7469747564653a207769746864726177616c20746f207a65726f206164646044820152643932b9b99760d91b606482015260840161086d565b848160030154106117e85760405162461bcd60e51b8152602060048201526024808201527f416c7469747564653a2073756666696369656e74206c6f63616c206c697175696044820152636469747960e01b606482015260840161086d565b848160020154101561180c5760405162461bcd60e51b815260040161086d90614ab7565b60058101546040516370a0823160e01b815233600482015286916001600160a01b0316906370a0823190602401602060405180830381865afa158015611856573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187a9190614b59565b10156118c85760405162461bcd60e51b815260206004820152601e60248201527f416c7469747564653a206e6f7420656e6f756768204c5020746f6b656e730000604482015260640161086d565b60058101546118e2906001600160a01b0316333088613992565b80546040516000916006916119089161010090046001600160a01b031690602001614aee565b60405160208183030381529060405287863360405160200161192a9190614aee565b60408051601f198184030181529082905261194b9594939291602001614bc9565b604051602081830303815290604052905061196a6006838388886138e1565b7fec113fca99a607dc1ec5035d2709619c47df9f7a4b8c5994319cd0fb9c6b3559888888336040516116f69493929190614885565b6000806119ac858561373b565b6040805161012081018252825460ff808216151583526101008083046001600160a01b039081166020860152600160a81b90930461ffff169484019490945260018501548216606084015260028086015460808501819052600387015460a08601819052600488015460c087015260059097015493841660e0860152600160a01b909304909116151593830193909352909350600092611a4c919061494d565b611a569190614b37565b90508082608001511015611aab576000826080015182611a769190614960565b905080858460c00151611a899190614bb2565b611a939190614b37565b93508260c00151841115611aa9578260c0015193505b505b50509392505050565b600a6020528160005260406000208181548110611ad057600080fd5b600091825260209091206003909102018054600182015460028301805460ff84169650610100840461ffff16955063010000009093046001600160a01b0316939192611b1b906145eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611b47906145eb565b8015611b945780601f10611b6957610100808354040283529160200191611b94565b820191906000526020600020905b815481529060010190602001808311611b7757829003601f168201915b5050505050905085565b6000546001600160a01b03163314611bc85760405162461bcd60e51b815260040161086d90614a82565b6002546040516342d65a8d60e01b81526001600160a01b03909116906342d65a8d90611bfc90869086908690600401614c81565b600060405180830381600087803b158015611c1657600080fd5b505af1158015611c2a573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b03163314611c5d5760405162461bcd60e51b815260040161086d90614a82565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611ca95760405162461bcd60e51b815260040161086d90614a82565b818130604051602001611cbe93929190614ca8565b60408051601f1981840301815291815261ffff8516600090815260096020522090611ce990826147c6565b50505050565b6000546001600160a01b03163314611d195760405162461bcd60e51b815260040161086d90614a82565b6000611d25848461373b565b6005018054921515600160a01b0260ff60a01b1990931692909217909155505050565b6000546001600160a01b03163314611d725760405162461bcd60e51b815260040161086d90614a82565b6000611d7e858561373b565b90508281600401541015611de75760405162461bcd60e51b815260206004820152602a60248201527f416c7469747564653a206e6f7420656e6f7567682066756e647320696e2072656044820152693bb0b932103837b7b61760b11b606482015260840161086d565b80546040516323b872dd60e01b81523060048201526001600160a01b03848116602483015260448201869052610100909204909116906323b872dd906064016020604051808303816000875af1158015611e45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e699190614a65565b5082816004016000828254611e7e9190614960565b90915550505050505050565b6000546001600160a01b03163314611eb45760405162461bcd60e51b815260040161086d90614a82565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b604080516101208101825260008082526020808301829052828401829052606083018290526080830182905260a0830182905260c0830182905260e08301829052610100830182905261ffff86168252600781528382206001600160a01b0386168352905291822054600580549293929091908110611f7f57611f7f614cce565b600091825260209182902060408051610120810182526006909302909101805460ff808216151585526001600160a01b0361010080840482169787019790975261ffff600160a81b909304831694860185905260018401548116606087015260028401546080870152600384015460a0870152600484015460c087015260059093015492831660e0860152600160a01b9092049091161515938301939093529092509085161480156120465750826001600160a01b031681606001516001600160a01b0316145b6120625760405162461bcd60e51b815260040161086d90614ce4565b90505b92915050565b60096020526000908152604090208054612084906145eb565b80601f01602080910402602001604051908101604052809291908181526020018280546120b0906145eb565b80156120fd5780601f106120d2576101008083540402835291602001916120fd565b820191906000526020600020905b8154815290600101906020018083116120e057829003601f168201915b505050505081565b61210d613888565b336000908152600a6020526040812080548390811061212e5761212e614cce565b60009182526020822060039091020180549092506121669061ffff610100820416906001600160a01b0363010000009091041661373b565b825490915060ff166000190161225657805460405160009160039161219c9161010090046001600160a01b031690602001614aee565b60408051601f198184030181529082905260018601546121c493926002880190602001614da9565b60405160208183030381529060405290506121f3600383836000604051806020016040528060008152506138e1565b8154600180840154908501546040517f7174c8967828cbed2f4b2522ef60cfa36335be020fb48f61f5934adcf8b4ce809361224893600160a81b90910461ffff16926001600160a01b03909116913390614885565b60405180910390a15061233f565b815460ff166005190161233f5780546040516000916008916122899161010090046001600160a01b031690602001614aee565b60408051601f198184030181529082905260018601546122b193926002880190602001614da9565b60405160208183030381529060405290506122e0600883836000604051806020016040528060008152506138e1565b8154600180840154908501546040517fc5fc5361f0a29148280e13304c1c3932bf30bd6d50e46547d41d5e428fb4f06b9361233593600160a81b90910461ffff16926001600160a01b03909116913390614885565b60405180910390a1505b336000908152600a6020526040902080549061235c600183614960565b8154811061236c5761236c614cce565b9060005260206000209060030201600a6000336001600160a01b03166001600160a01b0316815260200190815260200160002085815481106123b0576123b0614cce565b600091825260209091208254600390920201805460ff19811660ff9093169283178255835461ffff61010091829004160262ffffff199091169092179190911780825582546001600160a01b0363010000009182900416026301000000600160b81b03199091161781556001808301549082015560028082019061243690840182614ddd565b5050336000908152600a6020526040902080549091508061245957612459614eaf565b60008281526020812060036000199093019283020180546001600160b81b031916815560018101829055906124916002830182613d92565b505090555050506124a160018055565b50565b6000806124b1878761373b565b6040805161012081018252825460ff808216151583526101008083046001600160a01b039081166020860152600160a81b90930461ffff1694840194909452600180860154831660608086019190915260028701546080860152600387015460a0860152600487015460c086015260059096015492831660e0850152600160a01b9092048116151593830193909352909350908a16148061255557508860ff166006145b156125ac57600182602001516040516020016125719190614aee565b60408051601f1981840301815290829052612596929160009088908b90602001614ec5565b60405160208183030381529060405290506126bb565b8860ff166002036125f557600282602001516040516020016125ce9190614aee565b60408051601f19818403018152908290526125969291600090819081908a90602001614efc565b8860ff166003148061260a57508860ff166007145b8061261857508860ff166008145b1561265757600282602001516040516020016126349190614aee565b60408051601f198184030181529082905261259692916000908890602001614f52565b8860ff166004148061266c57508860ff166005145b156126bb57600482602001516040516020016126889190614aee565b60408051601f19818403018152908290526126a99291600090602001614f89565b60405160208183030381529060405290505b60006126c98a8a88886139ca565b60025460405163040a7bb160e41b81529192506000916001600160a01b03909116906340a7bb1090612707908d903090889087908990600401614fb8565b6040805180830381865afa158015612723573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127479190615000565b509b9a5050505050505050505050565b61275f613888565b336000908152600a6020526040812080548390811061278057612780614cce565b60009182526020822060039091020180549092506127b89061ffff610100820416906001600160a01b0363010000009091041661373b565b825490915060ff1660001901612a09578160010154816003015410156127f05760405162461bcd60e51b815260040161086d90614ab7565b805460018083015490840154600092839261282392600160a81b90920461ffff16916001600160a01b0390911690611344565b90925090506000612834828461494d565b85600101546128439190614960565b84546001808701549088015492935060009261287492600160a81b900461ffff16916001600160a01b03169061199f565b90508085600401600082825461288a9190614960565b92505081905550818560030160008282546128a59190614960565b92505081905550818560020160008282546128c0919061494d565b909155506128eb9050336128d4838561494d565b875461010090046001600160a01b03169190613825565b84546040516000916002916129119161010090046001600160a01b031690602001614aee565b60405160208183030381529060405288600101548787336040516020016129389190614aee565b60408051601f198184030181529082905261295a969594939291602001615024565b6040516020818303038152906040529050612989600287836000604051806020016040528060008152506138e1565b8554600187015460408051600160a81b90930461ffff1683526001600160a01b03909116602083015281018490523360608201526080810183905260a0810186905260c081018590527fb76e1253ca2b5a7dabb38df18c83579ffdee45ae2898e934321dbdb838d454fe9060e00160405180910390a1505050505061233f565b815460ff166005190161233f57816001015481600301541015612a3e5760405162461bcd60e51b815260040161086d90614ab7565b8160010154816003016000828254612a569190614960565b909155505060018201548154612a7d916101009091046001600160a01b0316903390613825565b8054604051600091600791612aa39161010090046001600160a01b031690602001614aee565b604051602081830303815290604052846001015433604051602001612ac89190614aee565b60408051601f1981840301815290829052612ae894939291602001615064565b6040516020818303038152906040529050612b17600783836000604051806020016040528060008152506138e1565b8154600180840154908501546040517f07d3caa0e08fba164878823c79fbbe40fd0dcf5f2ab7d03ab3d4709d8b87324c9361233593600160a81b90910461ffff16926001600160a01b03909116913390614885565b6000546001600160a01b03163314612b965760405162461bcd60e51b815260040161086d90614a82565b6000612ba2838361373b565b805490915060ff1615612c055760405162461bcd60e51b815260206004820152602560248201527f416c7469747564653a20636861696e5061746820697320616c72656164792061604482015264637469766560d81b606482015260840161086d565b805460ff191660011790555050565b60058181548110612c2457600080fd5b600091825260209091206006909102018054600182015460028301546003840154600485015460059095015460ff808616975061010086046001600160a01b0390811697600160a81b90970461ffff1696958116959290811691600160a01b9091041689565b6000546001600160a01b03163314612cb45760405162461bcd60e51b815260040161086d90614a82565b60005b600554811015612e3257600060058281548110612cd657612cd6614cce565b6000918252602080832060408051610120810182526006909402909101805460ff808216151586526001600160a01b0361010080840482169688019690965261ffff600160a81b909304831694870185905260018401548116606088015260028401546080880152600384015460a0880152600484015460c088015260059093015492831660e0870152600160a01b9092049091161515928401929092529193508816148015612d9b5750856001600160a01b031682606001516001600160a01b0316145b90508015612e1f5760405162461bcd60e51b8152602060048201526044602482018190527f416c7469747564653a2063616e7420637265617465436861696e50617468206f908201527f66206578697374696e67205f647374436861696e496420616e64205f6473745460648201526337b5b2b760e11b608482015260a40161086d565b505080612e2b90615098565b9050612cb7565b5060055461ffff851660009081526007602090815260408083206001600160a01b038089168552925280832093909355600480549351635e867ae360e01b8152929390911691635e867ae391612e8c9187918791016150b1565b6020604051808303816000875af1158015612eab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ecf91906150d6565b90506005604051806101200160405280600015158152602001886001600160a01b031681526020018761ffff168152602001866001600160a01b03168152602001600081526020016000815260200160008152602001836001600160a01b0316815260200160001515815250908060018154018082558091505060019003906000526020600020906006020160009091909190915060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160000160156101000a81548161ffff021916908361ffff16021790555060608201518160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506080820151816002015560a0820151816003015560c0820151816004015560e08201518160050160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506101008201518160050160146101000a81548160ff0219169083151502179055505050505050505050565b6000546001600160a01b031633146130a15760405162461bcd60e51b815260040161086d90614a82565b6002546040516332fb62e760e21b81526001600160a01b039091169063cbed8b9c906130d990889088908890889088906004016150f3565b600060405180830381600087803b1580156130f357600080fd5b505af1158015613107573d6000803e3d6000fd5b505050505050505050565b6000546001600160a01b0316331461313c5760405162461bcd60e51b815260040161086d90614a82565b6000613148848461373b565b80546040516323b872dd60e01b81523360048201523060248201526044810185905291925061010090046001600160a01b0316906323b872dd906064016020604051808303816000875af11580156131a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131c89190614a65565b50818160040160008282546131dd919061494d565b909155505050505050565b6131f0613888565b60006131fc848461373b565b805490915060ff16151560011461325f5760405162461bcd60e51b815260206004820152602160248201527f416c7469747564653a20636861696e50617468206973206e6f742061637469766044820152606560f81b606482015260840161086d565b805461327b9061010090046001600160a01b0316333085613992565b60058101546040516340c10f1960e01b8152336004820152602481018490526001600160a01b03909116906340c10f1990604401600060405180830381600087803b1580156132c957600080fd5b505af11580156132dd573d6000803e3d6000fd5b50505050818160030160008282546132f5919061494d565b909155505080546040516000916004916133209161010090046001600160a01b031690602001614aee565b60408051601f198184030181529082905261334092918690602001614b0b565b604051602081830303815290604052905061336f600483836000604051806020016040528060008152506138e1565b7f2e8d5f9395b4e4b2cbe364c1b86e90bdbd7fcbbeca7559ae43cc2a05f208dbb28585856040516112ce93929190614a40565b6001600160a01b0381166000908152600a60209081526040808320805482518185028101850190935280835260609492939192909184015b828210156134de5760008481526020908190206040805160a08101825260038602909201805460ff81168452610100810461ffff169484019490945263010000009093046001600160a01b0316908201526001820154606082015260028201805491929160808401919061344d906145eb565b80601f0160208091040260200160405190810160405280929190818152602001828054613479906145eb565b80156134c65780601f1061349b576101008083540402835291602001916134c6565b820191906000526020600020905b8154815290600101906020018083116134a957829003601f168201915b505050505081525050815260200190600101906133da565b505050509050919050565b6000546001600160a01b031633146135135760405162461bcd60e51b815260040161086d90614a82565b6001600160a01b0381166135785760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161086d565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146135fd5760405162461bcd60e51b815260040161086d90614a82565b6001600160a01b0381166136665760405162461bcd60e51b815260206004820152602a60248201527f416c7469747564653a20726563697069656e742063616e2774206265207a6572604482015269379030b2323932b9b99760b11b606482015260840161086d565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146136b25760405162461bcd60e51b815260040161086d90614a82565b60018260ff16101580156136ca575060088260ff1611155b6137165760405162461bcd60e51b815260206004820152601f60248201527f416c7469747564653a20696e76616c6964205f66756e6374696f6e5479706500604482015260640161086d565b61ffff909216600090815260086020908152604080832060ff90941683529290522055565b60055460009061378d5760405162461bcd60e51b815260206004820152601d60248201527f416c7469747564653a206e6f20636861696e7061746873206578697374000000604482015260640161086d565b61ffff831660009081526007602090815260408083206001600160a01b03861684529091528120546005805490919081106137ca576137ca614cce565b60009182526020909120600690910201805490915061ffff858116600160a81b90920416148015612046575060018101546001600160a01b038481169116146120625760405162461bcd60e51b815260040161086d90614ce4565b6040516001600160a01b0383166024820152604481018290526112e190849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613a45565b6002600154036138da5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161086d565b6002600155565b83546000906138ff908790600160a81b900461ffff16868686613b17565b6002548654600160a81b900461ffff1660008181526009602052604090819020905162c5803160e81b81529394506001600160a01b039092169263c5803100923492613958929091908a90339030908a90600401615121565b6000604051808303818588803b15801561397157600080fd5b505af1158015613985573d6000803e3d6000fd5b5050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611ce99085906323b872dd60e01b90608401613851565b61ffff8316600090815260086020908152604080832060ff8816845290915290205460609081908415613a0957613a02818686613c39565b9150613a39565b613a368160408051600160f01b602082015260228082019390935281518082039093018352604201905290565b91505b5090505b949350505050565b6000613a9a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613c6f9092919063ffffffff16565b8051909150156112e15780806020019051810190613ab89190614a65565b6112e15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161086d565b6060613b25868685856139ca565b60025460405163040a7bb160e41b81529192506000916001600160a01b03909116906340a7bb1090613b6390899030908a9087908990600401614fb8565b6040805180830381865afa158015613b7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ba39190615000565b50905080341015613c2f5760405162461bcd60e51b815260206004820152604a60248201527f416c7469747564653a20696e73756666696369656e74206d73672e76616c756560448201527f20746f2070617920746f204c617965725a65726f20666f72206d657373616765606482015269103232b634bb32b93c9760b11b608482015260a40161086d565b5095945050505050565b604051606090600290613c5690829087908790879060200161517b565b6040516020818303038152906040529150509392505050565b6060613a3d848460008585600080866001600160a01b03168587604051613c9691906151b9565b60006040518083038185875af1925050503d8060008114613cd3576040519150601f19603f3d011682016040523d82523d6000602084013e613cd8565b606091505b5091509150613ce987838387613cf4565b979650505050505050565b60608315613d63578251600003613d5c576001600160a01b0385163b613d5c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161086d565b5081613a3d565b613a3d8383815115613d785781518083602001fd5b8060405162461bcd60e51b815260040161086d9190614351565b508054613d9e906145eb565b6000825580601f10613dae575050565b601f0160209004906000526020600020908101906124a191905b80821115613ddc5760008155600101613dc8565b5090565b803561ffff81168114613df257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613e3557613e35613df7565b604052919050565b60006001600160401b03821115613e5657613e56613df7565b50601f01601f191660200190565b600082601f830112613e7557600080fd5b8135613e88613e8382613e3d565b613e0d565b818152846020838601011115613e9d57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215613ed057600080fd5b613ed985613de0565b935060208501356001600160401b0380821115613ef557600080fd5b613f0188838901613e64565b9450604087013591508082168214613f1857600080fd5b90925060608601359080821115613f2e57600080fd5b50613f3b87828801613e64565b91505092959194509250565b60ff811681146124a157600080fd5b60008060408385031215613f6957600080fd5b613f7283613de0565b91506020830135613f8281613f47565b809150509250929050565b600060208284031215613f9f57600080fd5b613fa882613de0565b9392505050565b6001600160a01b03811681146124a157600080fd5b600080600060608486031215613fd957600080fd5b613fe284613de0565b92506020840135613ff281613faf565b929592945050506040919091013590565b600080600080600060a0868803121561401b57600080fd5b61402486613de0565b9450602086013561403481613faf565b9350604086013592506060860135915060808601356001600160401b0381111561405d57600080fd5b61406988828901613e64565b9150509295509295909350565b6000806040838503121561408957600080fd5b823561409481613faf565b946020939093013593505050565b60005b838110156140bd5781810151838201526020016140a5565b50506000910152565b600081518084526140de8160208601602086016140a2565b601f01601f19169290920160200192915050565b60ff8616815261ffff8516602082015260018060a01b038416604082015282606082015260a060808201526000613ce960a08301846140c6565b60008083601f84011261413e57600080fd5b5081356001600160401b0381111561415557600080fd5b60208301915083602082850101111561416d57600080fd5b9250929050565b60008060006040848603121561418957600080fd5b61419284613de0565b925060208401356001600160401b038111156141ad57600080fd5b6141b98682870161412c565b9497909650939450505050565b6000602082840312156141d857600080fd5b813561206281613faf565b80151581146124a157600080fd5b60008060006060848603121561420657600080fd5b61420f84613de0565b9250602084013561421f81613faf565b9150604084013561422f816141e3565b809150509250925092565b6000806000806080858703121561425057600080fd5b61425985613de0565b9350602085013561426981613faf565b925060408501359150606085013561428081613faf565b939692955090935050565b6000806040838503121561429e57600080fd5b6142a783613de0565b91506020830135613f8281613faf565b8151151581526020808301516001600160a01b0316908201526040808301516101208301916142eb9084018261ffff169052565b50606083015161430660608401826001600160a01b03169052565b506080830151608083015260a083015160a083015260c083015160c083015260e083015161433f60e08401826001600160a01b03169052565b50610100928301511515919092015290565b602081526000613fa860208301846140c6565b60006020828403121561437657600080fd5b5035919050565b60008060008060008060c0878903121561439657600080fd5b86356143a181613f47565b95506143af60208801613de0565b945060408701356143bf81613faf565b935060608701356001600160401b03808211156143db57600080fd5b6143e78a838b01613e64565b94506080890135935060a089013591508082111561440457600080fd5b5061441189828a01613e64565b9150509295509295509295565b600080600080600060a0868803121561443657600080fd5b853561444181613faf565b945061444f60208701613de0565b9350604086013561445f81613faf565b925060608601356001600160401b038082111561447b57600080fd5b61448789838a01613e64565b9350608088013591508082111561449d57600080fd5b5061406988828901613e64565b6000806000806000608086880312156144c257600080fd5b6144cb86613de0565b94506144d960208701613de0565b93506040860135925060608601356001600160401b038111156144fb57600080fd5b6145078882890161412c565b969995985093965092949392505050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b838110156145af57888303603f190185528151805160ff1684528781015161ffff1688850152868101516001600160a01b0316878501526060808201519085015260809081015160a09185018290529061459b818601836140c6565b96890196945050509086019060010161453f565b509098975050505050505050565b6000806000606084860312156145d257600080fd5b6145db84613de0565b92506020840135613ff281613f47565b600181811c908216806145ff57607f821691505b60208210810361461f57634e487b7160e01b600052602260045260246000fd5b50919050565b6000808354614633816145eb565b6001828116801561464b57600181146146605761468f565b60ff198416875282151583028701945061468f565b8760005260208060002060005b858110156146865781548a82015290840190820161466d565b50505082870194505b50929695505050505050565b600082601f8301126146ac57600080fd5b81516146ba613e8382613e3d565b8181528460208386010111156146cf57600080fd5b613a3d8260208301602087016140a2565b600080600080600060a086880312156146f857600080fd5b855161470381613f47565b60208701519095506001600160401b038082111561472057600080fd5b61472c89838a0161469b565b955060408801519450606088015191508082111561474957600080fd5b61475589838a0161469b565b9350608088015191508082111561476b57600080fd5b506140698882890161469b565b601f8211156112e157600081815260208120601f850160051c8101602086101561479f5750805b601f850160051c820191505b818110156147be578281556001016147ab565b505050505050565b81516001600160401b038111156147df576147df613df7565b6147f3816147ed84546145eb565b84614778565b602080601f83116001811461482857600084156148105750858301515b600019600386901b1c1916600185901b1785556147be565b600085815260208120601f198616915b8281101561485757888601518255948401946001909101908401614838565b50858210156148755787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff9490941684526001600160a01b039283166020850152604084019190915216606082015260800190565b60008060008060008060c087890312156148cb57600080fd5b86516148d681613f47565b60208801519096506001600160401b03808211156148f357600080fd5b6148ff8a838b0161469b565b965060408901519550606089015194506080890151935060a089015191508082111561492a57600080fd5b5061441189828a0161469b565b634e487b7160e01b600052601160045260246000fd5b8082018082111561206557612065614937565b8181038181111561206557612065614937565b6000806000806080858703121561498957600080fd5b845161499481613f47565b60208601519094506001600160401b03808211156149b157600080fd5b6149bd8883890161469b565b94506040870151935060608701519150808211156149da57600080fd5b50613f3b8782880161469b565b6000806000606084860312156149fc57600080fd5b8351614a0781613f47565b60208501519093506001600160401b03811115614a2357600080fd5b614a2f8682870161469b565b925050604084015190509250925092565b61ffff9390931683526001600160a01b03919091166020830152604082015260600190565b600060208284031215614a7757600080fd5b8151612062816141e3565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601e908201527f416c7469747564653a206e6f7420656e6f756768206c69717569646974790000604082015260600190565b60609190911b6bffffffffffffffffffffffff1916815260140190565b60ff84168152606060208201526000614b2760608301856140c6565b9050826040830152949350505050565b600082614b5457634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215614b6b57600080fd5b5051919050565b600080600080600060a08688031215614b8a57600080fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b808202811582820484141761206557612065614937565b60ff8616815260a060208201526000614be560a08301876140c6565b8560408401528281036060840152614bfd81866140c6565b90508281036080840152614c1181856140c6565b98975050505050505050565b61ffff8516815260018060a01b0384166020820152826040820152608060608201526000614c4e60808301846140c6565b9695505050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b61ffff84168152604060208201526000614c9f604083018486614c58565b95945050505050565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b634e487b7160e01b600052603260045260246000fd5b60208082526028908201527f416c7469747564653a206c6f63616c20636861696e5061746820646f6573206e6040820152671bdd08195e1a5cdd60c21b606082015260800190565b60008154614d39816145eb565b808552602060018381168015614d565760018114614d7057614d9e565b60ff1985168884015283151560051b880183019550614d9e565b866000528260002060005b85811015614d965781548a8201860152908301908401614d7b565b890184019650505b505050505092915050565b60ff85168152608060208201526000614dc560808301866140c6565b8460408401528281036060840152613ce98185614d2c565b818103614de8575050565b614df282546145eb565b6001600160401b03811115614e0957614e09613df7565b614e17816147ed84546145eb565b6000601f821160018114614e4b5760008315614e335750848201545b600019600385901b1c1916600184901b1784556110c3565b600085815260209020601f19841690600086815260209020845b83811015614e855782860154825560019586019590910190602001614e65565b50858310156148755793015460001960f8600387901b161c19169092555050600190811b01905550565b634e487b7160e01b600052603160045260246000fd5b60ff8616815260a060208201526000614ee160a08301876140c6565b60ff861660408401528281036060840152614bfd81866140c6565b60ff8716815260c060208201526000614f1860c08301886140c6565b60ff8716604084015260ff8616606084015260ff8516608084015282810360a0840152614f4581856140c6565b9998505050505050505050565b60ff85168152608060208201526000614f6e60808301866140c6565b60ff851660408401528281036060840152613ce981856140c6565b60ff84168152606060208201526000614fa560608301856140c6565b905060ff83166040830152949350505050565b61ffff861681526001600160a01b038516602082015260a060408201819052600090614fe6908301866140c6565b84151560608401528281036080840152614c1181856140c6565b6000806040838503121561501357600080fd5b505080516020909101519092909150565b60ff8716815260c06020820152600061504060c08301886140c6565b86604084015285606084015284608084015282810360a0840152614f4581856140c6565b60ff8516815260806020820152600061508060808301866140c6565b8460408401528281036060840152613ce981856140c6565b6000600182016150aa576150aa614937565b5060010190565b6040815260006150c460408301856140c6565b8281036020840152614c9f81856140c6565b6000602082840312156150e857600080fd5b815161206281613faf565b600061ffff808816835280871660208401525084604083015260806060830152613ce9608083018486614c58565b61ffff8716815260c06020820152600061513e60c0830188614d2c565b828103604084015261515081886140c6565b6001600160a01b0387811660608601528616608085015283810360a08501529050614f4581856140c6565b61ffff60f01b8560f01b168152836002820152826022820152600082516151a98160428501602087016140a2565b9190910160420195945050505050565b600082516151cb8184602087016140a2565b919091019291505056fea2646970667358221220909c46167e483059649bce247af82d5705c63310d48aba9c741c702e3a474e7064736f6c63430008120033

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

000000000000000000000000f69186dfba60ddb133e91e9a4b5673624293d8f80000000000000000000000008eeb0e9c984cf380856f5e23dc3379d81af77807000000000000000000000000f6d5a6352b7ebfe49048d29cfc3ea47c2a19af3a

-----Decoded View---------------
Arg [0] : _endpoint (address): 0xf69186dfBa60DdB133E91E9A4B5673624293d8F8
Arg [1] : _altitudeFee (address): 0x8EEb0E9c984CF380856F5E23dc3379D81Af77807
Arg [2] : _altitudeFactory (address): 0xf6d5a6352b7EbFE49048D29CFc3Ea47C2A19aF3A

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000f69186dfba60ddb133e91e9a4b5673624293d8f8
Arg [1] : 0000000000000000000000008eeb0e9c984cf380856f5e23dc3379d81af77807
Arg [2] : 000000000000000000000000f6d5a6352b7ebfe49048d29cfc3ea47c2a19af3a


Deployed Bytecode Sourcemap

35006:31763:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54450:6240;;;;;;;;;;-1:-1:-1;54450:6240:0;;;;;:::i;:::-;;:::i;36378:20::-;;;;;;;;;;-1:-1:-1;36378:20:0;;;;-1:-1:-1;;;;;36378:20:0;;;;;;-1:-1:-1;;;;;2294:32:1;;;2276:51;;2264:2;2249:18;36378:20:0;;;;;;;;36539:61;;;;;;;;;;-1:-1:-1;36539:61:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;2923:25:1;;;2911:2;2896:18;36539:61:0;2777:177:1;36216:43:0;;;;;;;;;;-1:-1:-1;36216:43:0;;;;-1:-1:-1;;;;;36216:43:0;;;66230:128;;;;;;;;;;-1:-1:-1;66230:128:0;;;;;:::i;:::-;;:::i;46874:865::-;;;;;;:::i;:::-;;:::i;66366:134::-;;;;;;;;;;-1:-1:-1;66366:134:0;;;;;:::i;:::-;;:::i;60838:490::-;;;;;;;;;;-1:-1:-1;60838:490:0;;;;;:::i;:::-;;:::i;:::-;;;;4085:25:1;;;4141:2;4126:18;;4119:34;;;;4058:18;60838:490:0;3911:248:1;43911:1614:0;;;;;;:::i;:::-;;:::i;36304:31::-;;;;;;;;;;-1:-1:-1;36304:31:0;;;;-1:-1:-1;;;;;36304:31:0;;;48004:1868;;;;;;:::i;:::-;;:::i;61336:639::-;;;;;;;;;;-1:-1:-1;61336:639:0;;;;;:::i;:::-;;:::i;36730:58::-;;;;;;;;;;-1:-1:-1;36730:58:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;66508:185::-;;;;;;;;;;-1:-1:-1;66508:185:0;;;;;:::i;:::-;;:::i;43015:130::-;;;;;;;;;;-1:-1:-1;43015:130:0;;;;;:::i;:::-;;:::i;40719:213::-;;;;;;;;;;-1:-1:-1;40719:213:0;;;;;:::i;:::-;;:::i;43225:210::-;;;;;;;;;;-1:-1:-1;43225:210:0;;;;;:::i;:::-;;:::i;42274:402::-;;;;;;;;;;-1:-1:-1;42274:402:0;;;;;:::i;:::-;;:::i;24465:148::-;;;;;;;;;;;;;:::i;62547:339::-;;;;;;;;;;-1:-1:-1;62547:339:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;36672:51::-;;;;;;;;;;-1:-1:-1;36672:51:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;52540:1233::-;;;;;;:::i;:::-;;:::i;63505:1204::-;;;;;;;;;;-1:-1:-1;63505:1204:0;;;;;:::i;:::-;;:::i;23814:87::-;;;;;;;;;;-1:-1:-1;23860:7:0;23887:6;-1:-1:-1;;;;;23887:6:0;23814:87;;49992:2429;;;;;;:::i;:::-;;:::i;40170:315::-;;;;;;;;;;-1:-1:-1;40170:315:0;;;;;:::i;:::-;;:::i;36342:29::-;;;;;;;;;;-1:-1:-1;36342:29:0;;;;;:::i;:::-;;:::i;:::-;;;;11962:14:1;;11955:22;11937:41;;-1:-1:-1;;;;;12052:15:1;;;12047:2;12032:18;;12025:43;12116:6;12104:19;;;12084:18;;;12077:47;;;;12160:15;;;12155:2;12140:18;;12133:43;12207:3;12192:19;;12185:35;;;;12005:3;12236:19;;12229:35;12295:3;12280:19;;12273:35;12345:15;;;;12339:3;12324:19;;12317:44;12405:14;12398:22;12392:3;12377:19;;12370:51;11924:3;11909:19;36342:29:0;11580:847:1;39272:709:0;;;;;;;;;;-1:-1:-1;39272:709:0;;;;;:::i;:::-;;:::i;36266:31::-;;;;;;;;;;-1:-1:-1;36266:31:0;;;;-1:-1:-1;;;;;36266:31:0;;;36405:74;;;;;;;;;;-1:-1:-1;36405:74:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;66008:214;;;;;;;;;;-1:-1:-1;66008:214:0;;;;;:::i;:::-;;:::i;41730:299::-;;;;;;;;;;-1:-1:-1;41730:299:0;;;;;:::i;:::-;;:::i;45770:845::-;;;;;;:::i;:::-;;:::i;65727:133::-;;;;;;;;;;-1:-1:-1;65727:133:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;24768:244::-;;;;;;;;;;-1:-1:-1;24768:244:0;;;;;:::i;:::-;;:::i;42755:172::-;;;;;;;;;;-1:-1:-1;42755:172:0;;;;;:::i;:::-;;:::i;41221:266::-;;;;;;;;;;-1:-1:-1;41221:266:0;;;;;:::i;:::-;;:::i;54450:6240::-;54616:17;;-1:-1:-1;;;;;54616:17:0;54594:10;:40;54586:49;;;;;;54690:32;;;;;;;:19;:32;;;;;:39;;;;;:::i;:::-;;;54668:11;:18;:61;:134;;;;-1:-1:-1;54769:32:0;;;;;;;:19;:32;;;;;;;54759:43;;;;54769:32;54759:43;:::i;:::-;;;;;;;;54743:11;54733:22;;;;;;:69;54668:134;54646:287;;;;-1:-1:-1;;;54646:287:0;;17463:2:1;54646:287:0;;;17445:21:1;17502:3;17482:18;;;17475:31;17542:34;17522:18;;;17515:62;17613:34;17593:18;;;17586:62;17685:34;17664:19;;;17657:63;-1:-1:-1;;;17736:19:1;;;17729:38;17784:19;;54646:287:0;;;;;;;;;55043:2;55029:17;;55023:24;-1:-1:-1;;55108:25:0;;;;55104:5577;;55153:18;55173:14;55189:15;55206:17;55238:8;55227:59;;;;;;;;;;;;:::i;:::-;55150:136;;;;;;;;;55301:17;55333:23;55426:2;55422;55418:11;55412:18;55399:31;;55484:2;55477:5;55473:14;55467:21;55448:40;;55517:19;:30;55537:9;-1:-1:-1;;;;;55517:30:0;-1:-1:-1;;;;;55517:30:0;;;;;;;;;;;;55553:64;;;;;;;;35298:1;55553:64;;;;;;55574:11;55553:64;;;;;;55587:15;-1:-1:-1;;;;;55553:64:0;;;;;55604:6;55553:64;;;;55612:4;55553:64;;;55517:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;55517:101:0;;;;;-1:-1:-1;;;;;55517:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;55640:60;55652:11;55665:15;55682:6;55690:9;55640:60;;;;;;;;;:::i;:::-;;;;;;;;55135:615;;;;;;55104:5577;;;-1:-1:-1;;55760:33:0;;;;55756:4925;;55813:18;55833:14;55849:20;55871:19;55892:15;55922:8;55911:70;;;;;;;;;;;;:::i;:::-;56121:2;56113:11;;;56107:18;56168:14;;;56162:21;55810:171;;-1:-1:-1;55810:171:0;;-1:-1:-1;55810:171:0;;-1:-1:-1;55810:171:0;-1:-1:-1;55810:171:0;-1:-1:-1;56107:18:0;-1:-1:-1;55996:17:0;56235:43;56249:11;56162:21;56235:13;:43::i;:::-;56212:66;-1:-1:-1;56293:18:0;56324:26;56339:11;56324:12;:26;:::i;:::-;56314:37;;:6;:37;:::i;:::-;56293:58;;56387:10;56366:2;:17;;;:31;;;;;;;:::i;:::-;;;;;;;;56434:10;56412:2;:18;;;:32;;;;;;;:::i;:::-;;;;;;;;56480:12;56459:2;:17;;;:33;;;;;;;:::i;:::-;;;;-1:-1:-1;;56540:5:0;;56514:11;;56507:52;;-1:-1:-1;;;;;56540:5:0;56514:11;;;;;;56540:5;56547:11;56507:32;:52::i;:::-;56581:101;56603:11;56616:15;56633:10;56645:9;56656:12;56670:11;56581:101;;;;;;;;;;23331:6:1;23319:19;;;;23301:38;;-1:-1:-1;;;;;23413:15:1;;;23408:2;23393:18;;23386:43;23460:2;23445:18;;23438:34;;;;23508:15;;23503:2;23488:18;;23481:43;23555:3;23540:19;;23533:35;;;;23366:3;23584:19;;23577:35;23288:3;23273:19;;23016:602;56581:101:0;;;;;;;;55795:946;;;;;;;;;55756:4925;;;-1:-1:-1;;56751:32:0;;;;56747:3934;;56803:18;56823:14;56839:15;56869:8;56858:52;;;;;;;;;;;;:::i;:::-;57050:2;57042:11;;;57036:18;57097:14;;;57091:21;56800:110;;-1:-1:-1;56800:110:0;;-1:-1:-1;56800:110:0;-1:-1:-1;57036:18:0;-1:-1:-1;56925:17:0;57164:43;57178:11;57091:21;57164:13;:43::i;:::-;57229:11;;;;-1:-1:-1;57222:51:0;;57229:11;;;-1:-1:-1;;;;;57229:11:0;57255:9;57266:6;57222:32;:51::i;:::-;57295:69;57316:11;57329:15;57346:6;57354:9;57295:69;;;;;;;;;:::i;56747:3934::-;-1:-1:-1;;57434:34:0;;;;57430:3251;;57488:18;57508:14;57537:8;57526:45;;;;;;;;;;;;:::i;:::-;57688:2;57677:14;;57671:21;57485:86;;-1:-1:-1;57485:86:0;-1:-1:-1;57671:21:0;-1:-1:-1;57586:23:0;57744:43;57758:11;57671:21;57744:13;:43::i;:::-;57721:66;;57824:6;57802:2;:18;;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;;57852:57:0;;;;;;57872:11;;57885:15;;57902:6;;57852:57;:::i;:::-;;;;;;;;57470:507;;;;57430:3251;;;-1:-1:-1;;57987:43:0;;;;57983:2698;;58050:18;58070:14;58099:8;58088:45;;;;;;;;;;;;:::i;:::-;58250:2;58239:14;;58233:21;58047:86;;-1:-1:-1;58047:86:0;-1:-1:-1;58233:21:0;-1:-1:-1;58148:23:0;58306:43;58320:11;58233:21;58306:13;:43::i;:::-;58283:66;;58386:6;58364:2;:18;;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;;58414:65:0;;;;;;58442:11;;58455:15;;58472:6;;58414:65;:::i;57983:2698::-;-1:-1:-1;;58554:44:0;;;;58550:2131;;58618:18;58638:14;58654:15;58671:17;58703:8;58692:59;;;;;;;;;;;;:::i;:::-;58615:136;;;;;;;;;58766:17;58798:23;58891:2;58887;58883:11;58877:18;58864:31;;58949:2;58942:5;58938:14;58932:21;58913:40;;58982:19;:30;59002:9;-1:-1:-1;;;;;58982:30:0;-1:-1:-1;;;;;58982:30:0;;;;;;;;;;;;59018:83;;;;;;;;35579:1;59018:83;;;;;;59058:11;59018:83;;;;;;59071:15;-1:-1:-1;;;;;59018:83:0;;;;;59088:6;59018:83;;;;59096:4;59018:83;;;58982:120;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;58982:120:0;;;;;-1:-1:-1;;;;;58982:120:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;59124:77;59153:11;59166:15;59183:6;59191:9;59124:77;;;;;;;;;:::i;58550:2131::-;-1:-1:-1;;59280:33:0;;;;59276:1405;;59333:18;59353:14;59369:15;59399:8;59388:52;;;;;;;;;;;;:::i;:::-;59580:2;59572:11;;;59566:18;59627:14;;;59621:21;59330:110;;-1:-1:-1;59330:110:0;;-1:-1:-1;59330:110:0;-1:-1:-1;59566:18:0;-1:-1:-1;59455:17:0;59694:43;59708:11;59621:21;59694:13;:43::i;:::-;59671:66;;59774:6;59752:2;:18;;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;;59804:10:0;;;;59795:48;;-1:-1:-1;;;59795:48:0;;59829:4;59795:48;;;25432:51:1;25499:18;;;25492:34;;;-1:-1:-1;;;;;59804:10:0;;;;59795:25;;25405:18:1;;59795:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59865:87;59904:11;59917:15;59934:6;59942:9;59865:87;;;;;;;;;:::i;59276:1405::-;-1:-1:-1;;60044:32:0;;;;60040:641;;60096:18;60116:14;60132:15;60162:8;60151:52;;;;;;;;;;;;:::i;:::-;60343:2;60335:11;;;60329:18;60390:14;;;60384:21;60093:110;;-1:-1:-1;60093:110:0;;-1:-1:-1;60093:110:0;-1:-1:-1;60329:18:0;-1:-1:-1;60218:17:0;60457:43;60471:11;60384:21;60457:13;:43::i;:::-;60522:10;;;;60515:46;;-1:-1:-1;;;60515:46:0;;-1:-1:-1;;;;;25450:32:1;;;60515:46:0;;;25432:51:1;25499:18;;;25492:34;;;60522:10:0;;-1:-1:-1;60522:10:0;;;60515:27;;25405:18:1;;60515:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;60583:86;60621:11;60634:15;60651:6;60659:9;60583:86;;;;;;;;;:::i;:::-;;;;;;;;60078:603;;;;;;60040:641;54575:6115;54450:6240;;;;:::o;66230:128::-;23860:7;23887:6;-1:-1:-1;;;;;23887:6:0;22397:10;24034:23;24026:68;;;;-1:-1:-1;;;24026:68:0;;;;;;;:::i;:::-;66309:17:::1;::::0;:41:::1;::::0;-1:-1:-1;;;66309:41:0;;26322:6:1;26310:19;;66309:41:0::1;::::0;::::1;26292:38:1::0;-1:-1:-1;;;;;66309:17:0;;::::1;::::0;:32:::1;::::0;26265:18:1;;66309:41:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;46874:865:::0;1625:21;:19;:21::i;:::-;47164:20:::1;47187:37;47201:11;47214:9;47187:13;:37::i;:::-;47164:60;;47264:7;47243:2;:17;;;:28;;47235:71;;;;-1:-1:-1::0;;;47235:71:0::1;;;;;;;:::i;:::-;47328:10;::::0;::::1;::::0;47319:46:::1;::::0;-1:-1:-1;;;47319:46:0;;47345:10:::1;47319:46;::::0;::::1;25432:51:1::0;25499:18;;;25492:34;;;-1:-1:-1;;;;;47328:10:0;;::::1;::::0;47319:25:::1;::::0;25405:18:1;;47319:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;47397:7;47376:2;:17;;;:28;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;47422:11:0;;47415:53:::1;::::0;47422:11:::1;::::0;::::1;-1:-1:-1::0;;;;;47422:11:0::1;47448:10;47460:7:::0;47415:32:::1;:53::i;:::-;47561:11:::0;;47544:29:::1;::::0;47481:20:::1;::::0;35516:1:::1;::::0;47544:29:::1;::::0;47561:11:::1;::::0;::::1;-1:-1:-1::0;;;;;47561:11:0::1;::::0;47544:29:::1;;;:::i;:::-;;::::0;;-1:-1:-1;;47544:29:0;;::::1;::::0;;;;;;;47504:79:::1;::::0;;47575:7;;47544:29:::1;47504:79;;:::i;:::-;;;;;;;;;;;;;47481:102;;47594:66;35516:1;47640:2;47644:7;47653:1;47594:66;;;;;;;;;;;::::0;:16:::1;:66::i;:::-;47678:53;47699:11;47712:9;47723:7;47678:53;;;;;;;;:::i;:::-;;;;;;;;46990:749;;1669:20:::0;1063:1;2189:22;;2006:213;1669:20;46874:865;;;:::o;66366:134::-;23860:7;23887:6;-1:-1:-1;;;;;23887:6:0;22397:10;24034:23;24026:68;;;;-1:-1:-1;;;24026:68:0;;;;;;;:::i;:::-;66448:17:::1;::::0;:44:::1;::::0;-1:-1:-1;;;66448:44:0;;26322:6:1;26310:19;;66448:44:0::1;::::0;::::1;26292:38:1::0;-1:-1:-1;;;;;66448:17:0;;::::1;::::0;:35:::1;::::0;26265:18:1;;66448:44:0::1;26148:188:1::0;60838:490:0;60932:20;60954:19;60986;61008:37;61022:11;61035:9;61008:13;:37::i;:::-;60986:59;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;60986:59:0;;;;;;;-1:-1:-1;;;60986:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60986:59:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;61080:38:0;;60986:59;61080:38;:::i;:::-;61079:44;;;;:::i;:::-;61149:11;;61191:17;;;;61149:69;;-1:-1:-1;;;61149:69:0;;;;;27729:25:1;;;27770:18;;;27763:34;;;;27813:18;;;27806:34;;;61056:67:0;;-1:-1:-1;;;;;;61149:11:0;;:27;;27702:18:1;;61149:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61134:84;;61230:9;61247:11;;;;;;;;;-1:-1:-1;;;;;61247:11:0;-1:-1:-1;;;;;61247:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61229:48;;;;;;61316:4;61312:1;61302:7;:11;;;;:::i;:::-;:18;;;;:::i;:::-;61288:32;;60975:353;;;60838:490;;;;;;:::o;43911:1614::-;1625:21;:19;:21::i;:::-;44696:2:::1;44672:27:::0;::::1;44666:34:::0;44512:21:::1;44759:37;44773:11:::0;44786:9;44759:13:::1;:37::i;:::-;44736:60:::0;-1:-1:-1;;;;;;44815:29:0;::::1;44807:73;;;::::0;-1:-1:-1;;;44807:73:0;;28850:2:1;44807:73:0::1;::::0;::::1;28832:21:1::0;28889:2;28869:18;;;28862:30;28928:33;28908:18;;;28901:61;28979:18;;44807:73:0::1;28648:355:1::0;44807:73:0::1;44921:7;44899:2;:18;;;:29;;44891:72;;;;-1:-1:-1::0;;;44891:72:0::1;;;;;;;:::i;:::-;44982:11;::::0;::::1;::::0;-1:-1:-1;;;44982:11:0;::::1;;;:20;44974:58;;;::::0;-1:-1:-1;;;44974:58:0;;29210:2:1;44974:58:0::1;::::0;::::1;29192:21:1::0;29249:2;29229:18;;;29222:30;29288:27;29268:18;;;29261:55;29333:18;;44974:58:0::1;29008:349:1::0;44974:58:0::1;45158:11:::0;;45151:72:::1;::::0;45158:11:::1;::::0;::::1;-1:-1:-1::0;;;;;45158:11:0::1;45188:10;45208:4;45215:7:::0;45151:36:::1;:72::i;:::-;45298:11:::0;;45281:29:::1;::::0;45236:20:::1;::::0;35298:1:::1;::::0;45281:29:::1;::::0;45298:11:::1;::::0;::::1;-1:-1:-1::0;;;;;45298:11:0::1;::::0;45281:29:::1;;;:::i;:::-;;;;;;;;;;;;;45312:7;45321:13;45353:10;45336:28;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;45336:28:0;;::::1;::::0;;;;;;;45259:106:::1;::::0;;;;;45336:28:::1;45259:106;;:::i;:::-;;;;;;;;;;;;;45236:129;;45376:71;35298:1;45404:2;45408:7;45417:13;45433;45376:16;:71::i;:::-;45465:52;45470:11;45483:9;45494:7;45503:13;45465:52;;;;;;;;;:::i;:::-;;;;;;;;44062:1463;;;1669:20:::0;1063:1;2189:22;;2006:213;48004:1868;1625:21;:19;:21::i;:::-;48853:2:::1;48829:27:::0;::::1;48823:34:::0;48669:21:::1;48916:37;48930:11:::0;48943:9;48916:13:::1;:37::i;:::-;48893:60:::0;-1:-1:-1;;;;;;48972:29:0;::::1;48964:79;;;::::0;-1:-1:-1;;;48964:79:0;;30732:2:1;48964:79:0::1;::::0;::::1;30714:21:1::0;30771:2;30751:18;;;30744:30;30810:34;30790:18;;;30783:62;-1:-1:-1;;;30861:18:1;;;30854:35;30906:19;;48964:79:0::1;30530:401:1::0;48964:79:0::1;49082:7;49062:2;:17;;;:27;49054:76;;;::::0;-1:-1:-1;;;49054:76:0;;31138:2:1;49054:76:0::1;::::0;::::1;31120:21:1::0;31177:2;31157:18;;;31150:30;31216:34;31196:18;;;31189:62;-1:-1:-1;;;31267:18:1;;;31260:34;31311:19;;49054:76:0::1;30936:400:1::0;49054:76:0::1;49171:7;49149:2;:18;;;:29;;49141:72;;;;-1:-1:-1::0;;;49141:72:0::1;;;;;;;:::i;:::-;49239:10;::::0;::::1;::::0;49232:40:::1;::::0;-1:-1:-1;;;49232:40:0;;49261:10:::1;49232:40;::::0;::::1;2276:51:1::0;49276:7:0;;-1:-1:-1;;;;;49239:10:0::1;::::0;49232:28:::1;::::0;2249:18:1;;49232:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;;49224:94;;;::::0;-1:-1:-1;;;49224:94:0;;31543:2:1;49224:94:0::1;::::0;::::1;31525:21:1::0;31582:2;31562:18;;;31555:30;31621:32;31601:18;;;31594:60;31671:18;;49224:94:0::1;31341:354:1::0;49224:94:0::1;49439:10;::::0;::::1;::::0;49432:71:::1;::::0;-1:-1:-1;;;;;49439:10:0::1;49468;49488:4;49495:7:::0;49432:35:::1;:71::i;:::-;49605:11:::0;;49588:29:::1;::::0;49524:20:::1;::::0;35579:1:::1;::::0;49588:29:::1;::::0;49605:11:::1;::::0;::::1;-1:-1:-1::0;;;;;49605:11:0::1;::::0;49588:29:::1;;;:::i;:::-;;;;;;;;;;;;;49619:7;49628:13;49660:10;49643:28;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;49643:28:0;;::::1;::::0;;;;;;;49547:125:::1;::::0;;;;;49643:28:::1;49547:125;;:::i;:::-;;;;;;;;;;;;;49524:148;;49683:89;35579:1;49730:2;49734:7;49743:13;49758;49683:16;:89::i;:::-;49798:66;49820:11;49833:9;49844:7;49853:10;49798:66;;;;;;;;;:::i;61336:639::-:0;61441:23;61477:19;61499:37;61513:11;61526:9;61499:13;:37::i;:::-;61477:59;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;61477:59:0;;;;;;;-1:-1:-1;;;61477:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61477:59:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;61571:38:0;;61477:59;61571:38;:::i;:::-;61570:44;;;;:::i;:::-;61547:67;;61650:12;61629:2;:18;;;:33;61625:342;;;61679:30;61727:2;:18;;;61712:12;:33;;;;:::i;:::-;61679:66;;61808:22;61798:7;61778:2;:17;;;:27;;;;:::i;:::-;:52;;;;:::i;:::-;61760:70;;61867:2;:17;;;61849:15;:35;61845:111;;;61923:2;:17;;;61905:35;;61845:111;61664:303;61625:342;61466:509;;61336:639;;;;;:::o;36730:58::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36730:58:0;;;;;;-1:-1:-1;36730:58:0;;;;-1:-1:-1;;;;;36730:58:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;66508:185::-;23860:7;23887:6;-1:-1:-1;;;;;23887:6:0;22397:10;24034:23;24026:68;;;;-1:-1:-1;;;24026:68:0;;;;;;;:::i;:::-;66623:17:::1;::::0;:62:::1;::::0;-1:-1:-1;;;66623:62:0;;-1:-1:-1;;;;;66623:17:0;;::::1;::::0;:36:::1;::::0;:62:::1;::::0;66660:11;;66673;;;;66623:62:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;66508:185:::0;;;:::o;43015:130::-;23860:7;23887:6;-1:-1:-1;;;;;23887:6:0;22397:10;24034:23;24026:68;;;;-1:-1:-1;;;24026:68:0;;;;;;;:::i;:::-;43094:11:::1;:43:::0;;-1:-1:-1;;;;;;43094:43:0::1;-1:-1:-1::0;;;;;43094:43:0;;;::::1;::::0;;;::::1;::::0;;43015:130::o;40719:213::-;23860:7;23887:6;-1:-1:-1;;;;;23887:6:0;22397:10;24034:23;24026:68;;;;-1:-1:-1;;;24026:68:0;;;;;;;:::i;:::-;40889:19:::1;;40918:4;40872:52;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;40872:52:0;;::::1;::::0;;;;;;40837:32:::1;::::0;::::1;;::::0;;;:19:::1;40872:52;40837:32:::0;;;:87:::1;::::0;:32;:87:::1;:::i;:::-;;40719:213:::0;;;:::o;43225:210::-;23860:7;23887:6;-1:-1:-1;;;;;23887:6:0;22397:10;24034:23;24026:68;;;;-1:-1:-1;;;24026:68:0;;;;;;;:::i;:::-;43335:20:::1;43358:37;43372:11;43385:9;43358:13;:37::i;:::-;43406:11;;:21:::0;;;::::1;;-1:-1:-1::0;;;43406:21:0::1;-1:-1:-1::0;;;;43406:21:0;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;;;43225:210:0:o;42274:402::-;23860:7;23887:6;-1:-1:-1;;;;;23887:6:0;22397:10;24034:23;24026:68;;;;-1:-1:-1;;;24026:68:0;;;;;;;:::i;:::-;42401:20:::1;42424:37;42438:11;42451:9;42424:13;:37::i;:::-;42401:60;;42503:7;42482:2;:17;;;:28;;42474:83;;;::::0;-1:-1:-1;;;42474:83:0;;32869:2:1;42474:83:0::1;::::0;::::1;32851:21:1::0;32908:2;32888:18;;;32881:30;32947:34;32927:18;;;32920:62;-1:-1:-1;;;32998:18:1;;;32991:40;33048:19;;42474:83:0::1;32667:406:1::0;42474:83:0::1;42575:11:::0;;42568:61:::1;::::0;-1:-1:-1;;;42568:61:0;;42609:4:::1;42568:61;::::0;::::1;33318:34:1::0;-1:-1:-1;;;;;33388:15:1;;;33368:18;;;33361:43;33420:18;;;33413:34;;;42575:11:0::1;::::0;;::::1;::::0;;::::1;::::0;42568:32:::1;::::0;33253:18:1;;42568:61:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;42661:7;42640:2;:17;;;:28;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;42274:402:0:o;24465:148::-;23860:7;23887:6;-1:-1:-1;;;;;23887:6:0;22397:10;24034:23;24026:68;;;;-1:-1:-1;;;24026:68:0;;;;;;;:::i;:::-;24572:1:::1;24556:6:::0;;24535:40:::1;::::0;-1:-1:-1;;;;;24556:6:0;;::::1;::::0;24535:40:::1;::::0;24572:1;;24535:40:::1;24603:1;24586:19:::0;;-1:-1:-1;;;;;;24586:19:0::1;::::0;;24465:148::o;62547:339::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62693:33:0;;;;;:20;:33;;;;;-1:-1:-1;;;;;62693:44:0;;;;;;;;;;62682:10;:56;;-1:-1:-1;;;62682:10:0;;62693:44;62682:56;;;;;;:::i;:::-;;;;;;;;;;62660:78;;;;;;;;62682:56;;;;;;;62660:78;;;;;;;;;;-1:-1:-1;;;;;62660:78:0;;;;;;;;;;;;;;-1:-1:-1;;;62660:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;62660:78:0;;;;;;;;;;;;;;;;;-1:-1:-1;62757:28:0;;;;:56;;;;;62804:9;-1:-1:-1;;;;;62789:24:0;:2;:11;;;-1:-1:-1;;;;;62789:24:0;;62757:56;62749:109;;;;-1:-1:-1;;;62749:109:0;;;;;;;:::i;:::-;62876:2;-1:-1:-1;62547:339:0;;;;;:::o;36672:51::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52540:1233::-;1625:21;:19;:21::i;:::-;52671:10:::1;52628:20;52651:31:::0;;;:19:::1;:31;::::0;;;;:36;;52683:3;;52651:36;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;::::0;;::::1;;52735:13:::0;;52651:36;;-1:-1:-1;52721:41:0::1;::::0;52735:13:::1;;::::0;::::1;;::::0;-1:-1:-1;;;;;52750:11:0;;;::::1;;52721:13;:41::i;:::-;52810:9:::0;;52698:64;;-1:-1:-1;52810:22:0::1;:9;-1:-1:-1::0;;52810:22:0;52806:744:::1;;52918:11:::0;;52901:29:::1;::::0;52849:20:::1;::::0;35401:1:::1;::::0;52901:29:::1;::::0;52918:11:::1;::::0;::::1;-1:-1:-1::0;;;;;52918:11:0::1;::::0;52901:29:::1;;;:::i;:::-;;::::0;;-1:-1:-1;;52901:29:0;;::::1;::::0;;;;;;;52932:9:::1;::::0;::::1;::::0;52872:79:::1;::::0;;52943:7:::1;::::0;::::1;::::0;52901:29:::1;52872:79;;:::i;:::-;;;;;;;;;;;;;52849:102;;52966:55;35401:1;53001:2;53005:7;53014:1;52966:55;;;;;;;;;;;::::0;:16:::1;:55::i;:::-;53055:13:::0;;53070:11:::1;::::0;;::::1;::::0;53083:9;;::::1;::::0;53043:62:::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;53055:13:0;;::::1;;;::::0;-1:-1:-1;;;;;53070:11:0;;::::1;::::0;53094:10:::1;::::0;53043:62:::1;:::i;:::-;;;;;;;;52834:326;52806:744;;;53170:9:::0;;:41:::1;:9;-1:-1:-1::0;;53170:41:0;53166:384:::1;;53316:11:::0;;53299:29:::1;::::0;53228:20:::1;::::0;35720:1:::1;::::0;53299:29:::1;::::0;53316:11:::1;::::0;::::1;-1:-1:-1::0;;;;;53316:11:0::1;::::0;53299:29:::1;;;:::i;:::-;;::::0;;-1:-1:-1;;53299:29:0;;::::1;::::0;;;;;;;53330:9:::1;::::0;::::1;::::0;53251:98:::1;::::0;;53341:7:::1;::::0;::::1;::::0;53299:29:::1;53251:98;;:::i;:::-;;;;;;;;;;;;;53228:121;;53364:73;35720:1;53418:2;53422:7;53431:1;53364:73;;;;;;;;;;;::::0;:16:::1;:73::i;:::-;53488:13:::0;;53503:11:::1;::::0;;::::1;::::0;53516:9;;::::1;::::0;53459:79:::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;53488:13:0;;::::1;;;::::0;-1:-1:-1;;;;;53503:11:0;;::::1;::::0;53527:10:::1;::::0;53459:79:::1;:::i;:::-;;;;;;;;53213:337;53166:384;53602:10;53560:19;53582:31:::0;;;:19:::1;:31;::::0;;;;:38;;;53702:14:::1;53715:1;53582:38:::0;53702:14:::1;:::i;:::-;53670:47;;;;;;;;:::i;:::-;;;;;;;;;;;53631:19;:31;53651:10;-1:-1:-1::0;;;;;53631:31:0::1;-1:-1:-1::0;;;;;53631:31:0::1;;;;;;;;;;;;53663:3;53631:36;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:86;;:36:::1;::::0;;::::1;;:86:::0;;-1:-1:-1;;53631:86:0;::::1;;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;;::::0;;;::::1;;;-1:-1:-1::0;;53631:86:0;;;;;;;;;::::1;::::0;;;;;-1:-1:-1;;;;;53631:86:0;;;;::::1;;;-1:-1:-1::0;;;;;;53631:86:0;;::::1;;::::0;;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;53748:10:0::1;53728:31;::::0;;;:19:::1;:31;::::0;;;;:37;;:31;;-1:-1:-1;53728:37:0;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;-1:-1:-1::0;;53728:37:0;;;;;::::1;;::::0;;-1:-1:-1;;;;;;53728:37:0;;;::::1;::::0;::::1;::::0;;;;::::1;;::::0;::::1;::::0;::::1;:::i;:::-;;;;;52617:1156;;;1669:20:::0;1063:1;2189:22;;2006:213;1669:20;52540:1233;:::o;63505:1204::-;63678:7;63698:19;63720:37;63734:11;63747:9;63720:13;:37::i;:::-;63698:59;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;63698:59:0;;;;;;;-1:-1:-1;;;63698:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63698:59:0;;;;;;;;;;;;;;;;-1:-1:-1;63802:10:0;;;;;:24;;;63816:5;:10;;63825:1;63816:10;63802:24;63799:572;;;35298:1;63888:2;:11;;;63871:29;;;;;;;;:::i;:::-;;;;-1:-1:-1;;63871:29:0;;;;;;;;;;63849:77;;;63902:1;;63905:13;;63920:5;;63871:29;63849:77;;:::i;:::-;;;;;;;;;;;;;63839:87;;63799:572;;;63948:5;:10;;63957:1;63948:10;63944:427;;35350:1;64028:2;:11;;;64011:29;;;;;;;;:::i;:::-;;;;-1:-1:-1;;64011:29:0;;;;;;;;;;63981:84;;;64042:1;;;;;;64051:13;;64011:29;63981:84;;:::i;63944:427::-;64087:5;:10;;64096:1;64087:10;:24;;;;64101:5;:10;;64110:1;64101:10;64087:24;:38;;;;64115:5;:10;;64124:1;64115:10;64087:38;64083:288;;;35350:1;64195:2;:11;;;64178:29;;;;;;;;:::i;:::-;;;;-1:-1:-1;;64178:29:0;;;;;;;;;;64148:78;;;64209:1;;64212:13;;64178:29;64148:78;;:::i;64083:288::-;64248:5;:10;;64257:1;64248:10;:24;;;;64262:5;:10;;64271:1;64262:10;64248:24;64244:127;;;35454:1;64343:2;:11;;;64326:29;;;;;;;;:::i;:::-;;;;-1:-1:-1;;64326:29:0;;;;;;;;;;64295:64;;;64357:1;;64326:29;64295:64;;:::i;:::-;;;;;;;;;;;;;64285:74;;64244:127;64381:26;64410:64;64425:5;64432:11;64445:13;64460;64410:14;:64::i;:::-;64583:17;;:89;;-1:-1:-1;;;64583:89:0;;64381:93;;-1:-1:-1;64560:17:0;;-1:-1:-1;;;;;64583:17:0;;;;:30;;:89;;64614:11;;64635:4;;64642:7;;64560:17;;64381:93;;64583:89;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;64559:113:0;63505:1204;-1:-1:-1;;;;;;;;;;;63505:1204:0:o;49992:2429::-;1625:21;:19;:21::i;:::-;50124:10:::1;50081:20;50104:31:::0;;;:19:::1;:31;::::0;;;;:36;;50136:3;;50104:36;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;::::0;;::::1;;50188:13:::0;;50104:36;;-1:-1:-1;50174:41:0::1;::::0;50188:13:::1;;::::0;::::1;;::::0;-1:-1:-1;;;;;50203:11:0;;;::::1;;50174:13;:41::i;:::-;50264:9:::0;;50151:64;;-1:-1:-1;50264:22:0::1;:9;-1:-1:-1::0;;50264:22:0;50260:1938:::1;;50332:2;:9;;;50311:2;:17;;;:30;;50303:73;;;;-1:-1:-1::0;;;50303:73:0::1;;;;;;;:::i;:::-;50580:13:::0;;50595:11:::1;::::0;;::::1;::::0;50608:9;;::::1;::::0;50527:20:::1;::::0;;;50572:46:::1;::::0;-1:-1:-1;;;50580:13:0;;::::1;;;::::0;-1:-1:-1;;;;;50595:11:0;;::::1;::::0;50572:7:::1;:46::i;:::-;50526:92:::0;;-1:-1:-1;50526:92:0;-1:-1:-1;50633:18:0::1;50667:26;50526:92:::0;;50667:26:::1;:::i;:::-;50654:2;:9;;;:40;;;;:::i;:::-;50886:13:::0;;50901:11:::1;::::0;;::::1;::::0;50914:9;;::::1;::::0;50633:61;;-1:-1:-1;50841:23:0::1;::::0;50867:57:::1;::::0;-1:-1:-1;;;50886:13:0;::::1;;;::::0;-1:-1:-1;;;;;50901:11:0::1;::::0;50867:18:::1;:57::i;:::-;50841:83;;50960:15;50939:2;:17;;;:36;;;;;;;:::i;:::-;;;;;;;;51011:10;50990:2;:17;;;:31;;;;;;;:::i;:::-;;;;;;;;51058:10;51036:2;:18;;;:32;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;51083:74:0::1;::::0;-1:-1:-1;51116:10:0::1;51128:28;51141:15:::0;51128:10;:28:::1;:::i;:::-;51090:11:::0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;51090:11:0::1;::::0;;51083:32:::1;:74::i;:::-;51242:11:::0;;51225:29:::1;::::0;51172:20:::1;::::0;35350:1:::1;::::0;51225:29:::1;::::0;51242:11:::1;::::0;::::1;-1:-1:-1::0;;;;;51242:11:0::1;::::0;51225:29:::1;;;:::i;:::-;;;;;;;;;;;;;51256:2;:9;;;51267:12;51281:11;51311:10;51294:28;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;51294:28:0;;::::1;::::0;;;;;;;51195:128:::1;::::0;;;;;;51294:28:::1;51195:128;;:::i;:::-;;;;;;;;;;;;;51172:151;;51338:56;35350:1;51374:2;51378:7;51387:1;51338:56;;;;;;;;;;;::::0;:16:::1;:56::i;:::-;51429:13:::0;;51444:11:::1;::::0;::::1;::::0;51416:108:::1;::::0;;-1:-1:-1;;;51429:13:0;;::::1;;;41138:38:1::0;;-1:-1:-1;;;;;51444:11:0;;::::1;41245:2:1::0;41230:18;;41223:43;41282:18;;41275:34;;;51469:10:0::1;41340:2:1::0;41325:18;;41318:43;41392:3;41377:19;;41370:35;;;41203:3;41421:19;;41414:35;;;41480:3;41465:19;;41458:35;;;51416:108:0::1;::::0;41125:3:1;41110:19;51416:108:0::1;;;;;;;50288:1292;;;;;50260:1938;;;51590:9:::0;;:41:::1;:9;-1:-1:-1::0;;51590:41:0;51586:612:::1;;51677:2;:9;;;51656:2;:17;;;:30;;51648:73;;;;-1:-1:-1::0;;;51648:73:0::1;;;;;;;:::i;:::-;51757:2;:9;;;51736:2;:17;;;:30;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;51826:9:0::1;::::0;::::1;::::0;51788:11;;51781:55:::1;::::0;51788:11:::1;::::0;;::::1;-1:-1:-1::0;;;;;51788:11:0::1;::::0;51814:10:::1;::::0;51781:32:::1;:55::i;:::-;51940:11:::0;;51923:29:::1;::::0;51851:20:::1;::::0;35650:1:::1;::::0;51923:29:::1;::::0;51940:11:::1;::::0;::::1;-1:-1:-1::0;;;;;51940:11:0::1;::::0;51923:29:::1;;;:::i;:::-;;;;;;;;;;;;;51954:2;:9;;;51982:10;51965:28;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;51965:28:0;;::::1;::::0;;;;;;;51874:120:::1;::::0;;;;51965:28:::1;51874:120;;:::i;:::-;;;;;;;;;;;;;51851:143;;52009:75;35650:1;52064:2;52068:7;52077:1;52009:75;;;;;;;;;;;::::0;:16:::1;:75::i;:::-;52136:13:::0;;52151:11:::1;::::0;;::::1;::::0;52164:9;;::::1;::::0;52106:80:::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;52136:13:0;;::::1;;;::::0;-1:-1:-1;;;;;52151:11:0;;::::1;::::0;52175:10:::1;::::0;52106:80:::1;:::i;40170:315::-:0;23860:7;23887:6;-1:-1:-1;;;;;23887:6:0;22397:10;24034:23;24026:68;;;;-1:-1:-1;;;24026:68:0;;;;;;;:::i;:::-;40266:20:::1;40289:37;40303:11;40316:9;40289:13;:37::i;:::-;40345:8:::0;;40266:60;;-1:-1:-1;40345:8:0::1;;:17;40337:67;;;::::0;-1:-1:-1;;;40337:67:0;;42239:2:1;40337:67:0::1;::::0;::::1;42221:21:1::0;42278:2;42258:18;;;42251:30;42317:34;42297:18;;;42290:62;-1:-1:-1;;;42368:18:1;;;42361:35;42413:19;;40337:67:0::1;42037:401:1::0;40337:67:0::1;40462:15:::0;;-1:-1:-1;;40462:15:0::1;40473:4;40462:15;::::0;;-1:-1:-1;;40170:315:0:o;36342:29::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36342:29:0;;;-1:-1:-1;;;;;36342:29:0;;;;-1:-1:-1;;;36342:29:0;;;;;;;;;;;;;;;-1:-1:-1;;;36342:29:0;;;;;:::o;39272:709::-;23860:7;23887:6;-1:-1:-1;;;;;23887:6:0;22397:10;24034:23;24026:68;;;;-1:-1:-1;;;24026:68:0;;;;;;;:::i;:::-;39431:9:::1;39426:298;39450:10;:17:::0;39446:21;::::1;39426:298;;;39489:19;39511:10;39522:1;39511:13;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;39489:35:::1;::::0;;::::1;::::0;::::1;::::0;;39511:13:::1;::::0;;::::1;::::0;;::::1;39489:35:::0;;::::1;::::0;;::::1;;;::::0;;-1:-1:-1;;;;;39489:35:0::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;::::1;-1:-1:-1::0;;;39489:35:0;;::::1;::::0;::::1;::::0;;;;;;;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;;-1:-1:-1;;;39489:35:0;;::::1;::::0;;::::1;;;::::0;;;;;;;;;-1:-1:-1;39553:28:0;::::1;;:56:::0;::::1;;;;39600:9;-1:-1:-1::0;;;;;39585:24:0::1;:2;:11;;;-1:-1:-1::0;;;;;39585:24:0::1;;39553:56;39539:70;;39633:6;39632:7;39624:88;;;::::0;-1:-1:-1;;;39624:88:0;;42645:2:1;39624:88:0::1;::::0;::::1;42627:21:1::0;42684:2;42664:18;;;42657:30;;;42723:34;42703:18;;;42696:62;42794:34;42774:18;;;42767:62;-1:-1:-1;;;42845:19:1;;;42838:35;42890:19;;39624:88:0::1;42443:472:1::0;39624:88:0::1;39474:250;;39469:3;;;;:::i;:::-;;;39426:298;;;-1:-1:-1::0;39781:10:0::1;:17:::0;39734:33:::1;::::0;::::1;;::::0;;;:20:::1;:33;::::0;;;;;;;-1:-1:-1;;;;;39734:44:0;;::::1;::::0;;;;;;;:64;;;;39827:15:::1;::::0;;:42;;-1:-1:-1;;;39827:42:0;;39734:33;;39827:15;;::::1;::::0;:26:::1;::::0;:42:::1;::::0;39854:5;;39861:7;;39827:42:::1;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39809:60;;39880:10;39896:76;;;;;;;;39906:5;39896:76;;;;;;39913:9;-1:-1:-1::0;;;;;39896:76:0::1;;;;;39924:11;39896:76;;;;;;39937:9;-1:-1:-1::0;;;;;39896:76:0::1;;;;;39948:1;39896:76;;;;39951:1;39896:76;;;;39954:1;39896:76;;;;39957:7;-1:-1:-1::0;;;;;39896:76:0::1;;;;;39966:5;39896:76;;;;::::0;39880:93:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;39880:93:0::1;;;;;-1:-1:-1::0;;;;;39880:93:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;39880:93:0::1;;;;;-1:-1:-1::0;;;;;39880:93:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;39880:93:0::1;;;;;-1:-1:-1::0;;;;;39880:93:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39415:566;39272:709:::0;;;;;:::o;66008:214::-;23860:7;23887:6;-1:-1:-1;;;;;23887:6:0;22397:10;24034:23;24026:68;;;;-1:-1:-1;;;24026:68:0;;;;;;;:::i;:::-;66145:17:::1;::::0;:69:::1;::::0;-1:-1:-1;;;66145:69:0;;-1:-1:-1;;;;;66145:17:0;;::::1;::::0;:27:::1;::::0;:69:::1;::::0;66173:8;;66183;;66193:11;;66206:7;;;;66145:69:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;66008:214:::0;;;;;:::o;41730:299::-;23860:7;23887:6;-1:-1:-1;;;;;23887:6:0;22397:10;24034:23;24026:68;;;;-1:-1:-1;;;24026:68:0;;;;;;;:::i;:::-;41843:20:::1;41866:37;41880:11;41893:9;41866:13;:37::i;:::-;41921:11:::0;;41914:68:::1;::::0;-1:-1:-1;;;41914:68:0;;41947:10:::1;41914:68;::::0;::::1;33318:34:1::0;41967:4:0::1;33368:18:1::0;;;33361:43;33420:18;;;33413:34;;;41921:11:0;;-1:-1:-1;41921:11:0::1;::::0;::::1;-1:-1:-1::0;;;;;41921:11:0::1;::::0;41914:32:::1;::::0;33253:18:1;;41914:68:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;42014:7;41993:2;:17;;;:28;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;41730:299:0:o;45770:845::-;1625:21;:19;:21::i;:::-;46056:20:::1;46079:37;46093:11;46106:9;46079:13;:37::i;:::-;46135:8:::0;;46056:60;;-1:-1:-1;46135:8:0::1;;:16;;:8:::0;:16:::1;46127:62;;;::::0;-1:-1:-1;;;46127:62:0;;44407:2:1;46127:62:0::1;::::0;::::1;44389:21:1::0;44446:2;44426:18;;;44419:30;44485:34;44465:18;;;44458:62;-1:-1:-1;;;44536:18:1;;;44529:31;44577:19;;46127:62:0::1;44205:397:1::0;46127:62:0::1;46209:11:::0;;46202:72:::1;::::0;46209:11:::1;::::0;::::1;-1:-1:-1::0;;;;;46209:11:0::1;46239:10;46259:4;46266:7:::0;46202:36:::1;:72::i;:::-;46294:10;::::0;::::1;::::0;46285:46:::1;::::0;-1:-1:-1;;;46285:46:0;;46311:10:::1;46285:46;::::0;::::1;25432:51:1::0;25499:18;;;25492:34;;;-1:-1:-1;;;;;46294:10:0;;::::1;::::0;46285:25:::1;::::0;25405:18:1;;46285:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;46363:7;46342:2;:17;;;:28;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;46454:11:0;;46437:29:::1;::::0;46383:20:::1;::::0;35454:1:::1;::::0;46437:29:::1;::::0;46454:11:::1;::::0;::::1;-1:-1:-1::0;;;;;46454:11:0::1;::::0;46437:29:::1;;;:::i;:::-;;::::0;;-1:-1:-1;;46437:29:0;;::::1;::::0;;;;;;;46406:70:::1;::::0;;46468:7;;46437:29:::1;46406:70;;:::i;:::-;;;;;;;;;;;;;46383:93;;46487:57;35454:1;46524:2;46528:7;46537:1;46487:57;;;;;;;;;;;::::0;:16:::1;:57::i;:::-;46562:45;46575:11;46588:9;46599:7;46562:45;;;;;;;;:::i;65727:133::-:0;-1:-1:-1;;;;;65825:26:0;;;;;;:19;:26;;;;;;;;65817:35;;;;;;;;;;;;;;;;;65786:18;;65817:35;;65825:26;;65817:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;65817:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65727:133;;;:::o;24768:244::-;23860:7;23887:6;-1:-1:-1;;;;;23887:6:0;22397:10;24034:23;24026:68;;;;-1:-1:-1;;;24026:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24857:22:0;::::1;24849:73;;;::::0;-1:-1:-1;;;24849:73:0;;44809:2:1;24849:73:0::1;::::0;::::1;44791:21:1::0;44848:2;44828:18;;;44821:30;44887:34;44867:18;;;44860:62;-1:-1:-1;;;44938:18:1;;;44931:36;44984:19;;24849:73:0::1;44607:402:1::0;24849:73:0::1;24959:6;::::0;;24938:38:::1;::::0;-1:-1:-1;;;;;24938:38:0;;::::1;::::0;24959:6;::::1;::::0;24938:38:::1;::::0;::::1;24987:6;:17:::0;;-1:-1:-1;;;;;;24987:17:0::1;-1:-1:-1::0;;;;;24987:17:0;;;::::1;::::0;;;::::1;::::0;;24768:244::o;42755:172::-;23860:7;23887:6;-1:-1:-1;;;;;23887:6:0;22397:10;24034:23;24026:68;;;;-1:-1:-1;;;24026:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42827:20:0;::::1;42819:75;;;::::0;-1:-1:-1;;;42819:75:0;;45216:2:1;42819:75:0::1;::::0;::::1;45198:21:1::0;45255:2;45235:18;;;45228:30;45294:34;45274:18;;;45267:62;-1:-1:-1;;;45345:18:1;;;45338:40;45395:19;;42819:75:0::1;45014:406:1::0;42819:75:0::1;42905:5;:14:::0;;-1:-1:-1;;;;;;42905:14:0::1;-1:-1:-1::0;;;;;42905:14:0;;;::::1;::::0;;;::::1;::::0;;42755:172::o;41221:266::-;23860:7;23887:6;-1:-1:-1;;;;;23887:6:0;22397:10;24034:23;24026:68;;;;-1:-1:-1;;;24026:68:0;;;;;;;:::i;:::-;41359:1:::1;41342:13;:18;;;;:40;;;;;41381:1;41364:13;:18;;;;41342:40;41334:84;;;::::0;-1:-1:-1;;;41334:84:0;;45627:2:1;41334:84:0::1;::::0;::::1;45609:21:1::0;45666:2;45646:18;;;45639:30;45705:33;45685:18;;;45678:61;45756:18;;41334:84:0::1;45425:355:1::0;41334:84:0::1;41429:22;::::0;;::::1;;::::0;;;:9:::1;:22;::::0;;;;;;;:37:::1;::::0;;::::1;::::0;;;;;;:50;41221:266::o;62123:416::-;62246:10;:17;62208;;62238:63;;;;-1:-1:-1;;;62238:63:0;;45987:2:1;62238:63:0;;;45969:21:1;46026:2;46006:18;;;45999:30;46065:31;46045:18;;;46038:59;46114:18;;62238:63:0;45785:353:1;62238:63:0;62346:33;;;62312:20;62346:33;;;:20;:33;;;;;;;;-1:-1:-1;;;;;62346:44:0;;;;;;;;;;62335:10;:56;;:10;;62346:44;62335:56;;;;;;:::i;:::-;;;;;;;;;;;;;;62410:13;;62335:56;;-1:-1:-1;62410:28:0;;;;-1:-1:-1;;;62410:13:0;;;;:28;:56;;;;-1:-1:-1;62442:11:0;;;;-1:-1:-1;;;;;62442:24:0;;;:11;;:24;62402:109;;;;-1:-1:-1;;;62402:109:0;;;;;;;:::i;17796:211::-;17940:58;;-1:-1:-1;;;;;25450:32:1;;17940:58:0;;;25432:51:1;25499:18;;;25492:34;;;17913:86:0;;17933:5;;-1:-1:-1;;;17963:23:0;25405:18:1;;17940:58:0;;;;-1:-1:-1;;17940:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;17940:58:0;-1:-1:-1;;;;;;17940:58:0;;;;;;;;;;17913:19;:86::i;1705:293::-;1107:1;1839:7;;:19;1831:63;;;;-1:-1:-1;;;1831:63:0;;46345:2:1;1831:63:0;;;46327:21:1;46384:2;46364:18;;;46357:30;46423:33;46403:18;;;46396:61;46474:18;;1831:63:0;46143:355:1;1831:63:0;1107:1;1972:7;:18;1705:293::o;53861:441::-;54081:13;;54020:26;;54049:83;;54067:12;;-1:-1:-1;;;54081:13:0;;;;54096:7;54105:12;54119;54049:17;:83::i;:::-;54143:17;;54184:13;;-1:-1:-1;;;54184:13:0;;;;54143:17;54199:34;;;:19;:34;;;;;;;54143:151;;-1:-1:-1;;;54143:151:0;;54020:112;;-1:-1:-1;;;;;;54143:17:0;;;;:22;;54173:9;;54143:151;;54184:13;;54199:34;54235:7;;54252:10;;54273:4;;54020:112;;54143:151;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54009:293;53861:441;;;;;:::o;18015:248::-;18186:68;;-1:-1:-1;;;;;33336:15:1;;;18186:68:0;;;33318:34:1;33388:15;;33368:18;;;33361:43;33420:18;;;33413:34;;;18159:96:0;;18179:5;;-1:-1:-1;;;18209:27:0;33253:18:1;;18186:68:0;33078:375:1;64717:547:0;64947:22;;;64910:34;64947:22;;;:9;:22;;;;;;;;:29;;;;;;;;;;;64848:12;;;;64991:17;;64987:239;;65041:77;65061:26;65089:13;65104;65041:19;:77::i;:::-;65025:93;;64987:239;;;65167:47;65187:26;65404:36;;;-1:-1:-1;;;65404:36:0;;;48924:51:1;48991:11;;;;48984:27;;;;65404:36:0;;;;;;;;;;49027:12:1;;65404:36:0;;;65272:176;65167:47;65151:63;;64987:239;-1:-1:-1;65243:13:0;-1:-1:-1;64717:547:0;;;;;;;:::o;20863:716::-;21287:23;21313:69;21341:4;21313:69;;;;;;;;;;;;;;;;;21321:5;-1:-1:-1;;;;;21313:27:0;;;:69;;;;;:::i;:::-;21397:17;;21287:95;;-1:-1:-1;21397:21:0;21393:179;;21494:10;21483:30;;;;;;;;;;;;:::i;:::-;21475:85;;;;-1:-1:-1;;;21475:85:0;;47552:2:1;21475:85:0;;;47534:21:1;47591:2;47571:18;;;47564:30;47630:34;47610:18;;;47603:62;-1:-1:-1;;;47681:18:1;;;47674:40;47731:19;;21475:85:0;47350:406:1;62894:603:0;63051:26;63106:64;63121:5;63128:11;63141:13;63156;63106:14;:64::i;:::-;63279:17;;:90;;-1:-1:-1;;;63279:90:0;;63090:80;;-1:-1:-1;63256:17:0;;-1:-1:-1;;;;;63279:17:0;;;;:30;;:90;;63310:11;;63331:4;;63338:8;;63256:17;;63090:80;;63279:90;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63255:114;;;63401:9;63388;:22;;63380:109;;;;-1:-1:-1;;;63380:109:0;;47963:2:1;63380:109:0;;;47945:21:1;48002:2;47982:18;;;47975:30;48041:34;48021:18;;;48014:62;48112:34;48092:18;;;48085:62;-1:-1:-1;;;48163:19:1;;;48156:41;48214:19;;63380:109:0;47761:478:1;63380:109:0;63079:418;62894:603;;;;;;;:::o;65456:263::-;65642:69;;65582:12;;65623:1;;65642:69;;65623:1;;65667:10;;65679:16;;65697:13;;65642:69;;;:::i;:::-;;;;;;;;;;;;;65635:76;;;65456:263;;;;;:::o;11692:229::-;11829:12;11861:52;11883:6;11891:4;11897:1;11900:12;11829;13100;13114:23;13141:6;-1:-1:-1;;;;;13141:11:0;13160:5;13167:4;13141:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13099:73;;;;13190:69;13217:6;13225:7;13234:10;13246:12;13190:26;:69::i;:::-;13183:76;12812:455;-1:-1:-1;;;;;;;12812:455:0:o;15385:644::-;15570:12;15599:7;15595:427;;;15627:10;:17;15648:1;15627:22;15623:290;;-1:-1:-1;;;;;9231:19:0;;;15837:60;;;;-1:-1:-1;;;15837:60:0;;49951:2:1;15837:60:0;;;49933:21:1;49990:2;49970:18;;;49963:30;50029:31;50009:18;;;50002:59;50078:18;;15837:60:0;49749:353:1;15837:60:0;-1:-1:-1;15934:10:0;15927:17;;15595:427;15977:33;15985:10;15997:12;16732:17;;:21;16728:388;;16964:10;16958:17;17021:15;17008:10;17004:2;17000:19;16993:44;16728:388;17091:12;17084:20;;-1:-1:-1;;;17084:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:159:1:-;81:20;;141:6;130:18;;120:29;;110:57;;163:1;160;153:12;110:57;14:159;;;:::o;178:127::-;239:10;234:3;230:20;227:1;220:31;270:4;267:1;260:15;294:4;291:1;284:15;310:275;381:2;375:9;446:2;427:13;;-1:-1:-1;;423:27:1;411:40;;-1:-1:-1;;;;;466:34:1;;502:22;;;463:62;460:88;;;528:18;;:::i;:::-;564:2;557:22;310:275;;-1:-1:-1;310:275:1:o;590:186::-;638:4;-1:-1:-1;;;;;663:6:1;660:30;657:56;;;693:18;;:::i;:::-;-1:-1:-1;759:2:1;738:15;-1:-1:-1;;734:29:1;765:4;730:40;;590:186::o;781:462::-;823:5;876:3;869:4;861:6;857:17;853:27;843:55;;894:1;891;884:12;843:55;930:6;917:20;961:48;977:31;1005:2;977:31;:::i;:::-;961:48;:::i;:::-;1034:2;1025:7;1018:19;1080:3;1073:4;1068:2;1060:6;1056:15;1052:26;1049:35;1046:55;;;1097:1;1094;1087:12;1046:55;1162:2;1155:4;1147:6;1143:17;1136:4;1127:7;1123:18;1110:55;1210:1;1185:16;;;1203:4;1181:27;1174:38;;;;1189:7;781:462;-1:-1:-1;;;781:462:1:o;1248:768::-;1350:6;1358;1366;1374;1427:3;1415:9;1406:7;1402:23;1398:33;1395:53;;;1444:1;1441;1434:12;1395:53;1467:28;1485:9;1467:28;:::i;:::-;1457:38;;1546:2;1535:9;1531:18;1518:32;-1:-1:-1;;;;;1610:2:1;1602:6;1599:14;1596:34;;;1626:1;1623;1616:12;1596:34;1649:49;1690:7;1681:6;1670:9;1666:22;1649:49;:::i;:::-;1639:59;;1748:2;1737:9;1733:18;1720:32;1707:45;;1792:2;1785:5;1781:14;1774:5;1771:25;1761:53;;1810:1;1807;1800:12;1761:53;1833:5;;-1:-1:-1;1891:2:1;1876:18;;1863:32;;1907:16;;;1904:36;;;1936:1;1933;1926:12;1904:36;;1959:51;2002:7;1991:8;1980:9;1976:24;1959:51;:::i;:::-;1949:61;;;1248:768;;;;;;;:::o;2338:114::-;2422:4;2415:5;2411:16;2404:5;2401:27;2391:55;;2442:1;2439;2432:12;2457:315;2522:6;2530;2583:2;2571:9;2562:7;2558:23;2554:32;2551:52;;;2599:1;2596;2589:12;2551:52;2622:28;2640:9;2622:28;:::i;:::-;2612:38;;2700:2;2689:9;2685:18;2672:32;2713:29;2736:5;2713:29;:::i;:::-;2761:5;2751:15;;;2457:315;;;;;:::o;3194:184::-;3252:6;3305:2;3293:9;3284:7;3280:23;3276:32;3273:52;;;3321:1;3318;3311:12;3273:52;3344:28;3362:9;3344:28;:::i;:::-;3334:38;3194:184;-1:-1:-1;;;3194:184:1:o;3383:131::-;-1:-1:-1;;;;;3458:31:1;;3448:42;;3438:70;;3504:1;3501;3494:12;3519:387;3595:6;3603;3611;3664:2;3652:9;3643:7;3639:23;3635:32;3632:52;;;3680:1;3677;3670:12;3632:52;3703:28;3721:9;3703:28;:::i;:::-;3693:38;;3781:2;3770:9;3766:18;3753:32;3794:31;3819:5;3794:31;:::i;:::-;3519:387;;3844:5;;-1:-1:-1;;;3896:2:1;3881:18;;;;3868:32;;3519:387::o;4164:665::-;4267:6;4275;4283;4291;4299;4352:3;4340:9;4331:7;4327:23;4323:33;4320:53;;;4369:1;4366;4359:12;4320:53;4392:28;4410:9;4392:28;:::i;:::-;4382:38;;4470:2;4459:9;4455:18;4442:32;4483:31;4508:5;4483:31;:::i;:::-;4533:5;-1:-1:-1;4585:2:1;4570:18;;4557:32;;-1:-1:-1;4636:2:1;4621:18;;4608:32;;-1:-1:-1;4691:3:1;4676:19;;4663:33;-1:-1:-1;;;;;4708:30:1;;4705:50;;;4751:1;4748;4741:12;4705:50;4774:49;4815:7;4806:6;4795:9;4791:22;4774:49;:::i;:::-;4764:59;;;4164:665;;;;;;;;:::o;5059:315::-;5127:6;5135;5188:2;5176:9;5167:7;5163:23;5159:32;5156:52;;;5204:1;5201;5194:12;5156:52;5243:9;5230:23;5262:31;5287:5;5262:31;:::i;:::-;5312:5;5364:2;5349:18;;;;5336:32;;-1:-1:-1;;;5059:315:1:o;5474:250::-;5559:1;5569:113;5583:6;5580:1;5577:13;5569:113;;;5659:11;;;5653:18;5640:11;;;5633:39;5605:2;5598:10;5569:113;;;-1:-1:-1;;5716:1:1;5698:16;;5691:27;5474:250::o;5729:270::-;5770:3;5808:5;5802:12;5835:6;5830:3;5823:19;5851:76;5920:6;5913:4;5908:3;5904:14;5897:4;5890:5;5886:16;5851:76;:::i;:::-;5981:2;5960:15;-1:-1:-1;;5956:29:1;5947:39;;;;5988:4;5943:50;;5729:270;-1:-1:-1;;5729:270:1:o;6004:548::-;6269:4;6261:6;6257:17;6246:9;6239:36;6323:6;6315;6311:19;6306:2;6295:9;6291:18;6284:47;6396:1;6392;6387:3;6383:11;6379:19;6371:6;6367:32;6362:2;6351:9;6347:18;6340:60;6436:6;6431:2;6420:9;6416:18;6409:34;6480:3;6474;6463:9;6459:19;6452:32;6220:4;6501:45;6541:3;6530:9;6526:19;6518:6;6501:45;:::i;6557:347::-;6608:8;6618:6;6672:3;6665:4;6657:6;6653:17;6649:27;6639:55;;6690:1;6687;6680:12;6639:55;-1:-1:-1;6713:20:1;;-1:-1:-1;;;;;6745:30:1;;6742:50;;;6788:1;6785;6778:12;6742:50;6825:4;6817:6;6813:17;6801:29;;6877:3;6870:4;6861:6;6853;6849:19;6845:30;6842:39;6839:59;;;6894:1;6891;6884:12;6839:59;6557:347;;;;;:::o;6909:481::-;6987:6;6995;7003;7056:2;7044:9;7035:7;7031:23;7027:32;7024:52;;;7072:1;7069;7062:12;7024:52;7095:28;7113:9;7095:28;:::i;:::-;7085:38;;7174:2;7163:9;7159:18;7146:32;-1:-1:-1;;;;;7193:6:1;7190:30;7187:50;;;7233:1;7230;7223:12;7187:50;7272:58;7322:7;7313:6;7302:9;7298:22;7272:58;:::i;:::-;6909:481;;7349:8;;-1:-1:-1;7246:84:1;;-1:-1:-1;;;;6909:481:1:o;7395:247::-;7454:6;7507:2;7495:9;7486:7;7482:23;7478:32;7475:52;;;7523:1;7520;7513:12;7475:52;7562:9;7549:23;7581:31;7606:5;7581:31;:::i;7647:118::-;7733:5;7726:13;7719:21;7712:5;7709:32;7699:60;;7755:1;7752;7745:12;7770:454;7843:6;7851;7859;7912:2;7900:9;7891:7;7887:23;7883:32;7880:52;;;7928:1;7925;7918:12;7880:52;7951:28;7969:9;7951:28;:::i;:::-;7941:38;;8029:2;8018:9;8014:18;8001:32;8042:31;8067:5;8042:31;:::i;:::-;8092:5;-1:-1:-1;8149:2:1;8134:18;;8121:32;8162:30;8121:32;8162:30;:::i;:::-;8211:7;8201:17;;;7770:454;;;;;:::o;8229:529::-;8314:6;8322;8330;8338;8391:3;8379:9;8370:7;8366:23;8362:33;8359:53;;;8408:1;8405;8398:12;8359:53;8431:28;8449:9;8431:28;:::i;:::-;8421:38;;8509:2;8498:9;8494:18;8481:32;8522:31;8547:5;8522:31;:::i;:::-;8572:5;-1:-1:-1;8624:2:1;8609:18;;8596:32;;-1:-1:-1;8680:2:1;8665:18;;8652:32;8693:33;8652:32;8693:33;:::i;:::-;8229:529;;;;-1:-1:-1;8229:529:1;;-1:-1:-1;;8229:529:1:o;8763:319::-;8830:6;8838;8891:2;8879:9;8870:7;8866:23;8862:32;8859:52;;;8907:1;8904;8897:12;8859:52;8930:28;8948:9;8930:28;:::i;:::-;8920:38;;9008:2;8997:9;8993:18;8980:32;9021:31;9046:5;9021:31;:::i;9183:1026::-;9416:13;;9409:21;9402:29;9384:48;;9492:4;9480:17;;;9474:24;-1:-1:-1;;;;;9470:50:1;9448:20;;;9441:80;9568:4;9556:17;;;9550:24;9371:3;9356:19;;;9583:53;;9615:20;;9550:24;5455:6;5444:18;5432:31;;5379:90;9583:53;;9685:4;9677:6;9673:17;9667:24;9700:56;9750:4;9739:9;9735:20;9719:14;-1:-1:-1;;;;;2087:31:1;2075:44;;2021:104;9700:56;;9812:4;9804:6;9800:17;9794:24;9787:4;9776:9;9772:20;9765:54;9875:4;9867:6;9863:17;9857:24;9850:4;9839:9;9835:20;9828:54;9938:4;9930:6;9926:17;9920:24;9913:4;9902:9;9898:20;9891:54;9994:4;9986:6;9982:17;9976:24;10009:56;10059:4;10048:9;10044:20;10028:14;-1:-1:-1;;;;;2087:31:1;2075:44;;2021:104;10009:56;-1:-1:-1;10084:6:1;10127:15;;;10121:22;9157:13;9150:21;10184:18;;;;9138:34;9183:1026;:::o;10214:217::-;10361:2;10350:9;10343:21;10324:4;10381:44;10421:2;10410:9;10406:18;10398:6;10381:44;:::i;10436:180::-;10495:6;10548:2;10536:9;10527:7;10523:23;10519:32;10516:52;;;10564:1;10561;10554:12;10516:52;-1:-1:-1;10587:23:1;;10436:180;-1:-1:-1;10436:180:1:o;10621:954::-;10740:6;10748;10756;10764;10772;10780;10833:3;10821:9;10812:7;10808:23;10804:33;10801:53;;;10850:1;10847;10840:12;10801:53;10889:9;10876:23;10908:29;10931:5;10908:29;:::i;:::-;10956:5;-1:-1:-1;10980:37:1;11013:2;10998:18;;10980:37;:::i;:::-;10970:47;;11069:2;11058:9;11054:18;11041:32;11082:33;11107:7;11082:33;:::i;:::-;11134:7;-1:-1:-1;11192:2:1;11177:18;;11164:32;-1:-1:-1;;;;;11245:14:1;;;11242:34;;;11272:1;11269;11262:12;11242:34;11295:49;11336:7;11327:6;11316:9;11312:22;11295:49;:::i;:::-;11285:59;;11391:3;11380:9;11376:19;11363:33;11353:43;;11449:3;11438:9;11434:19;11421:33;11405:49;;11479:2;11469:8;11466:16;11463:36;;;11495:1;11492;11485:12;11463:36;;11518:51;11561:7;11550:8;11539:9;11535:24;11518:51;:::i;:::-;11508:61;;;10621:954;;;;;;;;:::o;12432:891::-;12546:6;12554;12562;12570;12578;12631:3;12619:9;12610:7;12606:23;12602:33;12599:53;;;12648:1;12645;12638:12;12599:53;12687:9;12674:23;12706:31;12731:5;12706:31;:::i;:::-;12756:5;-1:-1:-1;12780:37:1;12813:2;12798:18;;12780:37;:::i;:::-;12770:47;;12869:2;12858:9;12854:18;12841:32;12882:33;12907:7;12882:33;:::i;:::-;12934:7;-1:-1:-1;12992:2:1;12977:18;;12964:32;-1:-1:-1;;;;;13045:14:1;;;13042:34;;;13072:1;13069;13062:12;13042:34;13095:49;13136:7;13127:6;13116:9;13112:22;13095:49;:::i;:::-;13085:59;;13197:3;13186:9;13182:19;13169:33;13153:49;;13227:2;13217:8;13214:16;13211:36;;;13243:1;13240;13233:12;13211:36;;13266:51;13309:7;13298:8;13287:9;13283:24;13266:51;:::i;13557:622::-;13652:6;13660;13668;13676;13684;13737:3;13725:9;13716:7;13712:23;13708:33;13705:53;;;13754:1;13751;13744:12;13705:53;13777:28;13795:9;13777:28;:::i;:::-;13767:38;;13824:37;13857:2;13846:9;13842:18;13824:37;:::i;:::-;13814:47;;13908:2;13897:9;13893:18;13880:32;13870:42;;13963:2;13952:9;13948:18;13935:32;-1:-1:-1;;;;;13982:6:1;13979:30;13976:50;;;14022:1;14019;14012:12;13976:50;14061:58;14111:7;14102:6;14091:9;14087:22;14061:58;:::i;:::-;13557:622;;;;-1:-1:-1;13557:622:1;;-1:-1:-1;14138:8:1;;14035:84;13557:622;-1:-1:-1;;;13557:622:1:o;14184:1329::-;14380:4;14409:2;14449;14438:9;14434:18;14479:2;14468:9;14461:21;14502:6;14537;14531:13;14568:6;14560;14553:22;14594:2;14584:12;;14627:2;14616:9;14612:18;14605:25;;14689:2;14679:6;14676:1;14672:14;14661:9;14657:30;14653:39;14727:2;14719:6;14715:15;14748:1;14758:726;14772:6;14769:1;14766:13;14758:726;;;14837:22;;;-1:-1:-1;;14833:36:1;14821:49;;14893:13;;14965:9;;14976:4;14961:20;14946:36;;15029:11;;;15023:18;15043:6;15019:31;15002:15;;;14995:56;15098:11;;;15092:18;-1:-1:-1;;;;;15088:44:1;15071:15;;;15064:69;15156:4;15203:11;;;15197:18;15180:15;;;15173:43;15239:4;15282:11;;;15276:18;14929:4;15314:15;;;15307:27;;;15276:18;15357:47;15388:15;;;15276:18;15357:47;:::i;:::-;15462:12;;;;15347:57;-1:-1:-1;;;15427:15:1;;;;14794:1;14787:9;14758:726;;;-1:-1:-1;15501:6:1;;14184:1329;-1:-1:-1;;;;;;;;14184:1329:1:o;15518:383::-;15592:6;15600;15608;15661:2;15649:9;15640:7;15636:23;15632:32;15629:52;;;15677:1;15674;15667:12;15629:52;15700:28;15718:9;15700:28;:::i;:::-;15690:38;;15778:2;15767:9;15763:18;15750:32;15791:29;15814:5;15791:29;:::i;15906:380::-;15985:1;15981:12;;;;16028;;;16049:61;;16103:4;16095:6;16091:17;16081:27;;16049:61;16156:2;16148:6;16145:14;16125:18;16122:38;16119:161;;16202:10;16197:3;16193:20;16190:1;16183:31;16237:4;16234:1;16227:15;16265:4;16262:1;16255:15;16119:161;;15906:380;;;:::o;16416:840::-;16542:3;16571:1;16604:6;16598:13;16634:36;16660:9;16634:36;:::i;:::-;16689:1;16706:18;;;16733:133;;;;16880:1;16875:356;;;;16699:532;;16733:133;-1:-1:-1;;16766:24:1;;16754:37;;16839:14;;16832:22;16820:35;;16811:45;;;-1:-1:-1;16733:133:1;;16875:356;16906:6;16903:1;16896:17;16936:4;16981:2;16978:1;16968:16;17006:1;17020:165;17034:6;17031:1;17028:13;17020:165;;;17112:14;;17099:11;;;17092:35;17155:16;;;;17049:10;;17020:165;;;17024:3;;;17214:6;17209:3;17205:16;17198:23;;16699:532;-1:-1:-1;17247:3:1;;16416:840;-1:-1:-1;;;;;;16416:840:1:o;17814:441::-;17867:5;17920:3;17913:4;17905:6;17901:17;17897:27;17887:55;;17938:1;17935;17928:12;17887:55;17967:6;17961:13;17998:48;18014:31;18042:2;18014:31;:::i;17998:48::-;18071:2;18062:7;18055:19;18117:3;18110:4;18105:2;18097:6;18093:15;18089:26;18086:35;18083:55;;;18134:1;18131;18124:12;18083:55;18147:77;18221:2;18214:4;18205:7;18201:18;18194:4;18186:6;18182:17;18147:77;:::i;18260:947::-;18391:6;18399;18407;18415;18423;18476:3;18464:9;18455:7;18451:23;18447:33;18444:53;;;18493:1;18490;18483:12;18444:53;18525:9;18519:16;18544:29;18567:5;18544:29;:::i;:::-;18641:2;18626:18;;18620:25;18592:5;;-1:-1:-1;;;;;;18694:14:1;;;18691:34;;;18721:1;18718;18711:12;18691:34;18744:60;18796:7;18787:6;18776:9;18772:22;18744:60;:::i;:::-;18734:70;;18844:2;18833:9;18829:18;18823:25;18813:35;;18894:2;18883:9;18879:18;18873:25;18857:41;;18923:2;18913:8;18910:16;18907:36;;;18939:1;18936;18929:12;18907:36;18962:62;19016:7;19005:8;18994:9;18990:24;18962:62;:::i;:::-;18952:72;;19070:3;19059:9;19055:19;19049:26;19033:42;;19100:2;19090:8;19087:16;19084:36;;;19116:1;19113;19106:12;19084:36;;19139:62;19193:7;19182:8;19171:9;19167:24;19139:62;:::i;19212:544::-;19313:2;19308:3;19305:11;19302:448;;;19349:1;19374:5;19370:2;19363:17;19419:4;19415:2;19405:19;19489:2;19477:10;19473:19;19470:1;19466:27;19460:4;19456:38;19525:4;19513:10;19510:20;19507:47;;;-1:-1:-1;19548:4:1;19507:47;19603:2;19598:3;19594:12;19591:1;19587:20;19581:4;19577:31;19567:41;;19658:82;19676:2;19669:5;19666:13;19658:82;;;19721:17;;;19702:1;19691:13;19658:82;;;19662:3;;;19212:544;;;:::o;19932:1348::-;20056:3;20050:10;-1:-1:-1;;;;;20075:6:1;20072:30;20069:56;;;20105:18;;:::i;:::-;20134:96;20223:6;20183:38;20215:4;20209:11;20183:38;:::i;:::-;20177:4;20134:96;:::i;:::-;20285:4;;20349:2;20338:14;;20366:1;20361:662;;;;21067:1;21084:6;21081:89;;;-1:-1:-1;21136:19:1;;;21130:26;21081:89;-1:-1:-1;;19889:1:1;19885:11;;;19881:24;19877:29;19867:40;19913:1;19909:11;;;19864:57;21183:81;;20331:943;;20361:662;16363:1;16356:14;;;16400:4;16387:18;;-1:-1:-1;;20397:20:1;;;20514:236;20528:7;20525:1;20522:14;20514:236;;;20617:19;;;20611:26;20596:42;;20709:27;;;;20677:1;20665:14;;;;20544:19;;20514:236;;;20518:3;20778:6;20769:7;20766:19;20763:201;;;20839:19;;;20833:26;-1:-1:-1;;20922:1:1;20918:14;;;20934:3;20914:24;20910:37;20906:42;20891:58;20876:74;;20763:201;-1:-1:-1;;;;;21010:1:1;20994:14;;;20990:22;20977:36;;-1:-1:-1;19932:1348:1:o;21285:458::-;21544:6;21532:19;;;;21514:38;;-1:-1:-1;;;;;21626:15:1;;;21621:2;21606:18;;21599:43;21673:2;21658:18;;21651:34;;;;21721:15;21716:2;21701:18;;21694:43;21501:3;21486:19;;21285:458::o;21748:868::-;21879:6;21887;21895;21903;21911;21919;21972:3;21960:9;21951:7;21947:23;21943:33;21940:53;;;21989:1;21986;21979:12;21940:53;22021:9;22015:16;22040:29;22063:5;22040:29;:::i;:::-;22137:2;22122:18;;22116:25;22088:5;;-1:-1:-1;;;;;;22190:14:1;;;22187:34;;;22217:1;22214;22207:12;22187:34;22240:60;22292:7;22283:6;22272:9;22268:22;22240:60;:::i;:::-;22230:70;;22340:2;22329:9;22325:18;22319:25;22309:35;;22384:2;22373:9;22369:18;22363:25;22353:35;;22428:3;22417:9;22413:19;22407:26;22397:36;;22479:3;22468:9;22464:19;22458:26;22442:42;;22509:2;22499:8;22496:16;22493:36;;;22525:1;22522;22515:12;22493:36;;22548:62;22602:7;22591:8;22580:9;22576:24;22548:62;:::i;22621:127::-;22682:10;22677:3;22673:20;22670:1;22663:31;22713:4;22710:1;22703:15;22737:4;22734:1;22727:15;22753:125;22818:9;;;22839:10;;;22836:36;;;22852:18;;:::i;22883:128::-;22950:9;;;22971:11;;;22968:37;;;22985:18;;:::i;23623:744::-;23736:6;23744;23752;23760;23813:3;23801:9;23792:7;23788:23;23784:33;23781:53;;;23830:1;23827;23820:12;23781:53;23862:9;23856:16;23881:29;23904:5;23881:29;:::i;:::-;23978:2;23963:18;;23957:25;23929:5;;-1:-1:-1;;;;;;24031:14:1;;;24028:34;;;24058:1;24055;24048:12;24028:34;24081:60;24133:7;24124:6;24113:9;24109:22;24081:60;:::i;:::-;24071:70;;24181:2;24170:9;24166:18;24160:25;24150:35;;24231:2;24220:9;24216:18;24210:25;24194:41;;24260:2;24250:8;24247:16;24244:36;;;24276:1;24273;24266:12;24244:36;;24299:62;24353:7;24342:8;24331:9;24327:24;24299:62;:::i;24372:520::-;24467:6;24475;24483;24536:2;24524:9;24515:7;24511:23;24507:32;24504:52;;;24552:1;24549;24542:12;24504:52;24584:9;24578:16;24603:29;24626:5;24603:29;:::i;:::-;24700:2;24685:18;;24679:25;24651:5;;-1:-1:-1;;;;;;24716:30:1;;24713:50;;;24759:1;24756;24749:12;24713:50;24782:60;24834:7;24825:6;24814:9;24810:22;24782:60;:::i;:::-;24772:70;;;24882:2;24871:9;24867:18;24861:25;24851:35;;24372:520;;;;;:::o;24897:356::-;25127:6;25115:19;;;;25097:38;;-1:-1:-1;;;;;25171:32:1;;;;25166:2;25151:18;;25144:60;25235:2;25220:18;;25213:34;25085:2;25070:18;;24897:356::o;25537:245::-;25604:6;25657:2;25645:9;25636:7;25632:23;25628:32;25625:52;;;25673:1;25670;25663:12;25625:52;25705:9;25699:16;25724:28;25746:5;25724:28;:::i;25787:356::-;25989:2;25971:21;;;26008:18;;;26001:30;26067:34;26062:2;26047:18;;26040:62;26134:2;26119:18;;25787:356::o;26341:354::-;26543:2;26525:21;;;26582:2;26562:18;;;26555:30;26621:32;26616:2;26601:18;;26594:60;26686:2;26671:18;;26341:354::o;26700:229::-;26849:2;26845:15;;;;-1:-1:-1;;26841:53:1;26829:66;;26920:2;26911:12;;26700:229::o;26934:366::-;27145:4;27137:6;27133:17;27122:9;27115:36;27187:2;27182;27171:9;27167:18;27160:30;27096:4;27207:44;27247:2;27236:9;27232:18;27224:6;27207:44;:::i;:::-;27199:52;;27287:6;27282:2;27271:9;27267:18;27260:34;26934:366;;;;;;:::o;27305:217::-;27345:1;27371;27361:132;;27415:10;27410:3;27406:20;27403:1;27396:31;27450:4;27447:1;27440:15;27478:4;27475:1;27468:15;27361:132;-1:-1:-1;27507:9:1;;27305:217::o;27851:184::-;27921:6;27974:2;27962:9;27953:7;27949:23;27945:32;27942:52;;;27990:1;27987;27980:12;27942:52;-1:-1:-1;28013:16:1;;27851:184;-1:-1:-1;27851:184:1:o;28040:430::-;28146:6;28154;28162;28170;28178;28231:3;28219:9;28210:7;28206:23;28202:33;28199:53;;;28248:1;28245;28238:12;28199:53;-1:-1:-1;;28271:16:1;;28327:2;28312:18;;28306:25;28371:2;28356:18;;28350:25;28415:2;28400:18;;28394:25;28459:3;28444:19;;;28438:26;28271:16;;28306:25;;-1:-1:-1;28350:25:1;28394;-1:-1:-1;28438:26:1;;-1:-1:-1;28040:430:1;-1:-1:-1;28040:430:1:o;28475:168::-;28548:9;;;28579;;28596:15;;;28590:22;;28576:37;28566:71;;28617:18;;:::i;29362:689::-;29665:4;29657:6;29653:17;29642:9;29635:36;29707:3;29702:2;29691:9;29687:18;29680:31;29616:4;29734:45;29774:3;29763:9;29759:19;29751:6;29734:45;:::i;:::-;29815:6;29810:2;29799:9;29795:18;29788:34;29870:9;29862:6;29858:22;29853:2;29842:9;29838:18;29831:50;29904:32;29929:6;29921;29904:32;:::i;:::-;29890:46;;29985:9;29977:6;29973:22;29967:3;29956:9;29952:19;29945:51;30013:32;30038:6;30030;30013:32;:::i;:::-;30005:40;29362:689;-1:-1:-1;;;;;;;;29362:689:1:o;30056:469::-;30297:6;30289;30285:19;30274:9;30267:38;30370:1;30366;30361:3;30357:11;30353:19;30345:6;30341:32;30336:2;30325:9;30321:18;30314:60;30410:6;30405:2;30394:9;30390:18;30383:34;30453:3;30448:2;30437:9;30433:18;30426:31;30248:4;30474:45;30514:3;30503:9;30499:19;30491:6;30474:45;:::i;:::-;30466:53;30056:469;-1:-1:-1;;;;;;30056:469:1:o;31700:266::-;31788:6;31783:3;31776:19;31840:6;31833:5;31826:4;31821:3;31817:14;31804:43;-1:-1:-1;31892:1:1;31867:16;;;31885:4;31863:27;;;31856:38;;;;31948:2;31927:15;;;-1:-1:-1;;31923:29:1;31914:39;;;31910:50;;31700:266::o;31971:326::-;32166:6;32158;32154:19;32143:9;32136:38;32210:2;32205;32194:9;32190:18;32183:30;32117:4;32230:61;32287:2;32276:9;32272:18;32264:6;32256;32230:61;:::i;:::-;32222:69;31971:326;-1:-1:-1;;;;;31971:326:1:o;32302:360::-;32513:6;32505;32500:3;32487:33;32583:2;32579:15;;;;-1:-1:-1;;32575:53:1;32539:16;;32564:65;;;32653:2;32645:11;;32302:360;-1:-1:-1;32302:360:1:o;33458:127::-;33519:10;33514:3;33510:20;33507:1;33500:31;33550:4;33547:1;33540:15;33574:4;33571:1;33564:15;33590:404;33792:2;33774:21;;;33831:2;33811:18;;;33804:30;33870:34;33865:2;33850:18;;33843:62;-1:-1:-1;;;33936:2:1;33921:18;;33914:38;33984:3;33969:19;;33590:404::o;33999:771::-;34048:3;34089:5;34083:12;34118:36;34144:9;34118:36;:::i;:::-;34163:19;;;34201:4;34224:1;34241:18;;;34268:146;;;;34428:1;34423:341;;;;34234:530;;34268:146;-1:-1:-1;;34310:24:1;;34296:12;;;34289:46;34382:14;;34375:22;34372:1;34368:30;34359:40;;34355:49;;;-1:-1:-1;34268:146:1;;34423:341;34454:5;34451:1;34444:16;34501:2;34498:1;34488:16;34526:1;34540:174;34554:6;34551:1;34548:13;34540:174;;;34641:14;;34623:11;;;34619:20;;34612:44;34684:16;;;;34569:10;;34540:174;;;34738:11;;34734:20;;;-1:-1:-1;;34234:530:1;;;;;;33999:771;;;;:::o;34775:533::-;35029:4;35021:6;35017:17;35006:9;34999:36;35071:3;35066:2;35055:9;35051:18;35044:31;34980:4;35098:45;35138:3;35127:9;35123:19;35115:6;35098:45;:::i;:::-;35179:6;35174:2;35163:9;35159:18;35152:34;35234:9;35226:6;35222:22;35217:2;35206:9;35202:18;35195:50;35262:40;35295:6;35287;35262:40;:::i;35313:1426::-;35426:3;35420:4;35417:13;35414:26;;35433:5;;35313:1426::o;35414:26::-;35463:37;35495:3;35489:10;35463:37;:::i;:::-;-1:-1:-1;;;;;35515:6:1;35512:30;35509:56;;;35545:18;;:::i;:::-;35574:96;35663:6;35623:38;35655:4;35649:11;35623:38;:::i;35574:96::-;35696:1;35724:2;35716:6;35713:14;35741:1;35736:746;;;;36526:1;36543:6;36540:89;;;-1:-1:-1;36595:19:1;;;36589:26;36540:89;-1:-1:-1;;19889:1:1;19885:11;;;19881:24;19877:29;19867:40;19913:1;19909:11;;;19864:57;36642:81;;35706:1027;;35736:746;16363:1;16356:14;;;16400:4;16387:18;;-1:-1:-1;;35772:20:1;;;16363:1;16356:14;;;16400:4;16387:18;;35934:9;35956:251;35970:7;35967:1;35964:14;35956:251;;;36052:21;;;36046:28;36031:44;;36102:1;36175:18;;;;36130:15;;;;35993:4;35986:12;35956:251;;;35960:3;36235:6;36226:7;36223:19;36220:203;;;36296:21;;36290:28;-1:-1:-1;;36393:3:1;36381:1;36377:14;;;36373:24;36369:37;36365:42;36350:58;36335:74;;;-1:-1:-1;;36469:1:1;36453:14;;;36449:22;36436:36;;-1:-1:-1;35313:1426:1:o;36744:127::-;36805:10;36800:3;36796:20;36793:1;36786:31;36836:4;36833:1;36826:15;36860:4;36857:1;36850:15;36876:706;37185:4;37177:6;37173:17;37162:9;37155:36;37227:3;37222:2;37211:9;37207:18;37200:31;37136:4;37254:45;37294:3;37283:9;37279:19;37271:6;37254:45;:::i;:::-;37347:4;37339:6;37335:17;37330:2;37319:9;37315:18;37308:45;37401:9;37393:6;37389:22;37384:2;37373:9;37369:18;37362:50;37435:32;37460:6;37452;37435:32;:::i;37587:723::-;37918:4;37910:6;37906:17;37895:9;37888:36;37960:3;37955:2;37944:9;37940:18;37933:31;37869:4;37987:45;38027:3;38016:9;38012:19;38004:6;37987:45;:::i;:::-;38080:4;38072:6;38068:17;38063:2;38052:9;38048:18;38041:45;38134:4;38126:6;38122:17;38117:2;38106:9;38102:18;38095:45;38189:4;38181:6;38177:17;38171:3;38160:9;38156:19;38149:46;38244:9;38236:6;38232:22;38226:3;38215:9;38211:19;38204:51;38272:32;38297:6;38289;38272:32;:::i;:::-;38264:40;37587:723;-1:-1:-1;;;;;;;;;37587:723:1:o;38315:545::-;38578:4;38570:6;38566:17;38555:9;38548:36;38620:3;38615:2;38604:9;38600:18;38593:31;38529:4;38647:45;38687:3;38676:9;38672:19;38664:6;38647:45;:::i;:::-;38740:4;38732:6;38728:17;38723:2;38712:9;38708:18;38701:45;38794:9;38786:6;38782:22;38777:2;38766:9;38762:18;38755:50;38822:32;38847:6;38839;38822:32;:::i;38865:383::-;39082:4;39074:6;39070:17;39059:9;39052:36;39124:2;39119;39108:9;39104:18;39097:30;39033:4;39144:44;39184:2;39173:9;39169:18;39161:6;39144:44;:::i;:::-;39136:52;;39236:4;39228:6;39224:17;39219:2;39208:9;39204:18;39197:45;38865:383;;;;;;:::o;39253:640::-;39534:6;39522:19;;39504:38;;-1:-1:-1;;;;;39578:32:1;;39573:2;39558:18;;39551:60;39598:3;39642:2;39627:18;;39620:31;;;-1:-1:-1;;39674:45:1;;39699:19;;39691:6;39674:45;:::i;:::-;39769:6;39762:14;39755:22;39750:2;39739:9;39735:18;39728:50;39827:9;39819:6;39815:22;39809:3;39798:9;39794:19;39787:51;39855:32;39880:6;39872;39855:32;:::i;39898:245::-;39977:6;39985;40038:2;40026:9;40017:7;40013:23;40009:32;40006:52;;;40054:1;40051;40044:12;40006:52;-1:-1:-1;;40077:16:1;;40133:2;40118:18;;;40112:25;40077:16;;40112:25;;-1:-1:-1;39898:245:1:o;40148:672::-;40461:4;40453:6;40449:17;40438:9;40431:36;40503:3;40498:2;40487:9;40483:18;40476:31;40412:4;40530:45;40570:3;40559:9;40555:19;40547:6;40530:45;:::i;:::-;40611:6;40606:2;40595:9;40591:18;40584:34;40654:6;40649:2;40638:9;40634:18;40627:34;40698:6;40692:3;40681:9;40677:19;40670:35;40754:9;40746:6;40742:22;40736:3;40725:9;40721:19;40714:51;40782:32;40807:6;40799;40782:32;:::i;41504:528::-;41761:4;41753:6;41749:17;41738:9;41731:36;41803:3;41798:2;41787:9;41783:18;41776:31;41712:4;41830:45;41870:3;41859:9;41855:19;41847:6;41830:45;:::i;:::-;41911:6;41906:2;41895:9;41891:18;41884:34;41966:9;41958:6;41954:22;41949:2;41938:9;41934:18;41927:50;41994:32;42019:6;42011;41994:32;:::i;42920:135::-;42959:3;42980:17;;;42977:43;;43000:18;;:::i;:::-;-1:-1:-1;43047:1:1;43036:13;;42920:135::o;43060:381::-;43257:2;43246:9;43239:21;43220:4;43283:44;43323:2;43312:9;43308:18;43300:6;43283:44;:::i;:::-;43375:9;43367:6;43363:22;43358:2;43347:9;43343:18;43336:50;43403:32;43428:6;43420;43403:32;:::i;43446:251::-;43516:6;43569:2;43557:9;43548:7;43544:23;43540:32;43537:52;;;43585:1;43582;43575:12;43537:52;43617:9;43611:16;43636:31;43661:5;43636:31;:::i;43702:498::-;43902:4;43931:6;43976:2;43968:6;43964:15;43953:9;43946:34;44028:2;44020:6;44016:15;44011:2;44000:9;43996:18;43989:43;;44068:6;44063:2;44052:9;44048:18;44041:34;44111:3;44106:2;44095:9;44091:18;44084:31;44132:62;44189:3;44178:9;44174:19;44166:6;44158;44132:62;:::i;46503:842::-;46849:6;46841;46837:19;46826:9;46819:38;46893:3;46888:2;46877:9;46873:18;46866:31;46800:4;46920:53;46968:3;46957:9;46953:19;46945:6;46920:53;:::i;:::-;47021:9;47013:6;47009:22;47004:2;46993:9;46989:18;46982:50;47055:32;47080:6;47072;47055:32;:::i;:::-;-1:-1:-1;;;;;47161:15:1;;;47156:2;47141:18;;47134:43;47214:15;;47208:3;47193:19;;47186:44;47267:22;;;47114:3;47246:19;;47239:51;47041:46;-1:-1:-1;47307:32:1;47041:46;47324:6;47307:32;:::i;48244:520::-;48516:5;48511:3;48507:15;48498:6;48493:3;48489:16;48485:38;48480:3;48473:51;48553:6;48549:1;48544:3;48540:11;48533:27;48590:6;48585:2;48580:3;48576:12;48569:28;48455:3;48626:6;48620:13;48642:75;48710:6;48705:2;48700:3;48696:12;48689:4;48681:6;48677:17;48642:75;:::i;:::-;48737:16;;;;48755:2;48733:25;;48244:520;-1:-1:-1;;;;;48244:520:1:o;49457:287::-;49586:3;49624:6;49618:13;49640:66;49699:6;49694:3;49687:4;49679:6;49675:17;49640:66;:::i;:::-;49722:16;;;;;49457:287;-1:-1:-1;;49457:287:1:o

Swarm Source

ipfs://909c46167e483059649bce247af82d5705c63310d48aba9c741c702e3a474e70

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Txn Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.