ETH Price: $2,864.74 (-2.66%)

Token

Linea Domains (.linea)

Overview

Max Total Supply

1 .linea

Holders

1

Market

Onchain Market Cap

-

Circulating Supply Market Cap

-
Balance
1 .linea
0x4ad6b32823cb03f9a352d613dbce94d8f73888c2
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
BricksDomains

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at lineascan.build/ on 2024-05-16
*/

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


// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol)

pragma solidity 0.8.18;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Muldiv operation overflow.
     */
    error MathOverflowedMulDiv();

    enum Rounding {
        Floor, // Toward negative infinity
        Ceil, // Toward positive infinity
        Trunc, // Toward zero
        Expand // Away from zero
    }

    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     */
    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.
     */
    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.
     */
    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.
     */
    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.
     */
    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 largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds towards infinity instead
     * of rounding towards zero.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        if (b == 0) {
            // Guarantee the same behavior as in a regular Solidity division.
            return a / b;
        }

        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or
     * denominator == 0.
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by
     * Uniswap Labs also under MIT license.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0 = x * y; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                // Solidity will revert if denominator == 0, unlike the div opcode on its own.
                // The surrounding unchecked block does not change this fact.
                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            if (denominator <= prod1) {
                revert MathOverflowedMulDiv();
            }

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator.
            // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.

            uint256 twos = denominator & (0 - denominator);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also
            // works in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded
     * towards zero.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2 of a positive value rounded towards zero.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10 of a positive value rounded towards zero.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10 ** 64) {
                value /= 10 ** 64;
                result += 64;
            }
            if (value >= 10 ** 32) {
                value /= 10 ** 32;
                result += 32;
            }
            if (value >= 10 ** 16) {
                value /= 10 ** 16;
                result += 16;
            }
            if (value >= 10 ** 8) {
                value /= 10 ** 8;
                result += 8;
            }
            if (value >= 10 ** 4) {
                value /= 10 ** 4;
                result += 4;
            }
            if (value >= 10 ** 2) {
                value /= 10 ** 2;
                result += 2;
            }
            if (value >= 10 ** 1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256 of a positive value rounded towards zero.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0);
        }
    }

    /**
     * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.
     */
    function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {
        return uint8(rounding) % 2 == 1;
    }
}

// File: domains.sol

/**
 *Submitted for verification at basescan.org on 2023-08-06
*/


// File: @openzeppelin/contracts/security/ReentrancyGuard.sol
// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol)

// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity 0.8.18;

