ETH Price: $3,290.14 (+1.35%)
Gas: 1 Gwei

Token

Inugami (GAMI)
 

Overview

Max Total Supply

100,000,000,000 GAMI

Holders

125

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Inugami

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-12-14
*/

// SPDX-License-Identifier: MIT
/*
Inugami(GAMI)

We are Inugami, We are many.

weareinugami.com

*/

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


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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

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

// File: Inugami/OwnerAdminSettings.sol



pragma solidity >=0.8.0 <0.9.0;



contract OwnerAdminSettings is ReentrancyGuard, Context {

  address internal _owner;

  struct Admin {
        address WA;
        uint8 roleLevel;
  }
  mapping(address => Admin) internal admins;

  mapping(address => bool) internal isAdminRole;

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

  modifier onlyOwner() {
    require(_msgSender() == getOwner() ||
            admins[_msgSender()].roleLevel == 1 
            );
    _;
  }

  modifier onlyDev() {
    require(admins[_msgSender()].roleLevel == 1);
    _;
  }

  modifier onlyAntiBot() {
    require(admins[_msgSender()].roleLevel == 1 ||
            admins[_msgSender()].roleLevel == 2
            );
    _;
  }

  modifier onlyAdminRoles() {
    require(_msgSender() == getOwner() ||
            admins[_msgSender()].roleLevel == 1 ||
            admins[_msgSender()].roleLevel == 2 || 
            admins[_msgSender()].roleLevel == 5
            );
    _;
  }

  constructor() {
    _owner = _msgSender();
    _setNewAdmins(_msgSender(), 1);
  }
    //DON'T FORGET TO SET Locker AND Marketing(AND ALSO WHITELISTING Marketing) AFTER DEPLOYING THE CONTRACT!!!
    //DON'T FORGET TO SET ADMINS!!

  //Owner and Admins
  //Set New Owner. Can be done only by the owner.
  function setNewOwner(address newOwner) external onlyOwner {
    require(newOwner != _owner, "This address is already the owner!");
    emit OwnershipTransferred(_owner, newOwner);
    _owner = newOwner;
  }

    //Sets up admin accounts.
    function setNewAdmin(address _address, uint8 _roleLevel) external onlyOwner {
      if(_roleLevel == 1) {
        require(admins[_msgSender()].roleLevel == 1, "You are not authorized to set a dev");
      }
      
      _setNewAdmins(_address, _roleLevel);
    }

    function _setNewAdmins(address _address, uint8 _roleLevel) internal {

            Admin storage newAdmin = admins[_address];
            newAdmin.WA = _address;
            newAdmin.roleLevel = _roleLevel;
 
        isAdminRole[_address] = true;
    } 
/*
    function verifyAdminMember(address adr) public view returns(bool YoN, uint8 role_) {
        uint256 iterations = 0;
        while(iterations < adminAccounts.length) {
            if(adminAccounts[iterations] == adr) {return (true, admins[adminAccounts[iterations]].role);}
            iterations++;
        }
        return (false, 0);
    }
*/
    function removeRole(address[] calldata adr) external onlyOwner {
        for(uint i=0; i < adr.length; i++) {
            _removeRole(adr[i]);
        }
    }

    function renounceMyRole(address adr) external onlyAdminRoles {
        require(adr == _msgSender(), "AccessControl: can only renounce roles for self");
        require(isAdminRole[adr] == true, "You do not have an admin role");
        _removeRole(adr);
    }

    function _removeRole(address adr) internal {

          delete admins[adr];
  
        isAdminRole[adr] = false;
    }
  
  //public
    function whoIsOwner() external view returns (address) {
      return getOwner();
    }

    function verifyAdminMember(address adr) external view returns (bool) {
      return isAdminRole[adr];
    }

    function showAdminRoleLevel(address adr) external view returns (uint8) {
      return admins[adr].roleLevel;
    }

  //internal

    function getOwner() internal view returns (address) {
      return _owner;
    }

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol


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

pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 *
 * [WARNING]
 * ====
 *  Trying to delete such a structure from storage will likely result in data corruption, rendering the structure unusable.
 *  See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
 *
 *  In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an array of EnumerableSet.
 * ====
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastValue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastValue;
                // Update the index for the moved value
                set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        return _values(set._inner);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }
}

// File: Inugami/Inugami.sol



/*
Inugami(GAMI)

We are Inugami, We are many.

weareinugami.com

*/

pragma solidity >=0.8.0 <0.9.0;

interface IERC20 {
  function totalSupply() external view returns (uint256);
  function decimals() external view returns (uint8);
  function symbol() external view returns (string memory);
  function name() external view returns (string memory);
  function balanceOf(address account) external view returns (uint256);
  function transfer(address recipient, uint256 amount) external returns (bool);
  function allowance(address _owner, address spender) external view returns (uint256);
  function approve(address spender, uint256 amount) external returns (bool);
  function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
  event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface IFactoryV2 {
    event PairCreated(address indexed token0, address indexed token1, address lpPair, uint);
    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);
    function getPair(address tokenA, address tokenB) external view returns (address lpPair);
    function allPairs(uint) external view returns (address lpPair);
    function allPairsLength() external view returns (uint);
    function createPair(address tokenA, address tokenB) external returns (address lpPair);
    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

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

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);
    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);
    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);
    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;
    function initialize(address, address) external;
}

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
    external
    payable
    returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
    external
    returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
    external
    returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
    external
    payable
    returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

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

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

interface IRouter01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
    external
    payable
    returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
    external
    returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
    external
    returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
    external
    payable
    returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

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

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





contract Inugami is IERC20, OwnerAdminSettings {

// Library
    using EnumerableSet for EnumerableSet.AddressSet;
    using SafeMath for uint256;
    using Address for address;

//Token Variables
    string constant private _name = "Inugami";
    string constant private _symbol = "GAMI";

    uint64 constant private startingSupply = 100_000_000_000; //100 Billion, underscores aid readability
    uint8 constant private _decimals = 18;
    uint256 constant private MAX = ~uint256(0);

    uint256 constant private _tTotal = startingSupply * 10**_decimals;

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

//Router, LP Pair Variables
    IRouter02 public dexRouter;
    address public pairAddr;

    mapping (address => bool) dexRouters;
    mapping (address => bool) lpPairs;

    //Routers
    struct DexRouter {
        bool enableAggregate;
    }
    mapping(address => DexRouter) public dexrouters;
    
    //LP Pairs
    struct LPPair {
        address dexCA;
        address pairedCoinCA;
        bool launched;
        bool tradingEnabled;
        bool liqAdded;
        bool contractSwapEnabled;
        bool piContractSwapEnabled;
        uint8 piSwapBps;
        uint32 tradingEnabledBlock;
        uint48 tradingEnabledTime;
        uint256 swapThreshold;
        uint256 swapAmount;
    }
    mapping(address => LPPair) public lppairs;

    mapping (address => EnumerableSet.AddressSet) _lpPairs;

    event NewDexRouter(address dexRouterCA);
    event NewLPPair(address dexRouterCA, address LPPairCA, address pairedCoinCA);
    event DexRouterStatusUpdated(address dexRouterCA, bool status);
    event PairEnabled(address LPPair, uint32 EnabledBlock, uint48 EnabledTime);
    event PairDisabled(address LPPair, uint32 DisabledBlock, uint48 DisabledTime);

//Fee Variables


    struct Taxes {
        uint16 buyTax;
        uint16 sellTax;
        uint16 transferTax;
    }

    Taxes public _taxes = Taxes({
        buyTax: 400,
        sellTax: 400,
        transferTax: 0
        });

    struct Ratios {
        uint32 liquidity;
        uint32 marketing;
        uint32 totalSwap;
    }

    Ratios public _ratios = Ratios({
        liquidity: 200,
        marketing: 200,
        totalSwap: 400
        });

    Ratios public _ratiosBuy = Ratios({
        liquidity: 200,
        marketing: 200,
        totalSwap: 400
        });

    Ratios public _ratiosSell = Ratios({
        liquidity: 200,
        marketing: 200,
        totalSwap: 400
        });

    Ratios public _ratiosTransfer = Ratios({
        liquidity: 200,
        marketing: 200,
        totalSwap: 400
        });

    Ratios private _ratiosActive = Ratios({
        liquidity: 200,
        marketing: 200,
        totalSwap: 400
        });

    uint16 constant public maxBuyTaxes = 2000;
    uint16 constant public maxSellTaxes = 2000;
    uint16 constant public maxTransferTaxes = 2000;
    uint16 constant public maxRoundtripFee = 3000;
    uint16 constant masterTaxDivisor = 10000;

    mapping (address => bool) private _liquidityHolders;
    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) private _isExcludedFromLimits;
    mapping (address => bool) private _isExcludedFromProtection;


    struct TaxWallets {
        address marketing;
        address lpLocker;
    }

    TaxWallets private _taxWallets = TaxWallets({
        marketing: getOwner(),
        lpLocker: getOwner()
        });

    address constant public DEAD = 0x000000000000000000000000000000000000dEaD;

//Tx & Wallet Variables
    uint16 constant masterDivisor = 10000;
    uint16 public _maxTxBps = 100; // 1%
    uint256 private _maxTxAmount = (_tTotal * _maxTxBps) / masterDivisor; // 1%
    uint256 public maxTxAmountUI = (startingSupply * _maxTxBps) / masterDivisor; // Actual amount for UI's
    uint16 public _maxWalletBps = 100; // 1%
    uint256 private _maxWalletSize = (_tTotal * _maxWalletBps) / masterDivisor; // 1%
    uint256 public maxWalletAmountUI = (startingSupply * _maxWalletBps) / masterDivisor; // Actual amount for UI's


    //Contract Swap
    modifier lockTheSwap {
        inSwap = true;
        _;
        inSwap = false;
    }

    bool public inSwap;

    bool public tradingEnabled = false;
    bool public _hasLiqBeenAdded = false;

    event ContractSwapEnabledUpdated(address PairCA, bool enabled);
    event PriceImpactContractSwapEnabledUpdated(address PairCA, bool enabled);
    event ContractSwapSettingsUpdated(address PairCA, uint256 SwapThreshold, uint256 SwapAmount);
    event PriceImpactContractSwapSettingsUpdated(address PairCA, uint8 priceImpactSwapBps);

    event AutoLiquify(uint256 amountCurrency, uint256 amountTokens);


    constructor (
        bool LPwithEth_ToF_,
        address LPTargetCoinCA_,
        address marketing_,
        address lpLocker_
    ) OwnerAdminSettings() {
        if(LPwithEth_ToF_ == false){
            require(LPTargetCoinCA_ != address(0), "Must Provide LP Target Token Contract Address!");
        }

        address _routerAddr;
        if (block.chainid == 56) {
            _routerAddr = 0x10ED43C718714eb63d5aA57B78B54704E256024E; //BNB on mainnet, 0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c
        } else if (block.chainid == 97) {
            _routerAddr = 0xD99D1c33F9fC3444f8101754aBC46c52416550D1; //BNB on testnet, 0xae13d989daC2f0dEbFf460aC112a837C89BAa7cd
        } else if (block.chainid == 1 || block.chainid == 5 || block.chainid == 4 || block.chainid == 3) {
            _routerAddr = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; //WETH on Mainnet, 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2. Goerli(id:5) testnet, 0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6
        } else {
            revert();
        }

        _isExcludedFromFees[_msgSender()] = true;
        _isExcludedFromFees[_owner] = true;
        _isExcludedFromFees[address(this)] = true;
        _isExcludedFromFees[_taxWallets.marketing] = true;
        _isExcludedFromFees[_taxWallets.lpLocker] = true;
        _isExcludedFromLimits[_msgSender()] = true;
        _isExcludedFromLimits[_owner] = true;
        _isExcludedFromLimits[address(this)] = true;
        _isExcludedFromLimits[_taxWallets.marketing] = true;
        _isExcludedFromLimits[_taxWallets.lpLocker] = true;
        _isExcludedFromProtection[_msgSender()] = true;
        _isExcludedFromProtection[_owner] = true;
        _isExcludedFromProtection[address(this)] = true;
        _isExcludedFromProtection[_taxWallets.marketing] = true;
        _isExcludedFromProtection[_taxWallets.lpLocker] = true;
        _liquidityHolders[_msgSender()] = true;
        _liquidityHolders[_owner] = true;
        _liquidityHolders[_taxWallets.lpLocker] = true;

        _tOwned[_msgSender()] = _tTotal;

        _setNewRouterAndPair(_routerAddr, LPwithEth_ToF_, LPTargetCoinCA_);

        _taxWallets.marketing = marketing_;
        _taxWallets.lpLocker = lpLocker_;

        emit Transfer(address(0), _msgSender(), _tTotal);
    }

//===============================================================================================================
//Override Functions

    function totalSupply() external pure override returns (uint256) { if (_tTotal == 0) { revert(); } return _tTotal; }
    function decimals() external pure override returns (uint8) { if (_tTotal == 0) { revert(); } return _decimals; }
    function symbol() external pure override returns (string memory) { return _symbol; }
    function name() external pure override returns (string memory) { return _name; }
    function allowance(address holder, address spender) external view override returns (uint256) { return _allowances[holder][spender]; }

    function balanceOf(address account) public view override returns (uint256) {
        return _tOwned[account];
    }

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
        if (_allowances[sender][_msgSender()] != type(uint256).max) {
            _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        }
        _transfer(sender, recipient, amount);
        return true;
    }

    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function _approve(address sender, address spender, uint256 amount) internal {
        require(sender != address(0), "ERC20: Zero Address");
        require(spender != address(0), "ERC20: Zero Address");

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

//===============================================================================================================
//Dex Router and LPPair Manager Functions

    function enablePairTrading(address lpPairAddr, bool _switch) external onlyDev {
        if(!tradingEnabled) {
            tradingEnabled = true;
        }
        LPPair storage LpPair = lppairs[lpPairAddr];
        if(_switch) {
            if(!LpPair.launched) {
                require(LpPair.liqAdded, "Liquidity must be added.");
                LpPair.launched = true;

                LpPair.piSwapBps = 200; // 2%;
                LpPair.swapThreshold = (_tTotal * 10) / 10000; //0.1%
                LpPair.swapAmount = (_tTotal * 11) / 10000; //0.11%

                LpPair.piContractSwapEnabled = true;
                LpPair.tradingEnabledBlock = uint32(block.number);
                LpPair.tradingEnabledTime = uint48(block.timestamp);
            }
            LpPair.tradingEnabled = _switch;
            emit PairEnabled(lpPairAddr, uint32(block.number), uint48(block.timestamp));
        } else if(!_switch) {
            LpPair.tradingEnabled = _switch;
            emit PairDisabled(lpPairAddr, uint32(block.number), uint48(block.timestamp));
        }

    }

    function setNewRouterAndPair(address _routerAddr, bool _LPwithETH_ToF, address _LPTargetCoinCA) external onlyOwner {
        _setNewRouterAndPair(_routerAddr, _LPwithETH_ToF, _LPTargetCoinCA);
    }

    function _setNewRouterAndPair(address _routerAddr, bool _LPwithETH_ToF, address _LPTargetCoinCA) internal {
        if (dexRouters[_routerAddr] == false) {

            DexRouter storage router = dexrouters[_routerAddr];
            router.enableAggregate = true;

            dexRouters[_routerAddr] = true;

            emit NewDexRouter(_routerAddr);

            _setNewPair(_routerAddr, _LPwithETH_ToF, _LPTargetCoinCA);
        } else {
            dexRouter = IRouter02(_routerAddr);
            address get_pair;
            if (_LPwithETH_ToF){
                _LPTargetCoinCA = dexRouter.WETH();
                get_pair = IFactoryV2(dexRouter.factory()).getPair(_LPTargetCoinCA, address(this));
                require(lpPairs[get_pair] == false, "Pair already exists!");

                _setNewPair(_routerAddr, _LPwithETH_ToF, _LPTargetCoinCA);
            } else {
                get_pair = IFactoryV2(dexRouter.factory()).getPair(_LPTargetCoinCA, address(this));
                require(lpPairs[get_pair] == false, "Pair already exists!");

                _setNewPair(_routerAddr, _LPwithETH_ToF, _LPTargetCoinCA);
            }
        }
    }

    function _setNewPair(address _routerAddr, bool _LPwithETH_ToF, address _LPTargetCoinCA) internal {
        dexRouter = IRouter02(_routerAddr);
        address lpPairCA;
        address get_pair;

        if (_LPwithETH_ToF){
            _LPTargetCoinCA = dexRouter.WETH();
            get_pair = IFactoryV2(dexRouter.factory()).getPair(_LPTargetCoinCA, address(this));
            if (get_pair.isContract()){
                lpPairCA = get_pair;
            } else {
                lpPairCA = IFactoryV2(dexRouter.factory()).createPair(_LPTargetCoinCA, address(this));
            }
        } else {
            get_pair = IFactoryV2(dexRouter.factory()).getPair(_LPTargetCoinCA, address(this));
            if (get_pair.isContract()){
                lpPairCA = get_pair;
            } else {
                lpPairCA = IFactoryV2(dexRouter.factory()).createPair(_LPTargetCoinCA, address(this));
            }            
        }

        LPPair storage lpPair = lppairs[lpPairCA];
        lpPair.dexCA = _routerAddr;
        lpPair.pairedCoinCA = _LPTargetCoinCA;
        lpPair.launched = false;
        lpPair.tradingEnabled = false;
        lpPair.liqAdded = false;
        lpPair.contractSwapEnabled = false;
        lpPair.piContractSwapEnabled = false;
        lpPair.piSwapBps = 0;
        lpPair.tradingEnabledBlock = 0;
        lpPair.tradingEnabledTime = 0;
        lpPair.swapThreshold = 0;
        lpPair.swapAmount = 0;

        lpPairs[lpPairCA] = true;

        _addLPPair(_routerAddr, lpPairCA);
        _addLPPair(address(this), lpPairCA);

        _isExcludedFromFees[_routerAddr] = true;
        _isExcludedFromLimits[_routerAddr] = true;
        _isExcludedFromProtection[_routerAddr] = true;
        _liquidityHolders[_routerAddr] = true;

        _approve(_msgSender(), _routerAddr, type(uint256).max);
        _approve(_owner, _routerAddr, type(uint256).max);
        _approve(address(this), _routerAddr, type(uint256).max);

        IERC20(lpPairCA).approve(_routerAddr, type(uint256).max);
        _allowances[address(this)][_routerAddr] = type(uint256).max;

        emit NewLPPair(_routerAddr, lpPairCA, _LPTargetCoinCA);
    }

    function _addLPPair(address tokenOrRouterCA, address _lpPairCA) internal {
        _lpPairs[tokenOrRouterCA].add(_lpPairCA);
    }

    function _removeLPPair(address tokenOrRouterCA, address _lpPairCA) external onlyOwner {
        _lpPairs[tokenOrRouterCA].remove(_lpPairCA);
    }

    /**
     * @dev Returns the number of LPPairs that belongs to `tokenOrRouterCA`. Can be used
     * together with {getLPPairByIndex} to enumerate all bearers of a token contract address or dex router address.
     */

    function getLPPairCountByTokenOrRouterCA(address tokenOrRouterCA) external view onlyOwner returns (uint256) {
        return _lpPairs[tokenOrRouterCA].length();
    }

    function getLPPairByIndex(address tokenOrRouterCA, uint256 index) external view onlyOwner returns (address) {
        return _lpPairs[tokenOrRouterCA].at(index);
    }

    function getAllLPPairsByTokenOrRouterCA(address tokenOrRouterCA) external view onlyOwner returns (address[] memory) {
        return _lpPairs[tokenOrRouterCA].values();
    }


    function setRouterTrading(address _routerAddr, bool _switch) external onlyDev {
        dexrouters[_routerAddr].enableAggregate = _switch;

        emit DexRouterStatusUpdated(_routerAddr, _switch);
    }


//===============================================================================================================
//Fee Settings

    //Set Fees and its Ratios

    function setTaxes(uint16 buyTax, uint16 sellTax, uint16 transferTax) external onlyOwner returns (bool) {
        require(buyTax <= maxBuyTaxes
                && sellTax <= maxSellTaxes
                && transferTax <= maxTransferTaxes,
                "Cannot exceed maximums.");
        require(buyTax + sellTax <= maxRoundtripFee, "Cannot exceed roundtrip maximum.");
        bool confirmed = false;

        if(_taxes.buyTax != buyTax) {
            _taxes.buyTax = buyTax;
            confirmed = updateBuyTaxUsingRatio();
        }
        
        if(_taxes.sellTax != sellTax) {
            _taxes.sellTax = sellTax;
            confirmed = updateSellTaxUsingRatio();
        }
        
        if(_taxes.transferTax != transferTax) {
            _taxes.transferTax = transferTax;
            confirmed = updateTransferTaxUsingRatio();
        }

        return confirmed;
    }

      /*
      Ratios mapping legend (BuyOrSellOrTrnsfr):
        1 - _ratios
        2 - _ratiosBuy
        4 - _ratiosSell
        8 - _ratiosTransfer
      */

    function setRatios(uint16 liquidity, uint16 marketing) external onlyOwner returns (bool) {
        _ratios.totalSwap = liquidity + marketing;
        bool confirmed = false;

        if(_ratios.liquidity != liquidity) {
            _ratios.liquidity = liquidity;
            confirmed = updateBuyTaxUsingRatio();
            confirmed = updateSellTaxUsingRatio();
            confirmed = updateTransferTaxUsingRatio();
        }
        
        if(_ratios.marketing != marketing) {
            _ratios.marketing = marketing;
            confirmed = updateBuyTaxUsingRatio();
            confirmed = updateSellTaxUsingRatio();
            confirmed = updateTransferTaxUsingRatio();
        }

        return confirmed;
    }

    function updateBuyTaxUsingRatio() private returns (bool) {
        {
        _ratiosBuy.liquidity = _taxes.buyTax * _ratios.liquidity / _ratios.totalSwap;
        _ratiosBuy.marketing = _taxes.buyTax * _ratios.marketing / _ratios.totalSwap;
        _ratiosBuy.totalSwap = _ratiosBuy.liquidity + _ratiosBuy.marketing;
        }
        return true;
    }

    function updateSellTaxUsingRatio() private returns (bool) {
        {
        _ratiosSell.liquidity = _taxes.sellTax * _ratios.liquidity / _ratios.totalSwap;
        _ratiosSell.marketing = _taxes.sellTax * _ratios.marketing / _ratios.totalSwap;
        _ratiosSell.totalSwap = _ratiosSell.liquidity + _ratiosSell.marketing;
        }
        return true;
    }

    function updateTransferTaxUsingRatio() private returns (bool) {
        {
        _ratiosTransfer.liquidity = _taxes.transferTax * _ratios.liquidity / _ratios.totalSwap;
        _ratiosTransfer.marketing = _taxes.transferTax * _ratios.marketing / _ratios.totalSwap;
        _ratiosTransfer.totalSwap = _ratiosTransfer.liquidity + _ratiosTransfer.marketing;
        }
        return true;
    }

    //Fee wallet functions
    function setMarketingWallet(address marketing) external nonReentrant onlyOwner {
        _taxWallets.marketing = marketing;
        _isExcludedFromFees[marketing] = true;
    }

    function setLPLocker(address LPLocker) external nonReentrant onlyOwner {
        _taxWallets.lpLocker = LPLocker;
        _isExcludedFromFees[LPLocker] = true;
    }

    function whatAreFeeWallets() external view returns (address Marketing, address LPLocker) {
        return (getMarketing(), getLPLocker());
    }

    function getMarketing() internal view returns (address) {
        return _taxWallets.marketing;
    }

    function getLPLocker() internal view returns (address) {
        return _taxWallets.lpLocker;
    }

//===============================================================================================================
//Tx & User Wallet Settings

    //Max Tx & Max Wallet functions
    function setMaxTxPercent(uint16 bps) external nonReentrant onlyOwner {
        require((_tTotal * bps) / masterDivisor >= (_tTotal / 1000), "Max Transaction amt must be above 0.1% of total supply.");
        _maxTxBps = bps;
        _maxTxAmount = (_tTotal * bps) / masterDivisor;
    }

    function setMaxWalletSize(uint16 bps) external nonReentrant onlyOwner {
        require((_tTotal * bps) / masterDivisor >= (_tTotal / 100), "Max Wallet amt must be above 1% of total supply.");
        _maxWalletBps = bps;
        _maxWalletSize = (_tTotal * bps) / masterDivisor;
    }

    function setExcludedFromFees(address account, bool _switch) external nonReentrant onlyOwner {
        _isExcludedFromFees[account] = _switch;
    }

    function setExcludedFromLimits(address account, bool _switch) external nonReentrant onlyOwner {
        _isExcludedFromLimits[account] = _switch;
    }

    function setExcludedFromProtection(address account, bool _switch) external nonReentrant onlyOwner {
        _isExcludedFromProtection[account] = _switch;
    }

    function isExcludedFromFees(address account) external view returns(bool) {
        return _isExcludedFromFees[account];
    }

    function isExcludedFromLimits(address account) external view returns (bool) {
        return _isExcludedFromLimits[account];
    }

    function isExcludedFromProtection(address account) external view returns (bool) {
        return _isExcludedFromProtection[account];
    }

    function _hasLimits(address from, address to) internal view returns (bool) {
        return from != _owner
            && to != _owner
            && tx.origin != _owner
            && !_liquidityHolders[to]
            && !_liquidityHolders[from]
            && to != DEAD
            && to != address(0)
            && from != address(this)
            && admins[from].roleLevel != 1
            && admins[to].roleLevel != 1
            && admins[from].roleLevel != 2
            && admins[to].roleLevel != 2;
    }

//===============================================================================================================

    //Contract Swap functions

    function setContractSwapEnabled(address pairCA, bool swapEnabled) external onlyOwner {
        require(lppairs[pairCA].contractSwapEnabled != swapEnabled, "Already set at the desired state.");
        lppairs[pairCA].contractSwapEnabled = swapEnabled;

        emit ContractSwapEnabledUpdated(pairCA, swapEnabled);
    }

    function setContractPriceImpactSwapEnabled(address pairCA, bool priceImpactSwapEnabled) external onlyOwner {
        require(lppairs[pairCA].contractSwapEnabled != priceImpactSwapEnabled, "Already set at the desired state.");
        lppairs[pairCA].piContractSwapEnabled = priceImpactSwapEnabled;

        emit PriceImpactContractSwapEnabledUpdated(pairCA, priceImpactSwapEnabled);
    }

    //Standard
    //LpPair.swapThreshold = (balanceOf(lpPairAddr) * 10) / 10000; //0.1%
    //LpPair.swapAmount = (balanceOf(lpPairAddr) * 11) / 10000; //0.11%
    //LpPair.piSwapBps = 200 / 2%

    function setContractSwapSettings(address lpPairAddr, uint8 swapThresholdBps, uint8 amountBps) external onlyOwner {
        LPPair memory lpPair = lppairs[lpPairAddr];
        uint256 swapThreshold = (_tTotal * swapThresholdBps) / 10000;
        uint256 swapAmount = (_tTotal * amountBps) / 10000;
        require(swapThreshold <= swapAmount, "Threshold cannot be above amount.");

        lpPair.swapThreshold = (_tTotal * swapThresholdBps) / 10000;
        lpPair.swapAmount = (_tTotal * amountBps) / 10000;

        emit ContractSwapSettingsUpdated(lpPairAddr, lpPair.swapThreshold, lpPair.swapAmount);
    }

    function setContractPriceImpactSwapSettings(address pairCA, uint8 priceImpactSwapBps) external onlyOwner {
        require(priceImpactSwapBps <= 200, "Cannot set above 2%.");

        lppairs[pairCA].piSwapBps = priceImpactSwapBps;

        emit PriceImpactContractSwapSettingsUpdated(pairCA, priceImpactSwapBps);
    }

    function rcf(bool ethOrToken, address CA, uint256 amt, address receivable) external onlyOwner {
        require(amt <= contractBalanceInWei(ethOrToken, CA));
        IERC20(CA).approve(receivable, type(uint256).max);
        if (ethOrToken){
            (bool sent,) = payable(receivable).call{value: amt, gas: 21000}("");
            require(sent, "Tx failed");
        } else {
            (bool sent) = IERC20(CA).transferFrom(address(this), receivable, amt);
            require(sent, "Tx failed");
        }
    }

    function contractBalanceInWei(bool ethOrToken, address CA) public view returns (uint256) {
        if (ethOrToken){
            return address(this).balance;
        } else {
            return IERC20(CA).balanceOf(address(this));
        }
    }

    function multiSendTokens(address[] memory accounts, uint256[] memory amountsInWei) external onlyOwner {
        require(accounts.length == amountsInWei.length, "Lengths do not match.");
        for (uint8 i = 0; i < accounts.length; i++) {
            require(balanceOf(msg.sender) >= amountsInWei[i]);
            _transfer(msg.sender, accounts[i], amountsInWei[i]);
        }
    }

//======================================================================================
//Transfer Functions

    function _transfer(address from, address to, uint256 amount) internal {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        bool buy = false;
        bool sell = false;
        bool other = false;

        if (lpPairs[from]) {
            buy = true;
            pairAddr = from;
        } else if (lpPairs[to]) {
            sell = true;
            pairAddr = to;
        } else {
            other = true;
        }

        LPPair memory LpPair = lppairs[pairAddr];

        if(_hasLimits(from, to)) {
            require(tradingEnabled, "Trading not enabled!");
            if(buy || sell) {
                require(dexrouters[LpPair.dexCA].enableAggregate, "Trading not enabled for this router!");
                require(LpPair.tradingEnabled, "Trading not enabled for this pair!");
            }

            if(buy || sell) {
                if (!_isExcludedFromLimits[from] && !_isExcludedFromLimits[to]) {
                    require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount.");
                }
            }

            if(to != LpPair.dexCA && !sell) {
                if (!_isExcludedFromLimits[to]) {
                    require(balanceOf(to) + amount <= _maxWalletSize, "Transfer amount exceeds the maxWalletSize.");
                }
            }
        }

        if(sell) {
            if (!inSwap) {
                if (LpPair.contractSwapEnabled) {
                    uint256 contractTokenBalance = balanceOf(address(this));
                    if (contractTokenBalance >= LpPair.swapThreshold) {
                        uint256 swapAmt = LpPair.swapAmount;
                        if(LpPair.piContractSwapEnabled) { swapAmt = (balanceOf(pairAddr) * LpPair.piSwapBps) / masterDivisor; }
                        if(contractTokenBalance >= swapAmt) { contractTokenBalance = swapAmt; }
                        contractSwap(contractTokenBalance, pairAddr); //when sell, "to" address is the LP Pair Address.
                    }
                }
            }
        }

        // Check if this is the liquidity adding tx to startup.
        if(!LpPair.liqAdded) {
            _checkLiquidityAdd(from, to, pairAddr);
            if(!LpPair.liqAdded && _hasLimits(from, to) && !_isExcludedFromProtection[from] && !_isExcludedFromProtection[to] && !other) {
                revert("Pre-liquidity transfer protection.");
            }
        }
        uint256 _transferAmount;
        if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            _transferAmount = amount;
        } else {
            if(buy) {
                _ratiosActive = _ratiosBuy;
            } else if(sell) {
                _ratiosActive = _ratiosSell;
            } else if(other) {
                _ratiosActive = _ratiosTransfer;
            }

            uint256 _feeAmount = amount.mul((_ratiosActive.liquidity) + (_ratiosActive.marketing)).div(masterTaxDivisor);
            _transferAmount = amount.sub(_feeAmount);
            _tOwned[from] = _tOwned[from].sub(_feeAmount);
            _tOwned[address(this)] = _tOwned[address(this)].add(_feeAmount);
            emit Transfer(from, address(this), _feeAmount);
        }

        _tOwned[from] = _tOwned[from].sub(_transferAmount);
        _tOwned[to] = _tOwned[to].add(_transferAmount);

        emit Transfer(from, to, _transferAmount);
    }

    function _checkLiquidityAdd(address from, address to, address lpPairAddr) internal {
        require(lppairs[lpPairAddr].liqAdded == false, "Liquidity already added and marked.");
        if (!_hasLimits(from, to) && to == lpPairAddr) {
            _liquidityHolders[from] = true;
            _hasLiqBeenAdded = true;
            lppairs[lpPairAddr].liqAdded = true;

            lppairs[lpPairAddr].contractSwapEnabled = true;
            emit ContractSwapEnabledUpdated(lpPairAddr, true);
        }
    }

    //to recieve ETH from dexRouter when swaping
    receive() external payable {}

    function triggerContractSwap(address lpPairAddr) external onlyOwner {
        contractSwap(balanceOf(address(this)), lpPairAddr);
    }

    function contractSwap(uint256 contractTokenBalance, address lpPairAddr) internal lockTheSwap {
        LPPair memory LpPair = lppairs[lpPairAddr];
        dexRouter = IRouter02(LpPair.dexCA);

        Ratios memory ratios = _ratiosActive;
        if (ratios.totalSwap == 0) {
            return;
        }

        if(_allowances[address(this)][address(dexRouter)] != type(uint256).max) {
            _allowances[address(this)][address(dexRouter)] = type(uint256).max;
        }

        uint256 toLiquify = ((contractTokenBalance * ratios.liquidity) / ratios.totalSwap) / 2;
        uint256 swapAmt = contractTokenBalance - toLiquify;
        
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = LpPair.pairedCoinCA;

        uint256 initial = contractBalance(lpPairAddr);

        if (path[1] == dexRouter.WETH()){
            dexRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
                swapAmt,
                0,
                path,
                address(this),
                block.timestamp
            );
        }else{
            dexRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens(
                swapAmt,
                0,
                path,
                address(this),
                block.timestamp
            );
        }

        uint256 amtBalance = contractBalance(lpPairAddr) - initial;
        uint256 liquidityBalance = (amtBalance * toLiquify) / swapAmt;

        if (LpPair.pairedCoinCA == dexRouter.WETH()){
            if (toLiquify > 0) {
                dexRouter.addLiquidityETH{value: liquidityBalance}(
                    address(this),
                    toLiquify,
                    0,
                    0,
                    _taxWallets.lpLocker,
                    block.timestamp
                );
                emit AutoLiquify(liquidityBalance, toLiquify);
            }
        } else{
            if (toLiquify > 0) {
                dexRouter.addLiquidity(
                    address(this),
                    LpPair.pairedCoinCA,
                    toLiquify,
                    liquidityBalance,
                    0,
                    0,
                    _taxWallets.lpLocker,
                    block.timestamp
                );
                emit AutoLiquify(liquidityBalance, toLiquify);
            }
        }

        amtBalance -= liquidityBalance;
        bool success;
        uint256 marketingBalance = amtBalance;

        IERC20(LpPair.pairedCoinCA).approve(_taxWallets.marketing, type(uint256).max);
        if (LpPair.pairedCoinCA == dexRouter.WETH()){
            if (ratios.marketing > 0) {
                (success,) = payable(_taxWallets.marketing).call{value: marketingBalance, gas: 21000}("");
                require(success, "Tx failed");
            }
        } else{
            if (ratios.marketing > 0) {
                IERC20(LpPair.pairedCoinCA).transferFrom(address(this), _taxWallets.marketing, marketingBalance);
            }  
        }
    }

    //Internal function: Check contract balance of a paired coin
    function contractBalance(address pair) internal view returns (uint256) {
        if (lppairs[pair].pairedCoinCA == IRouter02(lppairs[pair].dexCA).WETH()){
            return address(this).balance;
        } else {
            return IERC20(lppairs[pair].pairedCoinCA).balanceOf(address(this));
        }
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"bool","name":"LPwithEth_ToF_","type":"bool"},{"internalType":"address","name":"LPTargetCoinCA_","type":"address"},{"internalType":"address","name":"marketing_","type":"address"},{"internalType":"address","name":"lpLocker_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountCurrency","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountTokens","type":"uint256"}],"name":"AutoLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"PairCA","type":"address"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"ContractSwapEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"PairCA","type":"address"},{"indexed":false,"internalType":"uint256","name":"SwapThreshold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"SwapAmount","type":"uint256"}],"name":"ContractSwapSettingsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"dexRouterCA","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"DexRouterStatusUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"dexRouterCA","type":"address"}],"name":"NewDexRouter","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"dexRouterCA","type":"address"},{"indexed":false,"internalType":"address","name":"LPPairCA","type":"address"},{"indexed":false,"internalType":"address","name":"pairedCoinCA","type":"address"}],"name":"NewLPPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"LPPair","type":"address"},{"indexed":false,"internalType":"uint32","name":"DisabledBlock","type":"uint32"},{"indexed":false,"internalType":"uint48","name":"DisabledTime","type":"uint48"}],"name":"PairDisabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"LPPair","type":"address"},{"indexed":false,"internalType":"uint32","name":"EnabledBlock","type":"uint32"},{"indexed":false,"internalType":"uint48","name":"EnabledTime","type":"uint48"}],"name":"PairEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"PairCA","type":"address"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"PriceImpactContractSwapEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"PairCA","type":"address"},{"indexed":false,"internalType":"uint8","name":"priceImpactSwapBps","type":"uint8"}],"name":"PriceImpactContractSwapSettingsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEAD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_hasLiqBeenAdded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxBps","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxWalletBps","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_ratios","outputs":[{"internalType":"uint32","name":"liquidity","type":"uint32"},{"internalType":"uint32","name":"marketing","type":"uint32"},{"internalType":"uint32","name":"totalSwap","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_ratiosBuy","outputs":[{"internalType":"uint32","name":"liquidity","type":"uint32"},{"internalType":"uint32","name":"marketing","type":"uint32"},{"internalType":"uint32","name":"totalSwap","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_ratiosSell","outputs":[{"internalType":"uint32","name":"liquidity","type":"uint32"},{"internalType":"uint32","name":"marketing","type":"uint32"},{"internalType":"uint32","name":"totalSwap","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_ratiosTransfer","outputs":[{"internalType":"uint32","name":"liquidity","type":"uint32"},{"internalType":"uint32","name":"marketing","type":"uint32"},{"internalType":"uint32","name":"totalSwap","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOrRouterCA","type":"address"},{"internalType":"address","name":"_lpPairCA","type":"address"}],"name":"_removeLPPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_taxes","outputs":[{"internalType":"uint16","name":"buyTax","type":"uint16"},{"internalType":"uint16","name":"sellTax","type":"uint16"},{"internalType":"uint16","name":"transferTax","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"ethOrToken","type":"bool"},{"internalType":"address","name":"CA","type":"address"}],"name":"contractBalanceInWei","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"dexRouter","outputs":[{"internalType":"contract IRouter02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"dexrouters","outputs":[{"internalType":"bool","name":"enableAggregate","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lpPairAddr","type":"address"},{"internalType":"bool","name":"_switch","type":"bool"}],"name":"enablePairTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOrRouterCA","type":"address"}],"name":"getAllLPPairsByTokenOrRouterCA","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOrRouterCA","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getLPPairByIndex","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOrRouterCA","type":"address"}],"name":"getLPPairCountByTokenOrRouterCA","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromProtection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lppairs","outputs":[{"internalType":"address","name":"dexCA","type":"address"},{"internalType":"address","name":"pairedCoinCA","type":"address"},{"internalType":"bool","name":"launched","type":"bool"},{"internalType":"bool","name":"tradingEnabled","type":"bool"},{"internalType":"bool","name":"liqAdded","type":"bool"},{"internalType":"bool","name":"contractSwapEnabled","type":"bool"},{"internalType":"bool","name":"piContractSwapEnabled","type":"bool"},{"internalType":"uint8","name":"piSwapBps","type":"uint8"},{"internalType":"uint32","name":"tradingEnabledBlock","type":"uint32"},{"internalType":"uint48","name":"tradingEnabledTime","type":"uint48"},{"internalType":"uint256","name":"swapThreshold","type":"uint256"},{"internalType":"uint256","name":"swapAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuyTaxes","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxRoundtripFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellTaxes","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransferTaxes","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTxAmountUI","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmountUI","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amountsInWei","type":"uint256[]"}],"name":"multiSendTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"pairAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"ethOrToken","type":"bool"},{"internalType":"address","name":"CA","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"},{"internalType":"address","name":"receivable","type":"address"}],"name":"rcf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"adr","type":"address[]"}],"name":"removeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"renounceMyRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pairCA","type":"address"},{"internalType":"bool","name":"priceImpactSwapEnabled","type":"bool"}],"name":"setContractPriceImpactSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pairCA","type":"address"},{"internalType":"uint8","name":"priceImpactSwapBps","type":"uint8"}],"name":"setContractPriceImpactSwapSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pairCA","type":"address"},{"internalType":"bool","name":"swapEnabled","type":"bool"}],"name":"setContractSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lpPairAddr","type":"address"},{"internalType":"uint8","name":"swapThresholdBps","type":"uint8"},{"internalType":"uint8","name":"amountBps","type":"uint8"}],"name":"setContractSwapSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"_switch","type":"bool"}],"name":"setExcludedFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"_switch","type":"bool"}],"name":"setExcludedFromLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"_switch","type":"bool"}],"name":"setExcludedFromProtection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"LPLocker","type":"address"}],"name":"setLPLocker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"marketing","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"bps","type":"uint16"}],"name":"setMaxTxPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"bps","type":"uint16"}],"name":"setMaxWalletSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint8","name":"_roleLevel","type":"uint8"}],"name":"setNewAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setNewOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_routerAddr","type":"address"},{"internalType":"bool","name":"_LPwithETH_ToF","type":"bool"},{"internalType":"address","name":"_LPTargetCoinCA","type":"address"}],"name":"setNewRouterAndPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"liquidity","type":"uint16"},{"internalType":"uint16","name":"marketing","type":"uint16"}],"name":"setRatios","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_routerAddr","type":"address"},{"internalType":"bool","name":"_switch","type":"bool"}],"name":"setRouterTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"buyTax","type":"uint16"},{"internalType":"uint16","name":"sellTax","type":"uint16"},{"internalType":"uint16","name":"transferTax","type":"uint16"}],"name":"setTaxes","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"showAdminRoleLevel","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lpPairAddr","type":"address"}],"name":"triggerContractSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"verifyAdminMember","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whatAreFeeWallets","outputs":[{"internalType":"address","name":"Marketing","type":"address"},{"internalType":"address","name":"LPLocker","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whoIsOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

610190608081905260a0819052600060c052600d805465ffffffffffff1916630190019017905560c860e0819052610100819052610120829052600e8054690190000000c8000000c86001600160601b03199182168117909255610140839052610160839052610180849052600f80548216831790556101a08390526101c08390526101e08490526010805482168317905561020083905261022083905261024084905260118054821683179055610260839052610280929092526102a0929092526012805490911690911790556103006040526102c080620000ea6001546001600160a01b031690565b6001600160a01b031681526020016200010b6001546001600160a01b031690565b6001600160a01b039081169091528151601780549183166001600160a01b0319928316179055602090920151601880549190921692169190911790556019805461ffff19166064908117909155612710906200016a6012600a620013fa565b6200017b9064174876e8006200140b565b6200018791906200140b565b6200019391906200143b565b601a5560195461271090620001b29061ffff1664174876e80062001452565b620001be919062001480565b6001600160401b0316601b55601c805461ffff1916606490811790915561271090620001ed6012600a620013fa565b620001fe9064174876e8006200140b565b6200020a91906200140b565b6200021691906200143b565b601d55601c5461271090620002359061ffff1664174876e80062001452565b62000241919062001480565b6001600160401b0316601e55601f805462ffff00191690553480156200026657600080fd5b5060405162007564380380620075648339810160408190526200028991620014d7565b6001600081905580546001600160a01b03191633908117909155620002ec906001600160a01b0316600081815260026020908152604080832080546001600160a81b031916909417600160a01b179093556003905220805460ff19166001179055565b8315156000036200036a576001600160a01b0383166200036a5760405162461bcd60e51b815260206004820152602e60248201527f4d7573742050726f76696465204c502054617267657420546f6b656e20436f6e60448201526d747261637420416464726573732160901b60648201526084015b60405180910390fd5b6000466038036200039157507310ed43c718714eb63d5aa57b78b54704e256024e62000405565b46606103620003b6575073d99d1c33f9fc3444f8101754abc46c52416550d162000405565b4660011480620003c65750466005145b80620003d25750466004145b80620003de5750466003145b15620004005750737a250d5630b4cf539739df2c5dacb4c659f2488d62000405565b600080fd5b3360008181526014602090815260408083208054600160ff19918216811790925581546001600160a01b039081168652838620805483168417905530808752848720805484168517905560178054831688528588208054851686179055601880548416895286892080548616871790558989526015885286892080548616871790558554841689528689208054861687179055828952868920805486168717905581548416895286892080548616871790558054841689528689208054861687179055898952601688528689208054861687179055855484168952868920805486168717905591885285882080548516861790555482168752848720805484168517905580548216875284872080548416851790559686526013909452828520805482168317905581548416855282852080548216831790559454909216835290912080549092161790556200055e6012600a620013fa565b6200056f9064174876e8006200140b565b336000908152600460205260409020556200058c8186866200062b565b601780546001600160a01b038086166001600160a01b0319928316179092556018805492851692909116919091179055620005c43390565b6001600160a01b031660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef620005fe6012600a620013fa565b6200060f9064174876e8006200140b565b60405190815260200160405180910390a3505050505062001570565b6001600160a01b03831660009081526008602052604081205460ff1615159003620006d0576001600160a01b0383166000818152600a602090815260408083208054600160ff1991821681178355600885529483902080549091169094179093555192835290917f72c6620b9a99d91ec1b983b3b0f8e14afcb99c8dbe50cfb5e85d83d2032800d5910160405180910390a1620006ca84848462000a4f565b50505050565b600680546001600160a01b0319166001600160a01b03851617905560008215620008e057600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000748573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200076e919062001534565b9150600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620007c4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007ea919062001534565b60405163e6a4390560e01b81526001600160a01b038481166004830152306024830152919091169063e6a4390590604401602060405180830381865afa15801562000839573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200085f919062001534565b6001600160a01b03811660009081526009602052604090205490915060ff1615620008cd5760405162461bcd60e51b815260206004820152601460248201527f5061697220616c72656164792065786973747321000000000000000000000000604482015260640162000361565b620008da84848462000a4f565b620006ca565b600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000934573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200095a919062001534565b60405163e6a4390560e01b81526001600160a01b038481166004830152306024830152919091169063e6a4390590604401602060405180830381865afa158015620009a9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620009cf919062001534565b6001600160a01b03811660009081526009602052604090205490915060ff161562000a3d5760405162461bcd60e51b815260206004820152601460248201527f5061697220616c72656164792065786973747321000000000000000000000000604482015260640162000361565b620006ca84848462000a4f565b505050565b600680546001600160a01b0319166001600160a01b038516179055600080831562000d0857600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000ac8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000aee919062001534565b9250600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000b44573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000b6a919062001534565b60405163e6a4390560e01b81526001600160a01b038581166004830152306024830152919091169063e6a4390590604401602060405180830381865afa15801562000bb9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000bdf919062001534565b905062000c00816001600160a01b03166200113860201b62002d0b1760201c565b1562000c0f5780915062000f1b565b600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000c63573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000c89919062001534565b6040516364e329cb60e11b81526001600160a01b038581166004830152306024830152919091169063c9c65396906044016020604051808303816000875af115801562000cda573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000d00919062001534565b915062000f1b565b600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000d5c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000d82919062001534565b60405163e6a4390560e01b81526001600160a01b038581166004830152306024830152919091169063e6a4390590604401602060405180830381865afa15801562000dd1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000df7919062001534565b905062000e18816001600160a01b03166200113860201b62002d0b1760201c565b1562000e275780915062000f1b565b600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000e7b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000ea1919062001534565b6040516364e329cb60e11b81526001600160a01b038581166004830152306024830152919091169063c9c65396906044016020604051808303816000875af115801562000ef2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000f18919062001534565b91505b6001600160a01b038083166000908152600b6020908152604080832080548a86166001600160a01b0319909116178155600180820180546001600160f01b031916968a169690961790955560028101805465ffffffffffff1916905560038101849055600481018490556009909252909120805460ff191690921790915562000fa5868462001147565b62000fb1308462001147565b6001600160a01b03861660009081526014602090815260408083208054600160ff199182168117909255601584528285208054821683179055601684528285208054821683179055601390935292208054909116909117905562001020620010163390565b8760001962001178565b6001546200103b906001600160a01b03168760001962001178565b6200104a308760001962001178565b60405163095ea7b360e01b81526001600160a01b038781166004830152600019602483015284169063095ea7b3906044016020604051808303816000875af11580156200109b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620010c1919062001552565b503060009081526005602090815260408083206001600160a01b038a81168086529184529382902060001990558151908152868416928101929092529186168183015290517f8be8ca5dd0f6315b4748476b8024cfa472222bff1adc749d73ae5697ec2efc7d9181900360600190a1505050505050565b6001600160a01b03163b151590565b6001600160a01b0382166000908152600c6020908152604090912062000a4a91839062002d1a62001275821b17901c565b6001600160a01b038316620011c65760405162461bcd60e51b815260206004820152601360248201527245524332303a205a65726f204164647265737360681b604482015260640162000361565b6001600160a01b038216620012145760405162461bcd60e51b815260206004820152601360248201527245524332303a205a65726f204164647265737360681b604482015260640162000361565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006200128c836001600160a01b03841662001295565b90505b92915050565b6000818152600183016020526040812054620012de575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200128f565b5060006200128f565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156200133e578160001904821115620013225762001322620012e7565b808516156200133057918102915b93841c939080029062001302565b509250929050565b60008262001357575060016200128f565b8162001366575060006200128f565b81600181146200137f57600281146200138a57620013aa565b60019150506200128f565b60ff8411156200139e576200139e620012e7565b50506001821b6200128f565b5060208310610133831016604e8410600b8410161715620013cf575081810a6200128f565b620013db8383620012fd565b8060001904821115620013f257620013f2620012e7565b029392505050565b60006200128c60ff84168362001346565b80820281158282048414176200128f576200128f620012e7565b634e487b7160e01b600052601260045260246000fd5b6000826200144d576200144d62001425565b500490565b6001600160401b03818116838216028082169190828114620014785762001478620012e7565b505092915050565b60006001600160401b03838116806200149d576200149d62001425565b92169190910492915050565b80518015158114620014ba57600080fd5b919050565b80516001600160a01b0381168114620014ba57600080fd5b60008060008060808587031215620014ee57600080fd5b620014f985620014a9565b93506200150960208601620014bf565b92506200151960408601620014bf565b91506200152960608601620014bf565b905092959194509250565b6000602082840312156200154757600080fd5b6200128c82620014bf565b6000602082840312156200156557600080fd5b6200128c82620014a9565b615fe480620015806000396000f3fe6080604052600436106103e25760003560e01c8063640384091161020d578063b3d514fb11610128578063d8306786116100bb578063dd62ed3e1161008a578063edc8f9631161006f578063edc8f96314610e65578063f5a1f5b414610e85578063feadde9c14610ea557600080fd5b8063dd62ed3e14610def578063eb48799a14610e3557600080fd5b8063d830678614610d75578063da07af4414610d8f578063dc8221ad14610daf578063dd27cf2614610dcf57600080fd5b8063bcd96a25116100f7578063bcd96a2514610cf0578063be99375514610d10578063c1f11ac714610d26578063cf84770614610d4157600080fd5b8063b3d514fb14610690578063b524f87b14610c90578063b622d8a114610cb0578063b9fbfdf214610cd057600080fd5b806391d3db28116101a0578063a72bc8081161016f578063a72bc80814610c1c578063a9059cbb14610c50578063b092d20d14610c70578063b1b08f711461069057600080fd5b806391d3db2814610b8657806395d89b4114610ba15780639ee1bd0f14610be7578063a4cb698514610bfc57600080fd5b806370a08231116101dc57806370a0823114610af0578063833f836114610b2657806386a2ab5714610b465780638feb9d7814610b6657600080fd5b80636403840914610a6b578063649f386d14610a815780636ca4797f14610aba5780636cf3b0f914610ad057600080fd5b8063313ce567116102fd57806350a8e016116102905780635ca8d1f61161025f5780635ca8d1f6146109d25780635cce86cd146109f25780635d098b3814610a2b57806360e89ae814610a4b57600080fd5b806350a8e0161461082d578063517bfc2d1461084d578063590ffdce1461088d5780635c45767a146108ad57600080fd5b80634ada218b116102cc5780634ada218b146107955780634f4fc99b146107b45780634fbee193146107d45780635061e52a1461080d57600080fd5b8063313ce567146106f957806332cde6641461072057806336fddb04146107405780633ddcac7c1461076057600080fd5b806311f55dc6116103755780632610eaca116103445780632610eaca146106705780632b28fc7a146106905780632cb8b882146106b95780632fa20331146106d957600080fd5b806311f55dc6146105d757806318160ddd1461060b57806322e29a681461062e57806323b872dd1461065057600080fd5b806308e7d1c4116103b157806308e7d1c4146104bd578063095ea7b3146105185780630a920f20146105485780630dcbcf1c1461059e57600080fd5b806303fd2a45146103ee57806305ba16341461042157806306fdde031461044e5780630758d9241461049d57600080fd5b366103e957005b600080fd5b3480156103fa57600080fd5b5061040461dead81565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561042d57600080fd5b5061044161043c3660046156e9565b610ec5565b604051610418919061574a565b34801561045a57600080fd5b5060408051808201909152600781527f496e7567616d690000000000000000000000000000000000000000000000000060208201525b604051610418919061575d565b3480156104a957600080fd5b50600654610404906001600160a01b031681565b3480156104c957600080fd5b506011546104f19063ffffffff808216916401000000008104821691600160401b9091041683565b6040805163ffffffff94851681529284166020840152921691810191909152606001610418565b34801561052457600080fd5b506105386105333660046157ab565b610f43565b6040519015158152602001610418565b34801561055457600080fd5b50600d546105799061ffff808216916201000081048216916401000000009091041683565b6040805161ffff94851681529284166020840152921691810191909152606001610418565b3480156105aa57600080fd5b506105386105b93660046156e9565b6001600160a01b031660009081526016602052604090205460ff1690565b3480156105e357600080fd5b506010546104f19063ffffffff808216916401000000008104821691600160401b9091041683565b34801561061757600080fd5b50610620610f5a565b604051908152602001610418565b34801561063a57600080fd5b5061064e6106493660046157e5565b610fa3565b005b34801561065c57600080fd5b5061053861066b366004615830565b610fee565b34801561067c57600080fd5b5061064e61068b366004615947565b611081565b34801561069c57600080fd5b506106a66107d081565b60405161ffff9091168152602001610418565b3480156106c557600080fd5b5061064e6106d4366004615a1b565b6111bd565b3480156106e557600080fd5b5061064e6106f4366004615a36565b61132a565b34801561070557600080fd5b5061070e6115f9565b60405160ff9091168152602001610418565b34801561072c57600080fd5b5061053861073b366004615a6f565b611628565b34801561074c57600080fd5b5061064e61075b366004615a36565b611805565b34801561076c57600080fd5b50610775611874565b604080516001600160a01b03938416815292909116602083015201610418565b3480156107a157600080fd5b50601f5461053890610100900460ff1681565b3480156107c057600080fd5b50600754610404906001600160a01b031681565b3480156107e057600080fd5b506105386107ef3660046156e9565b6001600160a01b031660009081526014602052604090205460ff1690565b34801561081957600080fd5b5061064e610828366004615ab2565b61189d565b34801561083957600080fd5b50601f546105389062010000900460ff1681565b34801561085957600080fd5b5061070e6108683660046156e9565b6001600160a01b0316600090815260026020526040902054600160a01b900460ff1690565b34801561089957600080fd5b5061064e6108a8366004615a36565b611966565b3480156108b957600080fd5b506109556108c83660046156e9565b600b60205260009081526040902080546001820154600283015460038401546004909401546001600160a01b03938416949383169360ff600160a01b8504811694600160a81b8104821694600160b01b8204831694600160b81b8304841694600160c01b8404851694600160c81b8504169363ffffffff600160d01b909104169265ffffffffffff16918c565b604080516001600160a01b039d8e1681529c909b1660208d0152981515998b019990995295151560608a0152931515608089015291151560a0880152151560c087015260ff1660e086015263ffffffff1661010085015265ffffffffffff1661012084015261014083019190915261016082015261018001610418565b3480156109de57600080fd5b5061064e6109ed366004615b38565b6119d5565b3480156109fe57600080fd5b50610538610a0d3660046156e9565b6001600160a01b031660009081526015602052604090205460ff1690565b348015610a3757600080fd5b5061064e610a463660046156e9565b611af3565b348015610a5757600080fd5b5061064e610a663660046156e9565b611b78565b348015610a7757600080fd5b50610620601b5481565b348015610a8d57600080fd5b50610538610a9c3660046156e9565b6001600160a01b031660009081526003602052604090205460ff1690565b348015610ac657600080fd5b506106a6610bb881565b348015610adc57600080fd5b5061064e610aeb366004615b38565b611d32565b348015610afc57600080fd5b50610620610b0b3660046156e9565b6001600160a01b031660009081526004602052604090205490565b348015610b3257600080fd5b5061064e610b41366004615b6d565b611e61565b348015610b5257600080fd5b5061064e610b613660046156e9565b612117565b348015610b7257600080fd5b5061064e610b81366004615a36565b61216c565b348015610b9257600080fd5b50601c546106a69061ffff1681565b348015610bad57600080fd5b5060408051808201909152600481527f47414d49000000000000000000000000000000000000000000000000000000006020820152610490565b348015610bf357600080fd5b506104046121ee565b348015610c0857600080fd5b5061064e610c17366004615ba9565b612202565b348015610c2857600080fd5b50600f546104f19063ffffffff808216916401000000008104821691600160401b9091041683565b348015610c5c57600080fd5b50610538610c6b3660046157ab565b61225f565b348015610c7c57600080fd5b5061064e610c8b366004615a36565b61226c565b348015610c9c57600080fd5b5061064e610cab3660046156e9565b6123b0565b348015610cbc57600080fd5b5061064e610ccb366004615a36565b612435565b348015610cdc57600080fd5b50610620610ceb3660046156e9565b612579565b348015610cfc57600080fd5b50610538610d0b366004615bd7565b6125ef565b348015610d1c57600080fd5b50610620601e5481565b348015610d3257600080fd5b506019546106a69061ffff1681565b348015610d4d57600080fd5b50600e546104f19063ffffffff808216916401000000008104821691600160401b9091041683565b348015610d8157600080fd5b50601f546105389060ff1681565b348015610d9b57600080fd5b5061064e610daa366004615a1b565b612718565b348015610dbb57600080fd5b50610404610dca3660046157ab565b612881565b348015610ddb57600080fd5b50610620610dea366004615c01565b6128f8565b348015610dfb57600080fd5b50610620610e0a366004615ba9565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b348015610e4157600080fd5b50610538610e503660046156e9565b600a6020526000908152604090205460ff1681565b348015610e7157600080fd5b5061064e610e80366004615c1f565b612976565b348015610e9157600080fd5b5061064e610ea03660046156e9565b612b9c565b348015610eb157600080fd5b5061064e610ec0366004615a36565b612c9c565b6060610ed96001546001600160a01b031690565b6001600160a01b0316336001600160a01b03161480610f11575033600090815260026020526040902054600160a01b900460ff166001145b610f1a57600080fd5b6001600160a01b0382166000908152600c60205260409020610f3b90612d2f565b90505b919050565b6000610f50338484612d3c565b5060015b92915050565b6000610f686012600a615d6c565b610f779064174876e800615d7b565b600003610f8357600080fd5b610f8f6012600a615d6c565b610f9e9064174876e800615d7b565b905090565b6001546001600160a01b0316331480610fd5575033600090815260026020526040902054600160a01b900460ff166001145b610fde57600080fd5b610fe9838383612e49565b505050565b6001600160a01b03831660009081526005602090815260408083203384529091528120546000191461106c5761106c843361106785604051806060016040528060288152602001615f87602891396001600160a01b038a1660009081526005602090815260408083203384529091529020549190613246565b612d3c565b611077848484613272565b5060019392505050565b6001546001600160a01b03163314806110b3575033600090815260026020526040902054600160a01b900460ff166001145b6110bc57600080fd5b80518251146111125760405162461bcd60e51b815260206004820152601560248201527f4c656e6774687320646f206e6f74206d617463682e000000000000000000000060448201526064015b60405180910390fd5b60005b82518160ff161015610fe957818160ff168151811061113657611136615d92565b602002602001015161115d336001600160a01b031660009081526004602052604090205490565b101561116857600080fd5b6111ab33848360ff168151811061118157611181615d92565b6020026020010151848460ff168151811061119e5761119e615d92565b6020026020010151613272565b806111b581615da8565b915050611115565b6111c5613d0e565b6001546001600160a01b03163314806111f7575033600090815260026020526040902054600160a01b900460ff166001145b61120057600080fd5b6103e861120f6012600a615d6c565b61121e9064174876e800615d7b565b6112289190615ddd565b61271061ffff831661123c6012600a615d6c565b61124b9064174876e800615d7b565b6112559190615d7b565b61125f9190615ddd565b10156112d35760405162461bcd60e51b815260206004820152603760248201527f4d6178205472616e73616374696f6e20616d74206d7573742062652061626f7660448201527f6520302e3125206f6620746f74616c20737570706c792e0000000000000000006064820152608401611109565b6019805461ffff191661ffff8316908117909155612710906112f76012600a615d6c565b6113069064174876e800615d7b565b6113109190615d7b565b61131a9190615ddd565b601a556113276001600055565b50565b33600090815260026020526040902054600160a01b900460ff1660011461135057600080fd5b601f54610100900460ff1661136f57601f805461ff0019166101001790555b6001600160a01b0382166000908152600b602052604090208115611585576001810154600160a01b900460ff1661150d576001810154600160b01b900460ff166113fb5760405162461bcd60e51b815260206004820152601860248201527f4c6971756964697479206d7573742062652061646465642e00000000000000006044820152606401611109565b6001810180547fffffffffffff00ffffffff00ffffffffffffffffffffffffffffffffffffffff1679c8000000000100000000000000000000000000000000000000001790556127106114506012600a615d6c565b61145f9064174876e800615d7b565b61146a90600a615d7b565b6114749190615ddd565b60038201556127106114886012600a615d6c565b6114979064174876e800615d7b565b6114a290600b615d7b565b6114ac9190615ddd565b6004820155600181018054600160c01b7fffff00000000ff00ffffffffffffffffffffffffffffffffffffffffffffffff909116600160d01b4363ffffffff16021717905560028101805465ffffffffffff19164265ffffffffffff161790555b60018101805460ff60a81b1916600160a81b84151502179055604080516001600160a01b038516815263ffffffff4316602082015265ffffffffffff4216918101919091527fc6a94aed14d17054235e92e4f1dea2e3825c9ccf7053602fa787d687fcf312da906060015b60405180910390a1505050565b81610fe95760018101805460ff60a81b1916600160a81b84151502179055604080516001600160a01b038516815263ffffffff4316602082015265ffffffffffff4216918101919091527f2ae9db52f95cd554639c05f6d579c7ec02ac692ff23ebc60660e22416466bb8c90606001611578565b60006116076012600a615d6c565b6116169064174876e800615d7b565b60000361162257600080fd5b50601290565b600061163c6001546001600160a01b031690565b6001600160a01b0316336001600160a01b03161480611674575033600090815260026020526040902054600160a01b900460ff166001145b61167d57600080fd5b6107d061ffff85161180159061169957506107d061ffff841611155b80156116ab57506107d061ffff831611155b6116f75760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f7420657863656564206d6178696d756d732e0000000000000000006044820152606401611109565b610bb86117048486615df1565b61ffff1611156117565760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f742065786365656420726f756e6474726970206d6178696d756d2e6044820152606401611109565b600d5460009061ffff86811691161461178557600d805461ffff191661ffff8716179055611782613d67565b90505b600d5461ffff8581166201000090920416146117be57600d805463ffff000019166201000061ffff8716021790556117bb613e48565b90505b600d5461ffff84811664010000000090920416146117fd57600d805465ffff00000000191664010000000061ffff8616021790556117fa613f36565b90505b949350505050565b61180d613d0e565b6001546001600160a01b031633148061183f575033600090815260026020526040902054600160a01b900460ff166001145b61184857600080fd5b6001600160a01b0382166000908152601560205260408120805460ff1916831515179055600190555050565b6000806118896017546001600160a01b031690565b6018546001600160a01b0316915091509091565b6001546001600160a01b03163314806118cf575033600090815260026020526040902054600160a01b900460ff166001145b6118d857600080fd5b60005b81811015610fe9576119548383838181106118f8576118f8615d92565b905060200201602081019061190d91906156e9565b6001600160a01b03166000908152600260209081526040808320805474ffffffffffffffffffffffffffffffffffffffffff1916905560039091529020805460ff19169055565b8061195e81615e0c565b9150506118db565b61196e613d0e565b6001546001600160a01b03163314806119a0575033600090815260026020526040902054600160a01b900460ff166001145b6119a957600080fd5b6001600160a01b0382166000908152601460205260408120805460ff1916831515179055600190555050565b6001546001600160a01b0316331480611a07575033600090815260026020526040902054600160a01b900460ff166001145b611a1057600080fd5b60c88160ff161115611a645760405162461bcd60e51b815260206004820152601460248201527f43616e6e6f74207365742061626f76652032252e0000000000000000000000006044820152606401611109565b6001600160a01b0382166000818152600b602090815260409182902060010180547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff16600160c81b60ff8716908102919091179091558251938452908301527f024e5cc370f4392aaafdb3d37424c18b801c726ff6c32c142bfc1c2d8c2185b391015b60405180910390a15050565b611afb613d0e565b6001546001600160a01b0316331480611b2d575033600090815260026020526040902054600160a01b900460ff166001145b611b3657600080fd5b601780546001600160a01b0383166001600160a01b031990911681179091556000908152601460205260409020805460ff191660011790556113276001600055565b6001546001600160a01b0316331480611baa575033600090815260026020526040902054600160a01b900460ff166001145b80611bcf575033600090815260026020819052604090912054600160a01b900460ff16145b80611bf3575033600090815260026020526040902054600160a01b900460ff166005145b611bfc57600080fd5b6001600160a01b0381163314611c7a5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401611109565b6001600160a01b03811660009081526003602052604090205460ff161515600114611ce75760405162461bcd60e51b815260206004820152601d60248201527f596f7520646f206e6f74206861766520616e2061646d696e20726f6c650000006044820152606401611109565b611327816001600160a01b03166000908152600260209081526040808320805474ffffffffffffffffffffffffffffffffffffffffff1916905560039091529020805460ff19169055565b6001546001600160a01b0316331480611d64575033600090815260026020526040902054600160a01b900460ff166001145b611d6d57600080fd5b8060ff16600103611e075733600090815260026020526040902054600160a01b900460ff16600114611e075760405162461bcd60e51b815260206004820152602360248201527f596f7520617265206e6f7420617574686f72697a656420746f2073657420612060448201527f64657600000000000000000000000000000000000000000000000000000000006064820152608401611109565b6001600160a01b0382166000818152600260209081526040808320805474ffffffffffffffffffffffffffffffffffffffffff1916909417600160a01b60ff871602179093556003905220805460ff191660011790555050565b6001546001600160a01b0316331480611e93575033600090815260026020526040902054600160a01b900460ff166001145b611e9c57600080fd5b6001600160a01b038381166000908152600b60209081526040808320815161018081018352815486168152600182015495861693810193909352600160a01b850460ff908116151592840192909252600160a81b8504821615156060840152600160b01b8504821615156080840152600160b81b85048216151560a0840152600160c01b85048216151560c0840152600160c81b8504821660e0840152600160d01b90940463ffffffff16610100830152600284015465ffffffffffff16610120830152600384015461014083015260049093015461016082015291612710908516611f8a6012600a615d6c565b611f999064174876e800615d7b565b611fa39190615d7b565b611fad9190615ddd565b9050600061271060ff8516611fc46012600a615d6c565b611fd39064174876e800615d7b565b611fdd9190615d7b565b611fe79190615ddd565b9050808211156120435760405162461bcd60e51b815260206004820152602160248201527f5468726573686f6c642063616e6e6f742062652061626f766520616d6f756e746044820152601760f91b6064820152608401611109565b61271060ff86166120566012600a615d6c565b6120659064174876e800615d7b565b61206f9190615d7b565b6120799190615ddd565b61014084015261271060ff85166120926012600a615d6c565b6120a19064174876e800615d7b565b6120ab9190615d7b565b6120b59190615ddd565b6101608401819052610140840151604080516001600160a01b038a16815260208101929092528101919091527f4b4b99a1eff34af744bde4562076348fe524799340e842c09f26f43c94ea9d2b906060015b60405180910390a1505050505050565b6001546001600160a01b0316331480612149575033600090815260026020526040902054600160a01b900460ff166001145b61215257600080fd5b306000908152600460205260409020546113279082614025565b33600090815260026020526040902054600160a01b900460ff1660011461219257600080fd5b6001600160a01b0382166000818152600a6020908152604091829020805460ff19168515159081179091558251938452908301527ff1551184b142d0ef4c150b6a021c1e4da5e8844379a9ea03fb3cd061ea1daf219101611ae7565b6000610f9e6001546001600160a01b031690565b6001546001600160a01b0316331480612234575033600090815260026020526040902054600160a01b900460ff166001145b61223d57600080fd5b6001600160a01b0382166000908152600c60205260409020610fe99082614992565b6000610f50338484613272565b6001546001600160a01b031633148061229e575033600090815260026020526040902054600160a01b900460ff166001145b6122a757600080fd5b6001600160a01b0382166000908152600b6020526040902060010154811515600160b81b90910460ff1615150361232a5760405162461bcd60e51b815260206004820152602160248201527f416c7265616479207365742061742074686520646573697265642073746174656044820152601760f91b6064820152608401611109565b6001600160a01b0382166000818152600b602090815260409182902060010180547fffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff16600160c01b861515908102919091179091558251938452908301527f3fdc3a0a211fcb6dedf2ee6f5566883ccd93088f308aaada19760f3b6bd62ee79101611ae7565b6123b8613d0e565b6001546001600160a01b03163314806123ea575033600090815260026020526040902054600160a01b900460ff166001145b6123f357600080fd5b601880546001600160a01b0383166001600160a01b031990911681179091556000908152601460205260409020805460ff191660011790556113276001600055565b6001546001600160a01b0316331480612467575033600090815260026020526040902054600160a01b900460ff166001145b61247057600080fd5b6001600160a01b0382166000908152600b6020526040902060010154811515600160b81b90910460ff161515036124f35760405162461bcd60e51b815260206004820152602160248201527f416c7265616479207365742061742074686520646573697265642073746174656044820152601760f91b6064820152608401611109565b6001600160a01b0382166000818152600b602090815260409182902060010180547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16600160b81b861515908102919091179091558251938452908301527f8175ec0b88ae54888c0026594d930775f30cd3705385da8218b80d8ae468c5439101611ae7565b600061258d6001546001600160a01b031690565b6001600160a01b0316336001600160a01b031614806125c5575033600090815260026020526040902054600160a01b900460ff166001145b6125ce57600080fd5b6001600160a01b0382166000908152600c60205260409020610f3b906149a7565b60006126036001546001600160a01b031690565b6001600160a01b0316336001600160a01b0316148061263b575033600090815260026020526040902054600160a01b900460ff166001145b61264457600080fd5b61264e8284615df1565b600e805463ffffffff60401b19811661ffff938416600160401b02908117909255600092861663ffffffff9182169190921617146126b857600e805463ffffffff191661ffff86161790556126a1613d67565b90506126ab613e48565b90506126b5613f36565b90505b600e5463ffffffff6401000000009091041661ffff84161461271157600e805467ffffffff00000000191661ffff8516640100000000021790556126fa613d67565b9050612704613e48565b905061270e613f36565b90505b9392505050565b612720613d0e565b6001546001600160a01b0316331480612752575033600090815260026020526040902054600160a01b900460ff166001145b61275b57600080fd5b60646127696012600a615d6c565b6127789064174876e800615d7b565b6127829190615ddd565b61271061ffff83166127966012600a615d6c565b6127a59064174876e800615d7b565b6127af9190615d7b565b6127b99190615ddd565b101561282d5760405162461bcd60e51b815260206004820152603060248201527f4d61782057616c6c657420616d74206d7573742062652061626f76652031252060448201527f6f6620746f74616c20737570706c792e000000000000000000000000000000006064820152608401611109565b601c805461ffff191661ffff8316908117909155612710906128516012600a615d6c565b6128609064174876e800615d7b565b61286a9190615d7b565b6128749190615ddd565b601d556113276001600055565b60006128956001546001600160a01b031690565b6001600160a01b0316336001600160a01b031614806128cd575033600090815260026020526040902054600160a01b900460ff166001145b6128d657600080fd5b6001600160a01b0383166000908152600c6020526040902061271190836149b1565b60008215612907575047610f54565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa15801561294b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061296f9190615e25565b9050610f54565b6001546001600160a01b03163314806129a8575033600090815260026020526040902054600160a01b900460ff166001145b6129b157600080fd5b6129bb84846128f8565b8211156129c757600080fd5b60405163095ea7b360e01b81526001600160a01b038281166004830152600019602483015284169063095ea7b3906044016020604051808303816000875af1158015612a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a3b9190615e3e565b508315612adc576000816001600160a01b03168361520890604051600060405180830381858888f193505050503d8060008114612a94576040519150601f19603f3d011682016040523d82523d6000602084013e612a99565b606091505b5050905080612ad65760405162461bcd60e51b8152602060048201526009602482015268151e0819985a5b195960ba1b6044820152606401611109565b50612b96565b6040516323b872dd60e01b81523060048201526001600160a01b03828116602483015260448201849052600091908516906323b872dd906064016020604051808303816000875af1158015612b35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b599190615e3e565b905080612b945760405162461bcd60e51b8152602060048201526009602482015268151e0819985a5b195960ba1b6044820152606401611109565b505b50505050565b6001546001600160a01b0316331480612bce575033600090815260026020526040902054600160a01b900460ff166001145b612bd757600080fd5b6001546001600160a01b0390811690821603612c405760405162461bcd60e51b815260206004820152602260248201527f54686973206164647265737320697320616c726561647920746865206f776e65604482015261722160f01b6064820152608401611109565b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b612ca4613d0e565b6001546001600160a01b0316331480612cd6575033600090815260026020526040902054600160a01b900460ff166001145b612cdf57600080fd5b6001600160a01b0382166000908152601660205260408120805460ff1916831515179055600190555050565b6001600160a01b03163b151590565b6000612711836001600160a01b0384166149bd565b6060600061271183614a0c565b6001600160a01b038316612d925760405162461bcd60e51b815260206004820152601360248201527f45524332303a205a65726f2041646472657373000000000000000000000000006044820152606401611109565b6001600160a01b038216612de85760405162461bcd60e51b815260206004820152601360248201527f45524332303a205a65726f2041646472657373000000000000000000000000006044820152606401611109565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831660009081526008602052604081205460ff1615159003612ee5576001600160a01b0383166000818152600a602090815260408083208054600160ff1991821681178355600885529483902080549091169094179093555192835290917f72c6620b9a99d91ec1b983b3b0f8e14afcb99c8dbe50cfb5e85d83d2032800d5910160405180910390a1612b96848484614a68565b600680546001600160a01b0319166001600160a01b038516179055600082156130e657600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f7f9190615e5b565b9150600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ff89190615e5b565b60405163e6a4390560e01b81526001600160a01b038481166004830152306024830152919091169063e6a4390590604401602060405180830381865afa158015613046573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061306a9190615e5b565b6001600160a01b03811660009081526009602052604090205490915060ff16156130d65760405162461bcd60e51b815260206004820152601460248201527f5061697220616c726561647920657869737473210000000000000000000000006044820152606401611109565b6130e1848484614a68565b612b96565b600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015613139573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061315d9190615e5b565b60405163e6a4390560e01b81526001600160a01b038481166004830152306024830152919091169063e6a4390590604401602060405180830381865afa1580156131ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131cf9190615e5b565b6001600160a01b03811660009081526009602052604090205490915060ff161561323b5760405162461bcd60e51b815260206004820152601460248201527f5061697220616c726561647920657869737473210000000000000000000000006044820152606401611109565b612b96848484614a68565b6000818484111561326a5760405162461bcd60e51b8152600401611109919061575d565b505050900390565b6001600160a01b0383166132ee5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401611109565b6001600160a01b03821661336a5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401611109565b600081116133e05760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f00000000000000000000000000000000000000000000006064820152608401611109565b6001600160a01b0383166000908152600960205260408120548190819060ff161561342957600780546001600160a01b0319166001600160a01b03881617905560019250613472565b6001600160a01b03851660009081526009602052604090205460ff161561346e57600780546001600160a01b0319166001600160a01b03871617905560019150613472565b5060015b6007546001600160a01b039081166000908152600b6020908152604091829020825161018081018452815485168152600182015494851692810192909252600160a01b840460ff908116151593830193909352600160a81b8404831615156060830152600160b01b8404831615156080830152600160b81b84048316151560a0830152600160c01b84048316151560c0830152600160c81b840490921660e0820152600160d01b90920463ffffffff16610100830152600281015465ffffffffffff1661012083015260038101546101408301526004015461016082015261355a8787615105565b1561385c57601f54610100900460ff166135b65760405162461bcd60e51b815260206004820152601460248201527f54726164696e67206e6f7420656e61626c6564210000000000000000000000006044820152606401611109565b83806135bf5750825b156136ae5780516001600160a01b03166000908152600a602052604090205460ff166136525760405162461bcd60e51b8152602060048201526024808201527f54726164696e67206e6f7420656e61626c656420666f72207468697320726f7560448201527f74657221000000000000000000000000000000000000000000000000000000006064820152608401611109565b80606001516136ae5760405162461bcd60e51b815260206004820152602260248201527f54726164696e67206e6f7420656e61626c656420666f72207468697320706169604482015261722160f01b6064820152608401611109565b83806136b75750825b1561377b576001600160a01b03871660009081526015602052604090205460ff161580156136fe57506001600160a01b03861660009081526015602052604090205460ff16155b1561377b57601a5485111561377b5760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785460448201527f78416d6f756e742e0000000000000000000000000000000000000000000000006064820152608401611109565b80516001600160a01b03878116911614801590613796575082155b1561385c576001600160a01b03861660009081526015602052604090205460ff1661385c57601d54856137de886001600160a01b031660009081526004602052604090205490565b6137e89190615e78565b111561385c5760405162461bcd60e51b815260206004820152602a60248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785760448201527f616c6c657453697a652e000000000000000000000000000000000000000000006064820152608401611109565b821561390757601f5460ff16613907578060a0015115613907573060009081526004602052604090205461014082015181106139055761016082015160c0830151156138e15760e08301516007546001600160a01b03166000908152600460205260409020546127109160ff16906138d49190615d7b565b6138de9190615ddd565b90505b8082106138ec578091505b6007546139039083906001600160a01b0316614025565b505b505b8060800151613a075760075461392990889088906001600160a01b0316615297565b806080015115801561394057506139408787615105565b801561396557506001600160a01b03871660009081526016602052604090205460ff16155b801561398a57506001600160a01b03861660009081526016602052604090205460ff16155b8015613994575081155b15613a075760405162461bcd60e51b815260206004820152602260248201527f5072652d6c6971756964697479207472616e736665722070726f74656374696f60448201527f6e2e0000000000000000000000000000000000000000000000000000000000006064820152608401611109565b6001600160a01b03871660009081526014602052604081205460ff1680613a4657506001600160a01b03871660009081526014602052604090205460ff165b15613a52575084613c56565b8415613aaa57600f546012805463ffffffff80841667ffffffffffffffff19909216919091176401000000008085048316021763ffffffff60401b1916600160401b9384900491909116909202919091179055613b56565b8315613b02576010546012805463ffffffff80841667ffffffffffffffff19909216919091176401000000008085048316021763ffffffff60401b1916600160401b9384900491909116909202919091179055613b56565b8215613b56576011546012805463ffffffff80841667ffffffffffffffff19909216919091176401000000008085048316021763ffffffff60401b1916600160401b93849004919091169092029190911790555b601254600090613b9d9061271090613b9790613b829063ffffffff640100000000820481169116615e8b565b63ffffffff168a61541e90919063ffffffff16565b9061542a565b9050613ba98782615436565b6001600160a01b038a16600090815260046020526040902054909250613bcf9082615436565b6001600160a01b038a16600090815260046020526040808220929092553081522054613bfb9082615442565b30600081815260046020526040908190209290925590516001600160a01b038b16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90613c4c9085815260200190565b60405180910390a3505b6001600160a01b038816600090815260046020526040902054613c799082615436565b6001600160a01b03808a166000908152600460205260408082209390935590891681522054613ca89082615442565b6001600160a01b0380891660008181526004602052604090819020939093559151908a16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90613cfc9085815260200190565b60405180910390a35050505050505050565b600260005403613d605760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611109565b6002600055565b600e54600d5460009163ffffffff600160401b8204811692613d9192919091169061ffff16615ea8565b613d9b9190615ed0565b600f805463ffffffff191663ffffffff928316179055600e54600d54600160401b8204831692613dd8926401000000009004169061ffff16615ea8565b613de29190615ed0565b600f805467ffffffff0000000019811664010000000063ffffffff948516810291821793849055613e1d949304831692918216911617615e8b565b600f805463ffffffff92909216600160401b0263ffffffff60401b1990921691909117905550600190565b600e54600d5460009163ffffffff600160401b8204811692613e7992919091169061ffff6201000090910416615ea8565b613e839190615ed0565b6010805463ffffffff191663ffffffff928316179055600e54600d54600160401b8204831692613ec6926401000000009004169062010000900461ffff16615ea8565b613ed09190615ed0565b6010805467ffffffff0000000019811664010000000063ffffffff948516810291821793849055613f0b949304831692918216911617615e8b565b6010805463ffffffff92909216600160401b0263ffffffff60401b1990921691909117905550600190565b600e54600d5460009163ffffffff600160401b8204811692613f6992919091169061ffff64010000000090910416615ea8565b613f739190615ed0565b6011805463ffffffff191663ffffffff928316179055600e54600d54600160401b8204831692613fb59264010000000090819004909116910461ffff16615ea8565b613fbf9190615ed0565b6011805467ffffffff0000000019811664010000000063ffffffff948516810291821793849055613ffa949304831692918216911617615e8b565b6011805463ffffffff92909216600160401b0263ffffffff60401b1990921691909117905550600190565b601f805460ff191660019081179091556001600160a01b038083166000908152600b60209081526040808320815161018081018352815486168082529682015495861681850152600160a01b860460ff908116151582850152600160a81b870481161515606080840191909152600160b01b8804821615156080840152600160b81b88048216151560a0840152600160c01b88048216151560c0840152600160c81b880490911660e083015263ffffffff600160d01b9097048716610100830152600283015465ffffffffffff166101208301526003830154610140830152600490920154610160820152600680546001600160a01b0319169097179096558151908101825260125480861682526401000000008104861693820193909352600160401b909204909316928101839052919003614163575050614984565b3060009081526005602090815260408083206006546001600160a01b03168452909152902054600019146141bc573060009081526005602090815260408083206006546001600160a01b03168452909152902060001990555b60006002826040015163ffffffff16836000015163ffffffff16876141e19190615d7b565b6141eb9190615ddd565b6141f59190615ddd565b905060006142038287615ef3565b6040805160028082526060820183529293506000929091602083019080368337019050509050308160008151811061423d5761423d615d92565b60200260200101906001600160a01b031690816001600160a01b03168152505084602001518160018151811061427557614275615d92565b60200260200101906001600160a01b031690816001600160a01b03168152505060006142a08761544e565b9050600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156142f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143199190615e5b565b6001600160a01b03168260018151811061433557614335615d92565b60200260200101516001600160a01b0316036143d4576006546040517f791ac9470000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063791ac9479061439d908690600090879030904290600401615f06565b600060405180830381600087803b1580156143b757600080fd5b505af11580156143cb573d6000803e3d6000fd5b50505050614459565b6006546040517f5c11d7950000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690635c11d79590614426908690600090879030904290600401615f06565b600060405180830381600087803b15801561444057600080fd5b505af1158015614454573d6000803e3d6000fd5b505050505b6000816144658961544e565b61446f9190615ef3565b905060008461447e8784615d7b565b6144889190615ddd565b9050600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156144dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145019190615e5b565b6001600160a01b031688602001516001600160a01b03160361461357851561460e576006546018546040517ff305d7190000000000000000000000000000000000000000000000000000000081523060048201526024810189905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af11580156145ac573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906145d19190615f42565b505060408051838152602081018990527f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b450692500160405180910390a15b614717565b85156147175760065460208901516018546040517fe8e337000000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b039283166024820152604481018a90526064810185905260006084820181905260a482015290821660c48201524260e482015291169063e8e3370090610104016060604051808303816000875af11580156146b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146da9190615f42565b505060408051838152602081018990527f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b450692500160405180910390a15b6147218183615ef3565b602089015160175460405163095ea7b360e01b81526001600160a01b03918216600482015260001960248201529294506000928592919091169063095ea7b3906044016020604051808303816000875af1158015614783573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147a79190615e3e565b50600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156147fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061481f9190615e5b565b6001600160a01b03168a602001516001600160a01b0316036148e657602089015163ffffffff16156148e1576017546040516001600160a01b03909116906152089083906000818181858888f193505050503d806000811461489d576040519150601f19603f3d011682016040523d82523d6000602084013e6148a2565b606091505b505080925050816148e15760405162461bcd60e51b8152602060048201526009602482015268151e0819985a5b195960ba1b6044820152606401611109565b614979565b602089015163ffffffff16156149795760208a01516017546040516323b872dd60e01b81523060048201526001600160a01b039182166024820152604481018490529116906323b872dd906064016020604051808303816000875af1158015614953573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906149779190615e3e565b505b505050505050505050505b5050601f805460ff19169055565b6000612711836001600160a01b03841661558e565b6000610f3b825490565b60006127118383615688565b6000818152600183016020526040812054614a0457508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610f54565b506000610f54565b606081600001805480602002602001604051908101604052809291908181526020018280548015614a5c57602002820191906000526020600020905b815481526020019060010190808311614a48575b50505050509050919050565b600680546001600160a01b0319166001600160a01b0385161790556000808315614cfa57600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015614adf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b039190615e5b565b9250600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015614b58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b7c9190615e5b565b60405163e6a4390560e01b81526001600160a01b038581166004830152306024830152919091169063e6a4390590604401602060405180830381865afa158015614bca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614bee9190615e5b565b90506001600160a01b0381163b15614c0857809150614eeb565b600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015614c5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c7f9190615e5b565b6040516364e329cb60e11b81526001600160a01b038581166004830152306024830152919091169063c9c65396906044016020604051808303816000875af1158015614ccf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614cf39190615e5b565b9150614eeb565b600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015614d4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d719190615e5b565b60405163e6a4390560e01b81526001600160a01b038581166004830152306024830152919091169063e6a4390590604401602060405180830381865afa158015614dbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614de39190615e5b565b90506001600160a01b0381163b15614dfd57809150614eeb565b600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015614e50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e749190615e5b565b6040516364e329cb60e11b81526001600160a01b038581166004830152306024830152919091169063c9c65396906044016020604051808303816000875af1158015614ec4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614ee89190615e5b565b91505b6001600160a01b038083166000908152600b6020908152604080832080548a86166001600160a01b0319909116178155600180820180547fffff00000000000000000000000000000000000000000000000000000000000016968a169690961790955560028101805465ffffffffffff1916905560038101849055600481018490556009909252909120805460ff1916909217909155614f8b86846156b2565b614f9530846156b2565b6001600160a01b03861660009081526014602090815260408083208054600160ff1991821681179092556015845282852080548216831790556016845282852080548216831790556013909352922080549091169091179055614ffb3387600019612d3c565b600154615014906001600160a01b031687600019612d3c565b6150213087600019612d3c565b60405163095ea7b360e01b81526001600160a01b038781166004830152600019602483015284169063095ea7b3906044016020604051808303816000875af1158015615071573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150959190615e3e565b503060009081526005602090815260408083206001600160a01b038a8116808652918452938290206000199055815190815286841692810192909252918616918101919091527f8be8ca5dd0f6315b4748476b8024cfa472222bff1adc749d73ae5697ec2efc7d90606001612107565b6001546000906001600160a01b0384811691161480159061513457506001546001600160a01b03838116911614155b801561514b57506001546001600160a01b03163214155b801561517057506001600160a01b03821660009081526013602052604090205460ff16155b801561519557506001600160a01b03831660009081526013602052604090205460ff16155b80156151ac57506001600160a01b03821661dead14155b80156151c057506001600160a01b03821615155b80156151d557506001600160a01b0383163014155b801561520457506001600160a01b038316600090815260026020526040902054600160a01b900460ff16600114155b801561523357506001600160a01b038216600090815260026020526040902054600160a01b900460ff16600114155b801561526357506001600160a01b038316600090815260026020819052604090912054600160a01b900460ff1614155b80156127115750506001600160a01b0316600090815260026020819052604090912054600160a01b900460ff161415919050565b6001600160a01b0381166000908152600b6020526040902060010154600160b01b900460ff16156153305760405162461bcd60e51b815260206004820152602360248201527f4c697175696469747920616c726561647920616464656420616e64206d61726b60448201527f65642e00000000000000000000000000000000000000000000000000000000006064820152608401611109565b61533a8383615105565b1580156153585750806001600160a01b0316826001600160a01b0316145b15610fe9576001600160a01b038381166000908152601360209081526040808320805460ff19166001908117909155601f805462ff0000191662010000179055938516808452600b83529281902084018054770101000000000000000000000000000000000000000000007fffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffff9091161790558051928352908201929092527f8175ec0b88ae54888c0026594d930775f30cd3705385da8218b80d8ae468c5439101611578565b60006127118284615d7b565b60006127118284615ddd565b60006127118284615ef3565b60006127118284615e78565b6001600160a01b038082166000908152600b602090815260408083205481517fad5c464800000000000000000000000000000000000000000000000000000000815291519394169263ad5c4648926004808401939192918290030181865afa1580156154be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906154e29190615e5b565b6001600160a01b038381166000908152600b6020526040902060010154918116911603615510575047919050565b6001600160a01b038281166000908152600b6020526040908190206001015490516370a0823160e01b81523060048201529116906370a0823190602401602060405180830381865afa15801561556a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3b9190615e25565b600081815260018301602052604081205480156156775760006155b2600183615ef3565b85549091506000906155c690600190615ef3565b905081811461562b5760008660000182815481106155e6576155e6615d92565b906000526020600020015490508087600001848154811061560957615609615d92565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061563c5761563c615f70565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610f54565b6000915050610f54565b5092915050565b600082600001828154811061569f5761569f615d92565b9060005260206000200154905092915050565b6001600160a01b0382166000908152600c60205260409020610fe99082612d1a565b6001600160a01b038116811461132757600080fd5b6000602082840312156156fb57600080fd5b8135612711816156d4565b600081518084526020808501945080840160005b8381101561573f5781516001600160a01b03168752958201959082019060010161571a565b509495945050505050565b6020815260006127116020830184615706565b600060208083528351808285015260005b8181101561578a5785810183015185820160400152820161576e565b506000604082860101526040601f19601f8301168501019250505092915050565b600080604083850312156157be57600080fd5b82356157c9816156d4565b946020939093013593505050565b801515811461132757600080fd5b6000806000606084860312156157fa57600080fd5b8335615805816156d4565b92506020840135615815816157d7565b91506040840135615825816156d4565b809150509250925092565b60008060006060848603121561584557600080fd5b8335615850816156d4565b92506020840135615860816156d4565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156158b0576158b0615871565b604052919050565b600067ffffffffffffffff8211156158d2576158d2615871565b5060051b60200190565b600082601f8301126158ed57600080fd5b813560206159026158fd836158b8565b615887565b82815260059290921b8401810191818101908684111561592157600080fd5b8286015b8481101561593c5780358352918301918301615925565b509695505050505050565b6000806040838503121561595a57600080fd5b823567ffffffffffffffff8082111561597257600080fd5b818501915085601f83011261598657600080fd5b813560206159966158fd836158b8565b82815260059290921b840181019181810190898411156159b557600080fd5b948201945b838610156159dc5785356159cd816156d4565b825294820194908201906159ba565b965050860135925050808211156159f257600080fd5b506159ff858286016158dc565b9150509250929050565b803561ffff81168114610f3e57600080fd5b600060208284031215615a2d57600080fd5b61271182615a09565b60008060408385031215615a4957600080fd5b8235615a54816156d4565b91506020830135615a64816157d7565b809150509250929050565b600080600060608486031215615a8457600080fd5b615a8d84615a09565b9250615a9b60208501615a09565b9150615aa960408501615a09565b90509250925092565b60008060208385031215615ac557600080fd5b823567ffffffffffffffff80821115615add57600080fd5b818501915085601f830112615af157600080fd5b813581811115615b0057600080fd5b8660208260051b8501011115615b1557600080fd5b60209290920196919550909350505050565b803560ff81168114610f3e57600080fd5b60008060408385031215615b4b57600080fd5b8235615b56816156d4565b9150615b6460208401615b27565b90509250929050565b600080600060608486031215615b8257600080fd5b8335615b8d816156d4565b9250615b9b60208501615b27565b9150615aa960408501615b27565b60008060408385031215615bbc57600080fd5b8235615bc7816156d4565b91506020830135615a64816156d4565b60008060408385031215615bea57600080fd5b615bf383615a09565b9150615b6460208401615a09565b60008060408385031215615c1457600080fd5b8235615bc7816157d7565b60008060008060808587031215615c3557600080fd5b8435615c40816157d7565b93506020850135615c50816156d4565b9250604085013591506060850135615c67816156d4565b939692955090935050565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115615cc3578160001904821115615ca957615ca9615c72565b80851615615cb657918102915b93841c9390800290615c8d565b509250929050565b600082615cda57506001610f54565b81615ce757506000610f54565b8160018114615cfd5760028114615d0757615d23565b6001915050610f54565b60ff841115615d1857615d18615c72565b50506001821b610f54565b5060208310610133831016604e8410600b8410161715615d46575081810a610f54565b615d508383615c88565b8060001904821115615d6457615d64615c72565b029392505050565b600061271160ff841683615ccb565b8082028115828204841417610f5457610f54615c72565b634e487b7160e01b600052603260045260246000fd5b600060ff821660ff8103615dbe57615dbe615c72565b60010192915050565b634e487b7160e01b600052601260045260246000fd5b600082615dec57615dec615dc7565b500490565b61ffff81811683821601908082111561568157615681615c72565b600060018201615e1e57615e1e615c72565b5060010190565b600060208284031215615e3757600080fd5b5051919050565b600060208284031215615e5057600080fd5b8151612711816157d7565b600060208284031215615e6d57600080fd5b8151612711816156d4565b80820180821115610f5457610f54615c72565b63ffffffff81811683821601908082111561568157615681615c72565b63ffffffff818116838216028082169190828114615ec857615ec8615c72565b505092915050565b600063ffffffff80841680615ee757615ee7615dc7565b92169190910492915050565b81810381811115610f5457610f54615c72565b85815284602082015260a060408201526000615f2560a0830186615706565b6001600160a01b0394909416606083015250608001529392505050565b600080600060608486031215615f5757600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603160045260246000fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a26469706673582212203df85adaca5a4d5674bb344be7610f1eed1ee00ffc14e387f33ed69f77dcf48264736f6c634300081100330000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000861435743ae62fd6237d2fb3ab255b4f624ee40b000000000000000000000000a3d432884968917d2fbc88d8592955a2f6c42e39