/**
 * @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() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

        _;

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

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


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

pragma solidity 0.8.18;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

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


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

pragma solidity 0.8.18;

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

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

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


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity 0.8.18;


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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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


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

pragma solidity 0.8.18;

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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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


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

pragma solidity 0.8.18;

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

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


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

pragma solidity 0.8.18;

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

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


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

pragma solidity 0.8.18;


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

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


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

pragma solidity 0.8.18;


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

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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

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


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

pragma solidity 0.8.18;


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

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

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

// File: erc721a/contracts/IERC721A.sol


// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity 0.8.18;



/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A is IERC721, IERC721Metadata {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     * 
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);
}

// File: erc721a/contracts/ERC721A.sol


// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity 0.8.18;







/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721A {
    using Address for address;
    using Strings for uint256;

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // string domain by token id
    mapping(uint => string) public tokenIDandAddress;

    // token id by string address
    mapping(string => uint) public tokenAddressandID;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 1;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr) if (curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _ownershipOf(tokenId).addr;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenIDandAddress[tokenId])) : '';
    }

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner) if(!isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSender()) revert ApproveToCaller();

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract()) if(!_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

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

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex < end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex < end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            
            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}


library USafeMath {
    function safeAdd(uint256 a, uint256 b) internal pure returns(uint256) {
        (bool success, uint256 res) = Math.tryAdd(a, b);
        require(success, "Failed to Add");
        return res;
    }

    function safeMul(uint256 a, uint256 b) internal pure returns(uint256) {
        (bool success, uint256 res) = Math.tryMul(a, b);
        require(success, "Failed to Mul");
        return res;
    }

    function safeDiv(uint256 a, uint256 b) internal pure returns(uint256) {
        (bool success, uint256 res) = Math.tryDiv(a, b);
        require(success, "Failed to Div");
        return res;
    }

    function safeSub(uint256 a, uint256 b) internal pure returns(uint256) {
        (bool success, uint256 res) = Math.trySub(a, b);
        require(success, "Failed to Sub");
        return res;
    }
}


pragma solidity 0.8.18;


contract BricksDomains is ERC721A, Ownable, ReentrancyGuard {
    using Strings for uint256;

    uint8 public registerRefShare;
    mapping(address => uint8) registerRefShares;
    mapping(uint256 => uint256) public domainPrices;

    uint256 public editDataPrice;
    uint256 public subDomainPrice;
    uint256 public askAssignPrice;

    string private domain;

    string private BASE_URI;
    string private CONTRACT_URI;
    
    mapping(string => address) public resolveAddress;
    mapping(address => string) public primaryAddress;

    mapping(string => mapping(string => string)) public dataAddress;

    bytes _hexChars = "0123456789-_abcdefghijklmnopqrstuvwxyz";

    address public registrar;

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

    constructor(
        string memory _name,
        string memory _domain,
        string memory _chain,
        string memory _baseUri,
        string memory _contractUri,
        uint256[] memory _domainPrices,
        uint256 _editDataPrice,
        uint256 _subDomainPrice,
        uint256 _askAssignPrice,
        address _registrar
    ) ERC721A(_name, _domain) {
        BASE_URI = _baseUri;
        CONTRACT_URI = _contractUri;

        domain = _domain;

        tokenIDandAddress[_currentIndex] = _chain;

        tokenAddressandID[_chain] = _currentIndex;
        resolveAddress[_chain] = msg.sender;

        _safeMint(msg.sender, 1);

        for (uint i = 0; i < _domainPrices.length; i++) {
            domainPrices[i] = _domainPrices[i];
        }

        editDataPrice = _editDataPrice;
        subDomainPrice = _subDomainPrice;
        askAssignPrice = _askAssignPrice;
        registrar = _registrar;

        registerRefShare = 25;
    }

    function getResolver(string memory _domain) external view returns (address _resolver) {
        if (resolveAddress[_domain] == address(this)) {
            TokenOwnership memory Ownership = _ownershipOf(tokenAddressandID[_domain]);
            _resolver = Ownership.addr;
        } else {
            _resolver = resolveAddress[_domain];   
        }
        return _resolver;
    }
    
    function _baseURI() internal view virtual override returns (string memory) {
        return BASE_URI;
    }

    function contractURI() public view returns (string memory) {
        return CONTRACT_URI;
    }
    
    function setResolver(string calldata _domain, address _newResolver) external {
        TokenOwnership memory Ownership = _ownershipOf(tokenAddressandID[_domain]);
        if (Ownership.addr != msg.sender) revert("Not owner");

        bytes memory result = bytes(primaryAddress[resolveAddress[_domain]]);
            if (keccak256(result) == keccak256(bytes(_domain))) {
                primaryAddress[resolveAddress[_domain]]="";
            }
            resolveAddress[domain] = _newResolver;
    }

    function setPrimaryAddress(string calldata _domain) external {
        TokenOwnership memory Ownership = _ownershipOf(tokenAddressandID[_domain]);
        if (Ownership.addr != msg.sender) revert("Not owner");
        primaryAddress[msg.sender] = _domain;
    }

    function setDomainData(string calldata _domain, string calldata dataKey, string memory newData) public payable {
        require(msg.value >= editDataPrice, "Insufficient funds");

        // data key it's telegram, github, etc
        TokenOwnership memory Ownership = _ownershipOf(tokenAddressandID[_domain]);
        if (Ownership.addr != msg.sender) revert("Not owner");
        dataAddress[_domain][dataKey] = newData;

        (bool success, ) = payable(owner()).call{value: msg.value}('');
        require(success, "Failed to send ref share");
    }

    function setRegistrar(address _registrar) external onlyOwner {
        registrar = _registrar;
    }

    function getDomainData(string memory _domain, string calldata dataKey) public view returns(string memory) {
        return dataAddress[_domain][dataKey];
    }

    function getFullDomainData(string memory _domain)
        public
        view
        returns(string memory, string memory, string memory, string memory)
    {
        return (
          dataAddress[_domain]["avatar"],
          dataAddress[_domain]["url"],
          dataAddress[_domain]["description"],
          dataAddress[_domain]["email"]
        );
    }

    function setBaseURI(string memory customBaseURI_) external onlyOwner {
        BASE_URI = customBaseURI_;
    }

    function setDomain(string memory domain_) external onlyOwner {
        domain = domain_;
    }

    function setContractURI(string memory customContractURI_) external onlyOwner {
        CONTRACT_URI = customContractURI_;
    }

    function setDomainPrices(
        uint256[] calldata domainChars,
        uint256[] calldata prices
    ) external onlyOwner {
        require(domainChars.length == prices.length);
        for(uint i = 0; i < domainChars.length; i++) {
            domainPrices[domainChars[i]] = domainPrices[i];
        }
    }

    function setAskAssignPrice(uint256 _askAssignPrice) public onlyOwner {
        askAssignPrice = _askAssignPrice;
    }

    function setSubDomainPrice(uint256 _subDomainPrice) public onlyOwner {
        subDomainPrice = _subDomainPrice;
    }

    function setEditDataPrice(uint256 _editDataPrice) external onlyOwner {
        editDataPrice = _editDataPrice;
    }

    function getDomainPrice(uint256 _domainLength) public view returns (uint256) {
        uint256 _price = domainPrices[_domainLength];
        if (_price == 0) {
            _price = domainPrices[4];
        }
        return _price;
    }

    function registerDomain(string memory _name, address _ref) public payable {
        require(tokenAddressandID[_name] == 0, "This is already taken");
        require(isNameAllowed(_name), "Not allowed");

        uint256 price = domainPrices[bytes(_name).length];
        if (price == 0) {
            price = domainPrices[4];
        }

        require(msg.value >= price, "Insufficient funds!");

        uint256 _value = msg.value;

        if (_ref != address(this)) {
            uint256 dPrice = USafeMath.safeDiv(price, 100);
            uint256 refShare = getRegisterRefShareByAddress(_ref);

            uint256 refAmount = USafeMath.safeMul(dPrice, refShare);

            (bool successR, ) = _ref.call{value: refAmount}('');
            require(successR, "Failed to send ref share");

            _value = USafeMath.safeSub(_value, refAmount);
        }

        (bool successO, ) = payable(owner()).call{value: _value}('');
        require(successO, "Failed to send ref share");

        tokenIDandAddress[_currentIndex] = _name;
        tokenAddressandID[_name] = _currentIndex;

        _safeMint(msg.sender, 1);
    }

    // Register domain for user using registrar account
    function assignDomain(string memory _name, address _owner) public onlyRegistrar {
        require(tokenAddressandID[_name] == 0, "This is already taken");
        require(isNameAllowed(_name), "Not allowed");

        tokenIDandAddress[_currentIndex] = _name;
        tokenAddressandID[_name] = _currentIndex;

        _safeMint(_owner, 1);
    }

    function askAssignDomain(address _ref) public payable {
        require(msg.value >= askAssignPrice, "Insufficient funds!");

        uint256 _value = msg.value;

        if (_ref != address(this)) {
            uint256 dPrice = USafeMath.safeDiv(askAssignPrice, 100);
            uint256 refShare = getRegisterRefShareByAddress(_ref);

            uint256 refAmount = USafeMath.safeMul(dPrice, refShare);

            (bool successR, ) = _ref.call{value: refAmount}('');
            require(successR, "Failed to send ref share");

            _value = USafeMath.safeSub(_value, refAmount);
        }

        (bool successO, ) = payable(owner()).call{value: _value}('');
        require(successO, "Failed to send ref share");
    }

    function registerSubDomain(string memory _name, string memory _parent) public payable {
        string memory _subDomain = string.concat(_name, ".", _parent);

        require(tokenAddressandID[_subDomain] == 0, "This is already taken");
        require(msg.value >= subDomainPrice, "Insufficient funds!");

        TokenOwnership memory Ownership = _ownershipOf(tokenAddressandID[_parent]);
        if (Ownership.addr != msg.sender) revert("Not owner");

        require(isSubDomainNameAllowed(_subDomain), "Now allowed");

        // set resolver to parent
        resolveAddress[_subDomain] = resolveAddress[_parent];

        tokenIDandAddress[_currentIndex] = _subDomain;
        tokenAddressandID[_subDomain] = _currentIndex;

        _safeMint(msg.sender, 1);
    }

    function getOwnedDomains(address _owner) public view returns (string[] memory) {
        uint256 ownerTokenCount = balanceOf(_owner);

        string[] memory ownedTokenIds = new string[](ownerTokenCount);
        uint256 currentTokenId = 1;
        uint256 ownedTokenIndex = 0;

        while (ownedTokenIndex < ownerTokenCount) {
            address currentTokenOwner = ownerOf(currentTokenId);

            if (currentTokenOwner == _owner) {
                ownedTokenIds[ownedTokenIndex] = string.concat(tokenIDandAddress[currentTokenId], domain);

                ++ownedTokenIndex;
            }

            ++currentTokenId;
        }

        return ownedTokenIds;
    }

    function getLastDomains(uint256 count)
        public
        view
        returns (string[] memory)
    {
        uint256 total = totalSupply();
        if (count > total) {
            count = total;
        }

        string[] memory lastAddresses = new string[](count);
        uint256 currentId = total - count;
        uint256 ownedTokenIndex = 0;

        require(currentId >= 0 , "Invalid");

        while (total > currentId) {
            lastAddresses[ownedTokenIndex] = string.concat(tokenIDandAddress[total]);
            ++ownedTokenIndex;
            --total;
        }

        return lastAddresses;
    }

    function isNameAllowed(string memory _name) public view returns(bool){
        uint allowedChars = 0;

        bytes memory byteString = bytes(_name);
        bytes memory allowed = bytes(_hexChars);

        for(uint i=0; i < byteString.length; i++){
           for(uint j=0; j < allowed.length; j++){
              if(byteString[i]==allowed[j]) {
                ++allowedChars;
              }         
           }
        }
        return (allowedChars == byteString.length) && (byteString.length > 1);
    }

    function isSubDomainNameAllowed(string memory _name) public view returns(bool){
        uint allowedChars = 0;

        bytes memory byteString = bytes(_name);

        bytes memory allowed = bytes(_hexChars);
        bytes memory newAllowed = new bytes(allowed.length + 1);
        for (uint i = 0; i < allowed.length; i++) {
            newAllowed[i] = allowed[i];
        }
        newAllowed[allowed.length] = 0x2E;
        allowed = newAllowed;

        for(uint i=0; i < byteString.length; i++){
        for(uint j=0; j < allowed.length; j++){
            if(byteString[i]==allowed[j]) {
                ++allowedChars;
            }         
        }
        }

        if (byteString[1] == 0x2E || byteString[byteString.length - 2] == 0x2E) {
            return false;
        }

        if (byteString[0] == 0x2E || byteString[byteString.length - 1] == 0x2E) {
            return false;
        }

        return (allowedChars == byteString.length) && (byteString.length > 4);
    }

    function getRegisterRefShareByAddress(address _ref) public view returns (uint8) {
        uint8 refShare = registerRefShares[_ref];

        // if not in refShare mapping -> return default value
        if (refShare == 0) {
            return registerRefShare;
        } else {
            return refShare;
        }
    }

    function setRegisterRefShare(uint8 _nRef) public onlyOwner {
        require(_nRef < 100);
        require(_nRef > 0);
        registerRefShare = _nRef;
    }

    function setOtherRegisterRefShares(address[] memory addresses, uint8[] memory percentages) public {
        require(addresses.length == percentages.length, "Check arrays");

        for (uint i = 0; i < addresses.length; i++) {
            registerRefShares[addresses[i]] = percentages[i];
        }
    }

    function withdraw() public onlyOwner {
        (bool success, ) = msg.sender.call{value: address(this).balance}('');
        require(success);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_domain","type":"string"},{"internalType":"string","name":"_chain","type":"string"},{"internalType":"string","name":"_baseUri","type":"string"},{"internalType":"string","name":"_contractUri","type":"string"},{"internalType":"uint256[]","name":"_domainPrices","type":"uint256[]"},{"internalType":"uint256","name":"_editDataPrice","type":"uint256"},{"internalType":"uint256","name":"_subDomainPrice","type":"uint256"},{"internalType":"uint256","name":"_askAssignPrice","type":"uint256"},{"internalType":"address","name":"_registrar","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_ref","type":"address"}],"name":"askAssignDomain","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"askAssignPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"address","name":"_owner","type":"address"}],"name":"assignDomain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"}],"name":"dataAddress","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"domainPrices","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"editDataPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_domain","type":"string"},{"internalType":"string","name":"dataKey","type":"string"}],"name":"getDomainData","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_domainLength","type":"uint256"}],"name":"getDomainPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_domain","type":"string"}],"name":"getFullDomainData","outputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"getLastDomains","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getOwnedDomains","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_ref","type":"address"}],"name":"getRegisterRefShareByAddress","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_domain","type":"string"}],"name":"getResolver","outputs":[{"internalType":"address","name":"_resolver","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"isNameAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"isSubDomainNameAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"primaryAddress","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"address","name":"_ref","type":"address"}],"name":"registerDomain","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"registerRefShare","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_parent","type":"string"}],"name":"registerSubDomain","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"registrar","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"resolveAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_askAssignPrice","type":"uint256"}],"name":"setAskAssignPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"customBaseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"customContractURI_","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"domain_","type":"string"}],"name":"setDomain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_domain","type":"string"},{"internalType":"string","name":"dataKey","type":"string"},{"internalType":"string","name":"newData","type":"string"}],"name":"setDomainData","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"domainChars","type":"uint256[]"},{"internalType":"uint256[]","name":"prices","type":"uint256[]"}],"name":"setDomainPrices","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_editDataPrice","type":"uint256"}],"name":"setEditDataPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint8[]","name":"percentages","type":"uint8[]"}],"name":"setOtherRegisterRefShares","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_domain","type":"string"}],"name":"setPrimaryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_nRef","type":"uint8"}],"name":"setRegisterRefShare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_registrar","type":"address"}],"name":"setRegistrar","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_domain","type":"string"},{"internalType":"address","name":"_newResolver","type":"address"}],"name":"setResolver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_subDomainPrice","type":"uint256"}],"name":"setSubDomainPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"subDomainPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"tokenAddressandID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIDandAddress","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60e0604052602660808181529062004a4a60a039601890620000229082620005cf565b503480156200003057600080fd5b5060405162004a7038038062004a70833981016040819052620000539162000805565b89896004620000638382620005cf565b506005620000728282620005cf565b50506001600055506200008533620001e5565b6001600b556013620000988882620005cf565b506014620000a78782620005cf565b506012620000b68a82620005cf565b50600080548152600160205260409020620000d28982620005cf565b50600054600289604051620000e891906200093f565b908152602001604051809103902081905550336015896040516200010d91906200093f565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b03199092169190911790556200014933600162000237565b60005b85518110156200019c578581815181106200016b576200016b6200095d565b6020908102919091018101516000838152600e90925260409091205580620001938162000973565b9150506200014c565b50600f93909355601091909155601155601980546001600160a01b0319166001600160a01b03909216919091178155600c805460ff191690911790555062000a24945050505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620002598282604051806020016040528060008152506200025d60201b60201c565b5050565b6000546001600160a01b0384166200028757604051622e076360e81b815260040160405180910390fd5b82600003620002a95760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260076020908152604080832080546001600160801b031981166001600160401b038083168b018116918217680100000000000000006001600160401b031990941690921783900481168b0181169092021790915585845260068352922080546001600160e01b0319168417600160a01b42909416939093029290921790915582918286019162000352919062000426811b620029e617901c565b15620003d1575b60405182906001600160a01b0388169060009060008051602062004a2a833981519152908290a46001820191620003969060009088908762000435565b620003b4576040516368d2bf6b60e11b815260040160405180910390fd5b80821062000359578260005414620003cb57600080fd5b62000406565b5b6040516001830192906001600160a01b0388169060009060008051602062004a2a833981519152908290a4808210620003d2575b50600090815562000420908583866001600160e01b038516565b50505050565b6001600160a01b03163b151590565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906200046c9033908990889088906004016200099b565b6020604051808303816000875af1925050508015620004aa575060408051601f3d908101601f19168201909252620004a791810190620009f1565b60015b6200050c573d808015620004db576040519150601f19603f3d011682016040523d82523d6000602084013e620004e0565b606091505b50805160000362000504576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200055557607f821691505b6020821081036200057657634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620005ca57600081815260208120601f850160051c81016020861015620005a55750805b601f850160051c820191505b81811015620005c657828155600101620005b1565b5050505b505050565b81516001600160401b03811115620005eb57620005eb6200052a565b6200060381620005fc845462000540565b846200057c565b602080601f8311600181146200063b5760008415620006225750858301515b600019600386901b1c1916600185901b178555620005c6565b600085815260208120601f198616915b828110156200066c578886015182559484019460019091019084016200064b565b50858210156200068b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b604051601f8201601f191681016001600160401b0381118282101715620006c657620006c66200052a565b604052919050565b60005b83811015620006eb578181015183820152602001620006d1565b50506000910152565b600082601f8301126200070657600080fd5b81516001600160401b038111156200072257620007226200052a565b62000737601f8201601f19166020016200069b565b8181528460208386010111156200074d57600080fd5b62000522826020830160208701620006ce565b600082601f8301126200077257600080fd5b815160206001600160401b038211156200079057620007906200052a565b8160051b620007a18282016200069b565b9283528481018201928281019087851115620007bc57600080fd5b83870192505b84831015620007dd57825182529183019190830190620007c2565b979650505050505050565b80516001600160a01b03811681146200080057600080fd5b919050565b6000806000806000806000806000806101408b8d0312156200082657600080fd5b8a516001600160401b03808211156200083e57600080fd5b6200084c8e838f01620006f4565b9b5060208d01519150808211156200086357600080fd5b620008718e838f01620006f4565b9a5060408d01519150808211156200088857600080fd5b620008968e838f01620006f4565b995060608d0151915080821115620008ad57600080fd5b620008bb8e838f01620006f4565b985060808d0151915080821115620008d257600080fd5b620008e08e838f01620006f4565b975060a08d0151915080821115620008f757600080fd5b50620009068d828e0162000760565b95505060c08b0151935060e08b015192506101008b015191506200092e6101208c01620007e8565b90509295989b9194979a5092959850565b6000825162000953818460208701620006ce565b9190910192915050565b634e487b7160e01b600052603260045260246000fd5b6000600182016200099457634e487b7160e01b600052601160045260246000fd5b5060010190565b600060018060a01b038087168352808616602084015250836040830152608060608301528251806080840152620009da8160a0850160208701620006ce565b601f01601f19169190910160a00195945050505050565b60006020828403121562000a0457600080fd5b81516001600160e01b03198116811462000a1d57600080fd5b9392505050565b613ff68062000a346000396000f3fe60806040526004361061036b5760003560e01c80638da5cb5b116101c6578063b9f24d7b116100f7578063e985e9c511610095578063f2fde38b1161006f578063f2fde38b14610a28578063f52433cb14610a48578063faab9d3914610a5b578063fe6e4a9514610a7b57600080fd5b8063e985e9c5146109c8578063ed0d5027146109e8578063f121a87014610a0857600080fd5b8063e4ae7d77116100d1578063e4ae7d7714610953578063e5eab09614610973578063e8927f9514610993578063e8a3d485146109b357600080fd5b8063b9f24d7b146108f3578063c6fbf9a914610913578063c87b56dd1461093357600080fd5b8063a22cb46511610164578063b66537791161013e578063b665377914610852578063b66d497814610872578063b6c6e69214610892578063b88d4fde146108d357600080fd5b8063a22cb465146107e2578063b3e9c38a14610802578063b5c570051461082257600080fd5b806395d89b41116101a057806395d89b411461076b578063974738f4146107805780639a312c2b146107a05780639c89ded1146107cc57600080fd5b80638da5cb5b1461070d5780638e2cb4ee1461072b578063938e3d7b1461074b57600080fd5b806339ec5e96116102a05780636e32e4991161023e578063733ccaba11610218578063733ccaba1461068d57806374280e88146106ad57806385fa9e17146106cd5780638699e738146106ed57600080fd5b80636e32e4991461063857806370a0823114610658578063715018a61461067857600080fd5b806342842e0e1161027a57806342842e0e146105c557806355f804b3146105e55780636352211e1461060557806368a03b181461062557600080fd5b806339ec5e96146105845780633a814d811461059a5780633ccfd60b146105b057600080fd5b806318160ddd1161030d5780631bee0a4a116102e75780631bee0a4a1461051157806323b872dd1461053157806326612e62146105515780632b20e3971461056457600080fd5b806318160ddd146104a7578063189aa7cb146104c45780631a6c821b146104f157600080fd5b8063081812fc11610349578063081812fc14610402578063095ea7b31461043a5780630d6eec781461045c5780631607c75e1461049457600080fd5b806301ffc9a71461037057806306fdde03146103a55780630790e714146103c7575b600080fd5b34801561037c57600080fd5b5061039061038b366004613271565b610a9b565b60405190151581526020015b60405180910390f35b3480156103b157600080fd5b506103ba610aed565b60405161039c91906132de565b3480156103d357600080fd5b506103f46103e23660046132f1565b600e6020526000908152604090205481565b60405190815260200161039c565b34801561040e57600080fd5b5061042261041d3660046132f1565b610b7f565b6040516001600160a01b03909116815260200161039c565b34801561044657600080fd5b5061045a610455366004613321565b610bc3565b005b34801561046857600080fd5b506103f4610477366004613408565b805160208183018101805160028252928201919093012091525481565b61045a6104a236600461347d565b610c49565b3480156104b357600080fd5b5060035460005403600019016103f4565b3480156104d057600080fd5b506104e46104df3660046132f1565b610dc5565b60405161039c9190613510565b3480156104fd57600080fd5b506104e461050c366004613572565b610eba565b34801561051d57600080fd5b5061045a61052c3660046132f1565b610fb8565b34801561053d57600080fd5b5061045a61054c36600461358d565b610fe7565b61045a61055f366004613572565b610ff2565b34801561057057600080fd5b50601954610422906001600160a01b031681565b34801561059057600080fd5b506103f460115481565b3480156105a657600080fd5b506103f4600f5481565b3480156105bc57600080fd5b5061045a61115c565b3480156105d157600080fd5b5061045a6105e036600461358d565b6111de565b3480156105f157600080fd5b5061045a610600366004613408565b6111f9565b34801561061157600080fd5b506104226106203660046132f1565b611233565b61045a6106333660046135c9565b611245565b34801561064457600080fd5b506103ba6106533660046132f1565b611402565b34801561066457600080fd5b506103f4610673366004613572565b61149c565b34801561068457600080fd5b5061045a6114ea565b34801561069957600080fd5b5061045a6106a836600461362c565b611520565b3480156106b957600080fd5b5061045a6106c8366004613690565b6116f6565b3480156106d957600080fd5b5061045a6106e8366004613740565b611756565b3480156106f957600080fd5b506103ba610708366004613572565b611825565b34801561071957600080fd5b50600a546001600160a01b0316610422565b34801561073757600080fd5b5061045a610746366004613839565b61183e565b34801561075757600080fd5b5061045a610766366004613408565b6118d6565b34801561077757600080fd5b506103ba61190c565b34801561078c57600080fd5b5061039061079b366004613408565b61191b565b3480156107ac57600080fd5b50600c546107ba9060ff1681565b60405160ff909116815260200161039c565b3480156107d857600080fd5b506103f460105481565b3480156107ee57600080fd5b5061045a6107fd3660046138a4565b611a62565b34801561080e57600080fd5b5061045a61081d3660046132f1565b611af7565b34801561082e57600080fd5b5061084261083d366004613408565b611b26565b60405161039c94939291906138e0565b34801561085e57600080fd5b5061045a61086d366004613938565b611e60565b34801561087e57600080fd5b5061039061088d366004613408565b611f83565b34801561089e57600080fd5b506104226108ad366004613408565b80516020818301810180516015825292820191909301209152546001600160a01b031681565b3480156108df57600080fd5b5061045a6108ee366004613985565b6122a2565b3480156108ff57600080fd5b506103ba61090e366004613a00565b6122e6565b34801561091f57600080fd5b5061045a61092e366004613a68565b6123b6565b34801561093f57600080fd5b506103ba61094e3660046132f1565b612413565b34801561095f57600080fd5b5061042261096e366004613408565b6124a1565b34801561097f57600080fd5b5061045a61098e366004613408565b61252b565b34801561099f57600080fd5b5061045a6109ae3660046132f1565b612561565b3480156109bf57600080fd5b506103ba612590565b3480156109d457600080fd5b506103906109e3366004613aa9565b61259f565b3480156109f457600080fd5b506103f4610a033660046132f1565b6125cd565b348015610a1457600080fd5b506103ba610a233660046135c9565b612615565b348015610a3457600080fd5b5061045a610a43366004613572565b612656565b61045a610a56366004613938565b6126ee565b348015610a6757600080fd5b5061045a610a76366004613572565b612964565b348015610a8757600080fd5b506107ba610a96366004613572565b6129b0565b60006001600160e01b031982166380ac58cd60e01b1480610acc57506001600160e01b03198216635b5e139f60e01b145b80610ae757506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060048054610afc90613ad3565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2890613ad3565b8015610b755780601f10610b4a57610100808354040283529160200191610b75565b820191906000526020600020905b815481529060010190602001808311610b5857829003601f168201915b5050505050905090565b6000610b8a826129f5565b610ba7576040516333d1c03960e21b815260040160405180910390fd5b506000908152600860205260409020546001600160a01b031690565b6000610bce82611233565b9050806001600160a01b0316836001600160a01b031603610c025760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610c3957610c1c813361259f565b610c39576040516367d9dca160e11b815260040160405180910390fd5b610c44838383612a2e565b505050565b600f54341015610c955760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742066756e647360701b60448201526064015b60405180910390fd5b6000610cc060028787604051610cac929190613b07565b908152602001604051809103902054612a8a565b80519091506001600160a01b03163314610cec5760405162461bcd60e51b8152600401610c8c90613b17565b8160178787604051610cff929190613b07565b90815260200160405180910390208585604051610d1d929190613b07565b90815260200160405180910390209081610d379190613b88565b506000610d4c600a546001600160a01b031690565b6001600160a01b03163460405160006040518083038185875af1925050503d8060008114610d96576040519150601f19603f3d011682016040523d82523d6000602084013e610d9b565b606091505b5050905080610dbc5760405162461bcd60e51b8152600401610c8c90613c47565b50505050505050565b60035460005460609160001991030180831115610de0578092505b6000836001600160401b03811115610dfa57610dfa61334b565b604051908082528060200260200182016040528015610e2d57816020015b6060815260200190600190039081610e185790505b5090506000610e3c8584613c94565b905060005b81841115610eb0576000848152600160209081526040918290209151610e68929101613d1a565b604051602081830303815290604052838281518110610e8957610e89613d26565b602002602001018190525080610e9e90613d3c565b9050610ea984613d55565b9350610e41565b5090949350505050565b60606000610ec78361149c565b90506000816001600160401b03811115610ee357610ee361334b565b604051908082528060200260200182016040528015610f1657816020015b6060815260200190600190039081610f015790505b509050600160005b83811015610eb0576000610f3183611233565b9050866001600160a01b0316816001600160a01b031603610fa7576000838152600160209081526040918290209151610f6e929160129101613d6c565b604051602081830303815290604052848381518110610f8f57610f8f613d26565b602002602001018190525081610fa490613d3c565b91505b610fb083613d3c565b925050610f1e565b600a546001600160a01b03163314610fe25760405162461bcd60e51b8152600401610c8c90613d81565b601055565b610c44838383612bac565b6011543410156110145760405162461bcd60e51b8152600401610c8c90613db6565b346001600160a01b03821630146110d85760006110346011546064612d97565b90506000611041846129b0565b60ff16905060006110528383612def565b90506000856001600160a01b03168260405160006040518083038185875af1925050503d80600081146110a1576040519150601f19603f3d011682016040523d82523d6000602084013e6110a6565b606091505b50509050806110c75760405162461bcd60e51b8152600401610c8c90613c47565b6110d18583612e3f565b9450505050505b60006110ec600a546001600160a01b031690565b6001600160a01b03168260405160006040518083038185875af1925050503d8060008114611136576040519150601f19603f3d011682016040523d82523d6000602084013e61113b565b606091505b5050905080610c445760405162461bcd60e51b8152600401610c8c90613c47565b600a546001600160a01b031633146111865760405162461bcd60e51b8152600401610c8c90613d81565b604051600090339047908381818185875af1925050503d80600081146111c8576040519150601f19603f3d011682016040523d82523d6000602084013e6111cd565b606091505b50509050806111db57600080fd5b50565b610c44838383604051806020016040528060008152506122a2565b600a546001600160a01b031633146112235760405162461bcd60e51b8152600401610c8c90613d81565b601361122f8282613b88565b5050565b600061123e82612a8a565b5192915050565b6000828260405160200161125a929190613de3565b604051602081830303815290604052905060028160405161127b9190613e1f565b9081526020016040518091039020546000146112a95760405162461bcd60e51b8152600401610c8c90613e3b565b6010543410156112cb5760405162461bcd60e51b8152600401610c8c90613db6565b60006112e0600284604051610cac9190613e1f565b80519091506001600160a01b0316331461130c5760405162461bcd60e51b8152600401610c8c90613b17565b61131582611f83565b61134f5760405162461bcd60e51b815260206004820152600b60248201526a139bddc8185b1b1bddd95960aa1b6044820152606401610c8c565b60158360405161135f9190613e1f565b908152604051908190036020018120546001600160a01b031690601590611387908590613e1f565b908152604080516020928190038301902080546001600160a01b0319166001600160a01b0394909416939093179092556000805481526001909152206113cd8382613b88565b506000546002836040516113e19190613e1f565b908152604051908190036020019020556113fc336001612e8f565b50505050565b6001602052600090815260409020805461141b90613ad3565b80601f016020809104026020016040519081016040528092919081815260200182805461144790613ad3565b80156114945780601f1061146957610100808354040283529160200191611494565b820191906000526020600020905b81548152906001019060200180831161147757829003601f168201915b505050505081565b60006001600160a01b0382166114c5576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600760205260409020546001600160401b031690565b600a546001600160a01b031633146115145760405162461bcd60e51b8152600401610c8c90613d81565b61151e6000612ea9565b565b600061153760028585604051610cac929190613b07565b80519091506001600160a01b031633146115635760405162461bcd60e51b8152600401610c8c90613b17565b6000601660006015878760405161157b929190613b07565b9081526040805160209281900383019020546001600160a01b03168352908201929092520160002080546115ae90613ad3565b80601f01602080910402602001604051908101604052809291908181526020018280546115da90613ad3565b80156116275780601f106115fc57610100808354040283529160200191611627565b820191906000526020600020905b81548152906001019060200180831161160a57829003601f168201915b50505050509050848460405161163e929190613b07565b60405180910390208180519060200120036116ae57604051806020016040528060008152506016600060158888604051611679929190613b07565b9081526040805160209281900383019020546001600160a01b031683529082019290925201600020906116ac9082613b88565b505b82601560126040516116c09190613d1a565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b03199092169190911790555050505050565b600a546001600160a01b031633146117205760405162461bcd60e51b8152600401610c8c90613d81565b60648160ff161061173057600080fd5b60008160ff161161174057600080fd5b600c805460ff191660ff92909216919091179055565b80518251146117965760405162461bcd60e51b815260206004820152600c60248201526b436865636b2061727261797360a01b6044820152606401610c8c565b60005b8251811015610c44578181815181106117b4576117b4613d26565b6020026020010151600d60008584815181106117d2576117d2613d26565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908360ff160217905550808061181d90613d3c565b915050611799565b6016602052600090815260409020805461141b90613ad3565b600a546001600160a01b031633146118685760405162461bcd60e51b8152600401610c8c90613d81565b82811461187457600080fd5b60005b838110156118cf576000818152600e60208190526040822054918787858181106118a3576118a3613d26565b9050602002013581526020019081526020016000208190555080806118c790613d3c565b915050611877565b5050505050565b600a546001600160a01b031633146119005760405162461bcd60e51b8152600401610c8c90613d81565b601461122f8282613b88565b606060058054610afc90613ad3565b6018805460009182918491839161193190613ad3565b80601f016020809104026020016040519081016040528092919081815260200182805461195d90613ad3565b80156119aa5780601f1061197f576101008083540402835291602001916119aa565b820191906000526020600020905b81548152906001019060200180831161198d57829003601f168201915b5050505050905060005b8251811015611a475760005b8251811015611a34578281815181106119db576119db613d26565b602001015160f81c60f81b6001600160f81b031916848381518110611a0257611a02613d26565b01602001516001600160f81b03191603611a2257611a1f85613d3c565b94505b80611a2c81613d3c565b9150506119c0565b5080611a3f81613d3c565b9150506119b4565b50815183148015611a59575060018251115b95945050505050565b336001600160a01b03831603611a8b5760405163b06307db60e01b815260040160405180910390fd5b3360008181526009602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b03163314611b215760405162461bcd60e51b8152600401610c8c90613d81565b601155565b606080606080601785604051611b3c9190613e1f565b9081526040519081900360200181206530bb30ba30b960d11b8252906006019081526020016040518091039020601786604051611b799190613e1f565b908152604051908190036020018120621d5c9b60ea1b8252906003019081526020016040518091039020601787604051611bb39190613e1f565b9081526040519081900360200181206a3232b9b1b934b83a34b7b760a91b825290600b019081526020016040518091039020601788604051611bf59190613e1f565b90815260405190819003602001812064195b585a5b60da1b8252906005019081526020016040518091039020838054611c2d90613ad3565b80601f0160208091040260200160405190810160405280929190818152602001828054611c5990613ad3565b8015611ca65780601f10611c7b57610100808354040283529160200191611ca6565b820191906000526020600020905b815481529060010190602001808311611c8957829003601f168201915b50505050509350828054611cb990613ad3565b80601f0160208091040260200160405190810160405280929190818152602001828054611ce590613ad3565b8015611d325780601f10611d0757610100808354040283529160200191611d32565b820191906000526020600020905b815481529060010190602001808311611d1557829003601f168201915b50505050509250818054611d4590613ad3565b80601f0160208091040260200160405190810160405280929190818152602001828054611d7190613ad3565b8015611dbe5780601f10611d9357610100808354040283529160200191611dbe565b820191906000526020600020905b815481529060010190602001808311611da157829003601f168201915b50505050509150808054611dd190613ad3565b80601f0160208091040260200160405190810160405280929190818152602001828054611dfd90613ad3565b8015611e4a5780601f10611e1f57610100808354040283529160200191611e4a565b820191906000526020600020905b815481529060010190602001808311611e2d57829003601f168201915b5050505050905093509350935093509193509193565b6019546001600160a01b03163314611eba5760405162461bcd60e51b815260206004820152601b60248201527f63616c6c6572206973206e6f74207468652072656769737472617200000000006044820152606401610c8c565b600282604051611eca9190613e1f565b908152602001604051809103902054600014611ef85760405162461bcd60e51b8152600401610c8c90613e3b565b611f018261191b565b611f3b5760405162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b6044820152606401610c8c565b600080548152600160205260409020611f548382613b88565b50600054600283604051611f689190613e1f565b9081526040519081900360200190205561122f816001612e8f565b60188054600091829184918391611f9990613ad3565b80601f0160208091040260200160405190810160405280929190818152602001828054611fc590613ad3565b80156120125780601f10611fe757610100808354040283529160200191612012565b820191906000526020600020905b815481529060010190602001808311611ff557829003601f168201915b505050505090506000815160016120299190613e6a565b6001600160401b038111156120405761204061334b565b6040519080825280601f01601f19166020018201604052801561206a576020820181803683370190505b50905060005b82518110156120d15782818151811061208b5761208b613d26565b602001015160f81c60f81b8282815181106120a8576120a8613d26565b60200101906001600160f81b031916908160001a905350806120c981613d3c565b915050612070565b50602e60f81b818351815181106120ea576120ea613d26565b60200101906001600160f81b031916908160001a90535080915060005b835181101561219a5760005b83518110156121875783818151811061212e5761212e613d26565b602001015160f81c60f81b6001600160f81b03191685838151811061215557612155613d26565b01602001516001600160f81b031916036121755761217286613d3c565b95505b8061217f81613d3c565b915050612113565b508061219281613d3c565b915050612107565b50826001815181106121ae576121ae613d26565b6020910101516001600160f81b031916601760f91b1480612200575082600284516121d99190613c94565b815181106121e9576121e9613d26565b6020910101516001600160f81b031916601760f91b145b156122115750600095945050505050565b8260008151811061222457612224613d26565b6020910101516001600160f81b031916601760f91b14806122765750826001845161224f9190613c94565b8151811061225f5761225f613d26565b6020910101516001600160f81b031916601760f91b145b156122875750600095945050505050565b825184148015612298575060048351115b9695505050505050565b6122ad848484612bac565b6001600160a01b0383163b156113fc576122c984848484612efb565b6113fc576040516368d2bf6b60e11b815260040160405180910390fd5b60606017846040516122f89190613e1f565b90815260200160405180910390208383604051612316929190613b07565b9081526020016040518091039020805461232f90613ad3565b80601f016020809104026020016040519081016040528092919081815260200182805461235b90613ad3565b80156123a85780601f1061237d576101008083540402835291602001916123a8565b820191906000526020600020905b81548152906001019060200180831161238b57829003601f168201915b505050505090509392505050565b60006123cd60028484604051610cac929190613b07565b80519091506001600160a01b031633146123f95760405162461bcd60e51b8152600401610c8c90613b17565b3360009081526016602052604090206113fc838583613e7d565b606061241e826129f5565b61243b57604051630a14c4b560e41b815260040160405180910390fd5b6000612445612fe6565b90508051600003612465576040518060200160405280600081525061249a565b806001600085815260200190815260200160002060405160200161248a929190613f3c565b6040516020818303038152906040525b9392505050565b6000306001600160a01b03166015836040516124bd9190613e1f565b908152604051908190036020019020546001600160a01b0316036124fa5760006124f0600284604051610cac9190613e1f565b5191506125269050565b60158260405161250a9190613e1f565b908152604051908190036020019020546001600160a01b031690505b919050565b600a546001600160a01b031633146125555760405162461bcd60e51b8152600401610c8c90613d81565b601261122f8282613b88565b600a546001600160a01b0316331461258b5760405162461bcd60e51b8152600401610c8c90613d81565b600f55565b606060148054610afc90613ad3565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205460ff1690565b6000818152600e6020526040812054808203610ae7575050600460005250600e6020527fa1d6913cd9e08c872be3e7525cca82e4fc0fc298a783f19022be725b19be685a5490565b815160208184018101805160178252928201948201949094209190935281518083018401805192815290840192909301919091209152805461141b90613ad3565b600a546001600160a01b031633146126805760405162461bcd60e51b8152600401610c8c90613d81565b6001600160a01b0381166126e55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c8c565b6111db81612ea9565b6002826040516126fe9190613e1f565b90815260200160405180910390205460001461272c5760405162461bcd60e51b8152600401610c8c90613e3b565b6127358261191b565b61276f5760405162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b6044820152606401610c8c565b81516000908152600e6020526040812054908190036127b657506004600052600e6020527fa1d6913cd9e08c872be3e7525cca82e4fc0fc298a783f19022be725b19be685a545b803410156127d65760405162461bcd60e51b8152600401610c8c90613db6565b346001600160a01b03831630146128985760006127f4836064612d97565b90506000612801856129b0565b60ff16905060006128128383612def565b90506000866001600160a01b03168260405160006040518083038185875af1925050503d8060008114612861576040519150601f19603f3d011682016040523d82523d6000602084013e612866565b606091505b50509050806128875760405162461bcd60e51b8152600401610c8c90613c47565b6128918583612e3f565b9450505050505b60006128ac600a546001600160a01b031690565b6001600160a01b03168260405160006040518083038185875af1925050503d80600081146128f6576040519150601f19603f3d011682016040523d82523d6000602084013e6128fb565b606091505b505090508061291c5760405162461bcd60e51b8152600401610c8c90613c47565b6000805481526001602052604090206129358682613b88565b506000546002866040516129499190613e1f565b908152604051908190036020019020556118cf336001612e8f565b600a546001600160a01b0316331461298e5760405162461bcd60e51b8152600401610c8c90613d81565b601980546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152600d602052604081205460ff16808203610ae7575050600c5460ff16919050565b50919050565b6001600160a01b03163b151590565b600081600111158015612a09575060005482105b8015610ae7575050600090815260066020526040902054600160e01b900460ff161590565b60008281526008602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60408051606081018252600080825260208201819052918101919091528180600111612b9357600054811015612b9357600081815260066020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290612b915780516001600160a01b031615612b28579392505050565b5060001901600081815260066020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215612b8c579392505050565b612b28565b505b604051636f96cda160e11b815260040160405180910390fd5b6000612bb782612a8a565b9050836001600160a01b031681600001516001600160a01b031614612bee5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480612c0c5750612c0c853361259f565b80612c27575033612c1c84610b7f565b6001600160a01b0316145b905080612c4757604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416612c6e57604051633a954ecd60e21b815260040160405180910390fd5b612c7a60008487612a2e565b6001600160a01b038581166000908152600760209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600690945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116612d4e576000548214612d4e57805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46118cf565b6000806000612da68585612ff5565b9150915081612de75760405162461bcd60e51b815260206004820152600d60248201526c2330b4b632b2103a37902234bb60991b6044820152606401610c8c565b949350505050565b6000806000612dfe8585613029565b9150915081612de75760405162461bcd60e51b815260206004820152600d60248201526c11985a5b1959081d1bc8135d5b609a1b6044820152606401610c8c565b6000806000612e4e8585613072565b9150915081612de75760405162461bcd60e51b815260206004820152600d60248201526c2330b4b632b2103a379029bab160991b6044820152606401610c8c565b61122f828260405180602001604052806000815250613094565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612f30903390899088908890600401613f5a565b6020604051808303816000875af1925050508015612f6b575060408051601f3d908101601f19168201909252612f6891810190613f8d565b60015b612fc9573d808015612f99576040519150601f19603f3d011682016040523d82523d6000602084013e612f9e565b606091505b508051600003612fc1576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b606060138054610afc90613ad3565b6000808260000361300b57506000905080613022565b600183858161301c5761301c613faa565b04915091505b9250929050565b600080836000036130405750600190506000613022565b8383028385828161305357613053613faa565b0414613066576000809250925050613022565b60019590945092505050565b6000808383111561308857506000905080613022565b50600193919092039150565b6000546001600160a01b0384166130bd57604051622e076360e81b815260040160405180910390fd5b826000036130de5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260076020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600690925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15613206575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46131cf6000878480600101955087612efb565b6131ec576040516368d2bf6b60e11b815260040160405180910390fd5b80821061318457826000541461320157600080fd5b61324b565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210613207575b5060009081556113fc9085838684565b6001600160e01b0319811681146111db57600080fd5b60006020828403121561328357600080fd5b813561249a8161325b565b60005b838110156132a9578181015183820152602001613291565b50506000910152565b600081518084526132ca81602086016020860161328e565b601f01601f19169290920160200192915050565b60208152600061249a60208301846132b2565b60006020828403121561330357600080fd5b5035919050565b80356001600160a01b038116811461252657600080fd5b6000806040838503121561333457600080fd5b61333d8361330a565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156133895761338961334b565b604052919050565b60006001600160401b038311156133aa576133aa61334b565b6133bd601f8401601f1916602001613361565b90508281528383830111156133d157600080fd5b828260208301376000602084830101529392505050565b600082601f8301126133f957600080fd5b61249a83833560208501613391565b60006020828403121561341a57600080fd5b81356001600160401b0381111561343057600080fd5b612de7848285016133e8565b60008083601f84011261344e57600080fd5b5081356001600160401b0381111561346557600080fd5b60208301915083602082850101111561302257600080fd5b60008060008060006060868803121561349557600080fd5b85356001600160401b03808211156134ac57600080fd5b6134b889838a0161343c565b909750955060208801359150808211156134d157600080fd5b6134dd89838a0161343c565b909550935060408801359150808211156134f657600080fd5b50613503888289016133e8565b9150509295509295909350565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561356557603f198886030184526135538583516132b2565b94509285019290850190600101613537565b5092979650505050505050565b60006020828403121561358457600080fd5b61249a8261330a565b6000806000606084860312156135a257600080fd5b6135ab8461330a565b92506135b96020850161330a565b9150604084013590509250925092565b600080604083850312156135dc57600080fd5b82356001600160401b03808211156135f357600080fd5b6135ff868387016133e8565b9350602085013591508082111561361557600080fd5b50613622858286016133e8565b9150509250929050565b60008060006040848603121561364157600080fd5b83356001600160401b0381111561365757600080fd5b6136638682870161343c565b909450925061367690506020850161330a565b90509250925092565b803560ff8116811461252657600080fd5b6000602082840312156136a257600080fd5b61249a8261367f565b60006001600160401b038211156136c4576136c461334b565b5060051b60200190565b600082601f8301126136df57600080fd5b813560206136f46136ef836136ab565b613361565b82815260059290921b8401810191818101908684111561371357600080fd5b8286015b84811015613735576137288161367f565b8352918301918301613717565b509695505050505050565b6000806040838503121561375357600080fd5b82356001600160401b038082111561376a57600080fd5b818501915085601f83011261377e57600080fd5b8135602061378e6136ef836136ab565b82815260059290921b840181019181810190898411156137ad57600080fd5b948201945b838610156137d2576137c38661330a565b825294820194908201906137b2565b965050860135925050808211156137e857600080fd5b50613622858286016136ce565b60008083601f84011261380757600080fd5b5081356001600160401b0381111561381e57600080fd5b6020830191508360208260051b850101111561302257600080fd5b6000806000806040858703121561384f57600080fd5b84356001600160401b038082111561386657600080fd5b613872888389016137f5565b9096509450602087013591508082111561388b57600080fd5b50613898878288016137f5565b95989497509550505050565b600080604083850312156138b757600080fd5b6138c08361330a565b9150602083013580151581146138d557600080fd5b809150509250929050565b6080815260006138f360808301876132b2565b828103602084015261390581876132b2565b9050828103604084015261391981866132b2565b9050828103606084015261392d81856132b2565b979650505050505050565b6000806040838503121561394b57600080fd5b82356001600160401b0381111561396157600080fd5b61396d858286016133e8565b92505061397c6020840161330a565b90509250929050565b6000806000806080858703121561399b57600080fd5b6139a48561330a565b93506139b26020860161330a565b92506040850135915060608501356001600160401b038111156139d457600080fd5b8501601f810187136139e557600080fd5b6139f487823560208401613391565b91505092959194509250565b600080600060408486031215613a1557600080fd5b83356001600160401b0380821115613a2c57600080fd5b613a38878388016133e8565b94506020860135915080821115613a4e57600080fd5b50613a5b8682870161343c565b9497909650939450505050565b60008060208385031215613a7b57600080fd5b82356001600160401b03811115613a9157600080fd5b613a9d8582860161343c565b90969095509350505050565b60008060408385031215613abc57600080fd5b613ac58361330a565b915061397c6020840161330a565b600181811c90821680613ae757607f821691505b6020821081036129e057634e487b7160e01b600052602260045260246000fd5b8183823760009101908152919050565b6020808252600990820152682737ba1037bbb732b960b91b604082015260600190565b601f821115610c4457600081815260208120601f850160051c81016020861015613b615750805b601f850160051c820191505b81811015613b8057828155600101613b6d565b505050505050565b81516001600160401b03811115613ba157613ba161334b565b613bb581613baf8454613ad3565b84613b3a565b602080601f831160018114613bea5760008415613bd25750858301515b600019600386901b1c1916600185901b178555613b80565b600085815260208120601f198616915b82811015613c1957888601518255948401946001909101908401613bfa565b5085821015613c375787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60208082526018908201527f4661696c656420746f2073656e64207265662073686172650000000000000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b81810381811115610ae757610ae7613c7e565b60008154613cb481613ad3565b60018281168015613ccc5760018114613ce157613d10565b60ff1984168752821515830287019450613d10565b8560005260208060002060005b85811015613d075781548a820152908401908201613cee565b50505082870194505b5050505092915050565b600061249a8284613ca7565b634e487b7160e01b600052603260045260246000fd5b600060018201613d4e57613d4e613c7e565b5060010190565b600081613d6457613d64613c7e565b506000190190565b6000612de7613d7b8386613ca7565b84613ca7565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b602080825260139082015272496e73756666696369656e742066756e64732160681b604082015260600190565b60008351613df581846020880161328e565b601760f91b9083019081528351613e1381600184016020880161328e565b01600101949350505050565b60008251613e3181846020870161328e565b9190910192915050565b6020808252601590820152742a3434b99034b99030b63932b0b23c903a30b5b2b760591b604082015260600190565b80820180821115610ae757610ae7613c7e565b6001600160401b03831115613e9457613e9461334b565b613ea883613ea28354613ad3565b83613b3a565b6000601f841160018114613edc5760008515613ec45750838201355b600019600387901b1c1916600186901b1783556118cf565b600083815260209020601f19861690835b82811015613f0d5786850135825560209485019460019092019101613eed565b5086821015613f2a5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60008351613f4e81846020880161328e565b611a5981840185613ca7565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612298908301846132b2565b600060208284031215613f9f57600080fd5b815161249a8161325b565b634e487b7160e01b600052601260045260246000fdfea2646970667358221220e439bb32b8abdf19f5b16c6e080b748a6c711c37656581d67f9b5291aeb8b9b964736f6c63430008120033ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef303132333435363738392d5f6162636465666768696a6b6c6d6e6f707172737475767778797a0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000009a9d359ca00000000000000000000000000000000000000000000000000000009a9d359ca000000000000000000000000000000000000000000000000000000b5e620f48000000000000000000000000000057de1b5bd6b5ed62e0990e513987f6d84517c939000000000000000000000000000000000000000000000000000000000000000d4c696e656120446f6d61696e730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000062e6c696e6561000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000056c696e6561000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004368747470733a2f2f6170692e627269636b736d696e742e636f6d2f6e732d6173736574732f6173736574732f646f6d61696e732f6d657461646174612f35393134342f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f6170692e627269636b736d696e742e636f6d2f6e732d6173736574732f6173736574732f646f6d61696e732f636f6e74726163742f35393134342f636f6e74726163742e6a736f6e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000000000000000000000000000000011c37937e080000000000000000000000000000000000000000000000000000005543df729c000

Deployed Bytecode

0x60806040526004361061036b5760003560e01c80638da5cb5b116101c6578063b9f24d7b116100f7578063e985e9c511610095578063f2fde38b1161006f578063f2fde38b14610a28578063f52433cb14610a48578063faab9d3914610a5b578063fe6e4a9514610a7b57600080fd5b8063e985e9c5146109c8578063ed0d5027146109e8578063f121a87014610a0857600080fd5b8063e4ae7d77116100d1578063e4ae7d7714610953578063e5eab09614610973578063e8927f9514610993578063e8a3d485146109b357600080fd5b8063b9f24d7b146108f3578063c6fbf9a914610913578063c87b56dd1461093357600080fd5b8063a22cb46511610164578063b66537791161013e578063b665377914610852578063b66d497814610872578063b6c6e69214610892578063b88d4fde146108d357600080fd5b8063a22cb465146107e2578063b3e9c38a14610802578063b5c570051461082257600080fd5b806395d89b41116101a057806395d89b411461076b578063974738f4146107805780639a312c2b146107a05780639c89ded1146107cc57600080fd5b80638da5cb5b1461070d5780638e2cb4ee1461072b578063938e3d7b1461074b57600080fd5b806339ec5e96116102a05780636e32e4991161023e578063733ccaba11610218578063733ccaba1461068d57806374280e88146106ad57806385fa9e17146106cd5780638699e738146106ed57600080fd5b80636e32e4991461063857806370a0823114610658578063715018a61461067857600080fd5b806342842e0e1161027a57806342842e0e146105c557806355f804b3146105e55780636352211e1461060557806368a03b181461062557600080fd5b806339ec5e96146105845780633a814d811461059a5780633ccfd60b146105b057600080fd5b806318160ddd1161030d5780631bee0a4a116102e75780631bee0a4a1461051157806323b872dd1461053157806326612e62146105515780632b20e3971461056457600080fd5b806318160ddd146104a7578063189aa7cb146104c45780631a6c821b146104f157600080fd5b8063081812fc11610349578063081812fc14610402578063095ea7b31461043a5780630d6eec781461045c5780631607c75e1461049457600080fd5b806301ffc9a71461037057806306fdde03146103a55780630790e714146103c7575b600080fd5b34801561037c57600080fd5b5061039061038b366004613271565b610a9b565b60405190151581526020015b60405180910390f35b3480156103b157600080fd5b506103ba610aed565b60405161039c91906132de565b3480156103d357600080fd5b506103f46103e23660046132f1565b600e6020526000908152604090205481565b60405190815260200161039c565b34801561040e57600080fd5b5061042261041d3660046132f1565b610b7f565b6040516001600160a01b03909116815260200161039c565b34801561044657600080fd5b5061045a610455366004613321565b610bc3565b005b34801561046857600080fd5b506103f4610477366004613408565b805160208183018101805160028252928201919093012091525481565b61045a6104a236600461347d565b610c49565b3480156104b357600080fd5b5060035460005403600019016103f4565b3480156104d057600080fd5b506104e46104df3660046132f1565b610dc5565b60405161039c9190613510565b3480156104fd57600080fd5b506104e461050c366004613572565b610eba565b34801561051d57600080fd5b5061045a61052c3660046132f1565b610fb8565b34801561053d57600080fd5b5061045a61054c36600461358d565b610fe7565b61045a61055f366004613572565b610ff2565b34801561057057600080fd5b50601954610422906001600160a01b031681565b34801561059057600080fd5b506103f460115481565b3480156105a657600080fd5b506103f4600f5481565b3480156105bc57600080fd5b5061045a61115c565b3480156105d157600080fd5b5061045a6105e036600461358d565b6111de565b3480156105f157600080fd5b5061045a610600366004613408565b6111f9565b34801561061157600080fd5b506104226106203660046132f1565b611233565b61045a6106333660046135c9565b611245565b34801561064457600080fd5b506103ba6106533660046132f1565b611402565b34801561066457600080fd5b506103f4610673366004613572565b61149c565b34801561068457600080fd5b5061045a6114ea565b34801561069957600080fd5b5061045a6106a836600461362c565b611520565b3480156106b957600080fd5b5061045a6106c8366004613690565b6116f6565b3480156106d957600080fd5b5061045a6106e8366004613740565b611756565b3480156106f957600080fd5b506103ba610708366004613572565b611825565b34801561071957600080fd5b50600a546001600160a01b0316610422565b34801561073757600080fd5b5061045a610746366004613839565b61183e565b34801561075757600080fd5b5061045a610766366004613408565b6118d6565b34801561077757600080fd5b506103ba61190c565b34801561078c57600080fd5b5061039061079b366004613408565b61191b565b3480156107ac57600080fd5b50600c546107ba9060ff1681565b60405160ff909116815260200161039c565b3480156107d857600080fd5b506103f460105481565b3480156107ee57600080fd5b5061045a6107fd3660046138a4565b611a62565b34801561080e57600080fd5b5061045a61081d3660046132f1565b611af7565b34801561082e57600080fd5b5061084261083d366004613408565b611b26565b60405161039c94939291906138e0565b34801561085e57600080fd5b5061045a61086d366004613938565b611e60565b34801561087e57600080fd5b5061039061088d366004613408565b611f83565b34801561089e57600080fd5b506104226108ad366004613408565b80516020818301810180516015825292820191909301209152546001600160a01b031681565b3480156108df57600080fd5b5061045a6108ee366004613985565b6122a2565b3480156108ff57600080fd5b506103ba61090e366004613a00565b6122e6565b34801561091f57600080fd5b5061045a61092e366004613a68565b6123b6565b34801561093f57600080fd5b506103ba61094e3660046132f1565b612413565b34801561095f57600080fd5b5061042261096e366004613408565b6124a1565b34801561097f57600080fd5b5061045a61098e366004613408565b61252b565b34801561099f57600080fd5b5061045a6109ae3660046132f1565b612561565b3480156109bf57600080fd5b506103ba612590565b3480156109d457600080fd5b506103906109e3366004613aa9565b61259f565b3480156109f457600080fd5b506103f4610a033660046132f1565b6125cd565b348015610a1457600080fd5b506103ba610a233660046135c9565b612615565b348015610a3457600080fd5b5061045a610a43366004613572565b612656565b61045a610a56366004613938565b6126ee565b348015610a6757600080fd5b5061045a610a76366004613572565b612964565b348015610a8757600080fd5b506107ba610a96366004613572565b6129b0565b60006001600160e01b031982166380ac58cd60e01b1480610acc57506001600160e01b03198216635b5e139f60e01b145b80610ae757506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060048054610afc90613ad3565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2890613ad3565b8015610b755780601f10610b4a57610100808354040283529160200191610b75565b820191906000526020600020905b815481529060010190602001808311610b5857829003601f168201915b5050505050905090565b6000610b8a826129f5565b610ba7576040516333d1c03960e21b815260040160405180910390fd5b506000908152600860205260409020546001600160a01b031690565b6000610bce82611233565b9050806001600160a01b0316836001600160a01b031603610c025760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610c3957610c1c813361259f565b610c39576040516367d9dca160e11b815260040160405180910390fd5b610c44838383612a2e565b505050565b600f54341015610c955760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742066756e647360701b60448201526064015b60405180910390fd5b6000610cc060028787604051610cac929190613b07565b908152602001604051809103902054612a8a565b80519091506001600160a01b03163314610cec5760405162461bcd60e51b8152600401610c8c90613b17565b8160178787604051610cff929190613b07565b90815260200160405180910390208585604051610d1d929190613b07565b90815260200160405180910390209081610d379190613b88565b506000610d4c600a546001600160a01b031690565b6001600160a01b03163460405160006040518083038185875af1925050503d8060008114610d96576040519150601f19603f3d011682016040523d82523d6000602084013e610d9b565b606091505b5050905080610dbc5760405162461bcd60e51b8152600401610c8c90613c47565b50505050505050565b60035460005460609160001991030180831115610de0578092505b6000836001600160401b03811115610dfa57610dfa61334b565b604051908082528060200260200182016040528015610e2d57816020015b6060815260200190600190039081610e185790505b5090506000610e3c8584613c94565b905060005b81841115610eb0576000848152600160209081526040918290209151610e68929101613d1a565b604051602081830303815290604052838281518110610e8957610e89613d26565b602002602001018190525080610e9e90613d3c565b9050610ea984613d55565b9350610e41565b5090949350505050565b60606000610ec78361149c565b90506000816001600160401b03811115610ee357610ee361334b565b604051908082528060200260200182016040528015610f1657816020015b6060815260200190600190039081610f015790505b509050600160005b83811015610eb0576000610f3183611233565b9050866001600160a01b0316816001600160a01b031603610fa7576000838152600160209081526040918290209151610f6e929160129101613d6c565b604051602081830303815290604052848381518110610f8f57610f8f613d26565b602002602001018190525081610fa490613d3c565b91505b610fb083613d3c565b925050610f1e565b600a546001600160a01b03163314610fe25760405162461bcd60e51b8152600401610c8c90613d81565b601055565b610c44838383612bac565b6011543410156110145760405162461bcd60e51b8152600401610c8c90613db6565b346001600160a01b03821630146110d85760006110346011546064612d97565b90506000611041846129b0565b60ff16905060006110528383612def565b90506000856001600160a01b03168260405160006040518083038185875af1925050503d80600081146110a1576040519150601f19603f3d011682016040523d82523d6000602084013e6110a6565b606091505b50509050806110c75760405162461bcd60e51b8152600401610c8c90613c47565b6110d18583612e3f565b9450505050505b60006110ec600a546001600160a01b031690565b6001600160a01b03168260405160006040518083038185875af1925050503d8060008114611136576040519150601f19603f3d011682016040523d82523d6000602084013e61113b565b606091505b5050905080610c445760405162461bcd60e51b8152600401610c8c90613c47565b600a546001600160a01b031633146111865760405162461bcd60e51b8152600401610c8c90613d81565b604051600090339047908381818185875af1925050503d80600081146111c8576040519150601f19603f3d011682016040523d82523d6000602084013e6111cd565b606091505b50509050806111db57600080fd5b50565b610c44838383604051806020016040528060008152506122a2565b600a546001600160a01b031633146112235760405162461bcd60e51b8152600401610c8c90613d81565b601361122f8282613b88565b5050565b600061123e82612a8a565b5192915050565b6000828260405160200161125a929190613de3565b604051602081830303815290604052905060028160405161127b9190613e1f565b9081526020016040518091039020546000146112a95760405162461bcd60e51b8152600401610c8c90613e3b565b6010543410156112cb5760405162461bcd60e51b8152600401610c8c90613db6565b60006112e0600284604051610cac9190613e1f565b80519091506001600160a01b0316331461130c5760405162461bcd60e51b8152600401610c8c90613b17565b61131582611f83565b61134f5760405162461bcd60e51b815260206004820152600b60248201526a139bddc8185b1b1bddd95960aa1b6044820152606401610c8c565b60158360405161135f9190613e1f565b908152604051908190036020018120546001600160a01b031690601590611387908590613e1f565b908152604080516020928190038301902080546001600160a01b0319166001600160a01b0394909416939093179092556000805481526001909152206113cd8382613b88565b506000546002836040516113e19190613e1f565b908152604051908190036020019020556113fc336001612e8f565b50505050565b6001602052600090815260409020805461141b90613ad3565b80601f016020809104026020016040519081016040528092919081815260200182805461144790613ad3565b80156114945780601f1061146957610100808354040283529160200191611494565b820191906000526020600020905b81548152906001019060200180831161147757829003601f168201915b505050505081565b60006001600160a01b0382166114c5576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600760205260409020546001600160401b031690565b600a546001600160a01b031633146115145760405162461bcd60e51b8152600401610c8c90613d81565b61151e6000612ea9565b565b600061153760028585604051610cac929190613b07565b80519091506001600160a01b031633146115635760405162461bcd60e51b8152600401610c8c90613b17565b6000601660006015878760405161157b929190613b07565b9081526040805160209281900383019020546001600160a01b03168352908201929092520160002080546115ae90613ad3565b80601f01602080910402602001604051908101604052809291908181526020018280546115da90613ad3565b80156116275780601f106115fc57610100808354040283529160200191611627565b820191906000526020600020905b81548152906001019060200180831161160a57829003601f168201915b50505050509050848460405161163e929190613b07565b60405180910390208180519060200120036116ae57604051806020016040528060008152506016600060158888604051611679929190613b07565b9081526040805160209281900383019020546001600160a01b031683529082019290925201600020906116ac9082613b88565b505b82601560126040516116c09190613d1a565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b03199092169190911790555050505050565b600a546001600160a01b031633146117205760405162461bcd60e51b8152600401610c8c90613d81565b60648160ff161061173057600080fd5b60008160ff161161174057600080fd5b600c805460ff191660ff92909216919091179055565b80518251146117965760405162461bcd60e51b815260206004820152600c60248201526b436865636b2061727261797360a01b6044820152606401610c8c565b60005b8251811015610c44578181815181106117b4576117b4613d26565b6020026020010151600d60008584815181106117d2576117d2613d26565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908360ff160217905550808061181d90613d3c565b915050611799565b6016602052600090815260409020805461141b90613ad3565b600a546001600160a01b031633146118685760405162461bcd60e51b8152600401610c8c90613d81565b82811461187457600080fd5b60005b838110156118cf576000818152600e60208190526040822054918787858181106118a3576118a3613d26565b9050602002013581526020019081526020016000208190555080806118c790613d3c565b915050611877565b5050505050565b600a546001600160a01b031633146119005760405162461bcd60e51b8152600401610c8c90613d81565b601461122f8282613b88565b606060058054610afc90613ad3565b6018805460009182918491839161193190613ad3565b80601f016020809104026020016040519081016040528092919081815260200182805461195d90613ad3565b80156119aa5780601f1061197f576101008083540402835291602001916119aa565b820191906000526020600020905b81548152906001019060200180831161198d57829003601f168201915b5050505050905060005b8251811015611a475760005b8251811015611a34578281815181106119db576119db613d26565b602001015160f81c60f81b6001600160f81b031916848381518110611a0257611a02613d26565b01602001516001600160f81b03191603611a2257611a1f85613d3c565b94505b80611a2c81613d3c565b9150506119c0565b5080611a3f81613d3c565b9150506119b4565b50815183148015611a59575060018251115b95945050505050565b336001600160a01b03831603611a8b5760405163b06307db60e01b815260040160405180910390fd5b3360008181526009602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b03163314611b215760405162461bcd60e51b8152600401610c8c90613d81565b601155565b606080606080601785604051611b3c9190613e1f565b9081526040519081900360200181206530bb30ba30b960d11b8252906006019081526020016040518091039020601786604051611b799190613e1f565b908152604051908190036020018120621d5c9b60ea1b8252906003019081526020016040518091039020601787604051611bb39190613e1f565b9081526040519081900360200181206a3232b9b1b934b83a34b7b760a91b825290600b019081526020016040518091039020601788604051611bf59190613e1f565b90815260405190819003602001812064195b585a5b60da1b8252906005019081526020016040518091039020838054611c2d90613ad3565b80601f0160208091040260200160405190810160405280929190818152602001828054611c5990613ad3565b8015611ca65780601f10611c7b57610100808354040283529160200191611ca6565b820191906000526020600020905b815481529060010190602001808311611c8957829003601f168201915b50505050509350828054611cb990613ad3565b80601f0160208091040260200160405190810160405280929190818152602001828054611ce590613ad3565b8015611d325780601f10611d0757610100808354040283529160200191611d32565b820191906000526020600020905b815481529060010190602001808311611d1557829003601f168201915b50505050509250818054611d4590613ad3565b80601f0160208091040260200160405190810160405280929190818152602001828054611d7190613ad3565b8015611dbe5780601f10611d9357610100808354040283529160200191611dbe565b820191906000526020600020905b815481529060010190602001808311611da157829003601f168201915b50505050509150808054611dd190613ad3565b80601f0160208091040260200160405190810160405280929190818152602001828054611dfd90613ad3565b8015611e4a5780601f10611e1f57610100808354040283529160200191611e4a565b820191906000526020600020905b815481529060010190602001808311611e2d57829003601f168201915b5050505050905093509350935093509193509193565b6019546001600160a01b03163314611eba5760405162461bcd60e51b815260206004820152601b60248201527f63616c6c6572206973206e6f74207468652072656769737472617200000000006044820152606401610c8c565b600282604051611eca9190613e1f565b908152602001604051809103902054600014611ef85760405162461bcd60e51b8152600401610c8c90613e3b565b611f018261191b565b611f3b5760405162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b6044820152606401610c8c565b600080548152600160205260409020611f548382613b88565b50600054600283604051611f689190613e1f565b9081526040519081900360200190205561122f816001612e8f565b60188054600091829184918391611f9990613ad3565b80601f0160208091040260200160405190810160405280929190818152602001828054611fc590613ad3565b80156120125780601f10611fe757610100808354040283529160200191612012565b820191906000526020600020905b815481529060010190602001808311611ff557829003601f168201915b505050505090506000815160016120299190613e6a565b6001600160401b038111156120405761204061334b565b6040519080825280601f01601f19166020018201604052801561206a576020820181803683370190505b50905060005b82518110156120d15782818151811061208b5761208b613d26565b602001015160f81c60f81b8282815181106120a8576120a8613d26565b60200101906001600160f81b031916908160001a905350806120c981613d3c565b915050612070565b50602e60f81b818351815181106120ea576120ea613d26565b60200101906001600160f81b031916908160001a90535080915060005b835181101561219a5760005b83518110156121875783818151811061212e5761212e613d26565b602001015160f81c60f81b6001600160f81b03191685838151811061215557612155613d26565b01602001516001600160f81b031916036121755761217286613d3c565b95505b8061217f81613d3c565b915050612113565b508061219281613d3c565b915050612107565b50826001815181106121ae576121ae613d26565b6020910101516001600160f81b031916601760f91b1480612200575082600284516121d99190613c94565b815181106121e9576121e9613d26565b6020910101516001600160f81b031916601760f91b145b156122115750600095945050505050565b8260008151811061222457612224613d26565b6020910101516001600160f81b031916601760f91b14806122765750826001845161224f9190613c94565b8151811061225f5761225f613d26565b6020910101516001600160f81b031916601760f91b145b156122875750600095945050505050565b825184148015612298575060048351115b9695505050505050565b6122ad848484612bac565b6001600160a01b0383163b156113fc576122c984848484612efb565b6113fc576040516368d2bf6b60e11b815260040160405180910390fd5b60606017846040516122f89190613e1f565b90815260200160405180910390208383604051612316929190613b07565b9081526020016040518091039020805461232f90613ad3565b80601f016020809104026020016040519081016040528092919081815260200182805461235b90613ad3565b80156123a85780601f1061237d576101008083540402835291602001916123a8565b820191906000526020600020905b81548152906001019060200180831161238b57829003601f168201915b505050505090509392505050565b60006123cd60028484604051610cac929190613b07565b80519091506001600160a01b031633146123f95760405162461bcd60e51b8152600401610c8c90613b17565b3360009081526016602052604090206113fc838583613e7d565b606061241e826129f5565b61243b57604051630a14c4b560e41b815260040160405180910390fd5b6000612445612fe6565b90508051600003612465576040518060200160405280600081525061249a565b806001600085815260200190815260200160002060405160200161248a929190613f3c565b6040516020818303038152906040525b9392505050565b6000306001600160a01b03166015836040516124bd9190613e1f565b908152604051908190036020019020546001600160a01b0316036124fa5760006124f0600284604051610cac9190613e1f565b5191506125269050565b60158260405161250a9190613e1f565b908152604051908190036020019020546001600160a01b031690505b919050565b600a546001600160a01b031633146125555760405162461bcd60e51b8152600401610c8c90613d81565b601261122f8282613b88565b600a546001600160a01b0316331461258b5760405162461bcd60e51b8152600401610c8c90613d81565b600f55565b606060148054610afc90613ad3565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205460ff1690565b6000818152600e6020526040812054808203610ae7575050600460005250600e6020527fa1d6913cd9e08c872be3e7525cca82e4fc0fc298a783f19022be725b19be685a5490565b815160208184018101805160178252928201948201949094209190935281518083018401805192815290840192909301919091209152805461141b90613ad3565b600a546001600160a01b031633146126805760405162461bcd60e51b8152600401610c8c90613d81565b6001600160a01b0381166126e55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c8c565b6111db81612ea9565b6002826040516126fe9190613e1f565b90815260200160405180910390205460001461272c5760405162461bcd60e51b8152600401610c8c90613e3b565b6127358261191b565b61276f5760405162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b6044820152606401610c8c565b81516000908152600e6020526040812054908190036127b657506004600052600e6020527fa1d6913cd9e08c872be3e7525cca82e4fc0fc298a783f19022be725b19be685a545b803410156127d65760405162461bcd60e51b8152600401610c8c90613db6565b346001600160a01b03831630146128985760006127f4836064612d97565b90506000612801856129b0565b60ff16905060006128128383612def565b90506000866001600160a01b03168260405160006040518083038185875af1925050503d8060008114612861576040519150601f19603f3d011682016040523d82523d6000602084013e612866565b606091505b50509050806128875760405162461bcd60e51b8152600401610c8c90613c47565b6128918583612e3f565b9450505050505b60006128ac600a546001600160a01b031690565b6001600160a01b03168260405160006040518083038185875af1925050503d80600081146128f6576040519150601f19603f3d011682016040523d82523d6000602084013e6128fb565b606091505b505090508061291c5760405162461bcd60e51b8152600401610c8c90613c47565b6000805481526001602052604090206129358682613b88565b506000546002866040516129499190613e1f565b908152604051908190036020019020556118cf336001612e8f565b600a546001600160a01b0316331461298e5760405162461bcd60e51b8152600401610c8c90613d81565b601980546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152600d602052604081205460ff16808203610ae7575050600c5460ff16919050565b50919050565b6001600160a01b03163b151590565b600081600111158015612a09575060005482105b8015610ae7575050600090815260066020526040902054600160e01b900460ff161590565b60008281526008602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60408051606081018252600080825260208201819052918101919091528180600111612b9357600054811015612b9357600081815260066020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290612b915780516001600160a01b031615612b28579392505050565b5060001901600081815260066020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215612b8c579392505050565b612b28565b505b604051636f96cda160e11b815260040160405180910390fd5b6000612bb782612a8a565b9050836001600160a01b031681600001516001600160a01b031614612bee5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480612c0c5750612c0c853361259f565b80612c27575033612c1c84610b7f565b6001600160a01b0316145b905080612c4757604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416612c6e57604051633a954ecd60e21b815260040160405180910390fd5b612c7a60008487612a2e565b6001600160a01b038581166000908152600760209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600690945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116612d4e576000548214612d4e57805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46118cf565b6000806000612da68585612ff5565b9150915081612de75760405162461bcd60e51b815260206004820152600d60248201526c2330b4b632b2103a37902234bb60991b6044820152606401610c8c565b949350505050565b6000806000612dfe8585613029565b9150915081612de75760405162461bcd60e51b815260206004820152600d60248201526c11985a5b1959081d1bc8135d5b609a1b6044820152606401610c8c565b6000806000612e4e8585613072565b9150915081612de75760405162461bcd60e51b815260206004820152600d60248201526c2330b4b632b2103a379029bab160991b6044820152606401610c8c565b61122f828260405180602001604052806000815250613094565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612f30903390899088908890600401613f5a565b6020604051808303816000875af1925050508015612f6b575060408051601f3d908101601f19168201909252612f6891810190613f8d565b60015b612fc9573d808015612f99576040519150601f19603f3d011682016040523d82523d6000602084013e612f9e565b606091505b508051600003612fc1576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b606060138054610afc90613ad3565b6000808260000361300b57506000905080613022565b600183858161301c5761301c613faa565b04915091505b9250929050565b600080836000036130405750600190506000613022565b8383028385828161305357613053613faa565b0414613066576000809250925050613022565b60019590945092505050565b6000808383111561308857506000905080613022565b50600193919092039150565b6000546001600160a01b0384166130bd57604051622e076360e81b815260040160405180910390fd5b826000036130de5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260076020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600690925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15613206575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46131cf6000878480600101955087612efb565b6131ec576040516368d2bf6b60e11b815260040160405180910390fd5b80821061318457826000541461320157600080fd5b61324b565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210613207575b5060009081556113fc9085838684565b6001600160e01b0319811681146111db57600080fd5b60006020828403121561328357600080fd5b813561249a8161325b565b60005b838110156132a9578181015183820152602001613291565b50506000910152565b600081518084526132ca81602086016020860161328e565b601f01601f19169290920160200192915050565b60208152600061249a60208301846132b2565b60006020828403121561330357600080fd5b5035919050565b80356001600160a01b038116811461252657600080fd5b6000806040838503121561333457600080fd5b61333d8361330a565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156133895761338961334b565b604052919050565b60006001600160401b038311156133aa576133aa61334b565b6133bd601f8401601f1916602001613361565b90508281528383830111156133d157600080fd5b828260208301376000602084830101529392505050565b600082601f8301126133f957600080fd5b61249a83833560208501613391565b60006020828403121561341a57600080fd5b81356001600160401b0381111561343057600080fd5b612de7848285016133e8565b60008083601f84011261344e57600080fd5b5081356001600160401b0381111561346557600080fd5b60208301915083602082850101111561302257600080fd5b60008060008060006060868803121561349557600080fd5b85356001600160401b03808211156134ac57600080fd5b6134b889838a0161343c565b909750955060208801359150808211156134d157600080fd5b6134dd89838a0161343c565b909550935060408801359150808211156134f657600080fd5b50613503888289016133e8565b9150509295509295909350565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561356557603f198886030184526135538583516132b2565b94509285019290850190600101613537565b5092979650505050505050565b60006020828403121561358457600080fd5b61249a8261330a565b6000806000606084860312156135a257600080fd5b6135ab8461330a565b92506135b96020850161330a565b9150604084013590509250925092565b600080604083850312156135dc57600080fd5b82356001600160401b03808211156135f357600080fd5b6135ff868387016133e8565b9350602085013591508082111561361557600080fd5b50613622858286016133e8565b9150509250929050565b60008060006040848603121561364157600080fd5b83356001600160401b0381111561365757600080fd5b6136638682870161343c565b909450925061367690506020850161330a565b90509250925092565b803560ff8116811461252657600080fd5b6000602082840312156136a257600080fd5b61249a8261367f565b60006001600160401b038211156136c4576136c461334b565b5060051b60200190565b600082601f8301126136df57600080fd5b813560206136f46136ef836136ab565b613361565b82815260059290921b8401810191818101908684111561371357600080fd5b8286015b84811015613735576137288161367f565b8352918301918301613717565b509695505050505050565b6000806040838503121561375357600080fd5b82356001600160401b038082111561376a57600080fd5b818501915085601f83011261377e57600080fd5b8135602061378e6136ef836136ab565b82815260059290921b840181019181810190898411156137ad57600080fd5b948201945b838610156137d2576137c38661330a565b825294820194908201906137b2565b965050860135925050808211156137e857600080fd5b50613622858286016136ce565b60008083601f84011261380757600080fd5b5081356001600160401b0381111561381e57600080fd5b6020830191508360208260051b850101111561302257600080fd5b6000806000806040858703121561384f57600080fd5b84356001600160401b038082111561386657600080fd5b613872888389016137f5565b9096509450602087013591508082111561388b57600080fd5b50613898878288016137f5565b95989497509550505050565b600080604083850312156138b757600080fd5b6138c08361330a565b9150602083013580151581146138d557600080fd5b809150509250929050565b6080815260006138f360808301876132b2565b828103602084015261390581876132b2565b9050828103604084015261391981866132b2565b9050828103606084015261392d81856132b2565b979650505050505050565b6000806040838503121561394b57600080fd5b82356001600160401b0381111561396157600080fd5b61396d858286016133e8565b92505061397c6020840161330a565b90509250929050565b6000806000806080858703121561399b57600080fd5b6139a48561330a565b93506139b26020860161330a565b92506040850135915060608501356001600160401b038111156139d457600080fd5b8501601f810187136139e557600080fd5b6139f487823560208401613391565b91505092959194509250565b600080600060408486031215613a1557600080fd5b83356001600160401b0380821115613a2c57600080fd5b613a38878388016133e8565b94506020860135915080821115613a4e57600080fd5b50613a5b8682870161343c565b9497909650939450505050565b60008060208385031215613a7b57600080fd5b82356001600160401b03811115613a9157600080fd5b613a9d8582860161343c565b90969095509350505050565b60008060408385031215613abc57600080fd5b613ac58361330a565b915061397c6020840161330a565b600181811c90821680613ae757607f821691505b6020821081036129e057634e487b7160e01b600052602260045260246000fd5b8183823760009101908152919050565b6020808252600990820152682737ba1037bbb732b960b91b604082015260600190565b601f821115610c4457600081815260208120601f850160051c81016020861015613b615750805b601f850160051c820191505b81811015613b8057828155600101613b6d565b505050505050565b81516001600160401b03811115613ba157613ba161334b565b613bb581613baf8454613ad3565b84613b3a565b602080601f831160018114613bea5760008415613bd25750858301515b600019600386901b1c1916600185901b178555613b80565b600085815260208120601f198616915b82811015613c1957888601518255948401946001909101908401613bfa565b5085821015613c375787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60208082526018908201527f4661696c656420746f2073656e64207265662073686172650000000000000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b81810381811115610ae757610ae7613c7e565b60008154613cb481613ad3565b60018281168015613ccc5760018114613ce157613d10565b60ff1984168752821515830287019450613d10565b8560005260208060002060005b85811015613d075781548a820152908401908201613cee565b50505082870194505b5050505092915050565b600061249a8284613ca7565b634e487b7160e01b600052603260045260246000fd5b600060018201613d4e57613d4e613c7e565b5060010190565b600081613d6457613d64613c7e565b506000190190565b6000612de7613d7b8386613ca7565b84613ca7565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b602080825260139082015272496e73756666696369656e742066756e64732160681b604082015260600190565b60008351613df581846020880161328e565b601760f91b9083019081528351613e1381600184016020880161328e565b01600101949350505050565b60008251613e3181846020870161328e565b9190910192915050565b6020808252601590820152742a3434b99034b99030b63932b0b23c903a30b5b2b760591b604082015260600190565b80820180821115610ae757610ae7613c7e565b6001600160401b03831115613e9457613e9461334b565b613ea883613ea28354613ad3565b83613b3a565b6000601f841160018114613edc5760008515613ec45750838201355b600019600387901b1c1916600186901b1783556118cf565b600083815260209020601f19861690835b82811015613f0d5786850135825560209485019460019092019101613eed565b5086821015613f2a5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60008351613f4e81846020880161328e565b611a5981840185613ca7565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612298908301846132b2565b600060208284031215613f9f57600080fd5b815161249a8161325b565b634e487b7160e01b600052601260045260246000fdfea2646970667358221220e439bb32b8abdf19f5b16c6e080b748a6c711c37656581d67f9b5291aeb8b9b964736f6c63430008120033

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

0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000009a9d359ca00000000000000000000000000000000000000000000000000000009a9d359ca000000000000000000000000000000000000000000000000000000b5e620f48000000000000000000000000000057de1b5bd6b5ed62e0990e513987f6d84517c939000000000000000000000000000000000000000000000000000000000000000d4c696e656120446f6d61696e730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000062e6c696e6561000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000056c696e6561000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004368747470733a2f2f6170692e627269636b736d696e742e636f6d2f6e732d6173736574732f6173736574732f646f6d61696e732f6d657461646174612f35393134342f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f6170692e627269636b736d696e742e636f6d2f6e732d6173736574732f6173736574732f646f6d61696e732f636f6e74726163742f35393134342f636f6e74726163742e6a736f6e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000000000000000000000000000000011c37937e080000000000000000000000000000000000000000000000000000005543df729c000

-----Decoded View---------------
Arg [0] : _name (string): Linea Domains
Arg [1] : _domain (string): .linea
Arg [2] : _chain (string): linea
Arg [3] : _baseUri (string): https://api.bricksmint.com/ns-assets/assets/domains/metadata/59144/
Arg [4] : _contractUri (string): https://api.bricksmint.com/ns-assets/assets/domains/contract/59144/contract.json
Arg [5] : _domainPrices (uint256[]): 0,0,10000000000000000,5000000000000000,1500000000000000
Arg [6] : _editDataPrice (uint256): 170000000000000
Arg [7] : _subDomainPrice (uint256): 170000000000000
Arg [8] : _askAssignPrice (uint256): 3200000000000000
Arg [9] : _registrar (address): 0x57De1B5bD6B5ed62e0990e513987f6d84517c939

-----Encoded View---------------
30 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [2] : 00000000000000000000000000000000000000000000000000000000000001c0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000200
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000280
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000300
Arg [6] : 00000000000000000000000000000000000000000000000000009a9d359ca000
Arg [7] : 00000000000000000000000000000000000000000000000000009a9d359ca000
Arg [8] : 000000000000000000000000000000000000000000000000000b5e620f480000
Arg [9] : 00000000000000000000000057de1b5bd6b5ed62e0990e513987f6d84517c939
Arg [10] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [11] : 4c696e656120446f6d61696e7300000000000000000000000000000000000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [13] : 2e6c696e65610000000000000000000000000000000000000000000000000000
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [15] : 6c696e6561000000000000000000000000000000000000000000000000000000
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [17] : 68747470733a2f2f6170692e627269636b736d696e742e636f6d2f6e732d6173
Arg [18] : 736574732f6173736574732f646f6d61696e732f6d657461646174612f353931
Arg [19] : 34342f0000000000000000000000000000000000000000000000000000000000
Arg [20] : 0000000000000000000000000000000000000000000000000000000000000050
Arg [21] : 68747470733a2f2f6170692e627269636b736d696e742e636f6d2f6e732d6173
Arg [22] : 736574732f6173736574732f646f6d61696e732f636f6e74726163742f353931
Arg [23] : 34342f636f6e74726163742e6a736f6e00000000000000000000000000000000
Arg [24] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [25] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [26] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [27] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [28] : 0000000000000000000000000000000000000000000000000011c37937e08000
Arg [29] : 0000000000000000000000000000000000000000000000000005543df729c000


Deployed Bytecode Sourcemap

66956:12978:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47227:305;;;;;;;;;;-1:-1:-1;47227:305:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;47227:305:0;;;;;;;;50342:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;67143:47::-;;;;;;;;;;-1:-1:-1;67143:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;1679:25:1;;;1667:2;1652:18;67143:47:0;1533:177:1;51854:204:0;;;;;;;;;;-1:-1:-1;51854:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1879:32:1;;;1861:51;;1849:2;1834:18;51854:204:0;1715:203:1;51416:372:0;;;;;;;;;;-1:-1:-1;51416:372:0;;;;;:::i;:::-;;:::i;:::-;;45170:48;;;;;;;;;;-1:-1:-1;45170:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;70327:566;;;;;;:::i;:::-;;:::i;46467:312::-;;;;;;;;;;-1:-1:-1;46730:12:0;;46520:7;46714:13;:28;-1:-1:-1;;46714:46:0;46467:312;;76735:644;;;;;;;;;;-1:-1:-1;76735:644:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;76028:699::-;;;;;;;;;;-1:-1:-1;76028:699:0;;;;;:::i;:::-;;:::i;72377:120::-;;;;;;;;;;-1:-1:-1;72377:120:0;;;;;:::i;:::-;;:::i;52719:170::-;;;;;;;;;;-1:-1:-1;52719:170:0;;;;;:::i;:::-;;:::i;74471:751::-;;;;;;:::i;:::-;;:::i;67659:24::-;;;;;;;;;;-1:-1:-1;67659:24:0;;;;-1:-1:-1;;;;;67659:24:0;;;67270:29;;;;;;;;;;;;;;;;67199:28;;;;;;;;;;;;;;;;79780:151;;;;;;;;;;;;;:::i;52960:185::-;;;;;;;;;;-1:-1:-1;52960:185:0;;;;;:::i;:::-;;:::i;71560:113::-;;;;;;;;;;-1:-1:-1;71560:113:0;;;;;:::i;:::-;;:::i;50150:125::-;;;;;;;;;;-1:-1:-1;50150:125:0;;;;;:::i;:::-;;:::i;75230:790::-;;;;;;:::i;:::-;;:::i;45078:48::-;;;;;;;;;;-1:-1:-1;45078:48:0;;;;;:::i;:::-;;:::i;47596:206::-;;;;;;;;;;-1:-1:-1;47596:206:0;;;;;:::i;:::-;;:::i;23229:103::-;;;;;;;;;;;;;:::i;69536:510::-;;;;;;;;;;-1:-1:-1;69536:510:0;;;;;:::i;:::-;;:::i;79291:162::-;;;;;;;;;;-1:-1:-1;79291:162:0;;;;;:::i;:::-;;:::i;79461:311::-;;;;;;;;;;-1:-1:-1;79461:311:0;;;;;:::i;:::-;;:::i;67463:48::-;;;;;;;;;;-1:-1:-1;67463:48:0;;;;;:::i;:::-;;:::i;22578:87::-;;;;;;;;;;-1:-1:-1;22651:6:0;;-1:-1:-1;;;;;22651:6:0;22578:87;;71922:319;;;;;;;;;;-1:-1:-1;71922:319:0;;;;;:::i;:::-;;:::i;71785:129::-;;;;;;;;;;-1:-1:-1;71785:129:0;;;;;:::i;:::-;;:::i;50511:104::-;;;;;;;;;;;;;:::i;77387:527::-;;;;;;;;;;-1:-1:-1;77387:527:0;;;;;:::i;:::-;;:::i;67057:29::-;;;;;;;;;;-1:-1:-1;67057:29:0;;;;;;;;;;;11061:4:1;11049:17;;;11031:36;;11019:2;11004:18;67057:29:0;10889:184:1;67234:29:0;;;;;;;;;;;;;;;;52130:287;;;;;;;;;;-1:-1:-1;52130:287:0;;;;;:::i;:::-;;:::i;72249:120::-;;;;;;;;;;-1:-1:-1;72249:120:0;;;;;:::i;:::-;;:::i;71180:372::-;;;;;;;;;;-1:-1:-1;71180:372:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;74109:354::-;;;;;;;;;;-1:-1:-1;74109:354:0;;;;;:::i;:::-;;:::i;77922:1022::-;;;;;;;;;;-1:-1:-1;77922:1022:0;;;;;:::i;:::-;;:::i;67408:48::-;;;;;;;;;;-1:-1:-1;67408:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67408:48:0;;;53216:370;;;;;;;;;;-1:-1:-1;53216:370:0;;;;;:::i;:::-;;:::i;71011:161::-;;;;;;;;;;-1:-1:-1;71011:161:0;;;;;:::i;:::-;;:::i;70054:265::-;;;;;;;;;;-1:-1:-1;70054:265:0;;;;;:::i;:::-;;:::i;50686:326::-;;;;;;;;;;-1:-1:-1;50686:326:0;;;;;:::i;:::-;;:::i;68908:390::-;;;;;;;;;;-1:-1:-1;68908:390:0;;;;;:::i;:::-;;:::i;71681:96::-;;;;;;;;;;-1:-1:-1;71681:96:0;;;;;:::i;:::-;;:::i;72505:118::-;;;;;;;;;;-1:-1:-1;72505:118:0;;;;;:::i;:::-;;:::i;69427:97::-;;;;;;;;;;;;;:::i;52488:164::-;;;;;;;;;;-1:-1:-1;52488:164:0;;;;;:::i;:::-;;:::i;72631:242::-;;;;;;;;;;-1:-1:-1;72631:242:0;;;;;:::i;:::-;;:::i;67520:63::-;;;;;;;;;;-1:-1:-1;67520:63:0;;;;;:::i;:::-;;:::i;23487:201::-;;;;;;;;;;-1:-1:-1;23487:201:0;;;;;:::i;:::-;;:::i;72881:1163::-;;;;;;:::i;:::-;;:::i;70901:102::-;;;;;;;;;;-1:-1:-1;70901:102:0;;;;;:::i;:::-;;:::i;78952:331::-;;;;;;;;;;-1:-1:-1;78952:331:0;;;;;:::i;:::-;;:::i;47227:305::-;47329:4;-1:-1:-1;;;;;;47366:40:0;;-1:-1:-1;;;47366:40:0;;:105;;-1:-1:-1;;;;;;;47423:48:0;;-1:-1:-1;;;47423:48:0;47366:105;:158;;;-1:-1:-1;;;;;;;;;;35494:40:0;;;47488:36;47346:178;47227:305;-1:-1:-1;;47227:305:0:o;50342:100::-;50396:13;50429:5;50422:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50342:100;:::o;51854:204::-;51922:7;51947:16;51955:7;51947;:16::i;:::-;51942:64;;51972:34;;-1:-1:-1;;;51972:34:0;;;;;;;;;;;51942:64;-1:-1:-1;52026:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;52026:24:0;;51854:204::o;51416:372::-;51489:13;51505:24;51521:7;51505:15;:24::i;:::-;51489:40;;51550:5;-1:-1:-1;;;;;51544:11:0;:2;-1:-1:-1;;;;;51544:11:0;;51540:48;;51564:24;;-1:-1:-1;;;51564:24:0;;;;;;;;;;;51540:48;21382:10;-1:-1:-1;;;;;51605:21:0;;;51601:139;;51632:37;51649:5;21382:10;52488:164;:::i;51632:37::-;51628:112;;51693:35;;-1:-1:-1;;;51693:35:0;;;;;;;;;;;51628:112;51752:28;51761:2;51765:7;51774:5;51752:8;:28::i;:::-;51478:310;51416:372;;:::o;70327:566::-;70470:13;;70457:9;:26;;70449:57;;;;-1:-1:-1;;;70449:57:0;;15124:2:1;70449:57:0;;;15106:21:1;15163:2;15143:18;;;15136:30;-1:-1:-1;;;15182:18:1;;;15175:48;15240:18;;70449:57:0;;;;;;;;;70567:31;70601:40;70614:17;70632:7;;70614:26;;;;;;;:::i;:::-;;;;;;;;;;;;;;70601:12;:40::i;:::-;70656:14;;70567:74;;-1:-1:-1;;;;;;70656:28:0;70674:10;70656:28;70652:53;;70686:19;;-1:-1:-1;;;70686:19:0;;;;;;;:::i;70652:53::-;70748:7;70716:11;70728:7;;70716:20;;;;;;;:::i;:::-;;;;;;;;;;;;;70737:7;;70716:29;;;;;;;:::i;:::-;;;;;;;;;;;;;:39;;;;;;:::i;:::-;;70769:12;70795:7;22651:6;;-1:-1:-1;;;;;22651:6:0;;22578:87;70795:7;-1:-1:-1;;;;;70787:21:0;70816:9;70787:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70768:62;;;70849:7;70841:44;;;;-1:-1:-1;;;70841:44:0;;;;;;;:::i;:::-;70438:455;;70327:566;;;;;:::o;76735:644::-;46730:12;;76855:13;46714;76822:15;;-1:-1:-1;;46714:28:0;;:46;76899:13;;;76895:59;;;76937:5;76929:13;;76895:59;76966:29;77011:5;-1:-1:-1;;;;;76998:19:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;76966:51:0;-1:-1:-1;77028:17:0;77048:13;77056:5;77048;:13;:::i;:::-;77028:33;-1:-1:-1;77072:23:0;77112:35;77175:9;77167:5;:17;77160:179;;;77248:24;;;;:17;:24;;;;;;;;;77234:39;;;;77248:24;77234:39;;:::i;:::-;;;;;;;;;;;;;77201:13;77215:15;77201:30;;;;;;;;:::i;:::-;;;;;;:72;;;;77288:17;;;;:::i;:::-;;-1:-1:-1;77320:7:0;;;:::i;:::-;;;77160:179;;;-1:-1:-1;77358:13:0;;76735:644;-1:-1:-1;;;;76735:644:0:o;76028:699::-;76090:15;76118:23;76144:17;76154:6;76144:9;:17::i;:::-;76118:43;;76174:29;76219:15;-1:-1:-1;;;;;76206:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;76174:61:0;-1:-1:-1;76271:1:0;76246:22;76323:364;76348:15;76330;:33;76323:364;;;76380:25;76408:23;76416:14;76408:7;:23::i;:::-;76380:51;;76473:6;-1:-1:-1;;;;;76452:27:0;:17;-1:-1:-1;;;;;76452:27:0;;76448:195;;76547:33;;;;:17;:33;;;;;;;;;76533:56;;;;76547:33;76582:6;;76533:56;;:::i;:::-;;;;;;;;;;;;;76500:13;76514:15;76500:30;;;;;;;;:::i;:::-;;;;;;:89;;;;76610:17;;;;:::i;:::-;;;76448:195;76659:16;;;:::i;:::-;;;76365:322;76323:364;;72377:120;22651:6;;-1:-1:-1;;;;;22651:6:0;21382:10;22798:23;22790:68;;;;-1:-1:-1;;;22790:68:0;;;;;;;:::i;:::-;72457:14:::1;:32:::0;72377:120::o;52719:170::-;52853:28;52863:4;52869:2;52873:7;52853:9;:28::i;74471:751::-;74557:14;;74544:9;:27;;74536:59;;;;-1:-1:-1;;;74536:59:0;;;;;;;:::i;:::-;74625:9;-1:-1:-1;;;;;74651:21:0;;74667:4;74651:21;74647:439;;74689:14;74706:38;74724:14;;74740:3;74706:17;:38::i;:::-;74689:55;;74759:16;74778:34;74807:4;74778:28;:34::i;:::-;74759:53;;;;74829:17;74849:35;74867:6;74875:8;74849:17;:35::i;:::-;74829:55;;74902:13;74921:4;-1:-1:-1;;;;;74921:9:0;74938;74921:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74901:51;;;74975:8;74967:45;;;;-1:-1:-1;;;74967:45:0;;;;;;;:::i;:::-;75038:36;75056:6;75064:9;75038:17;:36::i;:::-;75029:45;;74674:412;;;;74647:439;75099:13;75126:7;22651:6;;-1:-1:-1;;;;;22651:6:0;;22578:87;75126:7;-1:-1:-1;;;;;75118:21:0;75147:6;75118:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75098:60;;;75177:8;75169:45;;;;-1:-1:-1;;;75169:45:0;;;;;;;:::i;79780:151::-;22651:6;;-1:-1:-1;;;;;22651:6:0;21382:10;22798:23;22790:68;;;;-1:-1:-1;;;22790:68:0;;;;;;;:::i;:::-;79847:49:::1;::::0;79829:12:::1;::::0;79847:10:::1;::::0;79870:21:::1;::::0;79829:12;79847:49;79829:12;79847:49;79870:21;79847:10;:49:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79828:68;;;79915:7;79907:16;;;::::0;::::1;;79817:114;79780:151::o:0;52960:185::-;53098:39;53115:4;53121:2;53125:7;53098:39;;;;;;;;;;;;:16;:39::i;71560:113::-;22651:6;;-1:-1:-1;;;;;22651:6:0;21382:10;22798:23;22790:68;;;;-1:-1:-1;;;22790:68:0;;;;;;;:::i;:::-;71640:8:::1;:25;71651:14:::0;71640:8;:25:::1;:::i;:::-;;71560:113:::0;:::o;50150:125::-;50214:7;50241:21;50254:7;50241:12;:21::i;:::-;:26;;50150:125;-1:-1:-1;;50150:125:0:o;75230:790::-;75327:24;75368:5;75380:7;75354:34;;;;;;;;;:::i;:::-;;;;;;;;;;;;;75327:61;;75409:17;75427:10;75409:29;;;;;;:::i;:::-;;;;;;;;;;;;;;75442:1;75409:34;75401:68;;;;-1:-1:-1;;;75401:68:0;;;;;;;:::i;:::-;75501:14;;75488:9;:27;;75480:59;;;;-1:-1:-1;;;75480:59:0;;;;;;;:::i;:::-;75552:31;75586:40;75599:17;75617:7;75599:26;;;;;;:::i;75586:40::-;75641:14;;75552:74;;-1:-1:-1;;;;;;75641:28:0;75659:10;75641:28;75637:53;;75671:19;;-1:-1:-1;;;75671:19:0;;;;;;;:::i;75637:53::-;75711:34;75734:10;75711:22;:34::i;:::-;75703:58;;;;-1:-1:-1;;;75703:58:0;;23064:2:1;75703:58:0;;;23046:21:1;23103:2;23083:18;;;23076:30;-1:-1:-1;;;23122:18:1;;;23115:41;23173:18;;75703:58:0;22862:335:1;75703:58:0;75838:14;75853:7;75838:23;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;75838:23:0;;75809:14;;:26;;75824:10;;75809:26;:::i;:::-;;;;;;;;;;;;;;;;:52;;-1:-1:-1;;;;;;75809:52:0;-1:-1:-1;;;;;75809:52:0;;;;;;;;;;;-1:-1:-1;75892:13:0;;75874:32;;-1:-1:-1;75874:32:0;;;;:45;75909:10;75874:32;:45;:::i;:::-;;75962:13;;75930:17;75948:10;75930:29;;;;;;:::i;:::-;;;;;;;;;;;;;;:45;75988:24;75998:10;76010:1;75988:9;:24::i;:::-;75316:704;;75230:790;;:::o;45078:48::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47596:206::-;47660:7;-1:-1:-1;;;;;47684:19:0;;47680:60;;47712:28;;-1:-1:-1;;;47712:28:0;;;;;;;;;;;47680:60;-1:-1:-1;;;;;;47766:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;47766:27:0;;47596:206::o;23229:103::-;22651:6;;-1:-1:-1;;;;;22651:6:0;21382:10;22798:23;22790:68;;;;-1:-1:-1;;;22790:68:0;;;;;;;:::i;:::-;23294:30:::1;23321:1;23294:18;:30::i;:::-;23229:103::o:0;69536:510::-;69624:31;69658:40;69671:17;69689:7;;69671:26;;;;;;;:::i;69658:40::-;69713:14;;69624:74;;-1:-1:-1;;;;;;69713:28:0;69731:10;69713:28;69709:53;;69743:19;;-1:-1:-1;;;69743:19:0;;;;;;;:::i;69709:53::-;69775:19;69803:14;:39;69818:14;69833:7;;69818:23;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;69818:23:0;69803:39;;;;;;;;;;-1:-1:-1;69803:39:0;69775:68;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69899:7;;69883:25;;;;;;;:::i;:::-;;;;;;;;69872:6;69862:17;;;;;;:46;69858:129;;69929:42;;;;;;;;;;;;:14;:39;69944:14;69959:7;;69944:23;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;69944:23:0;69929:39;;;;;;;;;;-1:-1:-1;69929:39:0;;:42;;:39;:42;:::i;:::-;;69858:129;70026:12;70001:14;70016:6;70001:22;;;;;;:::i;:::-;;;;;;;;;;;;;;:37;;-1:-1:-1;;;;;70001:37:0;;;;-1:-1:-1;;;;;;70001:37:0;;;;;;;;;-1:-1:-1;;;;;69536:510:0:o;79291:162::-;22651:6;;-1:-1:-1;;;;;22651:6:0;21382:10;22798:23;22790:68;;;;-1:-1:-1;;;22790:68:0;;;;;;;:::i;:::-;79377:3:::1;79369:5;:11;;;79361:20;;;::::0;::::1;;79408:1;79400:5;:9;;;79392:18;;;::::0;::::1;;79421:16;:24:::0;;-1:-1:-1;;79421:24:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;79291:162::o;79461:311::-;79598:11;:18;79578:9;:16;:38;79570:63;;;;-1:-1:-1;;;79570:63:0;;23680:2:1;79570:63:0;;;23662:21:1;23719:2;23699:18;;;23692:30;-1:-1:-1;;;23738:18:1;;;23731:42;23790:18;;79570:63:0;23478:336:1;79570:63:0;79651:6;79646:119;79667:9;:16;79663:1;:20;79646:119;;;79739:11;79751:1;79739:14;;;;;;;;:::i;:::-;;;;;;;79705:17;:31;79723:9;79733:1;79723:12;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;79705:31:0;-1:-1:-1;;;;;79705:31:0;;;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;79685:3;;;;;:::i;:::-;;;;79646:119;;67463:48;;;;;;;;;;;;;;;;:::i;71922:319::-;22651:6;;-1:-1:-1;;;;;22651:6:0;21382:10;22798:23;22790:68;;;;-1:-1:-1;;;22790:68:0;;;;;;;:::i;:::-;72069:35;;::::1;72061:44;;;::::0;::::1;;72120:6;72116:118;72132:22:::0;;::::1;72116:118;;;72207:15;::::0;;;:12:::1;:15;::::0;;;;;;;;72189:11;;72220:1;72189:14;;::::1;;;;;:::i;:::-;;;;;;;72176:28;;;;;;;;;;;:46;;;;72156:3;;;;;:::i;:::-;;;;72116:118;;;;71922:319:::0;;;;:::o;71785:129::-;22651:6;;-1:-1:-1;;;;;22651:6:0;21382:10;22798:23;22790:68;;;;-1:-1:-1;;;22790:68:0;;;;;;;:::i;:::-;71873:12:::1;:33;71888:18:::0;71873:12;:33:::1;:::i;50511:104::-:0;50567:13;50600:7;50593:14;;;;;:::i;77387:527::-;77579:9;77550:39;;77451:4;;;;77533:5;;77451:4;;77550:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77606:6;77602:225;77620:10;:17;77616:1;:21;77602:225;;;77661:6;77657:159;77675:7;:14;77671:1;:18;77657:159;;;77730:7;77738:1;77730:10;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;77715:25:0;;:10;77726:1;77715:13;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;77715:13:0;:25;77712:81;;77761:14;;;:::i;:::-;;;77712:81;77691:3;;;;:::i;:::-;;;;77657:159;;;-1:-1:-1;77639:3:0;;;;:::i;:::-;;;;77602:225;;;;77861:10;:17;77845:12;:33;77844:62;;;;;77904:1;77884:10;:17;:21;77844:62;77837:69;77387:527;-1:-1:-1;;;;;77387:527:0:o;52130:287::-;21382:10;-1:-1:-1;;;;;52229:24:0;;;52225:54;;52262:17;;-1:-1:-1;;;52262:17:0;;;;;;;;;;;52225:54;21382:10;52292:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;52292:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;52292:53:0;;;;;;;;;;52361:48;;540:41:1;;;52292:42:0;;21382:10;52361:48;;513:18:1;52361:48:0;;;;;;;52130:287;;:::o;72249:120::-;22651:6;;-1:-1:-1;;;;;22651:6:0;21382:10;22798:23;22790:68;;;;-1:-1:-1;;;22790:68:0;;;;;;;:::i;:::-;72329:14:::1;:32:::0;72249:120::o;71180:372::-;71277:13;71292;71307;71322;71373:11;71385:7;71373:20;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;24021:21:1;;71373:20:0;24067:1:1;24058:11;71373:30:0;;;;;;;;;;;;71416:11;71428:7;71416:20;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;24282:18:1;;71416:20:0;24325:1:1;24316:11;71416:27:0;;;;;;;;;;;;71456:11;71468:7;71456:20;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;24540:26:1;;71456:20:0;24591:2:1;24582:12;71456:35:0;;;;;;;;;;;;71504:11;71516:7;71504:20;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;24807:20:1;;71504::0;24852:1:1;24843:11;71504:29:0;;;;;;;;;;;;71353:191;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71180:372;;;;;:::o;74109:354::-;67825:9;;-1:-1:-1;;;;;67825:9:0;21382:10;67825:25;67817:65;;;;-1:-1:-1;;;67817:65:0;;25067:2:1;67817:65:0;;;25049:21:1;25106:2;25086:18;;;25079:30;25145:29;25125:18;;;25118:57;25192:18;;67817:65:0;24865:351:1;67817:65:0;74208:17:::1;74226:5;74208:24;;;;;;:::i;:::-;;;;;;;;;;;;;;74236:1;74208:29;74200:63;;;;-1:-1:-1::0;;;74200:63:0::1;;;;;;;:::i;:::-;74282:20;74296:5;74282:13;:20::i;:::-;74274:44;;;::::0;-1:-1:-1;;;74274:44:0;;25423:2:1;74274:44:0::1;::::0;::::1;25405:21:1::0;25462:2;25442:18;;;25435:30;-1:-1:-1;;;25481:18:1;;;25474:41;25532:18;;74274:44:0::1;25221:335:1::0;74274:44:0::1;74331:32;74349:13:::0;;74331:32;;:17:::1;:32;::::0;;;;:40:::1;74366:5:::0;74331:32;:40:::1;:::i;:::-;;74409:13;;74382:17;74400:5;74382:24;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:40;74435:20:::1;74445:6:::0;74453:1:::1;74435:9;:20::i;77922:1022::-:0;78125:9;78096:39;;77995:4;;;;78077:5;;77995:4;;78096:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78146:23;78182:7;:14;78199:1;78182:18;;;;:::i;:::-;-1:-1:-1;;;;;78172:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;78172:29:0;;78146:55;;78217:6;78212:95;78233:7;:14;78229:1;:18;78212:95;;;78285:7;78293:1;78285:10;;;;;;;;:::i;:::-;;;;;;;;;78269;78280:1;78269:13;;;;;;;;:::i;:::-;;;;:26;-1:-1:-1;;;;;78269:26:0;;;;;;;;-1:-1:-1;78249:3:0;;;;:::i;:::-;;;;78212:95;;;;78346:4;78317:33;;:10;78328:7;:14;78317:26;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;78317:33:0;;;;;;;;;78371:10;78361:20;;78398:6;78394:215;78412:10;:17;78408:1;:21;78394:215;;;78450:6;78446:152;78464:7;:14;78460:1;:18;78446:152;;;78517:7;78525:1;78517:10;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;78502:25:0;;:10;78513:1;78502:13;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;78502:13:0;:25;78499:79;;78548:14;;;:::i;:::-;;;78499:79;78480:3;;;;:::i;:::-;;;;78446:152;;;-1:-1:-1;78431:3:0;;;;:::i;:::-;;;;78394:215;;;;78625:10;78636:1;78625:13;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;;;;78625:13:0;-1:-1:-1;;;78625:21:0;;:66;;;78650:10;78681:1;78661:10;:17;:21;;;;:::i;:::-;78650:33;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;;;;78650:33:0;-1:-1:-1;;;78650:41:0;78625:66;78621:111;;;-1:-1:-1;78715:5:0;;77922:1022;-1:-1:-1;;;;;77922:1022:0:o;78621:111::-;78748:10;78759:1;78748:13;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;;;;78748:13:0;-1:-1:-1;;;78748:21:0;;:66;;;78773:10;78804:1;78784:10;:17;:21;;;;:::i;:::-;78773:33;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;;;;78773:33:0;-1:-1:-1;;;78773:41:0;78748:66;78744:111;;;-1:-1:-1;78838:5:0;;77922:1022;-1:-1:-1;;;;;77922:1022:0:o;78744:111::-;78891:10;:17;78875:12;:33;78874:62;;;;;78934:1;78914:10;:17;:21;78874:62;78867:69;77922:1022;-1:-1:-1;;;;;;77922:1022:0:o;53216:370::-;53383:28;53393:4;53399:2;53403:7;53383:9;:28::i;:::-;-1:-1:-1;;;;;53426:13:0;;25574:19;:23;53422:157;;53447:56;53478:4;53484:2;53488:7;53497:5;53447:30;:56::i;:::-;53443:136;;53527:40;;-1:-1:-1;;;53527:40:0;;;;;;;;;;;71011:161;71102:13;71135:11;71147:7;71135:20;;;;;;:::i;:::-;;;;;;;;;;;;;71156:7;;71135:29;;;;;;;:::i;:::-;;;;;;;;;;;;;71128:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71011:161;;;;;:::o;70054:265::-;70126:31;70160:40;70173:17;70191:7;;70173:26;;;;;;;:::i;70160:40::-;70215:14;;70126:74;;-1:-1:-1;;;;;;70215:28:0;70233:10;70215:28;70211:53;;70245:19;;-1:-1:-1;;;70245:19:0;;;;;;;:::i;70211:53::-;70290:10;70275:26;;;;:14;:26;;;;;:36;70304:7;;70275:26;:36;:::i;50686:326::-;50759:13;50790:16;50798:7;50790;:16::i;:::-;50785:59;;50815:29;;-1:-1:-1;;;50815:29:0;;;;;;;;;;;50785:59;50857:21;50881:10;:8;:10::i;:::-;50857:34;;50915:7;50909:21;50934:1;50909:26;:95;;;;;;;;;;;;;;;;;50962:7;50971:17;:26;50989:7;50971:26;;;;;;;;;;;50945:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50909:95;50902:102;50686:326;-1:-1:-1;;;50686:326:0:o;68908:390::-;68975:17;69044:4;-1:-1:-1;;;;;69009:40:0;:14;69024:7;69009:23;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;69009:23:0;:40;69005:259;;69066:31;69100:40;69113:17;69131:7;69113:26;;;;;;:::i;69100:40::-;69167:14;;-1:-1:-1;69005:259:0;;-1:-1:-1;69005:259:0;;69226:14;69241:7;69226:23;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;69226:23:0;;-1:-1:-1;69005:259:0;68908:390;;;:::o;71681:96::-;22651:6;;-1:-1:-1;;;;;22651:6:0;21382:10;22798:23;22790:68;;;;-1:-1:-1;;;22790:68:0;;;;;;;:::i;:::-;71753:6:::1;:16;71762:7:::0;71753:6;:16:::1;:::i;72505:118::-:0;22651:6;;-1:-1:-1;;;;;22651:6:0;21382:10;22798:23;22790:68;;;;-1:-1:-1;;;22790:68:0;;;;;;;:::i;:::-;72585:13:::1;:30:::0;72505:118::o;69427:97::-;69471:13;69504:12;69497:19;;;;;:::i;52488:164::-;-1:-1:-1;;;;;52609:25:0;;;52585:4;52609:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;52488:164::o;72631:242::-;72699:7;72736:27;;;:12;:27;;;;;;72778:11;;;72774:68;;-1:-1:-1;;72828:1:0;72815:15;;-1:-1:-1;72815:12:0;:15;;;;;72631:242::o;67520:63::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;23487:201::-;22651:6;;-1:-1:-1;;;;;22651:6:0;21382:10;22798:23;22790:68;;;;-1:-1:-1;;;22790:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23576:22:0;::::1;23568:73;;;::::0;-1:-1:-1;;;23568:73:0;;27478:2:1;23568:73:0::1;::::0;::::1;27460:21:1::0;27517:2;27497:18;;;27490:30;27556:34;27536:18;;;27529:62;-1:-1:-1;;;27607:18:1;;;27600:36;27653:19;;23568:73:0::1;27276:402:1::0;23568:73:0::1;23652:28;23671:8;23652:18;:28::i;72881:1163::-:0;72974:17;72992:5;72974:24;;;;;;:::i;:::-;;;;;;;;;;;;;;73002:1;72974:29;72966:63;;;;-1:-1:-1;;;72966:63:0;;;;;;;:::i;:::-;73048:20;73062:5;73048:13;:20::i;:::-;73040:44;;;;-1:-1:-1;;;73040:44:0;;25423:2:1;73040:44:0;;;25405:21:1;25462:2;25442:18;;;25435:30;-1:-1:-1;;;25481:18:1;;;25474:41;25532:18;;73040:44:0;25221:335:1;73040:44:0;73126:19;;73097:13;73113:33;;;:12;:33;;;;;;;73161:10;;;73157:66;;-1:-1:-1;73209:1:0;73196:15;;:12;:15;;;;73157:66;73256:5;73243:9;:18;;73235:50;;;;-1:-1:-1;;;73235:50:0;;;;;;;:::i;:::-;73315:9;-1:-1:-1;;;;;73341:21:0;;73357:4;73341:21;73337:430;;73379:14;73396:29;73414:5;73421:3;73396:17;:29::i;:::-;73379:46;;73440:16;73459:34;73488:4;73459:28;:34::i;:::-;73440:53;;;;73510:17;73530:35;73548:6;73556:8;73530:17;:35::i;:::-;73510:55;;73583:13;73602:4;-1:-1:-1;;;;;73602:9:0;73619;73602:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73582:51;;;73656:8;73648:45;;;;-1:-1:-1;;;73648:45:0;;;;;;;:::i;:::-;73719:36;73737:6;73745:9;73719:17;:36::i;:::-;73710:45;;73364:403;;;;73337:430;73780:13;73807:7;22651:6;;-1:-1:-1;;;;;22651:6:0;;22578:87;73807:7;-1:-1:-1;;;;;73799:21:0;73828:6;73799:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73779:60;;;73858:8;73850:45;;;;-1:-1:-1;;;73850:45:0;;;;;;;:::i;:::-;73908:32;73926:13;;73908:32;;:17;:32;;;;;:40;73943:5;73908:32;:40;:::i;:::-;;73986:13;;73959:17;73977:5;73959:24;;;;;;:::i;:::-;;;;;;;;;;;;;;:40;74012:24;74022:10;74034:1;74012:9;:24::i;70901:102::-;22651:6;;-1:-1:-1;;;;;22651:6:0;21382:10;22798:23;22790:68;;;;-1:-1:-1;;;22790:68:0;;;;;;;:::i;:::-;70973:9:::1;:22:::0;;-1:-1:-1;;;;;;70973:22:0::1;-1:-1:-1::0;;;;;70973:22:0;;;::::1;::::0;;;::::1;::::0;;70901:102::o;78952:331::-;-1:-1:-1;;;;;79060:23:0;;79025:5;79060:23;;;:17;:23;;;;;;;;79163:13;;;79159:117;;-1:-1:-1;;79200:16:0;;;;;78952:331;-1:-1:-1;78952:331:0:o;79159:117::-;79032:251;78952:331;;;:::o;25279:326::-;-1:-1:-1;;;;;25574:19:0;;:23;;;25279:326::o;53841:174::-;53898:4;53941:7;46324:1;53922:26;;:53;;;;;53962:13;;53952:7;:23;53922:53;:85;;;;-1:-1:-1;;53980:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;53980:27:0;;;;53979:28;;53841:174::o;63077:196::-;63192:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;63192:29:0;-1:-1:-1;;;;;63192:29:0;;;;;;;;;63237:28;;63192:24;;63237:28;;;;;;;63077:196;;;:::o;48977:1111::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;49088:7:0;;46324:1;49137:23;49133:888;;49173:13;;49166:4;:20;49162:859;;;49207:31;49241:17;;;:11;:17;;;;;;;;;49207:51;;;;;;;;;-1:-1:-1;;;;;49207:51:0;;;;-1:-1:-1;;;49207:51:0;;-1:-1:-1;;;;;49207:51:0;;;;;;;;-1:-1:-1;;;49207:51:0;;;;;;;;;;;;;;49277:729;;49327:14;;-1:-1:-1;;;;;49327:28:0;;49323:101;;49391:9;48977:1111;-1:-1:-1;;;48977:1111:0:o;49323:101::-;-1:-1:-1;;;49766:6:0;49811:17;;;;:11;:17;;;;;;;;;49799:29;;;;;;;;;-1:-1:-1;;;;;49799:29:0;;;;;-1:-1:-1;;;49799:29:0;;-1:-1:-1;;;;;49799:29:0;;;;;;;;-1:-1:-1;;;49799:29:0;;;;;;;;;;;;;49859:28;49855:109;;49927:9;48977:1111;-1:-1:-1;;;48977:1111:0:o;49855:109::-;49726:261;;;49188:833;49162:859;50049:31;;-1:-1:-1;;;50049:31:0;;;;;;;;;;;58011:2144;58126:35;58164:21;58177:7;58164:12;:21::i;:::-;58126:59;;58224:4;-1:-1:-1;;;;;58202:26:0;:13;:18;;;-1:-1:-1;;;;;58202:26:0;;58198:67;;58237:28;;-1:-1:-1;;;58237:28:0;;;;;;;;;;;58198:67;58278:22;21382:10;-1:-1:-1;;;;;58304:20:0;;;;:73;;-1:-1:-1;58341:36:0;58358:4;21382:10;52488:164;:::i;58341:36::-;58304:126;;;-1:-1:-1;21382:10:0;58394:20;58406:7;58394:11;:20::i;:::-;-1:-1:-1;;;;;58394:36:0;;58304:126;58278:153;;58449:17;58444:66;;58475:35;;-1:-1:-1;;;58475:35:0;;;;;;;;;;;58444:66;-1:-1:-1;;;;;58525:16:0;;58521:52;;58550:23;;-1:-1:-1;;;58550:23:0;;;;;;;;;;;58521:52;58694:35;58711:1;58715:7;58724:4;58694:8;:35::i;:::-;-1:-1:-1;;;;;59025:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;59025:31:0;;;-1:-1:-1;;;;;59025:31:0;;;-1:-1:-1;;59025:31:0;;;;;;;59071:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;59071:29:0;;;;;;;;;;;59151:20;;;:11;:20;;;;;;59186:18;;-1:-1:-1;;;;;;59219:49:0;;;;-1:-1:-1;;;59252:15:0;59219:49;;;;;;;;;;59556:11;;59616:24;;;;;59659:13;;59151:20;;59616:24;;59659:13;59655:384;;59869:13;;59854:11;:28;59850:174;;59907:20;;59976:28;;;;-1:-1:-1;;;;;59950:54:0;-1:-1:-1;;;59950:54:0;-1:-1:-1;;;;;;59950:54:0;;;-1:-1:-1;;;;;59907:20:0;;59950:54;;;;59850:174;59000:1050;;;60086:7;60082:2;-1:-1:-1;;;;;60067:27:0;60076:4;-1:-1:-1;;;;;60067:27:0;;;;;;;;;;;60105:42;75230:790;66508:201;66569:7;66590:12;66604:11;66619:17;66631:1;66634;66619:11;:17::i;:::-;66589:47;;;;66655:7;66647:33;;;;-1:-1:-1;;;66647:33:0;;27885:2:1;66647:33:0;;;27867:21:1;27924:2;27904:18;;;27897:30;-1:-1:-1;;;27943:18:1;;;27936:43;27996:18;;66647:33:0;27683:337:1;66647:33:0;66698:3;66508:201;-1:-1:-1;;;;66508:201:0:o;66299:::-;66360:7;66381:12;66395:11;66410:17;66422:1;66425;66410:11;:17::i;:::-;66380:47;;;;66446:7;66438:33;;;;-1:-1:-1;;;66438:33:0;;28227:2:1;66438:33:0;;;28209:21:1;28266:2;28246:18;;;28239:30;-1:-1:-1;;;28285:18:1;;;28278:43;28338:18;;66438:33:0;28025:337:1;66717:201:0;66778:7;66799:12;66813:11;66828:17;66840:1;66843;66828:11;:17::i;:::-;66798:47;;;;66864:7;66856:33;;;;-1:-1:-1;;;66856:33:0;;28569:2:1;66856:33:0;;;28551:21:1;28608:2;28588:18;;;28581:30;-1:-1:-1;;;28627:18:1;;;28620:43;28680:18;;66856:33:0;28367:337:1;54099:104:0;54168:27;54178:2;54182:8;54168:27;;;;;;;;;;;;:9;:27::i;23848:191::-;23941:6;;;-1:-1:-1;;;;;23958:17:0;;;-1:-1:-1;;;;;;23958:17:0;;;;;;;23991:40;;23941:6;;;23958:17;23941:6;;23991:40;;23922:16;;23991:40;23911:128;23848:191;:::o;63765:667::-;63949:72;;-1:-1:-1;;;63949:72:0;;63928:4;;-1:-1:-1;;;;;63949:36:0;;;;;:72;;21382:10;;64000:4;;64006:7;;64015:5;;63949:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63949:72:0;;;;;;;;-1:-1:-1;;63949:72:0;;;;;;;;;;;;:::i;:::-;;;63945:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64183:6;:13;64200:1;64183:18;64179:235;;64229:40;;-1:-1:-1;;;64229:40:0;;;;;;;;;;;64179:235;64372:6;64366:13;64357:6;64353:2;64349:15;64342:38;63945:480;-1:-1:-1;;;;;;64068:55:0;-1:-1:-1;;;64068:55:0;;-1:-1:-1;63765:667:0;;;;;;:::o;69310:109::-;69370:13;69403:8;69396:15;;;;;:::i;1895:195::-;1956:4;1962:7;2011:1;2016;2011:6;2007:29;;-1:-1:-1;2027:5:0;;-1:-1:-1;2027:5:0;2019:17;;2007:29;2059:4;2069:1;2065;:5;;;;;:::i;:::-;;2051:20;;;;1895:195;;;;;;:::o;1276:503::-;1337:4;1343:7;1625:1;1630;1625:6;1621:28;;-1:-1:-1;1641:4:0;;-1:-1:-1;1647:1:0;1633:16;;1621:28;1676:5;;;1680:1;1676;:5;:1;1700:5;;;;:::i;:::-;;:10;1696:33;;1720:5;1727:1;1712:17;;;;;;;1696:33;1752:4;;1758:1;;-1:-1:-1;1276:503:0;-1:-1:-1;;;1276:503:0:o;967:194::-;1028:4;1034:7;1087:1;1083;:5;1079:28;;;-1:-1:-1;1098:5:0;;-1:-1:-1;1098:5:0;1090:17;;1079:28;-1:-1:-1;1130:4:0;;1136:5;;;;;-1:-1:-1;967:194:0:o;54576:1749::-;54699:20;54722:13;-1:-1:-1;;;;;54750:16:0;;54746:48;;54775:19;;-1:-1:-1;;;54775:19:0;;;;;;;;;;;54746:48;54809:8;54821:1;54809:13;54805:44;;54831:18;;-1:-1:-1;;;54831:18:0;;;;;;;;;;;54805:44;-1:-1:-1;;;;;55200:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;55259:49:0;;-1:-1:-1;;;;;55200:44:0;;;;;;;55259:49;;;;-1:-1:-1;;55200:44:0;;;;;;55259:49;;;;;;;;;;;;;;;;55325:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;55375:66:0;;;-1:-1:-1;;;55425:15:0;55375:66;;;;;;;;;;;;;55325:25;;55522:23;;;;25574:19;:23;55562:631;;55602:313;55633:38;;55658:12;;-1:-1:-1;;;;;55633:38:0;;;55650:1;;55633:38;;55650:1;;55633:38;55699:69;55738:1;55742:2;55746:14;;;;;;55762:5;55699:30;:69::i;:::-;55694:174;;55804:40;;-1:-1:-1;;;55804:40:0;;;;;;;;;;;55694:174;55910:3;55895:12;:18;55602:313;;55996:12;55979:13;;:29;55975:43;;56010:8;;;55975:43;55562:631;;;56059:119;56090:40;;56115:14;;;;;-1:-1:-1;;;;;56090:40:0;;;56107:1;;56090:40;;56107:1;;56090:40;56173:3;56158:12;:18;56059:119;;55562:631;-1:-1:-1;56207:13:0;:28;;;56257:60;;56290:2;56294:12;56308:8;56257:60;:::i;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1923:173::-;1991:20;;-1:-1:-1;;;;;2040:31:1;;2030:42;;2020:70;;2086:1;2083;2076:12;2101:254;2169:6;2177;2230:2;2218:9;2209:7;2205:23;2201:32;2198:52;;;2246:1;2243;2236:12;2198:52;2269:29;2288:9;2269:29;:::i;:::-;2259:39;2345:2;2330:18;;;;2317:32;;-1:-1:-1;;;2101:254:1:o;2360:127::-;2421:10;2416:3;2412:20;2409:1;2402:31;2452:4;2449:1;2442:15;2476:4;2473:1;2466:15;2492:275;2563:2;2557:9;2628:2;2609:13;;-1:-1:-1;;2605:27:1;2593:40;;-1:-1:-1;;;;;2648:34:1;;2684:22;;;2645:62;2642:88;;;2710:18;;:::i;:::-;2746:2;2739:22;2492:275;;-1:-1:-1;2492:275:1:o;2772:407::-;2837:5;-1:-1:-1;;;;;2863:6:1;2860:30;2857:56;;;2893:18;;:::i;:::-;2931:57;2976:2;2955:15;;-1:-1:-1;;2951:29:1;2982:4;2947:40;2931:57;:::i;:::-;2922:66;;3011:6;3004:5;2997:21;3051:3;3042:6;3037:3;3033:16;3030:25;3027:45;;;3068:1;3065;3058:12;3027:45;3117:6;3112:3;3105:4;3098:5;3094:16;3081:43;3171:1;3164:4;3155:6;3148:5;3144:18;3140:29;3133:40;2772:407;;;;;:::o;3184:222::-;3227:5;3280:3;3273:4;3265:6;3261:17;3257:27;3247:55;;3298:1;3295;3288:12;3247:55;3320:80;3396:3;3387:6;3374:20;3367:4;3359:6;3355:17;3320:80;:::i;3411:322::-;3480:6;3533:2;3521:9;3512:7;3508:23;3504:32;3501:52;;;3549:1;3546;3539:12;3501:52;3589:9;3576:23;-1:-1:-1;;;;;3614:6:1;3611:30;3608:50;;;3654:1;3651;3644:12;3608:50;3677;3719:7;3710:6;3699:9;3695:22;3677:50;:::i;3738:348::-;3790:8;3800:6;3854:3;3847:4;3839:6;3835:17;3831:27;3821:55;;3872:1;3869;3862:12;3821:55;-1:-1:-1;3895:20:1;;-1:-1:-1;;;;;3927:30:1;;3924:50;;;3970:1;3967;3960:12;3924:50;4007:4;3999:6;3995:17;3983:29;;4059:3;4052:4;4043:6;4035;4031:19;4027:30;4024:39;4021:59;;;4076:1;4073;4066:12;4091:921;4202:6;4210;4218;4226;4234;4287:2;4275:9;4266:7;4262:23;4258:32;4255:52;;;4303:1;4300;4293:12;4255:52;4343:9;4330:23;-1:-1:-1;;;;;4413:2:1;4405:6;4402:14;4399:34;;;4429:1;4426;4419:12;4399:34;4468:59;4519:7;4510:6;4499:9;4495:22;4468:59;:::i;:::-;4546:8;;-1:-1:-1;4442:85:1;-1:-1:-1;4634:2:1;4619:18;;4606:32;;-1:-1:-1;4650:16:1;;;4647:36;;;4679:1;4676;4669:12;4647:36;4718:61;4771:7;4760:8;4749:9;4745:24;4718:61;:::i;:::-;4798:8;;-1:-1:-1;4692:87:1;-1:-1:-1;4886:2:1;4871:18;;4858:32;;-1:-1:-1;4902:16:1;;;4899:36;;;4931:1;4928;4921:12;4899:36;;4954:52;4998:7;4987:8;4976:9;4972:24;4954:52;:::i;:::-;4944:62;;;4091:921;;;;;;;;:::o;5017:803::-;5179:4;5208:2;5248;5237:9;5233:18;5278:2;5267:9;5260:21;5301:6;5336;5330:13;5367:6;5359;5352:22;5405:2;5394:9;5390:18;5383:25;;5467:2;5457:6;5454:1;5450:14;5439:9;5435:30;5431:39;5417:53;;5505:2;5497:6;5493:15;5526:1;5536:255;5550:6;5547:1;5544:13;5536:255;;;5643:2;5639:7;5627:9;5619:6;5615:22;5611:36;5606:3;5599:49;5671:40;5704:6;5695;5689:13;5671:40;:::i;:::-;5661:50;-1:-1:-1;5769:12:1;;;;5734:15;;;;5572:1;5565:9;5536:255;;;-1:-1:-1;5808:6:1;;5017:803;-1:-1:-1;;;;;;;5017:803:1:o;5825:186::-;5884:6;5937:2;5925:9;5916:7;5912:23;5908:32;5905:52;;;5953:1;5950;5943:12;5905:52;5976:29;5995:9;5976:29;:::i;6016:328::-;6093:6;6101;6109;6162:2;6150:9;6141:7;6137:23;6133:32;6130:52;;;6178:1;6175;6168:12;6130:52;6201:29;6220:9;6201:29;:::i;:::-;6191:39;;6249:38;6283:2;6272:9;6268:18;6249:38;:::i;:::-;6239:48;;6334:2;6323:9;6319:18;6306:32;6296:42;;6016:328;;;;;:::o;6349:543::-;6437:6;6445;6498:2;6486:9;6477:7;6473:23;6469:32;6466:52;;;6514:1;6511;6504:12;6466:52;6554:9;6541:23;-1:-1:-1;;;;;6624:2:1;6616:6;6613:14;6610:34;;;6640:1;6637;6630:12;6610:34;6663:50;6705:7;6696:6;6685:9;6681:22;6663:50;:::i;:::-;6653:60;;6766:2;6755:9;6751:18;6738:32;6722:48;;6795:2;6785:8;6782:16;6779:36;;;6811:1;6808;6801:12;6779:36;;6834:52;6878:7;6867:8;6856:9;6852:24;6834:52;:::i;:::-;6824:62;;;6349:543;;;;;:::o;6897:485::-;6977:6;6985;6993;7046:2;7034:9;7025:7;7021:23;7017:32;7014:52;;;7062:1;7059;7052:12;7014:52;7102:9;7089:23;-1:-1:-1;;;;;7127:6:1;7124:30;7121:50;;;7167:1;7164;7157:12;7121:50;7206:59;7257:7;7248:6;7237:9;7233:22;7206:59;:::i;:::-;7284:8;;-1:-1:-1;7180:85:1;-1:-1:-1;7338:38:1;;-1:-1:-1;7372:2:1;7357:18;;7338:38;:::i;:::-;7328:48;;6897:485;;;;;:::o;7387:156::-;7453:20;;7513:4;7502:16;;7492:27;;7482:55;;7533:1;7530;7523:12;7548:182;7605:6;7658:2;7646:9;7637:7;7633:23;7629:32;7626:52;;;7674:1;7671;7664:12;7626:52;7697:27;7714:9;7697:27;:::i;7735:183::-;7795:4;-1:-1:-1;;;;;7820:6:1;7817:30;7814:56;;;7850:18;;:::i;:::-;-1:-1:-1;7895:1:1;7891:14;7907:4;7887:25;;7735:183::o;7923:664::-;7975:5;8028:3;8021:4;8013:6;8009:17;8005:27;7995:55;;8046:1;8043;8036:12;7995:55;8082:6;8069:20;8108:4;8132:60;8148:43;8188:2;8148:43;:::i;:::-;8132:60;:::i;:::-;8226:15;;;8312:1;8308:10;;;;8296:23;;8292:32;;;8257:12;;;;8336:15;;;8333:35;;;8364:1;8361;8354:12;8333:35;8400:2;8392:6;8388:15;8412:146;8428:6;8423:3;8420:15;8412:146;;;8494:21;8511:3;8494:21;:::i;:::-;8482:34;;8536:12;;;;8445;;8412:146;;;-1:-1:-1;8576:5:1;7923:664;-1:-1:-1;;;;;;7923:664:1:o;8592:1142::-;8708:6;8716;8769:2;8757:9;8748:7;8744:23;8740:32;8737:52;;;8785:1;8782;8775:12;8737:52;8825:9;8812:23;-1:-1:-1;;;;;8895:2:1;8887:6;8884:14;8881:34;;;8911:1;8908;8901:12;8881:34;8949:6;8938:9;8934:22;8924:32;;8994:7;8987:4;8983:2;8979:13;8975:27;8965:55;;9016:1;9013;9006:12;8965:55;9052:2;9039:16;9074:4;9098:60;9114:43;9154:2;9114:43;:::i;9098:60::-;9192:15;;;9274:1;9270:10;;;;9262:19;;9258:28;;;9223:12;;;;9298:19;;;9295:39;;;9330:1;9327;9320:12;9295:39;9354:11;;;;9374:148;9390:6;9385:3;9382:15;9374:148;;;9456:23;9475:3;9456:23;:::i;:::-;9444:36;;9407:12;;;;9500;;;;9374:148;;;9541:5;-1:-1:-1;;9584:18:1;;9571:32;;-1:-1:-1;;9615:16:1;;;9612:36;;;9644:1;9641;9634:12;9612:36;;9667:61;9720:7;9709:8;9698:9;9694:24;9667:61;:::i;9739:367::-;9802:8;9812:6;9866:3;9859:4;9851:6;9847:17;9843:27;9833:55;;9884:1;9881;9874:12;9833:55;-1:-1:-1;9907:20:1;;-1:-1:-1;;;;;9939:30:1;;9936:50;;;9982:1;9979;9972:12;9936:50;10019:4;10011:6;10007:17;9995:29;;10079:3;10072:4;10062:6;10059:1;10055:14;10047:6;10043:27;10039:38;10036:47;10033:67;;;10096:1;10093;10086:12;10111:773;10233:6;10241;10249;10257;10310:2;10298:9;10289:7;10285:23;10281:32;10278:52;;;10326:1;10323;10316:12;10278:52;10366:9;10353:23;-1:-1:-1;;;;;10436:2:1;10428:6;10425:14;10422:34;;;10452:1;10449;10442:12;10422:34;10491:70;10553:7;10544:6;10533:9;10529:22;10491:70;:::i;:::-;10580:8;;-1:-1:-1;10465:96:1;-1:-1:-1;10668:2:1;10653:18;;10640:32;;-1:-1:-1;10684:16:1;;;10681:36;;;10713:1;10710;10703:12;10681:36;;10752:72;10816:7;10805:8;10794:9;10790:24;10752:72;:::i;:::-;10111:773;;;;-1:-1:-1;10843:8:1;-1:-1:-1;;;;10111:773:1:o;11078:347::-;11143:6;11151;11204:2;11192:9;11183:7;11179:23;11175:32;11172:52;;;11220:1;11217;11210:12;11172:52;11243:29;11262:9;11243:29;:::i;:::-;11233:39;;11322:2;11311:9;11307:18;11294:32;11369:5;11362:13;11355:21;11348:5;11345:32;11335:60;;11391:1;11388;11381:12;11335:60;11414:5;11404:15;;;11078:347;;;;;:::o;11430:711::-;11723:3;11712:9;11705:22;11686:4;11750:46;11791:3;11780:9;11776:19;11768:6;11750:46;:::i;:::-;11844:9;11836:6;11832:22;11827:2;11816:9;11812:18;11805:50;11878:33;11904:6;11896;11878:33;:::i;:::-;11864:47;;11959:9;11951:6;11947:22;11942:2;11931:9;11927:18;11920:50;11993:33;12019:6;12011;11993:33;:::i;:::-;11979:47;;12074:9;12066:6;12062:22;12057:2;12046:9;12042:18;12035:50;12102:33;12128:6;12120;12102:33;:::i;:::-;12094:41;11430:711;-1:-1:-1;;;;;;;11430:711:1:o;12146:396::-;12224:6;12232;12285:2;12273:9;12264:7;12260:23;12256:32;12253:52;;;12301:1;12298;12291:12;12253:52;12341:9;12328:23;-1:-1:-1;;;;;12366:6:1;12363:30;12360:50;;;12406:1;12403;12396:12;12360:50;12429;12471:7;12462:6;12451:9;12447:22;12429:50;:::i;:::-;12419:60;;;12498:38;12532:2;12521:9;12517:18;12498:38;:::i;:::-;12488:48;;12146:396;;;;;:::o;12547:667::-;12642:6;12650;12658;12666;12719:3;12707:9;12698:7;12694:23;12690:33;12687:53;;;12736:1;12733;12726:12;12687:53;12759:29;12778:9;12759:29;:::i;:::-;12749:39;;12807:38;12841:2;12830:9;12826:18;12807:38;:::i;:::-;12797:48;;12892:2;12881:9;12877:18;12864:32;12854:42;;12947:2;12936:9;12932:18;12919:32;-1:-1:-1;;;;;12966:6:1;12963:30;12960:50;;;13006:1;13003;12996:12;12960:50;13029:22;;13082:4;13074:13;;13070:27;-1:-1:-1;13060:55:1;;13111:1;13108;13101:12;13060:55;13134:74;13200:7;13195:2;13182:16;13177:2;13173;13169:11;13134:74;:::i;:::-;13124:84;;;12547:667;;;;;;;:::o;13219:632::-;13309:6;13317;13325;13378:2;13366:9;13357:7;13353:23;13349:32;13346:52;;;13394:1;13391;13384:12;13346:52;13434:9;13421:23;-1:-1:-1;;;;;13504:2:1;13496:6;13493:14;13490:34;;;13520:1;13517;13510:12;13490:34;13543:50;13585:7;13576:6;13565:9;13561:22;13543:50;:::i;:::-;13533:60;;13646:2;13635:9;13631:18;13618:32;13602:48;;13675:2;13665:8;13662:16;13659:36;;;13691:1;13688;13681:12;13659:36;;13730:61;13783:7;13772:8;13761:9;13757:24;13730:61;:::i;:::-;13219:632;;13810:8;;-1:-1:-1;13704:87:1;;-1:-1:-1;;;;13219:632:1:o;13856:411::-;13927:6;13935;13988:2;13976:9;13967:7;13963:23;13959:32;13956:52;;;14004:1;14001;13994:12;13956:52;14044:9;14031:23;-1:-1:-1;;;;;14069:6:1;14066:30;14063:50;;;14109:1;14106;14099:12;14063:50;14148:59;14199:7;14190:6;14179:9;14175:22;14148:59;:::i;:::-;14226:8;;14122:85;;-1:-1:-1;13856:411:1;-1:-1:-1;;;;13856:411:1:o;14272:260::-;14340:6;14348;14401:2;14389:9;14380:7;14376:23;14372:32;14369:52;;;14417:1;14414;14407:12;14369:52;14440:29;14459:9;14440:29;:::i;:::-;14430:39;;14488:38;14522:2;14511:9;14507:18;14488:38;:::i;14537:380::-;14616:1;14612:12;;;;14659;;;14680:61;;14734:4;14726:6;14722:17;14712:27;;14680:61;14787:2;14779:6;14776:14;14756:18;14753:38;14750:161;;14833:10;14828:3;14824:20;14821:1;14814:31;14868:4;14865:1;14858:15;14896:4;14893:1;14886:15;15269:273;15454:6;15446;15441:3;15428:33;15410:3;15480:16;;15505:13;;;15480:16;15269:273;-1:-1:-1;15269:273:1:o;15547:332::-;15749:2;15731:21;;;15788:1;15768:18;;;15761:29;-1:-1:-1;;;15821:2:1;15806:18;;15799:39;15870:2;15855:18;;15547:332::o;16010:545::-;16112:2;16107:3;16104:11;16101:448;;;16148:1;16173:5;16169:2;16162:17;16218:4;16214:2;16204:19;16288:2;16276:10;16272:19;16269:1;16265:27;16259:4;16255:38;16324:4;16312:10;16309:20;16306:47;;;-1:-1:-1;16347:4:1;16306:47;16402:2;16397:3;16393:12;16390:1;16386:20;16380:4;16376:31;16366:41;;16457:82;16475:2;16468:5;16465:13;16457:82;;;16520:17;;;16501:1;16490:13;16457:82;;;16461:3;;;16010:545;;;:::o;16731:1352::-;16857:3;16851:10;-1:-1:-1;;;;;16876:6:1;16873:30;16870:56;;;16906:18;;:::i;:::-;16935:97;17025:6;16985:38;17017:4;17011:11;16985:38;:::i;:::-;16979:4;16935:97;:::i;:::-;17087:4;;17151:2;17140:14;;17168:1;17163:663;;;;17870:1;17887:6;17884:89;;;-1:-1:-1;17939:19:1;;;17933:26;17884:89;-1:-1:-1;;16688:1:1;16684:11;;;16680:24;16676:29;16666:40;16712:1;16708:11;;;16663:57;17986:81;;17133:944;;17163:663;15957:1;15950:14;;;15994:4;15981:18;;-1:-1:-1;;17199:20:1;;;17317:236;17331:7;17328:1;17325:14;17317:236;;;17420:19;;;17414:26;17399:42;;17512:27;;;;17480:1;17468:14;;;;17347:19;;17317:236;;;17321:3;17581:6;17572:7;17569:19;17566:201;;;17642:19;;;17636:26;-1:-1:-1;;17725:1:1;17721:14;;;17737:3;17717:24;17713:37;17709:42;17694:58;17679:74;;17566:201;-1:-1:-1;;;;;17813:1:1;17797:14;;;17793:22;17780:36;;-1:-1:-1;16731:1352:1:o;18298:348::-;18500:2;18482:21;;;18539:2;18519:18;;;18512:30;18578:26;18573:2;18558:18;;18551:54;18637:2;18622:18;;18298:348::o;18651:127::-;18712:10;18707:3;18703:20;18700:1;18693:31;18743:4;18740:1;18733:15;18767:4;18764:1;18757:15;18783:128;18850:9;;;18871:11;;;18868:37;;;18885:18;;:::i;19251:722::-;19301:3;19342:5;19336:12;19371:36;19397:9;19371:36;:::i;:::-;19426:1;19443:18;;;19470:133;;;;19617:1;19612:355;;;;19436:531;;19470:133;-1:-1:-1;;19503:24:1;;19491:37;;19576:14;;19569:22;19557:35;;19548:45;;;-1:-1:-1;19470:133:1;;19612:355;19643:5;19640:1;19633:16;19672:4;19717:2;19714:1;19704:16;19742:1;19756:165;19770:6;19767:1;19764:13;19756:165;;;19848:14;;19835:11;;;19828:35;19891:16;;;;19785:10;;19756:165;;;19760:3;;;19950:6;19945:3;19941:16;19934:23;;19436:531;;;;;19251:722;;;;:::o;19978:197::-;20106:3;20131:38;20165:3;20157:6;20131:38;:::i;20180:127::-;20241:10;20236:3;20232:20;20229:1;20222:31;20272:4;20269:1;20262:15;20296:4;20293:1;20286:15;20312:135;20351:3;20372:17;;;20369:43;;20392:18;;:::i;:::-;-1:-1:-1;20439:1:1;20428:13;;20312:135::o;20452:136::-;20491:3;20519:5;20509:39;;20528:18;;:::i;:::-;-1:-1:-1;;;20564:18:1;;20452:136::o;20593:277::-;20766:3;20791:73;20825:38;20859:3;20851:6;20825:38;:::i;:::-;20817:6;20791:73;:::i;20875:356::-;21077:2;21059:21;;;21096:18;;;21089:30;21155:34;21150:2;21135:18;;21128:62;21222:2;21207:18;;20875:356::o;21236:343::-;21438:2;21420:21;;;21477:2;21457:18;;;21450:30;-1:-1:-1;;;21511:2:1;21496:18;;21489:49;21570:2;21555:18;;21236:343::o;21584:629::-;21853:3;21891:6;21885:13;21907:66;21966:6;21961:3;21954:4;21946:6;21942:17;21907:66;:::i;:::-;-1:-1:-1;;;21995:16:1;;;22020:18;;;22063:13;;22085:78;22063:13;22150:1;22139:13;;22132:4;22120:17;;22085:78;:::i;:::-;22183:20;22205:1;22179:28;;21584:629;-1:-1:-1;;;;21584:629:1:o;22218:289::-;22349:3;22387:6;22381:13;22403:66;22462:6;22457:3;22450:4;22442:6;22438:17;22403:66;:::i;:::-;22485:16;;;;;22218:289;-1:-1:-1;;22218:289:1:o;22512:345::-;22714:2;22696:21;;;22753:2;22733:18;;;22726:30;-1:-1:-1;;;22787:2:1;22772:18;;22765:51;22848:2;22833:18;;22512:345::o;25561:125::-;25626:9;;;25647:10;;;25644:36;;;25660:18;;:::i;25691:1206::-;-1:-1:-1;;;;;25810:3:1;25807:27;25804:53;;;25837:18;;:::i;:::-;25866:94;25956:3;25916:38;25948:4;25942:11;25916:38;:::i;:::-;25910:4;25866:94;:::i;:::-;25986:1;26011:2;26006:3;26003:11;26028:1;26023:616;;;;26683:1;26700:3;26697:93;;;-1:-1:-1;26756:19:1;;;26743:33;26697:93;-1:-1:-1;;16688:1:1;16684:11;;;16680:24;16676:29;16666:40;16712:1;16708:11;;;16663:57;26803:78;;25996:895;;26023:616;15957:1;15950:14;;;15994:4;15981:18;;-1:-1:-1;;26059:17:1;;;26160:9;26182:229;26196:7;26193:1;26190:14;26182:229;;;26285:19;;;26272:33;26257:49;;26392:4;26377:20;;;;26345:1;26333:14;;;;26212:12;26182:229;;;26186:3;26439;26430:7;26427:16;26424:159;;;26563:1;26559:6;26553:3;26547;26544:1;26540:11;26536:21;26532:34;26528:39;26515:9;26510:3;26506:19;26493:33;26489:79;26481:6;26474:95;26424:159;;;26626:1;26620:3;26617:1;26613:11;26609:19;26603:4;26596:33;25996:895;;25691:1206;;;:::o;26902:369::-;27078:3;27116:6;27110:13;27132:66;27191:6;27186:3;27179:4;27171:6;27167:17;27132:66;:::i;:::-;27214:51;27257:6;27252:3;27248:16;27240:6;27214:51;:::i;28709:489::-;-1:-1:-1;;;;;28978:15:1;;;28960:34;;29030:15;;29025:2;29010:18;;29003:43;29077:2;29062:18;;29055:34;;;29125:3;29120:2;29105:18;;29098:31;;;28903:4;;29146:46;;29172:19;;29164:6;29146:46;:::i;29203:249::-;29272:6;29325:2;29313:9;29304:7;29300:23;29296:32;29293:52;;;29341:1;29338;29331:12;29293:52;29373:9;29367:16;29392:30;29416:5;29392:30;:::i;29457:127::-;29518:10;29513:3;29509:20;29506:1;29499:31;29549:4;29546:1;29539:15;29573:4;29570:1;29563:15

Swarm Source

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