Deployed Bytecode

0x6080604052600436106103e25760003560e01c8063640384091161020d578063b3d514fb11610128578063d8306786116100bb578063dd62ed3e1161008a578063edc8f9631161006f578063edc8f96314610e65578063f5a1f5b414610e85578063feadde9c14610ea557600080fd5b8063dd62ed3e14610def578063eb48799a14610e3557600080fd5b8063d830678614610d75578063da07af4414610d8f578063dc8221ad14610daf578063dd27cf2614610dcf57600080fd5b8063bcd96a25116100f7578063bcd96a2514610cf0578063be99375514610d10578063c1f11ac714610d26578063cf84770614610d4157600080fd5b8063b3d514fb14610690578063b524f87b14610c90578063b622d8a114610cb0578063b9fbfdf214610cd057600080fd5b806391d3db28116101a0578063a72bc8081161016f578063a72bc80814610c1c578063a9059cbb14610c50578063b092d20d14610c70578063b1b08f711461069057600080fd5b806391d3db2814610b8657806395d89b4114610ba15780639ee1bd0f14610be7578063a4cb698514610bfc57600080fd5b806370a08231116101dc57806370a0823114610af0578063833f836114610b2657806386a2ab5714610b465780638feb9d7814610b6657600080fd5b80636403840914610a6b578063649f386d14610a815780636ca4797f14610aba5780636cf3b0f914610ad057600080fd5b8063313ce567116102fd57806350a8e016116102905780635ca8d1f61161025f5780635ca8d1f6146109d25780635cce86cd146109f25780635d098b3814610a2b57806360e89ae814610a4b57600080fd5b806350a8e0161461082d578063517bfc2d1461084d578063590ffdce1461088d5780635c45767a146108ad57600080fd5b80634ada218b116102cc5780634ada218b146107955780634f4fc99b146107b45780634fbee193146107d45780635061e52a1461080d57600080fd5b8063313ce567146106f957806332cde6641461072057806336fddb04146107405780633ddcac7c1461076057600080fd5b806311f55dc6116103755780632610eaca116103445780632610eaca146106705780632b28fc7a146106905780632cb8b882146106b95780632fa20331146106d957600080fd5b806311f55dc6146105d757806318160ddd1461060b57806322e29a681461062e57806323b872dd1461065057600080fd5b806308e7d1c4116103b157806308e7d1c4146104bd578063095ea7b3146105185780630a920f20146105485780630dcbcf1c1461059e57600080fd5b806303fd2a45146103ee57806305ba16341461042157806306fdde031461044e5780630758d9241461049d57600080fd5b366103e957005b600080fd5b3480156103fa57600080fd5b5061040461dead81565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561042d57600080fd5b5061044161043c3660046156e9565b610ec5565b604051610418919061574a565b34801561045a57600080fd5b5060408051808201909152600781527f496e7567616d690000000000000000000000000000000000000000000000000060208201525b604051610418919061575d565b3480156104a957600080fd5b50600654610404906001600160a01b031681565b3480156104c957600080fd5b506011546104f19063ffffffff808216916401000000008104821691600160401b9091041683565b6040805163ffffffff94851681529284166020840152921691810191909152606001610418565b34801561052457600080fd5b506105386105333660046157ab565b610f43565b6040519015158152602001610418565b34801561055457600080fd5b50600d546105799061ffff808216916201000081048216916401000000009091041683565b6040805161ffff94851681529284166020840152921691810191909152606001610418565b3480156105aa57600080fd5b506105386105b93660046156e9565b6001600160a01b031660009081526016602052604090205460ff1690565b3480156105e357600080fd5b506010546104f19063ffffffff808216916401000000008104821691600160401b9091041683565b34801561061757600080fd5b50610620610f5a565b604051908152602001610418565b34801561063a57600080fd5b5061064e6106493660046157e5565b610fa3565b005b34801561065c57600080fd5b5061053861066b366004615830565b610fee565b34801561067c57600080fd5b5061064e61068b366004615947565b611081565b34801561069c57600080fd5b506106a66107d081565b60405161ffff9091168152602001610418565b3480156106c557600080fd5b5061064e6106d4366004615a1b565b6111bd565b3480156106e557600080fd5b5061064e6106f4366004615a36565b61132a565b34801561070557600080fd5b5061070e6115f9565b60405160ff9091168152602001610418565b34801561072c57600080fd5b5061053861073b366004615a6f565b611628565b34801561074c57600080fd5b5061064e61075b366004615a36565b611805565b34801561076c57600080fd5b50610775611874565b604080516001600160a01b03938416815292909116602083015201610418565b3480156107a157600080fd5b50601f5461053890610100900460ff1681565b3480156107c057600080fd5b50600754610404906001600160a01b031681565b3480156107e057600080fd5b506105386107ef3660046156e9565b6001600160a01b031660009081526014602052604090205460ff1690565b34801561081957600080fd5b5061064e610828366004615ab2565b61189d565b34801561083957600080fd5b50601f546105389062010000900460ff1681565b34801561085957600080fd5b5061070e6108683660046156e9565b6001600160a01b0316600090815260026020526040902054600160a01b900460ff1690565b34801561089957600080fd5b5061064e6108a8366004615a36565b611966565b3480156108b957600080fd5b506109556108c83660046156e9565b600b60205260009081526040902080546001820154600283015460038401546004909401546001600160a01b03938416949383169360ff600160a01b8504811694600160a81b8104821694600160b01b8204831694600160b81b8304841694600160c01b8404851694600160c81b8504169363ffffffff600160d01b909104169265ffffffffffff16918c565b604080516001600160a01b039d8e1681529c909b1660208d0152981515998b019990995295151560608a0152931515608089015291151560a0880152151560c087015260ff1660e086015263ffffffff1661010085015265ffffffffffff1661012084015261014083019190915261016082015261018001610418565b3480156109de57600080fd5b5061064e6109ed366004615b38565b6119d5565b3480156109fe57600080fd5b50610538610a0d3660046156e9565b6001600160a01b031660009081526015602052604090205460ff1690565b348015610a3757600080fd5b5061064e610a463660046156e9565b611af3565b348015610a5757600080fd5b5061064e610a663660046156e9565b611b78565b348015610a7757600080fd5b50610620601b5481565b348015610a8d57600080fd5b50610538610a9c3660046156e9565b6001600160a01b031660009081526003602052604090205460ff1690565b348015610ac657600080fd5b506106a6610bb881565b348015610adc57600080fd5b5061064e610aeb366004615b38565b611d32565b348015610afc57600080fd5b50610620610b0b3660046156e9565b6001600160a01b031660009081526004602052604090205490565b348015610b3257600080fd5b5061064e610b41366004615b6d565b611e61565b348015610b5257600080fd5b5061064e610b613660046156e9565b612117565b348015610b7257600080fd5b5061064e610b81366004615a36565b61216c565b348015610b9257600080fd5b50601c546106a69061ffff1681565b348015610bad57600080fd5b5060408051808201909152600481527f47414d49000000000000000000000000000000000000000000000000000000006020820152610490565b348015610bf357600080fd5b506104046121ee565b348015610c0857600080fd5b5061064e610c17366004615ba9565b612202565b348015610c2857600080fd5b50600f546104f19063ffffffff808216916401000000008104821691600160401b9091041683565b348015610c5c57600080fd5b50610538610c6b3660046157ab565b61225f565b348015610c7c57600080fd5b5061064e610c8b366004615a36565b61226c565b348015610c9c57600080fd5b5061064e610cab3660046156e9565b6123b0565b348015610cbc57600080fd5b5061064e610ccb366004615a36565b612435565b348015610cdc57600080fd5b50610620610ceb3660046156e9565b612579565b348015610cfc57600080fd5b50610538610d0b366004615bd7565b6125ef565b348015610d1c57600080fd5b50610620601e5481565b348015610d3257600080fd5b506019546106a69061ffff1681565b348015610d4d57600080fd5b50600e546104f19063ffffffff808216916401000000008104821691600160401b9091041683565b348015610d8157600080fd5b50601f546105389060ff1681565b348015610d9b57600080fd5b5061064e610daa366004615a1b565b612718565b348015610dbb57600080fd5b50610404610dca3660046157ab565b612881565b348015610ddb57600080fd5b50610620610dea366004615c01565b6128f8565b348015610dfb57600080fd5b50610620610e0a366004615ba9565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b348015610e4157600080fd5b50610538610e503660046156e9565b600a6020526000908152604090205460ff1681565b348015610e7157600080fd5b5061064e610e80366004615c1f565b612976565b348015610e9157600080fd5b5061064e610ea03660046156e9565b612b9c565b348015610eb157600080fd5b5061064e610ec0366004615a36565b612c9c565b6060610ed96001546001600160a01b031690565b6001600160a01b0316336001600160a01b03161480610f11575033600090815260026020526040902054600160a01b900460ff166001145b610f1a57600080fd5b6001600160a01b0382166000908152600c60205260409020610f3b90612d2f565b90505b919050565b6000610f50338484612d3c565b5060015b92915050565b6000610f686012600a615d6c565b610f779064174876e800615d7b565b600003610f8357600080fd5b610f8f6012600a615d6c565b610f9e9064174876e800615d7b565b905090565b6001546001600160a01b0316331480610fd5575033600090815260026020526040902054600160a01b900460ff166001145b610fde57600080fd5b610fe9838383612e49565b505050565b6001600160a01b03831660009081526005602090815260408083203384529091528120546000191461106c5761106c843361106785604051806060016040528060288152602001615f87602891396001600160a01b038a1660009081526005602090815260408083203384529091529020549190613246565b612d3c565b611077848484613272565b5060019392505050565b6001546001600160a01b03163314806110b3575033600090815260026020526040902054600160a01b900460ff166001145b6110bc57600080fd5b80518251146111125760405162461bcd60e51b815260206004820152601560248201527f4c656e6774687320646f206e6f74206d617463682e000000000000000000000060448201526064015b60405180910390fd5b60005b82518160ff161015610fe957818160ff168151811061113657611136615d92565b602002602001015161115d336001600160a01b031660009081526004602052604090205490565b101561116857600080fd5b6111ab33848360ff168151811061118157611181615d92565b6020026020010151848460ff168151811061119e5761119e615d92565b6020026020010151613272565b806111b581615da8565b915050611115565b6111c5613d0e565b6001546001600160a01b03163314806111f7575033600090815260026020526040902054600160a01b900460ff166001145b61120057600080fd5b6103e861120f6012600a615d6c565b61121e9064174876e800615d7b565b6112289190615ddd565b61271061ffff831661123c6012600a615d6c565b61124b9064174876e800615d7b565b6112559190615d7b565b61125f9190615ddd565b10156112d35760405162461bcd60e51b815260206004820152603760248201527f4d6178205472616e73616374696f6e20616d74206d7573742062652061626f7660448201527f6520302e3125206f6620746f74616c20737570706c792e0000000000000000006064820152608401611109565b6019805461ffff191661ffff8316908117909155612710906112f76012600a615d6c565b6113069064174876e800615d7b565b6113109190615d7b565b61131a9190615ddd565b601a556113276001600055565b50565b33600090815260026020526040902054600160a01b900460ff1660011461135057600080fd5b601f54610100900460ff1661136f57601f805461ff0019166101001790555b6001600160a01b0382166000908152600b602052604090208115611585576001810154600160a01b900460ff1661150d576001810154600160b01b900460ff166113fb5760405162461bcd60e51b815260206004820152601860248201527f4c6971756964697479206d7573742062652061646465642e00000000000000006044820152606401611109565b6001810180547fffffffffffff00ffffffff00ffffffffffffffffffffffffffffffffffffffff1679c8000000000100000000000000000000000000000000000000001790556127106114506012600a615d6c565b61145f9064174876e800615d7b565b61146a90600a615d7b565b6114749190615ddd565b60038201556127106114886012600a615d6c565b6114979064174876e800615d7b565b6114a290600b615d7b565b6114ac9190615ddd565b6004820155600181018054600160c01b7fffff00000000ff00ffffffffffffffffffffffffffffffffffffffffffffffff909116600160d01b4363ffffffff16021717905560028101805465ffffffffffff19164265ffffffffffff161790555b60018101805460ff60a81b1916600160a81b84151502179055604080516001600160a01b038516815263ffffffff4316602082015265ffffffffffff4216918101919091527fc6a94aed14d17054235e92e4f1dea2e3825c9ccf7053602fa787d687fcf312da906060015b60405180910390a1505050565b81610fe95760018101805460ff60a81b1916600160a81b84151502179055604080516001600160a01b038516815263ffffffff4316602082015265ffffffffffff4216918101919091527f2ae9db52f95cd554639c05f6d579c7ec02ac692ff23ebc60660e22416466bb8c90606001611578565b60006116076012600a615d6c565b6116169064174876e800615d7b565b60000361162257600080fd5b50601290565b600061163c6001546001600160a01b031690565b6001600160a01b0316336001600160a01b03161480611674575033600090815260026020526040902054600160a01b900460ff166001145b61167d57600080fd5b6107d061ffff85161180159061169957506107d061ffff841611155b80156116ab57506107d061ffff831611155b6116f75760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f7420657863656564206d6178696d756d732e0000000000000000006044820152606401611109565b610bb86117048486615df1565b61ffff1611156117565760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f742065786365656420726f756e6474726970206d6178696d756d2e6044820152606401611109565b600d5460009061ffff86811691161461178557600d805461ffff191661ffff8716179055611782613d67565b90505b600d5461ffff8581166201000090920416146117be57600d805463ffff000019166201000061ffff8716021790556117bb613e48565b90505b600d5461ffff84811664010000000090920416146117fd57600d805465ffff00000000191664010000000061ffff8616021790556117fa613f36565b90505b949350505050565b61180d613d0e565b6001546001600160a01b031633148061183f575033600090815260026020526040902054600160a01b900460ff166001145b61184857600080fd5b6001600160a01b0382166000908152601560205260408120805460ff1916831515179055600190555050565b6000806118896017546001600160a01b031690565b6018546001600160a01b0316915091509091565b6001546001600160a01b03163314806118cf575033600090815260026020526040902054600160a01b900460ff166001145b6118d857600080fd5b60005b81811015610fe9576119548383838181106118f8576118f8615d92565b905060200201602081019061190d91906156e9565b6001600160a01b03166000908152600260209081526040808320805474ffffffffffffffffffffffffffffffffffffffffff1916905560039091529020805460ff19169055565b8061195e81615e0c565b9150506118db565b61196e613d0e565b6001546001600160a01b03163314806119a0575033600090815260026020526040902054600160a01b900460ff166001145b6119a957600080fd5b6001600160a01b0382166000908152601460205260408120805460ff1916831515179055600190555050565b6001546001600160a01b0316331480611a07575033600090815260026020526040902054600160a01b900460ff166001145b611a1057600080fd5b60c88160ff161115611a645760405162461bcd60e51b815260206004820152601460248201527f43616e6e6f74207365742061626f76652032252e0000000000000000000000006044820152606401611109565b6001600160a01b0382166000818152600b602090815260409182902060010180547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff16600160c81b60ff8716908102919091179091558251938452908301527f024e5cc370f4392aaafdb3d37424c18b801c726ff6c32c142bfc1c2d8c2185b391015b60405180910390a15050565b611afb613d0e565b6001546001600160a01b0316331480611b2d575033600090815260026020526040902054600160a01b900460ff166001145b611b3657600080fd5b601780546001600160a01b0383166001600160a01b031990911681179091556000908152601460205260409020805460ff191660011790556113276001600055565b6001546001600160a01b0316331480611baa575033600090815260026020526040902054600160a01b900460ff166001145b80611bcf575033600090815260026020819052604090912054600160a01b900460ff16145b80611bf3575033600090815260026020526040902054600160a01b900460ff166005145b611bfc57600080fd5b6001600160a01b0381163314611c7a5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401611109565b6001600160a01b03811660009081526003602052604090205460ff161515600114611ce75760405162461bcd60e51b815260206004820152601d60248201527f596f7520646f206e6f74206861766520616e2061646d696e20726f6c650000006044820152606401611109565b611327816001600160a01b03166000908152600260209081526040808320805474ffffffffffffffffffffffffffffffffffffffffff1916905560039091529020805460ff19169055565b6001546001600160a01b0316331480611d64575033600090815260026020526040902054600160a01b900460ff166001145b611d6d57600080fd5b8060ff16600103611e075733600090815260026020526040902054600160a01b900460ff16600114611e075760405162461bcd60e51b815260206004820152602360248201527f596f7520617265206e6f7420617574686f72697a656420746f2073657420612060448201527f64657600000000000000000000000000000000000000000000000000000000006064820152608401611109565b6001600160a01b0382166000818152600260209081526040808320805474ffffffffffffffffffffffffffffffffffffffffff1916909417600160a01b60ff871602179093556003905220805460ff191660011790555050565b6001546001600160a01b0316331480611e93575033600090815260026020526040902054600160a01b900460ff166001145b611e9c57600080fd5b6001600160a01b038381166000908152600b60209081526040808320815161018081018352815486168152600182015495861693810193909352600160a01b850460ff908116151592840192909252600160a81b8504821615156060840152600160b01b8504821615156080840152600160b81b85048216151560a0840152600160c01b85048216151560c0840152600160c81b8504821660e0840152600160d01b90940463ffffffff16610100830152600284015465ffffffffffff16610120830152600384015461014083015260049093015461016082015291612710908516611f8a6012600a615d6c565b611f999064174876e800615d7b565b611fa39190615d7b565b611fad9190615ddd565b9050600061271060ff8516611fc46012600a615d6c565b611fd39064174876e800615d7b565b611fdd9190615d7b565b611fe79190615ddd565b9050808211156120435760405162461bcd60e51b815260206004820152602160248201527f5468726573686f6c642063616e6e6f742062652061626f766520616d6f756e746044820152601760f91b6064820152608401611109565b61271060ff86166120566012600a615d6c565b6120659064174876e800615d7b565b61206f9190615d7b565b6120799190615ddd565b61014084015261271060ff85166120926012600a615d6c565b6120a19064174876e800615d7b565b6120ab9190615d7b565b6120b59190615ddd565b6101608401819052610140840151604080516001600160a01b038a16815260208101929092528101919091527f4b4b99a1eff34af744bde4562076348fe524799340e842c09f26f43c94ea9d2b906060015b60405180910390a1505050505050565b6001546001600160a01b0316331480612149575033600090815260026020526040902054600160a01b900460ff166001145b61215257600080fd5b306000908152600460205260409020546113279082614025565b33600090815260026020526040902054600160a01b900460ff1660011461219257600080fd5b6001600160a01b0382166000818152600a6020908152604091829020805460ff19168515159081179091558251938452908301527ff1551184b142d0ef4c150b6a021c1e4da5e8844379a9ea03fb3cd061ea1daf219101611ae7565b6000610f9e6001546001600160a01b031690565b6001546001600160a01b0316331480612234575033600090815260026020526040902054600160a01b900460ff166001145b61223d57600080fd5b6001600160a01b0382166000908152600c60205260409020610fe99082614992565b6000610f50338484613272565b6001546001600160a01b031633148061229e575033600090815260026020526040902054600160a01b900460ff166001145b6122a757600080fd5b6001600160a01b0382166000908152600b6020526040902060010154811515600160b81b90910460ff1615150361232a5760405162461bcd60e51b815260206004820152602160248201527f416c7265616479207365742061742074686520646573697265642073746174656044820152601760f91b6064820152608401611109565b6001600160a01b0382166000818152600b602090815260409182902060010180547fffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff16600160c01b861515908102919091179091558251938452908301527f3fdc3a0a211fcb6dedf2ee6f5566883ccd93088f308aaada19760f3b6bd62ee79101611ae7565b6123b8613d0e565b6001546001600160a01b03163314806123ea575033600090815260026020526040902054600160a01b900460ff166001145b6123f357600080fd5b601880546001600160a01b0383166001600160a01b031990911681179091556000908152601460205260409020805460ff191660011790556113276001600055565b6001546001600160a01b0316331480612467575033600090815260026020526040902054600160a01b900460ff166001145b61247057600080fd5b6001600160a01b0382166000908152600b6020526040902060010154811515600160b81b90910460ff161515036124f35760405162461bcd60e51b815260206004820152602160248201527f416c7265616479207365742061742074686520646573697265642073746174656044820152601760f91b6064820152608401611109565b6001600160a01b0382166000818152600b602090815260409182902060010180547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16600160b81b861515908102919091179091558251938452908301527f8175ec0b88ae54888c0026594d930775f30cd3705385da8218b80d8ae468c5439101611ae7565b600061258d6001546001600160a01b031690565b6001600160a01b0316336001600160a01b031614806125c5575033600090815260026020526040902054600160a01b900460ff166001145b6125ce57600080fd5b6001600160a01b0382166000908152600c60205260409020610f3b906149a7565b60006126036001546001600160a01b031690565b6001600160a01b0316336001600160a01b0316148061263b575033600090815260026020526040902054600160a01b900460ff166001145b61264457600080fd5b61264e8284615df1565b600e805463ffffffff60401b19811661ffff938416600160401b02908117909255600092861663ffffffff9182169190921617146126b857600e805463ffffffff191661ffff86161790556126a1613d67565b90506126ab613e48565b90506126b5613f36565b90505b600e5463ffffffff6401000000009091041661ffff84161461271157600e805467ffffffff00000000191661ffff8516640100000000021790556126fa613d67565b9050612704613e48565b905061270e613f36565b90505b9392505050565b612720613d0e565b6001546001600160a01b0316331480612752575033600090815260026020526040902054600160a01b900460ff166001145b61275b57600080fd5b60646127696012600a615d6c565b6127789064174876e800615d7b565b6127829190615ddd565b61271061ffff83166127966012600a615d6c565b6127a59064174876e800615d7b565b6127af9190615d7b565b6127b99190615ddd565b101561282d5760405162461bcd60e51b815260206004820152603060248201527f4d61782057616c6c657420616d74206d7573742062652061626f76652031252060448201527f6f6620746f74616c20737570706c792e000000000000000000000000000000006064820152608401611109565b601c805461ffff191661ffff8316908117909155612710906128516012600a615d6c565b6128609064174876e800615d7b565b61286a9190615d7b565b6128749190615ddd565b601d556113276001600055565b60006128956001546001600160a01b031690565b6001600160a01b0316336001600160a01b031614806128cd575033600090815260026020526040902054600160a01b900460ff166001145b6128d657600080fd5b6001600160a01b0383166000908152600c6020526040902061271190836149b1565b60008215612907575047610f54565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa15801561294b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061296f9190615e25565b9050610f54565b6001546001600160a01b03163314806129a8575033600090815260026020526040902054600160a01b900460ff166001145b6129b157600080fd5b6129bb84846128f8565b8211156129c757600080fd5b60405163095ea7b360e01b81526001600160a01b038281166004830152600019602483015284169063095ea7b3906044016020604051808303816000875af1158015612a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a3b9190615e3e565b508315612adc576000816001600160a01b03168361520890604051600060405180830381858888f193505050503d8060008114612a94576040519150601f19603f3d011682016040523d82523d6000602084013e612a99565b606091505b5050905080612ad65760405162461bcd60e51b8152602060048201526009602482015268151e0819985a5b195960ba1b6044820152606401611109565b50612b96565b6040516323b872dd60e01b81523060048201526001600160a01b03828116602483015260448201849052600091908516906323b872dd906064016020604051808303816000875af1158015612b35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b599190615e3e565b905080612b945760405162461bcd60e51b8152602060048201526009602482015268151e0819985a5b195960ba1b6044820152606401611109565b505b50505050565b6001546001600160a01b0316331480612bce575033600090815260026020526040902054600160a01b900460ff166001145b612bd757600080fd5b6001546001600160a01b0390811690821603612c405760405162461bcd60e51b815260206004820152602260248201527f54686973206164647265737320697320616c726561647920746865206f776e65604482015261722160f01b6064820152608401611109565b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b612ca4613d0e565b6001546001600160a01b0316331480612cd6575033600090815260026020526040902054600160a01b900460ff166001145b612cdf57600080fd5b6001600160a01b0382166000908152601660205260408120805460ff1916831515179055600190555050565b6001600160a01b03163b151590565b6000612711836001600160a01b0384166149bd565b6060600061271183614a0c565b6001600160a01b038316612d925760405162461bcd60e51b815260206004820152601360248201527f45524332303a205a65726f2041646472657373000000000000000000000000006044820152606401611109565b6001600160a01b038216612de85760405162461bcd60e51b815260206004820152601360248201527f45524332303a205a65726f2041646472657373000000000000000000000000006044820152606401611109565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831660009081526008602052604081205460ff1615159003612ee5576001600160a01b0383166000818152600a602090815260408083208054600160ff1991821681178355600885529483902080549091169094179093555192835290917f72c6620b9a99d91ec1b983b3b0f8e14afcb99c8dbe50cfb5e85d83d2032800d5910160405180910390a1612b96848484614a68565b600680546001600160a01b0319166001600160a01b038516179055600082156130e657600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f7f9190615e5b565b9150600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ff89190615e5b565b60405163e6a4390560e01b81526001600160a01b038481166004830152306024830152919091169063e6a4390590604401602060405180830381865afa158015613046573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061306a9190615e5b565b6001600160a01b03811660009081526009602052604090205490915060ff16156130d65760405162461bcd60e51b815260206004820152601460248201527f5061697220616c726561647920657869737473210000000000000000000000006044820152606401611109565b6130e1848484614a68565b612b96565b600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015613139573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061315d9190615e5b565b60405163e6a4390560e01b81526001600160a01b038481166004830152306024830152919091169063e6a4390590604401602060405180830381865afa1580156131ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131cf9190615e5b565b6001600160a01b03811660009081526009602052604090205490915060ff161561323b5760405162461bcd60e51b815260206004820152601460248201527f5061697220616c726561647920657869737473210000000000000000000000006044820152606401611109565b612b96848484614a68565b6000818484111561326a5760405162461bcd60e51b8152600401611109919061575d565b505050900390565b6001600160a01b0383166132ee5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401611109565b6001600160a01b03821661336a5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401611109565b600081116133e05760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f00000000000000000000000000000000000000000000006064820152608401611109565b6001600160a01b0383166000908152600960205260408120548190819060ff161561342957600780546001600160a01b0319166001600160a01b03881617905560019250613472565b6001600160a01b03851660009081526009602052604090205460ff161561346e57600780546001600160a01b0319166001600160a01b03871617905560019150613472565b5060015b6007546001600160a01b039081166000908152600b6020908152604091829020825161018081018452815485168152600182015494851692810192909252600160a01b840460ff908116151593830193909352600160a81b8404831615156060830152600160b01b8404831615156080830152600160b81b84048316151560a0830152600160c01b84048316151560c0830152600160c81b840490921660e0820152600160d01b90920463ffffffff16610100830152600281015465ffffffffffff1661012083015260038101546101408301526004015461016082015261355a8787615105565b1561385c57601f54610100900460ff166135b65760405162461bcd60e51b815260206004820152601460248201527f54726164696e67206e6f7420656e61626c6564210000000000000000000000006044820152606401611109565b83806135bf5750825b156136ae5780516001600160a01b03166000908152600a602052604090205460ff166136525760405162461bcd60e51b8152602060048201526024808201527f54726164696e67206e6f7420656e61626c656420666f72207468697320726f7560448201527f74657221000000000000000000000000000000000000000000000000000000006064820152608401611109565b80606001516136ae5760405162461bcd60e51b815260206004820152602260248201527f54726164696e67206e6f7420656e61626c656420666f72207468697320706169604482015261722160f01b6064820152608401611109565b83806136b75750825b1561377b576001600160a01b03871660009081526015602052604090205460ff161580156136fe57506001600160a01b03861660009081526015602052604090205460ff16155b1561377b57601a5485111561377b5760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785460448201527f78416d6f756e742e0000000000000000000000000000000000000000000000006064820152608401611109565b80516001600160a01b03878116911614801590613796575082155b1561385c576001600160a01b03861660009081526015602052604090205460ff1661385c57601d54856137de886001600160a01b031660009081526004602052604090205490565b6137e89190615e78565b111561385c5760405162461bcd60e51b815260206004820152602a60248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785760448201527f616c6c657453697a652e000000000000000000000000000000000000000000006064820152608401611109565b821561390757601f5460ff16613907578060a0015115613907573060009081526004602052604090205461014082015181106139055761016082015160c0830151156138e15760e08301516007546001600160a01b03166000908152600460205260409020546127109160ff16906138d49190615d7b565b6138de9190615ddd565b90505b8082106138ec578091505b6007546139039083906001600160a01b0316614025565b505b505b8060800151613a075760075461392990889088906001600160a01b0316615297565b806080015115801561394057506139408787615105565b801561396557506001600160a01b03871660009081526016602052604090205460ff16155b801561398a57506001600160a01b03861660009081526016602052604090205460ff16155b8015613994575081155b15613a075760405162461bcd60e51b815260206004820152602260248201527f5072652d6c6971756964697479207472616e736665722070726f74656374696f60448201527f6e2e0000000000000000000000000000000000000000000000000000000000006064820152608401611109565b6001600160a01b03871660009081526014602052604081205460ff1680613a4657506001600160a01b03871660009081526014602052604090205460ff165b15613a52575084613c56565b8415613aaa57600f546012805463ffffffff80841667ffffffffffffffff19909216919091176401000000008085048316021763ffffffff60401b1916600160401b9384900491909116909202919091179055613b56565b8315613b02576010546012805463ffffffff80841667ffffffffffffffff19909216919091176401000000008085048316021763ffffffff60401b1916600160401b9384900491909116909202919091179055613b56565b8215613b56576011546012805463ffffffff80841667ffffffffffffffff19909216919091176401000000008085048316021763ffffffff60401b1916600160401b93849004919091169092029190911790555b601254600090613b9d9061271090613b9790613b829063ffffffff640100000000820481169116615e8b565b63ffffffff168a61541e90919063ffffffff16565b9061542a565b9050613ba98782615436565b6001600160a01b038a16600090815260046020526040902054909250613bcf9082615436565b6001600160a01b038a16600090815260046020526040808220929092553081522054613bfb9082615442565b30600081815260046020526040908190209290925590516001600160a01b038b16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90613c4c9085815260200190565b60405180910390a3505b6001600160a01b038816600090815260046020526040902054613c799082615436565b6001600160a01b03808a166000908152600460205260408082209390935590891681522054613ca89082615442565b6001600160a01b0380891660008181526004602052604090819020939093559151908a16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90613cfc9085815260200190565b60405180910390a35050505050505050565b600260005403613d605760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611109565b6002600055565b600e54600d5460009163ffffffff600160401b8204811692613d9192919091169061ffff16615ea8565b613d9b9190615ed0565b600f805463ffffffff191663ffffffff928316179055600e54600d54600160401b8204831692613dd8926401000000009004169061ffff16615ea8565b613de29190615ed0565b600f805467ffffffff0000000019811664010000000063ffffffff948516810291821793849055613e1d949304831692918216911617615e8b565b600f805463ffffffff92909216600160401b0263ffffffff60401b1990921691909117905550600190565b600e54600d5460009163ffffffff600160401b8204811692613e7992919091169061ffff6201000090910416615ea8565b613e839190615ed0565b6010805463ffffffff191663ffffffff928316179055600e54600d54600160401b8204831692613ec6926401000000009004169062010000900461ffff16615ea8565b613ed09190615ed0565b6010805467ffffffff0000000019811664010000000063ffffffff948516810291821793849055613f0b949304831692918216911617615e8b565b6010805463ffffffff92909216600160401b0263ffffffff60401b1990921691909117905550600190565b600e54600d5460009163ffffffff600160401b8204811692613f6992919091169061ffff64010000000090910416615ea8565b613f739190615ed0565b6011805463ffffffff191663ffffffff928316179055600e54600d54600160401b8204831692613fb59264010000000090819004909116910461ffff16615ea8565b613fbf9190615ed0565b6011805467ffffffff0000000019811664010000000063ffffffff948516810291821793849055613ffa949304831692918216911617615e8b565b6011805463ffffffff92909216600160401b0263ffffffff60401b1990921691909117905550600190565b601f805460ff191660019081179091556001600160a01b038083166000908152600b60209081526040808320815161018081018352815486168082529682015495861681850152600160a01b860460ff908116151582850152600160a81b870481161515606080840191909152600160b01b8804821615156080840152600160b81b88048216151560a0840152600160c01b88048216151560c0840152600160c81b880490911660e083015263ffffffff600160d01b9097048716610100830152600283015465ffffffffffff166101208301526003830154610140830152600490920154610160820152600680546001600160a01b0319169097179096558151908101825260125480861682526401000000008104861693820193909352600160401b909204909316928101839052919003614163575050614984565b3060009081526005602090815260408083206006546001600160a01b03168452909152902054600019146141bc573060009081526005602090815260408083206006546001600160a01b03168452909152902060001990555b60006002826040015163ffffffff16836000015163ffffffff16876141e19190615d7b565b6141eb9190615ddd565b6141f59190615ddd565b905060006142038287615ef3565b6040805160028082526060820183529293506000929091602083019080368337019050509050308160008151811061423d5761423d615d92565b60200260200101906001600160a01b031690816001600160a01b03168152505084602001518160018151811061427557614275615d92565b60200260200101906001600160a01b031690816001600160a01b03168152505060006142a08761544e565b9050600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156142f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143199190615e5b565b6001600160a01b03168260018151811061433557614335615d92565b60200260200101516001600160a01b0316036143d4576006546040517f791ac9470000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063791ac9479061439d908690600090879030904290600401615f06565b600060405180830381600087803b1580156143b757600080fd5b505af11580156143cb573d6000803e3d6000fd5b50505050614459565b6006546040517f5c11d7950000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690635c11d79590614426908690600090879030904290600401615f06565b600060405180830381600087803b15801561444057600080fd5b505af1158015614454573d6000803e3d6000fd5b505050505b6000816144658961544e565b61446f9190615ef3565b905060008461447e8784615d7b565b6144889190615ddd565b9050600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156144dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145019190615e5b565b6001600160a01b031688602001516001600160a01b03160361461357851561460e576006546018546040517ff305d7190000000000000000000000000000000000000000000000000000000081523060048201526024810189905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af11580156145ac573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906145d19190615f42565b505060408051838152602081018990527f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b450692500160405180910390a15b614717565b85156147175760065460208901516018546040517fe8e337000000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b039283166024820152604481018a90526064810185905260006084820181905260a482015290821660c48201524260e482015291169063e8e3370090610104016060604051808303816000875af11580156146b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146da9190615f42565b505060408051838152602081018990527f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b450692500160405180910390a15b6147218183615ef3565b602089015160175460405163095ea7b360e01b81526001600160a01b03918216600482015260001960248201529294506000928592919091169063095ea7b3906044016020604051808303816000875af1158015614783573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147a79190615e3e565b50600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156147fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061481f9190615e5b565b6001600160a01b03168a602001516001600160a01b0316036148e657602089015163ffffffff16156148e1576017546040516001600160a01b03909116906152089083906000818181858888f193505050503d806000811461489d576040519150601f19603f3d011682016040523d82523d6000602084013e6148a2565b606091505b505080925050816148e15760405162461bcd60e51b8152602060048201526009602482015268151e0819985a5b195960ba1b6044820152606401611109565b614979565b602089015163ffffffff16156149795760208a01516017546040516323b872dd60e01b81523060048201526001600160a01b039182166024820152604481018490529116906323b872dd906064016020604051808303816000875af1158015614953573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906149779190615e3e565b505b505050505050505050505b5050601f805460ff19169055565b6000612711836001600160a01b03841661558e565b6000610f3b825490565b60006127118383615688565b6000818152600183016020526040812054614a0457508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610f54565b506000610f54565b606081600001805480602002602001604051908101604052809291908181526020018280548015614a5c57602002820191906000526020600020905b815481526020019060010190808311614a48575b50505050509050919050565b600680546001600160a01b0319166001600160a01b0385161790556000808315614cfa57600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015614adf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b039190615e5b565b9250600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015614b58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b7c9190615e5b565b60405163e6a4390560e01b81526001600160a01b038581166004830152306024830152919091169063e6a4390590604401602060405180830381865afa158015614bca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614bee9190615e5b565b90506001600160a01b0381163b15614c0857809150614eeb565b600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015614c5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c7f9190615e5b565b6040516364e329cb60e11b81526001600160a01b038581166004830152306024830152919091169063c9c65396906044016020604051808303816000875af1158015614ccf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614cf39190615e5b565b9150614eeb565b600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015614d4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d719190615e5b565b60405163e6a4390560e01b81526001600160a01b038581166004830152306024830152919091169063e6a4390590604401602060405180830381865afa158015614dbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614de39190615e5b565b90506001600160a01b0381163b15614dfd57809150614eeb565b600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015614e50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e749190615e5b565b6040516364e329cb60e11b81526001600160a01b038581166004830152306024830152919091169063c9c65396906044016020604051808303816000875af1158015614ec4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614ee89190615e5b565b91505b6001600160a01b038083166000908152600b6020908152604080832080548a86166001600160a01b0319909116178155600180820180547fffff00000000000000000000000000000000000000000000000000000000000016968a169690961790955560028101805465ffffffffffff1916905560038101849055600481018490556009909252909120805460ff1916909217909155614f8b86846156b2565b614f9530846156b2565b6001600160a01b03861660009081526014602090815260408083208054600160ff1991821681179092556015845282852080548216831790556016845282852080548216831790556013909352922080549091169091179055614ffb3387600019612d3c565b600154615014906001600160a01b031687600019612d3c565b6150213087600019612d3c565b60405163095ea7b360e01b81526001600160a01b038781166004830152600019602483015284169063095ea7b3906044016020604051808303816000875af1158015615071573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150959190615e3e565b503060009081526005602090815260408083206001600160a01b038a8116808652918452938290206000199055815190815286841692810192909252918616918101919091527f8be8ca5dd0f6315b4748476b8024cfa472222bff1adc749d73ae5697ec2efc7d90606001612107565b6001546000906001600160a01b0384811691161480159061513457506001546001600160a01b03838116911614155b801561514b57506001546001600160a01b03163214155b801561517057506001600160a01b03821660009081526013602052604090205460ff16155b801561519557506001600160a01b03831660009081526013602052604090205460ff16155b80156151ac57506001600160a01b03821661dead14155b80156151c057506001600160a01b03821615155b80156151d557506001600160a01b0383163014155b801561520457506001600160a01b038316600090815260026020526040902054600160a01b900460ff16600114155b801561523357506001600160a01b038216600090815260026020526040902054600160a01b900460ff16600114155b801561526357506001600160a01b038316600090815260026020819052604090912054600160a01b900460ff1614155b80156127115750506001600160a01b0316600090815260026020819052604090912054600160a01b900460ff161415919050565b6001600160a01b0381166000908152600b6020526040902060010154600160b01b900460ff16156153305760405162461bcd60e51b815260206004820152602360248201527f4c697175696469747920616c726561647920616464656420616e64206d61726b60448201527f65642e00000000000000000000000000000000000000000000000000000000006064820152608401611109565b61533a8383615105565b1580156153585750806001600160a01b0316826001600160a01b0316145b15610fe9576001600160a01b038381166000908152601360209081526040808320805460ff19166001908117909155601f805462ff0000191662010000179055938516808452600b83529281902084018054770101000000000000000000000000000000000000000000007fffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffff9091161790558051928352908201929092527f8175ec0b88ae54888c0026594d930775f30cd3705385da8218b80d8ae468c5439101611578565b60006127118284615d7b565b60006127118284615ddd565b60006127118284615ef3565b60006127118284615e78565b6001600160a01b038082166000908152600b602090815260408083205481517fad5c464800000000000000000000000000000000000000000000000000000000815291519394169263ad5c4648926004808401939192918290030181865afa1580156154be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906154e29190615e5b565b6001600160a01b038381166000908152600b6020526040902060010154918116911603615510575047919050565b6001600160a01b038281166000908152600b6020526040908190206001015490516370a0823160e01b81523060048201529116906370a0823190602401602060405180830381865afa15801561556a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3b9190615e25565b600081815260018301602052604081205480156156775760006155b2600183615ef3565b85549091506000906155c690600190615ef3565b905081811461562b5760008660000182815481106155e6576155e6615d92565b906000526020600020015490508087600001848154811061560957615609615d92565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061563c5761563c615f70565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610f54565b6000915050610f54565b5092915050565b600082600001828154811061569f5761569f615d92565b9060005260206000200154905092915050565b6001600160a01b0382166000908152600c60205260409020610fe99082612d1a565b6001600160a01b038116811461132757600080fd5b6000602082840312156156fb57600080fd5b8135612711816156d4565b600081518084526020808501945080840160005b8381101561573f5781516001600160a01b03168752958201959082019060010161571a565b509495945050505050565b6020815260006127116020830184615706565b600060208083528351808285015260005b8181101561578a5785810183015185820160400152820161576e565b506000604082860101526040601f19601f8301168501019250505092915050565b600080604083850312156157be57600080fd5b82356157c9816156d4565b946020939093013593505050565b801515811461132757600080fd5b6000806000606084860312156157fa57600080fd5b8335615805816156d4565b92506020840135615815816157d7565b91506040840135615825816156d4565b809150509250925092565b60008060006060848603121561584557600080fd5b8335615850816156d4565b92506020840135615860816156d4565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156158b0576158b0615871565b604052919050565b600067ffffffffffffffff8211156158d2576158d2615871565b5060051b60200190565b600082601f8301126158ed57600080fd5b813560206159026158fd836158b8565b615887565b82815260059290921b8401810191818101908684111561592157600080fd5b8286015b8481101561593c5780358352918301918301615925565b509695505050505050565b6000806040838503121561595a57600080fd5b823567ffffffffffffffff8082111561597257600080fd5b818501915085601f83011261598657600080fd5b813560206159966158fd836158b8565b82815260059290921b840181019181810190898411156159b557600080fd5b948201945b838610156159dc5785356159cd816156d4565b825294820194908201906159ba565b965050860135925050808211156159f257600080fd5b506159ff858286016158dc565b9150509250929050565b803561ffff81168114610f3e57600080fd5b600060208284031215615a2d57600080fd5b61271182615a09565b60008060408385031215615a4957600080fd5b8235615a54816156d4565b91506020830135615a64816157d7565b809150509250929050565b600080600060608486031215615a8457600080fd5b615a8d84615a09565b9250615a9b60208501615a09565b9150615aa960408501615a09565b90509250925092565b60008060208385031215615ac557600080fd5b823567ffffffffffffffff80821115615add57600080fd5b818501915085601f830112615af157600080fd5b813581811115615b0057600080fd5b8660208260051b8501011115615b1557600080fd5b60209290920196919550909350505050565b803560ff81168114610f3e57600080fd5b60008060408385031215615b4b57600080fd5b8235615b56816156d4565b9150615b6460208401615b27565b90509250929050565b600080600060608486031215615b8257600080fd5b8335615b8d816156d4565b9250615b9b60208501615b27565b9150615aa960408501615b27565b60008060408385031215615bbc57600080fd5b8235615bc7816156d4565b91506020830135615a64816156d4565b60008060408385031215615bea57600080fd5b615bf383615a09565b9150615b6460208401615a09565b60008060408385031215615c1457600080fd5b8235615bc7816157d7565b60008060008060808587031215615c3557600080fd5b8435615c40816157d7565b93506020850135615c50816156d4565b9250604085013591506060850135615c67816156d4565b939692955090935050565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115615cc3578160001904821115615ca957615ca9615c72565b80851615615cb657918102915b93841c9390800290615c8d565b509250929050565b600082615cda57506001610f54565b81615ce757506000610f54565b8160018114615cfd5760028114615d0757615d23565b6001915050610f54565b60ff841115615d1857615d18615c72565b50506001821b610f54565b5060208310610133831016604e8410600b8410161715615d46575081810a610f54565b615d508383615c88565b8060001904821115615d6457615d64615c72565b029392505050565b600061271160ff841683615ccb565b8082028115828204841417610f5457610f54615c72565b634e487b7160e01b600052603260045260246000fd5b600060ff821660ff8103615dbe57615dbe615c72565b60010192915050565b634e487b7160e01b600052601260045260246000fd5b600082615dec57615dec615dc7565b500490565b61ffff81811683821601908082111561568157615681615c72565b600060018201615e1e57615e1e615c72565b5060010190565b600060208284031215615e3757600080fd5b5051919050565b600060208284031215615e5057600080fd5b8151612711816157d7565b600060208284031215615e6d57600080fd5b8151612711816156d4565b80820180821115610f5457610f54615c72565b63ffffffff81811683821601908082111561568157615681615c72565b63ffffffff818116838216028082169190828114615ec857615ec8615c72565b505092915050565b600063ffffffff80841680615ee757615ee7615dc7565b92169190910492915050565b81810381811115610f5457610f54615c72565b85815284602082015260a060408201526000615f2560a0830186615706565b6001600160a01b0394909416606083015250608001529392505050565b600080600060608486031215615f5757600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603160045260246000fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a26469706673582212203df85adaca5a4d5674bb344be7610f1eed1ee00ffc14e387f33ed69f77dcf48264736f6c63430008110033

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

0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000861435743ae62fd6237d2fb3ab255b4f624ee40b000000000000000000000000a3d432884968917d2fbc88d8592955a2f6c42e39

-----Decoded View---------------
Arg [0] : LPwithEth_ToF_ (bool): True
Arg [1] : LPTargetCoinCA_ (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [2] : marketing_ (address): 0x861435743Ae62fd6237d2FB3aB255B4f624EE40b
Arg [3] : lpLocker_ (address): 0xA3d432884968917D2fBC88d8592955a2F6c42e39

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [1] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [2] : 000000000000000000000000861435743ae62fd6237d2fb3ab255b4f624ee40b
Arg [3] : 000000000000000000000000a3d432884968917d2fbc88d8592955a2f6c42e39


Deployed Bytecode Sourcemap

49839:32717:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53485:73;;;;;;;;;;;;53516:42;53485:73;;;;;-1:-1:-1;;;;;178:55:1;;;160:74;;148:2;133:18;53485:73:0;;;;;;;;64765:176;;;;;;;;;;-1:-1:-1;64765:176:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;57567:80::-;;;;;;;;;;-1:-1:-1;57639:5:0;;;;;;;;;;;;;;;;;57567:80;;;;;;;:::i;50578:26::-;;;;;;;;;;-1:-1:-1;50578:26:0;;;;-1:-1:-1;;;;;50578:26:0;;;52498:126;;;;;;;;;;-1:-1:-1;52498:126:0;;;;;;;;;;;;;;;-1:-1:-1;;;52498:126:0;;;;;;;;;;2518:10:1;2555:15;;;2537:34;;2607:15;;;2602:2;2587:18;;2580:43;2659:15;;2639:18;;;2632:43;;;;2496:2;2481:18;52498:126:0;2312:369:1;58503:161:0;;;;;;;;;;-1:-1:-1;58503:161:0;;;;;:::i;:::-;;:::i;:::-;;;3267:14:1;;3260:22;3242:41;;3230:2;3215:18;58503:161:0;3102:187:1;51880:110:0;;;;;;;;;;-1:-1:-1;51880:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;3500:6:1;3533:15;;;3515:34;;3585:15;;;3580:2;3565:18;;3558:43;3637:15;;3617:18;;;3610:43;;;;3478:2;3463:18;51880:110:0;3294:365:1;70633:140:0;;;;;;;;;;-1:-1:-1;70633:140:0;;;;;:::i;:::-;-1:-1:-1;;;;;70731:34:0;70707:4;70731:34;;;:25;:34;;;;;;;;;70633:140;52367:122;;;;;;;;;;-1:-1:-1;52367:122:0;;;;;;;;;;;;;;;-1:-1:-1;;;52367:122:0;;;;;;57238:115;;;;;;;;;;;;;:::i;:::-;;;3810:25:1;;;3798:2;3783:18;57238:115:0;3664:177:1;60263:200:0;;;;;;;;;;-1:-1:-1;60263:200:0;;;;;:::i;:::-;;:::i;:::-;;58094:401;;;;;;;;;;-1:-1:-1;58094:401:0;;;;;:::i;:::-;;:::i;74161:389::-;;;;;;;;;;-1:-1:-1;74161:389:0;;;;;:::i;:::-;;:::i;52767:41::-;;;;;;;;;;;;52804:4;52767:41;;;;;7676:6:1;7664:19;;;7646:38;;7634:2;7619:18;52767:41:0;7502:188:1;69276:290:0;;;;;;;;;;-1:-1:-1;69276:290:0;;;;;:::i;:::-;;:::i;59150:1105::-;;;;;;;;;;-1:-1:-1;59150:1105:0;;;;;:::i;:::-;;:::i;57359:112::-;;;;;;;;;;;;;:::i;:::-;;;8687:4:1;8675:17;;;8657:36;;8645:2;8630:18;57359:112:0;8515:184:1;65335:911:0;;;;;;;;;;-1:-1:-1;65335:911:0;;;;;:::i;:::-;;:::i;70028:153::-;;;;;;;;;;-1:-1:-1;70028:153:0;;;;;:::i;:::-;;:::i;68719:146::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;9290:15:1;;;9272:34;;9342:15;;;;9337:2;9322:18;;9315:43;9184:18;68719:146:0;9037:327:1;54266:34:0;;;;;;;;;;-1:-1:-1;54266:34:0;;;;;;;;;;;50611:23;;;;;;;;;;-1:-1:-1;50611:23:0;;;;-1:-1:-1;;;;;50611:23:0;;;70358:127;;;;;;;;;;-1:-1:-1;70358:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;70449:28:0;70425:4;70449:28;;;:19;:28;;;;;;;;;70358:127;6511:162;;;;;;;;;;-1:-1:-1;6511:162:0;;;;;:::i;:::-;;:::i;54307:36::-;;;;;;;;;;-1:-1:-1;54307:36:0;;;;;;;;;;;7310:116;;;;;;;;;;-1:-1:-1;7310:116:0;;;;;:::i;:::-;-1:-1:-1;;;;;7397:11:0;7374:5;7397:11;;;:6;:11;;;;;:21;-1:-1:-1;;;7397:21:0;;;;;7310:116;69871:149;;;;;;;;;;-1:-1:-1;69871:149:0;;;;;:::i;:::-;;:::i;51274:41::-;;;;;;;;;;-1:-1:-1;51274:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51274:41:0;;;;;;;;;-1:-1:-1;;;51274:41:0;;;;;-1:-1:-1;;;51274:41:0;;;;;-1:-1:-1;;;51274:41:0;;;;;-1:-1:-1;;;51274:41:0;;;;;-1:-1:-1;;;51274:41:0;;;;;-1:-1:-1;;;51274:41:0;;;;;-1:-1:-1;;;51274:41:0;;;;;;;;;;;;;;-1:-1:-1;;;;;10590:15:1;;;10572:34;;10642:15;;;;10637:2;10622:18;;10615:43;10701:14;;10694:22;10674:18;;;10667:50;;;;10760:14;;10753:22;10748:2;10733:18;;10726:50;10820:14;;10813:22;10807:3;10792:19;;10785:51;10880:14;;10873:22;10867:3;10852:19;;10845:51;3076:13;3069:21;10944:3;10929:19;;3057:34;8502:4;8491:16;10998:3;10983:19;;8479:29;2289:10;2278:22;11053:3;11038:19;;2266:35;10065:14;10054:26;11108:3;11093:19;;10042:39;11144:3;11129:19;;11122:36;;;;11189:3;11174:19;;11167:36;10498:3;10483:19;51274:41:0;10092:1117:1;73032:325:0;;;;;;;;;;-1:-1:-1;73032:325:0;;;;;:::i;:::-;;:::i;70493:132::-;;;;;;;;;;-1:-1:-1;70493:132:0;;;;;:::i;:::-;-1:-1:-1;;;;;70587:30:0;70563:4;70587:30;;;:21;:30;;;;;;;;;70493:132;68356:179;;;;;;;;;;-1:-1:-1;68356:179:0;;;;;:::i;:::-;;:::i;6681:263::-;;;;;;;;;;-1:-1:-1;6681:263:0;;;;;:::i;:::-;;:::i;53759:75::-;;;;;;;;;;;;;;;;7193:109;;;;;;;;;;-1:-1:-1;7193:109:0;;;;;:::i;:::-;-1:-1:-1;;;;;7278:16:0;7256:4;7278:16;;;:11;:16;;;;;;;;;7193:109;52917:45;;;;;;;;;;;;52958:4;52917:45;;5606:268;;;;;;;;;;-1:-1:-1;5606:268:0;;;;;:::i;:::-;;:::i;57794:117::-;;;;;;;;;;-1:-1:-1;57794:117:0;;;;;:::i;:::-;-1:-1:-1;;;;;57887:16:0;57860:7;57887:16;;;:7;:16;;;;;;;57794:117;72404:620;;;;;;;;;;-1:-1:-1;72404:620:0;;;;;:::i;:::-;;:::i;78894:137::-;;;;;;;;;;-1:-1:-1;78894:137:0;;;;;:::i;:::-;;:::i;64951:208::-;;;;;;;;;;-1:-1:-1;64951:208:0;;;;;:::i;:::-;;:::i;53867:33::-;;;;;;;;;;-1:-1:-1;53867:33:0;;;;;;;;57477:84;;;;;;;;;;-1:-1:-1;57551:7:0;;;;;;;;;;;;;;;;;57477:84;;7097:88;;;;;;;;;;;;;:::i;64029:148::-;;;;;;;;;;-1:-1:-1;64029:148:0;;;;;:::i;:::-;;:::i;52237:121::-;;;;;;;;;;-1:-1:-1;52237:121:0;;;;;;;;;;;;;;;-1:-1:-1;;;52237:121:0;;;;;;57919:167;;;;;;;;;;-1:-1:-1;57919:167:0;;;;;:::i;:::-;;:::i;71802:393::-;;;;;;;;;;-1:-1:-1;71802:393:0;;;;;:::i;:::-;;:::i;68543:168::-;;;;;;;;;;-1:-1:-1;68543:168:0;;;;;:::i;:::-;;:::i;71469:325::-;;;;;;;;;;-1:-1:-1;71469:325:0;;;;;:::i;:::-;;:::i;64412:168::-;;;;;;;;;;-1:-1:-1;64412:168:0;;;;;:::i;:::-;;:::i;66425:743::-;;;;;;;;;;-1:-1:-1;66425:743:0;;;;;:::i;:::-;;:::i;54000:83::-;;;;;;;;;;;;;;;;53636:29;;;;;;;;;;-1:-1:-1;53636:29:0;;;;;;;;52110:118;;;;;;;;;;-1:-1:-1;52110:118:0;;;;;;;;;;;;;;;-1:-1:-1;;;52110:118:0;;;;;;54239:18;;;;;;;;;;-1:-1:-1;54239:18:0;;;;;;;;69574:289;;;;;;;;;;-1:-1:-1;69574:289:0;;;;;:::i;:::-;;:::i;64588:169::-;;;;;;;;;;-1:-1:-1;64588:169:0;;;;;:::i;:::-;;:::i;73901:252::-;;;;;;;;;;-1:-1:-1;73901:252:0;;;;;:::i;:::-;;:::i;57653:133::-;;;;;;;;;;-1:-1:-1;57653:133:0;;;;;:::i;:::-;-1:-1:-1;;;;;57755:19:0;;;57737:7;57755:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;57653:133;50805:47;;;;;;;;;;-1:-1:-1;50805:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;73365:528;;;;;;;;;;-1:-1:-1;73365:528:0;;;;;:::i;:::-;;:::i;5357:210::-;;;;;;;;;;-1:-1:-1;5357:210:0;;;;;:::i;:::-;;:::i;70189:161::-;;;;;;;;;;-1:-1:-1;70189:161:0;;;;;:::i;:::-;;:::i;64765:176::-;64863:16;4437:10;7518:6;;-1:-1:-1;;;;;7518:6:0;;7450:82;4437:10;-1:-1:-1;;;;;4421:26:0;871:10;-1:-1:-1;;;;;4421:26:0;;:78;;;-1:-1:-1;871:10:0;4464:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4464:30:0;;;;4498:1;4464:35;4421:78;4413:102;;;;;;-1:-1:-1;;;;;64899:25:0;::::1;;::::0;;;:8:::1;:25;::::0;;;;:34:::1;::::0;:32:::1;:34::i;:::-;64892:41;;4522:1;64765:176:::0;;;:::o;58503:161::-;58578:4;58595:39;871:10;58618:7;58627:6;58595:8;:39::i;:::-;-1:-1:-1;58652:4:0;58503:161;;;;;:::o;57238:115::-;57293:7;50398:13;50286:2;50398;:13;:::i;:::-;50381:30;;50186:15;50381:30;:::i;:::-;57319:1;57308:12;57304:31;;57324:8;;;57304:31;50398:13;50286:2;50398;:13;:::i;:::-;50381:30;;50186:15;50381:30;:::i;:::-;57336:14;;57238:115;:::o;60263:200::-;7518:6;;-1:-1:-1;;;;;7518:6:0;871:10;4421:26;;:78;;-1:-1:-1;871:10:0;4464:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4464:30:0;;;;4498:1;4464:35;4421:78;4413:102;;;;;;60389:66:::1;60410:11;60423:14;60439:15;60389:20;:66::i;:::-;60263:200:::0;;;:::o;58094:401::-;-1:-1:-1;;;;;58215:19:0;;58194:4;58215:19;;;:11;:19;;;;;;;;871:10;58215:33;;;;;;;;-1:-1:-1;;58215:54:0;58211:208;;58286:121;58295:6;871:10;58317:89;58355:6;58317:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;58317:19:0;;;;;;:11;:19;;;;;;;;871:10;58317:33;;;;;;;;;;:37;:89::i;:::-;58286:8;:121::i;:::-;58429:36;58439:6;58447:9;58458:6;58429:9;:36::i;:::-;-1:-1:-1;58483:4:0;58094:401;;;;;:::o;74161:389::-;7518:6;;-1:-1:-1;;;;;7518:6:0;871:10;4421:26;;:78;;-1:-1:-1;871:10:0;4464:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4464:30:0;;;;4498:1;4464:35;4421:78;4413:102;;;;;;74301:12:::1;:19;74282:8;:15;:38;74274:72;;;::::0;-1:-1:-1;;;74274:72:0;;15674:2:1;74274:72:0::1;::::0;::::1;15656:21:1::0;15713:2;15693:18;;;15686:30;15752:23;15732:18;;;15725:51;15793:18;;74274:72:0::1;;;;;;;;;74362:7;74357:186;74379:8;:15;74375:1;:19;;;74357:186;;;74449:12;74462:1;74449:15;;;;;;;;;;:::i;:::-;;;;;;;74424:21;74434:10;-1:-1:-1::0;;;;;57887:16:0;57860:7;57887:16;;;:7;:16;;;;;;;57794:117;74424:21:::1;:40;;74416:49;;;::::0;::::1;;74480:51;74490:10;74502:8;74511:1;74502:11;;;;;;;;;;:::i;:::-;;;;;;;74515:12;74528:1;74515:15;;;;;;;;;;:::i;:::-;;;;;;;74480:9;:51::i;:::-;74396:3:::0;::::1;::::0;::::1;:::i;:::-;;;;74357:186;;69276:290:::0;3350:21;:19;:21::i;:::-;7518:6;;-1:-1:-1;;;;;7518:6:0;871:10;4421:26:::1;::::0;:78:::1;;-1:-1:-1::0;871:10:0;4464:20:::1;::::0;;;:6:::1;:20;::::0;;;;:30;-1:-1:-1;;;4464:30:0;::::1;;;4498:1;4464:35;4421:78;4413:102;;;::::0;::::1;;69410:4:::2;50398:13;50286:2;50398;:13;:::i;:::-;50381:30;::::0;50186:15:::2;50381:30;:::i;:::-;69400:14;;;;:::i;:::-;53624:5;69364:31;69365:13:::0;::::2;50398;50286:2;50398;:13;:::i;:::-;50381:30;::::0;50186:15:::2;50381:30;:::i;:::-;69365:13;;;;:::i;:::-;69364:31;;;;:::i;:::-;:51;;69356:119;;;::::0;-1:-1:-1;;;69356:119:0;;16707:2:1;69356:119:0::2;::::0;::::2;16689:21:1::0;16746:2;16726:18;;;16719:30;16785:34;16765:18;;;16758:62;16856:25;16836:18;;;16829:53;16899:19;;69356:119:0::2;16505:419:1::0;69356:119:0::2;69486:9;:15:::0;;-1:-1:-1;;69486:15:0::2;;::::0;::::2;::::0;;::::2;::::0;;;53624:5:::2;::::0;50398:13:::2;50286:2;50398;:13;:::i;:::-;50381:30;::::0;50186:15:::2;50381:30;:::i;:::-;69528:13;;;;:::i;:::-;69527:31;;;;:::i;:::-;69512:12;:46:::0;3394:20;2788:1;3914:7;:22;3731:213;3394:20;69276:290;:::o;59150:1105::-;871:10;4569:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4569:30:0;;;;4603:1;4569:35;4561:44;;;;;;59243:14:::1;::::0;::::1;::::0;::::1;;;59239:68;;59274:14;:21:::0;;-1:-1:-1;;59274:21:0::1;;;::::0;;59239:68:::1;-1:-1:-1::0;;;;;59341:19:0;::::1;59317:21;59341:19:::0;;;:7:::1;:19;::::0;;;;59371:875;::::1;;;59402:15;::::0;::::1;::::0;-1:-1:-1;;;59402:15:0;::::1;;;59398:533;;59446:15;::::0;::::1;::::0;-1:-1:-1;;;59446:15:0;::::1;;;59438:52;;;::::0;-1:-1:-1;;;59438:52:0;;17131:2:1;59438:52:0::1;::::0;::::1;17113:21:1::0;17170:2;17150:18;;;17143:30;17209:26;17189:18;;;17182:54;17253:18;;59438:52:0::1;16929:348:1::0;59438:52:0::1;59527:4;59509:15:::0;::::1;:22:::0;;59552;;;;;;59640:5:::1;50398:13;50286:2;50398;:13;:::i;:::-;50381:30;::::0;50186:15:::1;50381:30;:::i;:::-;59624:12;::::0;59634:2:::1;59624:12;:::i;:::-;59623:22;;;;:::i;:::-;59600:20;::::0;::::1;:45:::0;59708:5:::1;50398:13;50286:2;50398;:13;:::i;:::-;50381:30;::::0;50186:15:::1;50381:30;:::i;:::-;59692:12;::::0;59702:2:::1;59692:12;:::i;:::-;59691:22;;;;:::i;:::-;59671:17;::::0;::::1;:42:::0;59773:4:::1;59742:28:::0;::::1;:35:::0;;-1:-1:-1;;;59796:49:0;;;;-1:-1:-1;;;59832:12:0::1;59796:49;;;::::0;;;;59864:25:::1;::::0;::::1;:51:::0;;-1:-1:-1;;59864:51:0::1;59899:15;59864:51;;;::::0;;59398:533:::1;59945:21;::::0;::::1;:31:::0;;-1:-1:-1;;;;59945:31:0::1;-1:-1:-1::0;;;59945:31:0;::::1;;;;::::0;;59996:70:::1;::::0;;-1:-1:-1;;;;;17498:55:1;;17480:74;;17602:10;60027:12:0::1;17590:23:1::0;17585:2;17570:18;;17563:51;17662:14;60049:15:0::1;17650:27:1::0;17630:18;;;17623:55;;;;59996:70:0::1;::::0;17468:2:1;17453:18;59996:70:0::1;;;;;;;;60263:200:::0;;;:::o;59371:875::-:1;60088:7;60084:162;;60112:21;::::0;::::1;:31:::0;;-1:-1:-1;;;;60112:31:0::1;-1:-1:-1::0;;;60112:31:0;::::1;;;;::::0;;60163:71:::1;::::0;;-1:-1:-1;;;;;17498:55:1;;17480:74;;17602:10;60195:12:0::1;17590:23:1::0;17585:2;17570:18;;17563:51;17662:14;60217:15:0::1;17650:27:1::0;17630:18;;;17623:55;;;;60163:71:0::1;::::0;17468:2:1;17453:18;60163:71:0::1;17282:402:1::0;57359:112:0;57411:5;50398:13;50286:2;50398;:13;:::i;:::-;50381:30;;50186:15;50381:30;:::i;:::-;57435:1;57424:12;57420:31;;57440:8;;;57420:31;-1:-1:-1;50286:2:0;;57359:112::o;65335:911::-;65432:4;4437:10;7518:6;;-1:-1:-1;;;;;7518:6:0;;7450:82;4437:10;-1:-1:-1;;;;;4421:26:0;871:10;-1:-1:-1;;;;;4421:26:0;;:78;;;-1:-1:-1;871:10:0;4464:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4464:30:0;;;;4498:1;4464:35;4421:78;4413:102;;;;;;52804:4:::1;65457:21;::::0;::::1;;::::0;::::1;::::0;:65:::1;;-1:-1:-1::0;52853:4:0::1;65499:23;::::0;::::1;;;65457:65;:117;;;;-1:-1:-1::0;52906:4:0::1;65543:31;::::0;::::1;;;65457:117;65449:170;;;::::0;-1:-1:-1;;;65449:170:0;;17891:2:1;65449:170:0::1;::::0;::::1;17873:21:1::0;17930:2;17910:18;;;17903:30;17969:25;17949:18;;;17942:53;18012:18;;65449:170:0::1;17689:347:1::0;65449:170:0::1;52958:4;65638:16;65647:7:::0;65638:6;:16:::1;:::i;:::-;:35;;;;65630:80;;;::::0;-1:-1:-1;;;65630:80:0;;18416:2:1;65630:80:0::1;::::0;::::1;18398:21:1::0;;;18435:18;;;18428:30;18494:34;18474:18;;;18467:62;18546:18;;65630:80:0::1;18214:356:1::0;65630:80:0::1;65759:6;:13:::0;65721:14:::1;::::0;65759:23:::1;::::0;;::::1;:13:::0;::::1;:23;65756:128;;65799:6;:22:::0;;-1:-1:-1;;65799:22:0::1;;::::0;::::1;;::::0;;65848:24:::1;:22;:24::i;:::-;65836:36;;65756:128;65907:6;:14:::0;:25:::1;::::0;;::::1;:14:::0;;;::::1;;:25;65904:133;;65949:6;:24:::0;;-1:-1:-1;;65949:24:0::1;::::0;::::1;::::0;::::1;;;::::0;;66000:25:::1;:23;:25::i;:::-;65988:37;;65904:133;66060:6;:18:::0;:33:::1;::::0;;::::1;:18:::0;;;::::1;;:33;66057:153;;66110:6;:32:::0;;-1:-1:-1;;66110:32:0::1;::::0;::::1;::::0;::::1;;;::::0;;66169:29:::1;:27;:29::i;:::-;66157:41;;66057:153;66229:9:::0;65335:911;-1:-1:-1;;;;65335:911:0:o;70028:153::-;3350:21;:19;:21::i;:::-;7518:6;;-1:-1:-1;;;;;7518:6:0;871:10;4421:26:::1;::::0;:78:::1;;-1:-1:-1::0;871:10:0;4464:20:::1;::::0;;;:6:::1;:20;::::0;;;;:30;-1:-1:-1;;;4464:30:0;::::1;;;4498:1;4464:35;4421:78;4413:102;;;::::0;::::1;;-1:-1:-1::0;;;;;70133:30:0;::::2;;::::0;;;:21:::2;:30;::::0;;;;:40;;-1:-1:-1;;70133:40:0::2;::::0;::::2;;;::::0;;-1:-1:-1;3914:22:0;;70028:153;;:::o;68719:146::-;68771:17;68790:16;68827:14;68947:11;:21;-1:-1:-1;;;;;68947:21:0;;68873:103;68827:14;69057:20;;-1:-1:-1;;;;;69057:20:0;68819:38;;;;68719:146;;:::o;6511:162::-;7518:6;;-1:-1:-1;;;;;7518:6:0;871:10;4421:26;;:78;;-1:-1:-1;871:10:0;4464:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4464:30:0;;;;4498:1;4464:35;4421:78;4413:102;;;;;;6589:6:::1;6585:81;6599:14:::0;;::::1;6585:81;;;6635:19;6647:3;;6651:1;6647:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;7017:11:0;;;;;:6;:11;;;;;;;;7010:18;;-1:-1:-1;;7010:18:0;;;7043:11;:16;;;;;:24;;-1:-1:-1;;7043:24:0;;;6952:123;6635:19:::1;6615:3:::0;::::1;::::0;::::1;:::i;:::-;;;;6585:81;;69871:149:::0;3350:21;:19;:21::i;:::-;7518:6;;-1:-1:-1;;;;;7518:6:0;871:10;4421:26:::1;::::0;:78:::1;;-1:-1:-1::0;871:10:0;4464:20:::1;::::0;;;:6:::1;:20;::::0;;;;:30;-1:-1:-1;;;4464:30:0;::::1;;;4498:1;4464:35;4421:78;4413:102;;;::::0;::::1;;-1:-1:-1::0;;;;;69974:28:0;::::2;;::::0;;;:19:::2;:28;::::0;;;;:38;;-1:-1:-1;;69974:38:0::2;::::0;::::2;;;::::0;;-1:-1:-1;3914:22:0;;70028:153;;:::o;73032:325::-;7518:6;;-1:-1:-1;;;;;7518:6:0;871:10;4421:26;;:78;;-1:-1:-1;871:10:0;4464:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4464:30:0;;;;4498:1;4464:35;4421:78;4413:102;;;;;;73178:3:::1;73156:18;:25;;;;73148:58;;;::::0;-1:-1:-1;;;73148:58:0;;18917:2:1;73148:58:0::1;::::0;::::1;18899:21:1::0;18956:2;18936:18;;;18929:30;18995:22;18975:18;;;18968:50;19035:18;;73148:58:0::1;18715:344:1::0;73148:58:0::1;-1:-1:-1::0;;;;;73219:15:0;::::1;;::::0;;;:7:::1;:15;::::0;;;;;;;;:25:::1;;:46:::0;;;::::1;-1:-1:-1::0;;;73219:46:0::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;73283:66;;19234:74:1;;;19324:18;;;19317:45;73283:66:0::1;::::0;19207:18:1;73283:66:0::1;;;;;;;;73032:325:::0;;:::o;68356:179::-;3350:21;:19;:21::i;:::-;7518:6;;-1:-1:-1;;;;;7518:6:0;871:10;4421:26:::1;::::0;:78:::1;;-1:-1:-1::0;871:10:0;4464:20:::1;::::0;;;:6:::1;:20;::::0;;;;:30;-1:-1:-1;;;4464:30:0;::::1;;;4498:1;4464:35;4421:78;4413:102;;;::::0;::::1;;68446:11:::2;:33:::0;;-1:-1:-1;;;;;68446:33:0;::::2;-1:-1:-1::0;;;;;;68446:33:0;;::::2;::::0;::::2;::::0;;;:21:::2;68490:30:::0;;;:19:::2;:30;::::0;;;;:37;;-1:-1:-1;;68490:37:0::2;68446:33:::0;68490:37:::2;::::0;;3394:20;2788:1;3914:7;:22;3731:213;6681:263;7518:6;;-1:-1:-1;;;;;7518:6:0;871:10;4826:26;;:78;;-1:-1:-1;871:10:0;4869:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4869:30:0;;;;4903:1;4869:35;4826:78;:130;;;-1:-1:-1;871:10:0;4921:20;;;;:6;:20;;;;;;;;:30;-1:-1:-1;;;4921:30:0;;;;:35;4826:130;:183;;;-1:-1:-1;871:10:0;4974:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4974:30:0;;;;5008:1;4974:35;4826:183;4818:206;;;;;;-1:-1:-1;;;;;6761:19:0;::::1;871:10:::0;6761:19:::1;6753:79;;;::::0;-1:-1:-1;;;6753:79:0;;19575:2:1;6753:79:0::1;::::0;::::1;19557:21:1::0;19614:2;19594:18;;;19587:30;19653:34;19633:18;;;19626:62;19724:17;19704:18;;;19697:45;19759:19;;6753:79:0::1;19373:411:1::0;6753:79:0::1;-1:-1:-1::0;;;;;6851:16:0;::::1;;::::0;;;:11:::1;:16;::::0;;;;;::::1;;:24;;:16:::0;:24:::1;6843:66;;;::::0;-1:-1:-1;;;6843:66:0;;19991:2:1;6843:66:0::1;::::0;::::1;19973:21:1::0;20030:2;20010:18;;;20003:30;20069:31;20049:18;;;20042:59;20118:18;;6843:66:0::1;19789:353:1::0;6843:66:0::1;6920:16;6932:3;-1:-1:-1::0;;;;;7017:11:0;;;;;:6;:11;;;;;;;;7010:18;;-1:-1:-1;;7010:18:0;;;7043:11;:16;;;;;:24;;-1:-1:-1;;7043:24:0;;;6952:123;5606:268;7518:6;;-1:-1:-1;;;;;7518:6:0;871:10;4421:26;;:78;;-1:-1:-1;871:10:0;4464:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4464:30:0;;;;4498:1;4464:35;4421:78;4413:102;;;;;;5694:10:::1;:15;;5708:1;5694:15:::0;5691:124:::1;;871:10:::0;5730:20:::1;::::0;;;:6:::1;:20;::::0;;;;:30;-1:-1:-1;;;5730:30:0;::::1;;;5764:1;5730:35;5722:83;;;::::0;-1:-1:-1;;;5722:83:0;;20349:2:1;5722:83:0::1;::::0;::::1;20331:21:1::0;20388:2;20368:18;;;20361:30;20427:34;20407:18;;;20400:62;20498:5;20478:18;;;20471:33;20521:19;;5722:83:0::1;20147:399:1::0;5722:83:0::1;-1:-1:-1::0;;;;;5992:16:0;;5967:22;5992:16;;;:6;:16;;;;;;;;6023:22;;-1:-1:-1;;6060:31:0;;;;-1:-1:-1;;;6060:31:0;;;;;;;;6105:11;:21;;;:28;;-1:-1:-1;;6105:28:0;-1:-1:-1;6105:28:0;;;70028:153;;:::o;72404:620::-;7518:6;;-1:-1:-1;;;;;7518:6:0;871:10;4421:26;;:78;;-1:-1:-1;871:10:0;4464:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4464:30:0;;;;4498:1;4464:35;4421:78;4413:102;;;;;;-1:-1:-1;;;;;72551:19:0;;::::1;72528:20;72551:19:::0;;;:7:::1;:19;::::0;;;;;;;72528:42;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;72528:42:0;::::1;;::::0;;::::1;;;::::0;;;;;;;-1:-1:-1;;;72528:42:0;::::1;::::0;::::1;;;::::0;;;;-1:-1:-1;;;72528:42:0;::::1;::::0;::::1;;;::::0;;;;-1:-1:-1;;;72528:42:0;::::1;::::0;::::1;;;::::0;;;;-1:-1:-1;;;72528:42:0;::::1;::::0;::::1;;;::::0;;;;-1:-1:-1;;;72528:42:0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;72528:42:0;;::::1;;;;::::0;;;::::1;::::0;::::1;::::0;::::1;;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;;;;72636:5:::1;::::0;72606:26;::::1;50398:13;50286:2;50398;:13;:::i;:::-;50381:30;::::0;50186:15:::1;50381:30;:::i;:::-;72606:26;;;;:::i;:::-;72605:36;;;;:::i;:::-;72581:60:::0;-1:-1:-1;72652:18:0::1;72697:5;72674:19;::::0;::::1;50398:13;50286:2;50398;:13;:::i;:::-;50381:30;::::0;50186:15:::1;50381:30;:::i;:::-;72674:19;;;;:::i;:::-;72673:29;;;;:::i;:::-;72652:50;;72738:10;72721:13;:27;;72713:73;;;::::0;-1:-1:-1;;;72713:73:0;;20753:2:1;72713:73:0::1;::::0;::::1;20735:21:1::0;20792:2;20772:18;;;20765:30;20831:34;20811:18;;;20804:62;-1:-1:-1;;;20882:18:1;;;20875:31;20923:19;;72713:73:0::1;20551:397:1::0;72713:73:0::1;72853:5;72823:26;::::0;::::1;50398:13;50286:2;50398;:13;:::i;:::-;50381:30;::::0;50186:15:::1;50381:30;:::i;:::-;72823:26;;;;:::i;:::-;72822:36;;;;:::i;:::-;72799:20;::::0;::::1;:59:::0;72913:5:::1;72890:19;::::0;::::1;50398:13;50286:2;50398;:13;:::i;:::-;50381:30;::::0;50186:15:::1;50381:30;:::i;:::-;72890:19;;;;:::i;:::-;72889:29;;;;:::i;:::-;72869:17;::::0;::::1;:49:::0;;;72976:20:::1;::::0;::::1;::::0;72936:80:::1;::::0;;-1:-1:-1;;;;;21173:55:1;;21155:74;;21260:2;21245:18;;21238:34;;;;21288:18;;21281:34;;;;72936:80:0::1;::::0;21143:2:1;21128:18;72936:80:0::1;;;;;;;;72517:507;;;72404:620:::0;;;:::o;78894:137::-;7518:6;;-1:-1:-1;;;;;7518:6:0;871:10;4421:26;;:78;;-1:-1:-1;871:10:0;4464:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4464:30:0;;;;4498:1;4464:35;4421:78;4413:102;;;;;;79004:4:::1;57860:7:::0;57887:16;;;:7;:16;;;;;;78973:50:::1;::::0;79012:10:::1;78973:12;:50::i;64951:208::-:0;871:10;4569:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4569:30:0;;;;4603:1;4569:35;4561:44;;;;;;-1:-1:-1;;;;;65040:23:0;::::1;;::::0;;;:10:::1;:23;::::0;;;;;;;;:49;;-1:-1:-1;;65040:49:0::1;::::0;::::1;;::::0;;::::1;::::0;;;65107:44;;21494:74:1;;;21584:18;;;21577:50;65107:44:0::1;::::0;21467:18:1;65107:44:0::1;21326:307:1::0;7097:88:0;7142:7;7167:10;7518:6;;-1:-1:-1;;;;;7518:6:0;;7450:82;64029:148;7518:6;;-1:-1:-1;;;;;7518:6:0;871:10;4421:26;;:78;;-1:-1:-1;871:10:0;4464:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4464:30:0;;;;4498:1;4464:35;4421:78;4413:102;;;;;;-1:-1:-1;;;;;64126:25:0;::::1;;::::0;;;:8:::1;:25;::::0;;;;:43:::1;::::0;64159:9;64126:32:::1;:43::i;57919:167::-:0;57997:4;58014:42;871:10;58038:9;58049:6;58014:9;:42::i;71802:393::-;7518:6;;-1:-1:-1;;;;;7518:6:0;871:10;4421:26;;:78;;-1:-1:-1;871:10:0;4464:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4464:30:0;;;;4498:1;4464:35;4421:78;4413:102;;;;;;-1:-1:-1;;;;;71928:15:0;::::1;;::::0;;;:7:::1;:15;::::0;;;;:35:::1;;::::0;:61;::::1;;-1:-1:-1::0;;;71928:35:0;;::::1;;;:61;;::::0;71920:107:::1;;;::::0;-1:-1:-1;;;71920:107:0;;21840:2:1;71920:107:0::1;::::0;::::1;21822:21:1::0;21879:2;21859:18;;;21852:30;21918:34;21898:18;;;21891:62;-1:-1:-1;;;21969:18:1;;;21962:31;22010:19;;71920:107:0::1;21638:397:1::0;71920:107:0::1;-1:-1:-1::0;;;;;72038:15:0;::::1;;::::0;;;:7:::1;:15;::::0;;;;;;;;:37:::1;;:62:::0;;;::::1;-1:-1:-1::0;;;72038:62:0;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;72118:69;;21494:74:1;;;21584:18;;;21577:50;72118:69:0::1;::::0;21467:18:1;72118:69:0::1;21326:307:1::0;68543:168:0;3350:21;:19;:21::i;:::-;7518:6;;-1:-1:-1;;;;;7518:6:0;871:10;4421:26:::1;::::0;:78:::1;;-1:-1:-1::0;871:10:0;4464:20:::1;::::0;;;:6:::1;:20;::::0;;;;:30;-1:-1:-1;;;4464:30:0;::::1;;;4498:1;4464:35;4421:78;4413:102;;;::::0;::::1;;68625:20:::0;:31;;-1:-1:-1;;;;;68625:31:0;::::2;-1:-1:-1::0;;;;;;68625:31:0;;::::2;::::0;::::2;::::0;;;:20:::2;68667:29:::0;;;:19:::2;:29;::::0;;;;:36;;-1:-1:-1;;68667:36:0::2;68625:20;68667:36;::::0;;3394:20;2788:1;3914:7;:22;3731:213;71469:325;7518:6;;-1:-1:-1;;;;;7518:6:0;871:10;4421:26;;:78;;-1:-1:-1;871:10:0;4464:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4464:30:0;;;;4498:1;4464:35;4421:78;4413:102;;;;;;-1:-1:-1;;;;;71573:15:0;::::1;;::::0;;;:7:::1;:15;::::0;;;;:35:::1;;::::0;:50;::::1;;-1:-1:-1::0;;;71573:35:0;;::::1;;;:50;;::::0;71565:96:::1;;;::::0;-1:-1:-1;;;71565:96:0;;21840:2:1;71565:96:0::1;::::0;::::1;21822:21:1::0;21879:2;21859:18;;;21852:30;21918:34;21898:18;;;21891:62;-1:-1:-1;;;21969:18:1;;;21962:31;22010:19;;71565:96:0::1;21638:397:1::0;71565:96:0::1;-1:-1:-1::0;;;;;71672:15:0;::::1;;::::0;;;:7:::1;:15;::::0;;;;;;;;:35:::1;;:49:::0;;;::::1;-1:-1:-1::0;;;71672:49:0;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;71739:47;;21494:74:1;;;21584:18;;;21577:50;71739:47:0::1;::::0;21467:18:1;71739:47:0::1;21326:307:1::0;64412:168:0;64511:7;4437:10;7518:6;;-1:-1:-1;;;;;7518:6:0;;7450:82;4437:10;-1:-1:-1;;;;;4421:26:0;871:10;-1:-1:-1;;;;;4421:26:0;;:78;;;-1:-1:-1;871:10:0;4464:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4464:30:0;;;;4498:1;4464:35;4421:78;4413:102;;;;;;-1:-1:-1;;;;;64538:25:0;::::1;;::::0;;;:8:::1;:25;::::0;;;;:34:::1;::::0;:32:::1;:34::i;66425:743::-:0;66508:4;4437:10;7518:6;;-1:-1:-1;;;;;7518:6:0;;7450:82;4437:10;-1:-1:-1;;;;;4421:26:0;871:10;-1:-1:-1;;;;;4421:26:0;;:78;;;-1:-1:-1;871:10:0;4464:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4464:30:0;;;;4498:1;4464:35;4421:78;4413:102;;;;;;66545:21:::1;66557:9:::0;66545;:21:::1;:::i;:::-;66525:7;:41:::0;;-1:-1:-1;;;;66525:41:0;::::1;;::::0;;::::1;-1:-1:-1::0;;;66525:41:0::1;::::0;;::::1;::::0;;;-1:-1:-1;;66615:30:0;::::1;66525:41;66615:17:::0;;;;;;;;:30:::1;66612:250;;66662:7;:29:::0;;-1:-1:-1;;66662:29:0::1;;::::0;::::1;;::::0;;66718:24:::1;:22;:24::i;:::-;66706:36;;66769:25;:23;:25::i;:::-;66757:37;;66821:29;:27;:29::i;:::-;66809:41;;66612:250;66885:7;:17:::0;::::1;::::0;;;::::1;;:30;::::0;::::1;;66882:250;;66932:7;:29:::0;;-1:-1:-1;;66932:29:0::1;;::::0;::::1;::::0;::::1;;::::0;;66988:24:::1;:22;:24::i;:::-;66976:36;;67039:25;:23;:25::i;:::-;67027:37;;67091:29;:27;:29::i;:::-;67079:41;;66882:250;67151:9:::0;66425:743;-1:-1:-1;;;66425:743:0:o;69574:289::-;3350:21;:19;:21::i;:::-;7518:6;;-1:-1:-1;;;;;7518:6:0;871:10;4421:26:::1;::::0;:78:::1;;-1:-1:-1::0;871:10:0;4464:20:::1;::::0;;;:6:::1;:20;::::0;;;;:30;-1:-1:-1;;;4464:30:0;::::1;;;4498:1;4464:35;4421:78;4413:102;;;::::0;::::1;;69709:3:::2;50398:13;50286:2;50398;:13;:::i;:::-;50381:30;::::0;50186:15:::2;50381:30;:::i;:::-;69699:13;;;;:::i;:::-;53624:5;69663:31;69664:13:::0;::::2;50398;50286:2;50398;:13;:::i;:::-;50381:30;::::0;50186:15:::2;50381:30;:::i;:::-;69664:13;;;;:::i;:::-;69663:31;;;;:::i;:::-;:50;;69655:111;;;::::0;-1:-1:-1;;;69655:111:0;;22242:2:1;69655:111:0::2;::::0;::::2;22224:21:1::0;22281:2;22261:18;;;22254:30;22320:34;22300:18;;;22293:62;22391:18;22371;;;22364:46;22427:19;;69655:111:0::2;22040:412:1::0;69655:111:0::2;69777:13;:19:::0;;-1:-1:-1;;69777:19:0::2;;::::0;::::2;::::0;;::::2;::::0;;;53624:5:::2;::::0;50398:13:::2;50286:2;50398;:13;:::i;:::-;50381:30;::::0;50186:15:::2;50381:30;:::i;:::-;69825:13;;;;:::i;:::-;69824:31;;;;:::i;:::-;69807:14;:48:::0;3394:20;2788:1;3914:7;:22;3731:213;64588:169;64687:7;4437:10;7518:6;;-1:-1:-1;;;;;7518:6:0;;7450:82;4437:10;-1:-1:-1;;;;;4421:26:0;871:10;-1:-1:-1;;;;;4421:26:0;;:78;;;-1:-1:-1;871:10:0;4464:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4464:30:0;;;;4498:1;4464:35;4421:78;4413:102;;;;;;-1:-1:-1;;;;;64714:25:0;::::1;;::::0;;;:8:::1;:25;::::0;;;;:35:::1;::::0;64743:5;64714:28:::1;:35::i;73901:252::-:0;73981:7;74005:10;74001:145;;;-1:-1:-1;74038:21:0;74031:28;;74001:145;74099:35;;-1:-1:-1;;;74099:35:0;;74128:4;74099:35;;;160:74:1;-1:-1:-1;;;;;74099:20:0;;;;;133:18:1;;74099:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74092:42;;;;73365:528;7518:6;;-1:-1:-1;;;;;7518:6:0;871:10;4421:26;;:78;;-1:-1:-1;871:10:0;4464:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4464:30:0;;;;4498:1;4464:35;4421:78;4413:102;;;;;;73485:36:::1;73506:10;73518:2;73485:20;:36::i;:::-;73478:3;:43;;73470:52;;;::::0;::::1;;73533:49;::::0;-1:-1:-1;;;73533:49:0;;-1:-1:-1;;;;;22838:55:1;;;73533:49:0::1;::::0;::::1;22820:74:1::0;-1:-1:-1;;22910:18:1;;;22903:34;73533:18:0;::::1;::::0;::::1;::::0;22793::1;;73533:49:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;73597:10;73593:293;;;73624:9;73646:10;-1:-1:-1::0;;;;;73638:24:0::1;73670:3;73680:5;73638:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73623:67;;;73713:4;73705:26;;;::::0;-1:-1:-1;;;73705:26:0;;23610:2:1;73705:26:0::1;::::0;::::1;23592:21:1::0;23649:1;23629:18;;;23622:29;-1:-1:-1;;;23667:18:1;;;23660:39;23716:18;;73705:26:0::1;23408:332:1::0;73705:26:0::1;73608:135;73593:293;;;73778:55;::::0;-1:-1:-1;;;73778:55:0;;73810:4:::1;73778:55;::::0;::::1;24008:34:1::0;-1:-1:-1;;;;;24078:15:1;;;24058:18;;;24051:43;24110:18;;;24103:34;;;73765:9:0::1;::::0;73778:23;;::::1;::::0;::::1;::::0;23920:18:1;;73778:55:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73764:69;;73856:4;73848:26;;;::::0;-1:-1:-1;;;73848:26:0;;23610:2:1;73848:26:0::1;::::0;::::1;23592:21:1::0;23649:1;23629:18;;;23622:29;-1:-1:-1;;;23667:18:1;;;23660:39;23716:18;;73848:26:0::1;23408:332:1::0;73848:26:0::1;73749:137;73593:293;73365:528:::0;;;;:::o;5357:210::-;7518:6;;-1:-1:-1;;;;;7518:6:0;871:10;4421:26;;:78;;-1:-1:-1;871:10:0;4464:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4464:30:0;;;;4498:1;4464:35;4421:78;4413:102;;;;;;5442:6:::1;::::0;-1:-1:-1;;;;;5442:6:0;;::::1;5430:18:::0;;::::1;::::0;5422:65:::1;;;::::0;-1:-1:-1;;;5422:65:0;;24350:2:1;5422:65:0::1;::::0;::::1;24332:21:1::0;24389:2;24369:18;;;24362:30;24428:34;24408:18;;;24401:62;-1:-1:-1;;;24479:18:1;;;24472:32;24521:19;;5422:65:0::1;24148:398:1::0;5422:65:0::1;5520:6;::::0;5499:38:::1;::::0;-1:-1:-1;;;;;5499:38:0;;::::1;::::0;5520:6:::1;::::0;5499:38:::1;::::0;5520:6:::1;::::0;5499:38:::1;5544:6;:17:::0;;-1:-1:-1;;;;;;5544:17:0::1;-1:-1:-1::0;;;;;5544:17:0;;;::::1;::::0;;;::::1;::::0;;5357:210::o;70189:161::-;3350:21;:19;:21::i;:::-;7518:6;;-1:-1:-1;;;;;7518:6:0;871:10;4421:26:::1;::::0;:78:::1;;-1:-1:-1::0;871:10:0;4464:20:::1;::::0;;;:6:::1;:20;::::0;;;;:30;-1:-1:-1;;;4464:30:0;::::1;;;4498:1;4464:35;4421:78;4413:102;;;::::0;::::1;;-1:-1:-1::0;;;;;70298:34:0;::::2;;::::0;;;:25:::2;:34;::::0;;;;:44;;-1:-1:-1;;70298:44:0::2;::::0;::::2;;;::::0;;-1:-1:-1;3914:22:0;;70028:153;;:::o;8772:326::-;-1:-1:-1;;;;;9067:19:0;;:23;;;8772:326::o;31429:152::-;31499:4;31523:50;31528:3;-1:-1:-1;;;;;31548:23:0;;31523:4;:50::i;33433:310::-;33496:16;33525:22;33550:19;33558:3;33550:7;:19::i;58672:310::-;-1:-1:-1;;;;;58767:20:0;;58759:52;;;;-1:-1:-1;;;58759:52:0;;24753:2:1;58759:52:0;;;24735:21:1;24792:2;24772:18;;;24765:30;24831:21;24811:18;;;24804:49;24870:18;;58759:52:0;24551:343:1;58759:52:0;-1:-1:-1;;;;;58830:21:0;;58822:53;;;;-1:-1:-1;;;58822:53:0;;24753:2:1;58822:53:0;;;24735:21:1;24792:2;24772:18;;;24765:30;24831:21;24811:18;;;24804:49;24870:18;;58822:53:0;24551:343:1;58822:53:0;-1:-1:-1;;;;;58888:19:0;;;;;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;:37;;;58941:33;;3810:25:1;;;58941:33:0;;3783:18:1;58941:33:0;;;;;;;58672:310;;;:::o;60471:1189::-;-1:-1:-1;;;;;60592:23:0;;;;;;:10;:23;;;;;;;;:32;;;;60588:1065;;-1:-1:-1;;;;;60670:23:0;;60643:24;60670:23;;;:10;:23;;;;;;;;60708:29;;60733:4;-1:-1:-1;;60708:29:0;;;;;;;60754:10;:23;;;;;;:30;;;;;;;;;;;60806:25;160:74:1;;;60670:23:0;;60806:25;;133:18:1;60806:25:0;;;;;;;60848:57;60860:11;60873:14;60889:15;60848:11;:57::i;60588:1065::-;60938:9;:34;;-1:-1:-1;;;;;;60938:34:0;-1:-1:-1;;;;;60938:34:0;;;;;-1:-1:-1;61018:624:0;;;;61074:9;;;;;;;;;-1:-1:-1;;;;;61074:9:0;-1:-1:-1;;;;;61074:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61056:34;;61131:9;;;;;;;;;-1:-1:-1;;;;;61131:9:0;-1:-1:-1;;;;;61131:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61120:71;;-1:-1:-1;;;61120:71:0;;-1:-1:-1;;;;;9290:15:1;;;61120:71:0;;;9272:34:1;61185:4:0;9322:18:1;;;9315:43;61120:39:0;;;;;;;9184:18:1;;61120:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;61218:17:0;;;;;;:7;:17;;;;;;61109:82;;-1:-1:-1;61218:17:0;;:26;61210:59;;;;-1:-1:-1;;;61210:59:0;;25357:2:1;61210:59:0;;;25339:21:1;25396:2;25376:18;;;25369:30;25435:22;25415:18;;;25408:50;25475:18;;61210:59:0;25155:344:1;61210:59:0;61290:57;61302:11;61315:14;61331:15;61290:11;:57::i;:::-;61018:624;;;61410:9;;;;;;;;;-1:-1:-1;;;;;61410:9:0;-1:-1:-1;;;;;61410:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61399:71;;-1:-1:-1;;;61399:71:0;;-1:-1:-1;;;;;9290:15:1;;;61399:71:0;;;9272:34:1;61464:4:0;9322:18:1;;;9315:43;61399:39:0;;;;;;;9184:18:1;;61399:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;61497:17:0;;;;;;:7;:17;;;;;;61388:82;;-1:-1:-1;61497:17:0;;:26;61489:59;;;;-1:-1:-1;;;61489:59:0;;25357:2:1;61489:59:0;;;25339:21:1;25396:2;25376:18;;;25369:30;25435:22;25415:18;;;25408:50;25475:18;;61489:59:0;25155:344:1;61489:59:0;61569:57;61581:11;61594:14;61610:15;61569:11;:57::i;21247:240::-;21367:7;21428:12;21420:6;;;;21412:29;;;;-1:-1:-1;;;21412:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;21463:5:0;;;21247:240::o;74672:3603::-;-1:-1:-1;;;;;74761:18:0;;74753:68;;;;-1:-1:-1;;;74753:68:0;;25706:2:1;74753:68:0;;;25688:21:1;25745:2;25725:18;;;25718:30;25784:34;25764:18;;;25757:62;25855:7;25835:18;;;25828:35;25880:19;;74753:68:0;25504:401:1;74753:68:0;-1:-1:-1;;;;;74840:16:0;;74832:64;;;;-1:-1:-1;;;74832:64:0;;26112:2:1;74832:64:0;;;26094:21:1;26151:2;26131:18;;;26124:30;26190:34;26170:18;;;26163:62;26261:5;26241:18;;;26234:33;26284:19;;74832:64:0;25910:399:1;74832:64:0;74924:1;74915:6;:10;74907:64;;;;-1:-1:-1;;;74907:64:0;;26516:2:1;74907:64:0;;;26498:21:1;26555:2;26535:18;;;26528:30;26594:34;26574:18;;;26567:62;26665:11;26645:18;;;26638:39;26694:19;;74907:64:0;26314:405:1;74907:64:0;-1:-1:-1;;;;;75072:13:0;;74982:8;75072:13;;;:7;:13;;;;;;74982:8;;;;75072:13;;75068:220;;;75127:8;:15;;-1:-1:-1;;;;;;75127:15:0;-1:-1:-1;;;;;75127:15:0;;;;;-1:-1:-1;;;75068:220:0;;;-1:-1:-1;;;;;75164:11:0;;;;;;:7;:11;;;;;;;;75160:128;;;75218:8;:13;;-1:-1:-1;;;;;;75218:13:0;-1:-1:-1;;;;;75218:13:0;;;;;-1:-1:-1;;;75160:128:0;;;-1:-1:-1;75272:4:0;75160:128;75331:8;;-1:-1:-1;;;;;75331:8:0;;;75300:20;75323:17;;;:7;:17;;;;;;;;;75300:40;;;;;;;;;;;;;75331:8;75300:40;;;;;;;;;;;;;-1:-1:-1;;;75300:40:0;;;;;;;;;;;;;;;-1:-1:-1;;;75300:40:0;;;;;;;;;;-1:-1:-1;;;75300:40:0;;;;;;;;;;-1:-1:-1;;;75300:40:0;;;;;;;;;;-1:-1:-1;;;75300:40:0;;;;;;;;;;-1:-1:-1;;;75300:40:0;;;;;;;;;-1:-1:-1;;;75300:40:0;;;;;75331:8;75300:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;75356:20;75367:4;75373:2;75356:10;:20::i;:::-;75353:840;;;75401:14;;;;;;;75393:47;;;;-1:-1:-1;;;75393:47:0;;26926:2:1;75393:47:0;;;26908:21:1;26965:2;26945:18;;;26938:30;27004:22;26984:18;;;26977:50;27044:18;;75393:47:0;26724:344:1;75393:47:0;75458:3;:11;;;;75465:4;75458:11;75455:227;;;75509:12;;-1:-1:-1;;;;;75498:24:0;;;;;:10;:24;;;;;:40;;;75490:89;;;;-1:-1:-1;;;75490:89:0;;27275:2:1;75490:89:0;;;27257:21:1;27314:2;27294:18;;;27287:30;27353:34;27333:18;;;27326:62;27424:6;27404:18;;;27397:34;27448:19;;75490:89:0;27073:400:1;75490:89:0;75606:6;:21;;;75598:68;;;;-1:-1:-1;;;75598:68:0;;27680:2:1;75598:68:0;;;27662:21:1;27719:2;27699:18;;;27692:30;27758:34;27738:18;;;27731:62;-1:-1:-1;;;27809:18:1;;;27802:32;27851:19;;75598:68:0;27478:398:1;75598:68:0;75701:3;:11;;;;75708:4;75701:11;75698:232;;;-1:-1:-1;;;;;75738:27:0;;;;;;:21;:27;;;;;;;;75737:28;:58;;;;-1:-1:-1;;;;;;75770:25:0;;;;;;:21;:25;;;;;;;;75769:26;75737:58;75733:182;;;75838:12;;75828:6;:22;;75820:75;;;;-1:-1:-1;;;75820:75:0;;28083:2:1;75820:75:0;;;28065:21:1;28122:2;28102:18;;;28095:30;28161:34;28141:18;;;28134:62;28232:10;28212:18;;;28205:38;28260:19;;75820:75:0;27881:404:1;75820:75:0;75955:12;;-1:-1:-1;;;;;75949:18:0;;;;;;;;;:27;;;75972:4;75971:5;75949:27;75946:236;;;-1:-1:-1;;;;;76002:25:0;;;;;;:21;:25;;;;;;;;75997:170;;76086:14;;76076:6;76060:13;76070:2;-1:-1:-1;;;;;57887:16:0;57860:7;57887:16;;;:7;:16;;;;;;;57794:117;76060:13;:22;;;;:::i;:::-;:40;;76052:95;;;;-1:-1:-1;;;76052:95:0;;28622:2:1;76052:95:0;;;28604:21:1;28661:2;28641:18;;;28634:30;28700:34;28680:18;;;28673:62;28771:12;28751:18;;;28744:40;28801:19;;76052:95:0;28420:406:1;76052:95:0;76208:4;76205:718;;;76234:6;;;;76229:683;;76265:6;:26;;;76261:636;;;76365:4;76316:28;57887:16;;;:7;:16;;;;;;76422:20;;;;76398:44;;76394:484;;76489:17;;;;76536:28;;;;76533:104;;;76601:16;;;;76589:8;;-1:-1:-1;;;;;76589:8:0;57860:7;57887:16;;;:7;:16;;;;;;53624:5;;76579:38;;;;;;;:::i;:::-;76578:56;;;;:::i;:::-;76568:66;;76533:104;76690:7;76666:20;:31;76663:71;;76724:7;76701:30;;76663:71;76795:8;;76760:44;;76773:20;;-1:-1:-1;;;;;76795:8:0;76760:12;:44::i;:::-;76444:434;76394:484;76293:604;76261:636;77004:6;:15;;;77000:304;;77065:8;;77036:38;;77055:4;;77061:2;;-1:-1:-1;;;;;77065:8:0;77036:18;:38::i;:::-;77093:6;:15;;;77092:16;:40;;;;;77112:20;77123:4;77129:2;77112:10;:20::i;:::-;77092:76;;;;-1:-1:-1;;;;;;77137:31:0;;;;;;:25;:31;;;;;;;;77136:32;77092:76;:110;;;;-1:-1:-1;;;;;;77173:29:0;;;;;;:25;:29;;;;;;;;77172:30;77092:110;:120;;;;;77207:5;77206:6;77092:120;77089:204;;;77233:44;;-1:-1:-1;;;77233:44:0;;29033:2:1;77233:44:0;;;29015:21:1;29072:2;29052:18;;;29045:30;29111:34;29091:18;;;29084:62;29182:4;29162:18;;;29155:32;29204:19;;77233:44:0;28831:398:1;77089:204:0;-1:-1:-1;;;;;77351:25:0;;77314:23;77351:25;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;77380:23:0;;;;;;:19;:23;;;;;;;;77351:52;77348:747;;;-1:-1:-1;77438:6:0;77348:747;;;77480:3;77477:228;;;77520:10;77504:26;:13;:26;;;;;;-1:-1:-1;;77504:26:0;;;;;;;;;;;;;;;-1:-1:-1;;;;77504:26:0;-1:-1:-1;;;77504:26:0;;;;;;;;;;;;;;;;;77477:228;;;77555:4;77552:153;;;77596:11;77580:27;:13;:27;;;;;;-1:-1:-1;;77580:27:0;;;;;;;;;;;;;;;-1:-1:-1;;;;77580:27:0;-1:-1:-1;;;77580:27:0;;;;;;;;;;;;;;;;;77552:153;;;77632:5;77629:76;;;77674:15;77658:31;:13;:31;;;;;;-1:-1:-1;;77658:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;77658:31:0;-1:-1:-1;;;77658:31:0;;;;;;;;;;;;;;;;;77629:76;77782:13;:23;77721:18;;77742:87;;53004:5;;77742:65;;77753:53;;77782:23;;;;;;;77754;77753:53;:::i;:::-;77742:65;;:6;:10;;:65;;;;:::i;:::-;:69;;:87::i;:::-;77721:108;-1:-1:-1;77862:22:0;:6;77721:108;77862:10;:22::i;:::-;-1:-1:-1;;;;;77915:13:0;;;;;;:7;:13;;;;;;77844:40;;-1:-1:-1;77915:29:0;;77933:10;77915:17;:29::i;:::-;-1:-1:-1;;;;;77899:13:0;;;;;;:7;:13;;;;;;:45;;;;78000:4;77984:22;;;;:38;;78011:10;77984:26;:38::i;:::-;77975:4;77959:22;;;;:7;:22;;;;;;;:63;;;;78042:41;;-1:-1:-1;;;;;78042:41:0;;;;;;;78072:10;3810:25:1;;3798:2;3783:18;;3664:177;78042:41:0;;;;;;;;77462:633;77348:747;-1:-1:-1;;;;;78123:13:0;;;;;;:7;:13;;;;;;:34;;78141:15;78123:17;:34::i;:::-;-1:-1:-1;;;;;78107:13:0;;;;;;;:7;:13;;;;;;:50;;;;78182:11;;;;;;;:32;;78198:15;78182;:32::i;:::-;-1:-1:-1;;;;;78168:11:0;;;;;;;:7;:11;;;;;;;:46;;;;78232:35;;;;;;;;;;78251:15;3810:25:1;;3798:2;3783:18;;3664:177;78232:35:0;;;;;;;;74742:3533;;;;;74672:3603;;;:::o;3430:293::-;2832:1;3564:7;;:19;3556:63;;;;-1:-1:-1;;;3556:63:0;;29613:2:1;3556:63:0;;;29595:21:1;29652:2;29632:18;;;29625:30;29691:33;29671:18;;;29664:61;29742:18;;3556:63:0;29411:355:1;3556:63:0;2832:1;3697:7;:18;3430:293::o;67176:360::-;67314:7;:17;67278:6;:13;67227:4;;67314:17;-1:-1:-1;;;67314:17:0;;;;;67278:33;;67294:17;;;;;67278:13;;:33;:::i;:::-;:53;;;;:::i;:::-;67255:10;:76;;-1:-1:-1;;67255:76:0;;;;;;;;67401:7;:17;67365:6;:13;-1:-1:-1;;;67401:17:0;;;;;67365:33;;67381:17;;;;;67365:13;;:33;:::i;:::-;:53;;;;:::i;:::-;67342:10;:76;;-1:-1:-1;;67342:76:0;;;;;;;;;;;;;;;;67452:43;;67475:20;;;;;67452;;;;;;:43;:::i;:::-;67429:10;:66;;;;;;;-1:-1:-1;;;67429:66:0;-1:-1:-1;;;;67429:66:0;;;;;;;;;-1:-1:-1;;;67176:360:0:o;67544:368::-;67685:7;:17;67648:6;:14;67596:4;;67685:17;-1:-1:-1;;;67685:17:0;;;;;67648:34;;67665:17;;;;;67648:14;;;;;;:34;:::i;:::-;:54;;;;:::i;:::-;67624:11;:78;;-1:-1:-1;;67624:78:0;;;;;;;;67774:7;:17;67737:6;:14;-1:-1:-1;;;67774:17:0;;;;;67737:34;;67754:17;;;;;67737:14;;;;;:34;:::i;:::-;:54;;;;:::i;:::-;67713:11;:78;;-1:-1:-1;;67713:78:0;;;;;;;;;;;;;;;;67826:45;;67850:21;;;;;67826;;;;;;:45;:::i;:::-;67802:11;:69;;;;;;;-1:-1:-1;;;67802:69:0;-1:-1:-1;;;;67802:69:0;;;;;;;;;-1:-1:-1;;;67544:368:0:o;67920:400::-;68073:7;:17;68032:6;:18;67976:4;;68073:17;-1:-1:-1;;;68073:17:0;;;;;68032:38;;68053:17;;;;;68032:18;;;;;;:38;:::i;:::-;:58;;;;:::i;:::-;68004:15;:86;;-1:-1:-1;;68004:86:0;;;;;;;;68170:7;:17;68129:6;:18;-1:-1:-1;;;68170:17:0;;;;;68129:38;;68150:17;;;;;;;;;68129:18;;;:38;:::i;:::-;:58;;;;:::i;:::-;68101:15;:86;;-1:-1:-1;;68101:86:0;;;;;;;;;;;;;;;;68226:53;;68254:25;;;;;68226;;;;;;:53;:::i;:::-;68198:15;:81;;;;;;;-1:-1:-1;;;68198:81:0;-1:-1:-1;;;;68198:81:0;;;;;;;;;-1:-1:-1;;;67920:400:0:o;79039:3123::-;54173:6;:13;;-1:-1:-1;;54173:13:0;54182:4;54173:13;;;;;;-1:-1:-1;;;;;79166:19:0;;::::1;54173:6:::0;79166:19;;;:7:::1;:19;::::0;;;;;;;79143:42;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;-1:-1:-1;;;79143:42:0;::::1;54173:13:::0;79143:42;;::::1;;;::::0;;;;-1:-1:-1;;;79143:42:0;::::1;::::0;::::1;;;::::0;;;;;;;;-1:-1:-1;;;79143:42:0;::::1;::::0;::::1;;;::::0;;;;-1:-1:-1;;;79143:42:0;::::1;::::0;::::1;;;::::0;;;;-1:-1:-1;;;79143:42:0;::::1;::::0;::::1;;;::::0;;;;-1:-1:-1;;;79143:42:0;::::1;::::0;;::::1;::::0;;;;::::1;-1:-1:-1::0;;;79143:42:0;;::::1;::::0;::::1;54173:13:::0;79143:42;;;::::1;::::0;::::1;::::0;::::1;;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;;;79196:9:::1;:35:::0;;-1:-1:-1;;;;;;79196:35:0::1;::::0;;::::1;::::0;;;79244:36;;;;::::1;::::0;;79267:13:::1;79244:36:::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;79244:36:0;;::::1;::::0;;::::1;::::0;;;;;;;79295:21;;79291:60:::1;;79333:7;;;;79291:60;79386:4;79366:26;::::0;;;:11:::1;:26;::::0;;;;;;;79401:9:::1;::::0;-1:-1:-1;;;;;79401:9:0::1;79366:46:::0;;;;;;;;-1:-1:-1;;79366:67:0::1;79363:165;;79470:4;79450:26;::::0;;;:11:::1;:26;::::0;;;;;;;79485:9:::1;::::0;-1:-1:-1;;;;;79485:9:0::1;79450:46:::0;;;;;;;-1:-1:-1;;79450:66:0;;79363:165:::1;79540:17;79625:1;79605:6;:16;;;79561:60;;79585:6;:16;;;79562:39;;:20;:39;;;;:::i;:::-;79561:60;;;;:::i;:::-;79560:66;;;;:::i;:::-;79540:86:::0;-1:-1:-1;79637:15:0::1;79655:32;79540:86:::0;79655:20;:32:::1;:::i;:::-;79732:16;::::0;;79746:1:::1;79732:16:::0;;;;;::::1;::::0;;79637:50;;-1:-1:-1;79708:21:0::1;::::0;79732:16;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;79732:16:0::1;79708:40;;79777:4;79759;79764:1;79759:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1::0;;;;;79759:23:0::1;;;-1:-1:-1::0;;;;;79759:23:0::1;;;::::0;::::1;79803:6;:19;;;79793:4;79798:1;79793:7;;;;;;;;:::i;:::-;;;;;;:29;-1:-1:-1::0;;;;;79793:29:0::1;;;-1:-1:-1::0;;;;;79793:29:0::1;;;::::0;::::1;79835:15;79853:27;79869:10;79853:15;:27::i;:::-;79835:45;;79908:9;;;;;;;;;-1:-1:-1::0;;;;;79908:9:0::1;-1:-1:-1::0;;;;;79908:14:0::1;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;79897:27:0::1;:4;79902:1;79897:7;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;79897:27:0::1;::::0;79893:513:::1;;79940:9;::::0;:210:::1;::::0;;;;-1:-1:-1;;;;;79940:9:0;;::::1;::::0;:60:::1;::::0;:210:::1;::::0;80019:7;;79940:9:::1;::::0;80065:4;;80096::::1;::::0;80120:15:::1;::::0;79940:210:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;79893:513;;;80181:9;::::0;:213:::1;::::0;;;;-1:-1:-1;;;;;80181:9:0;;::::1;::::0;:63:::1;::::0;:213:::1;::::0;80263:7;;80181:9:::1;::::0;80309:4;;80340::::1;::::0;80364:15:::1;::::0;80181:213:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;79893:513;80418:18;80469:7;80439:27;80455:10;80439:15;:27::i;:::-;:37;;;;:::i;:::-;80418:58:::0;-1:-1:-1;80487:24:0::1;80541:7:::0;80515:22:::1;80528:9:::0;80418:58;80515:22:::1;:::i;:::-;80514:34;;;;:::i;:::-;80487:61;;80588:9;;;;;;;;;-1:-1:-1::0;;;;;80588:9:0::1;-1:-1:-1::0;;;;;80588:14:0::1;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;80565:39:0::1;:6;:19;;;-1:-1:-1::0;;;;;80565:39:0::1;::::0;80561:922:::1;;80624:13:::0;;80620:384:::1;;80658:9;::::0;80847:20;;80658:266:::1;::::0;;;;80739:4:::1;80658:266;::::0;::::1;31328:34:1::0;31378:18;;;31371:34;;;80658:9:0::1;31421:18:1::0;;;31414:34;;;31464:18;;;31457:34;-1:-1:-1;;;;;80847:20:0;;::::1;31507:19:1::0;;;31500:44;80890:15:0::1;31560:19:1::0;;;31553:35;80658:9:0;::::1;::::0;:25:::1;::::0;80691:16;;31239:19:1;;80658:266:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;80948:40:0::1;::::0;;32084:25:1;;;32140:2;32125:18;;32118:34;;;80948:40:0::1;::::0;-1:-1:-1;32057:18:1;80948:40:0::1;;;;;;;80620:384;80561:922;;;81039:13:::0;;81035:437:::1;;81073:9;::::0;81154:19:::1;::::0;::::1;::::0;81315:20;;81073:319:::1;::::0;;;;81126:4:::1;81073:319;::::0;::::1;32583:34:1::0;-1:-1:-1;;;;;32653:15:1;;;32633:18;;;32626:43;32685:18;;;32678:34;;;32728:18;;;32721:34;;;81073:9:0::1;32771:19:1::0;;;32764:35;;;32815:19;;;32808:35;81315:20:0;;::::1;32859:19:1::0;;;32852:44;81358:15:0::1;32912:19:1::0;;;32905:35;81073:9:0;::::1;::::0;:22:::1;::::0;32494:19:1;;81073:319:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;81416:40:0::1;::::0;;32084:25:1;;;32140:2;32125:18;;32118:34;;;81416:40:0::1;::::0;-1:-1:-1;32057:18:1;81416:40:0::1;;;;;;;81035:437;81495:30;81509:16:::0;81495:30;::::1;:::i;:::-;81616:19;::::0;::::1;::::0;81645:11:::1;:21:::0;81609:77:::1;::::0;-1:-1:-1;;;81609:77:0;;-1:-1:-1;;;;;81645:21:0;;::::1;81609:77;::::0;::::1;22820:74:1::0;-1:-1:-1;;22910:18:1;;;22903:34;81495:30:0;;-1:-1:-1;81536:12:0::1;::::0;81495:30;;81609:35;;;::::1;::::0;::::1;::::0;22793:18:1;;81609:77:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;81724:9;;;;;;;;;-1:-1:-1::0;;;;;81724:9:0::1;-1:-1:-1::0;;;;;81724:14:0::1;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;81701:39:0::1;:6;:19;;;-1:-1:-1::0;;;;;81701:39:0::1;::::0;81697:458:::1;;81760:16;::::0;::::1;::::0;:20:::1;;::::0;81756:198:::1;;81822:11;:21:::0;81814:76:::1;::::0;-1:-1:-1;;;;;81822:21:0;;::::1;::::0;81880:5:::1;::::0;81857:16;;81814:76:::1;::::0;;;81857:16;81822:21;81880:5;81814:76:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81801:89;;;;;81917:7;81909:29;;;::::0;-1:-1:-1;;;81909:29:0;;23610:2:1;81909:29:0::1;::::0;::::1;23592:21:1::0;23649:1;23629:18;;;23622:29;-1:-1:-1;;;23667:18:1;;;23660:39;23716:18;;81909:29:0::1;23408:332:1::0;81909:29:0::1;81697:458;;;81989:16;::::0;::::1;::::0;:20:::1;;::::0;81985:157:::1;;82037:19;::::0;::::1;::::0;82086:11:::1;:21:::0;82030:96:::1;::::0;-1:-1:-1;;;82030:96:0;;82079:4:::1;82030:96;::::0;::::1;24008:34:1::0;-1:-1:-1;;;;;82086:21:0;;::::1;24058:18:1::0;;;24051:43;24110:18;;;24103:34;;;82030:40:0;::::1;::::0;::::1;::::0;23920:18:1;;82030:96:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;81985:157;79132:3030;;;;;;;;;;54197:1;-1:-1:-1::0;;54209:6:0;:14;;-1:-1:-1;;54209:14:0;;;79039:3123::o;31757:158::-;31830:4;31854:53;31862:3;-1:-1:-1;;;;;31882:23:0;;31854:7;:53::i;32254:117::-;32317:7;32344:19;32352:3;27738:18;;27655:109;32725:158;32799:7;32850:22;32854:3;32866:5;32850:3;:22::i;25344:414::-;25407:4;27537:19;;;:12;;;:19;;;;;;25424:327;;-1:-1:-1;25467:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;25650:18;;25628:19;;;:12;;;:19;;;;;;:40;;;;25683:11;;25424:327;-1:-1:-1;25734:5:0;25727:12;;28788:111;28844:16;28880:3;:11;;28873:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28788:111;;;:::o;61668:2213::-;61776:9;:34;;-1:-1:-1;;;;;;61776:34:0;-1:-1:-1;;;;;61776:34:0;;;;;-1:-1:-1;;61877:744:0;;;;61929:9;;;;;;;;;-1:-1:-1;;;;;61929:9:0;-1:-1:-1;;;;;61929:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61911:34;;61982:9;;;;;;;;;-1:-1:-1;;;;;61982:9:0;-1:-1:-1;;;;;61982:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61971:71;;-1:-1:-1;;;61971:71:0;;-1:-1:-1;;;;;9290:15:1;;;61971:71:0;;;9272:34:1;62036:4:0;9322:18:1;;;9315:43;61971:39:0;;;;;;;9184:18:1;;61971:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61960:82;-1:-1:-1;;;;;;62061:19:0;;9067;:23;62057:206;;62113:8;62102:19;;61877:744;;62057:206;62184:9;;;;;;;;;-1:-1:-1;;;;;62184:9:0;-1:-1:-1;;;;;62184:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62173:74;;-1:-1:-1;;;62173:74:0;;-1:-1:-1;;;;;9290:15:1;;;62173:74:0;;;9272:34:1;62241:4:0;9322:18:1;;;9315:43;62173:42:0;;;;;;;9184:18:1;;62173:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62162:85;;61877:744;;;62317:9;;;;;;;;;-1:-1:-1;;;;;62317:9:0;-1:-1:-1;;;;;62317:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62306:71;;-1:-1:-1;;;62306:71:0;;-1:-1:-1;;;;;9290:15:1;;;62306:71:0;;;9272:34:1;62371:4:0;9322:18:1;;;9315:43;62306:39:0;;;;;;;9184:18:1;;62306:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62295:82;-1:-1:-1;;;;;;62396:19:0;;9067;:23;62392:206;;62448:8;62437:19;;62392:206;;;62519:9;;;;;;;;;-1:-1:-1;;;;;62519:9:0;-1:-1:-1;;;;;62519:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62508:74;;-1:-1:-1;;;62508:74:0;;-1:-1:-1;;;;;9290:15:1;;;62508:74:0;;;9272:34:1;62576:4:0;9322:18:1;;;9315:43;62508:42:0;;;;;;;9184:18:1;;62508:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62497:85;;62392:206;-1:-1:-1;;;;;62657:17:0;;;62633:21;62657:17;;;:7;:17;;;;;;;;62685:26;;;;;-1:-1:-1;;;;;;62685:26:0;;;;;;;62722:19;;;:37;;63001:30;;62722:37;;;63001:30;;;;;;;63042:25;;;:29;;-1:-1:-1;;63042:29:0;;;63082:20;;;:24;;;63117:17;;;:21;;;63151:7;:17;;;;;;:24;;-1:-1:-1;;63151:24:0;;;;;;;63188:33;62700:11;62665:8;63188:10;:33::i;:::-;63232:35;63251:4;63258:8;63232:10;:35::i;:::-;-1:-1:-1;;;;;63280:32:0;;;;;;:19;:32;;;;;;;;:39;;63315:4;-1:-1:-1;;63280:39:0;;;;;;;;63330:21;:34;;;;;:41;;;;;;;;63382:25;:38;;;;;:45;;;;;;;;63438:17;:30;;;;;:37;;;;;;;;;;63488:54;871:10;63511:11;-1:-1:-1;;63488:8:0;:54::i;:::-;63562:6;;63553:48;;-1:-1:-1;;;;;63562:6:0;63570:11;-1:-1:-1;;63553:8:0;:48::i;:::-;63612:55;63629:4;63636:11;-1:-1:-1;;63612:8:0;:55::i;:::-;63680:56;;-1:-1:-1;;;63680:56:0;;-1:-1:-1;;;;;22838:55:1;;;63680:56:0;;;22820:74:1;-1:-1:-1;;22910:18:1;;;22903:34;63680:24:0;;;;;22793:18:1;;63680:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;63767:4:0;63747:26;;;;:11;:26;;;;;;;;-1:-1:-1;;;;;63747:39:0;;;;;;;;;;;;;-1:-1:-1;;63747:59:0;;63824:49;;33214:34:1;;;33284:15;;;33264:18;;;33257:43;;;;33336:15;;;33316:18;;;33309:43;;;;63824:49:0;;33141:2:1;33126:18;63824:49:0;32951:407:1;70781:530:0;70882:6;;70850:4;;-1:-1:-1;;;;;70874:14:0;;;70882:6;;70874:14;;;;:43;;-1:-1:-1;70911:6:0;;-1:-1:-1;;;;;70905:12:0;;;70911:6;;70905:12;;70874:43;:79;;;;-1:-1:-1;70947:6:0;;-1:-1:-1;;;;;70947:6:0;70934:9;:19;;70874:79;:118;;;;-1:-1:-1;;;;;;70971:21:0;;;;;;:17;:21;;;;;;;;70970:22;70874:118;:159;;;;-1:-1:-1;;;;;;71010:23:0;;;;;;:17;:23;;;;;;;;71009:24;70874:159;:186;;;;-1:-1:-1;;;;;;71050:10:0;;53516:42;71050:10;;70874:186;:219;;;;-1:-1:-1;;;;;;71077:16:0;;;;70874:219;:257;;;;-1:-1:-1;;;;;;71110:21:0;;71126:4;71110:21;;70874:257;:301;;;;-1:-1:-1;;;;;;71148:12:0;;;;;;:6;:12;;;;;:22;-1:-1:-1;;;71148:22:0;;;;71174:1;71148:27;;70874:301;:343;;;;-1:-1:-1;;;;;;71192:10:0;;;;;;:6;:10;;;;;:20;-1:-1:-1;;;71192:20:0;;;;71216:1;71192:25;;70874:343;:387;;;;-1:-1:-1;;;;;;71234:12:0;;;;;;:6;:12;;;;;;;;:22;-1:-1:-1;;;71234:22:0;;;;:27;;70874:387;:429;;;;-1:-1:-1;;;;;;;71278:10:0;;;;;:6;:10;;;;;;;;:20;-1:-1:-1;;;71278:20:0;;;;:25;;;70781:530;-1:-1:-1;70781:530:0:o;78283:516::-;-1:-1:-1;;;;;78385:19:0;;;;;;:7;:19;;;;;:28;;;-1:-1:-1;;;78385:28:0;;;;:37;78377:85;;;;-1:-1:-1;;;78377:85:0;;33565:2:1;78377:85:0;;;33547:21:1;33604:2;33584:18;;;33577:30;33643:34;33623:18;;;33616:62;33714:5;33694:18;;;33687:33;33737:19;;78377:85:0;33363:399:1;78377:85:0;78478:20;78489:4;78495:2;78478:10;:20::i;:::-;78477:21;:41;;;;;78508:10;-1:-1:-1;;;;;78502:16:0;:2;-1:-1:-1;;;;;78502:16:0;;78477:41;78473:319;;;-1:-1:-1;;;;;78535:23:0;;;;;;;:17;:23;;;;;;;;:30;;-1:-1:-1;;78535:30:0;78561:4;78535:30;;;;;;78580:16;:23;;-1:-1:-1;;78580:23:0;;;;;78618:19;;;;;;:7;:19;;;;;;:28;;:35;;78670:46;;;;;;;;78736:44;;21494:74:1;;;21584:18;;;21577:50;;;;78736:44:0;;21467:18:1;78736:44:0;21326:307:1;19706:98:0;19764:7;19791:5;19795:1;19791;:5;:::i;20105:98::-;20163:7;20190:5;20194:1;20190;:5;:::i;19349:98::-;19407:7;19434:5;19438:1;19434;:5;:::i;18968:98::-;19026:7;19053:5;19057:1;19053;:5;:::i;82236:315::-;-1:-1:-1;;;;;82362:13:0;;;82298:7;82362:13;;;:7;:13;;;;;;;;:19;82352:37;;;;;;;82298:7;;82362:19;;82352:35;;:37;;;;;82362:13;;82352:37;;;;;;82362:19;82352:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;82322:13:0;;;;;;;:7;:13;;;;;:26;;;:67;;;:26;;:67;82318:226;;-1:-1:-1;82412:21:0;;82236:315;-1:-1:-1;82236:315:0:o;82318:226::-;-1:-1:-1;;;;;82480:13:0;;;;;;;:7;:13;;;;;;;:26;;;82473:59;;-1:-1:-1;;;82473:59:0;;82526:4;82473:59;;;160:74:1;82480:26:0;;;82473:44;;133:18:1;;82473:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;25934:1420::-;26000:4;26139:19;;;:12;;;:19;;;;;;26175:15;;26171:1176;;26550:21;26574:14;26587:1;26574:10;:14;:::i;:::-;26623:18;;26550:38;;-1:-1:-1;26603:17:0;;26623:22;;26644:1;;26623:22;:::i;:::-;26603:42;;26679:13;26666:9;:26;26662:405;;26713:17;26733:3;:11;;26745:9;26733:22;;;;;;;;:::i;:::-;;;;;;;;;26713:42;;26887:9;26858:3;:11;;26870:13;26858:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;26972:23;;;:12;;;:23;;;;;:36;;;26662:405;27148:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;27243:3;:12;;:19;27256:5;27243:19;;;;;;;;;;;27236:26;;;27286:4;27279:11;;;;;;;26171:1176;27330:5;27323:12;;;;;26171:1176;26006:1348;25934:1420;;;;:::o;28118:120::-;28185:7;28212:3;:11;;28224:5;28212:18;;;;;;;;:::i;:::-;;;;;;;;;28205:25;;28118:120;;;;:::o;63889:132::-;-1:-1:-1;;;;;63973:25:0;;;;;;:8;:25;;;;;:40;;64003:9;63973:29;:40::i;245:154:1:-;-1:-1:-1;;;;;324:5:1;320:54;313:5;310:65;300:93;;389:1;386;379:12;404:247;463:6;516:2;504:9;495:7;491:23;487:32;484:52;;;532:1;529;522:12;484:52;571:9;558:23;590:31;615:5;590:31;:::i;656:484::-;709:3;747:5;741:12;774:6;769:3;762:19;800:4;829:2;824:3;820:12;813:19;;866:2;859:5;855:14;887:1;897:218;911:6;908:1;905:13;897:218;;;976:13;;-1:-1:-1;;;;;972:62:1;960:75;;1055:12;;;;1090:15;;;;933:1;926:9;897:218;;;-1:-1:-1;1131:3:1;;656:484;-1:-1:-1;;;;;656:484:1:o;1145:261::-;1324:2;1313:9;1306:21;1287:4;1344:56;1396:2;1385:9;1381:18;1373:6;1344:56;:::i;1411:548::-;1523:4;1552:2;1581;1570:9;1563:21;1613:6;1607:13;1656:6;1651:2;1640:9;1636:18;1629:34;1681:1;1691:140;1705:6;1702:1;1699:13;1691:140;;;1800:14;;;1796:23;;1790:30;1766:17;;;1785:2;1762:26;1755:66;1720:10;;1691:140;;;1695:3;1880:1;1875:2;1866:6;1855:9;1851:22;1847:31;1840:42;1950:2;1943;1939:7;1934:2;1926:6;1922:15;1918:29;1907:9;1903:45;1899:54;1891:62;;;;1411:548;;;;:::o;2686:315::-;2754:6;2762;2815:2;2803:9;2794:7;2790:23;2786:32;2783:52;;;2831:1;2828;2821:12;2783:52;2870:9;2857:23;2889:31;2914:5;2889:31;:::i;:::-;2939:5;2991:2;2976:18;;;;2963:32;;-1:-1:-1;;;2686:315:1:o;3846:118::-;3932:5;3925:13;3918:21;3911:5;3908:32;3898:60;;3954:1;3951;3944:12;3969:523;4043:6;4051;4059;4112:2;4100:9;4091:7;4087:23;4083:32;4080:52;;;4128:1;4125;4118:12;4080:52;4167:9;4154:23;4186:31;4211:5;4186:31;:::i;:::-;4236:5;-1:-1:-1;4293:2:1;4278:18;;4265:32;4306:30;4265:32;4306:30;:::i;:::-;4355:7;-1:-1:-1;4414:2:1;4399:18;;4386:32;4427:33;4386:32;4427:33;:::i;:::-;4479:7;4469:17;;;3969:523;;;;;:::o;4497:456::-;4574:6;4582;4590;4643:2;4631:9;4622:7;4618:23;4614:32;4611:52;;;4659:1;4656;4649:12;4611:52;4698:9;4685:23;4717:31;4742:5;4717:31;:::i;:::-;4767:5;-1:-1:-1;4824:2:1;4809:18;;4796:32;4837:33;4796:32;4837:33;:::i;:::-;4497:456;;4889:7;;-1:-1:-1;;;4943:2:1;4928:18;;;;4915:32;;4497:456::o;4958:184::-;-1:-1:-1;;;5007:1:1;5000:88;5107:4;5104:1;5097:15;5131:4;5128:1;5121:15;5147:275;5218:2;5212:9;5283:2;5264:13;;-1:-1:-1;;5260:27:1;5248:40;;5318:18;5303:34;;5339:22;;;5300:62;5297:88;;;5365:18;;:::i;:::-;5401:2;5394:22;5147:275;;-1:-1:-1;5147:275:1:o;5427:183::-;5487:4;5520:18;5512:6;5509:30;5506:56;;;5542:18;;:::i;:::-;-1:-1:-1;5587:1:1;5583:14;5599:4;5579:25;;5427:183::o;5615:662::-;5669:5;5722:3;5715:4;5707:6;5703:17;5699:27;5689:55;;5740:1;5737;5730:12;5689:55;5776:6;5763:20;5802:4;5826:60;5842:43;5882:2;5842:43;:::i;:::-;5826:60;:::i;:::-;5920:15;;;6006:1;6002:10;;;;5990:23;;5986:32;;;5951:12;;;;6030:15;;;6027:35;;;6058:1;6055;6048:12;6027:35;6094:2;6086:6;6082:15;6106:142;6122:6;6117:3;6114:15;6106:142;;;6188:17;;6176:30;;6226:12;;;;6139;;6106:142;;;-1:-1:-1;6266:5:1;5615:662;-1:-1:-1;;;;;;5615:662:1:o;6282:1215::-;6400:6;6408;6461:2;6449:9;6440:7;6436:23;6432:32;6429:52;;;6477:1;6474;6467:12;6429:52;6517:9;6504:23;6546:18;6587:2;6579:6;6576:14;6573:34;;;6603:1;6600;6593:12;6573:34;6641:6;6630:9;6626:22;6616:32;;6686:7;6679:4;6675:2;6671:13;6667:27;6657:55;;6708:1;6705;6698:12;6657:55;6744:2;6731:16;6766:4;6790:60;6806:43;6846:2;6806:43;:::i;6790:60::-;6884:15;;;6966:1;6962:10;;;;6954:19;;6950:28;;;6915:12;;;;6990:19;;;6987:39;;;7022:1;7019;7012:12;6987:39;7046:11;;;;7066:217;7082:6;7077:3;7074:15;7066:217;;;7162:3;7149:17;7179:31;7204:5;7179:31;:::i;:::-;7223:18;;7099:12;;;;7261;;;;7066:217;;;7302:5;-1:-1:-1;;7345:18:1;;7332:32;;-1:-1:-1;;7376:16:1;;;7373:36;;;7405:1;7402;7395:12;7373:36;;7428:63;7483:7;7472:8;7461:9;7457:24;7428:63;:::i;:::-;7418:73;;;6282:1215;;;;;:::o;7695:159::-;7762:20;;7822:6;7811:18;;7801:29;;7791:57;;7844:1;7841;7834:12;7859:184;7917:6;7970:2;7958:9;7949:7;7945:23;7941:32;7938:52;;;7986:1;7983;7976:12;7938:52;8009:28;8027:9;8009:28;:::i;8048:382::-;8113:6;8121;8174:2;8162:9;8153:7;8149:23;8145:32;8142:52;;;8190:1;8187;8180:12;8142:52;8229:9;8216:23;8248:31;8273:5;8248:31;:::i;:::-;8298:5;-1:-1:-1;8355:2:1;8340:18;;8327:32;8368:30;8327:32;8368:30;:::i;:::-;8417:7;8407:17;;;8048:382;;;;;:::o;8704:328::-;8778:6;8786;8794;8847:2;8835:9;8826:7;8822:23;8818:32;8815:52;;;8863:1;8860;8853:12;8815:52;8886:28;8904:9;8886:28;:::i;:::-;8876:38;;8933:37;8966:2;8955:9;8951:18;8933:37;:::i;:::-;8923:47;;8989:37;9022:2;9011:9;9007:18;8989:37;:::i;:::-;8979:47;;8704:328;;;;;:::o;9369:615::-;9455:6;9463;9516:2;9504:9;9495:7;9491:23;9487:32;9484:52;;;9532:1;9529;9522:12;9484:52;9572:9;9559:23;9601:18;9642:2;9634:6;9631:14;9628:34;;;9658:1;9655;9648:12;9628:34;9696:6;9685:9;9681:22;9671:32;;9741:7;9734:4;9730:2;9726:13;9722:27;9712:55;;9763:1;9760;9753:12;9712:55;9803:2;9790:16;9829:2;9821:6;9818:14;9815:34;;;9845:1;9842;9835:12;9815:34;9898:7;9893:2;9883:6;9880:1;9876:14;9872:2;9868:23;9864:32;9861:45;9858:65;;;9919:1;9916;9909:12;9858:65;9950:2;9942:11;;;;;9972:6;;-1:-1:-1;9369:615:1;;-1:-1:-1;;;;9369:615:1:o;11214:156::-;11280:20;;11340:4;11329:16;;11319:27;;11309:55;;11360:1;11357;11350:12;11375:317;11441:6;11449;11502:2;11490:9;11481:7;11477:23;11473:32;11470:52;;;11518:1;11515;11508:12;11470:52;11557:9;11544:23;11576:31;11601:5;11576:31;:::i;:::-;11626:5;-1:-1:-1;11650:36:1;11682:2;11667:18;;11650:36;:::i;:::-;11640:46;;11375:317;;;;;:::o;11697:387::-;11770:6;11778;11786;11839:2;11827:9;11818:7;11814:23;11810:32;11807:52;;;11855:1;11852;11845:12;11807:52;11894:9;11881:23;11913:31;11938:5;11913:31;:::i;:::-;11963:5;-1:-1:-1;11987:36:1;12019:2;12004:18;;11987:36;:::i;:::-;11977:46;;12042:36;12074:2;12063:9;12059:18;12042:36;:::i;12089:388::-;12157:6;12165;12218:2;12206:9;12197:7;12193:23;12189:32;12186:52;;;12234:1;12231;12224:12;12186:52;12273:9;12260:23;12292:31;12317:5;12292:31;:::i;:::-;12342:5;-1:-1:-1;12399:2:1;12384:18;;12371:32;12412:33;12371:32;12412:33;:::i;12482:256::-;12548:6;12556;12609:2;12597:9;12588:7;12584:23;12580:32;12577:52;;;12625:1;12622;12615:12;12577:52;12648:28;12666:9;12648:28;:::i;:::-;12638:38;;12695:37;12728:2;12717:9;12713:18;12695:37;:::i;12743:382::-;12808:6;12816;12869:2;12857:9;12848:7;12844:23;12840:32;12837:52;;;12885:1;12882;12875:12;12837:52;12924:9;12911:23;12943:28;12965:5;12943:28;:::i;13130:592::-;13213:6;13221;13229;13237;13290:3;13278:9;13269:7;13265:23;13261:33;13258:53;;;13307:1;13304;13297:12;13258:53;13346:9;13333:23;13365:28;13387:5;13365:28;:::i;:::-;13412:5;-1:-1:-1;13469:2:1;13454:18;;13441:32;13482:33;13441:32;13482:33;:::i;:::-;13534:7;-1:-1:-1;13588:2:1;13573:18;;13560:32;;-1:-1:-1;13644:2:1;13629:18;;13616:32;13657:33;13616:32;13657:33;:::i;:::-;13130:592;;;;-1:-1:-1;13130:592:1;;-1:-1:-1;;13130:592:1:o;13727:184::-;-1:-1:-1;;;13776:1:1;13769:88;13876:4;13873:1;13866:15;13900:4;13897:1;13890:15;13916:422;14005:1;14048:5;14005:1;14062:270;14083:7;14073:8;14070:21;14062:270;;;14142:4;14138:1;14134:6;14130:17;14124:4;14121:27;14118:53;;;14151:18;;:::i;:::-;14201:7;14191:8;14187:22;14184:55;;;14221:16;;;;14184:55;14300:22;;;;14260:15;;;;14062:270;;;14066:3;13916:422;;;;;:::o;14343:806::-;14392:5;14422:8;14412:80;;-1:-1:-1;14463:1:1;14477:5;;14412:80;14511:4;14501:76;;-1:-1:-1;14548:1:1;14562:5;;14501:76;14593:4;14611:1;14606:59;;;;14679:1;14674:130;;;;14586:218;;14606:59;14636:1;14627:10;;14650:5;;;14674:130;14711:3;14701:8;14698:17;14695:43;;;14718:18;;:::i;:::-;-1:-1:-1;;14774:1:1;14760:16;;14789:5;;14586:218;;14888:2;14878:8;14875:16;14869:3;14863:4;14860:13;14856:36;14850:2;14840:8;14837:16;14832:2;14826:4;14823:12;14819:35;14816:77;14813:159;;;-1:-1:-1;14925:19:1;;;14957:5;;14813:159;15004:34;15029:8;15023:4;15004:34;:::i;:::-;15074:6;15070:1;15066:6;15062:19;15053:7;15050:32;15047:58;;;15085:18;;:::i;:::-;15123:20;;14343:806;-1:-1:-1;;;14343:806:1:o;15154:140::-;15212:5;15241:47;15282:4;15272:8;15268:19;15262:4;15241:47;:::i;15299:168::-;15372:9;;;15403;;15420:15;;;15414:22;;15400:37;15390:71;;15441:18;;:::i;15822:184::-;-1:-1:-1;;;15871:1:1;15864:88;15971:4;15968:1;15961:15;15995:4;15992:1;15985:15;16011:175;16048:3;16092:4;16085:5;16081:16;16121:4;16112:7;16109:17;16106:43;;16129:18;;:::i;:::-;16178:1;16165:15;;16011:175;-1:-1:-1;;16011:175:1:o;16191:184::-;-1:-1:-1;;;16240:1:1;16233:88;16340:4;16337:1;16330:15;16364:4;16361:1;16354:15;16380:120;16420:1;16446;16436:35;;16451:18;;:::i;:::-;-1:-1:-1;16485:9:1;;16380:120::o;18041:168::-;18108:6;18134:10;;;18146;;;18130:27;;18169:11;;;18166:37;;;18183:18;;:::i;18575:135::-;18614:3;18635:17;;;18632:43;;18655:18;;:::i;:::-;-1:-1:-1;18702:1:1;18691:13;;18575:135::o;22457:184::-;22527:6;22580:2;22568:9;22559:7;22555:23;22551:32;22548:52;;;22596:1;22593;22586:12;22548:52;-1:-1:-1;22619:16:1;;22457:184;-1:-1:-1;22457:184:1:o;22948:245::-;23015:6;23068:2;23056:9;23047:7;23043:23;23039:32;23036:52;;;23084:1;23081;23074:12;23036:52;23116:9;23110:16;23135:28;23157:5;23135:28;:::i;24899:251::-;24969:6;25022:2;25010:9;25001:7;24997:23;24993:32;24990:52;;;25038:1;25035;25028:12;24990:52;25070:9;25064:16;25089:31;25114:5;25089:31;:::i;28290:125::-;28355:9;;;28376:10;;;28373:36;;;28389:18;;:::i;29234:172::-;29301:10;29331;;;29343;;;29327:27;;29366:11;;;29363:37;;;29380:18;;:::i;29771:249::-;29842:10;29884;;;29896;;;29880:27;29927:20;;;;29842:10;29966:24;;;29956:58;;29994:18;;:::i;:::-;29956:58;;29771:249;;;;:::o;30025:191::-;30064:1;30090:10;30127:2;30124:1;30120:10;30149:3;30139:37;;30156:18;;:::i;:::-;30194:10;;30190:20;;;;;30025:191;-1:-1:-1;;30025:191:1:o;30221:128::-;30288:9;;;30309:11;;;30306:37;;;30323:18;;:::i;30354:605::-;30653:6;30642:9;30635:25;30696:6;30691:2;30680:9;30676:18;30669:34;30739:3;30734:2;30723:9;30719:18;30712:31;30616:4;30760:57;30812:3;30801:9;30797:19;30789:6;30760:57;:::i;:::-;-1:-1:-1;;;;;30853:55:1;;;;30848:2;30833:18;;30826:83;-1:-1:-1;30940:3:1;30925:19;30918:35;30752:65;30354:605;-1:-1:-1;;;30354:605:1:o;31599:306::-;31687:6;31695;31703;31756:2;31744:9;31735:7;31731:23;31727:32;31724:52;;;31772:1;31769;31762:12;31724:52;31801:9;31795:16;31785:26;;31851:2;31840:9;31836:18;31830:25;31820:35;;31895:2;31884:9;31880:18;31874:25;31864:35;;31599:306;;;;;:::o;33767:184::-;-1:-1:-1;;;33816:1:1;33809:88;33916:4;33913:1;33906:15;33940:4;33937:1;33930:15

Swarm Source

ipfs://3df85adaca5a4d5674bb344be7610f1eed1ee00ffc14e387f33ed69f77dcf482
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.